From 11f14d999ddb0419a5f232dae7176ab6b6ab045f Mon Sep 17 00:00:00 2001 From: Saad Khan Date: Sat, 23 May 2026 15:41:39 +0500 Subject: [PATCH 1/2] Fix clear completed tasks being undone by immediate refresh. The tasks list already updates via Room Flow after clearing completed tasks. Calling refresh() immediately reloads stale network data before saveTasksToNetwork() finishes, which can restore deleted tasks. --- .../architecture/blueprints/todoapp/tasks/TasksViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModel.kt b/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModel.kt index f95b2d273..72469a3c1 100644 --- a/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModel.kt +++ b/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModel.kt @@ -107,7 +107,6 @@ class TasksViewModel @Inject constructor( viewModelScope.launch { taskRepository.clearCompletedTasks() showSnackbarMessage(R.string.completed_tasks_cleared) - refresh() } } From a76293f4e8b3327a171eb97f70124d6ab0f60638 Mon Sep 17 00:00:00 2001 From: Saad Khan Date: Sat, 23 May 2026 15:41:39 +0500 Subject: [PATCH 2/2] Make clearCompletedTasks test wait for settled uiState. Use uiState.first { !it.isLoading } instead of first() to avoid inspecting stale StateFlow values. --- .../blueprints/todoapp/tasks/TasksViewModelTest.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/test/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModelTest.kt b/app/src/test/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModelTest.kt index 97cc75c08..e0b17508a 100644 --- a/app/src/test/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModelTest.kt +++ b/app/src/test/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksViewModelTest.kt @@ -144,12 +144,11 @@ class TasksViewModelTest { // When completed tasks are cleared tasksViewModel.clearCompletedTasks() - // Fetch tasks - tasksViewModel.refresh() + advanceUntilIdle() - // Fetch tasks - val allTasks = tasksViewModel.uiState.first().items - val completedTasks = allTasks?.filter { it.isCompleted } + val uiState = tasksViewModel.uiState.first { !it.isLoading } + val allTasks = uiState.items + val completedTasks = allTasks.filter { it.isCompleted } // Verify there are no completed tasks left assertThat(completedTasks).isEmpty() @@ -158,8 +157,7 @@ class TasksViewModelTest { assertThat(allTasks).hasSize(1) // Verify snackbar is updated - assertThat(tasksViewModel.uiState.first().userMessage) - .isEqualTo(R.string.completed_tasks_cleared) + assertThat(uiState.userMessage).isEqualTo(R.string.completed_tasks_cleared) } @Test