From 52080cc745a9c6a212b2aed5cf6906b8d6715dfb Mon Sep 17 00:00:00 2001 From: scimmiamorta <ale.beni95@gmail.com> Date: Sat, 28 Dec 2024 16:40:07 +0100 Subject: [PATCH] First Commit --- .../taskmanagement/auth/ProfileFragment.kt | 1 + .../taskmanagement/task/HomeFragment.kt | 27 +++--- .../task/ModifySubTaskFragment.kt | 21 ++++- .../taskmanagement/task/SearchFragment.kt | 3 - .../taskmanagement/task/SubtaskAdapter.kt | 3 +- .../taskmanagement/task/TaskAdapter.kt | 92 +++++++++++-------- app/src/main/res/layout/subtask_list_item.xml | 26 +++++- app/src/main/res/values-it/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 9 files changed, 113 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/example/taskmanagement/auth/ProfileFragment.kt b/app/src/main/java/com/example/taskmanagement/auth/ProfileFragment.kt index 8533b10..76bbde0 100644 --- a/app/src/main/java/com/example/taskmanagement/auth/ProfileFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/auth/ProfileFragment.kt @@ -234,6 +234,7 @@ class ProfileFragment : Fragment() { } firestore!!.collection("tasks") + .whereEqualTo("assignedTo", userId) .get() .addOnSuccessListener { tasksSnapshot -> var completedCount = 0 diff --git a/app/src/main/java/com/example/taskmanagement/task/HomeFragment.kt b/app/src/main/java/com/example/taskmanagement/task/HomeFragment.kt index 2517ed6..c6149b1 100644 --- a/app/src/main/java/com/example/taskmanagement/task/HomeFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/HomeFragment.kt @@ -65,11 +65,17 @@ class HomeFragment : Fragment() { Toast.LENGTH_SHORT ).show() } - - fabMain.setOnClickListener { - findNavController().navigate(R.id.action_homeFragment_to_addTaskFragment) + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + if (role == "PL" || role == "Dev") { + fabMain.visibility = View.GONE + } else { + fabMain.visibility = View.VISIBLE + fabMain.setOnClickListener { + findNavController().navigate(R.id.action_homeFragment_to_addTaskFragment) + } } - swipeRefreshLayout.setOnRefreshListener { currentUser?.let { loadTasks() @@ -83,7 +89,8 @@ class HomeFragment : Fragment() { swipeRefreshLayout.isRefreshing = true lifecycleScope.launch { try { - val sharedPrefs = requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) val role = sharedPrefs.getString("role", "defaultRole") taskList.clear() taskIdMap.clear() @@ -117,7 +124,6 @@ class HomeFragment : Fragment() { } private suspend fun loadTasksForPM() { - fabMain.visibility = View.VISIBLE try { val currentUserEmail = auth.currentUser?.email ?: return val createdByPMResult = firestore.collection("tasks") @@ -134,9 +140,6 @@ class HomeFragment : Fragment() { } } taskList.sortBy { it.name } - - if (isAdded) fabMain.visibility = View.VISIBLE - } catch (e: Exception) { if (isAdded) { Toast.makeText( @@ -149,7 +152,6 @@ class HomeFragment : Fragment() { } private suspend fun loadTasksForPL() { - fabMain.visibility = View.GONE try { val currentUserEmail = auth.currentUser?.email ?: return @@ -187,12 +189,8 @@ class HomeFragment : Fragment() { } private suspend fun loadTasksForDev() { - fabMain.visibility = View.GONE try { - val currentUserEmail = auth.currentUser?.email ?: return - val assignedToDevResult = firestore.collection("tasks") - .whereEqualTo("assignedTo", currentUserEmail) .get() .await() @@ -206,7 +204,6 @@ class HomeFragment : Fragment() { } taskList.sortBy { it.name } - if (isAdded) fabMain.visibility = View.VISIBLE } catch (e: Exception) { if (isAdded) { Toast.makeText( diff --git a/app/src/main/java/com/example/taskmanagement/task/ModifySubTaskFragment.kt b/app/src/main/java/com/example/taskmanagement/task/ModifySubTaskFragment.kt index 6491bff..a3a461e 100644 --- a/app/src/main/java/com/example/taskmanagement/task/ModifySubTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/ModifySubTaskFragment.kt @@ -77,7 +77,22 @@ class ModifySubTaskFragment : Fragment() { .addOnSuccessListener { document -> if (document.exists()) { val subtask = document.toObject(SubTask::class.java) - subtask?.let { populateFields(it) } + subtask?.let { + val currentUserEmail = mAuth.currentUser?.email + Log.e("ModifySubTaskFragment", "Current User Email: $currentUserEmail") + Log.e("ModifySubTaskFragment", "Subtask Created By: ${subtask.createdBy}") + Log.e("ModifySubTaskFragment", "Subtask Assigned To: ${subtask.assignedTo}") + if (currentUserEmail == subtask.createdBy || currentUserEmail == subtask.assignedTo) { + populateFields(it) + } else { + Toast.makeText( + requireContext(), + getString(R.string.error_not_authorized), + Toast.LENGTH_SHORT + ).show() + findNavController().popBackStack() + } + } } else { Toast.makeText( requireContext(), @@ -94,6 +109,7 @@ class ModifySubTaskFragment : Fragment() { } } + private fun populateFields(subtask: SubTask) { binding.subtaskName.setText(subtask.name) binding.subtaskDescription.setText(subtask.description) @@ -135,8 +151,7 @@ class ModifySubTaskFragment : Fragment() { progress = progress, status = status, assignedTo = assignedTo, - priority = priority, - createdBy = mAuth.currentUser?.email + priority = priority ) db.collection("tasks") diff --git a/app/src/main/java/com/example/taskmanagement/task/SearchFragment.kt b/app/src/main/java/com/example/taskmanagement/task/SearchFragment.kt index 9582ccf..d2705bb 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SearchFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SearchFragment.kt @@ -209,10 +209,7 @@ class SearchFragment : Fragment() { private suspend fun loadTasksForDev() { try { - val currentUserEmail = auth.currentUser?.email ?: return - val assignedToDevResult = firestore.collection("tasks") - .whereEqualTo("assignedTo", currentUserEmail) .get() .await() diff --git a/app/src/main/java/com/example/taskmanagement/task/SubtaskAdapter.kt b/app/src/main/java/com/example/taskmanagement/task/SubtaskAdapter.kt index 6a1b2b4..0109a71 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SubtaskAdapter.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SubtaskAdapter.kt @@ -79,12 +79,13 @@ class SubtaskAdapter( private val doneButton: Button = itemView.findViewById(R.id.done_button) private val editButton: Button = itemView.findViewById(R.id.edit_button) private val deleteButton: Button = itemView.findViewById(R.id.delete_button) + private val subtaskAssignedTo: TextView = itemView.findViewById(R.id.assigned_to) private val db = FirebaseFirestore.getInstance() fun bind(subtask: SubTask) { subtaskTitle.text = subtask.name - + subtaskAssignedTo.text = subtask.assignedTo subtaskDescription.text = subtask.description subtaskProgress.text = "${subtask.progress}%" subtaskPriority.text = when (subtask.priority) { diff --git a/app/src/main/java/com/example/taskmanagement/task/TaskAdapter.kt b/app/src/main/java/com/example/taskmanagement/task/TaskAdapter.kt index eef46ff..b0ec878 100644 --- a/app/src/main/java/com/example/taskmanagement/task/TaskAdapter.kt +++ b/app/src/main/java/com/example/taskmanagement/task/TaskAdapter.kt @@ -1,7 +1,9 @@ package com.example.taskmanagement.task import android.annotation.SuppressLint +import android.content.Context import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.recyclerview.widget.DiffUtil @@ -66,6 +68,7 @@ class TaskAdapter( RecyclerView.ViewHolder(binding.root) { @SuppressLint("SetTextI18n") + fun bind(task: Task) { binding.taskTitle.text = task.name binding.taskDescription.text = task.description @@ -88,59 +91,70 @@ class TaskAdapter( binding.root.setOnClickListener { onTaskClick(task) } - - binding.deleteBtn.setOnClickListener { - db.collection("tasks") - .whereEqualTo("name", task.name) - .get() - .addOnSuccessListener { documents -> - if (!documents.isEmpty) { - for (document in documents) { - document.reference.delete() - .addOnSuccessListener { - val position = adapterPosition - if (position != RecyclerView.NO_POSITION) { - val updatedList = taskList.toMutableList() - updatedList.removeAt(position) - taskList = updatedList - notifyItemRemoved(position) + val sharedPrefs = + itemView.context.getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val userRole = sharedPrefs.getString("role", "defaultRole") + + if (userRole == "PM") { + binding.deleteBtn.visibility = View.VISIBLE + binding.deleteBtn.setOnClickListener { + db.collection("tasks") + .whereEqualTo("name", task.name) + .get() + .addOnSuccessListener { documents -> + if (!documents.isEmpty) { + for (document in documents) { + document.reference.delete() + .addOnSuccessListener { + val position = adapterPosition + if (position != RecyclerView.NO_POSITION) { + val updatedList = taskList.toMutableList() + updatedList.removeAt(position) + taskList = updatedList + notifyItemRemoved(position) + Toast.makeText( + itemView.context, + itemView.context.getString(R.string.task_deleted_successfully), + Toast.LENGTH_SHORT + ).show() + } + } + .addOnFailureListener { e -> Toast.makeText( itemView.context, - itemView.context.getString(R.string.task_deleted_successfully), + itemView.context.getString( + R.string.error_deleting_task, + e.message + ), Toast.LENGTH_SHORT ).show() } - } - .addOnFailureListener { e -> - Toast.makeText( - itemView.context, - itemView.context.getString( - R.string.error_deleting_task, - e.message - ), - Toast.LENGTH_SHORT - ).show() - } + } + } else { + Toast.makeText( + itemView.context, + itemView.context.getString(R.string.task_not_found), + Toast.LENGTH_SHORT + ).show() } - } else { + } + .addOnFailureListener { e -> Toast.makeText( itemView.context, - itemView.context.getString(R.string.task_not_found), + itemView.context.getString( + R.string.error_searching_task, + e.message + ), Toast.LENGTH_SHORT ).show() } - } - .addOnFailureListener { e -> - Toast.makeText( - itemView.context, - itemView.context.getString(R.string.error_searching_task, e.message), - Toast.LENGTH_SHORT - ).show() - } + } + } else { + binding.deleteBtn.visibility = View.GONE } - } + private fun calculateDaysRemaining(deadline: String?): Int { return try { val dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()) diff --git a/app/src/main/res/layout/subtask_list_item.xml b/app/src/main/res/layout/subtask_list_item.xml index 4b997a0..dd87c32 100644 --- a/app/src/main/res/layout/subtask_list_item.xml +++ b/app/src/main/res/layout/subtask_list_item.xml @@ -25,7 +25,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="16dp"> <LinearLayout @@ -54,6 +53,29 @@ android:textColor="@color/design_default_color_error" /> </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="4dp" + android:orientation="horizontal"> + + <TextView + android:id="@+id/assigned_to_label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/assigned_to" + android:textAppearance="?attr/textAppearanceBodyMedium" /> + + <TextView + android:id="@+id/assigned_to" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:text="@string/username" + android:textAppearance="?attr/textAppearanceBodyMedium" + android:textColor="@color/design_default_color_primary_variant" /> + </LinearLayout> + <View android:layout_width="match_parent" android:layout_height="1dp" @@ -134,7 +156,6 @@ </LinearLayout> </LinearLayout> - <View android:layout_width="match_parent" android:layout_height="1dp" @@ -172,5 +193,4 @@ </LinearLayout> </LinearLayout> </com.google.android.material.card.MaterialCardView> - </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6d90656..fa1a42f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -174,4 +174,6 @@ <string name="error_saving_profile_image">Errore salvataggio immagine profilo</string> <string name="error_loading_profile_image">Errore caricamento immagine profilo</string> <string name="task_id_not_found">Task ID non trovato</string> + <string name="error_not_authorized">Non sei autorizzato a modificare questo sottotask.</string> + </resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b4eba15..e1f4342 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -195,4 +195,6 @@ <string name="error_saving_profile_image">Error saving profile image</string> <string name="error_loading_profile_image">Error loading profile image</string> <string name="task_id_not_found">Task ID not found</string> + <string name="error_not_authorized">Not authorized</string> + </resources> \ No newline at end of file -- GitLab