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

Commit 0adcfcdf authored by Mary Xia's avatar Mary Xia
Browse files

Disallow restrict activity when DWPC is missing

Bug: 233910285
Test: atest RestrictActivityTest
Change-Id: If2f584b299238966866fcb42a75a7b5fcd110889
parent 9a512e9c
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
@@ -395,7 +395,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);
@@ -405,10 +405,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 =