Loading services/core/java/com/android/server/ConnectivityService.java +45 −0 Original line number Diff line number Diff line Loading @@ -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( Loading Loading @@ -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}. Loading Loading @@ -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); } Loading Loading @@ -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); } } } } Loading Loading @@ -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<>(); Loading tests/net/java/com/android/server/ConnectivityServiceTest.java +27 −21 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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)) Loading @@ -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 Loading @@ -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)); } } Loading
services/core/java/com/android/server/ConnectivityService.java +45 −0 Original line number Diff line number Diff line Loading @@ -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( Loading Loading @@ -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}. Loading Loading @@ -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); } Loading Loading @@ -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); } } } } Loading Loading @@ -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<>(); Loading
tests/net/java/com/android/server/ConnectivityServiceTest.java +27 −21 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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)) Loading @@ -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 Loading @@ -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)); } }