rebuild the authenticated shell, device dashboard, device detail pages, scenes, activity timeline, account sheet, and settings experience
redesign infrared remote management and controls, including custom remotes, learn-state handling, slot isolation, and safe default content
add persisted theme controls with internal accent, color-style, and color-standard resolution while keeping dynamic color authoritative
add ABox profile defaults for the three exact gateway device names, editable starter scenes, and custom infrared remotes
persist real activity events for device commands, infrared actions, and scene execution
stabilize navigation and back behavior, including duplicate top-back protection and removal of the unfinished predictive-back option
update launcher icons and bilingual application name
Verification
:android:app:assembleDebug
installed the debug APK on emulator-5554
manually exercised device detail navigation, settings/theme navigation, infrared management, activity records, and repeated back actions
## Summary
- rebuild the authenticated shell, device dashboard, device detail pages, scenes, activity timeline, account sheet, and settings experience
- redesign infrared remote management and controls, including custom remotes, learn-state handling, slot isolation, and safe default content
- add persisted theme controls with internal accent, color-style, and color-standard resolution while keeping dynamic color authoritative
- add ABox profile defaults for the three exact gateway device names, editable starter scenes, and custom infrared remotes
- persist real activity events for device commands, infrared actions, and scene execution
- stabilize navigation and back behavior, including duplicate top-back protection and removal of the unfinished predictive-back option
- update launcher icons and bilingual application name
## Verification
- `:android:app:assembleDebug`
- installed the debug APK on `emulator-5554`
- manually exercised device detail navigation, settings/theme navigation, infrared management, activity records, and repeated back actions
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Verification
:android:app:assembleDebugemulator-5554Inline comment
@@ -314,5 +314,5 @@) {val activeBackStackEntry by navController.currentBackStackEntryAsState()val activeRoute = activeBackStackEntry?.actualRoute()var backNavigationInFlight by remember { mutableStateOf(false) }LaunchedEffect(activeRoute) {返回锁死
backNavigationInFlight只在activeRoute字符串变化时重置。快速双击同一场景或设备使相同路由连续入栈后,第一次返回仍会落在相同路由,LaunchedEffect不会重新执行,导致该页面后续的顶部返回操作全部失效。应根据返回栈条目身份重置,或在弹栈完成后可靠地清除锁定状态。Inline comment
@@ -134,4 +111,0 @@onAddAutomatic = { navController.navigate(SceneRoutes.EDITOR_AUTOMATIC) },onEditScene = { sceneId -> navController.navigate(SceneRoutes.editorFor(sceneId)) },onExecuteScene = { sceneId -> navController.navigate(SceneRoutes.executionFor(sceneId)) },)设置不可达
账户弹窗是当前可见代码中唯一会打开设置界面的入口,但它始终调用
showTheme(returnToHome = false)。用户会直接进入主题详情,返回时又关闭整个设置层,因此设置首页中的渲染器、触感等选项无法访问。常规设置入口应先调用showHome(),或允许主题详情返回设置首页。Inline comment
@@ -80,4 +84,2 @@username = state.username,profile = state.profile,actionInProgress = actionState.inProgress,errorMessage = actionState.errorMessage,错误丢失
认证态不再接收或展示
actionState.errorMessage和inProgress,而账户操作会先关闭弹窗再发起切换提供方、结束会话或忘记凭据。若网络或存储操作失败且会话仍保持认证态,错误只被传给登录页,当前界面不会提供任何失败反馈或重试提示。PR Reviewer Guide 🔍
Here are some key observations to aid the review process:
⚠️ Review coverage: The following files were not included in this review because of the token budget:
android/app/src/main/kotlin/com/flagship/abox/manager/ui/devicecenter/DeviceCenterViewModel.ktandroid/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/navigation/AuthenticatedNavigationRoutingTest.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/ui/defaults/ABoxDefaultContentInitializer.ktandroid/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/preferences/SettingsScreenTest.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/SceneEditorViewModel.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/ui/scene/RecordingSceneExecutor.ktandroid/app/build.gradle.ktsandroid/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/shell/MainAppShellTest.ktandroid/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/shell/AccountProviderDialogTest.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/ui/devicecenter/DeviceCenterModels.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/di/DeviceGatewayModule.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/ui/common/DomainErrorMapper.ktandroid/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/scene/SceneChoiceFlowTest.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/di/SceneIntegrationModule.ktandroid/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/temperaturehumidity/TemperatureHumidityDetailScreenTest.ktandroid/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/socket/SocketDetailScreenTest.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/ui/devicecenter/DeviceCenterRoute.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/ui/navigation/Routes.ktabsdk-bridge/src/main/kotlin/com/flagship/abox/manager/absdk/bridge/AbsdkBridge.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/di/ProviderRoutingGateways.ktandroid/app/src/main/kotlin/com/flagship/abox/manager/di/UiPreferencesModule.ktandroid/app/src/main/AndroidManifest.xml