From ca8682dffed24ca21e6f006b1f6209251ba6016c Mon Sep 17 00:00:00 2001 From: Rohit Karadkar Date: Tue, 9 Jun 2026 11:43:38 +0530 Subject: [PATCH] refactor: replace selection TopAppBar with bottom action bar (cancel, count, all, remove) Co-Authored-By: Claude --- .../feature/bookmarks/impl/BookmarksScreen.kt | 58 +++++++++++-------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksScreen.kt b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksScreen.kt index bdf602d0b..fe2f7adcb 100644 --- a/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksScreen.kt +++ b/feature/bookmarks/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/bookmarks/impl/BookmarksScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets @@ -43,15 +44,15 @@ import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan import androidx.compose.foundation.lazy.staggeredgrid.items import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.Checkbox -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton -import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -146,7 +147,6 @@ internal fun BookmarksScreen( /** * Displays the user's bookmarked articles. Includes support for loading and empty states. */ -@OptIn(ExperimentalMaterial3Api::class) @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) @Composable internal fun BookmarksScreen( @@ -208,20 +208,6 @@ internal fun BookmarksScreen( clearUndoState() } - if (isInSelectionMode) { - TopAppBar( - title = { Text("${selectedIds.size} selected") }, - navigationIcon = { - IconButton(onClick = exitSelectionMode) { - Icon(NiaIcons.Close, contentDescription = "Cancel selection") - } - }, - actions = { - TextButton(onClick = selectAll) { Text("Select all") } - }, - ) - } - Box(modifier = modifier.fillMaxSize()) { when (feedState) { Loading -> LoadingState() @@ -242,17 +228,39 @@ internal fun BookmarksScreen( } } - if (isInSelectionMode && selectedIds.isNotEmpty()) { - Button( - onClick = { - removedCount.intValue = selectedIds.size - removeSelected() - }, + if (isInSelectionMode) { + Surface( + tonalElevation = 3.dp, + shadowElevation = 6.dp, + shape = RoundedCornerShape(28.dp), modifier = Modifier .align(Alignment.BottomCenter) - .padding(16.dp), + .padding(horizontal = 16.dp, vertical = 16.dp) + .fillMaxWidth(), ) { - Text("Remove (${selectedIds.size})") + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier.padding(horizontal = 4.dp, vertical = 4.dp), + ) { + IconButton(onClick = exitSelectionMode) { + Icon(NiaIcons.Close, contentDescription = "Cancel selection") + } + Text( + text = "${selectedIds.size} selected", + style = MaterialTheme.typography.labelLarge, + ) + TextButton(onClick = selectAll) { Text("All") } + Button( + onClick = { + removedCount.intValue = selectedIds.size + removeSelected() + }, + enabled = selectedIds.isNotEmpty(), + ) { + Text("Remove") + } + } } } }