Merge "Fire ConnectivityDiagnostics callbacks on Connectivity reported." am: 0b3645740c
Change-Id: I60d418afb145238981c17cc9a29ff57dc42c1ff0
This commit is contained in:
@@ -4198,6 +4198,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
final int connectivityInfo = encodeBool(hasConnectivity);
|
||||
mHandler.sendMessage(
|
||||
mHandler.obtainMessage(EVENT_REVALIDATE_NETWORK, uid, connectivityInfo, network));
|
||||
|
||||
final NetworkAgentInfo nai;
|
||||
if (network == null) {
|
||||
nai = getDefaultNetwork();
|
||||
} else {
|
||||
nai = getNetworkAgentInfoForNetwork(network);
|
||||
}
|
||||
if (nai != null) {
|
||||
mConnectivityDiagnosticsHandler.sendMessage(
|
||||
mConnectivityDiagnosticsHandler.obtainMessage(
|
||||
ConnectivityDiagnosticsHandler.EVENT_NETWORK_CONNECTIVITY_REPORTED,
|
||||
connectivityInfo, 0, nai));
|
||||
}
|
||||
}
|
||||
|
||||
private void handleReportNetworkConnectivity(
|
||||
@@ -7548,6 +7561,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
*/
|
||||
@VisibleForTesting
|
||||
class ConnectivityDiagnosticsHandler extends Handler {
|
||||
private final String mTag = ConnectivityDiagnosticsHandler.class.getSimpleName();
|
||||
|
||||
/**
|
||||
* Used to handle ConnectivityDiagnosticsCallback registration events from {@link
|
||||
* android.net.ConnectivityDiagnosticsManager}.
|
||||
@@ -7585,6 +7600,16 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
*/
|
||||
private static final int EVENT_DATA_STALL_SUSPECTED = 4;
|
||||
|
||||
/**
|
||||
* Event for ConnectivityDiagnosticsHandler to handle network connectivity being reported to
|
||||
* the platform. This event will invoke {@link
|
||||
* IConnectivityDiagnosticsCallback#onNetworkConnectivityReported} for permissioned
|
||||
* callbacks.
|
||||
* obj = Network that was reported on
|
||||
* arg1 = boolint for the quality reported
|
||||
*/
|
||||
private static final int EVENT_NETWORK_CONNECTIVITY_REPORTED = 5;
|
||||
|
||||
private ConnectivityDiagnosticsHandler(Looper looper) {
|
||||
super(looper);
|
||||
}
|
||||
@@ -7626,6 +7651,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
handleDataStallSuspected(nai, (long) msg.obj, msg.arg1, extras);
|
||||
break;
|
||||
}
|
||||
case EVENT_NETWORK_CONNECTIVITY_REPORTED: {
|
||||
handleNetworkConnectivityReported((NetworkAgentInfo) msg.obj, toBool(msg.arg1));
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
Log.e(mTag, "Unrecognized event in ConnectivityDiagnostics: " + msg.what);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7771,6 +7803,19 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
private void handleNetworkConnectivityReported(
|
||||
@NonNull NetworkAgentInfo nai, boolean connectivity) {
|
||||
final List<IConnectivityDiagnosticsCallback> results =
|
||||
getMatchingPermissionedCallbacks(nai);
|
||||
for (final IConnectivityDiagnosticsCallback cb : results) {
|
||||
try {
|
||||
cb.onNetworkConnectivityReported(nai.network, connectivity);
|
||||
} catch (RemoteException ex) {
|
||||
loge("Error invoking onNetworkConnectivityReported", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<IConnectivityDiagnosticsCallback> getMatchingPermissionedCallbacks(
|
||||
@NonNull NetworkAgentInfo nai) {
|
||||
final List<IConnectivityDiagnosticsCallback> results = new ArrayList<>();
|
||||
|
||||
@@ -6609,8 +6609,7 @@ public class ConnectivityServiceTest {
|
||||
mServiceContext.setPermission(perm, PERMISSION_GRANTED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConnectivityDiagnosticsCallbackOnConnectivityReport() throws Exception {
|
||||
private void setUpConnectivityDiagnosticsCallback() throws Exception {
|
||||
final NetworkRequest request = new NetworkRequest.Builder().build();
|
||||
when(mConnectivityDiagnosticsCallback.asBinder()).thenReturn(mIBinder);
|
||||
|
||||
@@ -6630,6 +6629,11 @@ public class ConnectivityServiceTest {
|
||||
mCellNetworkAgent.connect(true);
|
||||
callback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
|
||||
callback.assertNoCallback();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConnectivityDiagnosticsCallbackOnConnectivityReport() throws Exception {
|
||||
setUpConnectivityDiagnosticsCallback();
|
||||
|
||||
// Wait for onConnectivityReport to fire
|
||||
verify(mConnectivityDiagnosticsCallback, timeout(TIMEOUT_MS))
|
||||
@@ -6638,25 +6642,7 @@ public class ConnectivityServiceTest {
|
||||
|
||||
@Test
|
||||
public void testConnectivityDiagnosticsCallbackOnDataStallSuspected() throws Exception {
|
||||
final NetworkRequest request = new NetworkRequest.Builder().build();
|
||||
when(mConnectivityDiagnosticsCallback.asBinder()).thenReturn(mIBinder);
|
||||
|
||||
mServiceContext.setPermission(
|
||||
android.Manifest.permission.NETWORK_STACK, PERMISSION_GRANTED);
|
||||
|
||||
mService.registerConnectivityDiagnosticsCallback(
|
||||
mConnectivityDiagnosticsCallback, request, mContext.getPackageName());
|
||||
|
||||
// Block until all other events are done processing.
|
||||
HandlerUtilsKt.waitForIdle(mCsHandlerThread, TIMEOUT_MS);
|
||||
|
||||
// Connect the cell agent verify that it notifies TestNetworkCallback that it is available
|
||||
final TestNetworkCallback callback = new TestNetworkCallback();
|
||||
mCm.registerDefaultNetworkCallback(callback);
|
||||
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
|
||||
mCellNetworkAgent.connect(true);
|
||||
callback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
|
||||
callback.assertNoCallback();
|
||||
setUpConnectivityDiagnosticsCallback();
|
||||
|
||||
// Trigger notifyDataStallSuspected() on the INetworkMonitorCallbacks instance in the
|
||||
// cellular network agent
|
||||
@@ -6666,4 +6652,24 @@ public class ConnectivityServiceTest {
|
||||
verify(mConnectivityDiagnosticsCallback, timeout(TIMEOUT_MS))
|
||||
.onDataStallSuspected(any(DataStallReport.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConnectivityDiagnosticsCallbackOnConnectivityReported() throws Exception {
|
||||
setUpConnectivityDiagnosticsCallback();
|
||||
|
||||
final Network n = mCellNetworkAgent.getNetwork();
|
||||
final boolean hasConnectivity = true;
|
||||
mService.reportNetworkConnectivity(n, hasConnectivity);
|
||||
|
||||
// Wait for onNetworkConnectivityReported to fire
|
||||
verify(mConnectivityDiagnosticsCallback, timeout(TIMEOUT_MS))
|
||||
.onNetworkConnectivityReported(eq(n), eq(hasConnectivity));
|
||||
|
||||
final boolean noConnectivity = false;
|
||||
mService.reportNetworkConnectivity(n, noConnectivity);
|
||||
|
||||
// Wait for onNetworkConnectivityReported to fire
|
||||
verify(mConnectivityDiagnosticsCallback, timeout(TIMEOUT_MS))
|
||||
.onNetworkConnectivityReported(eq(n), eq(noConnectivity));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user