diff --git a/android/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/devicecontrollist/DeviceListScreenTest.kt b/android/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/devicecontrollist/DeviceListScreenTest.kt new file mode 100644 index 0000000..4db7a3b --- /dev/null +++ b/android/app/src/androidTest/kotlin/com/flagship/abox/manager/ui/devicecontrollist/DeviceListScreenTest.kt @@ -0,0 +1,54 @@ +package com.flagship.abox.manager.ui.devicecontrollist + +import androidx.activity.ComponentActivity +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.flagship.abox.manager.R +import com.flagship.abox.manager.designsystem.ABoxTheme +import org.junit.Assert.assertEquals +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class DeviceListScreenTest { + @get:Rule + val composeRule = createAndroidComposeRule() + + @Test + fun deviceListRendersAllDeviceCategoryButtonsAndHandlesClicks() { + var socketClicks = 0 + var tempClicks = 0 + var infraredClicks = 0 + + val context = composeRule.activity + val socketTitle = context.getString(R.string.device_socket_title) + val tempTitle = context.getString(R.string.device_temperature_humidity_title) + val infraredTitle = context.getString(R.string.device_infrared_title) + val listTitle = context.getString(R.string.device_list_title) + + composeRule.setContent { + ABoxTheme { + DeviceListScreen( + onSocketClick = { socketClicks++ }, + onTemperatureHumidityClick = { tempClicks++ }, + onInfraredClick = { infraredClicks++ }, + ) + } + } + + composeRule.onNodeWithText(listTitle).assertIsDisplayed() + + composeRule.onNodeWithText(socketTitle).assertIsDisplayed().performClick() + assertEquals(1, socketClicks) + + composeRule.onNodeWithText(tempTitle).assertIsDisplayed().performClick() + assertEquals(1, tempClicks) + + composeRule.onNodeWithText(infraredTitle).assertIsDisplayed().performClick() + assertEquals(1, infraredClicks) + } +} diff --git a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/devicecontrollist/DeviceListScreen.kt b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/devicecontrollist/DeviceListScreen.kt index 32c51d9..2dfadcc 100644 --- a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/devicecontrollist/DeviceListScreen.kt +++ b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/devicecontrollist/DeviceListScreen.kt @@ -12,18 +12,20 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.flagship.abox.manager.R import com.flagship.abox.manager.designsystem.ABoxButton import com.flagship.abox.manager.designsystem.ABoxTheme @Composable fun DeviceListScreen( - onSocketClick: () -> Unit, - onTemperatureHumidityClick: () -> Unit, - onInfraredClick: () -> Unit, modifier: Modifier = Modifier, + onSocketClick: () -> Unit = {}, + onTemperatureHumidityClick: () -> Unit = {}, + onInfraredClick: () -> Unit = {}, ) { Column( modifier = modifier @@ -34,29 +36,29 @@ fun DeviceListScreen( verticalArrangement = Arrangement.Center, ) { Text( - text = "设备列表", + text = stringResource(R.string.device_list_title), style = MaterialTheme.typography.headlineLarge, textAlign = TextAlign.Center, ) Text( - text = "选择需要控制或查看状态的 ABox 终端设备。", + text = stringResource(R.string.device_list_description), modifier = Modifier.padding(top = 12.dp, bottom = 32.dp), style = MaterialTheme.typography.bodyLarge, textAlign = TextAlign.Center, ) DeviceEntryButton( - text = "智能插座", - description = "进入智能插座相关功能。", + text = stringResource(R.string.device_socket_title), + description = stringResource(R.string.device_socket_description), onClick = onSocketClick, ) DeviceEntryButton( - text = "温湿度传感器", - description = "进入温湿度状态相关功能。", + text = stringResource(R.string.device_temperature_humidity_title), + description = stringResource(R.string.device_temperature_humidity_description), onClick = onTemperatureHumidityClick, ) DeviceEntryButton( - text = "红外控制器", - description = "进入红外控制器相关功能。", + text = stringResource(R.string.device_infrared_title), + description = stringResource(R.string.device_infrared_description), onClick = onInfraredClick, ) } @@ -88,10 +90,6 @@ private fun DeviceEntryButton( @Composable private fun DeviceListScreenPreview() { ABoxTheme { - DeviceListScreen( - onSocketClick = {}, - onTemperatureHumidityClick = {}, - onInfraredClick = {}, - ) + DeviceListScreen() } } diff --git a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/shell/MainAppShell.kt b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/shell/MainAppShell.kt index 6c2c8ce..d32ebdc 100644 --- a/android/app/src/main/kotlin/com/flagship/abox/manager/ui/shell/MainAppShell.kt +++ b/android/app/src/main/kotlin/com/flagship/abox/manager/ui/shell/MainAppShell.kt @@ -29,6 +29,7 @@ import com.flagship.abox.manager.R import com.flagship.abox.manager.designsystem.ABoxNavigationBar import com.flagship.abox.manager.designsystem.ABoxNavigationBarItem import com.flagship.abox.manager.designsystem.ABoxTopPillBar +import com.flagship.abox.manager.ui.devicecontrollist.DeviceListScreen /** * Main authenticated application shell. @@ -50,7 +51,7 @@ fun MainAppShell( onAddClick: (() -> Unit)? = null, actionInProgress: Boolean = false, errorMessage: String? = null, - devicesSlot: @Composable () -> Unit = { DefaultDevicesSlot() }, + devicesSlot: @Composable () -> Unit = { DeviceListScreen() }, scenesSlot: @Composable () -> Unit = { DefaultScenesSlot() }, activitySlot: @Composable () -> Unit = { DefaultActivitySlot() }, ) { @@ -133,14 +134,6 @@ fun MainAppShell( } } -@Composable -private fun DefaultDevicesSlot() { - SlotPlaceholder( - title = stringResource(R.string.devices_placeholder_title), - description = stringResource(R.string.devices_placeholder_description), - ) -} - @Composable private fun DefaultScenesSlot() { SlotPlaceholder( diff --git a/android/app/src/main/res/values-zh-rCN/strings.xml b/android/app/src/main/res/values-zh-rCN/strings.xml index 696dc16..f09dfa4 100644 --- a/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/android/app/src/main/res/values-zh-rCN/strings.xml @@ -42,4 +42,14 @@ 情景动作与执行插槽(由 tzh 模块实现)。 活动记录 未记录任何事件。 + + + 设备列表 + 选择需要控制或查看状态的 ABox 终端设备。 + 智能插座 + 进入智能插座相关功能。 + 温湿度传感器 + 进入温湿度状态相关功能。 + 红外控制器 + 进入红外控制器相关功能。 diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index c8818bb..f9455e4 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -42,4 +42,14 @@ Scene actions and execution slot for tzh. Activity Log No recorded events yet. + + + Device List + Select an ABox terminal device to control or check status. + Smart Socket + Access smart socket features. + Temperature & Humidity Sensor + View temperature and humidity status. + Infrared Controller + Access infrared controller features.