diff --git a/app/src/main/java/com/geeksville/mesh/model/MyPreferences.kt b/app/src/main/java/com/geeksville/mesh/model/MyPreferences.kt new file mode 100644 index 000000000..6573d1f41 --- /dev/null +++ b/app/src/main/java/com/geeksville/mesh/model/MyPreferences.kt @@ -0,0 +1,5 @@ +package com.geeksville.mesh.model + +object MyPreferences { + val provideLocationKey = "provide-location" +} \ No newline at end of file diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 2125b5978..20fdb0e99 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -190,6 +190,15 @@ class UIViewModel(private val app: Application) : AndroidViewModel(app), Logging val bluetoothEnabled = object : MutableLiveData(false) { } + val provideLocation = object : MutableLiveData(getPreferences(context).getBoolean(MyPreferences.provideLocationKey, false)) { + override fun setValue(value: Boolean) { + super.setValue(value) + + getPreferences(context).edit(commit = true) { + this.putBoolean(MyPreferences.provideLocationKey, value) + } + } + } /// If the app was launched because we received a new channel intent, the Url will be here var requestedChannelUrl: Uri? = null 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 6d16472f0..29b98e8eb 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -651,6 +651,9 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } binding.provideLocationCheckbox.setOnCheckedChangeListener { view, isChecked -> + // No matter what set our desired state in prefs + model.provideLocation.value = isChecked + if (view.isPressed && isChecked) { // We want to ignore changes caused by code (as opposed to the user) debug("User changed location tracking to $isChecked") view.isChecked = @@ -977,7 +980,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { scanModel.startScan() // system permissions might have changed while we were away - binding.provideLocationCheckbox.isChecked = myActivity.hasBackgroundPermission() + binding.provideLocationCheckbox.isChecked = myActivity.hasBackgroundPermission() && (model.provideLocation.value ?: false) myActivity.registerReceiver(updateProgressReceiver, updateProgressFilter) diff --git a/app/src/main/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml index e5b024ae4..fefd3e54e 100644 --- a/app/src/main/res/layout/settings_fragment.xml +++ b/app/src/main/res/layout/settings_fragment.xml @@ -145,7 +145,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:text="Provide location to mesh" + android:text="@string/provide_location_to_mesh" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/deviceRadioGroup" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e7f9e20f..ca7842553 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -115,4 +115,5 @@ location Cancel (no radio access) Allow (will show dialog) + Provide location to mesh