Add Wi-Fi and adaptive mobile network (5G PM) toggle event in Adaptive Connectivity UX
Bug: 393645580
Flag: com.android.settings.flags.enable_nested_toggle_switches
Test: Manual testing
atest AdaptiveConnectivityScreenTest
atest AdaptiveMobileNetworkTogglePreferenceTest
atest WifiScorerTogglePreferenceTest
Change-Id: Ic3b8e4aca5e2096b4e94aed10cd516c3f94e48c1
diff --git a/src/com/android/settings/network/AdaptiveConnectivityScreen.kt b/src/com/android/settings/network/AdaptiveConnectivityScreen.kt
index 829ec8d..8d3878d 100644
--- a/src/com/android/settings/network/AdaptiveConnectivityScreen.kt
+++ b/src/com/android/settings/network/AdaptiveConnectivityScreen.kt
@@ -37,6 +37,10 @@
override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) {
+AdaptiveConnectivityTogglePreference()
+ if (Flags.enableNestedToggleSwitches()) {
+ +WifiScorerTogglePreference()
+ +AdaptiveMobileNetworkTogglePreference()
+ }
}
override fun hasCompleteHierarchy() = false
@@ -44,4 +48,4 @@
companion object {
const val KEY = "adaptive_connectivity"
}
-}
+}
\ No newline at end of file
diff --git a/src/com/android/settings/network/AdaptiveConnectivitySettings.java b/src/com/android/settings/network/AdaptiveConnectivitySettings.java
index a099d79..20bb73a 100644
--- a/src/com/android/settings/network/AdaptiveConnectivitySettings.java
+++ b/src/com/android/settings/network/AdaptiveConnectivitySettings.java
@@ -15,9 +15,14 @@
*/
package com.android.settings.network;
+import static android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED;
+import static android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_WIFI_ENABLED;
+
import android.app.settings.SettingsEnums;
import android.content.Context;
+import android.net.wifi.WifiManager;
import android.os.Bundle;
+import android.provider.Settings;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -31,12 +36,7 @@
/** Adaptive connectivity is a feature which automatically manages network connections. */
@SearchIndexable
public class AdaptiveConnectivitySettings extends DashboardFragment {
-
private static final String TAG = "AdaptiveConnectivitySettings";
- protected static final String ADAPTIVE_CONNECTIVITY_WIFI_ENABLED =
- "adaptive_connectivity_wifi_enabled";
- protected static final String ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED =
- "adaptive_connectivity_mobile_network_enabled";
@Override
public int getMetricsCategory() {
@@ -65,16 +65,25 @@
public void onCreatePreferences(@NonNull Bundle savedInstanceState, @NonNull String rootKey) {
Log.i("Settings", "onCreatePreferences");
super.onCreatePreferences(savedInstanceState, rootKey);
- if (Flags.enableNestedToggleSwitches()) {
- setSwitchVisibility(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED, true);
- setSwitchVisibility(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED, true);
+ if (Flags.enableNestedToggleSwitches() && !isCatalystEnabled()) {
+ setupSwitchPreferenceCompat(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED);
+ setupSwitchPreferenceCompat(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED);
}
}
- private void setSwitchVisibility(String key, boolean isVisible) {
+ private void setupSwitchPreferenceCompat(String key) {
SwitchPreferenceCompat switchPreference = findPreference(key);
if (switchPreference != null) {
- switchPreference.setVisible(isVisible);
+ switchPreference.setOnPreferenceChangeListener(
+ (preference, newValue) -> {
+ boolean isChecked = (Boolean) newValue;
+ Settings.Secure.putInt(getContentResolver(), key, isChecked ? 1 : 0);
+ if (preference.getKey().equals(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED)) {
+ getSystemService(WifiManager.class).setWifiScoringEnabled(isChecked);
+ }
+ return true;
+ });
+ switchPreference.setVisible(true);
}
}
}
diff --git a/src/com/android/settings/network/AdaptiveMobileNetworkTogglePreference.kt b/src/com/android/settings/network/AdaptiveMobileNetworkTogglePreference.kt
new file mode 100644
index 0000000..2b6ec91
--- /dev/null
+++ b/src/com/android/settings/network/AdaptiveMobileNetworkTogglePreference.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network
+
+import android.app.settings.SettingsEnums.ACTION_ADAPTIVE_CONNECTIVITY
+import android.content.Context
+import android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED
+import com.android.settings.R
+import com.android.settings.contract.KEY_ADAPTIVE_CONNECTIVITY
+import com.android.settings.metrics.PreferenceActionMetricsProvider
+import com.android.settingslib.datastore.KeyValueStore
+import com.android.settingslib.datastore.KeyValueStoreDelegate
+import com.android.settingslib.datastore.SettingsSecureStore
+import com.android.settingslib.datastore.SettingsStore
+import com.android.settingslib.metadata.ReadWritePermit
+import com.android.settingslib.metadata.SensitivityLevel
+import com.android.settingslib.metadata.SwitchPreference
+
+class AdaptiveMobileNetworkTogglePreference() :
+ SwitchPreference(
+ KEY,
+ R.string.adaptive_connectivity_mobile_network_switch_title,
+ ),
+ PreferenceActionMetricsProvider {
+
+ override val preferenceActionMetrics: Int
+ get() = ACTION_ADAPTIVE_CONNECTIVITY
+
+ override val key: String
+ get() = KEY
+
+ override fun tags(context: Context) = arrayOf(KEY_ADAPTIVE_CONNECTIVITY)
+
+ override fun storage(context: Context): KeyValueStore =
+ AdaptiveMobileNetworkToggleStorage(context)
+
+ override fun getReadPermissions(context: Context) = SettingsSecureStore.getReadPermissions()
+
+ override fun getWritePermissions(context: Context) = SettingsSecureStore.getWritePermissions()
+
+ override fun getReadPermit(context: Context, callingPid: Int, callingUid: Int) =
+ ReadWritePermit.ALLOW
+
+ override fun getWritePermit(
+ context: Context,
+ value: Boolean?,
+ callingPid: Int,
+ callingUid: Int,
+ ) = ReadWritePermit.ALLOW
+
+ override val sensitivityLevel
+ get() = SensitivityLevel.NO_SENSITIVITY
+
+ @Suppress("UNCHECKED_CAST")
+ private class AdaptiveMobileNetworkToggleStorage(
+ private val context: Context,
+ private val settingsStore: SettingsStore = SettingsSecureStore.get(context),
+ ) : KeyValueStoreDelegate {
+
+ override val keyValueStoreDelegate
+ get() = settingsStore
+
+ override fun <T : Any> getDefaultValue(key: String, valueType: Class<T>) =
+ DEFAULT_VALUE as T
+
+ override fun <T : Any> setValue(key: String, valueType: Class<T>, value: T?) {
+ settingsStore.setValue(key, valueType, value)
+ }
+ }
+
+ companion object {
+ const val KEY = ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED
+ const val DEFAULT_VALUE = true
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/network/WifiScorerTogglePreference.kt b/src/com/android/settings/network/WifiScorerTogglePreference.kt
new file mode 100644
index 0000000..b94f621
--- /dev/null
+++ b/src/com/android/settings/network/WifiScorerTogglePreference.kt
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network
+
+import android.Manifest
+import android.app.settings.SettingsEnums.ACTION_ADAPTIVE_CONNECTIVITY
+import android.content.Context
+import android.net.wifi.WifiManager
+import android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_WIFI_ENABLED
+import androidx.annotation.RequiresPermission
+import com.android.settings.R
+import com.android.settings.contract.KEY_ADAPTIVE_CONNECTIVITY
+import com.android.settings.metrics.PreferenceActionMetricsProvider
+import com.android.settingslib.datastore.KeyValueStore
+import com.android.settingslib.datastore.KeyValueStoreDelegate
+import com.android.settingslib.datastore.SettingsSecureStore
+import com.android.settingslib.datastore.SettingsStore
+import com.android.settingslib.datastore.and
+import com.android.settingslib.metadata.ReadWritePermit
+import com.android.settingslib.metadata.SensitivityLevel
+import com.android.settingslib.metadata.SwitchPreference
+
+class WifiScorerTogglePreference() :
+ SwitchPreference(
+ KEY,
+ R.string.adaptive_connectivity_wifi_switch_title
+ ),
+ PreferenceActionMetricsProvider {
+
+ override val preferenceActionMetrics: Int
+ get() = ACTION_ADAPTIVE_CONNECTIVITY
+
+ override val key: String
+ get() = KEY
+
+ override fun tags(context: Context) = arrayOf(KEY_ADAPTIVE_CONNECTIVITY)
+
+ override fun storage(context: Context): KeyValueStore =
+ WifiScorerToggleStorage(context)
+
+ override fun getReadPermissions(context: Context) = SettingsSecureStore.getReadPermissions()
+
+ override fun getWritePermissions(context: Context) =
+ SettingsSecureStore.getWritePermissions() and Manifest.permission.NETWORK_SETTINGS
+
+ override fun getReadPermit(context: Context, callingPid: Int, callingUid: Int) =
+ ReadWritePermit.ALLOW
+
+ override fun getWritePermit(
+ context: Context,
+ value: Boolean?,
+ callingPid: Int,
+ callingUid: Int,
+ ) = ReadWritePermit.ALLOW
+
+ override val sensitivityLevel
+ get() = SensitivityLevel.NO_SENSITIVITY
+
+ @Suppress("UNCHECKED_CAST")
+ private class WifiScorerToggleStorage(
+ private val context: Context,
+ private val settingsStore: SettingsStore = SettingsSecureStore.get(context),
+ ) : KeyValueStoreDelegate {
+
+ override val keyValueStoreDelegate
+ get() = settingsStore
+
+ override fun <T : Any> getDefaultValue(key: String, valueType: Class<T>) =
+ DEFAULT_VALUE as T
+
+ @RequiresPermission(Manifest.permission.NETWORK_SETTINGS)
+ override fun <T : Any> setValue(key: String, valueType: Class<T>, value: T?) {
+ settingsStore.setValue(key, valueType, value)
+ context
+ .getSystemService(WifiManager::class.java)
+ ?.setWifiScoringEnabled(
+ (value as Boolean?)
+ ?: DEFAULT_VALUE
+ )
+ }
+ }
+
+ companion object {
+ const val KEY = ADAPTIVE_CONNECTIVITY_WIFI_ENABLED
+ const val DEFAULT_VALUE = true
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityScreenTest.kt b/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityScreenTest.kt
index 2b3173a..53f37c9 100644
--- a/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityScreenTest.kt
+++ b/tests/robotests/src/com/android/settings/network/AdaptiveConnectivityScreenTest.kt
@@ -16,11 +16,18 @@
package com.android.settings.network
+import android.content.Context
+import android.platform.test.annotations.EnableFlags
+import android.provider.Settings
+import android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_ENABLED
+import android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED
+import android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_WIFI_ENABLED
+import androidx.fragment.app.testing.launchFragmentInContainer
import androidx.preference.SwitchPreferenceCompat
+import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.flags.Flags
-import com.android.settings.network.AdaptiveConnectivitySettings.ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED
-import com.android.settings.network.AdaptiveConnectivitySettings.ADAPTIVE_CONNECTIVITY_WIFI_ENABLED
+import com.android.settingslib.metadata.PreferenceHierarchy
import com.android.settingslib.preference.CatalystScreenTestCase
import com.google.common.truth.Truth.assertThat
import org.junit.Test
@@ -28,11 +35,12 @@
@Suppress("DEPRECATION")
@RunWith(AndroidJUnit4::class)
-class AdaptiveConnectivityScreenTest : CatalystScreenTestCase() {
+class AdaptiveConnectivityScreenTest() : CatalystScreenTestCase() {
override val preferenceScreenCreator = AdaptiveConnectivityScreen()
override val flagName
get() = Flags.FLAG_CATALYST_ADAPTIVE_CONNECTIVITY
-
+ private lateinit var fragment: AdaptiveConnectivitySettings
+ private val mContext: Context = ApplicationProvider.getApplicationContext()
override fun migration() {}
@Test
@@ -41,21 +49,121 @@
}
@Test
- fun flagDefaultDisabled_noSwitchPreferenceCompatExists() {
- // create fragment
- val fragment: AdaptiveConnectivitySettings =
- preferenceScreenCreator.fragmentClass().newInstance()
- // check if switch preference exists
- assertSwitchPreferenceCompatIsNull(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED, fragment)
- assertSwitchPreferenceCompatIsNull(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED, fragment)
+ fun getPreferenceHierarchy_returnsHierarchy() {
+ val hierarchy: PreferenceHierarchy =
+ preferenceScreenCreator.getPreferenceHierarchy(mContext)
+ (appContext)
+ assertThat(hierarchy.find(ADAPTIVE_CONNECTIVITY_ENABLED)).isNotNull()
+ assertThat(hierarchy.find(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED)).isNull()
+ assertThat(hierarchy.find(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED)).isNull()
}
- private fun assertSwitchPreferenceCompatIsNull(
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_NESTED_TOGGLE_SWITCHES)
+ fun getPreferenceHierarchy_flagEnabled_returnsHierarchyWithNestedToggle() {
+ val hierarchy: PreferenceHierarchy =
+ preferenceScreenCreator.getPreferenceHierarchy(mContext)
+ (appContext)
+ assertThat(hierarchy.find(ADAPTIVE_CONNECTIVITY_ENABLED)).isNotNull()
+ assertThat(hierarchy.find(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED)).isNotNull()
+ assertThat(hierarchy.find(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED)).isNotNull()
+
+ }
+
+ @Test
+ fun flagDefaultDisabled_noSwitchPreferenceCompatExists() {
+ val scenario = launchFragmentInContainer<AdaptiveConnectivitySettings>()
+ scenario.onFragment { fragment ->
+ this.fragment = fragment
+ assertSwitchPreferenceCompatVisibility(
+ ADAPTIVE_CONNECTIVITY_WIFI_ENABLED, fragment,
+ false
+ )
+ assertSwitchPreferenceCompatVisibility(
+ ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED,
+ fragment,
+ false
+ )
+ }
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_NESTED_TOGGLE_SWITCHES)
+ fun flagEnabled_switchPreferenceCompatExists() {
+ val scenario = launchFragmentInContainer<AdaptiveConnectivitySettings>()
+ scenario.onFragment { fragment ->
+ this.fragment = fragment
+ assertSwitchPreferenceCompatVisibility(
+ ADAPTIVE_CONNECTIVITY_WIFI_ENABLED, fragment,
+ true
+ )
+ assertSwitchPreferenceCompatVisibility(
+ ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED,
+ fragment,
+ true
+ )
+ }
+ }
+
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_NESTED_TOGGLE_SWITCHES)
+ fun flagEnabled_onWifiScorerSwitchClick_shouldUpdateSetting() {
+ val scenario = launchFragmentInContainer<AdaptiveConnectivitySettings>()
+ scenario.onFragment { fragment: AdaptiveConnectivitySettings ->
+ this.fragment = fragment
+ val switchPreference =
+ fragment.findPreference<SwitchPreferenceCompat>(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED)
+ assertThat(switchPreference?.isChecked).isTrue()
+ switchPreference?.performClick()
+ assertThat(switchPreference?.isChecked).isFalse()
+ assertThat(updateSetting(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED)).isFalse()
+ switchPreference?.performClick()
+ assertThat(switchPreference?.isChecked).isTrue()
+ assertThat(updateSetting(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED)).isTrue()
+ }
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ENABLE_NESTED_TOGGLE_SWITCHES)
+ fun flagEnabled_onAdaptiveMobileNetworkSwitchClick_shouldUpdateSetting() {
+ val scenario = launchFragmentInContainer<AdaptiveConnectivitySettings>()
+ scenario.onFragment { fragment: AdaptiveConnectivitySettings ->
+ this.fragment = fragment
+ val switchPreference =
+ fragment.findPreference<SwitchPreferenceCompat>(
+ ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED
+ )
+ assertThat(switchPreference?.isChecked).isTrue()
+ switchPreference?.performClick()
+ assertThat(switchPreference?.isChecked).isFalse()
+ assertThat(updateSetting(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED)).isFalse()
+ switchPreference?.performClick()
+ assertThat(switchPreference?.isChecked).isTrue()
+ assertThat(updateSetting(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED)).isTrue()
+ }
+ }
+
+ /**
+ * Helper function to get the setting value from Settings.Secure.
+ *
+ * @param key the key of the setting to get.
+ */
+ private fun updateSetting(key: String): Boolean {
+ return (Settings.Secure.getInt(
+ mContext.contentResolver,
+ key,
+ 0
+ ) == 1)
+ }
+
+ private fun assertSwitchPreferenceCompatVisibility(
key: String,
- fragment: AdaptiveConnectivitySettings
+ fragment: AdaptiveConnectivitySettings,
+ isVisible: Boolean
) {
val switchPreference = fragment.findPreference<SwitchPreferenceCompat>(key)
- assertThat(switchPreference).isNull()
+ assertThat(switchPreference?.isVisible).isEqualTo(isVisible)
}
}
diff --git a/tests/robotests/src/com/android/settings/network/AdaptiveMobileNetworkTogglePreferenceTest.kt b/tests/robotests/src/com/android/settings/network/AdaptiveMobileNetworkTogglePreferenceTest.kt
new file mode 100644
index 0000000..6b2b7dd
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/AdaptiveMobileNetworkTogglePreferenceTest.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network
+
+import android.content.Context
+import android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED
+import androidx.preference.SwitchPreferenceCompat
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.preference.createAndBindWidget
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class AdaptiveMobileNetworkTogglePreferenceTest {
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val adaptiveMobileNetworkTogglePreference = AdaptiveMobileNetworkTogglePreference()
+
+ @Test
+ fun switchClick_defaultDisabled_returnFalse() {
+ setAdaptiveMobileNetworkEnabled(false)
+
+ assertThat(getSwitchPreference().isChecked).isFalse()
+ }
+
+ @Test
+ fun switchClick_defaultEnabled_returnTrue() {
+ setAdaptiveMobileNetworkEnabled(true)
+
+ assertThat(getSwitchPreference().isChecked).isTrue()
+ }
+
+ @Test
+ fun setChecked_defaultEnabled_updatesCorrectly() {
+ val preference = getSwitchPreference()
+ assertThat(preference.isChecked).isTrue()
+
+ preference.performClick()
+
+ assertThat(preference.isChecked).isFalse()
+
+ preference.performClick()
+
+ assertThat(preference.isChecked).isTrue()
+ }
+
+ @Test
+ fun storeSetTrue_setAdaptiveMobileNetworkEnabled() {
+ setAdaptiveMobileNetworkEnabled(true)
+
+ assertThat(
+ getAdaptiveMobileNetworkEnabled()
+ ).isTrue()
+ }
+
+ @Test
+ fun storeSetFalse_setAdaptiveMobileNetworkDisabled() {
+ setAdaptiveMobileNetworkEnabled(false)
+
+ assertThat(
+ getAdaptiveMobileNetworkEnabled()
+ ).isFalse()
+ }
+
+ private fun getSwitchPreference(): SwitchPreferenceCompat =
+ adaptiveMobileNetworkTogglePreference.createAndBindWidget(context)
+
+ private fun setAdaptiveMobileNetworkEnabled(enabled: Boolean) =
+ adaptiveMobileNetworkTogglePreference
+ .storage(context)
+ .setBoolean(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED, enabled)
+
+ private fun getAdaptiveMobileNetworkEnabled() =
+ adaptiveMobileNetworkTogglePreference
+ .storage(context)
+ .getBoolean(ADAPTIVE_CONNECTIVITY_MOBILE_NETWORK_ENABLED)
+}
diff --git a/tests/robotests/src/com/android/settings/network/WifiScorerTogglePreferenceTest.kt b/tests/robotests/src/com/android/settings/network/WifiScorerTogglePreferenceTest.kt
new file mode 100644
index 0000000..794b5eb
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/WifiScorerTogglePreferenceTest.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network
+
+import android.content.Context
+import android.content.ContextWrapper
+import android.net.wifi.WifiManager
+import android.provider.Settings.Secure.ADAPTIVE_CONNECTIVITY_WIFI_ENABLED
+import androidx.preference.SwitchPreferenceCompat
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.preference.createAndBindWidget
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
+
+@RunWith(AndroidJUnit4::class)
+class WifiScorerTogglePreferenceTest {
+ private val mockWifiManager = mock<WifiManager>()
+
+ private val context: Context =
+ object : ContextWrapper(ApplicationProvider.getApplicationContext()) {
+ override fun getSystemService(name: String): Any? =
+ when {
+ name == getSystemServiceName(WifiManager::class.java) -> mockWifiManager
+ else -> super.getSystemService(name)
+ }
+ }
+
+ private val wifiScorerTogglePreference = WifiScorerTogglePreference()
+
+ @Test
+ fun switchClick_defaultDisabled_returnFalse() {
+ setWifiScorerEnabled(false)
+
+ assertThat(getSwitchPreference().isChecked).isFalse()
+ }
+
+ @Test
+ fun switchClick_defaultEnabled_returnTrue() {
+ setWifiScorerEnabled(true)
+
+ assertThat(getSwitchPreference().isChecked).isTrue()
+ }
+
+ @Test
+ fun setChecked_defaultEnabled_updatesCorrectly() {
+ val preference = getSwitchPreference()
+ assertThat(preference.isChecked).isTrue()
+
+ preference.performClick()
+
+ assertThat(preference.isChecked).isFalse()
+
+ preference.performClick()
+
+ assertThat(preference.isChecked).isTrue()
+ }
+
+ @Test
+ fun storeSetTrue_wifiManagerSetWifiScoringEnabled() {
+ setWifiScorerEnabled(true)
+
+ assertThat(getWifiScorerEnabled()).isTrue()
+ verify(mockWifiManager).setWifiScoringEnabled(true)
+ }
+
+ @Test
+ fun storeSetFalse_wifiManagerSetWifiScoringDisabled() {
+ setWifiScorerEnabled(false)
+
+ assertThat(getWifiScorerEnabled()).isFalse()
+ verify(mockWifiManager).setWifiScoringEnabled(false)
+ }
+
+ private fun getSwitchPreference(): SwitchPreferenceCompat =
+ wifiScorerTogglePreference.createAndBindWidget(context)
+
+ private fun setWifiScorerEnabled(enabled: Boolean) =
+ wifiScorerTogglePreference
+ .storage(context)
+ .setBoolean(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED, enabled)
+
+ private fun getWifiScorerEnabled() =
+ wifiScorerTogglePreference
+ .storage(context)
+ .getBoolean(ADAPTIVE_CONNECTIVITY_WIFI_ENABLED)
+}