Allow underlying cell without unwanted NOT_VCN_MANAGED capability
This change updates the UnderlyingNetworkTracker to rely on the TelephonyNetworkSpecifier for selecting underlying networks. This ensures that there is always a cellular NetworkRequest filed for Cellular to bring up an underlying Network. Bug: 182211364 Test: FrameworksVcnTests Change-Id: I826711bb671440054c2090793315a5f1d57596c0
This commit is contained in:
@@ -114,33 +114,61 @@ public class UnderlyingNetworkTracker {
|
||||
getWifiNetworkRequest(), mHandler, mWifiBringupCallback);
|
||||
updateSubIdsAndCellularRequests();
|
||||
|
||||
// register Network-selection request used to decide selected underlying Network
|
||||
// Register Network-selection request used to decide selected underlying Network. All
|
||||
// underlying networks must be VCN managed in order to be used.
|
||||
mConnectivityManager.requestBackgroundNetwork(
|
||||
getNetworkRequestBase().build(), mHandler, mRouteSelectionCallback);
|
||||
getBaseNetworkRequest(true /* requireVcnManaged */).build(),
|
||||
mHandler,
|
||||
mRouteSelectionCallback);
|
||||
}
|
||||
|
||||
private NetworkRequest getWifiNetworkRequest() {
|
||||
return getNetworkRequestBase().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();
|
||||
// Request exclusively VCN managed networks to ensure that we only ever keep carrier wifi
|
||||
// alive.
|
||||
return getBaseNetworkRequest(true /* requireVcnManaged */)
|
||||
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
||||
.build();
|
||||
}
|
||||
|
||||
private NetworkRequest getCellNetworkRequestForSubId(int subId) {
|
||||
return getNetworkRequestBase()
|
||||
// Do not request NOT_VCN_MANAGED to ensure that the TelephonyNetworkFactory has a
|
||||
// fulfillable request to bring up underlying cellular Networks even if the VCN is already
|
||||
// connected.
|
||||
return getBaseNetworkRequest(false /* requireVcnManaged */)
|
||||
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
|
||||
.setNetworkSpecifier(new TelephonyNetworkSpecifier(subId))
|
||||
.build();
|
||||
}
|
||||
|
||||
private NetworkRequest.Builder getNetworkRequestBase() {
|
||||
NetworkRequest.Builder requestBase = new NetworkRequest.Builder();
|
||||
/**
|
||||
* Builds and returns a NetworkRequest builder common to all Underlying Network requests
|
||||
*
|
||||
* <p>A NetworkRequest may either (1) Require the presence of a capability by using
|
||||
* addCapability(), (2) require the absence of a capability using unwanted capabilities, or (3)
|
||||
* allow any state. Underlying networks are never desired to have the NOT_VCN_MANAGED
|
||||
* capability, and only cases (2) and (3) are used.
|
||||
*
|
||||
* @param requireVcnManaged whether the underlying network is required to be VCN managed to
|
||||
* match this request. If {@code true}, the NOT_VCN_MANAGED capability will be set as
|
||||
* unwanted. Else, the NOT_VCN_MANAGED capability will be removed, and any state is
|
||||
* acceptable.
|
||||
*/
|
||||
private NetworkRequest.Builder getBaseNetworkRequest(boolean requireVcnManaged) {
|
||||
NetworkRequest.Builder requestBase =
|
||||
new NetworkRequest.Builder()
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||
|
||||
for (int capability : mRequiredUnderlyingNetworkCapabilities) {
|
||||
requestBase.addCapability(capability);
|
||||
}
|
||||
|
||||
return requestBase
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
|
||||
.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||
if (requireVcnManaged) {
|
||||
requestBase.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||
}
|
||||
|
||||
return requestBase;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -194,29 +194,35 @@ public class UnderlyingNetworkTrackerTest {
|
||||
}
|
||||
|
||||
private NetworkRequest getWifiRequest() {
|
||||
return getExpectedRequestBase()
|
||||
return getExpectedRequestBase(true)
|
||||
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
||||
.build();
|
||||
}
|
||||
|
||||
private NetworkRequest getCellRequestForSubId(int subId) {
|
||||
return getExpectedRequestBase()
|
||||
return getExpectedRequestBase(false)
|
||||
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
|
||||
.setNetworkSpecifier(new TelephonyNetworkSpecifier(subId))
|
||||
.build();
|
||||
}
|
||||
|
||||
private NetworkRequest getRouteSelectionRequest() {
|
||||
return getExpectedRequestBase().build();
|
||||
return getExpectedRequestBase(true).build();
|
||||
}
|
||||
|
||||
private NetworkRequest.Builder getExpectedRequestBase() {
|
||||
return new NetworkRequest.Builder()
|
||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED)
|
||||
.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||
private NetworkRequest.Builder getExpectedRequestBase(boolean requireVcnManaged) {
|
||||
final NetworkRequest.Builder builder =
|
||||
new NetworkRequest.Builder()
|
||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||
|
||||
if (requireVcnManaged) {
|
||||
builder.addUnwantedCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
|
||||
}
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user