From 97e741ebcaabb2a30272113d9420ae369c6db136 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Fri, 12 Nov 2021 15:17:45 -0800 Subject: [PATCH 1/2] Sort entities, add time and headers in wear settings --- .../companion/android/home/views/MainView.kt | 10 +- .../android/home/views/SettingsView.kt | 300 ++++++++++-------- wear/src/main/res/values/strings.xml | 2 + 3 files changed, 168 insertions(+), 144 deletions(-) diff --git a/wear/src/main/java/io/homeassistant/companion/android/home/views/MainView.kt b/wear/src/main/java/io/homeassistant/companion/android/home/views/MainView.kt index bd2a88a0382..d9243561211 100644 --- a/wear/src/main/java/io/homeassistant/companion/android/home/views/MainView.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/home/views/MainView.kt @@ -64,11 +64,11 @@ fun MainView( var expandedScripts: Boolean by rememberSaveable { mutableStateOf(true) } var expandedSwitches: Boolean by rememberSaveable { mutableStateOf(true) } - val scenes = entities.filter { it.key.split(".")[0] == "scene" }.values.toList() - val scripts = entities.filter { it.key.split(".")[0] == "script" }.values.toList() - val lights = entities.filter { it.key.split(".")[0] == "light" }.values.toList() - val inputBooleans = entities.filter { it.key.split(".")[0] == "input_boolean" }.values.toList() - val switches = entities.filter { it.key.split(".")[0] == "switch" }.values.toList() + val scenes = entities.filter { it.key.split(".")[0] == "scene" }.values.toList().sortedBy { it.entityId } + val scripts = entities.filter { it.key.split(".")[0] == "script" }.values.toList().sortedBy { it.entityId } + val lights = entities.filter { it.key.split(".")[0] == "light" }.values.toList().sortedBy { it.entityId } + val inputBooleans = entities.filter { it.key.split(".")[0] == "input_boolean" }.values.toList().sortedBy { it.entityId } + val switches = entities.filter { it.key.split(".")[0] == "switch" }.values.toList().sortedBy { it.entityId } val haptic = LocalHapticFeedback.current val context = LocalContext.current diff --git a/wear/src/main/java/io/homeassistant/companion/android/home/views/SettingsView.kt b/wear/src/main/java/io/homeassistant/companion/android/home/views/SettingsView.kt index 2f3347b461c..1d53d413fec 100644 --- a/wear/src/main/java/io/homeassistant/companion/android/home/views/SettingsView.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/home/views/SettingsView.kt @@ -17,9 +17,13 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.wear.compose.material.Chip import androidx.wear.compose.material.ChipDefaults +import androidx.wear.compose.material.ExperimentalWearMaterialApi +import androidx.wear.compose.material.PositionIndicator +import androidx.wear.compose.material.Scaffold import androidx.wear.compose.material.ScalingLazyColumn import androidx.wear.compose.material.ScalingLazyListState import androidx.wear.compose.material.Text +import androidx.wear.compose.material.TimeText import androidx.wear.compose.material.ToggleChip import androidx.wear.compose.material.ToggleChipDefaults import androidx.wear.compose.material.rememberScalingLazyListState @@ -31,6 +35,7 @@ import io.homeassistant.companion.android.util.RotaryEventDispatcher import io.homeassistant.companion.android.util.RotaryEventState import io.homeassistant.companion.android.util.previewFavoritesList +@ExperimentalWearMaterialApi @Composable fun SettingsView( favorites: List, @@ -44,159 +49,176 @@ fun SettingsView( ) { val scalingLazyListState: ScalingLazyListState = rememberScalingLazyListState() RotaryEventState(scrollState = scalingLazyListState) - - ScalingLazyColumn( - modifier = Modifier - .fillMaxSize(), - contentPadding = PaddingValues( - top = 40.dp, - start = 8.dp, - end = 8.dp, - bottom = 40.dp - ), - verticalArrangement = Arrangement.spacedBy(4.dp), - horizontalAlignment = Alignment.CenterHorizontally, - state = scalingLazyListState - ) { - item { - ListHeader(id = R.string.settings) + Scaffold( + positionIndicator = { + if (scalingLazyListState.isScrollInProgress) + PositionIndicator(scalingLazyListState = scalingLazyListState) + }, + timeText = { + if (!scalingLazyListState.isScrollInProgress) + TimeText() } - item { - Chip( - modifier = Modifier - .fillMaxWidth(), - icon = { - Image(asset = CommunityMaterial.Icon3.cmd_star) - }, - label = { - Text( - text = stringResource(id = R.string.favorite) + ) { + ScalingLazyColumn( + modifier = Modifier + .fillMaxSize(), + contentPadding = PaddingValues( + top = 20.dp, + start = 8.dp, + end = 8.dp, + bottom = 40.dp + ), + verticalArrangement = Arrangement.spacedBy(4.dp), + horizontalAlignment = Alignment.CenterHorizontally, + state = scalingLazyListState + ) { + item { + ListHeader(id = R.string.favorite_settings) + } + item { + Chip( + modifier = Modifier + .fillMaxWidth(), + icon = { + Image(asset = CommunityMaterial.Icon3.cmd_star) + }, + label = { + Text( + text = stringResource(id = R.string.favorite) + ) + }, + onClick = onClickSetFavorites, + colors = ChipDefaults.primaryChipColors( + contentColor = Color.Black ) - }, - onClick = onClickSetFavorites, - colors = ChipDefaults.primaryChipColors( - contentColor = Color.Black ) - ) - } - item { - Chip( - modifier = Modifier - .fillMaxWidth(), - icon = { - Image(asset = CommunityMaterial.Icon.cmd_delete) - }, - label = { - Text( - text = stringResource(id = R.string.clear_favorites), - ) - }, - onClick = onClearFavorites, - colors = ChipDefaults.primaryChipColors( - contentColor = Color.Black - ), - secondaryLabel = { - Text( - text = stringResource(id = R.string.irreverisble) - ) - }, - enabled = favorites.isNotEmpty() - ) - } - - item { - val haptic = LocalHapticFeedback.current - ToggleChip( - modifier = Modifier - .fillMaxWidth() - .padding(top = 10.dp), - checked = isHapticEnabled, - onCheckedChange = { - onHapticEnabled(it) - haptic.performHapticFeedback(HapticFeedbackType.LongPress) - }, - label = { - Text(stringResource(R.string.setting_haptic_label)) - }, - appIcon = { - Image( - asset = - if (isHapticEnabled) - CommunityMaterial.Icon3.cmd_watch_vibrate - else - CommunityMaterial.Icon3.cmd_watch_vibrate_off + } + item { + Chip( + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp), + icon = { + Image(asset = CommunityMaterial.Icon.cmd_delete) + }, + label = { + Text( + text = stringResource(id = R.string.clear_favorites), + ) + }, + onClick = onClearFavorites, + colors = ChipDefaults.primaryChipColors( + contentColor = Color.Black + ), + secondaryLabel = { + Text( + text = stringResource(id = R.string.irreverisble) + ) + }, + enabled = favorites.isNotEmpty() + ) + } + item { + ListHeader( + id = R.string.feedback_settings, + modifier = Modifier.padding(top = 16.dp) + ) + } + item { + val haptic = LocalHapticFeedback.current + ToggleChip( + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp), + checked = isHapticEnabled, + onCheckedChange = { + onHapticEnabled(it) + haptic.performHapticFeedback(HapticFeedbackType.LongPress) + }, + label = { + Text(stringResource(R.string.setting_haptic_label)) + }, + appIcon = { + Image( + asset = + if (isHapticEnabled) + CommunityMaterial.Icon3.cmd_watch_vibrate + else + CommunityMaterial.Icon3.cmd_watch_vibrate_off + ) + }, + colors = ToggleChipDefaults.toggleChipColors( + checkedStartBackgroundColor = Color(0xFFAECBFA), + checkedEndBackgroundColor = Color(0xFFAECBFA), + uncheckedStartBackgroundColor = Color(0xFFAECBFA), + uncheckedEndBackgroundColor = Color(0xFFAECBFA), + checkedContentColor = Color.Black, + uncheckedContentColor = Color.Black, ) - }, - colors = ToggleChipDefaults.toggleChipColors( - checkedStartBackgroundColor = Color(0xFFAECBFA), - checkedEndBackgroundColor = Color(0xFFAECBFA), - uncheckedStartBackgroundColor = Color(0xFFAECBFA), - uncheckedEndBackgroundColor = Color(0xFFAECBFA), - checkedContentColor = Color.Black, - uncheckedContentColor = Color.Black, ) - ) - } - item { - ToggleChip( - modifier = Modifier - .fillMaxWidth() - .padding(top = 10.dp), - checked = isToastEnabled, - onCheckedChange = { - onToastEnabled(it) - }, - label = { - Text(stringResource(R.string.setting_toast_label)) - }, - appIcon = { - Image( - asset = - if (isToastEnabled) - CommunityMaterial.Icon3.cmd_message - else - CommunityMaterial.Icon3.cmd_message_off + } + item { + ToggleChip( + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp), + checked = isToastEnabled, + onCheckedChange = { + onToastEnabled(it) + }, + label = { + Text(stringResource(R.string.setting_toast_label)) + }, + appIcon = { + Image( + asset = + if (isToastEnabled) + CommunityMaterial.Icon3.cmd_message + else + CommunityMaterial.Icon3.cmd_message_off + ) + }, + colors = ToggleChipDefaults.toggleChipColors( + checkedStartBackgroundColor = Color(0xFFAECBFA), + checkedEndBackgroundColor = Color(0xFFAECBFA), + uncheckedStartBackgroundColor = Color(0xFFAECBFA), + uncheckedEndBackgroundColor = Color(0xFFAECBFA), + checkedContentColor = Color.Black, + uncheckedContentColor = Color.Black, ) - }, - colors = ToggleChipDefaults.toggleChipColors( - checkedStartBackgroundColor = Color(0xFFAECBFA), - checkedEndBackgroundColor = Color(0xFFAECBFA), - uncheckedStartBackgroundColor = Color(0xFFAECBFA), - uncheckedEndBackgroundColor = Color(0xFFAECBFA), - checkedContentColor = Color.Black, - uncheckedContentColor = Color.Black, ) - ) - } + } - item { - ListHeader( - id = R.string.tile_settings, - modifier = Modifier.padding(top = 16.dp) - ) - } - item { - Chip( - modifier = Modifier - .fillMaxWidth(), - icon = { - Image(asset = CommunityMaterial.Icon3.cmd_star_circle_outline) - }, - label = { - Text( - text = stringResource(id = R.string.shortcuts) - ) - }, - onClick = onClickSetShortcuts, - colors = ChipDefaults.primaryChipColors( - contentColor = Color.Black + item { + ListHeader( + id = R.string.tile_settings, + modifier = Modifier.padding(top = 16.dp) + ) + } + item { + Chip( + modifier = Modifier + .fillMaxWidth(), + icon = { + Image(asset = CommunityMaterial.Icon3.cmd_star_circle_outline) + }, + label = { + Text( + text = stringResource(id = R.string.shortcuts) + ) + }, + onClick = onClickSetShortcuts, + colors = ChipDefaults.primaryChipColors( + contentColor = Color.Black + ) ) - ) + } } } } +@ExperimentalWearMaterialApi @Preview @Composable private fun PreviewSettingsView() { diff --git a/wear/src/main/res/values/strings.xml b/wear/src/main/res/values/strings.xml index c9aad8b285e..f25ac3a5c0c 100644 --- a/wear/src/main/res/values/strings.xml +++ b/wear/src/main/res/values/strings.xml @@ -49,4 +49,6 @@ %1$s was selected Enable Toast Confirmation Enable Haptic Feeback + Feedback Settings + Favorite Settings \ No newline at end of file From 7d78612a5f80dd1da700f64d5f1a654fb2de07e6 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sat, 13 Nov 2021 08:33:41 -0800 Subject: [PATCH 2/2] Review comment --- .../companion/android/home/views/MainView.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/wear/src/main/java/io/homeassistant/companion/android/home/views/MainView.kt b/wear/src/main/java/io/homeassistant/companion/android/home/views/MainView.kt index d9243561211..f62445baae4 100644 --- a/wear/src/main/java/io/homeassistant/companion/android/home/views/MainView.kt +++ b/wear/src/main/java/io/homeassistant/companion/android/home/views/MainView.kt @@ -64,11 +64,12 @@ fun MainView( var expandedScripts: Boolean by rememberSaveable { mutableStateOf(true) } var expandedSwitches: Boolean by rememberSaveable { mutableStateOf(true) } - val scenes = entities.filter { it.key.split(".")[0] == "scene" }.values.toList().sortedBy { it.entityId } - val scripts = entities.filter { it.key.split(".")[0] == "script" }.values.toList().sortedBy { it.entityId } - val lights = entities.filter { it.key.split(".")[0] == "light" }.values.toList().sortedBy { it.entityId } - val inputBooleans = entities.filter { it.key.split(".")[0] == "input_boolean" }.values.toList().sortedBy { it.entityId } - val switches = entities.filter { it.key.split(".")[0] == "switch" }.values.toList().sortedBy { it.entityId } + val entitiesList = entities.values.toList().sortedBy { it.entityId } + val scenes = entitiesList.filter { it.entityId.split(".")[0] == "scene" } + val scripts = entitiesList.filter { it.entityId.split(".")[0] == "script" } + val lights = entitiesList.filter { it.entityId.split(".")[0] == "light" } + val inputBooleans = entitiesList.filter { it.entityId.split(".")[0] == "input_boolean" } + val switches = entitiesList.filter { it.entityId.split(".")[0] == "switch" } val haptic = LocalHapticFeedback.current val context = LocalContext.current