Bug 1868453 - Wrap the debug setting data store with an interface

fenix/122.0
Noah Bond 6 months ago committed by mergify[bot]
parent 389f7369e1
commit ceeffadbcd

@ -101,8 +101,7 @@ import org.mozilla.fenix.components.metrics.BreadcrumbsRecorder
import org.mozilla.fenix.components.metrics.GrowthDataWorker
import org.mozilla.fenix.components.metrics.fonts.FontEnumerationWorker
import org.mozilla.fenix.databinding.ActivityHomeBinding
import org.mozilla.fenix.debugsettings.data.debugDrawerEnabled
import org.mozilla.fenix.debugsettings.data.debugSettings
import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository
import org.mozilla.fenix.debugsettings.ui.DebugOverlay
import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExceptionsFragmentDirections
import org.mozilla.fenix.experiments.ResearchSurfaceDialogFragment
@ -287,7 +286,12 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
if (Config.channel.isNightlyOrDebug) {
lifecycleScope.launch {
debugSettings.debugDrawerEnabled
val debugSettingsRepository = DefaultDebugSettingsRepository(
context = this@HomeActivity,
writeScope = this,
)
debugSettingsRepository.debugDrawerEnabled
.distinctUntilChanged()
.collect { enabled ->
with(binding.debugOverlay) {

@ -1,40 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.debugsettings.data
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
/**
* [DataStore] for accessing debugging settings.
*/
val Context.debugSettings: DataStore<Preferences> by preferencesDataStore(name = "debug_settings")
private val DEBUG_DRAWER_ENABLED = booleanPreferencesKey("debug_drawer_enabled")
/**
* Updates whether the debug drawer is enabled.
*
* @param enabled Whether the debug drawer is enabled.
*/
suspend fun DataStore<Preferences>.updateDebugDrawerEnabled(enabled: Boolean) {
edit { preferences ->
preferences[DEBUG_DRAWER_ENABLED] = enabled
}
}
/**
* [Flow] for checking whether the Debug Drawer is enabled.
*/
val DataStore<Preferences>.debugDrawerEnabled: Flow<Boolean>
get() = data.map { preferences ->
preferences[DEBUG_DRAWER_ENABLED] ?: false
}

@ -0,0 +1,68 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.debugsettings.data
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
/**
* [DataStore] for accessing debugging settings.
*/
private val Context.debugSettings: DataStore<Preferences> by preferencesDataStore(name = "debug_settings")
private val debugDrawerEnabledKey = booleanPreferencesKey("debug_drawer_enabled")
/**
* Cache for accessing any settings related to debugging.
*/
interface DebugSettingsRepository {
/**
* [Flow] for checking whether the Debug Drawer is enabled.
*/
val debugDrawerEnabled: Flow<Boolean>
/**
* Updates whether the debug drawer is enabled.
*
* @param enabled Whether the debug drawer is enabled.
*/
fun setDebugDrawerEnabled(enabled: Boolean)
}
/**
* The default implementation of [DebugSettingsRepository].
*
* @param context Android context used to obtain the underlying [DataStore].
* @param dataStore [DataStore] for accessing debugging settings.
* @param writeScope [CoroutineScope] used for writing settings changes to disk.
*/
class DefaultDebugSettingsRepository(
context: Context,
private val dataStore: DataStore<Preferences> = context.debugSettings,
private val writeScope: CoroutineScope,
) : DebugSettingsRepository {
override val debugDrawerEnabled: Flow<Boolean> =
dataStore.data.map { preferences ->
preferences[debugDrawerEnabledKey] ?: false
}
override fun setDebugDrawerEnabled(enabled: Boolean) {
writeScope.launch {
dataStore.edit { preferences ->
preferences[debugDrawerEnabledKey] = enabled
}
}
}
}

@ -18,9 +18,7 @@ import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.Config
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.R
import org.mozilla.fenix.debugsettings.data.debugDrawerEnabled
import org.mozilla.fenix.debugsettings.data.debugSettings
import org.mozilla.fenix.debugsettings.data.updateDebugDrawerEnabled
import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.settings
@ -34,6 +32,11 @@ class SecretSettingsFragment : PreferenceFragmentCompat() {
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
val debugSettingsRepository = DefaultDebugSettingsRepository(
context = requireContext(),
writeScope = lifecycleScope,
)
setPreferencesFromResource(R.xml.secret_settings_preferences, rootKey)
requirePreference<SwitchPreference>(R.string.pref_key_allow_third_party_root_certs).apply {
@ -105,17 +108,13 @@ class SecretSettingsFragment : PreferenceFragmentCompat() {
}
lifecycleScope.launch {
val debugDataStore = requireContext().debugSettings
// During initial development, this will only be available in Nightly or Debug builds.
requirePreference<SwitchPreference>(R.string.pref_key_enable_debug_drawer).apply {
isVisible = Config.channel.isNightlyOrDebug
isChecked = debugDataStore.debugDrawerEnabled.first()
isChecked = debugSettingsRepository.debugDrawerEnabled.first()
onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { _, newValue ->
lifecycleScope.launch {
debugDataStore.updateDebugDrawerEnabled(enabled = newValue as Boolean)
}
debugSettingsRepository.setDebugDrawerEnabled(enabled = newValue as Boolean)
true
}
}

@ -0,0 +1,62 @@
package org.mozilla.fenix.debugsettings
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.preferencesDataStore
import androidx.test.ext.junit.runners.AndroidJUnit4
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.test.runTest
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository
private val Context.testDataStore: DataStore<Preferences> by preferencesDataStore(name = "DefaultDebugSettingsRepositoryTest")
@RunWith(AndroidJUnit4::class)
class DefaultDebugSettingsRepositoryTest {
@Test
fun `GIVEN the debug drawer is disabled WHEN the flag is enabled THEN the store should emit true`() = runTest {
val dataStore = testContext.testDataStore
val defaultDebugSettingsRepository = DefaultDebugSettingsRepository(
context = testContext,
dataStore = dataStore,
writeScope = this,
)
val expected = listOf(false, false, true) // First emit is from initialization
val expectedEmitCount = expected.size
defaultDebugSettingsRepository.setDebugDrawerEnabled(false)
defaultDebugSettingsRepository.setDebugDrawerEnabled(true)
assertEquals(expected, defaultDebugSettingsRepository.debugDrawerEnabled.take(expectedEmitCount).toList())
dataStore.edit { it.clear() }
}
@Test
fun `GIVEN the debug drawer is enabled WHEN the flag is disabled THEN the store should emit false`() = runTest {
val dataStore = testContext.testDataStore
val defaultDebugSettingsRepository = DefaultDebugSettingsRepository(
context = testContext,
dataStore = dataStore,
writeScope = this,
)
val expected = listOf(false, true, false) // First emit is from initialization
val expectedEmitCount = expected.size
defaultDebugSettingsRepository.setDebugDrawerEnabled(true)
defaultDebugSettingsRepository.setDebugDrawerEnabled(false)
assertEquals(expected, defaultDebugSettingsRepository.debugDrawerEnabled.take(expectedEmitCount).toList())
dataStore.edit { it.clear() }
}
}
Loading…
Cancel
Save