diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsEvents.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsEvents.kt new file mode 100644 index 00000000..a98ac589 --- /dev/null +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsEvents.kt @@ -0,0 +1,5 @@ +package eu.darken.capod.main.ui.settings.general + +sealed class GeneralSettingsEvents { + object SelectDeviceAddressEvent : GeneralSettingsEvents() +} diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsFragment.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsFragment.kt index 15fbe7d9..15e74b68 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsFragment.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsFragment.kt @@ -61,6 +61,13 @@ class GeneralSettingsFragment : PreferenceFragment3() { true } } + + vm.events.observe2 { + when (it) { + GeneralSettingsEvents.SelectDeviceAddressEvent -> mainDeviceAddressPref.performClick() + } + } + mainDeviceModelPref.setOnPreferenceClickListener { val dialog = ModelSelectionDialogFactory(requireContext()).create( PodDevice.Model.values().toList(), diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsFragmentVM.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsFragmentVM.kt index f5131f91..907a17e3 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsFragmentVM.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsFragmentVM.kt @@ -5,21 +5,41 @@ import dagger.hilt.android.lifecycle.HiltViewModel import eu.darken.capod.common.bluetooth.BluetoothManager2 import eu.darken.capod.common.coroutine.DispatcherProvider import eu.darken.capod.common.debug.logging.logTag +import eu.darken.capod.common.flow.withPrevious +import eu.darken.capod.common.livedata.SingleLiveEvent import eu.darken.capod.common.uix.ViewModel3 +import eu.darken.capod.main.core.GeneralSettings +import eu.darken.capod.main.core.MonitorMode +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach import javax.inject.Inject @HiltViewModel class GeneralSettingsFragmentVM @Inject constructor( - private val handle: SavedStateHandle, - private val dispatcherProvider: DispatcherProvider, - private val bluetoothManager: BluetoothManager2, + @Suppress("unused") private val handle: SavedStateHandle, + dispatcherProvider: DispatcherProvider, + bluetoothManager: BluetoothManager2, + private val generalSettings: GeneralSettings, ) : ViewModel3(dispatcherProvider) { val bondedDevices = bluetoothManager.bondedDevices() .map { it.toList() } .asLiveData2() + val events = SingleLiveEvent() + + init { + + generalSettings.monitorMode.flow + .withPrevious() + .filter { (old, new) -> + old != new && new == MonitorMode.AUTOMATIC && generalSettings.mainDeviceAddress.value == null + } + .onEach { events.postValue(GeneralSettingsEvents.SelectDeviceAddressEvent) } + .launchInViewModel() + } + companion object { private val TAG = logTag("Settings", "General", "VM") } diff --git a/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt b/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt index 12fc8e32..1c46de3f 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt @@ -1,6 +1,7 @@ package eu.darken.capod.monitor.core.worker import android.app.NotificationManager +import android.bluetooth.BluetoothDevice import android.content.Context import androidx.hilt.work.HiltWorker import androidx.work.CoroutineWorker @@ -114,21 +115,27 @@ class MonitorWorker @AssistedInject constructor( } .launchIn(workerScope) - generalSettings.monitorMode.flow - .flatMapLatest { monitorMode -> - val missingPermsFlow = permissionTool.missingPermissions.first() + permissionTool.missingPermissions + .flatMapLatest { missingPermsFlow -> if (missingPermsFlow.isNotEmpty()) { - log(TAG, WARN) { "Aborting, permissions are missing for $monitorMode: $missingPermsFlow" } + log(TAG, WARN) { "Aborting, permissions are missing: $missingPermsFlow" } workerScope.coroutineContext.cancelChildren() return@flatMapLatest emptyFlow() } - - bluetoothManager.connectedDevices().map { knownDevices -> - monitorMode to knownDevices + combine( + generalSettings.monitorMode.flow, + generalSettings.mainDeviceAddress.flow, + bluetoothManager.connectedDevices(), + ) { monitorMode, mainAddress, connectedDevices -> + listOf(monitorMode, mainAddress, connectedDevices) } } .setupCommonEventHandlers(TAG) { "MonitorMode" } - .flatMapLatest { (monitorMode, devices) -> + .flatMapLatest { arguments -> + val monitorMode = arguments[0] as MonitorMode + val mainAddress = arguments[1] as String? + val devices = arguments[2] as Collection + log(TAG) { "Monitor mode: $monitorMode" } when (monitorMode) { MonitorMode.MANUAL -> flow { @@ -137,15 +144,20 @@ class MonitorWorker @AssistedInject constructor( } MonitorMode.ALWAYS -> emptyFlow() MonitorMode.AUTOMATIC -> flow { - val mainAddress = generalSettings.mainDeviceAddress.value - if (devices.any { it.address == mainAddress }) { - log(TAG) { "MainDevice is connected ($mainAddress), aborting any timeout." } - } else { - log(TAG) { "No Pods are connected, canceling worker soon." } - delay(15 * 1000) - log(TAG) { "Canceling worker now, still no Pods connected." } + when { + mainAddress == null && devices.isNotEmpty() -> { + log(TAG, WARN) { "Main device address not set, staying alive while any is connected" } + } + devices.any { it.address == mainAddress } -> { + log(TAG) { "MainDevice is connected ($mainAddress), aborting any timeout." } + } + else -> { + log(TAG) { "No known Pods are connected, canceling worker soon." } + delay(15 * 1000) + log(TAG) { "Canceling worker now, still no Pods connected." } - workerScope.coroutineContext.cancelChildren() + workerScope.coroutineContext.cancelChildren() + } } } }