Loading src/com/android/settings/wifi/WifiSwitchPreference.kt +13 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.settings.wifi import android.Manifest import android.app.settings.SettingsEnums.ACTION_WIFI_OFF import android.app.settings.SettingsEnums.ACTION_WIFI_ON import android.content.BroadcastReceiver import android.content.Context import android.content.Intent Loading @@ -31,6 +33,8 @@ import com.android.settings.PreferenceRestrictionMixin import com.android.settings.R import com.android.settings.network.SatelliteRepository.Companion.isSatelliteOn import com.android.settings.network.SatelliteWarningDialogActivity import com.android.settings.overlay.FeatureFactory.Companion.featureFactory import com.android.settings.wifi.utils.isDefaultNetworkWifi import com.android.settings.wifi.utils.isWifiEnabled import com.android.settings.wifi.utils.wifiManager import com.android.settingslib.RestrictedSwitchPreference Loading Loading @@ -137,8 +141,15 @@ class WifiSwitchPreference : context.isWifiEnabled as T? override fun <T : Any> setValue(key: String, valueType: Class<T>, value: T?) { if (value is Boolean) { if (value !is Boolean) return context.isWifiEnabled = value val metricsFeature = featureFactory.metricsFeatureProvider if (value) { metricsFeature.action(context, ACTION_WIFI_ON) } else { metricsFeature.action(context, ACTION_WIFI_OFF, context.isDefaultNetworkWifi) } } Loading src/com/android/settings/wifi/utils/Contexts.kt +17 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.settings.wifi.utils import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.net.TetheringManager import android.net.wifi.WifiManager Loading Loading @@ -52,3 +54,18 @@ var Context.isWifiEnabled: Boolean */ val Context.tetheringManager: TetheringManager? get() = applicationContext.getSystemService(TetheringManager::class.java) /** * Gets the {@link android.net.ConnectivityManager} system service. * * Use application context to get system services to avoid memory leaks. */ val Context.connectivityManager: ConnectivityManager? get() = applicationContext.getSystemService(ConnectivityManager::class.java) /** Return true if the default network is a Wi-Fi network */ val Context.isDefaultNetworkWifi: Boolean get() = connectivityManager ?.getNetworkCapabilities(connectivityManager?.activeNetwork) ?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true tests/unit/src/com/android/settings/wifi/WifiSwitchPreferenceTest.kt +52 −0 Original line number Diff line number Diff line Loading @@ -16,11 +16,19 @@ package com.android.settings.wifi import android.app.settings.SettingsEnums.ACTION_WIFI_OFF import android.app.settings.SettingsEnums.ACTION_WIFI_ON import android.content.ContextWrapper import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkCapabilities.TRANSPORT_CELLULAR import android.net.NetworkCapabilities.TRANSPORT_WIFI import android.net.wifi.WifiManager import androidx.preference.SwitchPreferenceCompat import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.testutils.FakeFeatureFactory import com.android.settingslib.preference.createAndBindWidget import com.google.common.truth.Truth.assertThat import org.junit.Test Loading @@ -28,11 +36,13 @@ import org.junit.runner.RunWith import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.stub import org.mockito.kotlin.verify @RunWith(AndroidJUnit4::class) class WifiSwitchPreferenceTest { private val mockWifiManager = mock<WifiManager>() private val mockConnectivityManager = mock<ConnectivityManager>() private val context = object : ContextWrapper(ApplicationProvider.getApplicationContext()) { Loading @@ -41,6 +51,7 @@ class WifiSwitchPreferenceTest { override fun getSystemService(name: String): Any? = when (name) { getSystemServiceName(WifiManager::class.java) -> mockWifiManager getSystemServiceName(ConnectivityManager::class.java) -> mockConnectivityManager else -> super.getSystemService(name) } } Loading @@ -65,6 +76,35 @@ class WifiSwitchPreferenceTest { assertThat(getValue).isFalse() } @Test fun setValue_valueTrue_metricsActionWifiOn() { val metricsFeatureProvider = FakeFeatureFactory.setupForTest().metricsFeatureProvider wifiSwitchPreference.storage(context).setBoolean(WifiSwitchPreference.KEY, true) verify(metricsFeatureProvider).action(context, ACTION_WIFI_ON) } @Test fun setValue_valueFalseWithoutDefaultWifi_metricsActionWifiOffWithFalse() { val metricsFeatureProvider = FakeFeatureFactory.setupForTest().metricsFeatureProvider mockDefaultNetwork(TRANSPORT_CELLULAR) wifiSwitchPreference.storage(context).setBoolean(WifiSwitchPreference.KEY, false) verify(metricsFeatureProvider).action(context, ACTION_WIFI_OFF, false) } @Test fun setValue_valueFalseWithDefaultWifi_metricsActionWifiOffWithTrue() { val metricsFeatureProvider = FakeFeatureFactory.setupForTest().metricsFeatureProvider mockDefaultNetwork(TRANSPORT_WIFI) wifiSwitchPreference.storage(context).setBoolean(WifiSwitchPreference.KEY, false) verify(metricsFeatureProvider).action(context, ACTION_WIFI_OFF, true) } @Test fun performClick_defaultOn_checkedIsFalse() { mockWifiManager.stub { on { isWifiEnabled } doReturn true } Loading @@ -85,4 +125,16 @@ class WifiSwitchPreferenceTest { private fun getSwitchPreference(): SwitchPreferenceCompat = wifiSwitchPreference.createAndBindWidget(context) private fun mockDefaultNetwork(transportType: Int) { val mockNetwork = mock<Network>() val networkCapabilities = NetworkCapabilities.Builder.withoutDefaultCapabilities() .addTransportType(transportType) .build() mockConnectivityManager.stub { on { activeNetwork } doReturn mockNetwork on { getNetworkCapabilities(mockNetwork) } doReturn networkCapabilities } } } Loading
src/com/android/settings/wifi/WifiSwitchPreference.kt +13 −2 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package com.android.settings.wifi import android.Manifest import android.app.settings.SettingsEnums.ACTION_WIFI_OFF import android.app.settings.SettingsEnums.ACTION_WIFI_ON import android.content.BroadcastReceiver import android.content.Context import android.content.Intent Loading @@ -31,6 +33,8 @@ import com.android.settings.PreferenceRestrictionMixin import com.android.settings.R import com.android.settings.network.SatelliteRepository.Companion.isSatelliteOn import com.android.settings.network.SatelliteWarningDialogActivity import com.android.settings.overlay.FeatureFactory.Companion.featureFactory import com.android.settings.wifi.utils.isDefaultNetworkWifi import com.android.settings.wifi.utils.isWifiEnabled import com.android.settings.wifi.utils.wifiManager import com.android.settingslib.RestrictedSwitchPreference Loading Loading @@ -137,8 +141,15 @@ class WifiSwitchPreference : context.isWifiEnabled as T? override fun <T : Any> setValue(key: String, valueType: Class<T>, value: T?) { if (value is Boolean) { if (value !is Boolean) return context.isWifiEnabled = value val metricsFeature = featureFactory.metricsFeatureProvider if (value) { metricsFeature.action(context, ACTION_WIFI_ON) } else { metricsFeature.action(context, ACTION_WIFI_OFF, context.isDefaultNetworkWifi) } } Loading
src/com/android/settings/wifi/utils/Contexts.kt +17 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.settings.wifi.utils import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.net.TetheringManager import android.net.wifi.WifiManager Loading Loading @@ -52,3 +54,18 @@ var Context.isWifiEnabled: Boolean */ val Context.tetheringManager: TetheringManager? get() = applicationContext.getSystemService(TetheringManager::class.java) /** * Gets the {@link android.net.ConnectivityManager} system service. * * Use application context to get system services to avoid memory leaks. */ val Context.connectivityManager: ConnectivityManager? get() = applicationContext.getSystemService(ConnectivityManager::class.java) /** Return true if the default network is a Wi-Fi network */ val Context.isDefaultNetworkWifi: Boolean get() = connectivityManager ?.getNetworkCapabilities(connectivityManager?.activeNetwork) ?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true
tests/unit/src/com/android/settings/wifi/WifiSwitchPreferenceTest.kt +52 −0 Original line number Diff line number Diff line Loading @@ -16,11 +16,19 @@ package com.android.settings.wifi import android.app.settings.SettingsEnums.ACTION_WIFI_OFF import android.app.settings.SettingsEnums.ACTION_WIFI_ON import android.content.ContextWrapper import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkCapabilities.TRANSPORT_CELLULAR import android.net.NetworkCapabilities.TRANSPORT_WIFI import android.net.wifi.WifiManager import androidx.preference.SwitchPreferenceCompat import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settings.testutils.FakeFeatureFactory import com.android.settingslib.preference.createAndBindWidget import com.google.common.truth.Truth.assertThat import org.junit.Test Loading @@ -28,11 +36,13 @@ import org.junit.runner.RunWith import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.stub import org.mockito.kotlin.verify @RunWith(AndroidJUnit4::class) class WifiSwitchPreferenceTest { private val mockWifiManager = mock<WifiManager>() private val mockConnectivityManager = mock<ConnectivityManager>() private val context = object : ContextWrapper(ApplicationProvider.getApplicationContext()) { Loading @@ -41,6 +51,7 @@ class WifiSwitchPreferenceTest { override fun getSystemService(name: String): Any? = when (name) { getSystemServiceName(WifiManager::class.java) -> mockWifiManager getSystemServiceName(ConnectivityManager::class.java) -> mockConnectivityManager else -> super.getSystemService(name) } } Loading @@ -65,6 +76,35 @@ class WifiSwitchPreferenceTest { assertThat(getValue).isFalse() } @Test fun setValue_valueTrue_metricsActionWifiOn() { val metricsFeatureProvider = FakeFeatureFactory.setupForTest().metricsFeatureProvider wifiSwitchPreference.storage(context).setBoolean(WifiSwitchPreference.KEY, true) verify(metricsFeatureProvider).action(context, ACTION_WIFI_ON) } @Test fun setValue_valueFalseWithoutDefaultWifi_metricsActionWifiOffWithFalse() { val metricsFeatureProvider = FakeFeatureFactory.setupForTest().metricsFeatureProvider mockDefaultNetwork(TRANSPORT_CELLULAR) wifiSwitchPreference.storage(context).setBoolean(WifiSwitchPreference.KEY, false) verify(metricsFeatureProvider).action(context, ACTION_WIFI_OFF, false) } @Test fun setValue_valueFalseWithDefaultWifi_metricsActionWifiOffWithTrue() { val metricsFeatureProvider = FakeFeatureFactory.setupForTest().metricsFeatureProvider mockDefaultNetwork(TRANSPORT_WIFI) wifiSwitchPreference.storage(context).setBoolean(WifiSwitchPreference.KEY, false) verify(metricsFeatureProvider).action(context, ACTION_WIFI_OFF, true) } @Test fun performClick_defaultOn_checkedIsFalse() { mockWifiManager.stub { on { isWifiEnabled } doReturn true } Loading @@ -85,4 +125,16 @@ class WifiSwitchPreferenceTest { private fun getSwitchPreference(): SwitchPreferenceCompat = wifiSwitchPreference.createAndBindWidget(context) private fun mockDefaultNetwork(transportType: Int) { val mockNetwork = mock<Network>() val networkCapabilities = NetworkCapabilities.Builder.withoutDefaultCapabilities() .addTransportType(transportType) .build() mockConnectivityManager.stub { on { activeNetwork } doReturn mockNetwork on { getNetworkCapabilities(mockNetwork) } doReturn networkCapabilities } } }