mirror of
https://github.com/aljazceru/Android-nRF-Toolbox.git
synced 2025-12-19 15:34:26 +01:00
Improve views
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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–622</item>
|
||||
<item>50–622</item>
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user