[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
This commit is contained in:
Weng Su
2025-01-09 03:37:06 +08:00
parent 32f8eff7a9
commit cd9af665c3
3 changed files with 82 additions and 2 deletions

View File

@@ -17,6 +17,8 @@
package com.android.settings.wifi package com.android.settings.wifi
import android.Manifest 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.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@@ -31,6 +33,8 @@ import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R import com.android.settings.R
import com.android.settings.network.SatelliteRepository.Companion.isSatelliteOn import com.android.settings.network.SatelliteRepository.Companion.isSatelliteOn
import com.android.settings.network.SatelliteWarningDialogActivity 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.isWifiEnabled
import com.android.settings.wifi.utils.wifiManager import com.android.settings.wifi.utils.wifiManager
import com.android.settingslib.RestrictedSwitchPreference import com.android.settingslib.RestrictedSwitchPreference
@@ -137,8 +141,15 @@ class WifiSwitchPreference :
context.isWifiEnabled as T? context.isWifiEnabled as T?
override fun <T : Any> setValue(key: String, valueType: Class<T>, value: 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 context.isWifiEnabled = value
val metricsFeature = featureFactory.metricsFeatureProvider
if (value) {
metricsFeature.action(context, ACTION_WIFI_ON)
} else {
metricsFeature.action(context, ACTION_WIFI_OFF, context.isDefaultNetworkWifi)
} }
} }

View File

@@ -19,6 +19,8 @@
package com.android.settings.wifi.utils package com.android.settings.wifi.utils
import android.content.Context import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.TetheringManager import android.net.TetheringManager
import android.net.wifi.WifiManager import android.net.wifi.WifiManager
@@ -52,3 +54,18 @@ var Context.isWifiEnabled: Boolean
*/ */
val Context.tetheringManager: TetheringManager? val Context.tetheringManager: TetheringManager?
get() = applicationContext.getSystemService(TetheringManager::class.java) 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

View File

@@ -16,11 +16,19 @@
package com.android.settings.wifi 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.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 android.net.wifi.WifiManager
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.testutils.FakeFeatureFactory
import com.android.settingslib.preference.createAndBindWidget import com.android.settingslib.preference.createAndBindWidget
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import org.junit.Test import org.junit.Test
@@ -28,11 +36,13 @@ import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.stub import org.mockito.kotlin.stub
import org.mockito.kotlin.verify
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class WifiSwitchPreferenceTest { class WifiSwitchPreferenceTest {
private val mockWifiManager = mock<WifiManager>() private val mockWifiManager = mock<WifiManager>()
private val mockConnectivityManager = mock<ConnectivityManager>()
private val context = private val context =
object : ContextWrapper(ApplicationProvider.getApplicationContext()) { object : ContextWrapper(ApplicationProvider.getApplicationContext()) {
@@ -41,6 +51,7 @@ class WifiSwitchPreferenceTest {
override fun getSystemService(name: String): Any? = override fun getSystemService(name: String): Any? =
when (name) { when (name) {
getSystemServiceName(WifiManager::class.java) -> mockWifiManager getSystemServiceName(WifiManager::class.java) -> mockWifiManager
getSystemServiceName(ConnectivityManager::class.java) -> mockConnectivityManager
else -> super.getSystemService(name) else -> super.getSystemService(name)
} }
} }
@@ -65,6 +76,35 @@ class WifiSwitchPreferenceTest {
assertThat(getValue).isFalse() 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 @Test
fun performClick_defaultOn_checkedIsFalse() { fun performClick_defaultOn_checkedIsFalse() {
mockWifiManager.stub { on { isWifiEnabled } doReturn true } mockWifiManager.stub { on { isWifiEnabled } doReturn true }
@@ -85,4 +125,16 @@ class WifiSwitchPreferenceTest {
private fun getSwitchPreference(): SwitchPreferenceCompat = private fun getSwitchPreference(): SwitchPreferenceCompat =
wifiSwitchPreference.createAndBindWidget(context) 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
}
}
} }