Loading services/core/java/com/android/server/wm/ActivityRecord.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; Loading services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; Loading Loading @@ -239,4 +240,56 @@ public class TaskFragmentTest extends WindowTestsBase { assertEquals(taskBounds, activity.getBounds()); assertEquals(Configuration.EMPTY, taskFragment.getRequestedOverrideConfiguration()); } @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()); } } Loading
services/core/java/com/android/server/wm/ActivityRecord.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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; Loading
services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; Loading Loading @@ -239,4 +240,56 @@ public class TaskFragmentTest extends WindowTestsBase { assertEquals(taskBounds, activity.getBounds()); assertEquals(Configuration.EMPTY, taskFragment.getRequestedOverrideConfiguration()); } @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()); } }