Add an API that allows VPNs to declare themselves as metered.
For VPN apps targeting Q and above, they will by default be treated as metered unless they override this setting before establishing VPN. Bug: 120145746 Test: atest FrameworksNetTests Test: On device tests verifying meteredness setup correctly for apps targeting Q and apps targeting P. Change-Id: Ia6d1f7ef244bc04ae2e28faa59625302b5994875
This commit is contained in:
@@ -903,6 +903,7 @@ public class ConnectivityServiceTest {
|
|||||||
mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities());
|
mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities());
|
||||||
mConnected = true;
|
mConnected = true;
|
||||||
mConfig = new VpnConfig();
|
mConfig = new VpnConfig();
|
||||||
|
mConfig.isMetered = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -168,6 +168,8 @@ public class VpnTest {
|
|||||||
ApplicationInfo applicationInfo = new ApplicationInfo();
|
ApplicationInfo applicationInfo = new ApplicationInfo();
|
||||||
applicationInfo.targetSdkVersion = VERSION_CODES.CUR_DEVELOPMENT;
|
applicationInfo.targetSdkVersion = VERSION_CODES.CUR_DEVELOPMENT;
|
||||||
when(mContext.getApplicationInfo()).thenReturn(applicationInfo);
|
when(mContext.getApplicationInfo()).thenReturn(applicationInfo);
|
||||||
|
when(mPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
|
||||||
|
.thenReturn(applicationInfo);
|
||||||
|
|
||||||
doNothing().when(mNetService).registerObserver(any());
|
doNothing().when(mNetService).registerObserver(any());
|
||||||
}
|
}
|
||||||
@@ -544,23 +546,28 @@ public class VpnTest {
|
|||||||
final Network wifi = new Network(2);
|
final Network wifi = new Network(2);
|
||||||
|
|
||||||
final Map<Network, NetworkCapabilities> networks = new HashMap<>();
|
final Map<Network, NetworkCapabilities> networks = new HashMap<>();
|
||||||
networks.put(mobile, new NetworkCapabilities()
|
networks.put(
|
||||||
.addTransportType(TRANSPORT_CELLULAR)
|
mobile,
|
||||||
.addCapability(NET_CAPABILITY_INTERNET)
|
new NetworkCapabilities()
|
||||||
.addCapability(NET_CAPABILITY_NOT_METERED)
|
.addTransportType(TRANSPORT_CELLULAR)
|
||||||
.addCapability(NET_CAPABILITY_NOT_CONGESTED)
|
.addCapability(NET_CAPABILITY_INTERNET)
|
||||||
.setLinkDownstreamBandwidthKbps(10));
|
.addCapability(NET_CAPABILITY_NOT_CONGESTED)
|
||||||
networks.put(wifi, new NetworkCapabilities()
|
.setLinkDownstreamBandwidthKbps(10));
|
||||||
.addTransportType(TRANSPORT_WIFI)
|
networks.put(
|
||||||
.addCapability(NET_CAPABILITY_INTERNET)
|
wifi,
|
||||||
.addCapability(NET_CAPABILITY_NOT_ROAMING)
|
new NetworkCapabilities()
|
||||||
.addCapability(NET_CAPABILITY_NOT_CONGESTED)
|
.addTransportType(TRANSPORT_WIFI)
|
||||||
.setLinkUpstreamBandwidthKbps(20));
|
.addCapability(NET_CAPABILITY_INTERNET)
|
||||||
|
.addCapability(NET_CAPABILITY_NOT_METERED)
|
||||||
|
.addCapability(NET_CAPABILITY_NOT_ROAMING)
|
||||||
|
.addCapability(NET_CAPABILITY_NOT_CONGESTED)
|
||||||
|
.setLinkUpstreamBandwidthKbps(20));
|
||||||
setMockedNetworks(networks);
|
setMockedNetworks(networks);
|
||||||
|
|
||||||
final NetworkCapabilities caps = new NetworkCapabilities();
|
final NetworkCapabilities caps = new NetworkCapabilities();
|
||||||
|
|
||||||
Vpn.updateCapabilities(mConnectivityManager, new Network[] { }, caps);
|
Vpn.updateCapabilities(
|
||||||
|
mConnectivityManager, new Network[] {}, caps, false /* isAlwaysMetered */);
|
||||||
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||||
assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
|
assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||||
assertFalse(caps.hasTransport(TRANSPORT_WIFI));
|
assertFalse(caps.hasTransport(TRANSPORT_WIFI));
|
||||||
@@ -570,17 +577,33 @@ public class VpnTest {
|
|||||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
||||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
|
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
|
||||||
|
|
||||||
Vpn.updateCapabilities(mConnectivityManager, new Network[] { mobile }, caps);
|
Vpn.updateCapabilities(
|
||||||
|
mConnectivityManager,
|
||||||
|
new Network[] {mobile},
|
||||||
|
caps,
|
||||||
|
false /* isAlwaysMetered */);
|
||||||
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||||
assertTrue(caps.hasTransport(TRANSPORT_CELLULAR));
|
assertTrue(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||||
assertFalse(caps.hasTransport(TRANSPORT_WIFI));
|
assertFalse(caps.hasTransport(TRANSPORT_WIFI));
|
||||||
assertEquals(10, caps.getLinkDownstreamBandwidthKbps());
|
assertEquals(10, caps.getLinkDownstreamBandwidthKbps());
|
||||||
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkUpstreamBandwidthKbps());
|
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkUpstreamBandwidthKbps());
|
||||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
|
assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
|
||||||
assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
assertFalse(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
||||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
|
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
|
||||||
|
|
||||||
Vpn.updateCapabilities(mConnectivityManager, new Network[] { wifi }, caps);
|
Vpn.updateCapabilities(
|
||||||
|
mConnectivityManager, new Network[] {wifi}, caps, false /* isAlwaysMetered */);
|
||||||
|
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||||
|
assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||||
|
assertTrue(caps.hasTransport(TRANSPORT_WIFI));
|
||||||
|
assertEquals(LINK_BANDWIDTH_UNSPECIFIED, caps.getLinkDownstreamBandwidthKbps());
|
||||||
|
assertEquals(20, caps.getLinkUpstreamBandwidthKbps());
|
||||||
|
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_METERED));
|
||||||
|
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
||||||
|
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
|
||||||
|
|
||||||
|
Vpn.updateCapabilities(
|
||||||
|
mConnectivityManager, new Network[] {wifi}, caps, true /* isAlwaysMetered */);
|
||||||
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||||
assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
|
assertFalse(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||||
assertTrue(caps.hasTransport(TRANSPORT_WIFI));
|
assertTrue(caps.hasTransport(TRANSPORT_WIFI));
|
||||||
@@ -590,7 +613,11 @@ public class VpnTest {
|
|||||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_ROAMING));
|
||||||
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
|
assertTrue(caps.hasCapability(NET_CAPABILITY_NOT_CONGESTED));
|
||||||
|
|
||||||
Vpn.updateCapabilities(mConnectivityManager, new Network[] { mobile, wifi }, caps);
|
Vpn.updateCapabilities(
|
||||||
|
mConnectivityManager,
|
||||||
|
new Network[] {mobile, wifi},
|
||||||
|
caps,
|
||||||
|
false /* isAlwaysMetered */);
|
||||||
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
assertTrue(caps.hasTransport(TRANSPORT_VPN));
|
||||||
assertTrue(caps.hasTransport(TRANSPORT_CELLULAR));
|
assertTrue(caps.hasTransport(TRANSPORT_CELLULAR));
|
||||||
assertTrue(caps.hasTransport(TRANSPORT_WIFI));
|
assertTrue(caps.hasTransport(TRANSPORT_WIFI));
|
||||||
|
|||||||
Reference in New Issue
Block a user