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:
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()
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user