summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Achim Thesmann <achim@google.com> 2023-04-14 01:21:18 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-04-14 01:21:18 +0000
commit1cae945226fb761ef64b9c24b6e760e90f361757 (patch)
treecae83f9a2b1a701a207648992bf61e2910fb9364
parentd43a6541a3fe13ad22d35a9bcc6830adf278fd7e (diff)
parent368fb6fca5c755f1512dcbc1c218f22ad3169cbe (diff)
Merge "Allow BAL from explicit start methods." into udc-dev
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java33
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 064af0f3165e..431f82a4f55c 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -1503,7 +1503,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())
@@ -1651,7 +1651,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)
@@ -1701,7 +1701,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();
@@ -1728,7 +1728,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();
@@ -5507,6 +5507,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;