diff --git a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt index ae4ac1bd5..834c40889 100644 --- a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt @@ -93,6 +93,10 @@ class BTScanModel @Inject constructor( private val context: Context get() = application.applicationContext init { + bluetoothRepository.state.value.bondedDevices.onEach { + setupScan() // TODO clean up device list updates + }.launchIn(viewModelScope) + debug("BTScanModel created") } diff --git a/app/src/main/java/com/geeksville/mesh/repository/bluetooth/BluetoothRepository.kt b/app/src/main/java/com/geeksville/mesh/repository/bluetooth/BluetoothRepository.kt index 6d86f6a7a..ad80a13ef 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/bluetooth/BluetoothRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/bluetooth/BluetoothRepository.kt @@ -13,7 +13,6 @@ import com.geeksville.mesh.android.hasBluetoothPermission import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @@ -95,19 +94,13 @@ class BluetoothRepository @Inject constructor( * Creates a cold Flow used to obtain the set of bonded devices. */ @SuppressLint("MissingPermission") // Already checked prior to calling - private suspend fun createBondedDevicesFlow(adapter: BluetoothAdapter): Flow>? { - return if (adapter.isEnabled) { - flow> { - withContext(dispatchers.default) { - while (true) { - emit(adapter.bondedDevices) - delay(REFRESH_DELAY_MS) - } - } - }.flowOn(dispatchers.default) - } else { - null - } + private suspend fun createBondedDevicesFlow(adapter: BluetoothAdapter): Flow> { + return flow> { + while (true) { + emit(adapter.bondedDevices ?: emptySet()) + delay(REFRESH_DELAY_MS) + } + }.flowOn(dispatchers.default).distinctUntilChanged() } companion object { diff --git a/app/src/main/java/com/geeksville/mesh/repository/bluetooth/BluetoothState.kt b/app/src/main/java/com/geeksville/mesh/repository/bluetooth/BluetoothState.kt index 895afc9d9..579c575f4 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/bluetooth/BluetoothState.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/bluetooth/BluetoothState.kt @@ -2,6 +2,7 @@ package com.geeksville.mesh.repository.bluetooth import android.bluetooth.BluetoothDevice import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf /** * A snapshot in time of the state of the bluetooth subsystem. @@ -12,5 +13,5 @@ data class BluetoothState( /** If we have adequate permissions and bluetooth is enabled */ val enabled: Boolean = false, /** If enabled, a cold flow of the currently bonded devices */ - val bondedDevices: Flow>? = null + val bondedDevices: Flow> = flowOf(emptySet()) ) diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index 57eec136e..6aab4fed0 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -290,10 +290,6 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { regionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) spinner.adapter = regionAdapter - bluetoothViewModel.enabled.observe(viewLifecycleOwner) { enabled -> - if (enabled) scanModel.setupScan() - } - model.ownerName.observe(viewLifecycleOwner) { name -> binding.usernameEditText.isEnabled = !name.isNullOrEmpty() binding.usernameEditText.setText(name)