From d9b6ed80b9e1ba679e4e7c81ef59e674aaa83bcd Mon Sep 17 00:00:00 2001 From: lesl Date: Fri, 7 May 2021 18:15:17 +0800 Subject: [PATCH] Add metered filter for API: buildTemplateCarrier This CL modifies NetworkTemplate#buildTemplateCarrier to force on metered carrier network and rename to buildTemplateCarrierMetered. This method was introduced recently and has no callers. This method will be used in Settings and NetworkPolicyManagerService to display and manage data usage on carrier metered networks. Settings/NetworkPolicyManagerService will use it instead of the existing method buildTemplateMobileAll method, which only matches metered networks. That code will change from matching metered mobile networks to matching metered carrier networks. Note: The carrier metered network includes metered mobile network and metered "merged carrier wifi network" that is a specific cerrier wifi network which provides the same user experience as mobile. Bug: 176396812 Test: atest -c NetworkTemplateTest Change-Id: I7196d62bb60844458a6c4b1d94e2baccb71e15cd --- core/java/android/net/NetworkTemplate.java | 9 ++-- .../java/android/net/NetworkTemplateTest.kt | 54 ++++++++++++------- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index d3c89574944fc..fd446cdf5c7fc 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -274,11 +274,14 @@ public class NetworkTemplate implements Parcelable { } /** - * Template to match all carrier networks with the given IMSI. + * Template to match all metered carrier networks with the given IMSI. */ - public static NetworkTemplate buildTemplateCarrier(@NonNull String subscriberId) { + public static NetworkTemplate buildTemplateCarrierMetered(@NonNull String subscriberId) { Objects.requireNonNull(subscriberId); - return new NetworkTemplate(MATCH_CARRIER, subscriberId, null); + return new NetworkTemplate(MATCH_CARRIER, subscriberId, + new String[] { subscriberId }, null /* networkId */, METERED_YES, ROAMING_ALL, + DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_EXACT); } private final int mMatchRule; diff --git a/packages/Connectivity/tests/unit/java/android/net/NetworkTemplateTest.kt b/packages/Connectivity/tests/unit/java/android/net/NetworkTemplateTest.kt index ab6b2f4098677..cb39a0c819f2a 100644 --- a/packages/Connectivity/tests/unit/java/android/net/NetworkTemplateTest.kt +++ b/packages/Connectivity/tests/unit/java/android/net/NetworkTemplateTest.kt @@ -40,7 +40,7 @@ import android.net.NetworkTemplate.OEM_MANAGED_YES import android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT import android.net.NetworkTemplate.buildTemplateWifi import android.net.NetworkTemplate.buildTemplateWifiWildcard -import android.net.NetworkTemplate.buildTemplateCarrier +import android.net.NetworkTemplate.buildTemplateCarrierMetered import android.net.NetworkTemplate.buildTemplateMobileWithRatType import android.telephony.TelephonyManager import com.android.testutils.assertParcelSane @@ -73,11 +73,12 @@ class NetworkTemplateTest { type: Int, subscriberId: String? = null, ssid: String? = null, - oemManaged: Int = OEM_NONE + oemManaged: Int = OEM_NONE, + metered: Boolean = true ): NetworkStateSnapshot { val lp = LinkProperties() val caps = NetworkCapabilities().apply { - setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, false) + setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !metered) setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true) setSSID(ssid) setCapability(NetworkCapabilities.NET_CAPABILITY_OEM_PAID, @@ -167,25 +168,38 @@ class NetworkTemplateTest { } @Test - fun testCarrierMatches() { - val templateCarrierImsi1 = buildTemplateCarrier(TEST_IMSI1) + fun testCarrierMeteredMatches() { + val templateCarrierImsi1Metered = buildTemplateCarrierMetered(TEST_IMSI1) - val identMobile1 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI1), - false, TelephonyManager.NETWORK_TYPE_UMTS) - val identMobile2 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI2), - false, TelephonyManager.NETWORK_TYPE_UMTS) - val identWifiSsid1 = buildNetworkIdentity( - mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) - val identCarrierWifiImsi1 = buildNetworkIdentity( - mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0) - val identCarrierWifiImsi2 = buildNetworkIdentity( - mockContext, buildWifiNetworkState(TEST_IMSI2, TEST_SSID1), true, 0) + val mobileImsi1 = buildMobileNetworkState(TEST_IMSI1) + val mobileImsi1Unmetered = buildNetworkState(TYPE_MOBILE, TEST_IMSI1, null /* ssid */, + OEM_NONE, false /* metered */) + val mobileImsi2 = buildMobileNetworkState(TEST_IMSI2) + val wifiSsid1 = buildWifiNetworkState(null /* subscriberId */, TEST_SSID1) + val wifiImsi1Ssid1 = buildWifiNetworkState(TEST_IMSI1, TEST_SSID1) + val wifiImsi1Ssid1Unmetered = buildNetworkState(TYPE_WIFI, TEST_IMSI1, TEST_SSID1, + OEM_NONE, false /* metered */) - templateCarrierImsi1.assertMatches(identCarrierWifiImsi1) - templateCarrierImsi1.assertDoesNotMatch(identCarrierWifiImsi2) - templateCarrierImsi1.assertDoesNotMatch(identWifiSsid1) - templateCarrierImsi1.assertMatches(identMobile1) - templateCarrierImsi1.assertDoesNotMatch(identMobile2) + val identMobileImsi1Metered = buildNetworkIdentity(mockContext, + mobileImsi1, false /* defaultNetwork */, TelephonyManager.NETWORK_TYPE_UMTS) + val identMobileImsi1Unmetered = buildNetworkIdentity(mockContext, + mobileImsi1Unmetered, false /* defaultNetwork */, + TelephonyManager.NETWORK_TYPE_UMTS) + val identMobileImsi2Metered = buildNetworkIdentity(mockContext, + mobileImsi2, false /* defaultNetwork */, TelephonyManager.NETWORK_TYPE_UMTS) + val identWifiSsid1Metered = buildNetworkIdentity( + mockContext, wifiSsid1, true /* defaultNetwork */, 0 /* subType */) + val identCarrierWifiImsi1Metered = buildNetworkIdentity( + mockContext, wifiImsi1Ssid1, true /* defaultNetwork */, 0 /* subType */) + val identCarrierWifiImsi1NonMetered = buildNetworkIdentity(mockContext, + wifiImsi1Ssid1Unmetered, true /* defaultNetwork */, 0 /* subType */) + + templateCarrierImsi1Metered.assertMatches(identMobileImsi1Metered) + templateCarrierImsi1Metered.assertDoesNotMatch(identMobileImsi1Unmetered) + templateCarrierImsi1Metered.assertDoesNotMatch(identMobileImsi2Metered) + templateCarrierImsi1Metered.assertDoesNotMatch(identWifiSsid1Metered) + templateCarrierImsi1Metered.assertMatches(identCarrierWifiImsi1Metered) + templateCarrierImsi1Metered.assertDoesNotMatch(identCarrierWifiImsi1NonMetered) } @Test