From 3777480997405f3db55857efbb0949bbc00de926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sylwester=20Zieli=C5=84ski?= Date: Wed, 29 Dec 2021 12:45:29 +0100 Subject: [PATCH] Fix UI screens --- .../no/nordicsemi/android/bps/data/BPSData.kt | 23 +----- .../android/bps/view/BPSContentView.kt | 3 - .../nordicsemi/android/bps/view/BPSMapper.kt | 26 ++++++ .../android/bps/view/BPSSensorsReadingView.kt | 11 +-- profile_bps/src/main/res/values/strings.xml | 8 +- profile_cgms/src/main/AndroidManifest.xml | 3 + profile_prx/src/main/AndroidManifest.xml | 2 +- .../nordicsemi/android/prx/data/PRXCommand.kt | 7 ++ .../no/nordicsemi/android/prx/data/PRXData.kt | 11 +-- .../android/prx/data/PRXDataHolder.kt | 10 +++ .../android/prx/service/AlarmHandler.kt | 65 +++++++++++++++ .../android/prx/service/PRXService.kt | 45 +++++++++- .../prx/service/ProximityServerManager.kt | 62 ++++++++++++++ .../android/prx/view/PRXContentView.kt | 82 ++++++++++++++++--- .../nordicsemi/android/prx/view/PRXMapper.kt | 15 ++++ .../android/prx/view/PRXScreenViewEvent.kt | 4 + .../android/prx/viewmodel/PRXViewModel.kt | 6 ++ profile_prx/src/main/res/values/strings.xml | 10 +++ .../android/rscs/service/RSCSManager.kt | 4 +- .../android/rscs/view/RSCSContentView.kt | 4 +- 20 files changed, 341 insertions(+), 60 deletions(-) create mode 100644 profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSMapper.kt create mode 100644 profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXCommand.kt create mode 100644 profile_prx/src/main/java/no/nordicsemi/android/prx/service/AlarmHandler.kt create mode 100644 profile_prx/src/main/java/no/nordicsemi/android/prx/service/ProximityServerManager.kt create mode 100644 profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXMapper.kt diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/data/BPSData.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/data/BPSData.kt index 22ce1791..4b114214 100644 --- a/profile_bps/src/main/java/no/nordicsemi/android/bps/data/BPSData.kt +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/data/BPSData.kt @@ -14,25 +14,4 @@ data class BPSData( val systolic: Float = 0f, val diastolic: Float = 0f, val meanArterialPressure: Float = 0f, -) { - - fun displaySystolic(): String { - return "$systolic" - } - - fun displayDiastolic(): String { - return "$diastolic" - } - - fun displayMeanArterialPressure(): String { - return "$meanArterialPressure" - } - - fun displayPulse(): String { - return "$pulseRate" - } - - fun displayTimeData(): String { - return "" - } -} +) 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 72016182..29b017cc 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,6 +1,5 @@ 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 @@ -21,8 +20,6 @@ internal fun BPSContentView(state: BPSData, onEvent: (BPSScreenViewEvent) -> Uni horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(16.dp) ) { - Log.d("AAATESTAAA", "state: $state") - BPSSensorsReadingView(state = state) Spacer(modifier = Modifier.height(16.dp)) diff --git a/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSMapper.kt b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSMapper.kt new file mode 100644 index 00000000..526be33b --- /dev/null +++ b/profile_bps/src/main/java/no/nordicsemi/android/bps/view/BPSMapper.kt @@ -0,0 +1,26 @@ +package no.nordicsemi.android.bps.view + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import no.nordicsemi.android.bps.R +import no.nordicsemi.android.bps.data.BPSData + +@Composable +fun BPSData.displaySystolic(): String { + return stringResource(id = R.string.bps_blood_pressure, systolic) +} + +@Composable +fun BPSData.displayDiastolic(): String { + return stringResource(id = R.string.bps_blood_pressure, diastolic) +} + +@Composable +fun BPSData.displayMeanArterialPressure(): String { + return stringResource(id = R.string.bps_blood_pressure, meanArterialPressure) +} + +@Composable +fun BPSData.displayHeartRate(): String? { + return pulseRate?.toString() +} \ No newline at end of file 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 ef072ea7..c84f23d4 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 @@ -19,17 +19,18 @@ import no.nordicsemi.android.theme.view.SectionTitle internal fun BPSSensorsReadingView(state: BPSData) { ScreenSection { Column { - SectionTitle(resId = R.drawable.ic_records, title = "Records") + SectionTitle(resId = R.drawable.ic_records, title = stringResource(id = R.string.bps_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()) Spacer(modifier = Modifier.height(4.dp)) KeyValueField(stringResource(id = R.string.bps_mean), state.displayMeanArterialPressure()) - Spacer(modifier = Modifier.height(4.dp)) - KeyValueField(stringResource(id = R.string.bps_pulse), state.displayPulse()) - Spacer(modifier = Modifier.height(4.dp)) - KeyValueField(stringResource(id = R.string.bps_time_data), state.displayTimeData()) + + state.displayHeartRate()?.let { + Spacer(modifier = Modifier.height(4.dp)) + KeyValueField(stringResource(id = R.string.bps_pulse), it) + } } } diff --git a/profile_bps/src/main/res/values/strings.xml b/profile_bps/src/main/res/values/strings.xml index e9b7392a..76e596d9 100644 --- a/profile_bps/src/main/res/values/strings.xml +++ b/profile_bps/src/main/res/values/strings.xml @@ -2,9 +2,13 @@ Blood pressure + Records + Systolic Diastolic - Mean ap - Pulse + Mean AP + Heart rate Time and Date + + %.0f kPa diff --git a/profile_cgms/src/main/AndroidManifest.xml b/profile_cgms/src/main/AndroidManifest.xml index 6a415b28..08a93443 100644 --- a/profile_cgms/src/main/AndroidManifest.xml +++ b/profile_cgms/src/main/AndroidManifest.xml @@ -2,4 +2,7 @@ + + + \ No newline at end of file diff --git a/profile_prx/src/main/AndroidManifest.xml b/profile_prx/src/main/AndroidManifest.xml index f7d522ad..26bf6b9c 100644 --- a/profile_prx/src/main/AndroidManifest.xml +++ b/profile_prx/src/main/AndroidManifest.xml @@ -3,6 +3,6 @@ package="no.nordicsemi.android.prx"> - + diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXCommand.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXCommand.kt new file mode 100644 index 00000000..2a7d78c0 --- /dev/null +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXCommand.kt @@ -0,0 +1,7 @@ +package no.nordicsemi.android.prx.data + +internal sealed class PRXCommand + +internal object EnableAlarm : PRXCommand() + +internal object DisableAlarm : PRXCommand() diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXData.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXData.kt index e3697e9b..fe3d1f4c 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXData.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXData.kt @@ -4,16 +4,7 @@ internal data class PRXData( val batteryLevel: Int = 0, val localAlarmLevel: AlarmLevel = AlarmLevel.NONE, val isRemoteAlarm: Boolean = false -) { - - fun displayLocalAlarm(): String { - return when (localAlarmLevel) { - AlarmLevel.NONE -> "none" - AlarmLevel.MEDIUM -> "medium" - AlarmLevel.HIGH -> "height" - } - } -} +) internal enum class AlarmLevel(val value: Int) { NONE(0x00), diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXDataHolder.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXDataHolder.kt index f9f6fb3d..4a7df84e 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXDataHolder.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/data/PRXDataHolder.kt @@ -1,7 +1,10 @@ package no.nordicsemi.android.prx.data +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import javax.inject.Inject import javax.inject.Singleton @@ -11,6 +14,9 @@ internal class PRXDataHolder @Inject constructor() { private val _data = MutableStateFlow(PRXData()) val data: StateFlow = _data + private val _command = MutableSharedFlow(extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) + val command = _command.asSharedFlow() + fun setBatteryLevel(batteryLevel: Int) { _data.tryEmit(_data.value.copy(batteryLevel = batteryLevel)) } @@ -24,6 +30,10 @@ internal class PRXDataHolder @Inject constructor() { _data.tryEmit(_data.value.copy(isRemoteAlarm = isOn)) } + fun invokeCommand(command: PRXCommand) { + _command.tryEmit(command) + } + fun clear(){ _data.tryEmit(PRXData()) } diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/service/AlarmHandler.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/service/AlarmHandler.kt new file mode 100644 index 00000000..c1eac501 --- /dev/null +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/service/AlarmHandler.kt @@ -0,0 +1,65 @@ +package no.nordicsemi.android.prx.service + +import android.content.Context +import android.media.AudioManager +import android.media.MediaPlayer +import android.media.RingtoneManager +import android.util.Log +import androidx.lifecycle.LifecycleService +import dagger.hilt.android.qualifiers.ApplicationContext +import java.io.IOException +import javax.inject.Inject + +class AlarmHandler @Inject constructor( + @ApplicationContext + private val context: Context +) { + + private val TAG = "ALARM_MANAGER" + + private var mediaPlayer = MediaPlayer() + private var originalVolume = 0 + + init { + mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM) + mediaPlayer.isLooping = true + mediaPlayer.setVolume(1.0f, 1.0f) + try { + mediaPlayer.setDataSource( + context, + RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM) + ) + } catch (e: IOException) { + Log.e(TAG, "Initialize Alarm failed: ", e) + } + } + + fun playAlarm() { + val am = context.getSystemService(LifecycleService.AUDIO_SERVICE) as AudioManager + originalVolume = am.getStreamVolume(AudioManager.STREAM_ALARM) + am.setStreamVolume( + AudioManager.STREAM_ALARM, + am.getStreamMaxVolume(AudioManager.STREAM_ALARM), + AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE + ) + try { + mediaPlayer.prepare() + mediaPlayer.start() + } catch (e: IOException) { + Log.e(TAG, "Prepare Alarm failed: ", e) + } + } + + fun pauseAlarm() { + if (mediaPlayer.isPlaying) { + mediaPlayer.stop() + // Restore original volume + val am = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager + am.setStreamVolume(AudioManager.STREAM_ALARM, originalVolume, 0) + } + } + + fun releaseAlarm() { + mediaPlayer.release() + } +} diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/service/PRXService.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/service/PRXService.kt index 071c542d..f2eafab4 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/service/PRXService.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/service/PRXService.kt @@ -1,8 +1,15 @@ package no.nordicsemi.android.prx.service +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import no.nordicsemi.android.prx.data.AlarmLevel +import no.nordicsemi.android.prx.data.DisableAlarm +import no.nordicsemi.android.prx.data.EnableAlarm import no.nordicsemi.android.prx.data.PRXDataHolder import no.nordicsemi.android.service.ForegroundBleService +import no.nordicsemi.android.utils.exhaustive import javax.inject.Inject @AndroidEntryPoint @@ -11,5 +18,41 @@ internal class PRXService : ForegroundBleService() { @Inject lateinit var dataHolder: PRXDataHolder - override val manager: PRXManager by lazy { PRXManager(this, dataHolder) } + @Inject + lateinit var alarmHandler: AlarmHandler + + private var serverManager: ProximityServerManager = ProximityServerManager(this) + + override val manager: PRXManager by lazy { + PRXManager(this, dataHolder).apply { + useServer(serverManager) + } + } + + override fun onCreate() { + super.onCreate() + + serverManager.open() + + dataHolder.command.onEach { + when (it) { + DisableAlarm -> manager.writeImmediateAlert(false) + EnableAlarm -> manager.writeImmediateAlert(true) + }.exhaustive + }.launchIn(lifecycleScope) + + dataHolder.data.onEach { + if (it.localAlarmLevel != AlarmLevel.NONE) { + alarmHandler.playAlarm() + } else { + alarmHandler.pauseAlarm() + } + }.launchIn(lifecycleScope) + } + + override fun onDestroy() { + super.onDestroy() + alarmHandler.releaseAlarm() + serverManager.close() + } } diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/service/ProximityServerManager.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/service/ProximityServerManager.kt new file mode 100644 index 00000000..9cf3bbda --- /dev/null +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/service/ProximityServerManager.kt @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2015, Nordic Semiconductor + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package no.nordicsemi.android.prx.service + +import android.bluetooth.BluetoothGattCharacteristic +import android.bluetooth.BluetoothGattService +import android.content.Context +import android.util.Log +import no.nordicsemi.android.ble.BleServerManager +import no.nordicsemi.android.ble.common.data.alert.AlertLevelData +import java.util.* + +internal class ProximityServerManager(context: Context) : BleServerManager(context) { + override fun log(priority: Int, message: String) { + Log.println(priority, "BleManager", message) + } + + override fun initializeServer(): List { + val services: MutableList = ArrayList() + services.add( + service( + PRX_SERVICE_UUID, + characteristic( + ALERT_LEVEL_CHARACTERISTIC_UUID, + BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE, + BluetoothGattCharacteristic.PERMISSION_WRITE + ) + ) + ) + services.add( + service( + LINK_LOSS_SERVICE_UUID, + characteristic( + ALERT_LEVEL_CHARACTERISTIC_UUID, + BluetoothGattCharacteristic.PROPERTY_WRITE or BluetoothGattCharacteristic.PROPERTY_READ, + BluetoothGattCharacteristic.PERMISSION_WRITE or BluetoothGattCharacteristic.PERMISSION_READ, + AlertLevelData.highAlert() + ) + ) + ) + return services + } +} \ No newline at end of file diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXContentView.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXContentView.kt index a23c7859..732b08ce 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXContentView.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXContentView.kt @@ -3,9 +3,13 @@ package no.nordicsemi.android.prx.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 +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp @@ -14,10 +18,74 @@ import no.nordicsemi.android.prx.data.PRXData 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 ContentView(state: PRXData, onEvent: (PRXScreenViewEvent) -> Unit) { + Column( + modifier = Modifier.padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + SettingsSection(state, onEvent) + + Spacer(modifier = Modifier.height(16.dp)) + + RecordsSection(state) + + Spacer(modifier = Modifier.height(16.dp)) + + BatteryLevelView(state.batteryLevel) + + Spacer(modifier = Modifier.height(16.dp)) + + Button( + onClick = { onEvent(DisconnectEvent) } + ) { + Text(text = stringResource(id = R.string.disconnect)) + } + } +} + +@Composable +private fun SettingsSection(state: PRXData, onEvent: (PRXScreenViewEvent) -> Unit) { ScreenSection { + SectionTitle(icon = Icons.Default.Settings, title = stringResource(R.string.prx_settings)) + + Spacer(modifier = Modifier.height(16.dp)) + + if (state.isRemoteAlarm) { + TurnAlarmOffButton(onEvent) + } else { + TurnAlarmOnButton(onEvent) + } + } +} + +@Composable +private fun TurnAlarmOnButton(onEvent: (PRXScreenViewEvent) -> Unit) { + Button( + onClick = { onEvent(TurnOnAlert) } + ) { + Text(text = stringResource(id = R.string.prx_find_me)) + } +} + +@Composable +private fun TurnAlarmOffButton(onEvent: (PRXScreenViewEvent) -> Unit) { + Button( + onClick = { onEvent(TurnOffAlert) } + ) { + Text(text = stringResource(id = R.string.prx_silent_me)) + } +} + +@Composable +private fun RecordsSection(state: PRXData) { + ScreenSection { + SectionTitle(resId = R.drawable.ic_records, title = stringResource(id = R.string.prx_records)) + + Spacer(modifier = Modifier.height(16.dp)) + Column { KeyValueField( stringResource(id = R.string.prx_is_remote_alarm), @@ -26,20 +94,8 @@ internal fun ContentView(state: PRXData, onEvent: (PRXScreenViewEvent) -> Unit) Spacer(modifier = Modifier.height(4.dp)) KeyValueField( stringResource(id = R.string.prx_local_alarm_level), - state.displayLocalAlarm() + state.localAlarmLevel.toDisplayString() ) } } - - Spacer(modifier = Modifier.height(16.dp)) - - BatteryLevelView(state.batteryLevel) - - Spacer(modifier = Modifier.height(16.dp)) - - Button( - onClick = { onEvent(DisconnectEvent) } - ) { - Text(text = stringResource(id = R.string.disconnect)) - } } diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXMapper.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXMapper.kt new file mode 100644 index 00000000..2ff3681d --- /dev/null +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXMapper.kt @@ -0,0 +1,15 @@ +package no.nordicsemi.android.prx.view + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import no.nordicsemi.android.prx.R +import no.nordicsemi.android.prx.data.AlarmLevel + +@Composable +internal fun AlarmLevel.toDisplayString(): String { + return when (this) { + AlarmLevel.NONE -> stringResource(id = R.string.prx_alarm_level_none) + AlarmLevel.MEDIUM -> stringResource(id = R.string.prx_alarm_level_medium) + AlarmLevel.HIGH -> stringResource(id = R.string.prx_alarm_level_height) + } +} diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreenViewEvent.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreenViewEvent.kt index e88ed02e..ccd49648 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreenViewEvent.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/view/PRXScreenViewEvent.kt @@ -2,4 +2,8 @@ package no.nordicsemi.android.prx.view internal sealed class PRXScreenViewEvent +internal object TurnOnAlert : PRXScreenViewEvent() + +internal object TurnOffAlert : PRXScreenViewEvent() + internal object DisconnectEvent : PRXScreenViewEvent() diff --git a/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt b/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt index 167a521a..47eaecab 100644 --- a/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt +++ b/profile_prx/src/main/java/no/nordicsemi/android/prx/viewmodel/PRXViewModel.kt @@ -1,9 +1,13 @@ package no.nordicsemi.android.prx.viewmodel import dagger.hilt.android.lifecycle.HiltViewModel +import no.nordicsemi.android.prx.data.DisableAlarm +import no.nordicsemi.android.prx.data.EnableAlarm import no.nordicsemi.android.prx.data.PRXDataHolder import no.nordicsemi.android.prx.view.DisconnectEvent import no.nordicsemi.android.prx.view.PRXScreenViewEvent +import no.nordicsemi.android.prx.view.TurnOffAlert +import no.nordicsemi.android.prx.view.TurnOnAlert import no.nordicsemi.android.theme.viewmodel.CloseableViewModel import no.nordicsemi.android.utils.exhaustive import javax.inject.Inject @@ -18,6 +22,8 @@ internal class PRXViewModel @Inject constructor( fun onEvent(event: PRXScreenViewEvent) { when (event) { DisconnectEvent -> onDisconnectButtonClick() + TurnOffAlert -> dataHolder.invokeCommand(DisableAlarm) + TurnOnAlert -> dataHolder.invokeCommand(EnableAlarm) }.exhaustive } diff --git a/profile_prx/src/main/res/values/strings.xml b/profile_prx/src/main/res/values/strings.xml index 290b4856..f0825f8c 100644 --- a/profile_prx/src/main/res/values/strings.xml +++ b/profile_prx/src/main/res/values/strings.xml @@ -2,6 +2,16 @@ Proximity + SILENT ME + FIND ME + + Records + Settings + + none + medium + height + Remote alarm Local alarm level diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/service/RSCSManager.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/service/RSCSManager.kt index 84c0a680..c9513d03 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/service/RSCSManager.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/service/RSCSManager.kt @@ -33,10 +33,10 @@ import no.nordicsemi.android.service.BatteryManager import java.util.* /** Running Speed and Cadence Measurement service UUID */ -val RSCS_SERVICE_UUID: UUID = UUID.fromString("00001814-0000-1000-8000-00805f9b34fb") +val RSCS_SERVICE_UUID: UUID = UUID.fromString("00001814-0000-1000-8000-00805F9B34FB") /** Running Speed and Cadence Measurement characteristic UUID */ -private val RSC_MEASUREMENT_CHARACTERISTIC_UUID = UUID.fromString("00002A53-0000-1000-8000-00805f9b34fb") +private val RSC_MEASUREMENT_CHARACTERISTIC_UUID = UUID.fromString("00002A53-0000-1000-8000-00805F9B34FB") internal class RSCSManager internal constructor( context: Context, diff --git a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSContentView.kt b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSContentView.kt index 78f2600d..314e3439 100644 --- a/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSContentView.kt +++ b/profile_rscs/src/main/java/no/nordicsemi/android/rscs/view/RSCSContentView.kt @@ -3,6 +3,7 @@ package no.nordicsemi.android.rscs.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 @@ -18,7 +19,8 @@ import no.nordicsemi.android.theme.view.BatteryLevelView @Composable internal fun RSCSContentView(state: RSCSData, onEvent: (RSCScreenViewEvent) -> Unit) { Column( - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(horizontal = 16.dp) ) { Spacer(modifier = Modifier.height(16.dp))