Introduce LockDrawerHandle (#360)

* Introduce LockDrawerHandle

* refine

* Ensure SearchBar PredictiveBackHandler is latest when enabled

---------

Co-authored-by: GG Bond <whatever@tagkong.com>
This commit is contained in:
Vladimir DostoyevskiyandGG Bond authored and GitHub committed 2023-11-27 08:08:54 +00:00
1 parent c23cadec8a
commit 10eda7e5f3
9 files changed
+56 -28

No files matched your search

@@ -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)
}
}
}
@@ -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<String>(extraBufferCapacity = 1)
private var intentFlow = MutableSharedFlow<Intent>(extraBufferCapacity = 4)
@@ -313,9 +312,12 @@ class MainActivity : EhActivity() {
onPauseOrDispose { }
}
val currentDestination by navController.currentDestinationAsState()
val lockDrawerHandle = remember { mutableStateListOf<Int>() }
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<DrawerState2> { error("CompositionLocal LocalNavDrawerState not present!") }
val LocalSideSheetState = compositionLocalOf<DrawerState2> { error("CompositionLocal LocalSideSheetState not present!") }
val LocalDrawerLockHandle = compositionLocalOf<SnapshotStateList<Int>> { 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)
}
}
}
}
@@ -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<Long, DownloadInfo>() }
SideEffect {
if (checkedInfoMap.isEmpty()) selectMode = false
@@ -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<Long, BaseGalleryInfo>() }
SideEffect {
if (checkedInfoMap.isEmpty()) selectMode = false
@@ -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()
@@ -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<GalleryTagGroup>.getArtist(): String? {
@Destination
@Composable
fun GalleryDetailScreen(args: GalleryDetailScreenArgs, navigator: DestinationsNavigator) {
LockDrawer(true)
var galleryInfo by rememberSaveable {
val casted = args as? GalleryInfoArgs
mutableStateOf<GalleryInfo?>(casted?.galleryInfo)
@@ -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()
@@ -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) {
@@ -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()
}