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 8533b10cd5767d0a1e08d835782644e294e36183..76bbde046c27450e0d432fd90ebc987349630a63 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 2517ed66dfc0d6f0225a53a7200304687deb48ec..c6149b111fc07500015a260470ff4b6aa21933fb 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 6491bff594c2c4751ee31bec6ed9e51b6d30e931..a3a461eaf3cb5d1369ef0834ecd5296474b8fd82 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 9582ccff289c7d353bd63ec34c14cae9bf7d1285..d2705bbc5de81f87e140d540ca562c7395a1897c 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 6a1b2b45be6a9835a9867c413b533b539c8c1148..0109a710f01496dcb62e95e69b3b83c05ef24d60 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 eef46ff5bb86b72f4de1792561d10db3eac7d877..b0ec8781bf149537f5a4a2545546256d3392ec5c 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 4b997a03ae98202918e74f40c734751b9a84b90c..dd87c32af349c2d23f9f1f7f0673b7a6b11cc4fa 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 6d906563b7695d3da8566be617d1324e365fa2ac..fa1a42fb5990253db9014e069e76cb65259b4ce7 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 b4eba159e9fd3c1984bec9936a43804d764b563b..e1f43428d54c30cd50a28665be03cde8e96ba677 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