diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityTaskManagerService.java | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 12fe6a0dba25..7df7baa612ea 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1504,7 +1504,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .setCallingPid(callingPid) .setCallingPackage(intent.getPackage()) .setActivityInfo(a) - .setActivityOptions(options.toBundle()) + .setActivityOptions(createSafeActivityOptionsWithBalAllowed(options)) // To start the dream from background, we need to start it from a persistent // system process. Here we set the real calling uid to the system server uid .setRealCallingUid(Binder.getCallingUid()) @@ -1652,7 +1652,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .setResultWho(resultWho) .setRequestCode(requestCode) .setStartFlags(startFlags) - .setActivityOptions(bOptions) + .setActivityOptions(createSafeActivityOptionsWithBalAllowed(bOptions)) .setUserId(userId) .setIgnoreTargetSecurity(ignoreTargetSecurity) .setFilterCallingUid(isResolver ? 0 /* system */ : targetUid) @@ -1702,7 +1702,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .setVoiceInteractor(interactor) .setStartFlags(startFlags) .setProfilerInfo(profilerInfo) - .setActivityOptions(bOptions) + .setActivityOptions(createSafeActivityOptionsWithBalAllowed(bOptions)) .setUserId(userId) .setBackgroundStartPrivileges(BackgroundStartPrivileges.ALLOW_BAL) .execute(); @@ -1729,7 +1729,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .setCallingPackage(callingPackage) .setCallingFeatureId(callingFeatureId) .setResolvedType(resolvedType) - .setActivityOptions(bOptions) + .setActivityOptions(createSafeActivityOptionsWithBalAllowed(bOptions)) .setUserId(userId) .setBackgroundStartPrivileges(BackgroundStartPrivileges.ALLOW_BAL) .execute(); @@ -5527,6 +5527,31 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return checkPermission(permission, -1, sourceUid) == PackageManager.PERMISSION_GRANTED; } + /** + * Wrap the {@link ActivityOptions} in {@link SafeActivityOptions} and attach caller options + * that allow using the callers permissions to start background activities. + */ + private SafeActivityOptions createSafeActivityOptionsWithBalAllowed( + @Nullable ActivityOptions options) { + if (options == null) { + options = ActivityOptions.makeBasic().setPendingIntentBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED); + } else if (options.getPendingIntentBackgroundActivityStartMode() + == ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED) { + options.setPendingIntentBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED); + } + return new SafeActivityOptions(options); + } + + /** + * Wrap the options {@link Bundle} in {@link SafeActivityOptions} and attach caller options + * that allow using the callers permissions to start background activities. + */ + private SafeActivityOptions createSafeActivityOptionsWithBalAllowed(@Nullable Bundle bOptions) { + return createSafeActivityOptionsWithBalAllowed(ActivityOptions.fromBundle(bOptions)); + } + final class H extends Handler { static final int REPORT_TIME_TRACKER_MSG = 1; static final int UPDATE_PROCESS_ANIMATING_STATE = 2; |