diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 97d8c2f831..9c0e486af7 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -216,6 +216,10 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int SAMPLE_INTERVAL_ELAPSED_REQUEST_CODE = 0; + // How long to delay to removal of a pending intent based request. + // See Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS + private final int mReleasePendingIntentDelayMs; + private PendingIntent mSampleIntervalElapsedIntent; // Set network sampling interval at 12 minutes, this way, even if the timers get @@ -666,6 +670,9 @@ public class ConnectivityService extends IConnectivityManager.Stub loge("Error setting defaultDns using " + dns); } + mReleasePendingIntentDelayMs = Settings.Secure.getInt(context.getContentResolver(), + Settings.Secure.CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS, 5_000); + mContext = checkNotNull(context, "missing Context"); mNetd = checkNotNull(netManager, "missing INetworkManagementService"); mPolicyManager = checkNotNull(policyManager, "missing INetworkPolicyManager"); @@ -3441,6 +3448,7 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkRequest request; final PendingIntent mPendingIntent; + boolean mPendingIntentSent; private final IBinder mBinder; final int mPid; final int mUid; @@ -3562,6 +3570,12 @@ public class ConnectivityService extends IConnectivityManager.Stub return networkRequest; } + private void releasePendingNetworkRequestWithDelay(PendingIntent operation) { + mHandler.sendMessageDelayed( + mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST_WITH_INTENT, + getCallingUid(), 0, operation), mReleasePendingIntentDelayMs); + } + @Override public void releasePendingNetworkRequest(PendingIntent operation) { mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST_WITH_INTENT, @@ -3875,10 +3889,11 @@ public class ConnectivityService extends IConnectivityManager.Stub private void sendPendingIntentForRequest(NetworkRequestInfo nri, NetworkAgentInfo networkAgent, int notificationType) { - if (notificationType == ConnectivityManager.CALLBACK_AVAILABLE) { + if (notificationType == ConnectivityManager.CALLBACK_AVAILABLE && !nri.mPendingIntentSent) { Intent intent = new Intent(); intent.putExtra(ConnectivityManager.EXTRA_NETWORK, networkAgent.network); intent.putExtra(ConnectivityManager.EXTRA_NETWORK_REQUEST, nri.request); + nri.mPendingIntentSent = true; sendIntent(nri.mPendingIntent, intent); } // else not handled @@ -3902,7 +3917,9 @@ public class ConnectivityService extends IConnectivityManager.Stub String resultData, Bundle resultExtras) { if (DBG) log("Finished sending " + pendingIntent); mPendingIntentWakeLock.release(); - releasePendingNetworkRequest(pendingIntent); + // Release with a delay so the receiving client has an opportunity to put in its + // own request. + releasePendingNetworkRequestWithDelay(pendingIntent); } private void callCallbackForRequest(NetworkRequestInfo nri,