From 35a421472da3b9bfe066bde2bb2e83021dcaa3e8 Mon Sep 17 00:00:00 2001 From: FatttSnake Date: Wed, 14 Aug 2024 17:18:18 +0800 Subject: [PATCH] Refactor(ToolView): Optimize preview code logic --- .../top/fatweb/oxygen/toolbox/MainActivity.kt | 4 +++- .../toolbox/navigation/ToolStoreNavigation.kt | 2 +- .../toolbox/navigation/ToolViewNavigation.kt | 14 +++++++++----- .../oxygen/toolbox/navigation/ToolsNavigation.kt | 2 +- .../oxygen/toolbox/ui/tool/ToolStoreScreen.kt | 6 +++--- .../toolbox/ui/tool/ToolViewScreenViewModel.kt | 8 +++++++- .../fatweb/oxygen/toolbox/ui/tool/ToolsScreen.kt | 8 ++++---- 7 files changed, 28 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/MainActivity.kt b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/MainActivity.kt index 72bbd4c..3b8e61f 100644 --- a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/MainActivity.kt +++ b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/MainActivity.kt @@ -37,6 +37,7 @@ import top.fatweb.oxygen.toolbox.model.userdata.LaunchPageConfig import top.fatweb.oxygen.toolbox.model.userdata.ThemeBrandConfig import top.fatweb.oxygen.toolbox.monitor.NetworkMonitor import top.fatweb.oxygen.toolbox.monitor.TimeZoneMonitor +import top.fatweb.oxygen.toolbox.navigation.PREVIEW_ARG import top.fatweb.oxygen.toolbox.navigation.navigateToToolView import top.fatweb.oxygen.toolbox.repository.userdata.UserDataRepository import top.fatweb.oxygen.toolbox.ui.OxygenApp @@ -122,8 +123,9 @@ class MainActivity : ComponentActivity() { LaunchedEffect(intent.data) { intent.data?.run { val pathSegments = pathSegments + val preview = getBooleanQueryParameter(PREVIEW_ARG, false) if (pathSegments.size == 2) { - appState.navController.navigateToToolView(pathSegments[0], pathSegments[1]) + appState.navController.navigateToToolView(pathSegments[0], pathSegments[1], preview) } } } diff --git a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolStoreNavigation.kt b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolStoreNavigation.kt index 9a31366..28c4cc4 100644 --- a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolStoreNavigation.kt +++ b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolStoreNavigation.kt @@ -11,7 +11,7 @@ const val TOOL_STORE_ROUTE = "tool_store_route" fun NavController.navigateToToolStore(navOptions: NavOptions? = null) = navigate(TOOL_STORE_ROUTE, navOptions) fun NavGraphBuilder.toolStoreScreen( - onNavigateToToolView: (username: String, toolId: String) -> Unit + onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit ) { composable( route = TOOL_STORE_ROUTE diff --git a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolViewNavigation.kt b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolViewNavigation.kt index 6d5fea5..18893bf 100644 --- a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolViewNavigation.kt +++ b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolViewNavigation.kt @@ -16,9 +16,10 @@ private val URL_CHARACTER_ENCODING = UTF_8.name() internal const val USER_NAME_ARG = "username" internal const val TOOL_ID_ARG = "toolId" +internal const val PREVIEW_ARG = "preview" const val TOOL_VIEW_ROUTE = "tool_view_route" -internal class ToolViewArgs(val username: String, val toolId: String) { +internal class ToolViewArgs(val username: String, val toolId: String, val preview: Boolean) { constructor(savedStateHandle: SavedStateHandle) : this( URLDecoder.decode( @@ -28,18 +29,20 @@ internal class ToolViewArgs(val username: String, val toolId: String) { URLDecoder.decode( checkNotNull(savedStateHandle[TOOL_ID_ARG]), URL_CHARACTER_ENCODING - ) + ), + checkNotNull(savedStateHandle[PREVIEW_ARG]) ) } fun NavController.navigateToToolView( username: String, toolId: String, + preview: Boolean, navOptions: NavOptionsBuilder.() -> Unit = {} ) { val encodedUsername = URLEncoder.encode(username, URL_CHARACTER_ENCODING) val encodedToolId = URLEncoder.encode(toolId, URL_CHARACTER_ENCODING) - val newRoute = "$TOOL_VIEW_ROUTE/$encodedUsername/$encodedToolId" + val newRoute = "$TOOL_VIEW_ROUTE/$encodedUsername/$encodedToolId?$PREVIEW_ARG=$preview" navigate(newRoute) { navOptions() } @@ -49,10 +52,11 @@ fun NavGraphBuilder.toolViewScreen( onBackClick: () -> Unit ) { composable( - route = "${TOOL_VIEW_ROUTE}/{$USER_NAME_ARG}/{$TOOL_ID_ARG}", + route = "${TOOL_VIEW_ROUTE}/{$USER_NAME_ARG}/{$TOOL_ID_ARG}?$PREVIEW_ARG={$PREVIEW_ARG}", arguments = listOf( navArgument(USER_NAME_ARG) { type = NavType.StringType }, - navArgument(TOOL_ID_ARG) { type = NavType.StringType } + navArgument(TOOL_ID_ARG) { type = NavType.StringType }, + navArgument(PREVIEW_ARG) { type = NavType.BoolType; defaultValue = false } ) ) { ToolViewRoute( diff --git a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolsNavigation.kt b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolsNavigation.kt index 646b240..5f8f0ec 100644 --- a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolsNavigation.kt +++ b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/navigation/ToolsNavigation.kt @@ -12,7 +12,7 @@ fun NavController.navigateToTools(navOptions: NavOptions) = navigate(TOOLS_ROUTE fun NavGraphBuilder.toolsScreen( onShowSnackbar: suspend (message: String, action: String?) -> Boolean, - onNavigateToToolView: (username: String, toolId: String) -> Unit, + onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit, onNavigateToToolStore: () -> Unit ) { composable( diff --git a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolStoreScreen.kt b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolStoreScreen.kt index 3059fcc..af92da7 100644 --- a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolStoreScreen.kt +++ b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolStoreScreen.kt @@ -64,7 +64,7 @@ import top.fatweb.oxygen.toolbox.ui.component.scrollbar.scrollbarState internal fun ToolStoreRoute( modifier: Modifier = Modifier, viewModel: ToolStoreViewModel = hiltViewModel(), - onNavigateToToolView: (username: String, toolId: String) -> Unit, + onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit, ) { val toolStorePagingItems = viewModel.storeData.collectAsLazyPagingItems() val installInfo by viewModel.installInfo.collectAsState() @@ -85,7 +85,7 @@ internal fun ToolStoreRoute( @Composable internal fun ToolStoreScreen( modifier: Modifier = Modifier, - onNavigateToToolView: (username: String, toolId: String) -> Unit, + onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit, toolStorePagingItems: LazyPagingItems, onChangeInstallStatus: (status: ToolStoreUiState.InstallInfo.Status) -> Unit, onChangeInstallType: (type: ToolStoreUiState.InstallInfo.Type) -> Unit, @@ -125,7 +125,7 @@ internal fun ToolStoreScreen( onChangeInstallType(installType) }, onClick = { - onNavigateToToolView(it.authorUsername, it.toolId) + onNavigateToToolView(it.authorUsername, it.toolId, it.upgrade != null) } ) diff --git a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolViewScreenViewModel.kt b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolViewScreenViewModel.kt index eefefd3..11b11ff 100644 --- a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolViewScreenViewModel.kt +++ b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolViewScreenViewModel.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.stateIn import top.fatweb.oxygen.toolbox.model.Result import top.fatweb.oxygen.toolbox.navigation.ToolViewArgs @@ -32,11 +33,14 @@ class ToolViewScreenViewModel @Inject constructor( private val toolViewArgs = ToolViewArgs(savedStateHandle) private val username = toolViewArgs.username private val toolId = toolViewArgs.toolId + private val preview = toolViewArgs.preview + val toolViewUiState: StateFlow = toolViewUiState( savedStateHandle = savedStateHandle, username = username, toolId = toolId, + preview = preview, storeRepository = storeRepository, toolRepository = toolRepository ) @@ -51,11 +55,13 @@ private fun toolViewUiState( savedStateHandle: SavedStateHandle, username: String, toolId: String, + preview: Boolean, storeRepository: StoreRepository, toolRepository: ToolRepository ): Flow { val toolViewTemplate = toolRepository.toolViewTemplate - val entityFlow = toolRepository.getToolByUsernameAndToolId(username, toolId) + val entityFlow = + if (!preview) toolRepository.getToolByUsernameAndToolId(username, toolId) else flowOf(null) return flow { combine(entityFlow, toolViewTemplate, ::Pair).collect { (entityFlow, toolViewTemplate) -> diff --git a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolsScreen.kt b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolsScreen.kt index 18207d8..bf11140 100644 --- a/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolsScreen.kt +++ b/app/src/main/kotlin/top/fatweb/oxygen/toolbox/ui/tool/ToolsScreen.kt @@ -68,7 +68,7 @@ internal fun ToolsRoute( modifier: Modifier = Modifier, viewModel: ToolsScreenViewModel = hiltViewModel(), onShowSnackbar: suspend (message: String, action: String?) -> Boolean, - onNavigateToToolView: (username: String, toolId: String) -> Unit, + onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit, onNavigateToToolStore: () -> Unit ) { val toolsScreenUiStateState by viewModel.toolsScreenUiState.collectAsStateWithLifecycle() @@ -88,7 +88,7 @@ internal fun ToolsRoute( internal fun ToolsScreen( modifier: Modifier = Modifier, onShowSnackbar: suspend (message: String, action: String?) -> Boolean, - onNavigateToToolView: (username: String, toolId: String) -> Unit, + onNavigateToToolView: (username: String, toolId: String, preview: Boolean) -> Unit, onNavigateToToolStore: () -> Unit, toolsScreenUiState: ToolsScreenUiState, onUninstall: (ToolEntity) -> Unit, @@ -208,7 +208,7 @@ internal fun ToolsScreen( private fun LazyStaggeredGridScope.toolsPanel( toolItems: List, - onClick: (username: String, toolId: String) -> Unit, + onClick: (username: String, toolId: String, preview: Boolean) -> Unit, onLongClick: (ToolEntity) -> Unit ) { items( @@ -216,7 +216,7 @@ private fun LazyStaggeredGridScope.toolsPanel( key = { it.id }, ) { ToolCard(tool = it, - onClick = { onClick(it.authorUsername, it.toolId) }, + onClick = { onClick(it.authorUsername, it.toolId, false) }, onLongClick = { onLongClick(it) }) } }