From 06ad0ae6983fe5c57d8145154ce1527797264650 Mon Sep 17 00:00:00 2001 From: scimmiamorta <ale.beni95@gmail.com> Date: Sat, 28 Dec 2024 11:18:10 +0100 Subject: [PATCH] First Commit --- .idea/misc.xml | 8 ++ .../taskmanagement/auth/ProfileFragment.kt | 116 ++++++++++++------ .../taskmanagement/task/AddSubTaskFragment.kt | 14 ++- .../taskmanagement/task/HomeFragment.kt | 25 ++-- .../task/ModifySubTaskFragment.kt | 16 +-- .../taskmanagement/task/SearchSubFragment.kt | 2 +- .../example/taskmanagement/task/SubTask.kt | 4 +- .../taskmanagement/task/SubTaskFragment.kt | 2 - .../taskmanagement/task/SubtaskAdapter.kt | 49 +++++--- .../taskmanagement/task/TaskAdapter.kt | 10 +- app/src/main/res/layout/fragment_profile.xml | 32 ++--- app/src/main/res/values-it/strings.xml | 3 + app/src/main/res/values/strings.xml | 4 + 13 files changed, 187 insertions(+), 98 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index b2c751a..e502106 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,3 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> @@ -6,4 +7,11 @@ <component name="ProjectType"> <option name="id" value="Android" /> </component> + <component name="VisualizationToolProject"> + <option name="state"> + <ProjectState> + <option name="scale" value="0.6297709923664122" /> + </ProjectState> + </option> + </component> </project> \ No newline at end of file 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 4151952..380d4b9 100644 --- a/app/src/main/java/com/example/taskmanagement/auth/ProfileFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/auth/ProfileFragment.kt @@ -1,6 +1,7 @@ package com.example.taskmanagement.auth import android.Manifest +import android.content.Context import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -13,6 +14,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.ListView +import android.widget.TextView import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat @@ -43,7 +45,8 @@ class ProfileFragment : Fragment() { if (isGranted) { openGallery() } else { - Toast.makeText(context, getString(R.string.permission_denied), Toast.LENGTH_SHORT).show() + Toast.makeText(context, getString(R.string.permission_denied), Toast.LENGTH_SHORT) + .show() } } @@ -56,7 +59,8 @@ class ProfileFragment : Fragment() { saveProfileImage(bitmap) setProfileImage(bitmap) } else { - Toast.makeText(context, getString(R.string.image_loading_error), Toast.LENGTH_SHORT).show() + Toast.makeText(context, getString(R.string.image_loading_error), Toast.LENGTH_SHORT) + .show() } } @@ -159,28 +163,22 @@ class ProfileFragment : Fragment() { } private fun setProfileImage(bitmap: Bitmap) { - val circularBitmap = Bitmap.createScaledBitmap(bitmap, 80, 80, true) - - val matrix = android.graphics.Matrix() - matrix.postRotate(270f) - val rotatedBitmap = Bitmap.createBitmap( - circularBitmap, - 0, - 0, - circularBitmap.width, - circularBitmap.height, - matrix, - true - ) - - // Imposta l'immagine ruotata e rimpicciolita - binding.profileImage.setImageBitmap(rotatedBitmap) + val circularBitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, true) + + binding.profileImage.setImageBitmap(circularBitmap) } private fun loadUserData() { val userId = firebaseAuth!!.currentUser!!.email + val sharedPrefs = + requireContext().getSharedPreferences("TaskManagerPrefs", Context.MODE_PRIVATE) + val role = sharedPrefs.getString("role", "defaultRole") + if (role == "PM") { + binding.taskListAssigned.visibility = View.GONE + } + if (userId != null) { firestore!!.collection("usersData") .document(userId) @@ -191,7 +189,7 @@ class ProfileFragment : Fragment() { val skills = document.getString("skills") if (!firstName.isNullOrEmpty() && !lastName.isNullOrEmpty()) { - binding.userName.text = getString(R.string.user_name, firstName, lastName) + binding.userName.text = getString(R.string.user_name, firstName, userId) binding.welcomeMessage.text = getString(R.string.welcome_message, firstName) } else { @@ -210,7 +208,6 @@ class ProfileFragment : Fragment() { ).show() } } - firestore!!.collection("tasks") .whereEqualTo("assignedTo", userId) .get() @@ -232,32 +229,79 @@ class ProfileFragment : Fragment() { } firestore!!.collection("tasks") - .whereEqualTo("assignedTo", userId) .get() - .addOnSuccessListener { queryDocumentSnapshots: QuerySnapshot -> - var completed = 0 - var todo = 0 - var assigned = 0 + .addOnSuccessListener { tasksSnapshot -> + var completedCount = 0 + var assignedCount = 0 + var toDoCount = 0 - for (snapshot in queryDocumentSnapshots) { - val status = snapshot.getString("status") - when (status) { - "Completed" -> completed++ - "Assigned" -> assigned++ - "Todo" -> todo++ - } + val taskCount = tasksSnapshot.size() + var tasksProcessed = 0 + + if (taskCount == 0) { + updateStatistics(completedCount, assignedCount, toDoCount) + return@addOnSuccessListener } - binding.completedProjects.text = completed.toString() - binding.projectsToStart.text = todo.toString() - binding.averageCompletionTime.text = assigned.toString() + for (task in tasksSnapshot) { + val taskId = task.id + + val subTaskQuery = if (role == "PL") { + firestore!!.collection("tasks").document(taskId).collection("subTasks") + } else { + firestore!!.collection("tasks") + .document(taskId) + .collection("subTasks") + .whereEqualTo("assignedTo", userId) + } + + subTaskQuery.get() + .addOnSuccessListener { subTasksSnapshot -> + for (subTask in subTasksSnapshot) { + val subTaskStatus = subTask.getLong("status")?.toInt() + when (subTaskStatus) { + 2 -> completedCount++ + 1 -> assignedCount++ + 0 -> toDoCount++ + } + } + + tasksProcessed++ + + if (tasksProcessed == taskCount) { + updateStatistics(completedCount, assignedCount, toDoCount) + } + } + .addOnFailureListener { + Log.e( + "ProfileFragment", + "Errore nel recupero dei sottotask per il task $taskId" + ) + tasksProcessed++ + if (tasksProcessed == taskCount) { + updateStatistics(completedCount, assignedCount, toDoCount) + } + } + } } .addOnFailureListener { Toast.makeText(context, getString(R.string.error_loading_tasks), Toast.LENGTH_SHORT).show() - } + + } + private fun updateStatistics(completed: Int, assigned: Int, toDo: Int) { + val toDoTextView = view?.findViewById<TextView>(R.id.todoSubTask) + 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() + } + + private fun listViewHeight(listView: ListView) { val adapter = listView.adapter ?: return 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 59e2868..78cb96c 100644 --- a/app/src/main/java/com/example/taskmanagement/task/AddSubTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/AddSubTaskFragment.kt @@ -94,7 +94,6 @@ class AddSubTaskFragment : Fragment() { private fun initializeViews() { val taskNameEditText = binding.subtaskName val taskDescriptionEditText = binding.subtaskDescription - val statusDropdown = binding.statusDropdown val deadline = binding.subtaskDeadline val assignedToDropdown = binding.assignedDropdown val addSubTaskButton = binding.addSubtaskButton @@ -126,7 +125,8 @@ class AddSubTaskFragment : Fragment() { val priority = mapPriorityToNumber(priorityText) val deadlineDate = deadline.text.toString() val progress = progressSlider.value.toInt() - val status = statusDropdown.text.toString() + val statusText = binding.statusDropdown.text.toString() + val status = mapStatusToNumber(statusText) val assignedTo = assignedToDropdown.text.toString() val createdBy = mAuth.currentUser?.email @@ -236,4 +236,14 @@ class AddSubTaskFragment : Fragment() { } } + 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/HomeFragment.kt b/app/src/main/java/com/example/taskmanagement/task/HomeFragment.kt index 47c8e69..2517ed6 100644 --- a/app/src/main/java/com/example/taskmanagement/task/HomeFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/HomeFragment.kt @@ -149,7 +149,7 @@ class HomeFragment : Fragment() { } private suspend fun loadTasksForPL() { - fabMain.visibility = View.VISIBLE + fabMain.visibility = View.GONE try { val currentUserEmail = auth.currentUser?.email ?: return @@ -308,6 +308,17 @@ class HomeFragment : 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) @@ -321,24 +332,12 @@ class HomeFragment : Fragment() { val tasksFile = File(context.filesDir, "taskList.json") val taskIdMapFile = File(context.filesDir, "taskIdMap.json") - var deletedFilesCount = 0 if (tasksFile.exists()) { tasksFile.delete() - deletedFilesCount++ } if (taskIdMapFile.exists()) { taskIdMapFile.delete() - deletedFilesCount++ } - - val message = if (deletedFilesCount > 0) { - context.getString(R.string.files_deleted_successfully) - } else { - context.getString(R.string.no_files_to_delete) - } - Toast.makeText(context, message, Toast.LENGTH_SHORT).show() - - Log.d("HomeFragment", "Saved files deleted successfully") } catch (e: Exception) { Toast.makeText( context, 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 80fb941..23e79dd 100644 --- a/app/src/main/java/com/example/taskmanagement/task/ModifySubTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/ModifySubTaskFragment.kt @@ -106,6 +106,7 @@ class ModifySubTaskFragment : Fragment() { setPriorityDropdown(subtask.priority) setStatusDropdown(subtask.status) + loadUsers(binding.assignedDropdown) val datePicker = MaterialDatePicker.Builder.datePicker() @@ -127,8 +128,7 @@ class ModifySubTaskFragment : Fragment() { val progress = binding.progressSlider.value.toInt() val assignedTo = binding.assignedDropdown.text.toString() val priority = getSelectedPriority() - val status = binding.statusDropdown.text.toString() - + val status = getSelectedStatus() if (subtaskName.isNotEmpty() && subtaskDescription.isNotEmpty() && deadline.isNotEmpty() && assignedTo.isNotEmpty()) { val updatedSubtask = SubTask( @@ -193,7 +193,7 @@ class ModifySubTaskFragment : Fragment() { return priorities.indexOf(binding.priorityDropdown.text.toString()).takeIf { it >= 0 } ?: 0 } - private fun setStatusDropdown(status: String) { + private fun setStatusDropdown(status: Int) { val statusOptions = resources.getStringArray(R.array.status_filters).toList() val adapter = ArrayAdapter( requireContext(), @@ -201,13 +201,15 @@ class ModifySubTaskFragment : Fragment() { statusOptions ) binding.statusDropdown.setAdapter(adapter) - if (statusOptions.contains(status)) { - binding.statusDropdown.setText(status, false) - } else { - binding.statusDropdown.setText(statusOptions[0], false) // Default al primo valore + if (status in statusOptions.indices) { + binding.priorityDropdown.setText(statusOptions[status], false) } } + private fun getSelectedStatus(): Int { + val priorities = resources.getStringArray(R.array.status_filters) + return priorities.indexOf(binding.statusDropdown.text.toString()).takeIf { it >= 0 } ?: 0 + } private fun loadUsers(assignedToDropdown: AutoCompleteTextView) { val currentUser = mAuth.currentUser ?: return 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 6b8a4e2..9bf4ec4 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SearchSubFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SearchSubFragment.kt @@ -54,7 +54,7 @@ class SearchSubFragment : Fragment() { } override fun onQueryTextChange(newText: String?): Boolean { - subtaskAdapter.filter(newText) + subtaskAdapter.filter(newText, requireContext()) return true } }) 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 f0a5a8d..d3ebfa2 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SubTask.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SubTask.kt @@ -6,7 +6,7 @@ data class SubTask( val createdBy: String?= "", val assignedTo: String? = null, val deadline: String = "", - val priority: Int = 0, // 1: alta, 2: media, 3: bassa - var status: String = "todo", + val priority: Int = 0, + var status: Int = 0, var progress: Int = 0, ) \ No newline at end of file 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 e6649de..9e241c7 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SubTaskFragment.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SubTaskFragment.kt @@ -160,8 +160,6 @@ class SubTaskFragment : Fragment() { } } - - private fun onEditSubTask(subtask: SubTask) { val subtaskId = subtaskIdMap[subtask] val bundle = Bundle().apply { 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 bc0a071..d205fe6 100644 --- a/app/src/main/java/com/example/taskmanagement/task/SubtaskAdapter.kt +++ b/app/src/main/java/com/example/taskmanagement/task/SubtaskAdapter.kt @@ -1,5 +1,6 @@ package com.example.taskmanagement.task +import android.content.Context import android.util.Log import android.view.LayoutInflater import android.view.View @@ -7,7 +8,6 @@ import android.view.ViewGroup import android.widget.Button import android.widget.TextView import android.widget.Toast -import androidx.core.content.ContextCompat.getString import androidx.recyclerview.widget.RecyclerView import com.example.taskmanagement.R import com.google.firebase.firestore.FirebaseFirestore @@ -41,7 +41,18 @@ class SubtaskAdapter( notifyDataSetChanged() } - fun filter(query: String?) { + fun filter(query: String?, context: Context) { + val statusMap = mapOf( + context.getString(R.string.completed) to 2, + context.getString(R.string.assigned) to 1, + context.getString(R.string.todo) to 0 + ) + val priorityMap = mapOf( + context.getString(R.string.high) to 2, + context.getString(R.string.medium) to 1, + context.getString(R.string.low) to 0 + ) + val filteredList = if (query.isNullOrEmpty()) { originalTaskList } else { @@ -50,11 +61,11 @@ class SubtaskAdapter( query, ignoreCase = true ) || it.deadline.contains(query, ignoreCase = true) - || it.status.contains(query, ignoreCase = true) + || statusMap[query] == it.status + || priorityMap[query] == it.priority + } } - - updateSubTasks(filteredList) } @@ -85,7 +96,12 @@ class SubtaskAdapter( } subtaskDeadline.text = subtask.deadline subtaskDaysRemaining.text = subtask.deadline - subtaskState.text = subtask.status + subtaskState.text = when (subtask.status) { + 0 -> itemView.context.getString(R.string.todo) + 1 -> itemView.context.getString(R.string.assigned) + 2 -> itemView.context.getString(R.string.completed) + else -> itemView.context.getString(R.string.unknown) + } val daysRemaining = calculateDaysRemaining(subtask.deadline) val formattedText = itemView.context.getString(R.string.days_remaining, daysRemaining) subtaskDaysRemaining.text = formattedText @@ -95,7 +111,7 @@ class SubtaskAdapter( } doneButton.setOnClickListener { - if (subtask.status != "completed") { + if (subtask.status != 2) { val subtasksRef = db.collection("tasks") .document(taskId) .collection("subTasks") @@ -106,25 +122,23 @@ class SubtaskAdapter( val subtaskName = document.getString("name") if (subtaskName == subtask.name) { document.reference.update( - "status", - "Completed", - "progress", - 100 + "status", 2, + "progress", 100 ) .addOnSuccessListener { - subtask.status = "Completed" + subtask.status = 2 subtask.progress = 100 notifyItemChanged(adapterPosition) Toast.makeText( itemView.context, - "Completed", + "Subtask completato", Toast.LENGTH_SHORT ).show() } .addOnFailureListener { e -> Toast.makeText( itemView.context, - "Failed to mark as completed: ${e.message}", + "Errore nel completare il subtask: ${e.message}", Toast.LENGTH_SHORT ).show() } @@ -133,26 +147,27 @@ class SubtaskAdapter( } Toast.makeText( itemView.context, - "Subtask not found for the task", + "Subtask non trovato per questa task", Toast.LENGTH_SHORT ).show() } .addOnFailureListener { e -> Toast.makeText( itemView.context, - "Error fetching subtasks: ${e.message}", + "Errore nel recupero dei subtasks: ${e.message}", Toast.LENGTH_SHORT ).show() } } else { Toast.makeText( itemView.context, - "${subtask.name} is already completed", + "Il subtask è già stato completato", Toast.LENGTH_SHORT ).show() } } + deleteButton.setOnClickListener { db.collection("tasks") .document(taskId).collection("subTasks") 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 ecf12f8..eef46ff 100644 --- a/app/src/main/java/com/example/taskmanagement/task/TaskAdapter.kt +++ b/app/src/main/java/com/example/taskmanagement/task/TaskAdapter.kt @@ -56,9 +56,9 @@ class TaskAdapter( query, ignoreCase = true ) == true || it.deadline.contains(query, ignoreCase = true) + } } - updateTasks(filteredList) } @@ -81,7 +81,7 @@ class TaskAdapter( binding.subtaskCount.text = "Sottotask: ${task.nSubTask}" - binding.btnEditTask.setOnClickListener{ + binding.btnEditTask.setOnClickListener { onEditTask(task) } @@ -114,7 +114,10 @@ class TaskAdapter( .addOnFailureListener { e -> Toast.makeText( itemView.context, - itemView.context.getString(R.string.error_deleting_task, e.message), + itemView.context.getString( + R.string.error_deleting_task, + e.message + ), Toast.LENGTH_SHORT ).show() } @@ -155,7 +158,6 @@ class TaskAdapter( } - class TaskDiffCallback( private val oldList: List<Task>, private val newList: List<Task> diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index 3c2f4a9..d270492 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -23,6 +23,7 @@ android:layout_height="120dp" android:layout_centerHorizontal="true" android:layout_marginTop="30dp" + android:contentDescription="@string/user_image" android:src="@drawable/ic_baseline_account_circle_24" android:scaleType="centerCrop" android:background="@drawable/ic_baseline_account_circle_24" /> @@ -34,7 +35,7 @@ android:layout_below="@id/profileImage" android:layout_centerHorizontal="true" android:layout_marginTop="15dp" - android:text="Nome Utente" + android:text="@string/username" android:textColor="@android:color/black" android:textSize="18sp" android:textStyle="bold" /> @@ -67,6 +68,7 @@ <!-- Task List --> <LinearLayout + android:id="@+id/taskListAssigned" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" @@ -75,7 +77,7 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Task Assegnati" + android:text="@string/assigned_tasks" android:textColor="@color/black" android:textSize="18sp" android:textStyle="bold" /> @@ -99,7 +101,7 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Skills" + android:text="@string/skills" android:textColor="@color/black" android:textSize="18sp" android:textStyle="bold" /> @@ -108,7 +110,7 @@ android:id="@+id/skillsList" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="Skill 1, Skill 2, Skill 3" + android:text="@string/skills" android:textColor="@color/black" android:layout_marginTop="8dp" /> </LinearLayout> @@ -122,7 +124,7 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Statistiche" + android:text="@string/statistics" android:textColor="@color/black" android:textSize="18sp" android:textStyle="bold" /> @@ -130,6 +132,7 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" + android:baselineAligned="false" android:orientation="horizontal" android:layout_marginTop="16dp"> @@ -143,14 +146,14 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Progetti Conclusi" + android:text="@string/todo" android:textColor="@color/black" /> <TextView - android:id="@+id/completedProjects" + android:id="@+id/todoSubTask" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="5" + android:text="@string/number" android:textColor="@color/black" android:textSize="18sp" android:textStyle="bold" /> @@ -166,14 +169,14 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Progetti da Iniziare" + android:text="@string/assigned" android:textColor="@color/black" /> <TextView - android:id="@+id/projectsToStart" + android:id="@+id/assignedSubtask" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="3" + android:text="@string/number" android:textColor="@color/black" android:textSize="18sp" android:textStyle="bold" /> @@ -189,14 +192,14 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Tempo Medio" + android:text="@string/complete" android:textColor="@color/black" /> <TextView - android:id="@+id/averageCompletionTime" + android:id="@+id/completedSubtask" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="10 giorni" + android:text="@string/number" android:textColor="@color/black" android:textSize="18sp" android:textStyle="bold" /> @@ -204,6 +207,7 @@ </LinearLayout> </LinearLayout> + <Button android:id="@+id/buttonLogout" 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 ad44aa4..c7cdff0 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -164,4 +164,7 @@ <string name="permission_denied">Permesso negato</string> <string name="image_loading_error">Errore nel caricamento dell\'immagine</string> <string name="logout_success">Logout effettuato</string> + <string name="only_pm_can_edit_tasks">Solo i PM possono modificare i task!</string> + <string name="assigned_tasks">Tasks assegnati</string> + <string name="statistics">Statistiche</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 ab00fd6..aee8c96 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -184,6 +184,10 @@ <string name="permission_denied">Permission denied</string> <string name="image_loading_error">Image error loading</string> <string name="logout_success">Logout success!</string> + <string name="only_pm_can_edit_tasks">Only PM can edit task!</string> + <string name="number" translatable="false">0</string> + <string name="assigned_tasks">Assigned Tasks</string> + <string name="statistics">Statics</string> </resources> \ No newline at end of file -- GitLab