diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 2f4d154503d15..2762c459fba45 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -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 = diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 034089b19aa01..23c2ec71336f8 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -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 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; diff --git a/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java b/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java index 69fd00cc660e7..72ed1083043b2 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java +++ b/services/core/java/com/android/server/wm/DisplayWindowPolicyControllerHelper.java @@ -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 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, diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index d16e11ba63985..43627f4c22f01 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -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, diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java index ba68a25a9fb47..2ce1d6055d86e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowPolicyControllerTests.java @@ -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 =