[WEAR] Add temperature screen

This commit is contained in:
Kamil Gurgul
2025-01-06 13:27:07 +01:00
parent 7d8e04f3d3
commit 0093dcb697
2 changed files with 117 additions and 1 deletions
@@ -42,6 +42,7 @@ import com.kgurgul.cpuinfo.shared.settings
import com.kgurgul.cpuinfo.shared.temp
import com.kgurgul.cpuinfo.wear.features.applications.WearApplicationsScreen
import com.kgurgul.cpuinfo.wear.features.information.WearInfoContainerScreen
import com.kgurgul.cpuinfo.wear.features.temperature.WearTemperatureScreen
import com.kgurgul.cpuinfo.wear.theme.WearAppTheme
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
@@ -92,7 +93,7 @@ fun WearHostScreen(
)
}
composable(WearHostScreen.Temperature.route) {
WearTemperatureScreen()
}
composable(WearHostScreen.Settings.route) {
@@ -0,0 +1,115 @@
@file:OptIn(ExperimentalHorologistApi::class)
package com.kgurgul.cpuinfo.wear.features.temperature
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.wear.compose.foundation.lazy.items
import androidx.wear.compose.material.ChipDefaults
import androidx.wear.compose.material.Icon
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Text
import com.google.android.horologist.annotations.ExperimentalHorologistApi
import com.google.android.horologist.compose.layout.ScalingLazyColumn
import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults
import com.google.android.horologist.compose.layout.ScreenScaffold
import com.google.android.horologist.compose.layout.rememberResponsiveColumnState
import com.google.android.horologist.compose.material.ListHeaderDefaults.firstItemPadding
import com.google.android.horologist.compose.material.ListHeaderDefaults.itemPadding
import com.google.android.horologist.compose.material.ResponsiveListHeader
import com.kgurgul.cpuinfo.domain.model.asString
import com.kgurgul.cpuinfo.features.temperature.TemperatureViewModel
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.no_temp_data
import com.kgurgul.cpuinfo.shared.temperature
import com.kgurgul.cpuinfo.wear.ui.components.WearCpuChip
import kotlinx.coroutines.launch
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@Composable
fun WearTemperatureScreen(
viewModel: TemperatureViewModel = koinViewModel(),
) {
val uiState by viewModel.uiStateFlow.collectAsStateWithLifecycle()
WearTemperatureScreen(
uiState = uiState,
)
}
@Composable
fun WearTemperatureScreen(
uiState: TemperatureViewModel.UiState,
) {
val columnState = rememberResponsiveColumnState(
contentPadding = ScalingLazyColumnDefaults.padding(
first = ScalingLazyColumnDefaults.ItemType.Text,
last = ScalingLazyColumnDefaults.ItemType.Chip,
),
)
val coroutineScope = rememberCoroutineScope()
ScreenScaffold(scrollState = columnState) {
ScalingLazyColumn(
columnState = columnState
) {
item {
ResponsiveListHeader(contentPadding = firstItemPadding()) {
Text(
text = stringResource(Res.string.temperature),
color = MaterialTheme.colors.onBackground,
)
}
}
if (uiState.temperatureItems.isEmpty()) {
item {
ResponsiveListHeader(contentPadding = itemPadding()) {
Text(
text = stringResource(Res.string.no_temp_data),
color = MaterialTheme.colors.onBackground,
)
}
}
} else {
items(
items = uiState.temperatureItems,
key = { item -> item.id },
) { item ->
var formattedTemp by remember { mutableStateOf("") }
if (!item.temperature.isNaN()) {
LaunchedEffect(item.temperature) {
coroutineScope.launch {
formattedTemp = uiState.temperatureFormatter
.format(item.temperature)
}
}
}
WearCpuChip(
label = item.name.asString(),
secondaryLabel = formattedTemp,
icon = {
Icon(
painter = painterResource(item.icon),
// tint = MaterialTheme.colorScheme.onBackground,
contentDescription = null,
modifier = Modifier
.size(ChipDefaults.IconSize)
.wrapContentSize(align = Alignment.Center),
)
}
)
}
}
}
}
}