Loading core/java/android/app/ActivityManagerInternal.java +17 −4 Original line number Diff line number Diff line Loading @@ -100,9 +100,13 @@ public abstract class ActivityManagerInternal { /** * Sets how long a {@link PendingIntent} can be temporarily whitelist to by bypass restrictions * such as Power Save mode. * @param target * @param whitelistToken * @param duration temp allowlist duration in milliseconds. * @param type temp allowlist type defined at {@link BroadcastOptions.TempAllowListType} */ public abstract void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, long duration); IBinder whitelistToken, long duration, int type); /** * Returns the flags set for a {@link PendingIntent}. Loading Loading @@ -318,8 +322,17 @@ public abstract class ActivityManagerInternal { public abstract boolean isBooted(); public abstract void finishBooting(); /** * Temp allowlist a UID for PendingIntent. * @param callerPid the PID that sent the PendingIntent. * @param callerUid the UID that sent the PendingIntent. * @param targetUid the UID that is been temp allowlisted. * @param duration temp allowlist duration in milliseconds. * @param type temp allowlist type defined at {@link BroadcastOptions.TempAllowListType} * @param tag */ public abstract void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid, long duration, String tag); long duration, int type, String tag); public abstract int broadcastIntentInPackage(String packageName, @Nullable String featureId, int uid, int realCallingUid, int realCallingPid, Intent intent, String resolvedType, Loading services/core/java/com/android/server/am/ActivityManagerService.java +12 −9 Original line number Diff line number Diff line Loading @@ -15320,10 +15320,10 @@ public class ActivityManagerService extends IActivityManager.Stub */ @GuardedBy("this") void tempWhitelistForPendingIntentLocked(int callerPid, int callerUid, int targetUid, long duration, String tag) { long duration, int type, String tag) { if (DEBUG_WHITELISTS) { Slog.d(TAG, "tempWhitelistForPendingIntentLocked(" + callerPid + ", " + callerUid + ", " + targetUid + ", " + duration + ")"); + targetUid + ", " + duration + ", " + type + ")"); } synchronized (mPidsSelfLocked) { Loading @@ -15335,7 +15335,11 @@ public class ActivityManagerService extends IActivityManager.Stub } if (!pr.whitelistManager) { if (checkPermission(CHANGE_DEVICE_IDLE_TEMP_WHITELIST, callerPid, callerUid) != PackageManager.PERMISSION_GRANTED) { != PackageManager.PERMISSION_GRANTED && checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callerPid, callerUid) != PackageManager.PERMISSION_GRANTED && checkPermission(START_FOREGROUND_SERVICES_FROM_BACKGROUND, callerPid, callerUid) != PackageManager.PERMISSION_GRANTED) { if (DEBUG_WHITELISTS) { Slog.d(TAG, "tempWhitelistForPendingIntentLocked() for target " + targetUid + ": pid " + callerPid + " is not allowed"); Loading @@ -15345,8 +15349,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } tempWhitelistUidLocked(targetUid, duration, tag, BroadcastOptions.TEMPORARY_WHITELIST_TYPE_FOREGROUND_SERVICE_ALLOWED); tempWhitelistUidLocked(targetUid, duration, tag, type); } /** Loading Loading @@ -15949,9 +15952,9 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, long duration) { long duration, int type) { mPendingIntentController.setPendingIntentWhitelistDuration(target, whitelistToken, duration); duration, type); } @Override Loading Loading @@ -16367,10 +16370,10 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid, long duration, String tag) { long duration, int type, String tag) { synchronized (ActivityManagerService.this) { ActivityManagerService.this.tempWhitelistForPendingIntentLocked( callerPid, callerUid, targetUid, duration, tag); callerPid, callerUid, targetUid, duration, type, tag); } } services/core/java/com/android/server/am/PendingIntentController.java +3 −2 Original line number Diff line number Diff line Loading @@ -301,13 +301,14 @@ public class PendingIntentController { } void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, long duration) { long duration, int type) { if (!(target instanceof PendingIntentRecord)) { Slog.w(TAG, "markAsSentFromNotification(): not a PendingIntentRecord: " + target); return; } synchronized (mLock) { ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration); ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration, type); } } Loading services/core/java/com/android/server/am/PendingIntentRecord.java +43 −37 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NA import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.BroadcastOptions; import android.app.PendingIntent; import android.content.IIntentReceiver; import android.content.IIntentSender; Loading @@ -37,6 +38,7 @@ import android.os.TransactionTooLargeException; import android.os.UserHandle; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Pair; import android.util.Slog; import android.util.TimeUtils; Loading @@ -61,7 +63,11 @@ public final class PendingIntentRecord extends IIntentSender.Stub { public final WeakReference<PendingIntentRecord> ref; boolean sent = false; boolean canceled = false; private ArrayMap<IBinder, Long> whitelistDuration; /** * Map IBinder to duration specified as Pair<Long, Integer>, Long is allowlist duration in * milliseconds, Integer is allowlist type defined at {@link BroadcastOptions.TempAllowListType} */ private ArrayMap<IBinder, Pair<Long, Integer>> mWhitelistDuration; private RemoteCallbackList<IResultReceiver> mCancelCallbacks; private ArraySet<IBinder> mAllowBgActivityStartsForActivitySender = new ArraySet<>(); private ArraySet<IBinder> mAllowBgActivityStartsForBroadcastSender = new ArraySet<>(); Loading Loading @@ -215,16 +221,16 @@ public final class PendingIntentRecord extends IIntentSender.Stub { ref = new WeakReference<>(this); } void setWhitelistDurationLocked(IBinder whitelistToken, long duration) { void setWhitelistDurationLocked(IBinder whitelistToken, long duration, int type) { if (duration > 0) { if (whitelistDuration == null) { whitelistDuration = new ArrayMap<>(); if (mWhitelistDuration == null) { mWhitelistDuration = new ArrayMap<>(); } whitelistDuration.put(whitelistToken, duration); } else if (whitelistDuration != null) { whitelistDuration.remove(whitelistToken); if (whitelistDuration.size() <= 0) { whitelistDuration = null; mWhitelistDuration.put(whitelistToken, new Pair(duration, type)); } else if (mWhitelistDuration != null) { mWhitelistDuration.remove(whitelistToken); if (mWhitelistDuration.size() <= 0) { mWhitelistDuration = null; } } Loading Loading @@ -292,7 +298,7 @@ public final class PendingIntentRecord extends IIntentSender.Stub { if (intent != null) intent.setDefusable(true); if (options != null) options.setDefusable(true); Long duration = null; Pair<Long, Integer> duration = null; Intent finalIntent = null; Intent[] allIntents = null; String[] allResolvedTypes = null; Loading Loading @@ -341,8 +347,8 @@ public final class PendingIntentRecord extends IIntentSender.Stub { mergedOptions.setCallerOptions(opts); } if (whitelistDuration != null) { duration = whitelistDuration.get(whitelistToken); if (mWhitelistDuration != null) { duration = mWhitelistDuration.get(whitelistToken); } if (key.type == ActivityManager.INTENT_SENDER_ACTIVITY Loading Loading @@ -370,8 +376,6 @@ public final class PendingIntentRecord extends IIntentSender.Stub { int res = START_SUCCESS; try { if (duration != null) { int procState = controller.mAmInternal.getUidProcessState(callingUid); if (!ActivityManager.isProcStateBackground(procState)) { StringBuilder tag = new StringBuilder(64); tag.append("pendingintent:"); UserHandle.formatUid(tag, callingUid); Loading @@ -384,10 +388,7 @@ public final class PendingIntentRecord extends IIntentSender.Stub { tag.append(finalIntent.getData().toSafeString()); } controller.mAmInternal.tempWhitelistForPendingIntent(callingPid, callingUid, uid, duration, tag.toString()); } else { Slog.w(TAG, "Not doing whitelist " + this + ": caller state=" + procState); } uid, duration.first, duration.second, tag.toString()); } boolean sendFinish = finishedReceiver != null; Loading Loading @@ -532,16 +533,18 @@ public final class PendingIntentRecord extends IIntentSender.Stub { pw.print(prefix); pw.print("sent="); pw.print(sent); pw.print(" canceled="); pw.println(canceled); } if (whitelistDuration != null) { if (mWhitelistDuration != null) { pw.print(prefix); pw.print("whitelistDuration="); for (int i = 0; i < whitelistDuration.size(); i++) { for (int i = 0; i < mWhitelistDuration.size(); i++) { if (i != 0) { pw.print(", "); } pw.print(Integer.toHexString(System.identityHashCode(whitelistDuration.keyAt(i)))); pw.print(Integer.toHexString(System.identityHashCode(mWhitelistDuration.keyAt(i)))); pw.print(":"); TimeUtils.formatDuration(whitelistDuration.valueAt(i), pw); TimeUtils.formatDuration(mWhitelistDuration.valueAt(i).first, pw); pw.print("/"); pw.print(mWhitelistDuration.valueAt(i).second); } pw.println(); } Loading Loading @@ -569,15 +572,18 @@ public final class PendingIntentRecord extends IIntentSender.Stub { } sb.append(' '); sb.append(key.typeName()); if (whitelistDuration != null) { if (mWhitelistDuration != null) { sb.append( " (whitelist: "); for (int i = 0; i < whitelistDuration.size(); i++) { for (int i = 0; i < mWhitelistDuration.size(); i++) { if (i != 0) { sb.append(","); } sb.append(Integer.toHexString(System.identityHashCode(whitelistDuration.keyAt(i)))); sb.append(Integer.toHexString(System.identityHashCode( mWhitelistDuration.keyAt(i)))); sb.append(":"); TimeUtils.formatDuration(whitelistDuration.valueAt(i), sb); TimeUtils.formatDuration(mWhitelistDuration.valueAt(i).first, sb); sb.append("/"); sb.append(mWhitelistDuration.valueAt(i).second); } sb.append(")"); } Loading services/core/java/com/android/server/notification/NotificationManagerService.java +4 −1 Original line number Diff line number Diff line Loading @@ -128,6 +128,7 @@ import android.app.AlarmManager; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.AutomaticZenRule; import android.app.BroadcastOptions; import android.app.IActivityManager; import android.app.INotificationManager; import android.app.ITransientNotification; Loading Loading @@ -5960,7 +5961,9 @@ public class NotificationManagerService extends SystemService { PendingIntent pendingIntent = notification.allPendingIntents.valueAt(i); if (pendingIntent != null) { am.setPendingIntentWhitelistDuration(pendingIntent.getTarget(), ALLOWLIST_TOKEN, duration); ALLOWLIST_TOKEN, duration, BroadcastOptions.TEMPORARY_WHITELIST_TYPE_FOREGROUND_SERVICE_ALLOWED ); am.setPendingIntentAllowBgActivityStarts(pendingIntent.getTarget(), ALLOWLIST_TOKEN, (FLAG_ACTIVITY_SENDER | FLAG_BROADCAST_SENDER | FLAG_SERVICE_SENDER)); Loading Loading
core/java/android/app/ActivityManagerInternal.java +17 −4 Original line number Diff line number Diff line Loading @@ -100,9 +100,13 @@ public abstract class ActivityManagerInternal { /** * Sets how long a {@link PendingIntent} can be temporarily whitelist to by bypass restrictions * such as Power Save mode. * @param target * @param whitelistToken * @param duration temp allowlist duration in milliseconds. * @param type temp allowlist type defined at {@link BroadcastOptions.TempAllowListType} */ public abstract void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, long duration); IBinder whitelistToken, long duration, int type); /** * Returns the flags set for a {@link PendingIntent}. Loading Loading @@ -318,8 +322,17 @@ public abstract class ActivityManagerInternal { public abstract boolean isBooted(); public abstract void finishBooting(); /** * Temp allowlist a UID for PendingIntent. * @param callerPid the PID that sent the PendingIntent. * @param callerUid the UID that sent the PendingIntent. * @param targetUid the UID that is been temp allowlisted. * @param duration temp allowlist duration in milliseconds. * @param type temp allowlist type defined at {@link BroadcastOptions.TempAllowListType} * @param tag */ public abstract void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid, long duration, String tag); long duration, int type, String tag); public abstract int broadcastIntentInPackage(String packageName, @Nullable String featureId, int uid, int realCallingUid, int realCallingPid, Intent intent, String resolvedType, Loading
services/core/java/com/android/server/am/ActivityManagerService.java +12 −9 Original line number Diff line number Diff line Loading @@ -15320,10 +15320,10 @@ public class ActivityManagerService extends IActivityManager.Stub */ @GuardedBy("this") void tempWhitelistForPendingIntentLocked(int callerPid, int callerUid, int targetUid, long duration, String tag) { long duration, int type, String tag) { if (DEBUG_WHITELISTS) { Slog.d(TAG, "tempWhitelistForPendingIntentLocked(" + callerPid + ", " + callerUid + ", " + targetUid + ", " + duration + ")"); + targetUid + ", " + duration + ", " + type + ")"); } synchronized (mPidsSelfLocked) { Loading @@ -15335,7 +15335,11 @@ public class ActivityManagerService extends IActivityManager.Stub } if (!pr.whitelistManager) { if (checkPermission(CHANGE_DEVICE_IDLE_TEMP_WHITELIST, callerPid, callerUid) != PackageManager.PERMISSION_GRANTED) { != PackageManager.PERMISSION_GRANTED && checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callerPid, callerUid) != PackageManager.PERMISSION_GRANTED && checkPermission(START_FOREGROUND_SERVICES_FROM_BACKGROUND, callerPid, callerUid) != PackageManager.PERMISSION_GRANTED) { if (DEBUG_WHITELISTS) { Slog.d(TAG, "tempWhitelistForPendingIntentLocked() for target " + targetUid + ": pid " + callerPid + " is not allowed"); Loading @@ -15345,8 +15349,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } tempWhitelistUidLocked(targetUid, duration, tag, BroadcastOptions.TEMPORARY_WHITELIST_TYPE_FOREGROUND_SERVICE_ALLOWED); tempWhitelistUidLocked(targetUid, duration, tag, type); } /** Loading Loading @@ -15949,9 +15952,9 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, long duration) { long duration, int type) { mPendingIntentController.setPendingIntentWhitelistDuration(target, whitelistToken, duration); duration, type); } @Override Loading Loading @@ -16367,10 +16370,10 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid, long duration, String tag) { long duration, int type, String tag) { synchronized (ActivityManagerService.this) { ActivityManagerService.this.tempWhitelistForPendingIntentLocked( callerPid, callerUid, targetUid, duration, tag); callerPid, callerUid, targetUid, duration, type, tag); } }
services/core/java/com/android/server/am/PendingIntentController.java +3 −2 Original line number Diff line number Diff line Loading @@ -301,13 +301,14 @@ public class PendingIntentController { } void setPendingIntentWhitelistDuration(IIntentSender target, IBinder whitelistToken, long duration) { long duration, int type) { if (!(target instanceof PendingIntentRecord)) { Slog.w(TAG, "markAsSentFromNotification(): not a PendingIntentRecord: " + target); return; } synchronized (mLock) { ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration); ((PendingIntentRecord) target).setWhitelistDurationLocked(whitelistToken, duration, type); } } Loading
services/core/java/com/android/server/am/PendingIntentRecord.java +43 −37 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NA import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.BroadcastOptions; import android.app.PendingIntent; import android.content.IIntentReceiver; import android.content.IIntentSender; Loading @@ -37,6 +38,7 @@ import android.os.TransactionTooLargeException; import android.os.UserHandle; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Pair; import android.util.Slog; import android.util.TimeUtils; Loading @@ -61,7 +63,11 @@ public final class PendingIntentRecord extends IIntentSender.Stub { public final WeakReference<PendingIntentRecord> ref; boolean sent = false; boolean canceled = false; private ArrayMap<IBinder, Long> whitelistDuration; /** * Map IBinder to duration specified as Pair<Long, Integer>, Long is allowlist duration in * milliseconds, Integer is allowlist type defined at {@link BroadcastOptions.TempAllowListType} */ private ArrayMap<IBinder, Pair<Long, Integer>> mWhitelistDuration; private RemoteCallbackList<IResultReceiver> mCancelCallbacks; private ArraySet<IBinder> mAllowBgActivityStartsForActivitySender = new ArraySet<>(); private ArraySet<IBinder> mAllowBgActivityStartsForBroadcastSender = new ArraySet<>(); Loading Loading @@ -215,16 +221,16 @@ public final class PendingIntentRecord extends IIntentSender.Stub { ref = new WeakReference<>(this); } void setWhitelistDurationLocked(IBinder whitelistToken, long duration) { void setWhitelistDurationLocked(IBinder whitelistToken, long duration, int type) { if (duration > 0) { if (whitelistDuration == null) { whitelistDuration = new ArrayMap<>(); if (mWhitelistDuration == null) { mWhitelistDuration = new ArrayMap<>(); } whitelistDuration.put(whitelistToken, duration); } else if (whitelistDuration != null) { whitelistDuration.remove(whitelistToken); if (whitelistDuration.size() <= 0) { whitelistDuration = null; mWhitelistDuration.put(whitelistToken, new Pair(duration, type)); } else if (mWhitelistDuration != null) { mWhitelistDuration.remove(whitelistToken); if (mWhitelistDuration.size() <= 0) { mWhitelistDuration = null; } } Loading Loading @@ -292,7 +298,7 @@ public final class PendingIntentRecord extends IIntentSender.Stub { if (intent != null) intent.setDefusable(true); if (options != null) options.setDefusable(true); Long duration = null; Pair<Long, Integer> duration = null; Intent finalIntent = null; Intent[] allIntents = null; String[] allResolvedTypes = null; Loading Loading @@ -341,8 +347,8 @@ public final class PendingIntentRecord extends IIntentSender.Stub { mergedOptions.setCallerOptions(opts); } if (whitelistDuration != null) { duration = whitelistDuration.get(whitelistToken); if (mWhitelistDuration != null) { duration = mWhitelistDuration.get(whitelistToken); } if (key.type == ActivityManager.INTENT_SENDER_ACTIVITY Loading Loading @@ -370,8 +376,6 @@ public final class PendingIntentRecord extends IIntentSender.Stub { int res = START_SUCCESS; try { if (duration != null) { int procState = controller.mAmInternal.getUidProcessState(callingUid); if (!ActivityManager.isProcStateBackground(procState)) { StringBuilder tag = new StringBuilder(64); tag.append("pendingintent:"); UserHandle.formatUid(tag, callingUid); Loading @@ -384,10 +388,7 @@ public final class PendingIntentRecord extends IIntentSender.Stub { tag.append(finalIntent.getData().toSafeString()); } controller.mAmInternal.tempWhitelistForPendingIntent(callingPid, callingUid, uid, duration, tag.toString()); } else { Slog.w(TAG, "Not doing whitelist " + this + ": caller state=" + procState); } uid, duration.first, duration.second, tag.toString()); } boolean sendFinish = finishedReceiver != null; Loading Loading @@ -532,16 +533,18 @@ public final class PendingIntentRecord extends IIntentSender.Stub { pw.print(prefix); pw.print("sent="); pw.print(sent); pw.print(" canceled="); pw.println(canceled); } if (whitelistDuration != null) { if (mWhitelistDuration != null) { pw.print(prefix); pw.print("whitelistDuration="); for (int i = 0; i < whitelistDuration.size(); i++) { for (int i = 0; i < mWhitelistDuration.size(); i++) { if (i != 0) { pw.print(", "); } pw.print(Integer.toHexString(System.identityHashCode(whitelistDuration.keyAt(i)))); pw.print(Integer.toHexString(System.identityHashCode(mWhitelistDuration.keyAt(i)))); pw.print(":"); TimeUtils.formatDuration(whitelistDuration.valueAt(i), pw); TimeUtils.formatDuration(mWhitelistDuration.valueAt(i).first, pw); pw.print("/"); pw.print(mWhitelistDuration.valueAt(i).second); } pw.println(); } Loading Loading @@ -569,15 +572,18 @@ public final class PendingIntentRecord extends IIntentSender.Stub { } sb.append(' '); sb.append(key.typeName()); if (whitelistDuration != null) { if (mWhitelistDuration != null) { sb.append( " (whitelist: "); for (int i = 0; i < whitelistDuration.size(); i++) { for (int i = 0; i < mWhitelistDuration.size(); i++) { if (i != 0) { sb.append(","); } sb.append(Integer.toHexString(System.identityHashCode(whitelistDuration.keyAt(i)))); sb.append(Integer.toHexString(System.identityHashCode( mWhitelistDuration.keyAt(i)))); sb.append(":"); TimeUtils.formatDuration(whitelistDuration.valueAt(i), sb); TimeUtils.formatDuration(mWhitelistDuration.valueAt(i).first, sb); sb.append("/"); sb.append(mWhitelistDuration.valueAt(i).second); } sb.append(")"); } Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +4 −1 Original line number Diff line number Diff line Loading @@ -128,6 +128,7 @@ import android.app.AlarmManager; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.AutomaticZenRule; import android.app.BroadcastOptions; import android.app.IActivityManager; import android.app.INotificationManager; import android.app.ITransientNotification; Loading Loading @@ -5960,7 +5961,9 @@ public class NotificationManagerService extends SystemService { PendingIntent pendingIntent = notification.allPendingIntents.valueAt(i); if (pendingIntent != null) { am.setPendingIntentWhitelistDuration(pendingIntent.getTarget(), ALLOWLIST_TOKEN, duration); ALLOWLIST_TOKEN, duration, BroadcastOptions.TEMPORARY_WHITELIST_TYPE_FOREGROUND_SERVICE_ALLOWED ); am.setPendingIntentAllowBgActivityStarts(pendingIntent.getTarget(), ALLOWLIST_TOKEN, (FLAG_ACTIVITY_SENDER | FLAG_BROADCAST_SENDER | FLAG_SERVICE_SENDER)); Loading