From 4cb61898020f0c5458a7081e32ebf369b970a30b Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Mon, 28 Jun 2021 07:27:47 +0000 Subject: [PATCH] Fix null PendingIntent in network listens In S ConnectivityService was changed to use getActiveRequest() to fill EXTRA_NETWORK_REQUEST, but there is no active request in the case of listens. When getActiveRequest() is missing, use the first mRequest instead. This should match previous behavior. Bug: 191713869 Test: atest android.net.cts.ConnectivityManagerTest Original-Change: https://android-review.googlesource.com/1748153 Merged-In: Id7343a4cc020aba16b7979b16334721c56b2839c Change-Id: Id7343a4cc020aba16b7979b16334721c56b2839c --- .../src/com/android/server/ConnectivityService.java | 13 ++++++++++--- .../android/net/cts/ConnectivityManagerTest.java | 3 --- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 1f91eca0ed..94f652d307 100644 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -7596,9 +7596,16 @@ public class ConnectivityService extends IConnectivityManager.Stub // If apps could file multi-layer requests with PendingIntents, they'd need to know // which of the layer is satisfied alongside with some ID for the request. Hence, if // such an API is ever implemented, there is no doubt the right request to send in - // EXTRA_NETWORK_REQUEST is mActiveRequest, and whatever ID would be added would need to - // be sent as a separate extra. - intent.putExtra(ConnectivityManager.EXTRA_NETWORK_REQUEST, nri.getActiveRequest()); + // EXTRA_NETWORK_REQUEST is the active request, and whatever ID would be added would + // need to be sent as a separate extra. + final NetworkRequest req = nri.isMultilayerRequest() + ? nri.getActiveRequest() + // Non-multilayer listen requests do not have an active request + : nri.mRequests.get(0); + if (req == null) { + Log.wtf(TAG, "No request in NRI " + nri); + } + intent.putExtra(ConnectivityManager.EXTRA_NETWORK_REQUEST, req); nri.mPendingIntentSent = true; sendIntent(nri.mPendingIntent, intent); } diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java index ca8d9e6380..9ad952241a 100644 --- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java +++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java @@ -76,7 +76,6 @@ import static android.system.OsConstants.AF_UNSPEC; import static com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity; import static com.android.compatibility.common.util.SystemUtil.runShellCommand; import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity; -import static com.android.modules.utils.build.SdkLevel.isAtLeastS; import static com.android.networkstack.apishim.ConstantsShim.BLOCKED_REASON_LOCKDOWN_VPN; import static com.android.networkstack.apishim.ConstantsShim.BLOCKED_REASON_NONE; import static com.android.testutils.MiscAsserts.assertThrows; @@ -958,8 +957,6 @@ public class ConnectivityManagerTest { private void assertPendingIntentRequestMatches(NetworkRequest broadcasted, NetworkRequest filed, boolean useListen) { - // TODO: BUG (b/191713869): on S the request extra is null on listens - if (isAtLeastS() && useListen && broadcasted == null) return; assertArrayEquals(filed.networkCapabilities.getCapabilities(), broadcasted.networkCapabilities.getCapabilities()); // TODO: BUG (b/189868426): this should also apply to listens