Merge "Fix IME layer"

This commit is contained in:
TreeHugger Robot
2020-12-01 01:59:51 +00:00
committed by Android (Google) Code Review

View File

@@ -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);
}