Properly propagade states for viewmodel based profiles.

This commit is contained in:
Sylwester Zieliński
2022-05-11 15:26:19 +02:00
parent 57a9723988
commit c73f0099ab
6 changed files with 42 additions and 23 deletions

View File

@@ -3,11 +3,14 @@ package no.nordicsemi.android.bps.repository
import android.content.Context import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.scopes.ViewModelScoped import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import no.nordicsemi.android.ble.ktx.suspend
import no.nordicsemi.android.bps.data.BPSData import no.nordicsemi.android.bps.data.BPSData
import no.nordicsemi.android.bps.data.BPSManager import no.nordicsemi.android.bps.data.BPSManager
import no.nordicsemi.android.logger.ToolboxLogger import no.nordicsemi.android.logger.ToolboxLogger
@@ -25,8 +28,7 @@ internal class BPSRepository @Inject constructor(
private var logger: ToolboxLogger? = null private var logger: ToolboxLogger? = null
fun downloadData(device: DiscoveredBluetoothDevice): Flow<BleManagerResult<BPSData>> = callbackFlow { fun downloadData(scope: CoroutineScope, device: DiscoveredBluetoothDevice): Flow<BleManagerResult<BPSData>> = callbackFlow {
val scope = this
val createdLogger = toolboxLoggerFactory.create("BPS", device.address()).also { val createdLogger = toolboxLoggerFactory.create("BPS", device.address()).also {
logger = it logger = it
} }
@@ -36,10 +38,9 @@ internal class BPSRepository @Inject constructor(
trySend(it) trySend(it)
}.launchIn(scope) }.launchIn(scope)
manager.connect(device.device) scope.launch {
.useAutoConnect(false) manager.start(device)
.retry(3, 100) }
.enqueue()
awaitClose { awaitClose {
manager.disconnect().enqueue() manager.disconnect().enqueue()
@@ -47,6 +48,17 @@ internal class BPSRepository @Inject constructor(
} }
} }
private suspend fun BPSManager.start(device: DiscoveredBluetoothDevice) {
try {
connect(device.device)
.useAutoConnect(false)
.retry(3, 100)
.suspend()
} catch (e: Exception) {
e.printStackTrace()
}
}
fun openLogger() { fun openLogger() {
logger?.openLogger() logger?.openLogger()
} }

View File

@@ -56,7 +56,7 @@ internal class BPSViewModel @Inject constructor(
} }
private fun connectDevice(device: DiscoveredBluetoothDevice) { private fun connectDevice(device: DiscoveredBluetoothDevice) {
repository.downloadData(device).onEach { repository.downloadData(viewModelScope, device).onEach {
_state.value = WorkingState(it) _state.value = WorkingState(it)
(it as? SuccessResult)?.let { (it as? SuccessResult)?.let {

View File

@@ -1,6 +1,5 @@
package no.nordicsemi.android.csc.repository package no.nordicsemi.android.csc.repository
import android.bluetooth.BluetoothDevice
import android.content.Intent import android.content.Intent
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint

View File

@@ -1,5 +1,6 @@
package no.nordicsemi.android.gls.main.view package no.nordicsemi.android.gls.main.view
import android.util.Log
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll

View File

@@ -1,5 +1,6 @@
package no.nordicsemi.android.gls.main.viewmodel package no.nordicsemi.android.gls.main.viewmodel
import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@@ -57,7 +58,7 @@ internal class GLSViewModel @Inject constructor(
} }
private fun connectDevice(device: DiscoveredBluetoothDevice) { private fun connectDevice(device: DiscoveredBluetoothDevice) {
repository.downloadData(device).onEach { repository.downloadData(viewModelScope, device).onEach {
_state.value = WorkingState(it) _state.value = WorkingState(it)
(it as? SuccessResult)?.let { (it as? SuccessResult)?.let {

View File

@@ -1,9 +1,10 @@
package no.nordicsemi.android.gls.repository package no.nordicsemi.android.gls.repository
import android.bluetooth.BluetoothDevice
import android.content.Context import android.content.Context
import android.util.Log
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.scopes.ViewModelScoped import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.callbackFlow
@@ -31,27 +32,21 @@ internal class GLSRepository @Inject constructor(
private var manager: GLSManager? = null private var manager: GLSManager? = null
private var logger: ToolboxLogger? = null private var logger: ToolboxLogger? = null
fun downloadData(device: DiscoveredBluetoothDevice): Flow<BleManagerResult<GLSData>> = callbackFlow { fun downloadData(scope: CoroutineScope, device: DiscoveredBluetoothDevice): Flow<BleManagerResult<GLSData>> = callbackFlow {
val scope = this
val createdLogger = toolboxLoggerFactory.create("GLS", device.address()).also { val createdLogger = toolboxLoggerFactory.create("GLS", device.address()).also {
logger = it logger = it
} }
val managerInstance = manager ?: GLSManager(context, scope, createdLogger).apply { val managerInstance = manager ?: GLSManager(context, scope, createdLogger)
try {
connect(device.device)
.useAutoConnect(false)
.retry(3, 100)
.suspend()
} catch (e: Exception) {
e.printStackTrace()
}
}
manager = managerInstance manager = managerInstance
managerInstance.dataHolder.status.onEach { managerInstance.dataHolder.status.onEach {
trySend(it) send(it)
}.launchIn(scope) }.launchIn(scope)
scope.launch {
managerInstance.start(device)
}
awaitClose { awaitClose {
launch { launch {
manager?.disconnect()?.suspend() manager?.disconnect()?.suspend()
@@ -61,6 +56,17 @@ internal class GLSRepository @Inject constructor(
} }
} }
private suspend fun GLSManager.start(device: DiscoveredBluetoothDevice) {
try {
connect(device.device)
.useAutoConnect(false)
.retry(3, 100)
.suspend()
} catch (e: Exception) {
e.printStackTrace()
}
}
fun openLogger() { fun openLogger() {
logger?.openLogger() logger?.openLogger()
} }