From 14a4928adb719c7784a9abe3e963b9d30e80539e Mon Sep 17 00:00:00 2001 From: scimmiamorta <ale.beni95@gmail.com> Date: Sat, 28 Dec 2024 15:19:39 +0100 Subject: [PATCH] First Commit --- .../example/taskmanagement/MainActivity.kt | 14 +- .../auth/EditProfileFragment.kt | 5 +- .../taskmanagement/auth/ProfileFragment.kt | 25 +-- .../taskmanagement/chat/ChatAdapter.kt | 6 +- .../taskmanagement/chat/ChatFragment.kt | 13 +- .../taskmanagement/chat/ChatViewAdapter.kt | 11 +- .../taskmanagement/chat/DialogFragment.kt | 13 +- .../taskmanagement/chat/UserAdapter.kt | 1 - .../chat/UserSelectionFragment.kt | 11 +- .../taskmanagement/task/AddSubTaskFragment.kt | 107 +++++------ .../taskmanagement/task/AddTaskFragment.kt | 108 +++++------ .../task/ModifySubTaskFragment.kt | 95 +++++----- .../taskmanagement/task/ModifyTaskFragment.kt | 77 ++++---- .../taskmanagement/task/SearchFragment.kt | 14 +- .../taskmanagement/task/SearchSubFragment.kt | 20 +-- .../example/taskmanagement/task/SubTask.kt | 2 +- .../taskmanagement/task/SubTaskFragment.kt | 55 +++--- .../taskmanagement/task/SubtaskAdapter.kt | 14 +- .../res/drawable/baseline_how_to_reg_24.xml | 7 - .../res/drawable/ic_launcher_background.xml | 170 ------------------ .../res/drawable/ic_launcher_foreground.xml | 30 ---- app/src/main/res/drawable/ic_notification.xml | 5 - .../res/drawable/message_bubble_received.xml | 2 +- app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/fragment_add_sub_task.xml | 42 ++--- app/src/main/res/layout/fragment_add_task.xml | 1 - app/src/main/res/layout/fragment_dialog.xml | 2 +- .../main/res/layout/fragment_edit_profile.xml | 4 - .../res/layout/fragment_modify_sub_task.xml | 13 +- .../main/res/layout/fragment_modify_task.xml | 1 - app/src/main/res/layout/fragment_profile.xml | 34 ++-- .../main/res/layout/fragment_search_sub.xml | 1 + app/src/main/res/layout/fragment_sub_task.xml | 5 +- app/src/main/res/layout/fragment_welcome.xml | 6 +- app/src/main/res/layout/message_item_sent.xml | 1 - app/src/main/res/values-it/strings.xml | 4 + .../res/values/ic_launcher_background.xml | 2 +- app/src/main/res/values/strings.xml | 5 +- 38 files changed, 314 insertions(+), 614 deletions(-) delete mode 100644 app/src/main/res/drawable/baseline_how_to_reg_24.xml delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml delete mode 100644 app/src/main/res/drawable/ic_notification.xml diff --git a/app/src/main/java/com/example/taskmanagement/MainActivity.kt b/app/src/main/java/com/example/taskmanagement/MainActivity.kt index 1df4b53..4a7b848 100644 --- a/app/src/main/java/com/example/taskmanagement/MainActivity.kt +++ b/app/src/main/java/com/example/taskmanagement/MainActivity.kt @@ -22,10 +22,9 @@ class MainActivity : AppCompatActivity() { navController.addOnDestinationChangedListener { _, destination, _ -> when (destination.id) { - R.id.welcomeFragment, R.id.loginFragment, R.id.registerFragment, R.id.forgotPasswordFragment -> { + R.id.welcomeFragment, R.id.loginFragment, R.id.registerFragment, R.id.forgotPasswordFragment, R.id.chatFragment -> { bottomNavMenu.visibility = android.view.View.GONE } - else -> { bottomNavMenu.visibility = android.view.View.VISIBLE } @@ -33,15 +32,4 @@ class MainActivity : AppCompatActivity() { } } - fun hideBottomNavigation() { - val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavMenu) - bottomNavigationView.visibility = android.view.View.GONE - } - - - fun showBottomNavigation() { - val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavMenu) - bottomNavigationView.visibility = android.view.View.VISIBLE - } - } diff --git a/app/src/main/java/com/example/taskmanagement/auth/EditProfileFragment.kt b/app/src/main/java/com/example/taskmanagement/auth/EditProfileFragment.kt index f87324d..92f8802 100644 --- a/app/src/main/java/com/example/taskmanagement/auth/EditProfileFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/auth/EditProfileFragment.kt @@ -95,12 +95,13 @@ class EditProfileFragment : Fragment() { ?.document(it) ?.set(userData) ?.addOnSuccessListener { - Toast.makeText(context, getString(R.string.profile_updated), Toast.LENGTH_SHORT).show() + Toast.makeText(context, getString(R.string.profile_updated), Toast.LENGTH_SHORT) + .show() } ?.addOnFailureListener { Toast.makeText( context, - getString((R.string.error_updating_profile)), + getString(R.string.error_saving_profile_image), Toast.LENGTH_SHORT ).show() } 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 380d4b9..8533b10 100644 --- a/app/src/main/java/com/example/taskmanagement/auth/ProfileFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/auth/ProfileFragment.kt @@ -142,10 +142,15 @@ class ProfileFragment : Fragment() { FileOutputStream(file).use { output -> bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output) } - Toast.makeText(context, "Immagine salvata correttamente", Toast.LENGTH_SHORT).show() + Toast.makeText(context, getString(R.string.profile_image_saved), Toast.LENGTH_SHORT) + .show() } catch (e: IOException) { e.printStackTrace() - Toast.makeText(context, "Errore nel salvataggio dell'immagine", Toast.LENGTH_SHORT) + Toast.makeText( + context, + getString(R.string.error_saving_profile_image), + Toast.LENGTH_SHORT + ) .show() } } @@ -203,7 +208,7 @@ class ProfileFragment : Fragment() { .addOnFailureListener { Toast.makeText( context, - "Errore nel caricamento del profilo", + getString(R.string.error_loading_users), Toast.LENGTH_SHORT ).show() } @@ -219,12 +224,12 @@ class ProfileFragment : Fragment() { taskList.add(taskName) } } - Log.e("ProfileFragment", "Task List: $taskList") taskAdapter!!.notifyDataSetChanged() listViewHeight(binding.assignedTasksList) } .addOnFailureListener { - Toast.makeText(context, getString(R.string.error_loading_tasks), Toast.LENGTH_SHORT).show() + Toast.makeText(context, getString(R.string.error_loading_tasks), Toast.LENGTH_SHORT) + .show() } @@ -285,7 +290,8 @@ class ProfileFragment : Fragment() { } } .addOnFailureListener { - Toast.makeText(context, getString(R.string.error_loading_tasks), Toast.LENGTH_SHORT).show() + Toast.makeText(context, getString(R.string.error_loading_tasks), Toast.LENGTH_SHORT) + .show() } @@ -296,12 +302,11 @@ class ProfileFragment : Fragment() { val assignedTextView = view?.findViewById<TextView>(R.id.assignedSubtask) val completedTextView = view?.findViewById<TextView>(R.id.completedSubtask) - completedTextView?.text = completed.toString() - assignedTextView?.text = assigned.toString() - toDoTextView?.text = toDo.toString() + completedTextView?.text = "$completed" + assignedTextView?.text = "$assigned" + toDoTextView?.text = "$toDo" } - private fun listViewHeight(listView: ListView) { val adapter = listView.adapter ?: return diff --git a/app/src/main/java/com/example/taskmanagement/chat/ChatAdapter.kt b/app/src/main/java/com/example/taskmanagement/chat/ChatAdapter.kt index c721244..46aa70a 100644 --- a/app/src/main/java/com/example/taskmanagement/chat/ChatAdapter.kt +++ b/app/src/main/java/com/example/taskmanagement/chat/ChatAdapter.kt @@ -6,7 +6,9 @@ import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.example.taskmanagement.R -class ChatAdapter(private val currentUserId: String) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { + +class ChatAdapter(private val currentUserId: String) : + RecyclerView.Adapter<RecyclerView.ViewHolder>() { private val messages = mutableListOf<Message>() @@ -82,6 +84,4 @@ class ChatAdapter(private val currentUserId: String) : RecyclerView.Adapter<Recy } } - - } diff --git a/app/src/main/java/com/example/taskmanagement/chat/ChatFragment.kt b/app/src/main/java/com/example/taskmanagement/chat/ChatFragment.kt index 5c7a2fe..fff59f2 100644 --- a/app/src/main/java/com/example/taskmanagement/chat/ChatFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/chat/ChatFragment.kt @@ -15,9 +15,7 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.example.taskmanagement.MainActivity import com.example.taskmanagement.R -import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.ListenerRegistration @@ -60,7 +58,6 @@ class ChatFragment : Fragment() { requireActivity().onBackPressedDispatcher.onBackPressed() return null } - return null } @@ -75,11 +72,9 @@ class ChatFragment : Fragment() { createChat() nameChatTextView.text = receiverId - (activity as? MainActivity)?.hideBottomNavigation() - buttonBack.setOnClickListener { - findNavController().navigateUp() + findNavController().popBackStack() } return view @@ -119,7 +114,6 @@ class ChatFragment : Fragment() { adapter.submitList(ArrayList(messageList)) recyclerView.scrollToPosition(messageList.size - 1) } catch (e: Exception) { - Log.e("ChatFragment", "Error loading messages: ", e) Toast.makeText( requireContext(), getString(R.string.failed_to_load_messages), @@ -131,7 +125,6 @@ class ChatFragment : Fragment() { private fun sendMessage(text: String) { val chatId = getChatId() - val message = Message( senderId = currentUserId, text = text, @@ -195,10 +188,6 @@ class ChatFragment : Fragment() { val chatData = hashMapOf( "participants" to participants ) - Log.d( - "ChatFragment", - "No existing chat found. Creating new chat with participants: $participants" - ) chatRef.set(chatData) .addOnSuccessListener { Log.d( diff --git a/app/src/main/java/com/example/taskmanagement/chat/ChatViewAdapter.kt b/app/src/main/java/com/example/taskmanagement/chat/ChatViewAdapter.kt index fd8a20c..e826014 100644 --- a/app/src/main/java/com/example/taskmanagement/chat/ChatViewAdapter.kt +++ b/app/src/main/java/com/example/taskmanagement/chat/ChatViewAdapter.kt @@ -29,18 +29,15 @@ class ChatViewAdapter( val otherParticipant = chat.participants.firstOrNull { it != currentUserEmail } - holder.chatName.text = otherParticipant ?: - holder.itemView.context.getString(R.string.user_not_authenticated) - holder.lastMessage.text = chat.lastMessage?.text ?: - holder.itemView.context.getString(R.string.no_message) + holder.chatName.text = + otherParticipant ?: holder.itemView.context.getString(R.string.user_not_authenticated) + holder.lastMessage.text = + chat.lastMessage?.text ?: holder.itemView.context.getString(R.string.no_message) holder.itemView.setOnClickListener { onChatClicked(chat) } } - - - override fun getItemCount() = chatList.size } diff --git a/app/src/main/java/com/example/taskmanagement/chat/DialogFragment.kt b/app/src/main/java/com/example/taskmanagement/chat/DialogFragment.kt index f70cee5..62d032f 100644 --- a/app/src/main/java/com/example/taskmanagement/chat/DialogFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/chat/DialogFragment.kt @@ -45,7 +45,11 @@ class DialogFragment : DialogFragment() { private fun loadUsers() { val currentUser = FirebaseAuth.getInstance().currentUser if (currentUser == null) { - Toast.makeText(requireContext(), getString(R.string.error_loading_users), Toast.LENGTH_SHORT).show() + Toast.makeText( + requireContext(), + getString(R.string.error_loading_users), + Toast.LENGTH_SHORT + ).show() return } @@ -53,8 +57,10 @@ class DialogFragment : DialogFragment() { .document(currentUser.uid) .get() .addOnSuccessListener { - val sharedPrefs = requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) - val currentUserRole = sharedPrefs.getString("role", "defaultRole")?: return@addOnSuccessListener + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val currentUserRole = + sharedPrefs.getString("role", "defaultRole") ?: return@addOnSuccessListener val rolesToLoad = when (currentUserRole) { "PM" -> listOf("PL") @@ -93,7 +99,6 @@ class DialogFragment : DialogFragment() { } } - private fun openChat(selectedUser: String) { val bundle = Bundle() bundle.putString("selectedUser", selectedUser) diff --git a/app/src/main/java/com/example/taskmanagement/chat/UserAdapter.kt b/app/src/main/java/com/example/taskmanagement/chat/UserAdapter.kt index 2e2f258..89d7af8 100644 --- a/app/src/main/java/com/example/taskmanagement/chat/UserAdapter.kt +++ b/app/src/main/java/com/example/taskmanagement/chat/UserAdapter.kt @@ -1,6 +1,5 @@ package com.example.taskmanagement.chat - import android.view.LayoutInflater import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/com/example/taskmanagement/chat/UserSelectionFragment.kt b/app/src/main/java/com/example/taskmanagement/chat/UserSelectionFragment.kt index 011ffa8..dc346c2 100644 --- a/app/src/main/java/com/example/taskmanagement/chat/UserSelectionFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/chat/UserSelectionFragment.kt @@ -33,7 +33,7 @@ class UserSelectionFragment : Fragment() { recyclerViewChats = view.findViewById(R.id.recyclerViewChats) btnNewChat = view.findViewById(R.id.newChatButton) - noChatsMessage= view.findViewById(R.id.noChatsMessage) + noChatsMessage = view.findViewById(R.id.noChatsMessage) setupRecyclerView() loadChats() @@ -126,7 +126,10 @@ class UserSelectionFragment : Fragment() { if (isAdded) { Toast.makeText( requireContext(), - getString(R.string.error_loading_last_message, e.message ?: "Unknown error"), + getString( + R.string.error_loading_last_message, + e.message ?: "Unknown error" + ), Toast.LENGTH_SHORT ).show() } @@ -134,8 +137,6 @@ class UserSelectionFragment : Fragment() { } - - private fun openChat(chat: Chat) { val currentUserId = currentUser?.email if (currentUserId.isNullOrEmpty()) { @@ -189,7 +190,6 @@ class UserSelectionFragment : Fragment() { R.id.action_userSelectionFragment_to_chatFragment, bundle ) - } } .addOnFailureListener { @@ -202,5 +202,4 @@ class UserSelectionFragment : Fragment() { } } } - } diff --git a/app/src/main/java/com/example/taskmanagement/task/AddSubTaskFragment.kt b/app/src/main/java/com/example/taskmanagement/task/AddSubTaskFragment.kt index 78cb96c..745bbee 100644 --- a/app/src/main/java/com/example/taskmanagement/task/AddSubTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/AddSubTaskFragment.kt @@ -1,5 +1,6 @@ package com.example.taskmanagement.task +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -152,7 +153,6 @@ class AddSubTaskFragment : Fragment() { getString(R.string.subtask_added_successfully), Toast.LENGTH_SHORT ).show() - findNavController().popBackStack() } .addOnFailureListener { e -> @@ -173,77 +173,66 @@ class AddSubTaskFragment : Fragment() { } private fun loadUsers(assignedToDropdown: AutoCompleteTextView) { - val currentUser = mAuth.currentUser ?: return - val userRoleRef = db.collection("users").document(currentUser.uid) - - userRoleRef.get().addOnSuccessListener { document -> - val userRole = document.getString("role") - - if (userRole != null) { - val query = when (userRole) { - "PM" -> db.collection("users").whereEqualTo("role", "PL") - "PL" -> db.collection("users").whereEqualTo("role", "Dev") - else -> db.collection("users").whereEqualTo("role", "Dev") - } - - query.get() - .addOnSuccessListener { result -> - val userList = mutableListOf<String>() + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + + if (role != null) { + val query = when (role) { + "PM" -> db.collection("users").whereEqualTo("role", "PL") + "PL" -> db.collection("users").whereEqualTo("role", "Dev") + else -> db.collection("users").whereEqualTo("role", "Dev") + } - for (doc in result) { - val userEmail = doc.getString("email") - userEmail?.let { userList.add(it) } - } + query.get() + .addOnSuccessListener { result -> + val userList = mutableListOf<String>() - val adapter = ArrayAdapter( - requireContext(), - R.layout.dropdown_item, - userList - ) - assignedToDropdown.setAdapter(adapter) + for (doc in result) { + val userEmail = doc.getString("email") + userEmail?.let { userList.add(it) } } - .addOnFailureListener { - Toast.makeText( - requireContext(), - getString(R.string.role_not_found), - Toast.LENGTH_SHORT - ).show() - } - } else { - Toast.makeText( - requireContext(), - getString(R.string.user_role_not_found), - Toast.LENGTH_SHORT - ).show() - } - }.addOnFailureListener { + val adapter = ArrayAdapter( + requireContext(), + R.layout.dropdown_item, + userList + ) + assignedToDropdown.setAdapter(adapter) + } + .addOnFailureListener { + Toast.makeText( + requireContext(), + getString(R.string.role_not_found), + Toast.LENGTH_SHORT + ).show() + } + } else { Toast.makeText( requireContext(), - getString(R.string.error_retrieving_role), + getString(R.string.user_role_not_found), Toast.LENGTH_SHORT ).show() + } } +} - private fun mapPriorityToNumber(priorityText: String): Int { - return when (priorityText.lowercase()) { - "high" -> 2 - "medium" -> 1 - "low" -> 0 - else -> 0 +private fun mapPriorityToNumber(priorityText: String): Int { + return when (priorityText.lowercase()) { + "high" -> 2 + "medium" -> 1 + "low" -> 0 + else -> 0 - } } +} - private fun mapStatusToNumber(statusText: String): Int { - return when (statusText.lowercase()) { - "Todo" -> 0 - "Assigned" -> 1 - "Completed" -> 2 - else -> 0 - } +private fun mapStatusToNumber(statusText: String): Int { + return when (statusText.lowercase()) { + "Todo" -> 0 + "Assigned" -> 1 + "Completed" -> 2 + else -> 0 } - - } diff --git a/app/src/main/java/com/example/taskmanagement/task/AddTaskFragment.kt b/app/src/main/java/com/example/taskmanagement/task/AddTaskFragment.kt index 8411540..f314410 100644 --- a/app/src/main/java/com/example/taskmanagement/task/AddTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/AddTaskFragment.kt @@ -1,5 +1,6 @@ package com.example.taskmanagement.task +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -53,31 +54,22 @@ class AddTaskFragment : Fragment() { findNavController().popBackStack() } - checkUserRoleAndProceed(currentUser.uid) + checkRole() } - private fun checkUserRoleAndProceed(userId: String) { - val userRoleRef = db.collection("users").document(userId) - userRoleRef.get().addOnSuccessListener { document -> - val userRole = document.getString("role") - - if (userRole == "Dev") { - Toast.makeText( - requireContext(), - getString(R.string.not_authorized), - Toast.LENGTH_LONG - ).show() - findNavController().navigate(R.id.profileFragment) - } else { - initializeViews() - } - }.addOnFailureListener { exception -> + private fun checkRole() { + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + if (role == "Dev") { Toast.makeText( requireContext(), - getString(R.string.failed_to_retrieve_user_role, exception.message), - Toast.LENGTH_SHORT + getString(R.string.not_authorized), + Toast.LENGTH_LONG ).show() - + findNavController().navigate(R.id.profileFragment) + } else { + initializeViews() } } @@ -152,60 +144,48 @@ class AddTaskFragment : Fragment() { } private fun loadUsers(assignedToDropdown: AutoCompleteTextView) { - val currentUser = mAuth.currentUser ?: return - val userRoleRef = db.collection("users").document(currentUser.uid) - - userRoleRef.get().addOnSuccessListener { document -> - val userRole = document.getString("role") - - if (userRole != null) { - val query = when (userRole) { - "PM" -> db.collection("users").whereEqualTo("role", "PL") - "PL" -> db.collection("users").whereEqualTo("role", "Dev") - else -> db.collection("users").whereEqualTo("role", "Dev") - } - - query.get() - .addOnSuccessListener { result -> - val userList = mutableListOf<String>() + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + + if (role != null) { + val query = when (role) { + "PM" -> db.collection("users").whereEqualTo("role", "PL") + "PL" -> db.collection("users").whereEqualTo("role", "Dev") + else -> db.collection("users").whereEqualTo("role", "Dev") + } - for (doc in result) { - val userEmail = doc.getString("email") - userEmail?.let { userList.add(it) } - } + query.get() + .addOnSuccessListener { result -> + val userList = mutableListOf<String>() - val adapter = ArrayAdapter( - requireContext(), - R.layout.dropdown_item, - userList - ) - assignedToDropdown.setAdapter(adapter) + for (doc in result) { + val userEmail = doc.getString("email") + userEmail?.let { userList.add(it) } } - .addOnFailureListener { exception -> - Toast.makeText( - requireContext(), - getString(R.string.failed_to_load_users, exception.message), - Toast.LENGTH_SHORT - ).show() - } - } else { - Toast.makeText( - requireContext(), - getString(R.string.user_role_not_found), - Toast.LENGTH_SHORT - ).show() + val adapter = ArrayAdapter( + requireContext(), + R.layout.dropdown_item, + userList + ) + assignedToDropdown.setAdapter(adapter) + } + .addOnFailureListener { exception -> + Toast.makeText( + requireContext(), + getString(R.string.failed_to_load_users, exception.message), + Toast.LENGTH_SHORT + ).show() - } - }.addOnFailureListener { exception -> + } + } else { Toast.makeText( requireContext(), - getString(R.string.failed_to_retrieve_user_role, exception.message), + getString(R.string.user_role_not_found), Toast.LENGTH_SHORT ).show() } } - - } 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 23e79dd..6491bff 100644 --- a/app/src/main/java/com/example/taskmanagement/task/ModifySubTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/ModifySubTaskFragment.kt @@ -1,5 +1,6 @@ package com.example.taskmanagement.task +import android.content.Context import android.os.Bundle import android.util.Log import android.view.LayoutInflater @@ -78,25 +79,21 @@ class ModifySubTaskFragment : Fragment() { val subtask = document.toObject(SubTask::class.java) subtask?.let { populateFields(it) } } else { - showErrorToast(R.string.error_subtask_not_found) + Toast.makeText( + requireContext(), + R.string.error_subtask_not_found, + Toast.LENGTH_SHORT + ).show() findNavController().popBackStack() } } .addOnFailureListener { exception -> Log.e("ModifySubTaskFragment", "Error loading document", exception) - showErrorToast(R.string.error_task_not_modify, exception.message) + Toast.makeText(requireContext(), R.string.error_task_not_modify, Toast.LENGTH_SHORT) + .show() } - - } - - - private fun showErrorToast(messageResId: Int, additionalMessage: String? = null) { - val message = - additionalMessage?.let { getString(messageResId, it) } ?: getString(messageResId) - Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() } - private fun populateFields(subtask: SubTask) { binding.subtaskName.setText(subtask.name) binding.subtaskDescription.setText(subtask.description) @@ -130,7 +127,7 @@ class ModifySubTaskFragment : Fragment() { val priority = getSelectedPriority() val status = getSelectedStatus() - if (subtaskName.isNotEmpty() && subtaskDescription.isNotEmpty() && deadline.isNotEmpty() && assignedTo.isNotEmpty()) { + if (subtaskName.isNotEmpty() && subtaskDescription.isNotEmpty() && deadline.isNotEmpty()) { val updatedSubtask = SubTask( name = subtaskName, description = subtaskDescription, @@ -212,55 +209,45 @@ class ModifySubTaskFragment : Fragment() { } private fun loadUsers(assignedToDropdown: AutoCompleteTextView) { - val currentUser = mAuth.currentUser ?: return - val userRoleRef = db.collection("users").document(currentUser.uid) - - userRoleRef.get().addOnSuccessListener { document -> - val userRole = document.getString("role") - - if (userRole != null) { - val query = when (userRole) { - "PM" -> db.collection("users").whereEqualTo("role", "PL") - "PL" -> db.collection("users").whereEqualTo("role", "Dev") - else -> db.collection("users").whereEqualTo("role", "Dev") - } - - query.get() - .addOnSuccessListener { result -> - val userList = mutableListOf<String>() + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + + if (role != null) { + val query = when (role) { + "PM" -> db.collection("users").whereEqualTo("role", "PL") + "PL" -> db.collection("users").whereEqualTo("role", "Dev") + else -> db.collection("users").whereEqualTo("role", "Dev") + } - for (doc in result) { - val userEmail = doc.getString("email") - userEmail?.let { userList.add(it) } - } + query.get() + .addOnSuccessListener { result -> + val userList = mutableListOf<String>() - val adapter = ArrayAdapter( - requireContext(), - R.layout.dropdown_item, - userList - ) - assignedToDropdown.setAdapter(adapter) + for (doc in result) { + val userEmail = doc.getString("email") + userEmail?.let { userList.add(it) } } - .addOnFailureListener { exception -> - Toast.makeText( - requireContext(), - getString(R.string.failed_to_load_users, exception.message), - Toast.LENGTH_SHORT - ).show() - } - } else { - Toast.makeText( - requireContext(), - getString(R.string.user_role_not_found), - Toast.LENGTH_SHORT - ).show() + val adapter = ArrayAdapter( + requireContext(), + R.layout.dropdown_item, + userList + ) + assignedToDropdown.setAdapter(adapter) + } + .addOnFailureListener { exception -> + Toast.makeText( + requireContext(), + getString(R.string.failed_to_load_users, exception.message), + Toast.LENGTH_SHORT + ).show() - } - }.addOnFailureListener { exception -> + } + } else { Toast.makeText( requireContext(), - getString(R.string.failed_to_retrieve_user_role, exception.message), + getString(R.string.user_role_not_found), Toast.LENGTH_SHORT ).show() diff --git a/app/src/main/java/com/example/taskmanagement/task/ModifyTaskFragment.kt b/app/src/main/java/com/example/taskmanagement/task/ModifyTaskFragment.kt index 489fdea..e3fd4a8 100644 --- a/app/src/main/java/com/example/taskmanagement/task/ModifyTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/ModifyTaskFragment.kt @@ -1,5 +1,6 @@ package com.example.taskmanagement.task +import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -120,7 +121,7 @@ class ModifyTaskFragment : Fragment() { val expirationDate = binding.expirationInput.text.toString() val assignedTo = binding.assignedDropdown.text.toString() - if (taskName.isNotEmpty() && taskDescription.isNotEmpty() && expirationDate.isNotEmpty() && assignedTo.isNotEmpty()) { + if (taskName.isNotEmpty() && taskDescription.isNotEmpty() && expirationDate.isNotEmpty()) { val updatedTask = Task( name = taskName, description = taskDescription, @@ -159,59 +160,47 @@ class ModifyTaskFragment : Fragment() { private fun loadUsers(assignedToDropdown: AutoCompleteTextView) { - val currentUser = mAuth.currentUser ?: return - val userRoleRef = db.collection("users").document(currentUser.uid) - - userRoleRef.get().addOnSuccessListener { document -> - val userRole = document.getString("role") - - if (userRole != null) { - val query = when (userRole) { - "PM" -> db.collection("users").whereEqualTo("role", "PL") - "PL" -> db.collection("users").whereEqualTo("role", "Dev") - else -> db.collection("users").whereEqualTo("role", "Dev") - } - - query.get() - .addOnSuccessListener { result -> - val userList = mutableListOf<String>() + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + if (role != null) { + val query = when (role) { + "PM" -> db.collection("users").whereEqualTo("role", "PL") + "PL" -> db.collection("users").whereEqualTo("role", "Dev") + else -> db.collection("users").whereEqualTo("role", "Dev") + } - for (doc in result) { - val userEmail = doc.getString("email") - userEmail?.let { userList.add(it) } - } + query.get() + .addOnSuccessListener { result -> + val userList = mutableListOf<String>() - val adapter = ArrayAdapter( - requireContext(), - R.layout.dropdown_item, - userList - ) - assignedToDropdown.setAdapter(adapter) + for (doc in result) { + val userEmail = doc.getString("email") + userEmail?.let { userList.add(it) } } - .addOnFailureListener { exception -> - Toast.makeText( - requireContext(), - getString(R.string.failed_to_load_users, exception.message), - Toast.LENGTH_SHORT - ).show() - } - } else { - Toast.makeText( - requireContext(), - getString(R.string.user_role_not_found), - Toast.LENGTH_SHORT - ).show() + val adapter = ArrayAdapter( + requireContext(), + R.layout.dropdown_item, + userList + ) + assignedToDropdown.setAdapter(adapter) + } + .addOnFailureListener { exception -> + Toast.makeText( + requireContext(), + getString(R.string.failed_to_load_users, exception.message), + Toast.LENGTH_SHORT + ).show() - } - }.addOnFailureListener { exception -> + } + } else { Toast.makeText( requireContext(), - getString(R.string.failed_to_retrieve_user_role, exception.message), + getString(R.string.user_role_not_found), Toast.LENGTH_SHORT ).show() } } - } 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 5ab2d15..9582ccf 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SearchFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SearchFragment.kt @@ -100,7 +100,8 @@ class SearchFragment : Fragment() { } 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() @@ -321,6 +322,17 @@ class SearchFragment : Fragment() { } private fun onEditTask(task: Task) { + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + if (role == "PL" || role == "Dev") { + Toast.makeText( + requireContext(), + getString(R.string.only_pm_can_edit_tasks), + Toast.LENGTH_SHORT + ).show() + return + } val taskId = taskIdMap[task.name] val bundle = Bundle().apply { putString("taskId", taskId) diff --git a/app/src/main/java/com/example/taskmanagement/task/SearchSubFragment.kt b/app/src/main/java/com/example/taskmanagement/task/SearchSubFragment.kt index 9bf4ec4..f246791 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SearchSubFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SearchSubFragment.kt @@ -1,7 +1,6 @@ package com.example.taskmanagement.task import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -30,8 +29,7 @@ class SearchSubFragment : Fragment() { private var taskID: String? = null override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { val view = inflater.inflate(R.layout.fragment_search_sub, container, false) @@ -72,13 +70,9 @@ class SearchSubFragment : Fragment() { subtaskRecyclerView.visibility = View.VISIBLE lifecycleScope.launch { try { - val result = firestore.collection("tasks") - .document(taskId) - .collection("subTasks") - .get() - .await() - - Log.d("SubTaskFragment", "Firestore result size: ${result.size()}") + val result = + firestore.collection("tasks").document(taskId).collection("subTasks").get() + .await() subtaskList.clear() for (document in result) { @@ -99,7 +93,11 @@ class SearchSubFragment : Fragment() { } } catch (e: Exception) { - Toast.makeText(requireContext(), "Failed to load subtasks", Toast.LENGTH_SHORT) + Toast.makeText( + requireContext(), + getString(R.string.failed_to_load_subtasks), + Toast.LENGTH_SHORT + ) .show() } } diff --git a/app/src/main/java/com/example/taskmanagement/task/SubTask.kt b/app/src/main/java/com/example/taskmanagement/task/SubTask.kt index d3ebfa2..a27b145 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SubTask.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SubTask.kt @@ -3,7 +3,7 @@ package com.example.taskmanagement.task data class SubTask( val name: String = "", val description: String = "", - val createdBy: String?= "", + val createdBy: String? = "", val assignedTo: String? = null, val deadline: String = "", val priority: Int = 0, diff --git a/app/src/main/java/com/example/taskmanagement/task/SubTaskFragment.kt b/app/src/main/java/com/example/taskmanagement/task/SubTaskFragment.kt index 9e241c7..ae158fa 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SubTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SubTaskFragment.kt @@ -1,7 +1,7 @@ package com.example.taskmanagement.task +import android.content.Context import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -57,9 +57,6 @@ class SubTaskFragment : Fragment() { backArrow.setOnClickListener { findNavController().popBackStack() } - - - return view } @@ -83,7 +80,11 @@ class SubTaskFragment : Fragment() { bundle ) } else { - Toast.makeText(requireContext(), "Task ID not found", Toast.LENGTH_SHORT).show() + Toast.makeText( + requireContext(), + getString(R.string.task_id_not_found), + Toast.LENGTH_SHORT + ).show() } } @@ -104,8 +105,6 @@ class SubTaskFragment : Fragment() { .get() .await() - Log.d("SubTaskFragment", "Firestore result size: ${result.size()}") - subtaskList.clear() for (document in result) { val subTask = document.toObject(SubTask::class.java) @@ -125,7 +124,11 @@ class SubTaskFragment : Fragment() { } } catch (e: Exception) { - Toast.makeText(requireContext(), "Failed to load subtasks", Toast.LENGTH_SHORT) + Toast.makeText( + requireContext(), + getString(R.string.failed_to_load_subtasks), + Toast.LENGTH_SHORT + ) .show() } } @@ -134,29 +137,27 @@ class SubTaskFragment : Fragment() { private fun toggleFabMenu(fabAddSubtask: View, fabBackHome: View) { val currentUser = FirebaseAuth.getInstance().currentUser if (currentUser != null) { - val userRef = FirebaseFirestore.getInstance().collection("users").document(currentUser.uid) - userRef.get().addOnSuccessListener { document -> - val userRole = document.getString("role") - if (userRole == "PM") { + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + if (role == "PM") { + fabAddSubtask.visibility = View.GONE + if (isFabMenuOpen) { + fabBackHome.visibility = View.GONE + } else { + fabBackHome.visibility = View.VISIBLE + } + } else { + if (isFabMenuOpen) { fabAddSubtask.visibility = View.GONE - if (isFabMenuOpen) { - fabBackHome.visibility = View.GONE - } else { - fabBackHome.visibility = View.VISIBLE - } + fabBackHome.visibility = View.GONE } else { - if (isFabMenuOpen) { - fabAddSubtask.visibility = View.GONE - fabBackHome.visibility = View.GONE - } else { - fabAddSubtask.visibility = View.VISIBLE - fabBackHome.visibility = View.VISIBLE - } + fabAddSubtask.visibility = View.VISIBLE + fabBackHome.visibility = View.VISIBLE } - isFabMenuOpen = !isFabMenuOpen - }.addOnFailureListener { - Toast.makeText(context, "Error loading user role", Toast.LENGTH_SHORT).show() } + isFabMenuOpen = !isFabMenuOpen + } } 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 d205fe6..6a1b2b4 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SubtaskAdapter.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SubtaskAdapter.kt @@ -57,11 +57,10 @@ class SubtaskAdapter( originalTaskList } else { originalTaskList.filter { - it.name.contains(query, ignoreCase = true) || it.description.contains( - query, - ignoreCase = true - ) || it.deadline.contains(query, ignoreCase = true) - || statusMap[query] == it.status + it.name.contains(query, ignoreCase = true) + || it.description.contains(query, ignoreCase = true) + || it.deadline.contains(query, ignoreCase = true) + || statusMap[query] == it.status || priorityMap[query] == it.priority } @@ -115,7 +114,6 @@ class SubtaskAdapter( val subtasksRef = db.collection("tasks") .document(taskId) .collection("subTasks") - subtasksRef.get() .addOnSuccessListener { documents -> for (document in documents) { @@ -167,7 +165,6 @@ class SubtaskAdapter( } } - deleteButton.setOnClickListener { db.collection("tasks") .document(taskId).collection("subTasks") @@ -216,7 +213,6 @@ class SubtaskAdapter( .show() } } - } private fun calculateDaysRemaining(deadline: String?): Int { @@ -233,9 +229,7 @@ class SubtaskAdapter( 0 } } - } - } diff --git a/app/src/main/res/drawable/baseline_how_to_reg_24.xml b/app/src/main/res/drawable/baseline_how_to_reg_24.xml deleted file mode 100644 index 2b3e41e..0000000 --- a/app/src/main/res/drawable/baseline_how_to_reg_24.xml +++ /dev/null @@ -1,7 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> - - <path android:fillColor="@android:color/white" android:fillType="evenOdd" android:pathData="M9,17l3,-2.94c-0.39,-0.04 -0.68,-0.06 -1,-0.06 -2.67,0 -8,1.34 -8,4v2h9l-3,-3zM11,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4"/> - - <path android:fillColor="@android:color/white" android:fillType="evenOdd" android:pathData="M15.47,20.5L12,17l1.4,-1.41 2.07,2.08 5.13,-5.17 1.4,1.41z"/> - -</vector> diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="108dp" - android:height="108dp" - android:viewportWidth="108" - android:viewportHeight="108"> - <path - android:fillColor="#3DDC84" - android:pathData="M0,0h108v108h-108z" /> - <path - android:fillColor="#00000000" - android:pathData="M9,0L9,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,0L19,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M29,0L29,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M39,0L39,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M49,0L49,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M59,0L59,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M69,0L69,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M79,0L79,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M89,0L89,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M99,0L99,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,9L108,9" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,19L108,19" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,29L108,29" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,39L108,39" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,49L108,49" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,59L108,59" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,69L108,69" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,79L108,79" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,89L108,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,99L108,99" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,29L89,29" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,39L89,39" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,49L89,49" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,59L89,59" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,69L89,69" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,79L89,79" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M29,19L29,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M39,19L39,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M49,19L49,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M59,19L59,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M69,19L69,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M79,19L79,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> -</vector> diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt" - android:width="108dp" - android:height="108dp" - android:viewportWidth="108" - android:viewportHeight="108"> - <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> - <aapt:attr name="android:fillColor"> - <gradient - android:endX="85.84757" - android:endY="92.4963" - android:startX="42.9492" - android:startY="49.59793" - android:type="linear"> - <item - android:color="#44000000" - android:offset="0.0" /> - <item - android:color="#00000000" - android:offset="1.0" /> - </gradient> - </aapt:attr> - </path> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> -</vector> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_notification.xml b/app/src/main/res/drawable/ic_notification.xml deleted file mode 100644 index 5979e31..0000000 --- a/app/src/main/res/drawable/ic_notification.xml +++ /dev/null @@ -1,5 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> - - <path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,18.5c-0.83,0 -1.5,-0.67 -1.5,-1.5h3c0,0.83 -0.67,1.5 -1.5,1.5zM17,16L7,16v-1l1,-1v-2.61C8,9.27 9.03,7.47 11,7v-0.5c0,-0.57 0.43,-1 1,-1s1,0.43 1,1L13,7c1.97,0.47 3,2.28 3,4.39L16,14l1,1v1z"/> - -</vector> diff --git a/app/src/main/res/drawable/message_bubble_received.xml b/app/src/main/res/drawable/message_bubble_received.xml index 1b98848..3887fc5 100644 --- a/app/src/main/res/drawable/message_bubble_received.xml +++ b/app/src/main/res/drawable/message_bubble_received.xml @@ -1,5 +1,5 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid android:color="@color/DarkSeaGreen" /> + <solid android:color="@color/LightGrey" /> <corners android:radius="30dp" /> <padding android:left="16dp" diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0937422..0bd2aa8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,7 +6,7 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - <fragment + <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="0dp" diff --git a/app/src/main/res/layout/fragment_add_sub_task.xml b/app/src/main/res/layout/fragment_add_sub_task.xml index e77318d..4176d5b 100644 --- a/app/src/main/res/layout/fragment_add_sub_task.xml +++ b/app/src/main/res/layout/fragment_add_sub_task.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout - xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" @@ -14,25 +13,25 @@ android:layout_height="wrap_content" android:background="?attr/colorPrimaryContainer" android:elevation="0dp" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent"> + app:layout_constraintTop_toTopOf="parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" + android:gravity="center_vertical" android:orientation="horizontal" android:paddingStart="16dp" - android:paddingEnd="16dp" - android:gravity="center_vertical"> + android:paddingEnd="16dp"> <ImageButton android:id="@+id/buttonBack" android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_height="40dp" android:background="?attr/selectableItemBackground" - android:src="@drawable/baseline_arrow_back_24" - android:contentDescription="@string/turn_back" /> + android:contentDescription="@string/turn_back" + android:src="@drawable/baseline_arrow_back_24" /> <TextView android:id="@+id/nameToolAddTask" @@ -50,16 +49,16 @@ android:layout_width="0dp" android:layout_height="0dp" android:padding="16dp" - app:layout_constraintTop_toBottomOf="@id/toolbarChat" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintBottom_toBottomOf="parent"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/toolbarChat"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" android:dividerPadding="8dp" + android:orientation="vertical" android:showDividers="middle"> <!-- Nome Subtask --> @@ -76,7 +75,6 @@ android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Descrizione --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/subtaskDescriptionTextField" style="@style/Widget.Material3.TextInputLayout.FilledBox" @@ -90,7 +88,6 @@ android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Menu Priorità --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/priorityMenu" style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu" @@ -105,7 +102,6 @@ android:inputType="none" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Menu Stato --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/statusMenu" style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu" @@ -120,7 +116,6 @@ android:inputType="none" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Scadenza --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/subtaskDeadlineMenu" style="@style/Widget.Material3.TextInputLayout.FilledBox" @@ -135,7 +130,6 @@ android:inputType="date" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Assegnato a --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/assignedToMenu" style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu" @@ -153,26 +147,26 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/progress" android:layout_marginTop="8dp" + android:text="@string/progress" android:textAppearance="?attr/textAppearanceBodyMedium" /> <com.google.android.material.slider.Slider android:id="@+id/progressSlider" android:layout_width="match_parent" android:layout_height="wrap_content" - android:valueFrom="0" - android:valueTo="100" + android:layout_marginTop="8dp" android:stepSize="1" - android:layout_marginTop="8dp" /> + android:valueFrom="0" + android:valueTo="100" /> <com.google.android.material.button.MaterialButton android:id="@+id/addSubtaskButton" + style="@style/Widget.Material3.Button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:text="@string/save_subtask" - style="@style/Widget.Material3.Button" /> + android:text="@string/save_subtask" /> </LinearLayout> </androidx.core.widget.NestedScrollView> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/main/res/layout/fragment_add_task.xml b/app/src/main/res/layout/fragment_add_task.xml index efda3b9..204f218 100644 --- a/app/src/main/res/layout/fragment_add_task.xml +++ b/app/src/main/res/layout/fragment_add_task.xml @@ -61,7 +61,6 @@ android:orientation="vertical" android:showDividers="middle"> - <!-- Nome Subtask --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/subtaskNameText" style="@style/Widget.Material3.TextInputLayout.FilledBox" diff --git a/app/src/main/res/layout/fragment_dialog.xml b/app/src/main/res/layout/fragment_dialog.xml index cb5034c..82c878d 100644 --- a/app/src/main/res/layout/fragment_dialog.xml +++ b/app/src/main/res/layout/fragment_dialog.xml @@ -1,13 +1,13 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" android:padding="16dp"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" + android:gravity="center_horizontal" android:paddingBottom="8dp" android:text="@string/select_user" android:textSize="18sp" diff --git a/app/src/main/res/layout/fragment_edit_profile.xml b/app/src/main/res/layout/fragment_edit_profile.xml index b354b7f..f091116 100644 --- a/app/src/main/res/layout/fragment_edit_profile.xml +++ b/app/src/main/res/layout/fragment_edit_profile.xml @@ -7,7 +7,6 @@ android:fitsSystemWindows="true" tools:context=".auth.EditProfileFragment"> - <!-- Toolbar --> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbarEditProfile" android:layout_width="0dp" @@ -46,7 +45,6 @@ </LinearLayout> </androidx.appcompat.widget.Toolbar> - <!-- Scrollable Content --> <androidx.core.widget.NestedScrollView android:layout_width="0dp" android:layout_height="0dp" @@ -63,7 +61,6 @@ android:orientation="vertical" android:showDividers="middle"> - <!-- Nome --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/inputName" style="@style/Widget.Material3.TextInputLayout.FilledBox" @@ -116,7 +113,6 @@ android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Save Button --> <com.google.android.material.button.MaterialButton android:id="@+id/buttonSaveProfile" style="@style/Widget.Material3.Button" diff --git a/app/src/main/res/layout/fragment_modify_sub_task.xml b/app/src/main/res/layout/fragment_modify_sub_task.xml index abfea12..c5b323b 100644 --- a/app/src/main/res/layout/fragment_modify_sub_task.xml +++ b/app/src/main/res/layout/fragment_modify_sub_task.xml @@ -45,7 +45,6 @@ </LinearLayout> </androidx.appcompat.widget.Toolbar> - <!-- NestedScrollView --> <androidx.core.widget.NestedScrollView android:layout_width="0dp" android:layout_height="0dp" @@ -62,7 +61,6 @@ android:orientation="vertical" android:showDividers="middle"> - <!-- Nome Subtask --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/subtaskNameText" style="@style/Widget.Material3.TextInputLayout.FilledBox" @@ -76,7 +74,6 @@ android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Descrizione Subtask --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/subtaskDescriptionText" style="@style/Widget.Material3.TextInputLayout.FilledBox" @@ -90,7 +87,6 @@ android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Priorità --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/priorityMenu" style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu" @@ -105,7 +101,6 @@ android:inputType="none" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Stato --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/statusMenu" style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu" @@ -120,7 +115,6 @@ android:inputType="none" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Scadenza --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/deadlineMenu" style="@style/Widget.Material3.TextInputLayout.FilledBox" @@ -132,11 +126,10 @@ android:id="@+id/subtask_deadline" android:layout_width="match_parent" android:layout_height="wrap_content" - android:inputType="none" - android:focusable="false" /> + android:focusable="false" + android:inputType="none" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Progresso --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -153,7 +146,6 @@ android:valueFrom="0" android:valueTo="100" /> - <!-- Assegnato a --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/assignedMenu" style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu" @@ -168,7 +160,6 @@ android:inputType="none" /> </com.google.android.material.textfield.TextInputLayout> - <!-- Pulsante Salva --> <com.google.android.material.button.MaterialButton android:id="@+id/save_subtask_button" style="@style/Widget.Material3.Button" diff --git a/app/src/main/res/layout/fragment_modify_task.xml b/app/src/main/res/layout/fragment_modify_task.xml index f6f9df7..a618684 100644 --- a/app/src/main/res/layout/fragment_modify_task.xml +++ b/app/src/main/res/layout/fragment_modify_task.xml @@ -61,7 +61,6 @@ android:orientation="vertical" android:showDividers="middle"> - <!-- Nome Task --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/taskNameText" style="@style/Widget.Material3.TextInputLayout.FilledBox" diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index d270492..9a78981 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -3,9 +3,9 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" android:background="@drawable/gradient_background" android:fillViewport="true" + android:fitsSystemWindows="true" tools:context="auth.ProfileFragment"> <LinearLayout @@ -23,10 +23,10 @@ android:layout_height="120dp" android:layout_centerHorizontal="true" android:layout_marginTop="30dp" + android:background="@drawable/ic_baseline_account_circle_24" android:contentDescription="@string/user_image" - android:src="@drawable/ic_baseline_account_circle_24" android:scaleType="centerCrop" - android:background="@drawable/ic_baseline_account_circle_24" /> + android:src="@drawable/ic_baseline_account_circle_24" /> <TextView android:id="@+id/userName" @@ -57,16 +57,13 @@ android:layout_height="wrap_content" android:layout_alignEnd="@id/profileImage" android:layout_alignBottom="@id/profileImage" - android:layout_marginEnd="-19dp" - android:layout_marginBottom="-7dp" + android:layout_marginEnd="-59dp" + android:layout_marginBottom="-2dp" android:backgroundTint="@android:color/transparent" android:contentDescription="@string/edit_profile" android:src="@drawable/baseline_add_circle_24" /> - </RelativeLayout> - - <!-- Task List --> <LinearLayout android:id="@+id/taskListAssigned" android:layout_width="match_parent" @@ -110,9 +107,9 @@ android:id="@+id/skillsList" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="8dp" android:text="@string/skills" - android:textColor="@color/black" - android:layout_marginTop="8dp" /> + android:textColor="@color/black" /> </LinearLayout> <LinearLayout @@ -132,16 +129,16 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="16dp" android:baselineAligned="false" - android:orientation="horizontal" - android:layout_marginTop="16dp"> + android:orientation="horizontal"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:orientation="vertical" - android:gravity="center"> + android:gravity="center" + android:orientation="vertical"> <TextView android:layout_width="wrap_content" @@ -163,8 +160,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:orientation="vertical" - android:gravity="center"> + android:gravity="center" + android:orientation="vertical"> <TextView android:layout_width="wrap_content" @@ -186,8 +183,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:orientation="vertical" - android:gravity="center"> + android:gravity="center" + android:orientation="vertical"> <TextView android:layout_width="wrap_content" @@ -207,7 +204,6 @@ </LinearLayout> </LinearLayout> - <Button android:id="@+id/buttonLogout" android:layout_width="wrap_content" diff --git a/app/src/main/res/layout/fragment_search_sub.xml b/app/src/main/res/layout/fragment_search_sub.xml index dc2cc4c..7368cb7 100644 --- a/app/src/main/res/layout/fragment_search_sub.xml +++ b/app/src/main/res/layout/fragment_search_sub.xml @@ -14,6 +14,7 @@ android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:background="?attr/selectableItemBackground" + android:contentDescription="@string/turn_back" android:src="@drawable/baseline_arrow_back_24" app:layout_constraintEnd_toStartOf="@id/fragmentTitle" app:layout_constraintHorizontal_bias="0.0" diff --git a/app/src/main/res/layout/fragment_sub_task.xml b/app/src/main/res/layout/fragment_sub_task.xml index 200cb58..1952eb7 100644 --- a/app/src/main/res/layout/fragment_sub_task.xml +++ b/app/src/main/res/layout/fragment_sub_task.xml @@ -9,8 +9,6 @@ android:fitsSystemWindows="true" tools:context=".task.SubTaskFragment"> - <!-- Freccia per tornare indietro a sinistra del titolo --> - <ImageView android:id="@+id/backArrow" android:layout_width="32dp" @@ -18,7 +16,7 @@ android:layout_marginStart="16dp" android:layout_marginTop="22dp" android:clickable="true" - android:contentDescription="back" + android:contentDescription="@string/turn_back" android:focusable="true" android:gravity="center_horizontal" android:src="@drawable/baseline_arrow_back_24" @@ -70,7 +68,6 @@ app:layout_constraintStart_toStartOf="parent" app:menu="@menu/bottom_nav_menu" /> - <!-- FAB principale --> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab_main" android:layout_width="wrap_content" diff --git a/app/src/main/res/layout/fragment_welcome.xml b/app/src/main/res/layout/fragment_welcome.xml index 55cef37..b696dc8 100644 --- a/app/src/main/res/layout/fragment_welcome.xml +++ b/app/src/main/res/layout/fragment_welcome.xml @@ -9,9 +9,9 @@ <ImageView android:id="@+id/logoIcon" - android:layout_width="120dp" - android:layout_height="120dp" - android:layout_marginTop="200dp" + android:layout_width="240dp" + android:layout_height="240dp" + android:layout_marginTop="150dp" android:layout_marginBottom="16dp" android:contentDescription="@string/app_logo" android:src="@drawable/welcome_logo" diff --git a/app/src/main/res/layout/message_item_sent.xml b/app/src/main/res/layout/message_item_sent.xml index 00a5eec..34c92b3 100644 --- a/app/src/main/res/layout/message_item_sent.xml +++ b/app/src/main/res/layout/message_item_sent.xml @@ -16,7 +16,6 @@ android:textColor="@android:color/white" android:textSize="20sp" /> - <TextView android:id="@+id/textTimestamp" android:layout_width="wrap_content" diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f783f33..6d90656 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -170,4 +170,8 @@ <string name="fill_all_field">Completa tutti i campi</string> <string name="profile_updated">Profilo aggiornato con successo</string> <string name="error_updating_profile">Errore aggiornamento profilo</string> + <string name="profile_image_saved">Immagine del profilo salvata correttamente"</string> + <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> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index d22d07a..0d14600 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <color name="ic_launcher_background">#35398F</color> + <color name="ic_launcher_background">@android:color/transparent</color> </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 d3aabf2..b4eba15 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -191,5 +191,8 @@ <string name="fill_all_field">Fill in all fields</string> <string name="profile_updated">Profile updated successfully</string> <string name="error_updating_profile">Error updating profile</string> - + <string name="profile_image_saved">Profile image saved successfully"</string> + <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> </resources> \ No newline at end of file -- GitLab