From cea524802e56d94c298b40336168290076951931 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 19 Nov 2022 19:05:42 +0100 Subject: [PATCH] Make bottom sheets immune to scrolling Fix #202, #204 --- .../ui/launcher/SharedLauncherActivity.kt | 15 +++++++ .../ui/launcher/search/SearchColumn.kt | 16 +++---- .../ui/launcher/search/apps/AppItem.kt | 14 ++---- .../launcher/search/calendar/CalendarItem.kt | 14 ++---- .../launcher/search/contacts/ContactItem.kt | 15 ++----- .../ui/launcher/search/files/FileItem.kt | 15 ++----- .../launcher/search/hidden/HiddenResults.kt | 44 ------------------- .../launcher/search/shortcut/ShortcutItem.kt | 14 ++---- .../ui/launcher/search/website/WebsiteItem.kt | 15 ++----- .../search/wikipedia/WikipediaItem.kt | 14 ++---- .../launcher/searchbar/LauncherSearchBar.kt | 15 +++---- .../CustomizeSearchableSheet.kt | 2 +- .../CustomizeSearchableSheetVM.kt | 2 +- .../{modals => sheets}/EditFavoritesSheet.kt | 2 +- .../EditFavoritesSheetVM.kt | 2 +- .../{modals => sheets}/HiddenItemsSheet.kt | 2 +- .../{modals => sheets}/HiddenItemsSheetVM.kt | 2 +- .../sheets/LauncherBottomSheetManager.kt | 34 ++++++++++++++ .../widgets/favorites/FavoritesWidget.kt | 13 ++---- .../favorites/FavoritesSettingsScreen.kt | 2 +- 20 files changed, 94 insertions(+), 158 deletions(-) delete mode 100644 ui/src/main/java/de/mm20/launcher2/ui/launcher/search/hidden/HiddenResults.kt rename ui/src/main/java/de/mm20/launcher2/ui/launcher/{search/common/customattrs => sheets}/CustomizeSearchableSheet.kt (99%) rename ui/src/main/java/de/mm20/launcher2/ui/launcher/{search/common/customattrs => sheets}/CustomizeSearchableSheetVM.kt (97%) rename ui/src/main/java/de/mm20/launcher2/ui/launcher/{modals => sheets}/EditFavoritesSheet.kt (99%) rename ui/src/main/java/de/mm20/launcher2/ui/launcher/{modals => sheets}/EditFavoritesSheetVM.kt (99%) rename ui/src/main/java/de/mm20/launcher2/ui/launcher/{modals => sheets}/HiddenItemsSheet.kt (97%) rename ui/src/main/java/de/mm20/launcher2/ui/launcher/{modals => sheets}/HiddenItemsSheetVM.kt (90%) create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/LauncherBottomSheetManager.kt diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt index 46d85928..edeb29c7 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt @@ -42,6 +42,11 @@ import de.mm20.launcher2.ui.base.ProvideCurrentTime import de.mm20.launcher2.ui.base.ProvideSettings import de.mm20.launcher2.ui.component.NavBarEffects import de.mm20.launcher2.ui.ktx.animateTo +import de.mm20.launcher2.ui.launcher.sheets.CustomizeSearchableSheet +import de.mm20.launcher2.ui.launcher.sheets.EditFavoritesSheet +import de.mm20.launcher2.ui.launcher.sheets.HiddenItemsSheet +import de.mm20.launcher2.ui.launcher.sheets.LauncherBottomSheetManager +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.launcher.transitions.HomeTransition import de.mm20.launcher2.ui.launcher.transitions.HomeTransitionManager import de.mm20.launcher2.ui.launcher.transitions.LocalHomeTransitionManager @@ -75,6 +80,8 @@ abstract class SharedLauncherActivity( viewModel.setSystemInDarkMode(resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES) + val bottomSheetManager = LauncherBottomSheetManager() + setContent { val snackbarHostState = remember { SnackbarHostState() } val wallpaperColors by wallpaperColorsAsState() @@ -85,6 +92,7 @@ abstract class SharedLauncherActivity( LocalSnackbarHostState provides snackbarHostState, LocalWallpaperColors provides wallpaperColors, LocalPreferDarkContentOverWallpaper provides (!dimBackground && wallpaperColors.supportsDarkText), + LocalBottomSheetManager provides bottomSheetManager, ) { LauncherTheme { ProvideCurrentTime { @@ -215,6 +223,13 @@ abstract class SharedLauncherActivity( it.icon?.invoke(Offset(dX, dY)) { enterTransitionProgress.value } } } + + bottomSheetManager.customizeSearchableSheetShown.value?.let { + CustomizeSearchableSheet(searchable = it, onDismiss = { bottomSheetManager.dismissCustomizeSearchableModal() }) + } + if (bottomSheetManager.editFavoritesSheetShown.value) { + EditFavoritesSheet(onDismiss = { bottomSheetManager.dismissEditFavoritesSheet() }) + } } } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchColumn.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchColumn.kt index c4504175..96dbbdbf 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchColumn.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchColumn.kt @@ -48,7 +48,6 @@ import de.mm20.launcher2.ui.component.Banner import de.mm20.launcher2.ui.component.LauncherCard import de.mm20.launcher2.ui.component.MissingPermissionBanner import de.mm20.launcher2.ui.component.PartialLauncherCard -import de.mm20.launcher2.ui.launcher.modals.EditFavoritesSheet import de.mm20.launcher2.ui.launcher.search.calculator.CalculatorItem import de.mm20.launcher2.ui.launcher.search.common.grid.GridItem import de.mm20.launcher2.ui.launcher.search.common.list.ListItem @@ -56,6 +55,8 @@ import de.mm20.launcher2.ui.launcher.search.favorites.SearchFavoritesVM import de.mm20.launcher2.ui.launcher.search.unitconverter.UnitConverterItem import de.mm20.launcher2.ui.launcher.search.website.WebsiteItem import de.mm20.launcher2.ui.launcher.search.wikipedia.WikipediaItem +import de.mm20.launcher2.ui.launcher.sheets.HiddenItemsSheet +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.locals.LocalGridSettings import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList @@ -91,6 +92,7 @@ fun SearchColumn( val calculator by viewModel.calculatorResults.observeAsState(emptyList()) val wikipedia by viewModel.wikipediaResults.observeAsState(emptyList()) val website by viewModel.websiteResults.observeAsState(emptyList()) + val hiddenResults by viewModel.hiddenResults.observeAsState(emptyList()) val isSearchEmpty by viewModel.isSearchEmpty.observeAsState(true) @@ -99,8 +101,6 @@ fun SearchColumn( val missingContactsPermission by viewModel.missingContactsPermission.collectAsState(false) val missingFilesPermission by viewModel.missingFilesPermission.collectAsState(false) - var showEditFavoritesDialog by remember { mutableStateOf(false) } - val pinnedTags by favoritesVM.pinnedTags.collectAsState(emptyList()) val selectedTag by favoritesVM.selectedTag.collectAsState(null) val tagsScrollState = rememberScrollState() @@ -178,9 +178,10 @@ fun SearchColumn( } } if (favoritesEditButton) { + val sheetManager = LocalBottomSheetManager.current SmallFloatingActionButton( elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation(), - onClick = { showEditFavoritesDialog = true } + onClick = { sheetManager.showEditFavoritesSheet() } ) { Icon( imageVector = Icons.Rounded.Edit, @@ -359,10 +360,9 @@ fun SearchColumn( ) } - if (showEditFavoritesDialog) { - EditFavoritesSheet( - onDismiss = { showEditFavoritesDialog = false } - ) + val sheetManager = LocalBottomSheetManager.current + if (sheetManager.hiddenItemsSheetShown.value) { + HiddenItemsSheet(items = hiddenResults, onDismiss = { sheetManager.dismissHiddenItemsSheet() }) } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/apps/AppItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/apps/AppItem.kt index 561853dd..61f1f761 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/apps/AppItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/apps/AppItem.kt @@ -28,7 +28,7 @@ import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.* import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.ktx.toPixels -import de.mm20.launcher2.ui.launcher.search.common.customattrs.CustomizeSearchableSheet +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.locals.LocalGridSettings import de.mm20.launcher2.ui.locals.LocalSnackbarHostState @@ -48,8 +48,6 @@ fun AppItem( val lifecycleOwner = LocalLifecycleOwner.current val snackbarHostState = LocalSnackbarHostState.current - var edit by remember { mutableStateOf(false) } - val scope = rememberCoroutineScope() Column( modifier = modifier @@ -228,10 +226,11 @@ fun AppItem( ) ) + val sheetManager = LocalBottomSheetManager.current toolbarActions.add(DefaultToolbarAction( label = stringResource(R.string.menu_customize), icon = Icons.Rounded.Edit, - action = { edit = true } + action = { sheetManager.showCustomizeSearchableModal(app) } )) val storeDetails = remember(app) { app.getStoreDetails(context) } @@ -325,13 +324,6 @@ fun AppItem( rightActions = toolbarActions ) } - - if (edit) { - CustomizeSearchableSheet( - searchable = app, - onDismiss = { edit = false } - ) - } } @Composable diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt index 0995f401..95f67095 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/calendar/CalendarItem.kt @@ -29,7 +29,7 @@ import de.mm20.launcher2.ui.component.DefaultToolbarAction import de.mm20.launcher2.ui.component.Toolbar import de.mm20.launcher2.ui.component.ToolbarAction import de.mm20.launcher2.ui.ktx.toDp -import de.mm20.launcher2.ui.launcher.search.common.customattrs.CustomizeSearchableSheet +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.locals.LocalDarkTheme import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.locals.LocalSnackbarHostState @@ -49,8 +49,6 @@ fun CalendarItem( val lifecycleOwner = LocalLifecycleOwner.current val snackbarHostState = LocalSnackbarHostState.current - var edit by remember { mutableStateOf(false) } - val darkMode = LocalDarkTheme.current Row( @@ -237,10 +235,11 @@ fun CalendarItem( ) ) + val sheetManager = LocalBottomSheetManager.current toolbarActions.add(DefaultToolbarAction( label = stringResource(R.string.menu_customize), icon = Icons.Rounded.Edit, - action = { edit = true } + action = { sheetManager.showCustomizeSearchableModal(calendar) } )) toolbarActions.add(hideAction) @@ -260,13 +259,6 @@ fun CalendarItem( } } } - - if (edit) { - CustomizeSearchableSheet( - searchable = calendar, - onDismiss = { edit = false } - ) - } } @Composable diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/contacts/ContactItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/contacts/ContactItem.kt index 75964483..e8fdc30d 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/contacts/ContactItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/contacts/ContactItem.kt @@ -20,7 +20,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.ExperimentalUnitApi import androidx.compose.ui.unit.dp import androidx.lifecycle.lifecycleScope import de.mm20.launcher2.search.data.Contact @@ -31,7 +30,7 @@ import de.mm20.launcher2.ui.icons.Telegram import de.mm20.launcher2.ui.icons.WhatsApp import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.ktx.toPixels -import de.mm20.launcher2.ui.launcher.search.common.customattrs.CustomizeSearchableSheet +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.locals.LocalGridSettings import de.mm20.launcher2.ui.locals.LocalSnackbarHostState @@ -51,8 +50,6 @@ fun ContactItem( val lifecycleOwner = LocalLifecycleOwner.current val snackbarHostState = LocalSnackbarHostState.current - var edit by remember { mutableStateOf(false) } - val transition = updateTransition(showDetails, label = "ContactItem") Column( @@ -295,10 +292,11 @@ fun ContactItem( ) ) + val sheetManager = LocalBottomSheetManager.current toolbarActions.add(DefaultToolbarAction( label = stringResource(R.string.menu_customize), icon = Icons.Rounded.Edit, - action = { edit = true } + action = { sheetManager.showCustomizeSearchableModal(contact) } )) toolbarActions.add(hideAction) @@ -317,13 +315,6 @@ fun ContactItem( } } } - - if (edit) { - CustomizeSearchableSheet( - searchable = contact, - onDismiss = { edit = false } - ) - } } @Composable diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/files/FileItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/files/FileItem.kt index c0f76bd7..eb2e63dd 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/files/FileItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/files/FileItem.kt @@ -18,7 +18,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.ExperimentalUnitApi import androidx.compose.ui.unit.dp import androidx.lifecycle.lifecycleScope import de.mm20.launcher2.search.data.File @@ -30,7 +29,7 @@ import de.mm20.launcher2.ui.component.Toolbar import de.mm20.launcher2.ui.component.ToolbarAction import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.ktx.toPixels -import de.mm20.launcher2.ui.launcher.search.common.customattrs.CustomizeSearchableSheet +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.locals.LocalGridSettings import de.mm20.launcher2.ui.locals.LocalSnackbarHostState @@ -49,8 +48,6 @@ fun FileItem( val context = LocalContext.current val viewModel = remember(file.key) { FileItemVM(file) } - var edit by remember { mutableStateOf(false) } - val lifecycleOwner = LocalLifecycleOwner.current val snackbarHostState = LocalSnackbarHostState.current @@ -233,10 +230,11 @@ fun FileItem( } } + val sheetManager = LocalBottomSheetManager.current toolbarActions.add(DefaultToolbarAction( label = stringResource(R.string.menu_customize), icon = Icons.Rounded.Edit, - action = { edit = true } + action = { sheetManager.showCustomizeSearchableModal(file) } )) val isHidden by viewModel.isHidden.collectAsState(false) @@ -285,13 +283,6 @@ fun FileItem( } } } - - if (edit) { - CustomizeSearchableSheet( - searchable = file, - onDismiss = { edit = false } - ) - } } @Composable diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/hidden/HiddenResults.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/hidden/HiddenResults.kt deleted file mode 100644 index 94ce8a7c..00000000 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/hidden/HiddenResults.kt +++ /dev/null @@ -1,44 +0,0 @@ -package de.mm20.launcher2.ui.launcher.search.hidden - -import androidx.compose.foundation.layout.* -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.VisibilityOff -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel -import de.mm20.launcher2.ui.launcher.modals.HiddenItemsSheet -import de.mm20.launcher2.ui.launcher.search.SearchVM - -@Composable -fun HiddenResults() { - val viewModel: SearchVM = viewModel() - val hiddenResults by viewModel.hiddenResults.observeAsState( - emptyList() - ) - - var showHiddenItems by remember { mutableStateOf(false) } - - if (hiddenResults.isNotEmpty()) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 8.dp, vertical = 4.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.End - ) { - FloatingActionButton( - elevation = FloatingActionButtonDefaults.loweredElevation(), - onClick = { showHiddenItems = true }) { - Icon(imageVector = Icons.Rounded.VisibilityOff, contentDescription = null) - } - } - } - - if (showHiddenItems) { - HiddenItemsSheet(hiddenResults, onDismiss = {showHiddenItems = false}) - } -} \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/shortcut/ShortcutItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/shortcut/ShortcutItem.kt index d10df221..a4994127 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/shortcut/ShortcutItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/shortcut/ShortcutItem.kt @@ -26,7 +26,7 @@ import de.mm20.launcher2.ui.component.Toolbar import de.mm20.launcher2.ui.component.ToolbarAction import de.mm20.launcher2.ui.ktx.toDp import de.mm20.launcher2.ui.ktx.toPixels -import de.mm20.launcher2.ui.launcher.search.common.customattrs.CustomizeSearchableSheet +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.locals.LocalGridSettings import de.mm20.launcher2.ui.locals.LocalSnackbarHostState @@ -49,7 +49,6 @@ fun AppShortcutItem( val snackbarHostState = LocalSnackbarHostState.current var requestDelete by remember { mutableStateOf(false) } - var edit by remember { mutableStateOf(false) } val transition = updateTransition(showDetails, label = "AppShortcutItem") @@ -146,11 +145,11 @@ fun AppShortcutItem( }) - + val sheetManager = LocalBottomSheetManager.current toolbarActions.add(DefaultToolbarAction( label = stringResource(R.string.menu_customize), icon = Icons.Rounded.Edit, - action = { edit = true } + action = { sheetManager.showCustomizeSearchableModal(shortcut) } )) if (viewModel.canDelete) { @@ -231,13 +230,6 @@ fun AppShortcutItem( } ) } - - if (edit) { - CustomizeSearchableSheet( - searchable = shortcut, - onDismiss = { edit = false } - ) - } } @Composable diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/website/WebsiteItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/website/WebsiteItem.kt index 127dad61..1a5d618f 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/website/WebsiteItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/website/WebsiteItem.kt @@ -2,7 +2,6 @@ package de.mm20.launcher2.ui.launcher.search.website import androidx.compose.animation.* import androidx.compose.animation.core.tween -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -24,7 +23,7 @@ import de.mm20.launcher2.ui.component.Toolbar import de.mm20.launcher2.ui.component.ToolbarAction import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.ktx.toDp -import de.mm20.launcher2.ui.launcher.search.common.customattrs.CustomizeSearchableSheet +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled @Composable @@ -36,8 +35,6 @@ fun WebsiteItem( val context = LocalContext.current val viewModel = remember(website) { WebsiteItemVM(website) } - var edit by remember { mutableStateOf(false) } - Column( modifier = modifier.clickable { viewModel.launch(context) @@ -110,10 +107,11 @@ fun WebsiteItem( ) ) + val sheetManager = LocalBottomSheetManager.current toolbarActions.add(DefaultToolbarAction( label = stringResource(R.string.menu_customize), icon = Icons.Rounded.Edit, - action = { edit = true } + action = { sheetManager.showCustomizeSearchableModal(website) } )) Toolbar( @@ -127,13 +125,6 @@ fun WebsiteItem( rightActions = toolbarActions ) } - - if (edit) { - CustomizeSearchableSheet( - searchable = website, - onDismiss = { edit = false } - ) - } } @Composable diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/wikipedia/WikipediaItem.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/wikipedia/WikipediaItem.kt index 7d21af18..148f161e 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/wikipedia/WikipediaItem.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/wikipedia/WikipediaItem.kt @@ -23,7 +23,7 @@ import de.mm20.launcher2.ui.component.DefaultToolbarAction import de.mm20.launcher2.ui.component.Toolbar import de.mm20.launcher2.ui.component.ToolbarAction import de.mm20.launcher2.ui.ktx.toDp -import de.mm20.launcher2.ui.launcher.search.common.customattrs.CustomizeSearchableSheet +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.utils.htmlToAnnotatedString @@ -36,8 +36,6 @@ fun WikipediaItem( val context = LocalContext.current val viewModel = remember(wikipedia) { WikipediaItemVM(wikipedia) } - var edit by remember { mutableStateOf(false) } - Column( modifier = modifier.clickable { viewModel.launch(context) @@ -117,10 +115,11 @@ fun WikipediaItem( ) ) + val sheetManager = LocalBottomSheetManager.current toolbarActions.add(DefaultToolbarAction( label = stringResource(R.string.menu_customize), icon = Icons.Rounded.Edit, - action = { edit = true } + action = { sheetManager.showCustomizeSearchableModal(wikipedia) } )) Toolbar( @@ -134,13 +133,6 @@ fun WikipediaItem( rightActions = toolbarActions ) } - - if (edit) { - CustomizeSearchableSheet( - searchable = wikipedia, - onDismiss = { edit = false } - ) - } } @Composable diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/LauncherSearchBar.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/LauncherSearchBar.kt index 6f418bd0..7ae4f670 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/LauncherSearchBar.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/searchbar/LauncherSearchBar.kt @@ -24,8 +24,9 @@ import de.mm20.launcher2.preferences.Settings import de.mm20.launcher2.searchactions.actions.SearchAction import de.mm20.launcher2.ui.component.SearchBar import de.mm20.launcher2.ui.component.SearchBarLevel -import de.mm20.launcher2.ui.launcher.modals.HiddenItemsSheet +import de.mm20.launcher2.ui.launcher.sheets.HiddenItemsSheet import de.mm20.launcher2.ui.launcher.search.SearchVM +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager @Composable fun LauncherSearchBar( @@ -44,9 +45,9 @@ fun LauncherSearchBar( val focusManager = LocalFocusManager.current val focusRequester = remember { FocusRequester() } - val searchVM: SearchVM = viewModel() + val sheetManager = LocalBottomSheetManager.current - var showHiddenItemsSheet by remember { mutableStateOf(false) } + val searchVM: SearchVM = viewModel() val hiddenItems by searchVM.hiddenResults.observeAsState(emptyList()) @@ -70,8 +71,8 @@ fun LauncherSearchBar( exit = scaleOut(tween(100)) ) { FilledIconButton( - onClick = { showHiddenItemsSheet = !showHiddenItemsSheet }, - colors = if (showHiddenItemsSheet) IconButtonDefaults.filledTonalIconButtonColors() else IconButtonDefaults.iconButtonColors() + onClick = { sheetManager.showHiddenItemsSheet() }, + colors = if (sheetManager.hiddenItemsSheetShown.value) IconButtonDefaults.filledTonalIconButtonColors() else IconButtonDefaults.iconButtonColors() ) { Icon(imageVector = Icons.Rounded.VisibilityOff, contentDescription = null) } @@ -85,8 +86,4 @@ fun LauncherSearchBar( onFocus = { onFocusChange(true) }, onUnfocus = { onFocusChange(false) }, ) - - if (showHiddenItemsSheet) { - HiddenItemsSheet(hiddenItems, onDismiss = { showHiddenItemsSheet = false }) - } } \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/customattrs/CustomizeSearchableSheet.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheet.kt similarity index 99% rename from ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/customattrs/CustomizeSearchableSheet.kt rename to ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheet.kt index f89585f5..ad6fbc46 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/customattrs/CustomizeSearchableSheet.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheet.kt @@ -1,4 +1,4 @@ -package de.mm20.launcher2.ui.launcher.search.common.customattrs +package de.mm20.launcher2.ui.launcher.sheets import android.graphics.drawable.InsetDrawable import androidx.appcompat.content.res.AppCompatResources diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/customattrs/CustomizeSearchableSheetVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheetVM.kt similarity index 97% rename from ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/customattrs/CustomizeSearchableSheetVM.kt rename to ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheetVM.kt index 0b3190a1..9f72732f 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/customattrs/CustomizeSearchableSheetVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/CustomizeSearchableSheetVM.kt @@ -1,4 +1,4 @@ -package de.mm20.launcher2.ui.launcher.search.common.customattrs +package de.mm20.launcher2.ui.launcher.sheets import androidx.lifecycle.MutableLiveData import androidx.lifecycle.liveData diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/EditFavoritesSheet.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt similarity index 99% rename from ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/EditFavoritesSheet.kt rename to ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt index b242b935..8e7fa5d1 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/EditFavoritesSheet.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheet.kt @@ -1,4 +1,4 @@ -package de.mm20.launcher2.ui.launcher.modals +package de.mm20.launcher2.ui.launcher.sheets import android.app.Activity import android.content.Context diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/EditFavoritesSheetVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheetVM.kt similarity index 99% rename from ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/EditFavoritesSheetVM.kt rename to ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheetVM.kt index c55a2381..bb1e49e2 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/EditFavoritesSheetVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/EditFavoritesSheetVM.kt @@ -1,4 +1,4 @@ -package de.mm20.launcher2.ui.launcher.modals +package de.mm20.launcher2.ui.launcher.sheets import android.content.Context import android.content.Intent diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/HiddenItemsSheet.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheet.kt similarity index 97% rename from ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/HiddenItemsSheet.kt rename to ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheet.kt index 79d62fb9..a68e40dc 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/HiddenItemsSheet.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheet.kt @@ -1,4 +1,4 @@ -package de.mm20.launcher2.ui.launcher.modals +package de.mm20.launcher2.ui.launcher.sheets import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/HiddenItemsSheetVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheetVM.kt similarity index 90% rename from ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/HiddenItemsSheetVM.kt rename to ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheetVM.kt index c2e93b41..1252d371 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/modals/HiddenItemsSheetVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheetVM.kt @@ -1,4 +1,4 @@ -package de.mm20.launcher2.ui.launcher.modals +package de.mm20.launcher2.ui.launcher.sheets import android.content.Context import android.content.Intent diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/LauncherBottomSheetManager.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/LauncherBottomSheetManager.kt new file mode 100644 index 00000000..d618f892 --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/LauncherBottomSheetManager.kt @@ -0,0 +1,34 @@ +package de.mm20.launcher2.ui.launcher.sheets + +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.mutableStateOf +import de.mm20.launcher2.search.SavableSearchable + +class LauncherBottomSheetManager { + val customizeSearchableSheetShown = mutableStateOf(null) + val editFavoritesSheetShown = mutableStateOf(false) + val hiddenItemsSheetShown = mutableStateOf(false) + + fun showCustomizeSearchableModal(item: SavableSearchable) { + customizeSearchableSheetShown.value = item + } + fun dismissCustomizeSearchableModal() { + customizeSearchableSheetShown.value = null + } + + fun showEditFavoritesSheet() { + editFavoritesSheetShown.value = true + } + fun dismissEditFavoritesSheet() { + editFavoritesSheetShown.value = false + } + + fun showHiddenItemsSheet() { + hiddenItemsSheetShown.value = true + } + fun dismissHiddenItemsSheet() { + hiddenItemsSheetShown.value = false + } +} + +val LocalBottomSheetManager = compositionLocalOf { LauncherBottomSheetManager() } \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt index c7528da6..087583c7 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/favorites/FavoritesWidget.kt @@ -14,7 +14,6 @@ import androidx.compose.material.icons.rounded.Tag import androidx.compose.material3.FilterChip import androidx.compose.material3.FloatingActionButtonDefaults import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SmallFloatingActionButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -30,8 +29,8 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.component.Banner -import de.mm20.launcher2.ui.launcher.modals.EditFavoritesSheet import de.mm20.launcher2.ui.launcher.search.common.grid.SearchResultGrid +import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager @Composable fun FavoritesWidget() { @@ -39,7 +38,6 @@ fun FavoritesWidget() { val favorites by remember { viewModel.favorites }.collectAsState(emptyList()) val pinnedTags by viewModel.pinnedTags.collectAsState(emptyList()) val selectedTag by viewModel.selectedTag.collectAsState(null) - var showEditFavoritesDialog by remember { mutableStateOf(false) } val favoritesEditButton by viewModel.showEditButton.collectAsState(false) Column { @@ -100,9 +98,10 @@ fun FavoritesWidget() { } } if (favoritesEditButton) { + val bottomSheetManager = LocalBottomSheetManager.current SmallFloatingActionButton( elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation(), - onClick = { showEditFavoritesDialog = true } + onClick = { bottomSheetManager.showEditFavoritesSheet() } ) { Icon(imageVector = Icons.Rounded.Edit, contentDescription = null) } @@ -110,10 +109,4 @@ fun FavoritesWidget() { } } } - - if (showEditFavoritesDialog) { - EditFavoritesSheet( - onDismiss = { showEditFavoritesDialog = false } - ) - } } \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt index f6f0f852..e2ec82f4 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/favorites/FavoritesSettingsScreen.kt @@ -14,7 +14,7 @@ import de.mm20.launcher2.ui.component.preferences.PreferenceCategory import de.mm20.launcher2.ui.component.preferences.PreferenceScreen import de.mm20.launcher2.ui.component.preferences.SliderPreference import de.mm20.launcher2.ui.component.preferences.SwitchPreference -import de.mm20.launcher2.ui.launcher.modals.EditFavoritesSheet +import de.mm20.launcher2.ui.launcher.sheets.EditFavoritesSheet @Composable fun FavoritesSettingsScreen() {