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