diff --git a/app/src/main/kotlin/androidx/compose/material3/SearchBar2.kt b/app/src/main/kotlin/androidx/compose/material3/SearchBar2.kt index 56e6a5df0..e8fb3e38c 100644 --- a/app/src/main/kotlin/androidx/compose/material3/SearchBar2.kt +++ b/app/src/main/kotlin/androidx/compose/material3/SearchBar2.kt @@ -325,24 +325,26 @@ fun SearchBar( ) } val mutatorMutex = remember { MutatorMutex() } - PredictiveBackHandler(enabled = active) { progress -> - mutatorMutex.mutate { - var canceled = false - try { - progress.collect { backEvent -> - if (firstBackEvent == null) { - firstBackEvent = backEvent + if (active) { + PredictiveBackHandler(true) { progress -> + mutatorMutex.mutate { + var canceled = false + try { + progress.collect { backEvent -> + if (firstBackEvent == null) { + firstBackEvent = backEvent + } + currentBackEvent = backEvent + val interpolatedProgress = EaseOut.transform(backEvent.progress) + animationProgress.snapTo(targetValue = 1 - interpolatedProgress) } - currentBackEvent = backEvent - val interpolatedProgress = EaseOut.transform(backEvent.progress) - animationProgress.snapTo(targetValue = 1 - interpolatedProgress) + } catch (e: CancellationException) { + canceled = true + } finally { + firstBackEvent = null + currentBackEvent = null + onActiveChange(canceled) } - } catch (e: CancellationException) { - canceled = true - } finally { - firstBackEvent = null - currentBackEvent = null - onActiveChange(canceled) } } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt index fe186d549..5f61a785d 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt @@ -70,13 +70,13 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.currentCompositeKeyHash import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberUpdatedState -import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalConfiguration @@ -189,7 +189,6 @@ class MainActivity : EhActivity() { intentFlow.tryEmit(intent) } - var drawerLocked by mutableStateOf(false) private var tipFlow = MutableSharedFlow(extraBufferCapacity = 1) private var intentFlow = MutableSharedFlow(extraBufferCapacity = 4) @@ -313,9 +312,12 @@ class MainActivity : EhActivity() { onPauseOrDispose { } } val currentDestination by navController.currentDestinationAsState() + val lockDrawerHandle = remember { mutableStateListOf() } + val drawerLocked = lockDrawerHandle.isNotEmpty() CompositionLocalProvider( LocalNavDrawerState provides navDrawerState, LocalSideSheetState provides sideSheetState, + LocalDrawerLockHandle provides lockDrawerHandle, ) { Scaffold(snackbarHost = { SnackbarHost(snackbarState) }) { LocalTouchSlopProvider(Settings.touchSlopFactor.toFloat()) { @@ -485,3 +487,19 @@ class MainActivity : EhActivity() { val LocalNavDrawerState = compositionLocalOf { error("CompositionLocal LocalNavDrawerState not present!") } val LocalSideSheetState = compositionLocalOf { error("CompositionLocal LocalSideSheetState not present!") } +val LocalDrawerLockHandle = compositionLocalOf> { error("CompositionLocal LocalSideSheetState not present!") } + +@Composable +fun LockDrawer(value: Boolean) { + val updated by rememberUpdatedState(value) + if (updated) { + val current = currentCompositeKeyHash + val handle = LocalDrawerLockHandle.current + DisposableEffect(current) { + handle.add(current) + onDispose { + handle.remove(current) + } + } + } +} diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/DownloadsFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/DownloadsFragment.kt index 101200e0f..db18b4fcd 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/DownloadsFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/DownloadsFragment.kt @@ -77,6 +77,7 @@ import com.hippo.ehviewer.download.DownloadService import com.hippo.ehviewer.icons.EhIcons import com.hippo.ehviewer.icons.big.Download import com.hippo.ehviewer.ui.LocalSideSheetState +import com.hippo.ehviewer.ui.LockDrawer import com.hippo.ehviewer.ui.MainActivity import com.hippo.ehviewer.ui.confirmRemoveDownloadRange import com.hippo.ehviewer.ui.destinations.GalleryDetailScreenDestination @@ -113,6 +114,7 @@ fun DownloadsScreen(navigator: DestinationsNavigator) { var searchBarOffsetY by remember { mutableStateOf(0) } val searchFieldState = rememberTextFieldState() var selectMode by remember { mutableStateOf(false) } + LockDrawer(selectMode) val checkedInfoMap = remember { mutableStateMapOf() } SideEffect { if (checkedInfoMap.isEmpty()) selectMode = false diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesFragment.kt index ebf9d59ee..5ff91ce44 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesFragment.kt @@ -70,6 +70,7 @@ import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.icons.EhIcons import com.hippo.ehviewer.icons.filled.GoTo import com.hippo.ehviewer.ui.LocalSideSheetState +import com.hippo.ehviewer.ui.LockDrawer import com.hippo.ehviewer.ui.MainActivity import com.hippo.ehviewer.ui.destinations.GalleryDetailScreenDestination import com.hippo.ehviewer.ui.main.FabLayout @@ -224,6 +225,7 @@ fun FavouritesScreen(navigator: DestinationsNavigator) { var expanded by remember { mutableStateOf(false) } var hidden by remember { mutableStateOf(false) } var selectMode by remember { mutableStateOf(false) } + LockDrawer(selectMode) val checkedInfoMap = remember { mutableStateMapOf() } SideEffect { if (checkedInfoMap.isEmpty()) selectMode = false diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryCommentsFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryCommentsFragment.kt index e92f6f622..dfc3800d7 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryCommentsFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryCommentsFragment.kt @@ -84,6 +84,7 @@ import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.client.data.ListUrlBuilder import com.hippo.ehviewer.dao.Filter import com.hippo.ehviewer.dao.FilterMode +import com.hippo.ehviewer.ui.LockDrawer import com.hippo.ehviewer.ui.MainActivity import com.hippo.ehviewer.ui.destinations.GalleryListScreenDestination import com.hippo.ehviewer.ui.jumpToReaderByPage @@ -152,6 +153,7 @@ private val MinimumContentPaddingEditText = 88.dp @Destination @Composable fun GalleryCommentsScreen(galleryDetail: GalleryDetail, navigator: DestinationsNavigator) { + LockDrawer(true) val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val dialogState = LocalDialogState.current val coroutineScope = rememberCoroutineScope() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailFragment.kt index a3a3dbf32..0999ea6c3 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailFragment.kt @@ -119,6 +119,7 @@ import com.hippo.ehviewer.ktbuilder.imageRequest import com.hippo.ehviewer.spider.SpiderQueen import com.hippo.ehviewer.spider.SpiderQueen.Companion.MODE_READ import com.hippo.ehviewer.ui.GalleryInfoBottomSheet +import com.hippo.ehviewer.ui.LockDrawer import com.hippo.ehviewer.ui.MainActivity import com.hippo.ehviewer.ui.confirmRemoveDownload import com.hippo.ehviewer.ui.destinations.GalleryCommentsScreenDestination @@ -215,6 +216,7 @@ private fun List.getArtist(): String? { @Destination @Composable fun GalleryDetailScreen(args: GalleryDetailScreenArgs, navigator: DestinationsNavigator) { + LockDrawer(true) var galleryInfo by rememberSaveable { val casted = args as? GalleryInfoArgs mutableStateOf(casted?.galleryInfo) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryPreviewFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryPreviewFragment.kt index f580f3361..fd5ad64bf 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryPreviewFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryPreviewFragment.kt @@ -49,6 +49,7 @@ import com.hippo.ehviewer.client.data.GalleryPreview import com.hippo.ehviewer.coil.justDownload import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.ktbuilder.imageRequest +import com.hippo.ehviewer.ui.LockDrawer import com.hippo.ehviewer.ui.main.EhPreviewItem import com.hippo.ehviewer.ui.navToReader import com.hippo.ehviewer.ui.tools.FastScrollLazyVerticalGrid @@ -61,6 +62,7 @@ import moe.tarsin.coroutines.runSuspendCatching @Destination @Composable fun GalleryPreviewScreen(galleryDetail: GalleryDetail, toNextPageArg: Boolean, navigator: NavController) { + LockDrawer(true) val context = LocalContext.current fun onPreviewClick(index: Int) = context.navToReader(galleryDetail.galleryInfo, index) val scrollBehaviour = TopAppBarDefaults.pinnedScrollBehavior() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ProgressFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ProgressFragment.kt index 2345dbdcb..ff64ebcdf 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ProgressFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ProgressFragment.kt @@ -23,6 +23,7 @@ import com.hippo.ehviewer.R import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.icons.EhIcons import com.hippo.ehviewer.icons.big.SadAndroid +import com.hippo.ehviewer.ui.LockDrawer import com.hippo.ehviewer.ui.destinations.GalleryDetailScreenDestination import com.hippo.ehviewer.util.ExceptionUtils import com.ramcosta.composedestinations.annotation.Destination @@ -33,6 +34,7 @@ import moe.tarsin.coroutines.runSuspendCatching @Destination @Composable fun ProgressScreen(gid: Long, token: String, page: Int, navigator: DestinationsNavigator) { + LockDrawer(true) val wrong = stringResource(id = R.string.error_something_wrong_happened) var error by rememberSaveable { mutableStateOf("") } LaunchedEffect(error) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/SearchBarScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/SearchBarScene.kt index 928c148f4..61334758f 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/SearchBarScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/SearchBarScene.kt @@ -73,6 +73,7 @@ import com.hippo.ehviewer.client.EhTagDatabase import com.hippo.ehviewer.dao.Search import com.hippo.ehviewer.dao.SearchDao import com.hippo.ehviewer.ui.LocalNavDrawerState +import com.hippo.ehviewer.ui.LockDrawer import com.hippo.ehviewer.ui.MainActivity import com.hippo.ehviewer.ui.main.FAB_ANIMATE_TIME import com.hippo.ehviewer.ui.tools.LocalDialogState @@ -184,21 +185,16 @@ fun SearchBarScreen( mSuggestionList = mergedSuggestionFlow().toList() } - var drawerLocked by remember { mutableStateOf(false) } + var shouldLockDrawer by remember { mutableStateOf(false) } + LockDrawer(shouldLockDrawer) fun onSearchViewExpanded() { onSearchExpanded() - if (!activity.drawerLocked) { - drawerLocked = true - activity.drawerLocked = true - } + shouldLockDrawer = true } fun onSearchViewHidden() { - if (drawerLocked) { - activity.drawerLocked = false - drawerLocked = false - } + shouldLockDrawer = false onSearchHidden() }