diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 1beb32cfdd521..4cb4e91755340 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -591,8 +591,9 @@ class TaskFragment extends WindowContainer { * @see #isAllowedToEmbedActivityInTrustedMode(ActivityRecord) */ boolean isAllowedToBeEmbeddedInTrustedMode() { - final Predicate callback = this::isAllowedToEmbedActivityInTrustedMode; - return forAllActivities(callback); + // Traverse all activities to see if any of them are not in the trusted mode. + final Predicate callback = r -> !isAllowedToEmbedActivityInTrustedMode(r); + return !forAllActivities(callback); } /** diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 2b5416b291ddc..afeede7b57e99 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -1440,7 +1440,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } final WindowConfiguration requestedWindowConfig = requestedConfig.windowConfiguration; final WindowConfiguration parentWindowConfig = parentConfig.windowConfiguration; - if (!parentWindowConfig.getBounds().contains(requestedWindowConfig.getBounds())) { + if (!requestedWindowConfig.getBounds().isEmpty() + && !parentWindowConfig.getBounds().contains(requestedWindowConfig.getBounds())) { String msg = "Permission Denial: " + func + " from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() + " trying to apply bounds outside of parent for non-trusted host," @@ -1449,6 +1450,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub throw new SecurityException(msg); } if (requestedWindowConfig.getAppBounds() != null + && !requestedWindowConfig.getAppBounds().isEmpty() && parentWindowConfig.getAppBounds() != null && !parentWindowConfig.getAppBounds().contains( requestedWindowConfig.getAppBounds())) { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index 3c14777cd7d16..b2043c38d00ad 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -403,4 +403,29 @@ public class TaskFragmentTest extends WindowTestsBase { assertFalse(activity0.hasOverlayOverUntrustedModeEmbedded()); assertFalse(activity1.hasOverlayOverUntrustedModeEmbedded()); } + + @Test + public void testIsAllowedToBeEmbeddedInTrustedMode() { + final TaskFragment taskFragment = new TaskFragmentBuilder(mAtm) + .setCreateParentTask() + .createActivityCount(2) + .build(); + final ActivityRecord activity0 = taskFragment.getBottomMostActivity(); + final ActivityRecord activity1 = taskFragment.getTopMostActivity(); + + // Allowed if all children activities are allowed. + doReturn(true).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity0); + doReturn(true).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity1); + + assertTrue(taskFragment.isAllowedToBeEmbeddedInTrustedMode()); + + // Disallowed if any child activity is not allowed. + doReturn(false).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity0); + + assertFalse(taskFragment.isAllowedToBeEmbeddedInTrustedMode()); + + doReturn(false).when(taskFragment).isAllowedToEmbedActivityInTrustedMode(activity1); + + assertFalse(taskFragment.isAllowedToBeEmbeddedInTrustedMode()); + } }