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

Commit 32549e12 authored by Mary Xia's avatar Mary Xia Committed by Android (Google) Code Review
Browse files

Merge "Disallow restrict activity when DWPC is missing"

parents b78d7e46 0adcfcdf
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1823,7 +1823,7 @@ class ActivityStarter {
        if (mPreferredTaskDisplayArea != null) {
            final DisplayContent displayContent = mRootWindowContainer.getDisplayContentOrCreate(
                    mPreferredTaskDisplayArea.getDisplayId());
            if (displayContent != null && displayContent.mDwpcHelper.hasController()) {
            if (displayContent != null) {
                final int targetWindowingMode = (targetTask != null)
                        ? targetTask.getWindowingMode() : displayContent.getWindowingMode();
                final int launchingFromDisplayId =
+3 −5
Original line number Diff line number Diff line
@@ -392,7 +392,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {

        final DisplayContent displayContent =
                mRootWindowContainer.getDisplayContentOrCreate(displayId);
        if (displayContent != null && displayContent.mDwpcHelper.hasController()) {
        if (displayContent != null) {
            final ArrayList<ActivityInfo> activities = new ArrayList<>();
            if (activityInfo != null) {
                activities.add(activityInfo);
@@ -402,10 +402,8 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
                    activities.add(r.info);
                });
            }
            if (!displayContent.mDwpcHelper.canContainActivities(activities,
                    displayContent.getWindowingMode())) {
                return false;
            }
            return displayContent.mDwpcHelper.canContainActivities(activities,
                        displayContent.getWindowingMode());
        }

        return true;
+21 −0
Original line number Diff line number Diff line
@@ -22,12 +22,14 @@ import android.app.WindowConfiguration;
import android.content.pm.ActivityInfo;
import android.os.UserHandle;
import android.util.ArraySet;
import android.util.Slog;
import android.window.DisplayWindowPolicyController;

import java.io.PrintWriter;
import java.util.List;

class DisplayWindowPolicyControllerHelper {
    private static final String TAG = "DisplayWindowPolicyControllerHelper";

    private final DisplayContent mDisplayContent;

@@ -69,6 +71,17 @@ class DisplayWindowPolicyControllerHelper {
    public boolean canContainActivities(@NonNull List<ActivityInfo> activities,
            @WindowConfiguration.WindowingMode int windowingMode) {
        if (mDisplayWindowPolicyController == null) {
            for (int i = activities.size() - 1; i >= 0; i--) {
                final ActivityInfo aInfo = activities.get(i);
                if (aInfo.requiredDisplayCategory != null) {
                    Slog.e(TAG,
                            String.format("Activity with requiredDisplayCategory='%s' cannot be"
                                            + " displayed on display %d because that display does"
                                            + " not have a matching category",
                                    aInfo.requiredDisplayCategory, mDisplayContent.mDisplayId));
                    return false;
                }
            }
            return true;
        }
        return mDisplayWindowPolicyController.canContainActivities(activities, windowingMode);
@@ -81,6 +94,14 @@ class DisplayWindowPolicyControllerHelper {
            @WindowConfiguration.WindowingMode int windowingMode, int launchingFromDisplayId,
            boolean isNewTask) {
        if (mDisplayWindowPolicyController == null) {
            if (activityInfo.requiredDisplayCategory != null) {
                Slog.e(TAG,
                        String.format("Activity with requiredDisplayCategory='%s' cannot be"
                                + " launched on display %d because that display does"
                                + " not have a matching category",
                                activityInfo.requiredDisplayCategory, mDisplayContent.mDisplayId));
                return false;
            }
            return true;
        }
        return mDisplayWindowPolicyController.canActivityBeLaunched(activityInfo, windowingMode,
+11 −0
Original line number Diff line number Diff line
@@ -1637,6 +1637,8 @@ public class ActivityStarterTests extends WindowTestsBase {
        final ActivityRecord target = new ActivityBuilder(mAtm).setAffinity(info.taskAffinity)
                .build();
        final ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_NEW_TASK, false);
        spyOn(starter);
        doReturn(START_SUCCESS).when(starter).isAllowedToStart(any(), anyBoolean(), any());
        startActivityInner(starter, target, null /* source */, null /* options */,
                null /* inTask */, null /* inTaskFragment */);

@@ -1661,6 +1663,8 @@ public class ActivityStarterTests extends WindowTestsBase {
        final ActivityRecord target = new ActivityBuilder(mAtm).setRequiredDisplayCategory("auto")
                .setAffinity(info.taskAffinity).build();
        final ActivityStarter starter = prepareStarter(0, false);
        spyOn(starter);
        doReturn(START_SUCCESS).when(starter).isAllowedToStart(any(), anyBoolean(), any());
        startActivityInner(starter, target,  task.getBottomMostActivity(), null /* options */,
                null /* inTask */, null /* inTaskFragment */);

@@ -1685,7 +1689,10 @@ public class ActivityStarterTests extends WindowTestsBase {
        final ActivityRecord target = new ActivityBuilder(mAtm)
                .setRequiredDisplayCategory(info.requiredDisplayCategory)
                .setAffinity(info.taskAffinity).build();

        final ActivityStarter starter = prepareStarter(0, false);
        spyOn(starter);
        doReturn(START_SUCCESS).when(starter).isAllowedToStart(any(), anyBoolean(), any());
        startActivityInner(starter, target,  task.getBottomMostActivity(), null /* options */,
                null /* inTask */, null /* inTaskFragment */);

@@ -1706,6 +1713,8 @@ public class ActivityStarterTests extends WindowTestsBase {
        inTask.inRecents = true;

        final ActivityStarter starter = prepareStarter(0, false);
        spyOn(starter);
        doReturn(START_SUCCESS).when(starter).isAllowedToStart(any(), anyBoolean(), any());
        final ActivityRecord target = new ActivityBuilder(mAtm).build();
        startActivityInner(starter, target, null /* source */, null /* options */, inTask,
                null /* inTaskFragment */);
@@ -1724,6 +1733,8 @@ public class ActivityStarterTests extends WindowTestsBase {
        inTask.inRecents = true;

        final ActivityStarter starter = prepareStarter(0, false);
        spyOn(starter);
        doReturn(START_SUCCESS).when(starter).isAllowedToStart(any(), anyBoolean(), any());
        final ActivityRecord target = new ActivityBuilder(mAtm).setRequiredDisplayCategory("auto")
                .build();
        startActivityInner(starter, target, null /* source */, null /* options */, inTask,
+24 −0
Original line number Diff line number Diff line
@@ -193,6 +193,30 @@ public class DisplayWindowPolicyControllerTests extends WindowTestsBase {
        assertEquals(result, START_ABORTED);
    }

    @Test
    public void testCanActivityBeLaunched_requiredDisplayCategory() {
        ActivityStarter starter = new ActivityStarter(mock(ActivityStartController.class), mAtm,
                mSupervisor, mock(ActivityStartInterceptor.class));
        final Task task = new TaskBuilder(mSupervisor).setDisplay(mSecondaryDisplay).build();
        final ActivityRecord sourceRecord = new ActivityBuilder(mAtm).setTask(task).build();
        final ActivityRecord disallowedRecord =
                new ActivityBuilder(mAtm).setRequiredDisplayCategory("auto").build();

        int result = starter.startActivityInner(
                disallowedRecord,
                sourceRecord,
                /* voiceSession= */null,
                /* voiceInteractor= */ null,
                /* startFlags= */ 0,
                /* options= */null,
                /* inTask= */null,
                /* inTaskFragment= */ null,
                /* restrictedBgActivity= */false,
                /* intentGrants= */null);

        assertEquals(result, START_ABORTED);
    }

    private class TestDisplayWindowPolicyController extends DisplayWindowPolicyController {

        public ComponentName DISALLOWED_ACTIVITY =