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