Loading services/core/java/com/android/server/wm/ActivityStarter.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 = Loading services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +3 −5 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; Loading services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java +21 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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, Loading services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +11 −0 Original line number Diff line number Diff line Loading @@ -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 */); Loading @@ -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 */); Loading @@ -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 */); Loading @@ -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 */); Loading @@ -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, Loading services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java +24 −0 Original line number Diff line number Diff line Loading @@ -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 = Loading Loading
services/core/java/com/android/server/wm/ActivityStarter.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 = Loading
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +3 −5 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; Loading
services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java +21 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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, Loading
services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +11 −0 Original line number Diff line number Diff line Loading @@ -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 */); Loading @@ -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 */); Loading @@ -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 */); Loading @@ -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 */); Loading @@ -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, Loading
services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java +24 −0 Original line number Diff line number Diff line Loading @@ -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 = Loading