[WEAR] Add temperature screen
This commit is contained in:
+2
-1
@@ -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) {
|
||||
|
||||
|
||||
+115
@@ -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),
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user