From a434a0bee0e99ee1a22aad796260b71e16c28e18 Mon Sep 17 00:00:00 2001 From: darken Date: Tue, 3 Jun 2025 23:14:03 +0200 Subject: [PATCH] Disable encryption key setting if no identity key The encryption key setting for the main device is now disabled if the identity key is not set. This prevents users from trying to set an encryption key for a device that doesn't have an identity key. --- .../general/GeneralSettingsFragment.kt | 7 +++--- .../general/GeneralSettingsFragmentVM.kt | 23 +++++++++++++++---- app/src/main/res/xml/preferences_general.xml | 1 + 3 files changed, 23 insertions(+), 8 deletions(-) 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 a3564f74..c1340c80 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 @@ -76,17 +76,18 @@ class GeneralSettingsFragment : PreferenceFragment3() { private fun String.fromHumanReadable(): ByteArray = split("-").map { it.toInt(16).toByte() }.toByteArray() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - vm.bondedDevices.observe2 { devices -> + vm.state.observe2 { state -> mainDeviceAddressPref.setOnPreferenceClickListener { val dialog = DeviceSelectionDialogFactory(requireContext()).create( - devices, - devices.firstOrNull { it.address == generalSettings.mainDeviceAddress.value } + state.devices, + state.devices.firstOrNull { it.address == generalSettings.mainDeviceAddress.value } ) { selected -> generalSettings.mainDeviceAddress.value = selected?.address } dialog.show() true } + mainDeviceEncryptionKeyPref.isEnabled = state.hasIdentityKey } vm.events.observe2 { 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 a842d0bd..16da29c7 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 @@ -2,6 +2,7 @@ package eu.darken.capod.main.ui.settings.general import androidx.lifecycle.SavedStateHandle import dagger.hilt.android.lifecycle.HiltViewModel +import eu.darken.capod.common.bluetooth.BluetoothDevice2 import eu.darken.capod.common.bluetooth.BluetoothManager2 import eu.darken.capod.common.coroutine.DispatcherProvider import eu.darken.capod.common.debug.logging.logTag @@ -10,9 +11,10 @@ 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.combine import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.onStart import javax.inject.Inject @HiltViewModel @@ -23,10 +25,6 @@ class GeneralSettingsFragmentVM @Inject constructor( private val generalSettings: GeneralSettings, ) : ViewModel3(dispatcherProvider) { - val bondedDevices = bluetoothManager.bondedDevices() - .map { it.toList() } - .asLiveData2() - val events = SingleLiveEvent() init { @@ -39,6 +37,21 @@ class GeneralSettingsFragmentVM @Inject constructor( .launchInViewModel() } + val state = combine( + bluetoothManager.bondedDevices().onStart { emit(emptySet()) }, + generalSettings.mainDeviceIdentityKey.flow + ) { bondedDevices, identityKey -> + State( + devices = bondedDevices.toList(), + hasIdentityKey = identityKey != null + ) + }.asLiveData2() + + data class State( + val devices: List, + val hasIdentityKey: Boolean + ) + companion object { private val TAG = logTag("Settings", "General", "VM") } diff --git a/app/src/main/res/xml/preferences_general.xml b/app/src/main/res/xml/preferences_general.xml index ff5fe7a5..e0a3fdd4 100644 --- a/app/src/main/res/xml/preferences_general.xml +++ b/app/src/main/res/xml/preferences_general.xml @@ -51,6 +51,7 @@