From af59641e15666e557d4ac28dc8683c2bf789cfc8 Mon Sep 17 00:00:00 2001 From: Brad Stenning Date: Mon, 2 Apr 2018 12:03:19 -0700 Subject: [PATCH] Update displayId when a window is moved to a new display Bug:77474140 Test: Unit or use a single instance app and move it from and activity view to display 0 Change-Id: I780c5af3b9d46d6f67271a100f378a6a51435aff --- .../com/android/server/input/InputWindowHandle.java | 2 +- .../core/java/com/android/server/wm/WindowState.java | 4 +++- .../src/com/android/server/wm/WindowStateTests.java | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/input/InputWindowHandle.java b/services/core/java/com/android/server/input/InputWindowHandle.java index 3d6f7ad16a7a5..720eaaa543871 100644 --- a/services/core/java/com/android/server/input/InputWindowHandle.java +++ b/services/core/java/com/android/server/input/InputWindowHandle.java @@ -92,7 +92,7 @@ public final class InputWindowHandle { public int inputFeatures; // Display this input is on. - public final int displayId; + public int displayId; private native void nativeDispose(); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 30bbfe0b83c4d..3e9dcddba004c 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -178,6 +178,7 @@ import android.util.MergedConfiguration; import android.util.Slog; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; +import android.view.Display; import android.view.DisplayCutout; import android.view.DisplayInfo; import android.view.Gravity; @@ -1366,6 +1367,7 @@ class WindowState extends WindowContainer implements WindowManagerP // Window was not laid out for this display yet, so make sure mLayoutSeq does not match. if (dc != null) { mLayoutSeq = dc.mLayoutSeq - 1; + mInputWindowHandle.displayId = dc.getDisplayId(); } } @@ -1378,7 +1380,7 @@ class WindowState extends WindowContainer implements WindowManagerP public int getDisplayId() { final DisplayContent displayContent = getDisplayContent(); if (displayContent == null) { - return -1; + return Display.INVALID_DISPLAY; } return displayContent.getDisplayId(); } diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java index 1248eaea7ae73..7c928c988b4f0 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java @@ -326,6 +326,17 @@ public class WindowStateTests extends WindowTestsBase { assertThat(app.mLayoutSeq, not(is(mDisplayContent.mLayoutSeq))); } + @Test + public void testDisplayIdUpdatedOnReparent() throws Exception { + final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); + // fake a different display + app.mInputWindowHandle.displayId = mDisplayContent.getDisplayId() + 1; + app.onDisplayChanged(mDisplayContent); + + assertThat(app.mInputWindowHandle.displayId, is(mDisplayContent.getDisplayId())); + assertThat(app.getDisplayId(), is(mDisplayContent.getDisplayId())); + } + private void testPrepareWindowToDisplayDuringRelayout(boolean wasVisible) { reset(mPowerManagerWrapper); final WindowState root = createWindow(null, TYPE_APPLICATION, "root");