Merge "Fix IME aboves popupwindow when the app is in split-screen" into sc-v2-dev am: b96404ee4e
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15950886 Change-Id: I806be442c3357ae9c028810a5d1c5a371df9c35f
This commit is contained in:
@@ -5679,9 +5679,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean needsRelativeLayeringToIme() {
|
boolean needsRelativeLayeringToIme() {
|
||||||
// We only use the relative layering mode in split screen, as part of elevating the IME
|
// We use the relative layering when IME isn't attached to the app. Such as part of
|
||||||
// and windows above it's target above the docked divider.
|
// elevating the IME and windows above it's target above the docked divider in
|
||||||
if (!inSplitScreenWindowingMode()) {
|
// split-screen, or make the popupMenu to be above the IME when the parent window is the
|
||||||
|
// IME layering target in bubble/freeform mode.
|
||||||
|
if (mDisplayContent.isImeAttachedToApp()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.android.server.wm;
|
|||||||
|
|
||||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
|
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
|
||||||
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
|
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
|
||||||
|
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
|
||||||
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
|
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
|
||||||
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
|
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
|
||||||
import static android.view.InsetsState.ITYPE_IME;
|
import static android.view.InsetsState.ITYPE_IME;
|
||||||
@@ -835,8 +836,7 @@ public class WindowStateTests extends WindowTestsBase {
|
|||||||
WindowState sameTokenWindow = createWindow(null, TYPE_BASE_APPLICATION, mAppWindow.mToken,
|
WindowState sameTokenWindow = createWindow(null, TYPE_BASE_APPLICATION, mAppWindow.mToken,
|
||||||
"SameTokenWindow");
|
"SameTokenWindow");
|
||||||
mDisplayContent.setImeLayeringTarget(mAppWindow);
|
mDisplayContent.setImeLayeringTarget(mAppWindow);
|
||||||
sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(
|
sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
|
||||||
WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
|
|
||||||
assertTrue(sameTokenWindow.needsRelativeLayeringToIme());
|
assertTrue(sameTokenWindow.needsRelativeLayeringToIme());
|
||||||
sameTokenWindow.removeImmediately();
|
sameTokenWindow.removeImmediately();
|
||||||
assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
|
assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
|
||||||
@@ -848,8 +848,7 @@ public class WindowStateTests extends WindowTestsBase {
|
|||||||
WindowState sameTokenWindow = createWindow(null, TYPE_APPLICATION_STARTING,
|
WindowState sameTokenWindow = createWindow(null, TYPE_APPLICATION_STARTING,
|
||||||
mAppWindow.mToken, "SameTokenWindow");
|
mAppWindow.mToken, "SameTokenWindow");
|
||||||
mDisplayContent.setImeLayeringTarget(mAppWindow);
|
mDisplayContent.setImeLayeringTarget(mAppWindow);
|
||||||
sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(
|
sameTokenWindow.mActivityRecord.getRootTask().setWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
|
||||||
WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
|
|
||||||
assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
|
assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
|
|||||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
|
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
|
||||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
|
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
|
||||||
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
|
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
|
||||||
|
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
|
||||||
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
|
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
|
||||||
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
|
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
|
||||||
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
|
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
|
||||||
@@ -37,6 +38,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
|
|||||||
|
|
||||||
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.spyOn;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
|
||||||
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
|
||||||
import static com.android.server.wm.WindowStateAnimator.PRESERVED_SURFACE_LAYER;
|
import static com.android.server.wm.WindowStateAnimator.PRESERVED_SURFACE_LAYER;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@@ -493,4 +495,27 @@ public class ZOrderingTests extends WindowTestsBase {
|
|||||||
assertZOrderGreaterThan(mTransaction, mNavBarWindow.mToken.getSurfaceControl(),
|
assertZOrderGreaterThan(mTransaction, mNavBarWindow.mToken.getSurfaceControl(),
|
||||||
mDisplayContent.getImeContainer().getSurfaceControl());
|
mDisplayContent.getImeContainer().getSurfaceControl());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPopupWindowAndParentIsImeTarget_expectHigherThanIme_inMultiWindow() {
|
||||||
|
// Simulate the app window is in multi windowing mode and being IME target
|
||||||
|
mAppWindow.getConfiguration().windowConfiguration.setWindowingMode(
|
||||||
|
WINDOWING_MODE_MULTI_WINDOW);
|
||||||
|
mDisplayContent.setImeLayeringTarget(mAppWindow);
|
||||||
|
mDisplayContent.setImeInputTarget(mAppWindow);
|
||||||
|
|
||||||
|
// Create a popupWindow
|
||||||
|
assertWindowHigher(mImeWindow, mAppWindow);
|
||||||
|
final WindowState popupWindow = createWindow(mAppWindow, TYPE_APPLICATION_PANEL,
|
||||||
|
mDisplayContent, "PopupWindow");
|
||||||
|
spyOn(popupWindow);
|
||||||
|
|
||||||
|
mDisplayContent.assignChildLayers(mTransaction);
|
||||||
|
|
||||||
|
// Verify the surface layer of the popupWindow should higher than IME
|
||||||
|
verify(popupWindow).needsRelativeLayeringToIme();
|
||||||
|
assertThat(popupWindow.needsRelativeLayeringToIme()).isTrue();
|
||||||
|
assertZOrderGreaterThan(mTransaction, popupWindow.getSurfaceControl(),
|
||||||
|
mDisplayContent.getImeContainer().getSurfaceControl());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user