Don't send the same PendingIntent more than once.
Fixing a bug where a NetworkRequest's PendingIntent can be sent more than once when networks are rematched before the intent completes. Added a small delay before removing the request to give the receiving client an opportunity to put in its own request. The delay value is configurable via Settings.Secure. Bug: 18614074 Change-Id: Iac7c5e5a04f42f2b6794e9e22349cc631bebeab7
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user