diff --git a/build.gradle b/build.gradle index 7a60765e..830c64cc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { - compose_version = '1.1.0-alpha03' - kotlin_version = '1.5.30' + compose_version = '1.1.0-rc01' + kotlin_version = '1.6.0' android_api_version = 31 android_min_api_version = 26 } @@ -14,7 +14,7 @@ buildscript { classpath "com.android.tools.build:gradle:7.0.4" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "io.spring.gradle:dependency-management-plugin:1.0.11.RELEASE" - classpath "com.google.dagger:hilt-android-gradle-plugin:2.40" + classpath "com.google.dagger:hilt-android-gradle-plugin:2.40.4" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/lib_service/src/main/java/no/nordicsemi/android/service/BleProfileService.kt b/lib_service/src/main/java/no/nordicsemi/android/service/BleProfileService.kt index a7aa15d5..9dcae659 100644 --- a/lib_service/src/main/java/no/nordicsemi/android/service/BleProfileService.kt +++ b/lib_service/src/main/java/no/nordicsemi/android/service/BleProfileService.kt @@ -104,7 +104,7 @@ abstract class BleProfileService : LifecycleService() { super.onDestroy() // shutdown the manager - manager.close() + manager.disconnect().enqueue() Logger.i(logSession, "Service destroyed") bluetoothDeviceHolder.forgetDevice() logSession = null diff --git a/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SelectItemRadioGroup.kt b/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SelectItemRadioGroup.kt deleted file mode 100644 index 87eadfdc..00000000 --- a/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SelectItemRadioGroup.kt +++ /dev/null @@ -1,42 +0,0 @@ -package no.nordicsemi.android.theme.view - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import no.nordicsemi.android.material.you.RadioButton -import no.nordicsemi.android.material.you.RadioButtonItem - -@Composable -fun SelectItemRadioGroup( - currentItem: T, - items: List>, - onEvent: (RadioGroupItem) -> Unit -) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceEvenly - ) { - items.forEach { - SelectItemRadioButton(currentItem, it, onEvent) - } - } -} - -@Composable -internal fun SelectItemRadioButton( - selectedItem: T, - displayedItem: RadioGroupItem, - onEvent: (RadioGroupItem) -> Unit -) { - Row { - RadioButton( - RadioButtonItem(displayedItem.label, selectedItem == displayedItem.unit), - ) { - onEvent(displayedItem) - } - } -} - -data class RadioGroupItem(val unit: T, val label: String) diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/data/CSCData.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/data/CSCData.kt index b36f27de..b8bbf4af 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/data/CSCData.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/data/CSCData.kt @@ -2,9 +2,14 @@ package no.nordicsemi.android.csc.data import no.nordicsemi.android.csc.view.CSCSettings import no.nordicsemi.android.csc.view.SpeedUnit -import no.nordicsemi.android.theme.view.RadioGroupItem +import no.nordicsemi.android.material.you.RadioButtonItem +import no.nordicsemi.android.material.you.RadioGroupViewEntity import java.util.* +private const val DISPLAY_M_S = "m/s" +private const val DISPLAY_KM_H = "km/h" +private const val DISPLAY_MPH = "mph" + internal data class CSCData( val showDialog: Boolean = false, val scanDevices: Boolean = false, @@ -57,11 +62,30 @@ internal data class CSCData( return String.format(Locale.US, "%.1f", gearRatio) } - fun items(): List> { - return listOf( - RadioGroupItem(SpeedUnit.M_S,"m/s"), - RadioGroupItem(SpeedUnit.KM_H, "km/h"), - RadioGroupItem(SpeedUnit.MPH, "mph") + fun getSpeedUnit(label: String): SpeedUnit { + return when (label) { + DISPLAY_KM_H -> SpeedUnit.KM_H + DISPLAY_M_S -> SpeedUnit.M_S + DISPLAY_MPH -> SpeedUnit.MPH + else -> throw IllegalArgumentException("Can't create SpeedUnit from this label: $label") + } + } + + fun temperatureSettingsItems(): RadioGroupViewEntity { + return RadioGroupViewEntity( + SpeedUnit.values().map { createRadioButtonItem(it) } ) } + + private fun createRadioButtonItem(unit: SpeedUnit): RadioButtonItem { + return RadioButtonItem(displayTemperature(unit), unit == selectedSpeedUnit) + } + + private fun displayTemperature(unit: SpeedUnit): String { + return when (unit) { + SpeedUnit.KM_H -> DISPLAY_KM_H + SpeedUnit.M_S -> DISPLAY_M_S + SpeedUnit.MPH -> DISPLAY_MPH + } + } } diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCContentView.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCContentView.kt index e58cd780..07e27442 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCContentView.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/CSCContentView.kt @@ -16,9 +16,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import no.nordicsemi.android.csc.R import no.nordicsemi.android.csc.data.CSCData +import no.nordicsemi.android.material.you.RadioButtonGroup import no.nordicsemi.android.theme.view.ScreenSection import no.nordicsemi.android.theme.view.SectionTitle -import no.nordicsemi.android.theme.view.SelectItemRadioGroup @Composable internal fun CSCContentView(state: CSCData, onEvent: (CSCViewEvent) -> Unit) { @@ -62,8 +62,8 @@ private fun SettingsSection(state: CSCData, onEvent: (CSCViewEvent) -> Unit) { Spacer(modifier = Modifier.height(16.dp)) - SelectItemRadioGroup(state.selectedSpeedUnit, state.items()) { - onEvent(OnSelectedSpeedUnitSelected(it.unit)) + RadioButtonGroup(viewEntity = state.temperatureSettingsItems()) { + onEvent(OnSelectedSpeedUnitSelected(state.getSpeedUnit(it.label))) } } } diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/SpeedUnit.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/SpeedUnit.kt index 017e4b28..86be4bd3 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/SpeedUnit.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/SpeedUnit.kt @@ -1,7 +1,7 @@ package no.nordicsemi.android.csc.view -internal enum class SpeedUnit { - M_S, - KM_H, - MPH +internal enum class SpeedUnit(val displayName: String) { + M_S("m/s"), + KM_H("km/h"), + MPH("mph") } diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/WheelSizeView.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/WheelSizeView.kt index 7f3d3809..841ba33d 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/WheelSizeView.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/WheelSizeView.kt @@ -1,12 +1,17 @@ package no.nordicsemi.android.csc.view +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton 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.tooling.preview.Preview @@ -15,21 +20,22 @@ import no.nordicsemi.android.csc.data.CSCData @Composable internal fun WheelSizeView(state: CSCData, onEvent: (CSCViewEvent) -> Unit) { - //TODO -// OutlinedTextField( -// modifier = Modifier.fillMaxWidth(), -// value = state.wheelSizeDisplay, -// onValueChange = { }, -// enabled = false, -// label = { Text(text = stringResource(id = R.string.csc_field_wheel_size)) }, -// trailingIcon = { EditIcon(onEvent = onEvent) } -// ) -} + OutlinedButton(onClick = { onEvent(OnShowEditWheelSizeDialogButtonClick) }) { + Row( + modifier = Modifier.fillMaxWidth(0.5f), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ){ + Column { + Text( + text = stringResource(id = R.string.csc_field_wheel_size), + style = MaterialTheme.typography.labelSmall + ) + Text(text = state.wheelSizeDisplay, style = MaterialTheme.typography.bodyMedium) + } -@Composable -private fun EditIcon(onEvent: (CSCViewEvent) -> Unit) { - IconButton(onClick = { onEvent(OnShowEditWheelSizeDialogButtonClick) }) { - Icon(Icons.Filled.Edit, "Edit wheel size.") + Icon(Icons.Default.ArrowDropDown, contentDescription = "") + } } } diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSData.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSData.kt index 34702b68..3d56c71f 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSData.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/data/GLSData.kt @@ -1,24 +1,16 @@ package no.nordicsemi.android.gls.data -import no.nordicsemi.android.theme.view.RadioGroupItem - internal data class GLSData( val records: List = emptyList(), val batteryLevel: Int = 0, val requestStatus: RequestStatus = RequestStatus.IDLE, val selectedMode: WorkingMode = WorkingMode.ALL -) { - fun modeItems(): List> { - return listOf( - RadioGroupItem(WorkingMode.ALL, "All"), - RadioGroupItem(WorkingMode.FIRST, "First"), - RadioGroupItem(WorkingMode.LAST, "Last") - ) - } -} +) -internal enum class WorkingMode { - ALL, LAST, FIRST +internal enum class WorkingMode(val displayName: String) { + ALL("All"), + LAST("First"), + FIRST("Last") } internal enum class RequestStatus { diff --git a/profile_gls/src/main/java/no/nordicsemi/android/gls/view/GLSContentView.kt b/profile_gls/src/main/java/no/nordicsemi/android/gls/view/GLSContentView.kt index 446d3817..d05560da 100644 --- a/profile_gls/src/main/java/no/nordicsemi/android/gls/view/GLSContentView.kt +++ b/profile_gls/src/main/java/no/nordicsemi/android/gls/view/GLSContentView.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.unit.dp import no.nordicsemi.android.gls.R import no.nordicsemi.android.gls.data.GLSData import no.nordicsemi.android.gls.data.GLSRecord +import no.nordicsemi.android.gls.data.WorkingMode import no.nordicsemi.android.gls.viewmodel.DisconnectEvent import no.nordicsemi.android.gls.viewmodel.GLSScreenViewEvent import no.nordicsemi.android.gls.viewmodel.OnWorkingModeSelected @@ -61,9 +62,9 @@ private fun SettingsView(state: GLSData, onEvent: (GLSScreenViewEvent) -> Unit) modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly ) { - state.modeItems().forEach { - Button(onClick = { onEvent(OnWorkingModeSelected(it.unit)) }) { - Text(it.label) + WorkingMode.values().forEach { + Button(onClick = { onEvent(OnWorkingModeSelected(it)) }) { + Text(it.displayName) } } } diff --git a/profile_hts/build.gradle b/profile_hts/build.gradle index d397c91b..fce7ebeb 100644 --- a/profile_hts/build.gradle +++ b/profile_hts/build.gradle @@ -9,6 +9,7 @@ dependencies { implementation libs.nordic.ble.common implementation libs.nordic.log + implementation libs.nordic.theme implementation libs.bundles.compose implementation libs.androidx.core diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/data/HTSData.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/data/HTSData.kt index 0b0473f8..a9f5b81f 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/data/HTSData.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/data/HTSData.kt @@ -1,6 +1,11 @@ package no.nordicsemi.android.hts.data -import no.nordicsemi.android.theme.view.RadioGroupItem +import no.nordicsemi.android.material.you.RadioButtonItem +import no.nordicsemi.android.material.you.RadioGroupViewEntity + +private const val DISPLAY_FAHRENHEIT = "°F" +private const val DISPLAY_CELSIUS = "°C" +private const val DISPLAY_KELVIN = "°K" internal data class HTSData( val temperatureValue: Float = 0f, @@ -16,15 +21,36 @@ internal data class HTSData( } } - fun temperatureSettingsItems(): List> { - return listOf( - RadioGroupItem(TemperatureUnit.CELSIUS,"°C"), - RadioGroupItem(TemperatureUnit.FAHRENHEIT, "°F"), - RadioGroupItem(TemperatureUnit.KELVIN, "°K") + fun getTemperatureUnit(label: String): TemperatureUnit { + return when (label) { + DISPLAY_CELSIUS -> TemperatureUnit.CELSIUS + DISPLAY_FAHRENHEIT -> TemperatureUnit.FAHRENHEIT + DISPLAY_KELVIN -> TemperatureUnit.KELVIN + else -> throw IllegalArgumentException("Can't create TemperatureUnit from this label: $label") + } + } + + fun temperatureSettingsItems(): RadioGroupViewEntity { + return RadioGroupViewEntity( + TemperatureUnit.values().map { createRadioButtonItem(it) } ) } + + private fun createRadioButtonItem(unit: TemperatureUnit): RadioButtonItem { + return RadioButtonItem(displayTemperature(unit), unit == temperatureUnit) + } + + private fun displayTemperature(unit: TemperatureUnit): String { + return when (unit) { + TemperatureUnit.CELSIUS -> DISPLAY_CELSIUS + TemperatureUnit.FAHRENHEIT -> DISPLAY_FAHRENHEIT + TemperatureUnit.KELVIN -> DISPLAY_KELVIN + } + } } internal enum class TemperatureUnit { - CELSIUS, FAHRENHEIT, KELVIN + CELSIUS, + FAHRENHEIT, + KELVIN } diff --git a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSContentView.kt b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSContentView.kt index beec611c..a7f78886 100644 --- a/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSContentView.kt +++ b/profile_hts/src/main/java/no/nordicsemi/android/hts/view/HTSContentView.kt @@ -11,12 +11,18 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import no.nordicsemi.android.hts.R import no.nordicsemi.android.hts.data.HTSData -import no.nordicsemi.android.theme.view.* +import no.nordicsemi.android.material.you.RadioButtonGroup +import no.nordicsemi.android.theme.view.BatteryLevelView +import no.nordicsemi.android.theme.view.KeyValueField +import no.nordicsemi.android.theme.view.ScreenSection +import no.nordicsemi.android.theme.view.SectionTitle @Composable internal fun HTSContentView(state: HTSData, onEvent: (HTSScreenViewEvent) -> Unit) { Column( - modifier = Modifier.fillMaxSize().padding(horizontal = 16.dp), + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Spacer(modifier = Modifier.height(16.dp)) @@ -26,8 +32,8 @@ internal fun HTSContentView(state: HTSData, onEvent: (HTSScreenViewEvent) -> Uni Spacer(modifier = Modifier.height(16.dp)) - SelectItemRadioGroup(state.temperatureUnit, state.temperatureSettingsItems()) { - onEvent(OnTemperatureUnitSelected(it.unit)) + RadioButtonGroup(viewEntity = state.temperatureSettingsItems()) { + onEvent(OnTemperatureUnitSelected(state.getTemperatureUnit(it.label))) } }