Merge "Fix untrusted embedding visibility in multi windowing mode" into tm-dev

This commit is contained in:
Chris Li
2022-04-12 12:37:16 +00:00
committed by Android (Google) Code Review
2 changed files with 57 additions and 2 deletions

View File

@@ -5553,7 +5553,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* this activity when embedded in untrusted mode.
*/
boolean hasOverlayOverUntrustedModeEmbedded() {
if (!isEmbeddedInUntrustedMode() || getRootTask() == null) {
if (!isEmbeddedInUntrustedMode() || getTask() == null) {
// The activity is not embedded in untrusted mode.
return false;
}
@@ -5561,7 +5561,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// Check if there are any activities with different UID over the activity that is embedded
// in untrusted mode. Traverse bottom to top with boundary so that it will only check
// activities above this activity.
final ActivityRecord differentUidOverlayActivity = getRootTask().getActivity(
final ActivityRecord differentUidOverlayActivity = getTask().getActivity(
a -> a.getUid() != getUid(), this /* boundary */, false /* includeBoundary */,
false /* traverseTopToBottom */);
return differentUidOverlayActivity != null;

View File

@@ -16,6 +16,9 @@
package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
@@ -202,4 +205,56 @@ public class TaskFragmentTest extends WindowTestsBase {
assertTrue(primaryActivity.supportsEnterPipOnTaskSwitch);
assertFalse(secondaryActivity.supportsEnterPipOnTaskSwitch);
}
@Test
public void testActivityHasOverlayOverUntrustedModeEmbedded() {
final Task rootTask = createTask(mDisplayContent, WINDOWING_MODE_MULTI_WINDOW,
ACTIVITY_TYPE_STANDARD);
final Task leafTask0 = new TaskBuilder(mSupervisor)
.setParentTaskFragment(rootTask)
.build();
final TaskFragment organizedTf = new TaskFragmentBuilder(mAtm)
.createActivityCount(2)
.setParentTask(leafTask0)
.setFragmentToken(new Binder())
.setOrganizer(mOrganizer)
.build();
final ActivityRecord activity0 = organizedTf.getBottomMostActivity();
final ActivityRecord activity1 = organizedTf.getTopMostActivity();
// Bottom activity is untrusted embedding. Top activity is trusted embedded.
// Activity0 has overlay over untrusted mode embedded.
activity0.info.applicationInfo.uid = DEFAULT_TASK_FRAGMENT_ORGANIZER_UID + 1;
activity1.info.applicationInfo.uid = DEFAULT_TASK_FRAGMENT_ORGANIZER_UID;
doReturn(true).when(organizedTf).isAllowedToEmbedActivityInUntrustedMode(activity0);
assertTrue(activity0.hasOverlayOverUntrustedModeEmbedded());
assertFalse(activity1.hasOverlayOverUntrustedModeEmbedded());
// Both activities are trusted embedded.
// None of the two has overlay over untrusted mode embedded.
activity0.info.applicationInfo.uid = DEFAULT_TASK_FRAGMENT_ORGANIZER_UID;
assertFalse(activity0.hasOverlayOverUntrustedModeEmbedded());
assertFalse(activity1.hasOverlayOverUntrustedModeEmbedded());
// Bottom activity is trusted embedding. Top activity is untrusted embedded.
// None of the two has overlay over untrusted mode embedded.
activity1.info.applicationInfo.uid = DEFAULT_TASK_FRAGMENT_ORGANIZER_UID + 1;
assertFalse(activity0.hasOverlayOverUntrustedModeEmbedded());
assertFalse(activity1.hasOverlayOverUntrustedModeEmbedded());
// There is an activity in a different leaf task on top of activity0 and activity1.
// None of the two has overlay over untrusted mode embedded because it is not the same Task.
final Task leafTask1 = new TaskBuilder(mSupervisor)
.setParentTaskFragment(rootTask)
.setOnTop(true)
.setCreateActivity(true)
.build();
final ActivityRecord activity2 = leafTask1.getTopMostActivity();
activity2.info.applicationInfo.uid = DEFAULT_TASK_FRAGMENT_ORGANIZER_UID + 2;
assertFalse(activity0.hasOverlayOverUntrustedModeEmbedded());
assertFalse(activity1.hasOverlayOverUntrustedModeEmbedded());
}
}