Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df956539 authored by James Mattis's avatar James Mattis
Browse files

Multilayer request updates to request callbacks

Updated to ConnectivityService to support multilayer requests when
sending request level callbacks.

Bug: 174797702
Bug: 171991028
Test: atest FrameworksNetTests
atest NetworkStackTests
atest FrameworksNetIntegrationTests
atest NetworkStackIntegrationTests
atest CtsNetTestCasesLatestSdk

Change-Id: I3d6896f5705509bcfff5544d2eb13c31feaf1937
parent 24ee9262
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -7003,8 +7003,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
        releasePendingNetworkRequestWithDelay(pendingIntent);
    }

    private void callCallbackForRequest(NetworkRequestInfo nri,
            NetworkAgentInfo networkAgent, int notificationType, int arg1) {
    private void callCallbackForRequest(@NonNull final NetworkRequestInfo nri,
            @NonNull final NetworkAgentInfo networkAgent, final int notificationType,
            final int arg1) {
        if (nri.messenger == null) {
            // Default request has no msgr. Also prevents callbacks from being invoked for
            // NetworkRequestInfos registered with ConnectivityDiagnostics requests. Those callbacks
@@ -7012,8 +7013,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
            return;
        }
        Bundle bundle = new Bundle();
        // In the case of multi-layer NRIs, the first request is not necessarily the one that
        // is satisfied. This is vexing, but the ConnectivityManager code that receives this
        // callback is only using the request as a token to identify the callback, so it doesn't
        // matter too much at this point as long as the callback can be found.
        // TODO b/177608132: make sure callbacks are indexed by NRIs and not NetworkRequest objects.
        // TODO: check if defensive copies of data is needed.
        putParcelable(bundle, new NetworkRequest(nri.request));
        final NetworkRequest nrForCallback = new NetworkRequest(nri.mRequests.get(0));
        putParcelable(bundle, nrForCallback);
        Message msg = Message.obtain();
        if (notificationType != ConnectivityManager.CALLBACK_UNAVAIL) {
            putParcelable(bundle, networkAgent.network);
@@ -7026,7 +7033,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
                putParcelable(
                        bundle,
                        createWithLocationInfoSanitizedIfNecessaryWhenParceled(
                                nc, nri.mUid, nri.request.getRequestorPackageName()));
                                nc, nri.mUid, nrForCallback.getRequestorPackageName()));
                putParcelable(bundle, linkPropertiesRestrictedForCallerPermissions(
                        networkAgent.linkProperties, nri.mPid, nri.mUid));
                // For this notification, arg1 contains the blocked status.
@@ -7045,7 +7052,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
                putParcelable(
                        bundle,
                        createWithLocationInfoSanitizedIfNecessaryWhenParceled(
                                netCap, nri.mUid, nri.request.getRequestorPackageName()));
                                netCap, nri.mUid, nrForCallback.getRequestorPackageName()));
                break;
            }
            case ConnectivityManager.CALLBACK_IP_CHANGED: {
@@ -7064,12 +7071,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
        try {
            if (VDBG) {
                String notification = ConnectivityManager.getCallbackName(notificationType);
                log("sending notification " + notification + " for " + nri.request);
                log("sending notification " + notification + " for " + nrForCallback);
            }
            nri.messenger.send(msg);
        } catch (RemoteException e) {
            // may occur naturally in the race of binder death.
            loge("RemoteException caught trying to send a callback msg for " + nri.request);
            loge("RemoteException caught trying to send a callback msg for " + nrForCallback);
        }
    }