diff --git a/app/src/main/java/com/clemhaowen/dm_td2/network/TasksRepository.kt b/app/src/main/java/com/clemhaowen/dm_td2/network/TasksRepository.kt index e07443025e676b850163ce70d98d9fd07afdb08f..5ae8a5329bbaa22017cdec6ef974e18d22e0f213 100644 --- a/app/src/main/java/com/clemhaowen/dm_td2/network/TasksRepository.kt +++ b/app/src/main/java/com/clemhaowen/dm_td2/network/TasksRepository.kt @@ -11,12 +11,12 @@ class TasksRepository { // Ces deux variables encapsulent la même donnée: // [_taskList] est modifiable mais privée donc inaccessible à l'extérieur de cette classe - private val _taskList = MutableLiveData<List<Task>>() + //private val _taskList = MutableLiveData<List<Task>>() // [taskList] est publique mais non-modifiable: // On pourra seulement l'observer (s'y abonner) depuis d'autres classes - public val taskList: LiveData<List<Task>> = _taskList + //public val taskList: LiveData<List<Task>> = _taskList - suspend fun refresh() { + /*suspend fun refresh() { // Call HTTP (opération longue): val tasksResponse = tasksWebService.getTasks() // À la ligne suivante, on a reçu la réponse de l'API: @@ -47,8 +47,6 @@ class TasksRepository { } suspend fun updateTask(task: Task) { - // TODO: do update request and check response - // DONE val taskResponse = tasksWebService.updateTask(task, task.id) if (taskResponse.isSuccessful){ val editableList = _taskList.value.orEmpty().toMutableList() @@ -57,5 +55,29 @@ class TasksRepository { editableList[position] = updatedTask!! _taskList.value = editableList } + }*/ + + + // Refactoring + suspend fun loadTasks() : List<Task>? { + // Call HTTP (opération longue): + val tasksResponse = tasksWebService.getTasks() + // À la ligne suivante, on a reçu la réponse de l'API: + return if (tasksResponse.isSuccessful) tasksResponse.body() else null + } + + suspend fun deleteTask(task : Task) { + val taskResponse = tasksWebService.deleteTask(id = task.id) + // return taskResponse.isSuccessful // ??? + } + + suspend fun addTask(task: Task){ + val taskResponse = tasksWebService.createTask(task) + // return taskResponse.isSuccessful // ??? + } + + suspend fun updateTask(task: Task) { + val taskResponse = tasksWebService.updateTask(task, task.id) + // return taskResponse.isSuccessful // ??? } } \ No newline at end of file diff --git a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskAdapter.kt b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskAdapter.kt index 94e8069fa3c75ff33800e97a18ed9453f98d43fb..e0b6a3e7c1663a4b0a35e7d627c2145c67eb63b1 100644 --- a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskAdapter.kt +++ b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskAdapter.kt @@ -9,8 +9,9 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.clemhaowen.dm_td2.R -class TaskListAdapter(/*private val*/var taskList: List<Task>) : RecyclerView.Adapter<TaskListAdapter.TaskViewHolder>() { +class TaskListAdapter(var taskList: List<Task> = emptyList()) : RecyclerView.Adapter<TaskListAdapter.TaskViewHolder>() { + //var list : List<Task> = emptyList() var onDeleteClickListener: ((Task) -> Unit)? = null var onEditClickListener: ((Task) -> Unit)? = null diff --git a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListFragment.kt b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListFragment.kt index 0267a206e3fc6800cab8733dc15043efda98cced..b46cf70d186f4945d13d76e01033f6addc8a047c 100644 --- a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListFragment.kt @@ -7,7 +7,9 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.lifecycle.observe import androidx.recyclerview.widget.LinearLayoutManager @@ -27,14 +29,21 @@ import java.util.* class TaskListFragment : Fragment() { //private var taskList = mutableListOf("Task 1", "Task 2", "Task 3") - // TODO uncomment when Task is implemented - private val taskList = mutableListOf( + + /*private val taskList = mutableListOf( Task(id = "id_1", title = "Task 1", description = "description 1"), Task(id = "id_2", title = "Task 2"), Task(id = "id_3", title = "Task 3") - ) + )*/ + + // Refactoring + val taskListAdapter = TaskListAdapter() + + // On récupère une instance de ViewModel + private val viewModel: TaskListViewModel by viewModels() - private val tasksRepository = TasksRepository() + // TODO delete this line when refactoring is done. + //private val tasksRepository = TasksRepository() companion object { const val ADD_TASK_REQUEST_CODE = 666 @@ -55,15 +64,14 @@ class TaskListFragment : Fragment() { // En utilisant les synthetics, on écrit juste l'id directement (c'est magique ✨): //R.id.fragment_tasklist_recyclerView.layoutManager = LinearLayoutManager(activity) // ça marche pas - // TODO uncomment when TaskListAdapter is created - // DONE - recyclerView?.adapter = TaskListAdapter(taskList) + recyclerView?.adapter = taskListAdapter //TaskListAdapter(taskList) (recyclerView?.adapter as TaskListAdapter).onDeleteClickListener = { task -> // Supprimer la tâche //taskList.remove(task) //(recyclerView?.adapter as TaskListAdapter).notifyDataSetChanged() lifecycleScope.launch { - tasksRepository.deleteTask(task) + //tasksRepository.deleteTask(task) + viewModel.deleteTask(task) } } @@ -71,15 +79,29 @@ class TaskListFragment : Fragment() { val intent = Intent(activity, TaskActivity::class.java) intent.putExtra("editTask", task) startActivityForResult(intent, EDIT_TASK_REQUEST_CODE) + /*val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ + + } + startForResult.launch(intent)*/ (recyclerView?.adapter as TaskListAdapter).notifyDataSetChanged() } - tasksRepository.taskList.observe(viewLifecycleOwner, androidx.lifecycle.Observer { + // TODO comment this when refactoring is done. + /*tasksRepository.taskList.observe(viewLifecycleOwner, androidx.lifecycle.Observer { val editableList = (recyclerView?.adapter as TaskListAdapter).taskList.toMutableList() editableList.clear() editableList.addAll(it) (recyclerView?.adapter as TaskListAdapter).taskList = editableList (recyclerView?.adapter as TaskListAdapter).notifyDataSetChanged() + })*/ + + // TODO uncomment this when refactoring is done. + viewModel.taskList.observe(viewLifecycleOwner, androidx.lifecycle.Observer { newList -> + val editableList = (recyclerView?.adapter as TaskListAdapter).taskList.toMutableList() + editableList.clear() + editableList.addAll(newList) + (recyclerView?.adapter as TaskListAdapter).taskList = newList + (recyclerView?.adapter as TaskListAdapter).notifyDataSetChanged() }) val createButton = view.findViewById<FloatingActionButton>(R.id.floatingActionButton) @@ -102,10 +124,12 @@ class TaskListFragment : Fragment() { val task = data!!.getSerializableExtra(TaskActivity.TASK_KEY) as Task lifecycleScope.launch { if (requestCode == ADD_TASK_REQUEST_CODE) { - tasksRepository.addTask(task) + //tasksRepository.addTask(task) + viewModel.addTask(task) } else if (requestCode == EDIT_TASK_REQUEST_CODE){ - tasksRepository.updateTask(task) + //tasksRepository.updateTask(task) + viewModel.editTask(task) } } //taskList.add(task) @@ -118,14 +142,16 @@ class TaskListFragment : Fragment() { crossfade(true) transformations(CircleCropTransformation()) } - /*lifecycleScope.launch { - tasksRepository.refresh() - }*/ lifecycleScope.launch { val userInfo = Api.userService.getInfo().body()!! val textView = view?.findViewById<TextView>(R.id.textViewInfo) textView?.text = "${userInfo.firstName} ${userInfo.lastName}" - tasksRepository.refresh() + + // TODO comment this when refactoring is done. + //tasksRepository.refresh() + + // TODO uncomment this when refactoring is done. + viewModel.loadTasks() } } } \ No newline at end of file diff --git a/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListViewModel.kt b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..c47b275e936627282a12978f146be9dfb2d34fe7 --- /dev/null +++ b/app/src/main/java/com/clemhaowen/dm_td2/tasklist/TaskListViewModel.kt @@ -0,0 +1,46 @@ +package com.clemhaowen.dm_td2.tasklist + +import androidx.lifecycle.* +import com.clemhaowen.dm_td2.network.TasksRepository +import kotlinx.coroutines.launch + +class TaskListViewModel : ViewModel() { + private val repository = TasksRepository() + private val _taskList = MutableLiveData<List<Task>>() + val taskList: LiveData<List<Task>> = _taskList + + fun loadTasks() { + viewModelScope.launch { + _taskList.value = repository.loadTasks()!! + } + } + + fun deleteTask(task: Task) { + viewModelScope.launch { + repository.deleteTask(task) + } + val editableList = _taskList.value.orEmpty().toMutableList() + val position = editableList.indexOfFirst { task.id == it.id } + editableList.removeAt(position) + _taskList.value = editableList + } + + fun addTask(task: Task) { + viewModelScope.launch { + repository.addTask(task) + } + val editableList = _taskList.value.orEmpty().toMutableList() + editableList.add(task) + _taskList.value = editableList + } + + fun editTask(task: Task) { + viewModelScope.launch { + repository.updateTask(task) + } + val editableList = _taskList.value.orEmpty().toMutableList() + val position = editableList.indexOfFirst { task.id == it.id } + editableList[position] = task + _taskList.value = editableList + } +} \ No newline at end of file