Merge changes I6ec246a6,If7eb8857,Id3d12b23,Ia52f9caf,I21028457, ... into rvc-dev am: 65eb4a4332
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13425320 Change-Id: Id5810e50b56389fe53f739f84ad79d8ef878e4f6
This commit is contained in:
@@ -6316,6 +6316,25 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
return newNc;
|
return newNc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateNetworkInfoForRoamingAndSuspended(NetworkAgentInfo nai,
|
||||||
|
NetworkCapabilities prevNc, NetworkCapabilities newNc) {
|
||||||
|
final boolean prevSuspended = !prevNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED);
|
||||||
|
final boolean suspended = !newNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED);
|
||||||
|
final boolean prevRoaming = !prevNc.hasCapability(NET_CAPABILITY_NOT_ROAMING);
|
||||||
|
final boolean roaming = !newNc.hasCapability(NET_CAPABILITY_NOT_ROAMING);
|
||||||
|
if (prevSuspended != suspended) {
|
||||||
|
// TODO (b/73132094) : remove this call once the few users of onSuspended and
|
||||||
|
// onResumed have been removed.
|
||||||
|
notifyNetworkCallbacks(nai, suspended ? ConnectivityManager.CALLBACK_SUSPENDED
|
||||||
|
: ConnectivityManager.CALLBACK_RESUMED);
|
||||||
|
}
|
||||||
|
if (prevSuspended != suspended || prevRoaming != roaming) {
|
||||||
|
// updateNetworkInfo will mix in the suspended info from the capabilities and
|
||||||
|
// take appropriate action for the network having possibly changed state.
|
||||||
|
updateNetworkInfo(nai, nai.networkInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the NetworkCapabilities for {@code nai} to {@code nc}. Specifically:
|
* Update the NetworkCapabilities for {@code nai} to {@code nc}. Specifically:
|
||||||
*
|
*
|
||||||
@@ -6347,25 +6366,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
// on this network. We might have been called by rematchNetworkAndRequests when a
|
// on this network. We might have been called by rematchNetworkAndRequests when a
|
||||||
// network changed foreground state.
|
// network changed foreground state.
|
||||||
processListenRequests(nai);
|
processListenRequests(nai);
|
||||||
final boolean prevSuspended = !prevNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED);
|
|
||||||
final boolean suspended = !newNc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED);
|
|
||||||
final boolean prevRoaming = !prevNc.hasCapability(NET_CAPABILITY_NOT_ROAMING);
|
|
||||||
final boolean roaming = !newNc.hasCapability(NET_CAPABILITY_NOT_ROAMING);
|
|
||||||
if (prevSuspended != suspended || prevRoaming != roaming) {
|
|
||||||
// TODO (b/73132094) : remove this call once the few users of onSuspended and
|
|
||||||
// onResumed have been removed.
|
|
||||||
notifyNetworkCallbacks(nai, suspended ? ConnectivityManager.CALLBACK_SUSPENDED
|
|
||||||
: ConnectivityManager.CALLBACK_RESUMED);
|
|
||||||
// updateNetworkInfo will mix in the suspended info from the capabilities and
|
|
||||||
// take appropriate action for the network having possibly changed state.
|
|
||||||
updateNetworkInfo(nai, nai.networkInfo);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// If the requestable capabilities have changed or the score changed, we can't have been
|
// If the requestable capabilities have changed or the score changed, we can't have been
|
||||||
// called by rematchNetworkAndRequests, so it's safe to start a rematch.
|
// called by rematchNetworkAndRequests, so it's safe to start a rematch.
|
||||||
rematchAllNetworksAndRequests();
|
rematchAllNetworksAndRequests();
|
||||||
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
|
notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
|
||||||
}
|
}
|
||||||
|
updateNetworkInfoForRoamingAndSuspended(nai, prevNc, newNc);
|
||||||
|
|
||||||
// TODO : static analysis indicates that prevNc can't be null here (getAndSetNetworkCaps
|
// TODO : static analysis indicates that prevNc can't be null here (getAndSetNetworkCaps
|
||||||
// never returns null), so mark the relevant members and functions in nai as @NonNull and
|
// never returns null), so mark the relevant members and functions in nai as @NonNull and
|
||||||
|
|||||||
@@ -5488,23 +5488,18 @@ public class ConnectivityServiceTest {
|
|||||||
callback.expectCapabilitiesThat(mMockVpn,
|
callback.expectCapabilitiesThat(mMockVpn,
|
||||||
nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)
|
nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)
|
||||||
&& nc.hasTransport(TRANSPORT_WIFI));
|
&& nc.hasTransport(TRANSPORT_WIFI));
|
||||||
|
callback.expectCallback(CallbackEntry.RESUMED, mMockVpn);
|
||||||
// BUG: the VPN is no longer suspended, so a RESUMED callback should have been sent.
|
|
||||||
// callback.expectCallback(CallbackEntry.RESUMED, mMockVpn);
|
|
||||||
callback.assertNoCallback();
|
callback.assertNoCallback();
|
||||||
|
|
||||||
assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork())
|
assertTrue(mCm.getNetworkCapabilities(mMockVpn.getNetwork())
|
||||||
.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
|
.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
|
||||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
|
assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
|
||||||
assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
|
assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
|
||||||
assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED.
|
assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED);
|
||||||
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
|
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
|
||||||
// BUG: the device has connectivity, so this should return true.
|
assertGetNetworkInfoOfGetActiveNetworkIsConnected(true);
|
||||||
assertGetNetworkInfoOfGetActiveNetworkIsConnected(false);
|
|
||||||
|
|
||||||
// Unsuspend cellular and then switch back to it.
|
// Unsuspend cellular and then switch back to it. The VPN remains not suspended.
|
||||||
// The same bug happens in the opposite direction: the VPN's capabilities correctly have
|
|
||||||
// NOT_SUSPENDED, but the VPN's NetworkInfo is in state SUSPENDED.
|
|
||||||
mCellNetworkAgent.resume();
|
mCellNetworkAgent.resume();
|
||||||
mWiFiNetworkAgent.disconnect();
|
mWiFiNetworkAgent.disconnect();
|
||||||
callback.expectCapabilitiesThat(mMockVpn,
|
callback.expectCapabilitiesThat(mMockVpn,
|
||||||
@@ -5520,12 +5515,11 @@ public class ConnectivityServiceTest {
|
|||||||
.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
|
.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
|
||||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED);
|
assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED);
|
||||||
assertNetworkInfo(TYPE_VPN, DetailedState.SUSPENDED); // BUG: VPN caps have NOT_SUSPENDED.
|
assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED);
|
||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||||
// BUG: the device has connectivity, so this should return true.
|
assertGetNetworkInfoOfGetActiveNetworkIsConnected(true);
|
||||||
assertGetNetworkInfoOfGetActiveNetworkIsConnected(false);
|
|
||||||
|
|
||||||
// Re-suspending the current network fixes the problem.
|
// Suspend cellular and expect no connectivity.
|
||||||
mCellNetworkAgent.suspend();
|
mCellNetworkAgent.suspend();
|
||||||
callback.expectCapabilitiesThat(mMockVpn,
|
callback.expectCapabilitiesThat(mMockVpn,
|
||||||
nc -> !nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)
|
nc -> !nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)
|
||||||
@@ -5541,6 +5535,7 @@ public class ConnectivityServiceTest {
|
|||||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED);
|
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.SUSPENDED);
|
||||||
assertGetNetworkInfoOfGetActiveNetworkIsConnected(false);
|
assertGetNetworkInfoOfGetActiveNetworkIsConnected(false);
|
||||||
|
|
||||||
|
// Resume cellular and expect that connectivity comes back.
|
||||||
mCellNetworkAgent.resume();
|
mCellNetworkAgent.resume();
|
||||||
callback.expectCapabilitiesThat(mMockVpn,
|
callback.expectCapabilitiesThat(mMockVpn,
|
||||||
nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)
|
nc -> nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED)
|
||||||
@@ -5926,10 +5921,7 @@ public class ConnectivityServiceTest {
|
|||||||
&& caps.hasTransport(TRANSPORT_CELLULAR)
|
&& caps.hasTransport(TRANSPORT_CELLULAR)
|
||||||
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
|
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
|
||||||
&& !caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
|
&& !caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
|
||||||
// While the SUSPENDED callback should in theory be sent here, it is not. This is
|
vpnNetworkCallback.expectCallback(CallbackEntry.SUSPENDED, mMockVpn);
|
||||||
// a bug in ConnectivityService, but as the SUSPENDED and RESUMED callbacks have never
|
|
||||||
// been public and are deprecated and slated for removal, there is no sense in spending
|
|
||||||
// resources fixing this bug now.
|
|
||||||
assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
|
assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
|
||||||
|
|
||||||
// Use both again.
|
// Use both again.
|
||||||
@@ -5941,8 +5933,7 @@ public class ConnectivityServiceTest {
|
|||||||
&& caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
|
&& caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
|
||||||
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
|
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
|
||||||
&& caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
|
&& caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
|
||||||
// As above, the RESUMED callback not being sent here is a bug, but not a bug that's
|
vpnNetworkCallback.expectCallback(CallbackEntry.RESUMED, mMockVpn);
|
||||||
// worth anybody's time to fix.
|
|
||||||
assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
|
assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
|
||||||
|
|
||||||
// Disconnect cell. Receive update without even removing the dead network from the
|
// Disconnect cell. Receive update without even removing the dead network from the
|
||||||
|
|||||||
Reference in New Issue
Block a user