Disallow restrict activity when DWPC is missing
Bug: 233910285 Test: atest RestrictActivityTest Change-Id: If2f584b299238966866fcb42a75a7b5fcd110889
This commit is contained in:
@@ -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 =
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user