Disallow restrict activity when DWPC is missing

Bug: 233910285
Test: atest RestrictActivityTest
Change-Id: If2f584b299238966866fcb42a75a7b5fcd110889
This commit is contained in:
Mary Xia
2022-11-03 15:44:45 +01:00
parent 9a512e9c88
commit 0adcfcdf03
5 changed files with 60 additions and 6 deletions

View File

@@ -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 =

View File

@@ -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;

View File

@@ -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,

View File

@@ -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,

View File

@@ -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 =