From 4d15ada6ebb8558032a99c8702eb98fbc6918aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sylwester=20Zieli=C5=84ski?= Date: Thu, 2 Dec 2021 13:22:26 +0100 Subject: [PATCH] Improve views --- .../android/service/ForegroundBleService.kt | 2 ++ .../nordicsemi/android/theme/view/SectionTitle.kt | 3 +++ .../android/theme/view/SensorRecordCard.kt | 13 ++++++++++--- .../android/bps/repository/BPSManager.kt | 9 ++++++++- .../nordicsemi/android/bps/view/BPSContentView.kt | 7 +++++-- .../no/nordicsemi/android/bps/view/BPSScreen.kt | 11 +++++++++++ .../android/bps/view/BPSSensorsReadingView.kt | 3 +++ .../android/bps/viewmodel/BPSViewModel.kt | 14 ++++++++++++++ .../nordicsemi/android/csc/view/CSCContentView.kt | 11 ++++++++++- .../android/csc/view/SensorsReadingView.kt | 5 +++++ profile_csc/src/main/res/values/strings.xml | 2 ++ .../nordicsemi/android/hrs/view/HRSContentView.kt | 4 +++- .../nordicsemi/android/hts/view/HTSContentView.kt | 7 ++----- .../scanner/viewmodel/ScanDevicesViewModel.kt | 8 ++------ 14 files changed, 80 insertions(+), 19 deletions(-) diff --git a/lib_service/src/main/java/no/nordicsemi/android/service/ForegroundBleService.kt b/lib_service/src/main/java/no/nordicsemi/android/service/ForegroundBleService.kt index 6f4de89b..d40b22a4 100644 --- a/lib_service/src/main/java/no/nordicsemi/android/service/ForegroundBleService.kt +++ b/lib_service/src/main/java/no/nordicsemi/android/service/ForegroundBleService.kt @@ -28,6 +28,7 @@ import android.app.PendingIntent import android.content.Intent import android.os.Build import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat private const val CHANNEL_ID = "FOREGROUND_BLE_SERVICE" @@ -91,6 +92,7 @@ abstract class ForegroundBleService : BleProfileService() { .setContentTitle(getString(R.string.app_name)) .setContentText(getString(messageResId, manager.bluetoothDevice?.name ?: "Device")) .setSmallIcon(R.mipmap.ic_launcher) + .setColor(ContextCompat.getColor(this, R.color.md_theme_primary)) .setContentIntent(pendingIntent) .build() } diff --git a/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SectionTitle.kt b/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SectionTitle.kt index ebde00bb..9957248a 100644 --- a/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SectionTitle.kt +++ b/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SectionTitle.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight @@ -32,6 +33,7 @@ fun SectionTitle( Image( painter = painterResource(id = resId), contentDescription = null, + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSecondary), modifier = Modifier .background( color = MaterialTheme.colorScheme.secondary, @@ -63,6 +65,7 @@ fun SectionTitle( Icon( imageVector = icon, contentDescription = null, + tint = MaterialTheme.colorScheme.onSecondary, modifier = Modifier .background( color = MaterialTheme.colorScheme.secondary, diff --git a/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SensorRecordCard.kt b/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SensorRecordCard.kt index 23ccf9b1..26624f0d 100644 --- a/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SensorRecordCard.kt +++ b/lib_theme/src/main/java/no/nordicsemi/android/theme/view/SensorRecordCard.kt @@ -1,20 +1,27 @@ package no.nordicsemi.android.theme.view import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import no.nordicsemi.android.material.you.Card @Composable fun ScreenSection(content: @Composable () -> Unit) { Card( - backgroundColor = MaterialTheme.colorScheme.background, - shape = RoundedCornerShape(4.dp), + backgroundColor = MaterialTheme.colorScheme.secondaryContainer, + shape = RoundedCornerShape(16.dp), elevation = 0.dp, ) { - Column { + Column( + modifier = Modifier.fillMaxWidth().padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { content() } } diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSManager.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSManager.kt index a932b0b4..bd41fad9 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSManager.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/repository/BPSManager.kt @@ -26,6 +26,7 @@ import android.bluetooth.BluetoothGatt import android.bluetooth.BluetoothGattCharacteristic import android.content.Context import android.util.Log +import dagger.hilt.android.qualifiers.ApplicationContext import no.nordicsemi.android.ble.common.callback.bps.BloodPressureMeasurementDataCallback import no.nordicsemi.android.ble.common.callback.bps.IntermediateCuffPressureDataCallback import no.nordicsemi.android.ble.common.profile.bp.BloodPressureTypes @@ -34,6 +35,8 @@ import no.nordicsemi.android.bps.data.BPSDataHolder import no.nordicsemi.android.log.LogContract import no.nordicsemi.android.service.BatteryManager import java.util.* +import javax.inject.Inject +import javax.inject.Singleton /** Blood Pressure service UUID. */ val BPS_SERVICE_UUID = UUID.fromString("00001810-0000-1000-8000-00805f9b34fb") @@ -44,7 +47,11 @@ private val BPM_CHARACTERISTIC_UUID = UUID.fromString("00002A35-0000-1000-8000-0 /** Intermediate Cuff Pressure characteristic UUID. */ private val ICP_CHARACTERISTIC_UUID = UUID.fromString("00002A36-0000-1000-8000-00805f9b34fb") -internal class BPSManager(context: Context, private val dataHolder: BPSDataHolder) : BatteryManager(context) { +@Singleton +internal class BPSManager @Inject constructor( + @ApplicationContext context: Context, + private val dataHolder: BPSDataHolder +) : BatteryManager(context) { private var bpmCharacteristic: BluetoothGattCharacteristic? = null private var icpCharacteristic: BluetoothGattCharacteristic? = null diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSContentView.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSContentView.kt index b0cfc530..72016182 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSContentView.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSContentView.kt @@ -1,8 +1,10 @@ package no.nordicsemi.android.bps.view +import android.util.Log import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -16,9 +18,10 @@ import no.nordicsemi.android.bps.data.BPSData @Composable internal fun BPSContentView(state: BPSData, onEvent: (BPSScreenViewEvent) -> Unit) { Column( - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(16.dp) ) { - Spacer(modifier = Modifier.height(16.dp)) + Log.d("AAATESTAAA", "state: $state") BPSSensorsReadingView(state = state) diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt index a0b50c54..648f139f 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSScreen.kt @@ -2,6 +2,7 @@ package no.nordicsemi.android.bps.view import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel @@ -16,6 +17,16 @@ fun BPSScreen(finishAction: () -> Unit) { val state = viewModel.state.collectAsState().value val isScreenActive = viewModel.isActive.collectAsState().value + LaunchedEffect("connect") { + viewModel.connectDevice() + } + + LaunchedEffect(isScreenActive) { + if (!isScreenActive) { + finishAction() + } + } + BPSView(state) { viewModel.onEvent(it) } } diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSSensorsReadingView.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSSensorsReadingView.kt index 722a3921..ef072ea7 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSSensorsReadingView.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSSensorsReadingView.kt @@ -13,11 +13,14 @@ import no.nordicsemi.android.bps.data.BPSData 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 BPSSensorsReadingView(state: BPSData) { ScreenSection { Column { + SectionTitle(resId = R.drawable.ic_records, title = "Records") + Spacer(modifier = Modifier.height(16.dp)) KeyValueField(stringResource(id = R.string.bps_systolic), state.displaySystolic()) Spacer(modifier = Modifier.height(4.dp)) KeyValueField(stringResource(id = R.string.bps_diastolic), state.displayDiastolic()) diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt index afbc2c0a..5d7cc921 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/viewmodel/BPSViewModel.kt @@ -2,14 +2,18 @@ package no.nordicsemi.android.bps.viewmodel import dagger.hilt.android.lifecycle.HiltViewModel import no.nordicsemi.android.bps.data.BPSDataHolder +import no.nordicsemi.android.bps.repository.BPSManager import no.nordicsemi.android.bps.view.BPSScreenViewEvent import no.nordicsemi.android.bps.view.DisconnectEvent +import no.nordicsemi.android.service.SelectedBluetoothDeviceHolder import no.nordicsemi.android.theme.viewmodel.CloseableViewModel import no.nordicsemi.android.utils.exhaustive import javax.inject.Inject @HiltViewModel internal class BPSViewModel @Inject constructor( + private val bpsManager: BPSManager, + private val deviceHolder: SelectedBluetoothDeviceHolder, private val dataHolder: BPSDataHolder ) : CloseableViewModel() { @@ -21,8 +25,18 @@ internal class BPSViewModel @Inject constructor( }.exhaustive } + fun connectDevice() { + deviceHolder.device?.let { + bpsManager.connect(it) + .useAutoConnect(false) + .retry(3, 100) + .enqueue() + } + } + private fun onDisconnectButtonClick() { finish() + deviceHolder.forgetDevice() dataHolder.clear() } } 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 1d928b10..e58cd780 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 @@ -3,6 +3,9 @@ package no.nordicsemi.android.csc.view import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -14,6 +17,7 @@ import androidx.compose.ui.unit.dp import no.nordicsemi.android.csc.R import no.nordicsemi.android.csc.data.CSCData import no.nordicsemi.android.theme.view.ScreenSection +import no.nordicsemi.android.theme.view.SectionTitle import no.nordicsemi.android.theme.view.SelectItemRadioGroup @Composable @@ -23,7 +27,8 @@ internal fun CSCContentView(state: CSCData, onEvent: (CSCViewEvent) -> Unit) { } Column( - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(horizontal = 16.dp) ) { Spacer(modifier = Modifier.height(16.dp)) @@ -49,6 +54,10 @@ private fun SettingsSection(state: CSCData, onEvent: (CSCViewEvent) -> Unit) { Column( horizontalAlignment = Alignment.CenterHorizontally ) { + SectionTitle(icon = Icons.Default.Settings, title = stringResource(R.string.csc_settings)) + + Spacer(modifier = Modifier.height(16.dp)) + WheelSizeView(state, onEvent) Spacer(modifier = Modifier.height(16.dp)) diff --git a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/SensorsReadingView.kt b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/SensorsReadingView.kt index 721ab560..a79012cd 100644 --- a/profile_csc/src/main/java/no/nordicsemi/android/csc/view/SensorsReadingView.kt +++ b/profile_csc/src/main/java/no/nordicsemi/android/csc/view/SensorsReadingView.kt @@ -13,10 +13,15 @@ import no.nordicsemi.android.csc.data.CSCData 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 SensorsReadingView(state: CSCData) { ScreenSection { + SectionTitle(resId = R.drawable.ic_records, title = "Records") + + Spacer(modifier = Modifier.height(16.dp)) + Column { KeyValueField(stringResource(id = R.string.csc_field_speed), state.displaySpeed()) Spacer(modifier = Modifier.height(4.dp)) diff --git a/profile_csc/src/main/res/values/strings.xml b/profile_csc/src/main/res/values/strings.xml index b5eb3b86..d6891cc5 100644 --- a/profile_csc/src/main/res/values/strings.xml +++ b/profile_csc/src/main/res/values/strings.xml @@ -12,6 +12,8 @@ Wheel size + Settings + 60–622 50–622 diff --git a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSContentView.kt b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSContentView.kt index cdd33290..cc005afe 100644 --- a/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSContentView.kt +++ b/profile_hrs/src/main/java/no/nordicsemi/android/hrs/view/HRSContentView.kt @@ -3,6 +3,7 @@ package no.nordicsemi.android.hrs.view import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -20,7 +21,8 @@ import no.nordicsemi.android.theme.view.SectionTitle @Composable internal fun HRSContentView(state: HRSData, onEvent: (HRSScreenViewEvent) -> Unit) { Column( - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(horizontal = 16.dp) ) { Spacer(modifier = Modifier.height(16.dp)) 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 9d39ce82..beec611c 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 @@ -1,9 +1,6 @@ package no.nordicsemi.android.hts.view -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.* import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -19,7 +16,7 @@ import no.nordicsemi.android.theme.view.* @Composable internal fun HTSContentView(state: HTSData, onEvent: (HTSScreenViewEvent) -> Unit) { Column( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize().padding(horizontal = 16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Spacer(modifier = Modifier.height(16.dp)) diff --git a/profile_scanner/src/main/java/no/nordicsemi/android/scanner/viewmodel/ScanDevicesViewModel.kt b/profile_scanner/src/main/java/no/nordicsemi/android/scanner/viewmodel/ScanDevicesViewModel.kt index 5ab1c607..309f8878 100644 --- a/profile_scanner/src/main/java/no/nordicsemi/android/scanner/viewmodel/ScanDevicesViewModel.kt +++ b/profile_scanner/src/main/java/no/nordicsemi/android/scanner/viewmodel/ScanDevicesViewModel.kt @@ -8,11 +8,7 @@ import no.nordicsemi.android.scanner.view.OnCancelButtonClick import no.nordicsemi.android.scanner.view.OnDeviceSelected import no.nordicsemi.android.scanner.view.ScanDevicesViewEvent import no.nordicsemi.android.service.SelectedBluetoothDeviceHolder -import no.nordicsemi.android.support.v18.scanner.BluetoothLeScannerCompat -import no.nordicsemi.android.support.v18.scanner.ScanCallback -import no.nordicsemi.android.support.v18.scanner.ScanFilter -import no.nordicsemi.android.support.v18.scanner.ScanResult -import no.nordicsemi.android.support.v18.scanner.ScanSettings +import no.nordicsemi.android.support.v18.scanner.* import no.nordicsemi.android.theme.viewmodel.CloseableViewModel import no.nordicsemi.android.utils.exhaustive import javax.inject.Inject @@ -58,7 +54,7 @@ class ScanDevicesViewModel @Inject constructor( val settings: ScanSettings = ScanSettings.Builder() .setLegacy(false) .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) - .setReportDelay(5000) + .setReportDelay(500) .setUseHardwareBatchingIfSupported(true) .build()