diff options
3 files changed, 37 insertions, 8 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 0a34d36f204e..b73431571760 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3540,15 +3540,12 @@ public class Notification implements Parcelable * Sets the token used for background operations for the pending intents associated with this * notification. * - * This token is automatically set during deserialization for you, you usually won't need to - * call this unless you want to change the existing token, if any. - * * @hide */ - public void clearAllowlistToken() { - mAllowlistToken = null; + public void overrideAllowlistToken(IBinder token) { + mAllowlistToken = token; if (publicVersion != null) { - publicVersion.clearAllowlistToken(); + publicVersion.overrideAllowlistToken(token); } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 6fa737d2e661..7c3d43f410b1 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -727,7 +727,7 @@ public class NotificationManagerService extends SystemService { private static final int MY_UID = Process.myUid(); private static final int MY_PID = Process.myPid(); - private static final IBinder ALLOWLIST_TOKEN = new Binder(); + static final IBinder ALLOWLIST_TOKEN = new Binder(); protected RankingHandler mRankingHandler; private long mLastOverRateLogTime; private float mMaxPackageEnqueueRate = DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE; @@ -4759,7 +4759,7 @@ public class NotificationManagerService extends SystemService { // Remove background token before returning notification to untrusted app, this // ensures the app isn't able to perform background operations that are // associated with notification interactions. - notification.clearAllowlistToken(); + notification.overrideAllowlistToken(null); return new StatusBarNotification( sbn.getPackageName(), sbn.getOpPkg(), @@ -7634,6 +7634,8 @@ public class NotificationManagerService extends SystemService { } } + notification.overrideAllowlistToken(ALLOWLIST_TOKEN); + // Remote views? Are they too big? checkRemoteViews(pkg, tag, id, notification); } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 3426cbe425db..f7a47426926b 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -323,6 +323,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -12862,6 +12863,35 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void fixNotification_customAllowlistToken() + throws Exception { + Notification n = new Notification.Builder(mContext, "test") + .build(); + try { + Field allowlistToken = Class.forName("android.app.Notification"). + getDeclaredField("mAllowlistToken"); + allowlistToken.setAccessible(true); + allowlistToken.set(n, new Binder()); + } catch (Exception e) { + throw new RuntimeException(e); + } + + mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true); + + IBinder actual = null; + try { + Field allowlistToken = Class.forName("android.app.Notification"). + getDeclaredField("mAllowlistToken"); + allowlistToken.setAccessible(true); + actual = (IBinder) allowlistToken.get(n); + } catch (Exception e) { + throw new RuntimeException(e); + } + + assertTrue(mService.ALLOWLIST_TOKEN == actual); + } + + @Test public void testCancelAllNotifications_IgnoreUserInitiatedJob() throws Exception { when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString())) .thenReturn(true); |