diff --git a/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModel.kt b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModel.kt index 96eda3613..243f15bc2 100644 --- a/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModel.kt +++ b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModel.kt @@ -44,6 +44,31 @@ class BookmarksViewModel @Inject constructor( var shouldDisplayUndoBookmark by mutableStateOf(false) private var lastRemovedBookmarkId: String? = null + var isInSelectionMode by mutableStateOf(false) + private set + + var selectedIds by mutableStateOf(emptySet()) + private set + + fun enterSelectionMode(initialId: String) { + isInSelectionMode = true + selectedIds = setOf(initialId) + } + + fun exitSelectionMode() { + isInSelectionMode = false + selectedIds = emptySet() + } + + fun toggleSelection(id: String) { + selectedIds = if (id in selectedIds) selectedIds - id else selectedIds + id + } + + fun selectAll() { + val currentFeed = (feedUiState.value as? NewsFeedUiState.Success)?.feed ?: return + selectedIds = currentFeed.map { it.id }.toSet() + } + val feedUiState: StateFlow = userNewsResourceRepository.observeAllBookmarked() .map, NewsFeedUiState>(NewsFeedUiState::Success) diff --git a/feature/bookmarks/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModelTest.kt b/feature/bookmarks/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModelTest.kt index 66ce0744f..43dcc5214 100644 --- a/feature/bookmarks/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModelTest.kt +++ b/feature/bookmarks/impl/src/test/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksViewModelTest.kt @@ -112,6 +112,30 @@ class BookmarksViewModelTest { assertTrue(item.feed.first().hasBeenViewed) } + @Test + fun enterSelectionMode_setsSelectedId() = runTest { + viewModel.enterSelectionMode("news1") + assertTrue(viewModel.isInSelectionMode) + assertEquals(setOf("news1"), viewModel.selectedIds) + } + + @Test + fun toggleSelection_addsAndRemovesId() = runTest { + viewModel.enterSelectionMode("news1") + viewModel.toggleSelection("news2") + assertEquals(setOf("news1", "news2"), viewModel.selectedIds) + viewModel.toggleSelection("news1") + assertEquals(setOf("news2"), viewModel.selectedIds) + } + + @Test + fun exitSelectionMode_clearsState() = runTest { + viewModel.enterSelectionMode("news1") + viewModel.exitSelectionMode() + assertFalse(viewModel.isInSelectionMode) + assertTrue(viewModel.selectedIds.isEmpty()) + } + @Test fun feedUiState_undoneBookmarkRemoval_bookmarkIsRestored() = runTest { backgroundScope.launch(UnconfinedTestDispatcher()) { viewModel.feedUiState.collect() }