Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 138ba4e8 authored by Sandro Montanari's avatar Sandro Montanari
Browse files

Add SdkSandboxActivityAuthority

go/sdk-sandbox-activity-authority
Roll-forward of ag/25029620

Bug: 299109198
Test: atest SdkSandboxInstrumentationTest SdkSandboxManagerUnitTest SdkSandboxManagerServiceUnitTest SdkSandboxActivityAuthorityTest
Change-Id: I9dd99445512d8774d84c7876125e2437f4e4a973
parent a3207fa2
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ import android.app.backup.BackupAnnotations.BackupDestination;
import android.app.backup.BackupAnnotations.OperationType;
import android.app.compat.CompatChanges;
import android.app.sdksandbox.sandboxactivity.ActivityContextInfo;
import android.app.sdksandbox.sandboxactivity.ActivityContextInfoProvider;
import android.app.sdksandbox.sandboxactivity.SdkSandboxActivityAuthority;
import android.app.servertransaction.ActivityLifecycleItem;
import android.app.servertransaction.ActivityLifecycleItem.LifecycleState;
import android.app.servertransaction.ActivityRelaunchItem;
@@ -3795,8 +3795,10 @@ public final class ActivityThread extends ClientTransactionHandler
                    r.activityInfo.targetActivity);
        }

        boolean isSandboxActivityContext = sandboxActivitySdkBasedContext()
                && r.intent.isSandboxActivity(mSystemContext);
        boolean isSandboxActivityContext =
                sandboxActivitySdkBasedContext()
                        && SdkSandboxActivityAuthority.isSdkSandboxActivity(
                                mSystemContext, r.intent);
        boolean isSandboxedSdkContextUsed = false;
        ContextImpl activityBaseContext;
        if (isSandboxActivityContext) {
@@ -4041,11 +4043,12 @@ public final class ActivityThread extends ClientTransactionHandler
     */
    @Nullable
    private ContextImpl createBaseContextForSandboxActivity(@NonNull ActivityClientRecord r) {
        ActivityContextInfoProvider contextInfoProvider = ActivityContextInfoProvider.getInstance();
        SdkSandboxActivityAuthority sdkSandboxActivityAuthority =
                SdkSandboxActivityAuthority.getInstance();

        ActivityContextInfo contextInfo;
        try {
            contextInfo = contextInfoProvider.getActivityContextInfo(r.intent);
            contextInfo = sdkSandboxActivityAuthority.getActivityContextInfo(r.intent);
        } catch (IllegalArgumentException e) {
            Log.e(TAG, "Passed intent does not match an expected sandbox activity", e);
            return null;
+6 −2
Original line number Diff line number Diff line
@@ -12605,8 +12605,12 @@ public class Intent implements Parcelable, Cloneable {
        return (mFlags & FLAG_ACTIVITY_NEW_DOCUMENT) == FLAG_ACTIVITY_NEW_DOCUMENT;
    }
    // TODO(b/299109198): Refactor into the {@link SdkSandboxManagerLocal}
    /** @hide */
    /**
     * @deprecated Use {@link SdkSandboxActivityAuthority#isSdkSandboxActivity} instead.
     * Once the other API is finalized this method will be removed.
     * @hide
     */
    @Deprecated
    @android.ravenwood.annotation.RavenwoodThrow
    public boolean isSandboxActivity(@NonNull Context context) {
        if (mAction != null && mAction.equals(ACTION_START_SANDBOXED_ACTIVITY)) {
+10 −1
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_R
import static com.android.server.wm.Task.REPARENT_KEEP_ROOT_TASK_AT_FRONT;
import static com.android.server.wm.WindowManagerService.MY_PID;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
import static com.android.sdksandbox.flags.Flags.sandboxActivitySdkBasedContext;

import android.Manifest;
import android.annotation.IntDef;
@@ -165,6 +166,7 @@ import android.app.assist.ActivityId;
import android.app.assist.AssistContent;
import android.app.assist.AssistStructure;
import android.app.compat.CompatChanges;
import android.app.sdksandbox.sandboxactivity.SdkSandboxActivityAuthority;
import android.app.usage.UsageStatsManagerInternal;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
@@ -1260,6 +1262,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
                true /*validateIncomingUser*/);
    }

    static boolean isSdkSandboxActivity(Context context, Intent intent) {
        return intent != null
                && (sandboxActivitySdkBasedContext()
                        ? SdkSandboxActivityAuthority.isSdkSandboxActivity(context, intent)
                        : intent.isSandboxActivity(context));
    }

    private int startActivityAsUser(IApplicationThread caller, String callingPackage,
            @Nullable String callingFeatureId, Intent intent, String resolvedType,
            IBinder resultTo, String resultWho, int requestCode, int startFlags,
@@ -1270,7 +1279,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        assertPackageMatchesCallingUid(callingPackage);
        enforceNotIsolatedCaller("startActivityAsUser");

        if (intent != null && intent.isSandboxActivity(mContext)) {
        if (isSdkSandboxActivity(mContext, intent)) {
            SdkSandboxManagerLocal sdkSandboxManagerLocal = LocalManagerRegistry.getManager(
                    SdkSandboxManagerLocal.class);
            sdkSandboxManagerLocal.enforceAllowedToHostSandboxedActivity(
+1 −1
Original line number Diff line number Diff line
@@ -1089,7 +1089,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
            // Remove the process record so it won't be considered as alive.
            mService.mProcessNames.remove(wpc.mName, wpc.mUid);
            mService.mProcessMap.remove(wpc.getPid());
        } else if (r.intent.isSandboxActivity(mService.mContext)) {
        } else if (ActivityTaskManagerService.isSdkSandboxActivity(mService.mContext, r.intent)) {
            Slog.e(TAG, "Abort sandbox activity launching as no sandbox process to host it.");
            r.finishIfPossible("No sandbox process for the activity", false /* oomAdj */);
            r.launchFailed = true;