Improve views

This commit is contained in:
Sylwester Zieliński
2021-12-02 13:22:26 +01:00
parent 10b0573d6e
commit 4d15ada6eb
14 changed files with 80 additions and 19 deletions

View File

@@ -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()
}

View File

@@ -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,

View File

@@ -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()
}
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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) }
}

View File

@@ -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())

View File

@@ -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()
}
}

View File

@@ -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))

View File

@@ -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))

View File

@@ -12,6 +12,8 @@
<string name="csc_field_wheel_size">Wheel size</string>
<string name="csc_settings">Settings</string>
<string-array name="wheel_entries">
<item>60&#8211;622</item>
<item>50&#8211;622</item>

View File

@@ -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))

View File

@@ -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))

View File

@@ -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()