Merge "Fix untrusted embedding visibility in multi windowing mode" into tm-dev
This commit is contained in:
@@ -5553,7 +5553,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
* this activity when embedded in untrusted mode.
|
* this activity when embedded in untrusted mode.
|
||||||
*/
|
*/
|
||||||
boolean hasOverlayOverUntrustedModeEmbedded() {
|
boolean hasOverlayOverUntrustedModeEmbedded() {
|
||||||
if (!isEmbeddedInUntrustedMode() || getRootTask() == null) {
|
if (!isEmbeddedInUntrustedMode() || getTask() == null) {
|
||||||
// The activity is not embedded in untrusted mode.
|
// The activity is not embedded in untrusted mode.
|
||||||
return false;
|
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
|
// 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
|
// in untrusted mode. Traverse bottom to top with boundary so that it will only check
|
||||||
// activities above this activity.
|
// activities above this activity.
|
||||||
final ActivityRecord differentUidOverlayActivity = getRootTask().getActivity(
|
final ActivityRecord differentUidOverlayActivity = getTask().getActivity(
|
||||||
a -> a.getUid() != getUid(), this /* boundary */, false /* includeBoundary */,
|
a -> a.getUid() != getUid(), this /* boundary */, false /* includeBoundary */,
|
||||||
false /* traverseTopToBottom */);
|
false /* traverseTopToBottom */);
|
||||||
return differentUidOverlayActivity != null;
|
return differentUidOverlayActivity != null;
|
||||||
|
|||||||
@@ -16,6 +16,9 @@
|
|||||||
|
|
||||||
package com.android.server.wm;
|
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.any;
|
||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
|
||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
|
||||||
@@ -202,4 +205,56 @@ public class TaskFragmentTest extends WindowTestsBase {
|
|||||||
assertTrue(primaryActivity.supportsEnterPipOnTaskSwitch);
|
assertTrue(primaryActivity.supportsEnterPipOnTaskSwitch);
|
||||||
assertFalse(secondaryActivity.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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user