refactor: extract main navigation

This commit is contained in:
二刺螈
2026-08-04 20:18:34 +08:00
parent 5d032c7a70
commit 5eb7c684d2
2 changed files with 114 additions and 103 deletions

View File

@@ -8,9 +8,6 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.compose.animation.slideInHorizontally
import androidx.compose.animation.slideOutHorizontally
import androidx.compose.animation.togetherWith
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Text
@@ -29,10 +26,6 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsAnimationCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import com.dylanc.activityresult.launcher.PickContentLauncher
import com.dylanc.activityresult.launcher.StartActivityLauncher
import com.dylanc.activityresult.launcher.launchForResult
@@ -57,61 +50,12 @@ import li.songe.gkd.service.StatusService
import li.songe.gkd.service.fixRestartAutomatorService
import li.songe.gkd.service.updateTopTaskAppId
import li.songe.gkd.store.storeFlow
import li.songe.gkd.ui.A11YScopeAppListRoute
import li.songe.gkd.ui.A11yEventLogPage
import li.songe.gkd.ui.A11yEventLogRoute
import li.songe.gkd.ui.A11yScopeAppListPage
import li.songe.gkd.ui.AboutPage
import li.songe.gkd.ui.AboutRoute
import li.songe.gkd.ui.ActionLogPage
import li.songe.gkd.ui.ActionLogRoute
import li.songe.gkd.ui.ActivityLogPage
import li.songe.gkd.ui.ActivityLogRoute
import li.songe.gkd.ui.AdvancedPage
import li.songe.gkd.ui.AdvancedPageRoute
import li.songe.gkd.ui.AppConfigPage
import li.songe.gkd.ui.AppConfigRoute
import li.songe.gkd.ui.AppOpsAllowPage
import li.songe.gkd.ui.AppOpsAllowRoute
import li.songe.gkd.ui.AuthA11yPage
import li.songe.gkd.ui.AuthA11yRoute
import li.songe.gkd.ui.BlockA11yAppListPage
import li.songe.gkd.ui.BlockA11yAppListRoute
import li.songe.gkd.ui.CrashReportPage
import li.songe.gkd.ui.CrashReportRoute
import li.songe.gkd.ui.EditBlockAppListPage
import li.songe.gkd.ui.EditBlockAppListRoute
import li.songe.gkd.ui.ImagePreviewPage
import li.songe.gkd.ui.ImagePreviewRoute
import li.songe.gkd.ui.PrivilegePage
import li.songe.gkd.ui.PrivilegePageRoute
import li.songe.gkd.ui.SlowGroupPage
import li.songe.gkd.ui.SlowGroupRoute
import li.songe.gkd.ui.SnapshotPage
import li.songe.gkd.ui.SnapshotPageRoute
import li.songe.gkd.ui.SubsAppGroupListPage
import li.songe.gkd.ui.SubsAppGroupListRoute
import li.songe.gkd.ui.SubsAppListPage
import li.songe.gkd.ui.SubsAppListRoute
import li.songe.gkd.ui.SubsCategoryGroupPage
import li.songe.gkd.ui.SubsCategoryGroupRoute
import li.songe.gkd.ui.SubsCategoryPage
import li.songe.gkd.ui.SubsCategoryRoute
import li.songe.gkd.ui.SubsGlobalGroupExcludePage
import li.songe.gkd.ui.SubsGlobalGroupExcludeRoute
import li.songe.gkd.ui.SubsGlobalGroupListPage
import li.songe.gkd.ui.SubsGlobalGroupListRoute
import li.songe.gkd.ui.UpsertRuleGroupPage
import li.songe.gkd.ui.UpsertRuleGroupRoute
import li.songe.gkd.ui.WebViewPage
import li.songe.gkd.ui.WebViewRoute
import li.songe.gkd.ui.component.BuildDialog
import li.songe.gkd.ui.component.ShareLogDlg
import li.songe.gkd.ui.component.SubsSheet
import li.songe.gkd.ui.component.TermsAcceptDialog
import li.songe.gkd.ui.component.TextDialog
import li.songe.gkd.ui.home.HomePage
import li.songe.gkd.ui.home.HomeRoute
import li.songe.gkd.ui.share.FixedWindowInsets
import li.songe.gkd.ui.share.LocalMainViewModel
import li.songe.gkd.ui.style.AppTheme
@@ -241,53 +185,7 @@ class MainActivity : ComponentActivity() {
LocalMainViewModel provides mainVm
) {
AppTheme {
NavDisplay(
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator(),
),
backStack = mainVm.backStack,
onBack = mainVm::popPage,
entryProvider = entryProvider {
entry<HomeRoute> { HomePage() }
entry<AuthA11yRoute> { AuthA11yPage() }
entry<AboutRoute> { AboutPage() }
entry<BlockA11yAppListRoute> { BlockA11yAppListPage() }
entry<AdvancedPageRoute> { AdvancedPage() }
entry<PrivilegePageRoute> { PrivilegePage() }
entry<SnapshotPageRoute> { SnapshotPage() }
entry<AppOpsAllowRoute> { AppOpsAllowPage() }
entry<A11YScopeAppListRoute> { A11yScopeAppListPage() }
entry<ActivityLogRoute> { ActivityLogPage() }
entry<A11yEventLogRoute> { A11yEventLogPage() }
entry<EditBlockAppListRoute> { EditBlockAppListPage() }
entry<SlowGroupRoute> { SlowGroupPage() }
entry<SubsAppListRoute> { SubsAppListPage(it) }
entry<WebViewRoute> { WebViewPage(it) }
entry<SubsCategoryRoute> { SubsCategoryPage(it) }
entry<SubsGlobalGroupListRoute> { SubsGlobalGroupListPage(it) }
entry<SubsGlobalGroupExcludeRoute> { SubsGlobalGroupExcludePage(it) }
entry<ActionLogRoute> { ActionLogPage(it) }
entry<ImagePreviewRoute> { ImagePreviewPage(it) }
entry<UpsertRuleGroupRoute> { UpsertRuleGroupPage(it) }
entry<SubsAppGroupListRoute> { SubsAppGroupListPage(it) }
entry<AppConfigRoute> { AppConfigPage(it) }
entry<CrashReportRoute> { CrashReportPage() }
entry<SubsCategoryGroupRoute> { SubsCategoryGroupPage(it) }
},
transitionSpec = {
slideInHorizontally(initialOffsetX = { it }) togetherWith
slideOutHorizontally(targetOffsetX = { -it })
},
popTransitionSpec = {
slideInHorizontally(initialOffsetX = { -it }) togetherWith
slideOutHorizontally(targetOffsetX = { it })
},
predictivePopTransitionSpec = {
slideInHorizontally(initialOffsetX = { -it }) togetherWith
slideOutHorizontally(targetOffsetX = { it })
},
)
MainNavigation(mainVm)
if (!mainVm.termsAcceptedFlow.collectAsState().value) {
TermsAcceptDialog()
} else {

View File

@@ -0,0 +1,113 @@
package li.songe.gkd
import androidx.compose.animation.slideInHorizontally
import androidx.compose.animation.slideOutHorizontally
import androidx.compose.animation.togetherWith
import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import li.songe.gkd.ui.A11YScopeAppListRoute
import li.songe.gkd.ui.A11yEventLogPage
import li.songe.gkd.ui.A11yEventLogRoute
import li.songe.gkd.ui.A11yScopeAppListPage
import li.songe.gkd.ui.AboutPage
import li.songe.gkd.ui.AboutRoute
import li.songe.gkd.ui.ActionLogPage
import li.songe.gkd.ui.ActionLogRoute
import li.songe.gkd.ui.ActivityLogPage
import li.songe.gkd.ui.ActivityLogRoute
import li.songe.gkd.ui.AdvancedPage
import li.songe.gkd.ui.AdvancedPageRoute
import li.songe.gkd.ui.AppConfigPage
import li.songe.gkd.ui.AppConfigRoute
import li.songe.gkd.ui.AppOpsAllowPage
import li.songe.gkd.ui.AppOpsAllowRoute
import li.songe.gkd.ui.AuthA11yPage
import li.songe.gkd.ui.AuthA11yRoute
import li.songe.gkd.ui.BlockA11yAppListPage
import li.songe.gkd.ui.BlockA11yAppListRoute
import li.songe.gkd.ui.CrashReportPage
import li.songe.gkd.ui.CrashReportRoute
import li.songe.gkd.ui.EditBlockAppListPage
import li.songe.gkd.ui.EditBlockAppListRoute
import li.songe.gkd.ui.ImagePreviewPage
import li.songe.gkd.ui.ImagePreviewRoute
import li.songe.gkd.ui.PrivilegePage
import li.songe.gkd.ui.PrivilegePageRoute
import li.songe.gkd.ui.SlowGroupPage
import li.songe.gkd.ui.SlowGroupRoute
import li.songe.gkd.ui.SnapshotPage
import li.songe.gkd.ui.SnapshotPageRoute
import li.songe.gkd.ui.SubsAppGroupListPage
import li.songe.gkd.ui.SubsAppGroupListRoute
import li.songe.gkd.ui.SubsAppListPage
import li.songe.gkd.ui.SubsAppListRoute
import li.songe.gkd.ui.SubsCategoryGroupPage
import li.songe.gkd.ui.SubsCategoryGroupRoute
import li.songe.gkd.ui.SubsCategoryPage
import li.songe.gkd.ui.SubsCategoryRoute
import li.songe.gkd.ui.SubsGlobalGroupExcludePage
import li.songe.gkd.ui.SubsGlobalGroupExcludeRoute
import li.songe.gkd.ui.SubsGlobalGroupListPage
import li.songe.gkd.ui.SubsGlobalGroupListRoute
import li.songe.gkd.ui.UpsertRuleGroupPage
import li.songe.gkd.ui.UpsertRuleGroupRoute
import li.songe.gkd.ui.WebViewPage
import li.songe.gkd.ui.WebViewRoute
import li.songe.gkd.ui.home.HomePage
import li.songe.gkd.ui.home.HomeRoute
private val mainRouteEntryProvider = entryProvider {
entry<HomeRoute> { HomePage() }
entry<AuthA11yRoute> { AuthA11yPage() }
entry<AboutRoute> { AboutPage() }
entry<BlockA11yAppListRoute> { BlockA11yAppListPage() }
entry<AdvancedPageRoute> { AdvancedPage() }
entry<PrivilegePageRoute> { PrivilegePage() }
entry<SnapshotPageRoute> { SnapshotPage() }
entry<AppOpsAllowRoute> { AppOpsAllowPage() }
entry<A11YScopeAppListRoute> { A11yScopeAppListPage() }
entry<ActivityLogRoute> { ActivityLogPage() }
entry<A11yEventLogRoute> { A11yEventLogPage() }
entry<EditBlockAppListRoute> { EditBlockAppListPage() }
entry<SlowGroupRoute> { SlowGroupPage() }
entry<SubsAppListRoute> { SubsAppListPage(it) }
entry<WebViewRoute> { WebViewPage(it) }
entry<SubsCategoryRoute> { SubsCategoryPage(it) }
entry<SubsGlobalGroupListRoute> { SubsGlobalGroupListPage(it) }
entry<SubsGlobalGroupExcludeRoute> { SubsGlobalGroupExcludePage(it) }
entry<ActionLogRoute> { ActionLogPage(it) }
entry<ImagePreviewRoute> { ImagePreviewPage(it) }
entry<UpsertRuleGroupRoute> { UpsertRuleGroupPage(it) }
entry<SubsAppGroupListRoute> { SubsAppGroupListPage(it) }
entry<AppConfigRoute> { AppConfigPage(it) }
entry<CrashReportRoute> { CrashReportPage() }
entry<SubsCategoryGroupRoute> { SubsCategoryGroupPage(it) }
}
@Composable
fun MainNavigation(mainVm: MainViewModel) {
NavDisplay(
entryDecorators = listOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator(),
),
backStack = mainVm.backStack,
onBack = mainVm::popPage,
entryProvider = mainRouteEntryProvider,
transitionSpec = {
slideInHorizontally(initialOffsetX = { it }) togetherWith
slideOutHorizontally(targetOffsetX = { -it })
},
popTransitionSpec = {
slideInHorizontally(initialOffsetX = { -it }) togetherWith
slideOutHorizontally(targetOffsetX = { it })
},
predictivePopTransitionSpec = {
slideInHorizontally(initialOffsetX = { -it }) togetherWith
slideOutHorizontally(targetOffsetX = { it })
},
)
}