Simplify with Fragment.ComposeWithMD3

This commit is contained in:
Lokesh Gidra authored and nullArrayList committed 2023-11-02 16:46:35 +08:00
1 parent dcfaa361ec
commit bea0c6a1f0
7 files changed
+147 -159

No files matched your search

@@ -12,7 +12,7 @@ import com.hippo.ehviewer.ui.tools.LocalDialogState
// To make sure compose theme and legacy view theme are in sync, we only use Mdc3Theme
fun ComposeView.setMD3Content(content: @Composable () -> Unit) = setContent {
inline fun ComposeView.setMD3Content(crossinline content: @Composable () -> Unit) = setContent {
Mdc3Theme {
val dialogState = remember { DialogState() }
dialogState.Intercept()
@@ -22,7 +22,7 @@ fun ComposeView.setMD3Content(content: @Composable () -> Unit) = setContent {
}
}
fun ComponentActivity.setMD3Content(content: @Composable () -> Unit) = setContent {
inline fun ComponentActivity.setMD3Content(crossinline content: @Composable () -> Unit) = setContent {
Mdc3Theme {
val dialogState = remember { DialogState() }
dialogState.Intercept()
@@ -76,7 +76,6 @@ import com.hippo.ehviewer.ui.legacy.FastScroller.OnDragHandlerListener
import com.hippo.ehviewer.ui.legacy.HandlerDrawable
import com.hippo.ehviewer.ui.legacy.ViewTransition
import com.hippo.ehviewer.ui.legacy.WindowInsetsAnimationHelper
import com.hippo.ehviewer.ui.setMD3Content
import com.hippo.ehviewer.ui.tools.DialogState
import com.hippo.ehviewer.util.ExceptionUtils
import com.hippo.ehviewer.util.SimpleHandler
@@ -225,7 +224,7 @@ class FavoritesScene : SearchBarScene() {
savedInstanceState: Bundle?,
): View {
_binding = SceneFavoritesBinding.inflate(inflater, container!!)
container.addView(ComposeWithViewLifecycle().apply { setMD3Content { dialogState.Intercept() } })
container.addView(ComposeWithMD3 { dialogState.Intercept() })
setOnApplySearch {
if (!tracker.isInCustomChoice) {
switchFav(urlBuilder.favCat, it)
@@ -439,35 +438,33 @@ class FavoritesScene : SearchBarScene() {
showNormalFabsJob = null
}
override fun onCreateDrawerView(inflater: LayoutInflater) = ComposeWithViewLifecycle().apply {
setMD3Content {
val localFavCount by vm.localFavCount.collectAsState(0)
ElevatedCard {
TopAppBar(title = { Text(text = stringResource(id = R.string.collections)) })
val scope = currentRecomposeScope
LaunchedEffect(Unit) {
Settings.favChangesFlow.collect {
scope.invalidate()
}
override fun onCreateDrawerView(inflater: LayoutInflater) = ComposeWithMD3 {
val localFavCount by vm.localFavCount.collectAsState(0)
ElevatedCard {
TopAppBar(title = { Text(text = stringResource(id = R.string.collections)) })
val scope = currentRecomposeScope
LaunchedEffect(Unit) {
Settings.favChangesFlow.collect {
scope.invalidate()
}
val localFav = stringResource(id = R.string.local_favorites) to localFavCount
val faves = if (EhCookieStore.hasSignedIn()) {
arrayOf(
localFav,
stringResource(id = R.string.cloud_favorites) to Settings.favCloudCount,
*Settings.favCat.zip(Settings.favCount.toTypedArray()).toTypedArray(),
}
val localFav = stringResource(id = R.string.local_favorites) to localFavCount
val faves = if (EhCookieStore.hasSignedIn()) {
arrayOf(
localFav,
stringResource(id = R.string.cloud_favorites) to Settings.favCloudCount,
*Settings.favCat.zip(Settings.favCount.toTypedArray()).toTypedArray(),
)
} else {
arrayOf(localFav)
}
LazyColumn {
itemsIndexed(faves) { index, (name, count) ->
ListItem(
headlineContent = { Text(text = name) },
trailingContent = { Text(text = count.toString(), style = MaterialTheme.typography.bodyLarge) },
modifier = Modifier.clickable { onItemClick(index) },
)
} else {
arrayOf(localFav)
}
LazyColumn {
itemsIndexed(faves) { index, (name, count) ->
ListItem(
headlineContent = { Text(text = name) },
trailingContent = { Text(text = count.toString(), style = MaterialTheme.typography.bodyLarge) },
modifier = Modifier.clickable { onItemClick(index) },
)
}
}
}
}
@@ -151,7 +151,6 @@ import com.hippo.ehviewer.ui.modifyFavorites
import com.hippo.ehviewer.ui.navToReader
import com.hippo.ehviewer.ui.openBrowser
import com.hippo.ehviewer.ui.scene.GalleryListScene.Companion.toStartArgs
import com.hippo.ehviewer.ui.setMD3Content
import com.hippo.ehviewer.ui.tools.CrystalCard
import com.hippo.ehviewer.ui.tools.DialogState
import com.hippo.ehviewer.ui.tools.FilledTertiaryIconButton
@@ -399,113 +398,111 @@ class GalleryDetailScene : BaseScene() {
getDetailError = getString(R.string.error_cannot_find_gallery)
}
(requireActivity() as MainActivity).mShareUrl = galleryDetailUrl
return ComposeWithViewLifecycle().apply {
setMD3Content {
LaunchedEffect(gid) {
EhDownloadManager.stateFlow(gid).collect {
updateDownloadState()
}
return ComposeWithMD3 {
LaunchedEffect(gid) {
EhDownloadManager.stateFlow(gid).collect {
updateDownloadState()
}
dialogState.Intercept()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
Scaffold(
topBar = {
LargeTopAppBar(
title = {
composeBindingGI?.let {
Text(
text = EhUtils.getSuitableTitle(it),
maxLines = 2,
overflow = TextOverflow.Ellipsis,
)
}
},
navigationIcon = {
IconButton(onClick = {
findNavController().popBackStack()
}) {
Icon(
imageVector = Icons.AutoMirrored.Default.ArrowBack,
contentDescription = null,
)
}
},
scrollBehavior = scrollBehavior,
actions = {
IconButton(onClick = ::showArchiveDialog) {
Icon(
imageVector = Icons.Default.FolderZip,
contentDescription = null,
)
}
IconButton(onClick = ::doShareGallery) {
Icon(
imageVector = Icons.Default.Share,
contentDescription = null,
)
}
var dropdown by remember { mutableStateOf(false) }
IconButton(onClick = { dropdown = !dropdown }) {
Icon(
imageVector = Icons.Default.MoreVert,
contentDescription = null,
)
}
DropdownMenu(
expanded = dropdown,
onDismissRequest = { dropdown = false },
) {
DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_add_tag)) },
onClick = {
dropdown = false
actionAddTag()
},
)
DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.refresh)) },
onClick = {
dropdown = false
actionRefresh()
},
)
DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.clear_image_cache)) },
onClick = {
dropdown = false
actionClearCache()
},
)
DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.open_in_other_app)) },
onClick = {
dropdown = false
actionOpenInOtherApp()
},
)
}
},
)
},
) {
Surface {
val gi = composeBindingGI
if (gi != null) {
GalleryDetailContent(
galleryInfo = gi,
galleryDetail = composeBindingGD,
contentPadding = it,
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
)
} else if (getDetailError.isNotBlank()) {
GalleryDetailErrorTip(error = getDetailError, onClick = ::actionRefresh)
} else {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
CircularProgressIndicator()
}
dialogState.Intercept()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
Scaffold(
topBar = {
LargeTopAppBar(
title = {
composeBindingGI?.let {
Text(
text = EhUtils.getSuitableTitle(it),
maxLines = 2,
overflow = TextOverflow.Ellipsis,
)
}
},
navigationIcon = {
IconButton(onClick = {
findNavController().popBackStack()
}) {
Icon(
imageVector = Icons.AutoMirrored.Default.ArrowBack,
contentDescription = null,
)
}
},
scrollBehavior = scrollBehavior,
actions = {
IconButton(onClick = ::showArchiveDialog) {
Icon(
imageVector = Icons.Default.FolderZip,
contentDescription = null,
)
}
IconButton(onClick = ::doShareGallery) {
Icon(
imageVector = Icons.Default.Share,
contentDescription = null,
)
}
var dropdown by remember { mutableStateOf(false) }
IconButton(onClick = { dropdown = !dropdown }) {
Icon(
imageVector = Icons.Default.MoreVert,
contentDescription = null,
)
}
DropdownMenu(
expanded = dropdown,
onDismissRequest = { dropdown = false },
) {
DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_add_tag)) },
onClick = {
dropdown = false
actionAddTag()
},
)
DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.refresh)) },
onClick = {
dropdown = false
actionRefresh()
},
)
DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.clear_image_cache)) },
onClick = {
dropdown = false
actionClearCache()
},
)
DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.open_in_other_app)) },
onClick = {
dropdown = false
actionOpenInOtherApp()
},
)
}
},
)
},
) {
Surface {
val gi = composeBindingGI
if (gi != null) {
GalleryDetailContent(
galleryInfo = gi,
galleryDetail = composeBindingGD,
contentPadding = it,
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
)
} else if (getDetailError.isNotBlank()) {
GalleryDetailErrorTip(error = getDetailError, onClick = ::actionRefresh)
} else {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
CircularProgressIndicator()
}
}
}
@@ -92,7 +92,6 @@ import com.hippo.ehviewer.ui.legacy.HandlerDrawable
import com.hippo.ehviewer.ui.legacy.LayoutManagerUtils.firstVisibleItemPosition
import com.hippo.ehviewer.ui.legacy.ViewTransition
import com.hippo.ehviewer.ui.legacy.WindowInsetsAnimationHelper
import com.hippo.ehviewer.ui.setMD3Content
import com.hippo.ehviewer.ui.settings.showNewVersion
import com.hippo.ehviewer.ui.tools.DialogState
import com.hippo.ehviewer.updater.AppUpdater
@@ -321,7 +320,7 @@ class GalleryListScene : SearchBarScene() {
savedInstanceState: Bundle?,
): View {
_binding = SceneGalleryListBinding.inflate(inflater, container!!)
container.addView(ComposeWithViewLifecycle().apply { setMD3Content { dialogState.Intercept() } })
container.addView(ComposeWithMD3 { dialogState.Intercept() })
checkForUpdates()
requireActivity().onBackPressedDispatcher.addCallback(stateBackPressedCallback)
mHideActionFabSlop = ViewConfiguration.get(requireContext()).scaledTouchSlop
@@ -17,6 +17,7 @@ package com.hippo.ehviewer.ui.scene
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
@@ -52,7 +53,7 @@ import androidx.compose.ui.unit.dp
import androidx.core.os.bundleOf
import androidx.lifecycle.viewModelScope
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.cachedIn
@@ -67,7 +68,6 @@ import com.hippo.ehviewer.icons.big.History
import com.hippo.ehviewer.ui.MainActivity
import com.hippo.ehviewer.ui.doGalleryInfoAction
import com.hippo.ehviewer.ui.main.GalleryInfoListItem
import com.hippo.ehviewer.ui.setMD3Content
import com.hippo.ehviewer.ui.tools.CrystalCard
import com.hippo.ehviewer.ui.tools.Deferred
import com.hippo.ehviewer.ui.tools.FastScrollLazyColumn
@@ -203,8 +203,8 @@ class HistoryFragment : BaseScene() {
// Disabled for breaking swipe-to-dismiss
override val enableDrawerGestures = false
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) = ComposeWithViewLifecycle().apply {
setMD3Content {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return ComposeWithMD3 {
val navController = remember { findNavController() }
HistoryScreen(navController)
}
@@ -26,12 +26,11 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.os.bundleOf
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
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.setMD3Content
import com.hippo.ehviewer.util.ExceptionUtils
import com.ramcosta.composedestinations.annotation.Destination
import eu.kanade.tachiyomi.util.lang.withUIContext
@@ -93,14 +92,12 @@ fun ProgressScreen(gid: Long, token: String, page: Int, navigator: NavController
class ProgressFragment : BaseScene() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return ComposeWithViewLifecycle().apply {
setMD3Content {
val gid = remember { requireArguments().getLong(KEY_GID, -1) }
val token = remember { requireArguments().getString(KEY_PTOKEN, INVALID) }
val page = remember { requireArguments().getInt(KEY_PAGE, -1) }
val navController = remember { findNavController() }
ProgressScreen(gid, token, page, navController)
}
return ComposeWithMD3 {
val gid = remember { requireArguments().getLong(KEY_GID, -1) }
val token = remember { requireArguments().getString(KEY_PTOKEN, INVALID) }
val page = remember { requireArguments().getInt(KEY_PAGE, -1) }
val navController = remember { findNavController() }
ProgressScreen(gid, token, page, navController)
}
}
@@ -1,15 +1,13 @@
package com.hippo.ehviewer.ui.scene
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.fragment.app.Fragment
import com.hippo.ehviewer.ui.setMD3Content
/**
* compose view with fragment view lifecycle
* use it after [Fragment.onCreateView]
* also @see [Fragment.getViewLifecycleOwner]
*/
@Suppress("FunctionName")
fun Fragment.ComposeWithViewLifecycle() = ComposeView(requireContext()).apply {
inline fun Fragment.ComposeWithMD3(crossinline content: @Composable () -> Unit) = ComposeView(requireContext()).apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnLifecycleDestroyed(viewLifecycleOwner))
setMD3Content(content)
}