diff options
3 files changed, 30 insertions, 4 deletions
diff --git a/core/java/android/window/WindowContainerTransaction.java b/core/java/android/window/WindowContainerTransaction.java index c2b519619690..d9b5b2d725e2 100644 --- a/core/java/android/window/WindowContainerTransaction.java +++ b/core/java/android/window/WindowContainerTransaction.java @@ -804,7 +804,7 @@ public final class WindowContainerTransaction implements Parcelable { * Sets/removes the always on top flag for this {@code windowContainer}. See * {@link com.android.server.wm.ConfigurationContainer#setAlwaysOnTop(boolean)}. * Please note that this method is only intended to be used for a - * {@link com.android.server.wm.DisplayArea}. + * {@link com.android.server.wm.Task} or {@link com.android.server.wm.DisplayArea}. * * <p> * Setting always on top to {@code True} will also make the {@code windowContainer} to move diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 5ed6caffe1fb..3c8f57fe7af5 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -1159,9 +1159,13 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } case HIERARCHY_OP_TYPE_SET_ALWAYS_ON_TOP: { final WindowContainer container = WindowContainer.fromBinder(hop.getContainer()); - if (container == null || container.asDisplayArea() == null - || !container.isAttached()) { - Slog.e(TAG, "Attempt to operate on unknown or detached display area: " + if (container == null || !container.isAttached()) { + Slog.e(TAG, "Attempt to operate on unknown or detached container: " + + container); + break; + } + if (container.asTask() == null && container.asDisplayArea() == null) { + Slog.e(TAG, "Cannot set always-on-top on non-task or non-display area: " + container); break; } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 0b77fd828745..cd3fef6b6fdb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -1646,6 +1646,28 @@ public class WindowOrganizerTests extends WindowTestsBase { verify(mWm.mAtmService.mRootWindowContainer).resumeFocusedTasksTopActivities(); } + @Test + public void testSetAlwaysOnTop() { + final Task rootTask = new TaskBuilder(mSupervisor) + .setWindowingMode(WINDOWING_MODE_FREEFORM).build(); + testSetAlwaysOnTop(rootTask); + + final DisplayArea displayArea = mDisplayContent.getDefaultTaskDisplayArea(); + displayArea.setWindowingMode(WINDOWING_MODE_FREEFORM); + testSetAlwaysOnTop(displayArea); + } + + private void testSetAlwaysOnTop(WindowContainer wc) { + final WindowContainerTransaction t = new WindowContainerTransaction(); + t.setAlwaysOnTop(wc.mRemoteToken.toWindowContainerToken(), true); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(t); + assertTrue(wc.isAlwaysOnTop()); + + t.setAlwaysOnTop(wc.mRemoteToken.toWindowContainerToken(), false); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(t); + assertFalse(wc.isAlwaysOnTop()); + } + private ActivityRecord createActivityRecordAndDispatchPendingEvents(Task task) { final ActivityRecord record = createActivityRecord(task); // Flush EVENT_APPEARED. |