Skip to content
Snippets Groups Projects
Verified Commit 5f4699f8 authored by Torsten Grote's avatar Torsten Grote
Browse files

Connect UI preferences with settings backend and Tor

parent c375d22a
Branches
Tags
1 merge request!169Add setting for opting in or out of Tor bridges
......@@ -37,6 +37,7 @@ import org.briarproject.mailbox.core.lifecycle.LifecycleManager.LifecycleState
import org.briarproject.mailbox.core.settings.MetadataManager
import org.briarproject.mailbox.core.system.AndroidExecutor
import org.briarproject.mailbox.core.system.DozeWatchdog
import org.briarproject.mailbox.core.tor.TorPlugin
import org.briarproject.mailbox.core.util.LogUtils.info
import org.slf4j.LoggerFactory.getLogger
import javax.inject.Inject
......@@ -51,6 +52,7 @@ class MailboxViewModel @Inject constructor(
metadataManager: MetadataManager,
private val mailboxPreferences: MailboxPreferences,
private val androidExecutor: AndroidExecutor,
private val torPlugin: TorPlugin,
handle: SavedStateHandle,
) : AndroidViewModel(app) {
......@@ -116,6 +118,10 @@ class MailboxViewModel @Inject constructor(
MailboxService.stopService(getApplication())
}
fun onSettingsChanged() {
torPlugin.onSettingsChanged()
}
/**
* Called from the status fragment's unlink button.
*/
......
......@@ -2,18 +2,63 @@ package org.briarproject.mailbox.android.ui.settings
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreferenceCompat
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.briarproject.mailbox.R
import org.briarproject.mailbox.android.ui.MailboxViewModel
import org.briarproject.mailbox.core.settings.SettingsManager
import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_AUTO
import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE
import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_MEEK
import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_OBFS4
import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_OBFS4_DEFAULT
import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_SNOWFLAKE
import org.briarproject.mailbox.core.tor.TorConstants.BRIDGE_USE_VANILLA
import org.briarproject.mailbox.core.tor.TorConstants.SETTINGS_NAMESPACE
import javax.inject.Inject
@AndroidEntryPoint
class SettingsFragment : PreferenceFragmentCompat() {
private val viewModel: MailboxViewModel by activityViewModels()
@Inject
lateinit var settingsManager: SettingsManager
@Inject
lateinit var torSettingsStore: TorSettingsStore
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
val autoPref = findPreference<SwitchPreferenceCompat>(BRIDGE_AUTO)!!
val usePref = findPreference<SwitchPreferenceCompat>(BRIDGE_USE)!!
val snowflakePref = findPreference<SwitchPreferenceCompat>(BRIDGE_USE_SNOWFLAKE)!!
val meekPref = findPreference<SwitchPreferenceCompat>(BRIDGE_USE_MEEK)!!
val obfs4Pref = findPreference<SwitchPreferenceCompat>(BRIDGE_USE_OBFS4)!!
val obfs4DefaultPref = findPreference<SwitchPreferenceCompat>(BRIDGE_USE_OBFS4_DEFAULT)!!
val vanillaPref = findPreference<SwitchPreferenceCompat>(BRIDGE_USE_VANILLA)!!
lifecycleScope.launch(Dispatchers.IO) {
val settings = settingsManager.getSettings(SETTINGS_NAMESPACE)
withContext(Dispatchers.Main) {
// TODO get better defaults based on locations
autoPref.isChecked = settings.getBoolean(BRIDGE_AUTO, true)
usePref.isChecked = settings.getBoolean(BRIDGE_USE, false)
snowflakePref.isChecked = settings.getBoolean(BRIDGE_USE_SNOWFLAKE, false)
meekPref.isChecked = settings.getBoolean(BRIDGE_USE_MEEK, false)
obfs4Pref.isChecked = settings.getBoolean(BRIDGE_USE_OBFS4, false)
obfs4DefaultPref.isChecked = settings.getBoolean(BRIDGE_USE_OBFS4_DEFAULT, false)
vanillaPref.isChecked = settings.getBoolean(BRIDGE_USE_VANILLA, false)
preferenceManager.preferenceDataStore = torSettingsStore
}
}
}
override fun onDestroy() {
super.onDestroy()
viewModel.onSettingsChanged()
}
}
package org.briarproject.mailbox.android.ui.settings
import androidx.preference.PreferenceDataStore
import org.briarproject.mailbox.core.db.DbException
import org.briarproject.mailbox.core.lifecycle.IoExecutor
import org.briarproject.mailbox.core.settings.Settings
import org.briarproject.mailbox.core.settings.SettingsManager
import org.briarproject.mailbox.core.tor.TorConstants.SETTINGS_NAMESPACE
import org.briarproject.mailbox.core.util.LogUtils.info
import org.briarproject.mailbox.core.util.LogUtils.logDuration
import org.briarproject.mailbox.core.util.LogUtils.logException
import org.briarproject.mailbox.core.util.LogUtils.now
import org.slf4j.LoggerFactory.getLogger
import java.util.concurrent.Executor
import javax.inject.Inject
import javax.inject.Singleton
private val LOG = getLogger(SettingsStore::class.java)
@Singleton
class TorSettingsStore @Inject constructor(
settingsManager: SettingsManager,
@IoExecutor
ioExecutor: Executor,
) : SettingsStore(settingsManager, ioExecutor, SETTINGS_NAMESPACE)
/**
* This is only for storing settings. We still need to retrieve the current value ourselves.
*/
open class SettingsStore(
private val settingsManager: SettingsManager,
private val dbExecutor: Executor,
private val namespace: String,
) : PreferenceDataStore() {
override fun putBoolean(key: String, value: Boolean) {
LOG.info { "Store bool setting: $key=$value" }
val s = Settings().apply {
putBoolean(key, value)
}
storeSettings(s)
}
override fun getBoolean(key: String, defValue: Boolean): Boolean {
return settingsManager.getSettings(SETTINGS_NAMESPACE).getBoolean(key, defValue)
}
private fun storeSettings(s: Settings) {
dbExecutor.execute {
try {
val start: Long = now()
settingsManager.mergeSettings(s, namespace)
logDuration(LOG, start) { "Merging $namespace settings" }
} catch (e: DbException) {
logException(LOG, e, "Error storing settings: ")
}
}
}
}
......@@ -8,15 +8,15 @@
app:defaultValue="true"
app:disableDependentsState="true"
app:iconSpaceReserved="false"
app:key="pref_auto"
app:key="bridgeAuto"
app:summary="@string/prefs_tor_auto_summary"
app:title="@string/prefs_tor_auto_title" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:dependency="pref_auto"
app:dependency="bridgeAuto"
app:iconSpaceReserved="false"
app:key="pref_use_bridges"
app:key="bridgeUse"
app:title="@string/prefs_tor_bridges_title" />
</PreferenceCategory>
......@@ -27,37 +27,37 @@
<SwitchPreferenceCompat
app:defaultValue="false"
app:dependency="pref_use_bridges"
app:dependency="bridgeUse"
app:iconSpaceReserved="false"
app:key="pref_bridges_snowflake"
app:key="bridgeUseSnowflake"
app:title="@string/prefs_bridges_snowflake_title" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:dependency="pref_use_bridges"
app:dependency="bridgeUse"
app:iconSpaceReserved="false"
app:key="pref_bridges_meek"
app:key="bridgeUseMeek"
app:title="@string/prefs_bridges_meek_title" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:dependency="pref_use_bridges"
app:dependency="bridgeUse"
app:iconSpaceReserved="false"
app:key="pref_bridges_obfs4"
app:key="bridgeUseObfs4"
app:title="@string/prefs_bridges_obfs4_title" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:dependency="pref_use_bridges"
app:dependency="bridgeUse"
app:iconSpaceReserved="false"
app:key="pref_bridges_obfs_builtin"
app:key="bridgeUseObfs4Default"
app:title="@string/prefs_bridges_obfs_builtin_title" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:dependency="pref_use_bridges"
app:dependency="bridgeUse"
app:iconSpaceReserved="false"
app:key="pref_bridges_vanilla"
app:key="bridgeUseVanilla"
app:title="@string/prefs_bridges_vanilla_title" />
</PreferenceCategory>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment