summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java38
1 files changed, 26 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index ccc85f834bc1..c4f150bc1220 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -55,6 +55,8 @@ import static android.view.WindowInsets.Type.displayCutout;
import static android.view.WindowInsets.Type.ime;
import static android.view.WindowInsets.Type.systemBars;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
+import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY;
+import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL;
import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
@@ -73,8 +75,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
-import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL;
-import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_TO_FRONT;
import static android.window.DisplayAreaOrganizer.FEATURE_ROOT;
@@ -93,7 +93,6 @@ import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_C
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
import static com.android.server.wm.DisplayContentProto.APP_TRANSITION;
-import static com.android.server.wm.DisplayContentProto.IME_POLICY;
import static com.android.server.wm.DisplayContentProto.CLOSING_APPS;
import static com.android.server.wm.DisplayContentProto.CURRENT_FOCUS;
import static com.android.server.wm.DisplayContentProto.DISPLAY_FRAMES;
@@ -105,6 +104,7 @@ import static com.android.server.wm.DisplayContentProto.FOCUSED_APP;
import static com.android.server.wm.DisplayContentProto.FOCUSED_ROOT_TASK_ID;
import static com.android.server.wm.DisplayContentProto.ID;
import static com.android.server.wm.DisplayContentProto.IME_INSETS_SOURCE_PROVIDER;
+import static com.android.server.wm.DisplayContentProto.IME_POLICY;
import static com.android.server.wm.DisplayContentProto.INPUT_METHOD_CONTROL_TARGET;
import static com.android.server.wm.DisplayContentProto.INPUT_METHOD_INPUT_TARGET;
import static com.android.server.wm.DisplayContentProto.INPUT_METHOD_TARGET;
@@ -559,6 +559,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
*/
InsetsControlTarget mInputMethodControlTarget;
+ /** The surface parent of the IME container. */
+ private SurfaceControl mInputMethodSurfaceParent;
+
/** If true hold off on modifying the animation layer of mInputMethodTarget */
boolean mInputMethodTargetWaitingAnim;
@@ -3610,7 +3613,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
ProtoLog.i(WM_DEBUG_IME, "setInputMethodTarget %s", target);
mInputMethodTarget = target;
mInputMethodTargetWaitingAnim = targetWaitingAnim;
- assignWindowLayers(true /* setLayoutNeeded */);
+
+ // 1. Reparent the IME container window to the target root DA to get the correct bounds and
+ // config. (Only happens when the target window is in a different root DA)
if (target != null) {
RootDisplayArea targetRoot = target.getRootDisplayArea();
if (targetRoot != null) {
@@ -3619,7 +3624,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
targetRoot.placeImeContainer(mImeWindowsContainers);
}
}
+ // 2. Reparent the IME container surface to either the input target app, or the IME window
+ // parent.
updateImeParent();
+ // 3. Assign window layers based on the IME surface parent to make sure it is on top of the
+ // app.
+ assignWindowLayers(true /* setLayoutNeeded */);
+ // 4. Update the IME control target to apply any inset change and animation.
updateImeControlTarget();
}
@@ -3649,7 +3660,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
void updateImeParent() {
final SurfaceControl newParent = computeImeParent();
- if (newParent != null) {
+ if (newParent != null && newParent != mInputMethodSurfaceParent) {
+ mInputMethodSurfaceParent = newParent;
getPendingTransaction().reparent(mImeWindowsContainers.mSurfaceControl, newParent);
scheduleAnimation();
}
@@ -4426,18 +4438,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
//
// In the case of split-screen windowing mode, we need to elevate the IME above the
// docked divider while keeping the app itself below the docked divider, so instead
- // we use relative layering of the IME targets child windows, and place the IME in
- // the non-app layer (see {@link AboveAppWindowContainers#assignChildLayers}).
+ // we will put the docked divider below the IME. @see #assignRelativeLayerForImeTargetChild
//
// In the case the IME target is animating, the animation Z order may be different
// than the WindowContainer Z order, so it's difficult to be sure we have the correct
- // IME target. In this case we just layer the IME over all transitions by placing it
- // in the above applications layer.
+ // IME target. In this case we just layer the IME over its parent surface.
//
- // In the case where we have no IME target we assign it where its base layer would
- // place it in the AboveAppWindowContainers.
+ // In the case where we have no IME target we let its window parent to place it.
//
- // Keep IME window in mAboveAppWindowsContainers as long as app's starting window
+ // Keep IME window in surface parent as long as app's starting window
// exists so it get's layered above the starting window.
if (imeTarget != null && !(imeTarget.mActivityRecord != null
&& imeTarget.mActivityRecord.hasStartingWindow()) && (
@@ -4448,6 +4457,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// TODO: We need to use an extra level on the app surface to ensure
// this is always above SurfaceView but always below attached window.
1);
+ } else if (mInputMethodSurfaceParent != null) {
+ // The IME surface parent may not be its window parent's surface
+ // (@see #computeImeParent), so set relative layer here instead of letting the window
+ // parent to assign layer.
+ mImeWindowsContainers.assignRelativeLayer(t, mInputMethodSurfaceParent, 1);
}
super.assignChildLayers(t);
}