From 6b4ef585fb66b3375f18af02a96c035486162675 Mon Sep 17 00:00:00 2001 From: mxhsnd <2049295946@qq.com> Date: Tue, 25 Aug 2026 11:38:54 +0800 Subject: [PATCH] feat(scene): integrate scene navigation host into authenticated MainAppShell --- .../abox/manager/ui/ABoxManagerApp.kt | 4 +++ .../manager/ui/scene/SceneEditorScreen.kt | 4 +-- .../manager/ui/scene/SceneExecutionScreen.kt | 4 +-- .../abox/manager/ui/scene/SceneNavigation.kt | 36 ++++++++++++++++++- domain/build.gradle.kts | 1 + 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/ABoxManagerApp.kt b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/ABoxManagerApp.kt index 9a2dc11..8623c0e 100644 --- a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/ABoxManagerApp.kt +++ b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/ABoxManagerApp.kt @@ -17,6 +17,7 @@ import com.flagship.abox.manager.designsystem.ABoxTheme import com.flagship.abox.manager.ui.login.LoginRoute import com.flagship.abox.manager.ui.login.LoginViewModel import com.flagship.abox.manager.ui.provider.ProviderSelectionRoute +import com.flagship.abox.manager.ui.scene.SceneNavHost import com.flagship.abox.manager.ui.session.AppSessionUiState import com.flagship.abox.manager.ui.session.AppSessionViewModel import com.flagship.abox.manager.ui.session.SessionActionsViewModel @@ -63,6 +64,9 @@ fun ABoxManagerApp( onLogout = sessionActionsViewModel::logout, actionInProgress = actionState.inProgress, errorMessage = actionState.errorMessage, + scenesSlot = { + SceneNavHost() + }, ) } } diff --git a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneEditorScreen.kt b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneEditorScreen.kt index c31cfc3..d2ae3c5 100644 --- a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneEditorScreen.kt +++ b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneEditorScreen.kt @@ -13,7 +13,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.AssistChip import androidx.compose.material3.Button @@ -74,7 +74,7 @@ fun SceneEditorScreen( }, navigationIcon = { IconButton(onClick = onBack) { - Icon(Icons.Filled.ArrowBack, contentDescription = stringResource(R.string.scene_back)) + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.scene_back)) } }, ) diff --git a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneExecutionScreen.kt b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneExecutionScreen.kt index 654a0bf..47ef46c 100644 --- a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneExecutionScreen.kt +++ b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneExecutionScreen.kt @@ -12,7 +12,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Close import androidx.compose.material3.Button @@ -56,7 +56,7 @@ fun SceneExecutionScreen( title = { Text(stringResource(R.string.scene_execution_title)) }, navigationIcon = { IconButton(onClick = onBack) { - Icon(Icons.Filled.ArrowBack, contentDescription = stringResource(R.string.scene_back)) + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.scene_back)) } }, ) diff --git a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneNavigation.kt b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneNavigation.kt index 23cf62e..41d8177 100644 --- a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneNavigation.kt +++ b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneNavigation.kt @@ -1,14 +1,18 @@ package com.flagship.abox.manager.ui.scene import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController import androidx.navigation.NavType +import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import com.flagship.abox.manager.domain.SceneId /** - * Scene navigation routes. [SceneListRoute] is the entry point; the editor and execution routes + * Scene navigation routes. [SceneRoutes.LIST] is the entry point; the editor and execution routes * carry the scene id as a path segment so deep linking works without manual argument parsing. */ object SceneRoutes { @@ -21,6 +25,36 @@ object SceneRoutes { fun executionFor(sceneId: SceneId): String = "scene/execution/${sceneId.value}" } +/** + * Embedded navigation host for the scenes tab in [MainAppShell]. + */ +@Composable +fun SceneNavHost( + modifier: Modifier = Modifier, + navController: NavHostController = rememberNavController(), +) { + NavHost( + navController = navController, + startDestination = SceneRoutes.LIST, + modifier = modifier, + ) { + sceneListDestination( + onAddScene = { navController.navigate(SceneRoutes.EDITOR) }, + onEditScene = { sceneId -> navController.navigate(SceneRoutes.editorFor(sceneId)) }, + onExecuteScene = { sceneId -> navController.navigate(SceneRoutes.executionFor(sceneId)) }, + ) + sceneEditorDestination( + onBack = { navController.popBackStack() }, + onSaved = { + navController.popBackStack(SceneRoutes.LIST, inclusive = false) + }, + ) + sceneExecutionDestination( + onBack = { navController.popBackStack() }, + ) + } +} + fun NavGraphBuilder.sceneListDestination( onAddScene: () -> Unit, onEditScene: (SceneId) -> Unit, diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 695db50..c4865b9 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -11,3 +11,4 @@ dependencies { testImplementation(libs.junit) testImplementation(libs.kotlinx.coroutines.test) } +