From cefb4b51daf755c143173153ebac771bafd5f7d7 Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Mon, 10 Jun 2019 16:25:35 -0700 Subject: Moving some methods to PendingIntentController Few code paths were still using the AMS lock which would cause races corrupting PendingIntentRecord data. Test: Builds. Existing pending intent tests pass: atest CtsAppTestCases:android.app.cts.PendingIntentTest Bug: 134707863 Change-Id: If55c0df1a24b50e72eb38f24d69a5a4aa1e8bfb3 --- .../android/server/am/ActivityManagerService.java | 34 ++--------------- .../android/server/am/PendingIntentController.java | 43 ++++++++++++++++++++++ 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c5fc5c89cce1..0c7fe114fd40 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5375,34 +5375,13 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void registerIntentSenderCancelListener(IIntentSender sender, IResultReceiver receiver) { - if (!(sender instanceof PendingIntentRecord)) { - return; - } - boolean isCancelled; - synchronized(this) { - PendingIntentRecord pendingIntent = (PendingIntentRecord) sender; - isCancelled = pendingIntent.canceled; - if (!isCancelled) { - pendingIntent.registerCancelListenerLocked(receiver); - } - } - if (isCancelled) { - try { - receiver.send(Activity.RESULT_CANCELED, null); - } catch (RemoteException e) { - } - } + mPendingIntentController.registerIntentSenderCancelListener(sender, receiver); } @Override public void unregisterIntentSenderCancelListener(IIntentSender sender, IResultReceiver receiver) { - if (!(sender instanceof PendingIntentRecord)) { - return; - } - synchronized(this) { - ((PendingIntentRecord)sender).unregisterCancelListenerLocked(receiver); - } + mPendingIntentController.unregisterIntentSenderCancelListener(sender, receiver); } @Override @@ -17679,13 +17658,8 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, long duration) { - if (!(target instanceof PendingIntentRecord)) { - Slog.w(TAG, "markAsSentFromNotification(): not a PendingIntentRecord: " + target); - return; - } - synchronized (ActivityManagerService.this) { - ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration); - } + mPendingIntentController.setPendingIntentWhitelistDuration(target, whitelistToken, + duration); } @Override diff --git a/services/core/java/com/android/server/am/PendingIntentController.java b/services/core/java/com/android/server/am/PendingIntentController.java index a5d47386afb5..d75591cc7432 100644 --- a/services/core/java/com/android/server/am/PendingIntentController.java +++ b/services/core/java/com/android/server/am/PendingIntentController.java @@ -17,6 +17,7 @@ package com.android.server.am; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; + import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; @@ -39,6 +40,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.util.ArrayMap; import android.util.Slog; + import com.android.internal.os.IResultReceiver; import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.LocalServices; @@ -242,6 +244,47 @@ public class PendingIntentController { } } + void registerIntentSenderCancelListener(IIntentSender sender, IResultReceiver receiver) { + if (!(sender instanceof PendingIntentRecord)) { + return; + } + boolean isCancelled; + synchronized (mLock) { + PendingIntentRecord pendingIntent = (PendingIntentRecord) sender; + isCancelled = pendingIntent.canceled; + if (!isCancelled) { + pendingIntent.registerCancelListenerLocked(receiver); + } + } + if (isCancelled) { + try { + receiver.send(Activity.RESULT_CANCELED, null); + } catch (RemoteException e) { + } + } + } + + void unregisterIntentSenderCancelListener(IIntentSender sender, + IResultReceiver receiver) { + if (!(sender instanceof PendingIntentRecord)) { + return; + } + synchronized (mLock) { + ((PendingIntentRecord) sender).unregisterCancelListenerLocked(receiver); + } + } + + void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, + long duration) { + if (!(target instanceof PendingIntentRecord)) { + Slog.w(TAG, "markAsSentFromNotification(): not a PendingIntentRecord: " + target); + return; + } + synchronized (mLock) { + ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration); + } + } + private void makeIntentSenderCanceled(PendingIntentRecord rec) { rec.canceled = true; final RemoteCallbackList callbacks = rec.detachCancelListenersLocked(); -- cgit v1.2.3-59-g8ed1b