From dde87c3b12f889269466e5f41fe5eb305cd4641a Mon Sep 17 00:00:00 2001 From: chandrashekhar reddy Date: Mon, 20 Jan 2025 12:33:01 +0530 Subject: [PATCH] generate pdf code added n --- .../sminnovations/smiadmin/data/Constant.kt | 6 ++ .../smiadmin/ui/MonthYearPickerDialog.kt | 41 ------------- .../AttendanceAdapter.kt | 2 +- .../{ => ui/adapter}/EmployeeListAdapter.kt | 3 +- .../EmployeeStatusListAdapter.kt} | 6 +- .../ui/{ => fragments}/HomeFragment.kt | 51 ++--------------- .../ui/{ => fragments}/SettingsFragment.kt | 2 +- .../attendance/AttendanceDetailFragment.kt | 3 +- .../EmployeeAttendanceListFragment.kt | 7 ++- .../attendance}/EmployeeListFragment.kt | 4 +- .../smiadmin/ui/{ => utils}/ExportTask.kt | 7 +-- .../ui/utils/MonthYearPickerDialog.kt | 57 +++++++++++++++++++ .../smiadmin/ui/{ => utils}/PDFGenerator.kt | 2 +- .../res/layout/dialog_month_year_picker.xml | 21 +++++++ .../main/res/navigation/mobile_navigation.xml | 10 ++-- 15 files changed, 112 insertions(+), 110 deletions(-) create mode 100644 app/src/main/java/in/sminnovations/smiadmin/data/Constant.kt delete mode 100644 app/src/main/java/in/sminnovations/smiadmin/ui/MonthYearPickerDialog.kt rename app/src/main/java/in/sminnovations/smiadmin/ui/{attendance => adapter}/AttendanceAdapter.kt (97%) rename app/src/main/java/in/sminnovations/smiadmin/{ => ui/adapter}/EmployeeListAdapter.kt (96%) rename app/src/main/java/in/sminnovations/smiadmin/ui/{attendance/EmployeeListAdapter.kt => adapter/EmployeeStatusListAdapter.kt} (89%) rename app/src/main/java/in/sminnovations/smiadmin/ui/{ => fragments}/HomeFragment.kt (69%) rename app/src/main/java/in/sminnovations/smiadmin/ui/{ => fragments}/SettingsFragment.kt (95%) rename app/src/main/java/in/sminnovations/smiadmin/ui/{ => fragments}/attendance/AttendanceDetailFragment.kt (97%) rename app/src/main/java/in/sminnovations/smiadmin/ui/{ => fragments}/attendance/EmployeeAttendanceListFragment.kt (90%) rename app/src/main/java/in/sminnovations/smiadmin/ui/{ => fragments/attendance}/EmployeeListFragment.kt (96%) rename app/src/main/java/in/sminnovations/smiadmin/ui/{ => utils}/ExportTask.kt (94%) create mode 100644 app/src/main/java/in/sminnovations/smiadmin/ui/utils/MonthYearPickerDialog.kt rename app/src/main/java/in/sminnovations/smiadmin/ui/{ => utils}/PDFGenerator.kt (99%) create mode 100644 app/src/main/res/layout/dialog_month_year_picker.xml diff --git a/app/src/main/java/in/sminnovations/smiadmin/data/Constant.kt b/app/src/main/java/in/sminnovations/smiadmin/data/Constant.kt new file mode 100644 index 0000000..bbaee85 --- /dev/null +++ b/app/src/main/java/in/sminnovations/smiadmin/data/Constant.kt @@ -0,0 +1,6 @@ +package `in`.sminnovations.smiadmin.data + +object Constant { + const val COMPANY_NAME = "ShanMukha Innovations" + const val STORAGE_PERMISSION_CODE = 101 +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/MonthYearPickerDialog.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/MonthYearPickerDialog.kt deleted file mode 100644 index 78fa43e..0000000 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/MonthYearPickerDialog.kt +++ /dev/null @@ -1,41 +0,0 @@ -package `in`.sminnovations.smiadmin.ui - -import android.app.DatePickerDialog -import android.app.Dialog -import android.content.res.Resources -import android.os.Bundle -import android.view.View -import androidx.fragment.app.DialogFragment -import `in`.sminnovations.smiadmin.R -import java.util.Calendar - -class MonthYearPickerDialog : DialogFragment() { - private var onDateSelected: ((Int, Int) -> Unit)? = null - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val calendar = Calendar.getInstance() - val year = calendar.get(Calendar.YEAR) - val month = calendar.get(Calendar.MONTH) - - val dialog = DatePickerDialog( - requireContext(), - R.style.DialogTheme, - { _, selectedYear, selectedMonth, _ -> - onDateSelected?.invoke(selectedYear, selectedMonth + 1) - }, - year, - month, - 1 - ) - - // Hide the day picker as we only need month and year - val datePicker = dialog.datePicker - datePicker.findViewById(Resources.getSystem().getIdentifier("day", "id", "android"))?.visibility = View.GONE - - return dialog - } - - fun setOnDateSelectedListener(listener: (Int, Int) -> Unit) { - onDateSelected = listener - } -} diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/attendance/AttendanceAdapter.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/adapter/AttendanceAdapter.kt similarity index 97% rename from app/src/main/java/in/sminnovations/smiadmin/ui/attendance/AttendanceAdapter.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/adapter/AttendanceAdapter.kt index 0fbbaaa..90ac96a 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/attendance/AttendanceAdapter.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/adapter/AttendanceAdapter.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.smiadmin.ui.attendance +package `in`.sminnovations.smiadmin.ui.adapter import android.view.LayoutInflater import android.view.View diff --git a/app/src/main/java/in/sminnovations/smiadmin/EmployeeListAdapter.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/adapter/EmployeeListAdapter.kt similarity index 96% rename from app/src/main/java/in/sminnovations/smiadmin/EmployeeListAdapter.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/adapter/EmployeeListAdapter.kt index 167ebf4..4ed5788 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/EmployeeListAdapter.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/adapter/EmployeeListAdapter.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.smiadmin +package `in`.sminnovations.smiadmin.ui.adapter import android.view.LayoutInflater import android.view.View @@ -6,6 +6,7 @@ import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.google.android.material.switchmaterial.SwitchMaterial +import `in`.sminnovations.smiadmin.R import `in`.sminnovations.smiadmin.data.Employee class EmployeeListAdapter( diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/attendance/EmployeeListAdapter.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/adapter/EmployeeStatusListAdapter.kt similarity index 89% rename from app/src/main/java/in/sminnovations/smiadmin/ui/attendance/EmployeeListAdapter.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/adapter/EmployeeStatusListAdapter.kt index 34dbd4f..aea14c4 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/attendance/EmployeeListAdapter.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/adapter/EmployeeStatusListAdapter.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.smiadmin.ui.attendance +package `in`.sminnovations.smiadmin.ui.adapter import android.view.LayoutInflater import android.view.View @@ -8,9 +8,9 @@ import androidx.recyclerview.widget.RecyclerView import `in`.sminnovations.smiadmin.R import `in`.sminnovations.smiadmin.data.Employee -class EmployeeListAdapter( +class EmployeeStatusListAdapter( private val onEmployeeClick: (Employee) -> Unit -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { private val employees = mutableListOf() diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/HomeFragment.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/HomeFragment.kt similarity index 69% rename from app/src/main/java/in/sminnovations/smiadmin/ui/HomeFragment.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/fragments/HomeFragment.kt index 1e8adbe..535adb3 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/HomeFragment.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/HomeFragment.kt @@ -1,16 +1,13 @@ -package `in`.sminnovations.smiadmin.ui +package `in`.sminnovations.smiadmin.ui.fragments import android.Manifest import android.app.ProgressDialog -import android.content.ActivityNotFoundException -import android.content.ContentUris import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.os.Bundle import android.os.Environment -import android.provider.MediaStore import android.provider.Settings import android.view.LayoutInflater import android.view.View @@ -18,23 +15,16 @@ import android.view.ViewGroup import android.widget.Toast import androidx.cardview.widget.CardView import androidx.core.content.ContextCompat -import androidx.core.content.FileProvider import androidx.fragment.app.Fragment -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController -import com.google.firebase.Firebase -import com.google.firebase.firestore.firestore +import `in`.sminnovations.smiadmin.data.Constant.STORAGE_PERMISSION_CODE import `in`.sminnovations.smiadmin.R -import `in`.sminnovations.smiadmin.data.Employee -import kotlinx.coroutines.Dispatchers +import `in`.sminnovations.smiadmin.ui.utils.ExportTask +import `in`.sminnovations.smiadmin.ui.utils.MonthYearPickerDialog import kotlinx.coroutines.Job -import kotlinx.coroutines.launch -import kotlinx.coroutines.tasks.await -import kotlinx.coroutines.withContext class HomeFragment : Fragment() { private lateinit var exportTask: ExportTask - private val STORAGE_PERMISSION_CODE = 101 private var currentExcelTask: Job? = null override fun onCreateView( @@ -84,39 +74,6 @@ class HomeFragment : Fragment() { } exportTask.exportAttendance(year, month) progressDialog.dismiss() - -// currentExcelTask = lifecycleScope.launch { -// try { -// // First get all employees -// val employeesSnapshot = withContext(Dispatchers.IO) { -// db.collection("employees").get().await() -// } -// -// val employees = employeesSnapshot.documents.map { doc -> -// Employee( -// Id = doc.getString("Id") ?: "Unknown", -// Name = doc.getString("Name") ?: "Unknown" -// ) -// }.sortedBy { it.Name } -// -// // Generate CSV file -// val pdfGenerator = PDFGenerator(requireContext(), "ShanMukha Innovations") -// val pdfFile = pdfGenerator.generateAttendanceReport(employees, year, month) -// -// progressDialog.dismiss() -// -// // Show success message with file location -// Toast.makeText( -// context, -// "Report saved in Downloads folder: ${pdfFile.name}", -// Toast.LENGTH_LONG -// ).show() -// -// } catch (e: Exception) { -// progressDialog.dismiss() -// Toast.makeText(context, "Error: ${e.message}", Toast.LENGTH_LONG).show() -// } -// } } private fun checkStoragePermission(): Boolean { diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/SettingsFragment.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/SettingsFragment.kt similarity index 95% rename from app/src/main/java/in/sminnovations/smiadmin/ui/SettingsFragment.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/fragments/SettingsFragment.kt index 8062596..5f6a1ea 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/SettingsFragment.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/SettingsFragment.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.smiadmin.ui +package `in`.sminnovations.smiadmin.ui.fragments import android.content.pm.PackageManager import android.os.Bundle diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/attendance/AttendanceDetailFragment.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/AttendanceDetailFragment.kt similarity index 97% rename from app/src/main/java/in/sminnovations/smiadmin/ui/attendance/AttendanceDetailFragment.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/AttendanceDetailFragment.kt index 9ff98c3..2c8b411 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/attendance/AttendanceDetailFragment.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/AttendanceDetailFragment.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.smiadmin.ui.attendance +package `in`.sminnovations.smiadmin.ui.fragments.attendance import android.R import android.os.Bundle @@ -12,6 +12,7 @@ import androidx.fragment.app.Fragment import com.google.firebase.firestore.FirebaseFirestore import `in`.sminnovations.smiadmin.data.AttendanceData import `in`.sminnovations.smiadmin.databinding.FragmentAttendanceDetailBinding +import `in`.sminnovations.smiadmin.ui.adapter.AttendanceAdapter import java.util.Calendar class AttendanceDetailFragment : Fragment() { diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/attendance/EmployeeAttendanceListFragment.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/EmployeeAttendanceListFragment.kt similarity index 90% rename from app/src/main/java/in/sminnovations/smiadmin/ui/attendance/EmployeeAttendanceListFragment.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/EmployeeAttendanceListFragment.kt index 8c1c9cc..1ad40e6 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/attendance/EmployeeAttendanceListFragment.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/EmployeeAttendanceListFragment.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.smiadmin.ui.attendance +package `in`.sminnovations.smiadmin.ui.fragments.attendance import android.os.Bundle import androidx.fragment.app.Fragment @@ -11,12 +11,13 @@ import com.google.firebase.firestore.FirebaseFirestore import `in`.sminnovations.smiadmin.R import `in`.sminnovations.smiadmin.data.Employee import `in`.sminnovations.smiadmin.databinding.FragmentEmployeeAttendanceListBinding +import `in`.sminnovations.smiadmin.ui.adapter.EmployeeStatusListAdapter class EmployeeAttendanceListFragment : Fragment() { private var _binding: FragmentEmployeeAttendanceListBinding? = null private val binding get() = _binding!! - private lateinit var adapter: EmployeeListAdapter + private lateinit var adapter: EmployeeStatusListAdapter private val db = FirebaseFirestore.getInstance() override fun onCreateView( @@ -36,7 +37,7 @@ class EmployeeAttendanceListFragment : Fragment() { } private fun setupRecyclerView() { - adapter = EmployeeListAdapter { employee -> + adapter = EmployeeStatusListAdapter { employee -> val bundle = Bundle().apply { putString("employeeId", employee.Id) putString("employeeName", employee.Name) diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/EmployeeListFragment.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/EmployeeListFragment.kt similarity index 96% rename from app/src/main/java/in/sminnovations/smiadmin/ui/EmployeeListFragment.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/EmployeeListFragment.kt index 5352801..1872e7b 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/EmployeeListFragment.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/fragments/attendance/EmployeeListFragment.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.smiadmin.ui +package `in`.sminnovations.smiadmin.ui.fragments.attendance import android.os.Bundle import android.view.LayoutInflater @@ -7,7 +7,7 @@ import android.view.ViewGroup import android.widget.Toast import androidx.fragment.app.Fragment import com.google.firebase.firestore.FirebaseFirestore -import `in`.sminnovations.smiadmin.EmployeeListAdapter +import `in`.sminnovations.smiadmin.ui.adapter.EmployeeListAdapter import `in`.sminnovations.smiadmin.data.Employee import `in`.sminnovations.smiadmin.databinding.FragmentEmployeeListBinding diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/ExportTask.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/utils/ExportTask.kt similarity index 94% rename from app/src/main/java/in/sminnovations/smiadmin/ui/ExportTask.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/utils/ExportTask.kt index 797d59c..78ae5df 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/ExportTask.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/utils/ExportTask.kt @@ -1,12 +1,12 @@ -package `in`.sminnovations.smiadmin.ui +package `in`.sminnovations.smiadmin.ui.utils import android.app.ProgressDialog import android.widget.Toast import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope -import com.google.android.gms.common.internal.Constants import com.google.firebase.Firebase import com.google.firebase.firestore.firestore +import `in`.sminnovations.smiadmin.data.Constant import `in`.sminnovations.smiadmin.data.Employee import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -15,7 +15,6 @@ import kotlinx.coroutines.tasks.await import kotlinx.coroutines.withContext class ExportTask(private val fragment: Fragment) { - private val companyName = "ShanMukha Innovations" private val db = Firebase.firestore private var currentExcelTask: Job? = null @@ -49,7 +48,7 @@ class ExportTask(private val fragment: Fragment) { // Switch to IO dispatcher for file operations withContext(Dispatchers.IO) { - val pdfGenerator = PDFGenerator(fragment.requireContext(), companyName) + val pdfGenerator = PDFGenerator(fragment.requireContext(), Constant.COMPANY_NAME) pdfGenerator.generateAttendanceReport(employees, year, month) }.also { pdfFile -> // Switch back to Main dispatcher for UI updates diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/utils/MonthYearPickerDialog.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/utils/MonthYearPickerDialog.kt new file mode 100644 index 0000000..2d66d96 --- /dev/null +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/utils/MonthYearPickerDialog.kt @@ -0,0 +1,57 @@ +package `in`.sminnovations.smiadmin.ui.utils + +import android.app.AlertDialog +import android.app.DatePickerDialog +import android.app.Dialog +import android.content.res.Resources +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.widget.NumberPicker +import androidx.fragment.app.DialogFragment +import `in`.sminnovations.smiadmin.R +import java.util.Calendar + +class MonthYearPickerDialog : DialogFragment() { + private var onDateSelected: ((Int, Int) -> Unit)? = null + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + // Inflate the custom layout + val view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_month_year_picker, null) + + // Initialize NumberPickers for Month and Year + val monthPicker = view.findViewById(R.id.month_picker) + val yearPicker = view.findViewById(R.id.year_picker) + + // Set up the Month Picker + monthPicker.minValue = 1 + monthPicker.maxValue = 12 + monthPicker.displayedValues = arrayOf( + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + ) + + // Set up the Year Picker + val currentYear = Calendar.getInstance().get(Calendar.YEAR) + yearPicker.minValue = currentYear - 100 // 100 years in the past + yearPicker.maxValue = currentYear + 100 // 100 years in the future + yearPicker.value = currentYear + + // Build the Dialog + val dialog = AlertDialog.Builder(requireContext()) + .setView(view) + .setPositiveButton("OK") { _, _ -> + val selectedMonth = monthPicker.value + val selectedYear = yearPicker.value + onDateSelected?.invoke(selectedYear, selectedMonth) + } + .setNegativeButton("Cancel", null) + .create() + + return dialog + } + + fun setOnDateSelectedListener(listener: (Int, Int) -> Unit) { + onDateSelected = listener + } +} diff --git a/app/src/main/java/in/sminnovations/smiadmin/ui/PDFGenerator.kt b/app/src/main/java/in/sminnovations/smiadmin/ui/utils/PDFGenerator.kt similarity index 99% rename from app/src/main/java/in/sminnovations/smiadmin/ui/PDFGenerator.kt rename to app/src/main/java/in/sminnovations/smiadmin/ui/utils/PDFGenerator.kt index 23175b1..9f1f1e2 100644 --- a/app/src/main/java/in/sminnovations/smiadmin/ui/PDFGenerator.kt +++ b/app/src/main/java/in/sminnovations/smiadmin/ui/utils/PDFGenerator.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.smiadmin.ui +package `in`.sminnovations.smiadmin.ui.utils import android.content.Context import android.graphics.pdf.PdfDocument diff --git a/app/src/main/res/layout/dialog_month_year_picker.xml b/app/src/main/res/layout/dialog_month_year_picker.xml new file mode 100644 index 0000000..c00cc73 --- /dev/null +++ b/app/src/main/res/layout/dialog_month_year_picker.xml @@ -0,0 +1,21 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 97be88e..53b29bd 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -6,7 +6,7 @@