From e9e2ac3d2aa5691d188ab6691f147a335ebf724f Mon Sep 17 00:00:00 2001 From: Borgia Leiva Date: Thu, 12 Feb 2026 11:42:14 +0100 Subject: [PATCH] Moved adapters to their own package and create collaborator item --- .../ui/ProjectCollaboratorAdapter.kt | 41 ------- .../ui/adapters/ProjectCollaboratorAdapter.kt | 101 ++++++++++++++++++ .../ui/{ => adapters}/ProjectItemAdapter.kt | 4 +- app/src/main/res/layout/activity_login.xml | 2 +- app/src/main/res/layout/activity_main.xml | 4 +- app/src/main/res/layout/item_collaborator.xml | 53 +++++++++ 6 files changed, 159 insertions(+), 46 deletions(-) delete mode 100644 app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectCollaboratorAdapter.kt create mode 100644 app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/adapters/ProjectCollaboratorAdapter.kt rename app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/{ => adapters}/ProjectItemAdapter.kt (95%) create mode 100644 app/src/main/res/layout/item_collaborator.xml diff --git a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectCollaboratorAdapter.kt b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectCollaboratorAdapter.kt deleted file mode 100644 index bc3cb26..0000000 --- a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectCollaboratorAdapter.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.campusaula.edbole.kanban_clone_android.ui - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.Button -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import com.campusaula.edbole.kanban_clone_android.kanban.User - -class ProjectCollaboratorAdapter( - private var collaborators: List -) : RecyclerView.Adapter() { - - fun submitList(newList: List) { - collaborators = newList.toMutableList() - notifyDataSetChanged() - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(parent.context).inflate(R.layout.item_collaborator, parent, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(collaborators[position]) - } - - override fun getItemCount(): Int = collaborators.size - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - private val collaboratorNameText: TextView = itemView.findViewById(R.id.collaboratorNameText) - private val removeCollaboratorButton: Button = itemView.findViewById(R.id.removeCollaboratorButton) - - fun bind(collaborator: User) { - collaboratorNameText.text = collaborator.name - - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/adapters/ProjectCollaboratorAdapter.kt b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/adapters/ProjectCollaboratorAdapter.kt new file mode 100644 index 0000000..96dbde5 --- /dev/null +++ b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/adapters/ProjectCollaboratorAdapter.kt @@ -0,0 +1,101 @@ +package com.campusaula.edbole.kanban_clone_android.ui.adapters + +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.TextView +import android.widget.Toast +import androidx.recyclerview.widget.RecyclerView +import com.campusaula.edbole.kanban_clone_android.R +import com.campusaula.edbole.kanban_clone_android.kanban.User +import com.campusaula.edbole.kanban_clone_android.network.ApiService +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class ProjectCollaboratorAdapter( + private var collaborators: List, + private val apiService: ApiService, + private val projectId: Int, + private val onCollaboratorRemoved: () -> Unit = {} +) : RecyclerView.Adapter() { + + private val adapterScope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + + fun submitList(newList: List) { + collaborators = newList.toMutableList() + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_collaborator, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(collaborators[position]) + } + + override fun getItemCount(): Int = collaborators.size + + fun onDestroy() { + adapterScope.cancel("Adapter destroyed") + } + + inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val collaboratorNameText: TextView = itemView.findViewById(R.id.collaboratorNameText) + private val collaboratorEmailText: TextView = itemView.findViewById(R.id.collaboratorEmailText) + private val removeCollaboratorButton: Button = itemView.findViewById(R.id.removeCollaboratorButton) + + fun bind(collaborator: User) { + collaboratorNameText.text = collaborator.name + collaboratorEmailText.text = collaborator.email + + removeCollaboratorButton.setOnClickListener { + adapterScope.launch { + try { + Log.d("ProjectCollaboratorAdapter", "Removing collaborator: ${collaborator.id}") + val response = apiService.removeProjectCollaborator(projectId, collaborator.id) + + if (response.isSuccessful) { + Log.d("ProjectCollaboratorAdapter", "Collaborator removed successfully: ${collaborator.id}") + withContext(Dispatchers.Main) { + Toast.makeText( + itemView.context, + "Collaborator removed: ${collaborator.name}", + Toast.LENGTH_SHORT + ).show() + onCollaboratorRemoved() + } + } else { + val errorBody = response.errorBody()?.string() + Log.e("ProjectCollaboratorAdapter", "Error removing collaborator: $errorBody") + withContext(Dispatchers.Main) { + Toast.makeText( + itemView.context, + "Error removing collaborator: ${response.code()}", + Toast.LENGTH_SHORT + ).show() + } + } + } catch (e: Exception) { + Log.e("ProjectCollaboratorAdapter", "Exception removing collaborator: ${e.message}") + withContext(Dispatchers.Main) { + Toast.makeText( + itemView.context, + "Failed to remove collaborator: ${e.message}", + Toast.LENGTH_SHORT + ).show() + } + } + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectItemAdapter.kt b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/adapters/ProjectItemAdapter.kt similarity index 95% rename from app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectItemAdapter.kt rename to app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/adapters/ProjectItemAdapter.kt index 062b84b..b2b3219 100644 --- a/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/ProjectItemAdapter.kt +++ b/app/src/main/java/com/campusaula/edbole/kanban_clone_android/ui/adapters/ProjectItemAdapter.kt @@ -1,4 +1,4 @@ -package com.campusaula.edbole.kanban_clone_android.ui +package com.campusaula.edbole.kanban_clone_android.ui.adapters import android.view.LayoutInflater import android.view.View @@ -41,4 +41,4 @@ class ProjectItemAdapter( descriptionTextView.text = project.description } } -} +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index ac739f4..cd2fbff 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -55,4 +55,4 @@ app:layout_constraintHorizontal_bias="0.5" app:layout_constraintEnd_toEndOf="parent" style="@style/Widget.Material3.Button.TextButton" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 53dcf01..68a2119 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -35,7 +35,7 @@ @@ -51,4 +51,4 @@ android:layout_marginEnd="16dp" app:layout_constraintEnd_toEndOf="parent" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_collaborator.xml b/app/src/main/res/layout/item_collaborator.xml new file mode 100644 index 0000000..d60058b --- /dev/null +++ b/app/src/main/res/layout/item_collaborator.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + +