diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 2aa5498049..01546b0001 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -316,7 +316,7 @@ public final class NetworkCapabilities implements Parcelable { /** * Capabilities that suggest that a network is restricted. - * {@see #maybeMarkCapabilitiesRestricted}. + * {@see #maybeMarkCapabilitiesRestricted}, {@see #FORCE_RESTRICTED_CAPABILITIES} */ @VisibleForTesting /* package */ static final long RESTRICTED_CAPABILITIES = @@ -327,7 +327,13 @@ public final class NetworkCapabilities implements Parcelable { (1 << NET_CAPABILITY_IA) | (1 << NET_CAPABILITY_IMS) | (1 << NET_CAPABILITY_RCS) | - (1 << NET_CAPABILITY_XCAP) | + (1 << NET_CAPABILITY_XCAP); + + /** + * Capabilities that force network to be restricted. + * {@see #maybeMarkCapabilitiesRestricted}. + */ + private static final long FORCE_RESTRICTED_CAPABILITIES = (1 << NET_CAPABILITY_OEM_PAID); /** @@ -532,16 +538,21 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ public void maybeMarkCapabilitiesRestricted() { + // Check if we have any capability that forces the network to be restricted. + final boolean forceRestrictedCapability = + (mNetworkCapabilities & FORCE_RESTRICTED_CAPABILITIES) != 0; + // Verify there aren't any unrestricted capabilities. If there are we say - // the whole thing is unrestricted. + // the whole thing is unrestricted unless it is forced to be restricted. final boolean hasUnrestrictedCapabilities = - ((mNetworkCapabilities & UNRESTRICTED_CAPABILITIES) != 0); + (mNetworkCapabilities & UNRESTRICTED_CAPABILITIES) != 0; // Must have at least some restricted capabilities. final boolean hasRestrictedCapabilities = - ((mNetworkCapabilities & RESTRICTED_CAPABILITIES) != 0); + (mNetworkCapabilities & RESTRICTED_CAPABILITIES) != 0; - if (hasRestrictedCapabilities && !hasUnrestrictedCapabilities) { + if (forceRestrictedCapability + || (hasRestrictedCapabilities && !hasUnrestrictedCapabilities)) { removeCapability(NET_CAPABILITY_NOT_RESTRICTED); } } diff --git a/tests/net/java/android/net/NetworkCapabilitiesTest.java b/tests/net/java/android/net/NetworkCapabilitiesTest.java index 69edc0c2ed..06965925e4 100644 --- a/tests/net/java/android/net/NetworkCapabilitiesTest.java +++ b/tests/net/java/android/net/NetworkCapabilitiesTest.java @@ -273,14 +273,28 @@ public class NetworkCapabilitiesTest { @Test public void testOemPaid() { NetworkCapabilities nc = new NetworkCapabilities(); - nc.maybeMarkCapabilitiesRestricted(); + // By default OEM_PAID is neither in the unwanted or required lists and the network is not + // restricted. + assertFalse(nc.hasUnwantedCapability(NET_CAPABILITY_OEM_PAID)); assertFalse(nc.hasCapability(NET_CAPABILITY_OEM_PAID)); + nc.maybeMarkCapabilitiesRestricted(); assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + // Adding OEM_PAID to capability list should make network restricted. nc.addCapability(NET_CAPABILITY_OEM_PAID); + nc.addCapability(NET_CAPABILITY_INTERNET); // Combine with unrestricted capability. nc.maybeMarkCapabilitiesRestricted(); assertTrue(nc.hasCapability(NET_CAPABILITY_OEM_PAID)); assertFalse(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + + // Now let's make request for OEM_PAID network. + NetworkCapabilities nr = new NetworkCapabilities(); + nr.addCapability(NET_CAPABILITY_OEM_PAID); + nr.maybeMarkCapabilitiesRestricted(); + assertTrue(nr.satisfiedByNetworkCapabilities(nc)); + + // Request fails for network with the default capabilities. + assertFalse(nr.satisfiedByNetworkCapabilities(new NetworkCapabilities())); } @Test @@ -295,7 +309,8 @@ public class NetworkCapabilitiesTest { request.addUnwantedCapability(NET_CAPABILITY_WIFI_P2P); request.addUnwantedCapability(NET_CAPABILITY_NOT_METERED); assertTrue(request.satisfiedByNetworkCapabilities(network)); - assertArrayEquals(new int[] {NET_CAPABILITY_WIFI_P2P, NET_CAPABILITY_NOT_METERED}, + assertArrayEquals(new int[] {NET_CAPABILITY_WIFI_P2P, + NET_CAPABILITY_NOT_METERED}, request.getUnwantedCapabilities()); // This is a default capability, just want to make sure its there because we use it below.