summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Suprabh Shukla <suprabh@google.com> 2019-06-10 16:25:35 -0700
committer Suprabh Shukla <suprabh@google.com> 2019-06-10 16:56:32 -0700
commitcefb4b51daf755c143173153ebac771bafd5f7d7 (patch)
tree1c4703b7578e0c03dc4d49553354977804f1c57d
parent6df373efdd78d1b1c26739e4022305f5ad6cb844 (diff)
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
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java34
-rw-r--r--services/core/java/com/android/server/am/PendingIntentController.java43
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<IResultReceiver> callbacks = rec.detachCancelListenersLocked();