summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/provider/Settings.java10
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java21
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,