Merge "Fix IME layer"
This commit is contained in:
committed by
Android (Google) Code Review
commit
a33f9405ea
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user