diff options
-rw-r--r-- | core/java/android/provider/Settings.java | 10 | ||||
-rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 21 |
2 files changed, 29 insertions, 2 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 0c036d51..0062eb2 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4349,6 +4349,16 @@ public final class Settings { Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS; /** + * The number of milliseconds to hold on to a PendingIntent based request. This delay gives + * the receivers of the PendingIntent an opportunity to make a new network request before + * the Network satisfying the request is potentially removed. + * + * @hide + */ + public static final String CONNECTIVITY_RELEASE_PENDING_INTENT_DELAY_MS = + "connectivity_release_pending_intent_delay_ms"; + + /** * Whether background data usage is allowed. * * @deprecated As of {@link VERSION_CODES#ICE_CREAM_SANDWICH}, diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 348aa1b..a110964 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -215,6 +215,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 @@ -645,6 +649,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"); @@ -3409,6 +3416,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; @@ -3530,6 +3538,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, @@ -3843,10 +3857,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 @@ -3870,7 +3885,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, |