summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/window/WindowContainerTransaction.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java10
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java22
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.