From cd9af665c3bb9cd930256881cfad3ebd40eedeb1 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Thu, 9 Jan 2025 03:37:06 +0800 Subject: [PATCH] [Catalyst] Add back Wi-Fi switch metrics - The original Wi-Fi switch metrics is recorded by WifiEnabler. - Since the design of Catalyst removes WifiEnabler, the metrics needs to be added to Catalyst preference. NO_IFTTT=Catalyst only Bug: 388547699 Flag: EXEMPT bugfix Test: Manual testing atest -c WifiSwitchPreferenceTest Change-Id: I8819e8f660784b8b04c7958b65f4792b5d4d0919 --- .../settings/wifi/WifiSwitchPreference.kt | 15 +++++- .../android/settings/wifi/utils/Contexts.kt | 17 ++++++ .../settings/wifi/WifiSwitchPreferenceTest.kt | 52 +++++++++++++++++++ 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/wifi/WifiSwitchPreference.kt b/src/com/android/settings/wifi/WifiSwitchPreference.kt index 627a78b7e2c..dbe5759a2e4 100644 --- a/src/com/android/settings/wifi/WifiSwitchPreference.kt +++ b/src/com/android/settings/wifi/WifiSwitchPreference.kt @@ -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 @@ -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 @@ -137,8 +141,15 @@ class WifiSwitchPreference : context.isWifiEnabled as T? override fun setValue(key: String, valueType: Class, value: T?) { - if (value is Boolean) { - context.isWifiEnabled = value + 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) } } diff --git a/src/com/android/settings/wifi/utils/Contexts.kt b/src/com/android/settings/wifi/utils/Contexts.kt index 42a6b98114b..bd8ecaaf669 100644 --- a/src/com/android/settings/wifi/utils/Contexts.kt +++ b/src/com/android/settings/wifi/utils/Contexts.kt @@ -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 @@ -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 diff --git a/tests/unit/src/com/android/settings/wifi/WifiSwitchPreferenceTest.kt b/tests/unit/src/com/android/settings/wifi/WifiSwitchPreferenceTest.kt index ca2ae8eb1cb..eb437dd3410 100644 --- a/tests/unit/src/com/android/settings/wifi/WifiSwitchPreferenceTest.kt +++ b/tests/unit/src/com/android/settings/wifi/WifiSwitchPreferenceTest.kt @@ -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 @@ -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() + private val mockConnectivityManager = mock() private val context = object : ContextWrapper(ApplicationProvider.getApplicationContext()) { @@ -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) } } @@ -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 } @@ -85,4 +125,16 @@ class WifiSwitchPreferenceTest { private fun getSwitchPreference(): SwitchPreferenceCompat = wifiSwitchPreference.createAndBindWidget(context) + + private fun mockDefaultNetwork(transportType: Int) { + val mockNetwork = mock() + val networkCapabilities = + NetworkCapabilities.Builder.withoutDefaultCapabilities() + .addTransportType(transportType) + .build() + mockConnectivityManager.stub { + on { activeNetwork } doReturn mockNetwork + on { getNetworkCapabilities(mockNetwork) } doReturn networkCapabilities + } + } }