diff options
| author | 2019-06-10 16:25:35 -0700 | |
|---|---|---|
| committer | 2019-06-10 16:56:32 -0700 | |
| commit | cefb4b51daf755c143173153ebac771bafd5f7d7 (patch) | |
| tree | 1c4703b7578e0c03dc4d49553354977804f1c57d | |
| parent | 6df373efdd78d1b1c26739e4022305f5ad6cb844 (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.java | 34 | ||||
| -rw-r--r-- | services/core/java/com/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<IResultReceiver> callbacks = rec.detachCancelListenersLocked(); |