diff options
| author | 2022-02-27 00:13:58 +0000 | |
|---|---|---|
| committer | 2022-02-27 00:13:58 +0000 | |
| commit | 045bc655a3c7156c72b87b7fecf99b2dd1a0cfb2 (patch) | |
| tree | d7216ee8877d63655db307f0d70c09f41ab4b6b3 | |
| parent | ffe63c3182e2ec9985df58cac2172fe6a9270546 (diff) | |
| parent | 205da89cafb811db24cdc8d73e49f27dfd2656c8 (diff) | |
Merge "IME Support for SurfaceControlViewHost" into tm-dev
10 files changed, 202 insertions, 60 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 287248f311a8..26815b4c4fde 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5084,10 +5084,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } if (!visible) { - final InsetsControlTarget imeInputTarget = mDisplayContent.getImeTarget( - DisplayContent.IME_TARGET_INPUT); - mLastImeShown = imeInputTarget != null && imeInputTarget.getWindow() != null - && imeInputTarget.getWindow().mActivityRecord == this + final InputTarget imeInputTarget = mDisplayContent.getImeInputTarget(); + mLastImeShown = imeInputTarget != null && imeInputTarget.getWindowState() != null + && imeInputTarget.getWindowState().mActivityRecord == this && mDisplayContent.mInputMethodWindow != null && mDisplayContent.mInputMethodWindow.isVisible(); mImeInsetsFrozenUntilStartInput = true; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 159c71b80955..195d4258c0d9 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -592,7 +592,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * The window which receives input from the input method. This is also a candidate of the * input method control target. */ - private WindowState mImeInputTarget; + private InputTarget mImeInputTarget; + + /** + * The last ime input target processed from setImeLayeringTargetInner + * this is to ensure we update the control target in the case when the IME + * target changes while the IME layering target stays the same, for example + * the case of the IME moving to a SurfaceControlViewHost backed EmbeddedWindow + */ + private InputTarget mLastImeInputTarget; /** * This controls the visibility and animation of the input method window. @@ -608,14 +616,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp static final int IME_TARGET_LAYERING = 0; /** - * Used by {@link #getImeTarget} to return the IME target which received the input connection - * from IME. - * - * @see #mImeInputTarget - */ - static final int IME_TARGET_INPUT = 1; - - /** * Used by {@link #getImeTarget} to return the IME target which controls the IME insets * visibility and animation. * @@ -625,7 +625,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp @IntDef(flag = false, prefix = { "IME_TARGET_" }, value = { IME_TARGET_LAYERING, - IME_TARGET_INPUT, IME_TARGET_CONTROL, }) @Retention(RetentionPolicy.SOURCE) @@ -3308,7 +3307,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mImeLayeringTarget.dumpDebug(proto, INPUT_METHOD_TARGET, logLevel); } if (mImeInputTarget != null) { - mImeInputTarget.dumpDebug(proto, INPUT_METHOD_INPUT_TARGET, logLevel); + mImeInputTarget.dumpProto(proto, INPUT_METHOD_INPUT_TARGET, logLevel); } if (mImeControlTarget != null && mImeControlTarget.getWindow() != null) { @@ -3871,7 +3870,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } private boolean isImeControlledByApp() { - return mImeInputTarget != null && !mImeInputTarget.inMultiWindowMode(); + return mImeInputTarget != null && mImeInputTarget.shouldControlIme(); } boolean shouldImeAttachedToApp() { @@ -3934,19 +3933,21 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * * @param type The type of the IME target. * @see #IME_TARGET_LAYERING - * @see #IME_TARGET_INPUT * @see #IME_TARGET_CONTROL */ InsetsControlTarget getImeTarget(@InputMethodTarget int type) { switch (type) { case IME_TARGET_LAYERING: return mImeLayeringTarget; - case IME_TARGET_INPUT: return mImeInputTarget; case IME_TARGET_CONTROL: return mImeControlTarget; default: return null; } } + InputTarget getImeInputTarget() { + return mImeInputTarget; + } + // IMPORTANT: When introducing new dependencies in this method, make sure that // changes to those result in RootWindowContainer.updateDisplayImePolicyCache() // being called. @@ -3995,9 +3996,18 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * placed at its parent's surface. */ private void setImeLayeringTargetInner(@Nullable WindowState target) { - if (target == mImeLayeringTarget) { + /** + * This function is also responsible for updating the IME control target + * and so in the case where the IME layering target does not change + * but the Input target does (for example, IME moving to a SurfaceControlViewHost + * we have to continue executing this function, otherwise there is no work + * to do. + */ + if (target == mImeLayeringTarget && mLastImeInputTarget == mImeInputTarget) { return; } + mLastImeInputTarget = mImeInputTarget; + // If the IME target is the input target, before it changes, prepare the IME screenshot // for the last IME target when its task is applying app transition. This is for the // better IME transition to keep IME visibility when transitioning to the next task. @@ -4039,9 +4049,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } @VisibleForTesting - void setImeInputTarget(WindowState target) { + void setImeInputTarget(InputTarget target) { mImeInputTarget = target; - boolean canScreenshot = mImeInputTarget == null || !mImeInputTarget.isSecureLocked(); + boolean canScreenshot = mImeInputTarget == null || mImeInputTarget.canScreenshotIme(); if (mImeWindowsContainer.setCanScreenshot(canScreenshot)) { mWmService.requestTraversal(); } @@ -4157,7 +4167,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * The IME input target is the window which receives input from IME. It is also a candidate * which controls the visibility and animation of the input method window. */ - void updateImeInputAndControlTarget(WindowState target) { + void updateImeInputAndControlTarget(InputTarget target) { if (mImeInputTarget != target) { ProtoLog.i(WM_DEBUG_IME, "setInputMethodInputTarget %s", target); setImeInputTarget(target); @@ -4167,8 +4177,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } // Unfreeze IME insets after the new target updated, in case updateAboveInsetsState may // deliver unrelated IME insets change to the non-IME requester. - if (target != null && target.mActivityRecord != null) { - target.mActivityRecord.mImeInsetsFrozenUntilStartInput = false; + if (target != null) { + target.unfreezeInsetsAfterStartInput(); } } @@ -4226,11 +4236,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp InsetsControlTarget computeImeControlTarget() { if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null || (mImeInputTarget != null - && getImeHostOrFallback(mImeInputTarget.getWindow()) - == mRemoteInsetsControlTarget)) { + && getImeHostOrFallback(mImeInputTarget.getWindowState()) + == mRemoteInsetsControlTarget)) { return mRemoteInsetsControlTarget; } else { - return mImeInputTarget; + return mImeInputTarget != null ? mImeInputTarget.getWindowState() : null; } } @@ -4243,7 +4253,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // screen. If it's not covering the entire screen the IME might extend beyond the apps // bounds. if (shouldImeAttachedToApp()) { - if (mImeLayeringTarget.mActivityRecord != mImeInputTarget.mActivityRecord) { + if (mImeLayeringTarget.mActivityRecord != mImeInputTarget.getActivityRecord()) { // Do not change parent if the window hasn't requested IME. return null; } diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java index 2ab08e6da478..dcc16ebd88f5 100644 --- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java +++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java @@ -17,6 +17,9 @@ package com.android.server.wm; +import static com.android.server.wm.IdentifierProto.HASH_CODE; +import static com.android.server.wm.IdentifierProto.TITLE; +import static com.android.server.wm.WindowContainerProto.IDENTIFIER; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -25,6 +28,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; import android.util.ArrayMap; +import android.util.proto.ProtoOutputStream; import android.util.Slog; import android.view.IWindow; import android.view.InputApplicationHandle; @@ -43,6 +47,8 @@ class EmbeddedWindowController { private ArrayMap<IBinder /*input token */, EmbeddedWindow> mWindows = new ArrayMap<>(); private ArrayMap<IBinder /*focus grant token */, EmbeddedWindow> mWindowsByFocusToken = new ArrayMap<>(); + private ArrayMap<IBinder /*window token*/, EmbeddedWindow> mWindowsByWindowToken = + new ArrayMap<>(); private final Object mGlobalLock; private final ActivityTaskManagerService mAtmService; @@ -63,6 +69,7 @@ class EmbeddedWindowController { mWindows.put(inputToken, window); final IBinder focusToken = window.getFocusGrantToken(); mWindowsByFocusToken.put(focusToken, window); + mWindowsByWindowToken.put(window.getWindowToken(), window); updateProcessController(window); window.mClient.asBinder().linkToDeath(()-> { synchronized (mGlobalLock) { @@ -116,6 +123,7 @@ class EmbeddedWindowController { if (ew.mClient.asBinder() == client.asBinder()) { mWindows.removeAt(i).onRemoved(); mWindowsByFocusToken.remove(ew.getFocusGrantToken()); + mWindowsByWindowToken.remove(ew.getWindowToken()); return; } } @@ -127,6 +135,7 @@ class EmbeddedWindowController { if (ew.mHostWindowState == host) { mWindows.removeAt(i).onRemoved(); mWindowsByFocusToken.remove(ew.getFocusGrantToken()); + mWindowsByWindowToken.remove(ew.getWindowToken()); } } } @@ -139,6 +148,10 @@ class EmbeddedWindowController { return mWindowsByFocusToken.get(focusGrantToken); } + EmbeddedWindow getByWindowToken(IBinder windowToken) { + return mWindowsByWindowToken.get(windowToken); + } + void onActivityRemoved(ActivityRecord activityRecord) { for (int i = mWindows.size() - 1; i >= 0; i--) { final EmbeddedWindow window = mWindows.valueAt(i); @@ -244,15 +257,29 @@ class EmbeddedWindowController { } @Override + public DisplayContent getDisplayContent() { + return mWmService.mRoot.getDisplayContent(getDisplayId()); + } + + @Override public IWindow getIWindow() { return mClient; } + public IBinder getWindowToken() { + return mClient.asBinder(); + } + @Override public int getPid() { return mOwnerPid; } + @Override + public int getUid() { + return mOwnerUid; + } + void setIsOverlay() { mIsOverlay = true; } @@ -297,5 +324,46 @@ class EmbeddedWindowController { public void handleTapOutsideFocusInsideSelf() { handleTap(true); } + + @Override + public boolean shouldControlIme() { + return false; + } + + @Override + public boolean canScreenshotIme() { + return true; + } + + @Override + public void unfreezeInsetsAfterStartInput() { + } + + @Override + public InsetsControlTarget getImeControlTarget() { + return mWmService.getDefaultDisplayContentLocked().mRemoteInsetsControlTarget; + } + + @Override + public boolean isInputMethodClientFocus(int uid, int pid) { + return uid == mOwnerUid && pid == mOwnerPid; + } + + @Override + public ActivityRecord getActivityRecord() { + return null; + } + + @Override + public void dumpProto(ProtoOutputStream proto, long fieldId, + @WindowTraceLogLevel int logLevel) { + final long token = proto.start(fieldId); + + final long token2 = proto.start(IDENTIFIER); + proto.write(HASH_CODE, System.identityHashCode(this)); + proto.write(TITLE, "EmbeddedWindow"); + proto.end(token2); + proto.end(token); + } } } diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index f24e429ca09c..199517c441ad 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -21,7 +21,6 @@ import static android.view.InsetsState.ITYPE_IME; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME; import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL; -import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.ImeInsetsSourceProviderProto.IME_TARGET_FROM_IME; import static com.android.server.wm.ImeInsetsSourceProviderProto.INSETS_SOURCE_PROVIDER; @@ -249,7 +248,7 @@ final class ImeInsetsSourceProvider extends WindowContainerInsetsSourceProvider } private boolean isImeInputTarget(InsetsControlTarget target) { - return target == mDisplayContent.getImeTarget(IME_TARGET_INPUT); + return target == mDisplayContent.getImeInputTarget(); } private boolean sameAsImeControlTarget() { diff --git a/services/core/java/com/android/server/wm/InputTarget.java b/services/core/java/com/android/server/wm/InputTarget.java index 5166b8adcecc..b5ab62b6e03f 100644 --- a/services/core/java/com/android/server/wm/InputTarget.java +++ b/services/core/java/com/android/server/wm/InputTarget.java @@ -17,6 +17,7 @@ package com.android.server.wm; import android.view.IWindow; +import android.util.proto.ProtoOutputStream; /** * Common interface between focusable objects. @@ -36,6 +37,7 @@ interface InputTarget { /* Owning pid of the target. */ int getPid(); + int getUid(); /** * Indicates whether a target should receive focus from server side @@ -45,7 +47,25 @@ interface InputTarget { */ boolean receiveFocusFromTapOutside(); + // Gaining focus void handleTapOutsideFocusInsideSelf(); + // Losing focus void handleTapOutsideFocusOutsideSelf(); + + // Whether this input target can control the IME itself + boolean shouldControlIme(); + // Whether this input target can be screenshoted by the IME system + boolean canScreenshotIme(); + + ActivityRecord getActivityRecord(); + void unfreezeInsetsAfterStartInput(); + + boolean isInputMethodClientFocus(int uid, int pid); + + DisplayContent getDisplayContent(); + InsetsControlTarget getImeControlTarget(); + + void dumpProto(ProtoOutputStream proto, long fieldId, + @WindowTraceLogLevel int logLevel); } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index a67f92332d8e..d306082c3e29 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1023,7 +1023,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< return mProvidedInsetsSources; } - DisplayContent getDisplayContent() { + public DisplayContent getDisplayContent() { return mDisplayContent; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5db72ee722d7..6445d1e657da 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -114,7 +114,6 @@ import static com.android.server.LockGuard.installLock; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import static com.android.server.wm.ActivityTaskManagerService.POWER_MODE_REASON_CHANGE_DISPLAY; import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL; -import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_ALL; @@ -5069,6 +5068,15 @@ public class WindowManagerService extends IWindowManager.Stub return null; } + @Nullable InputTarget getInputTargetFromWindowTokenLocked(IBinder windowToken) { + InputTarget window = mWindowMap.get(windowToken); + if (window != null) { + return window; + } + window = mEmbeddedWindowController.getByWindowToken(windowToken); + return window; + } + void reportFocusChanged(IBinder oldToken, IBinder newToken) { InputTarget lastTarget; InputTarget newTarget; @@ -6506,7 +6514,7 @@ public class WindowManagerService extends IWindowManager.Stub mRoot.forAllDisplays(dc -> { final int displayId = dc.getDisplayId(); final InsetsControlTarget imeLayeringTarget = dc.getImeTarget(IME_TARGET_LAYERING); - final InsetsControlTarget imeInputTarget = dc.getImeTarget(IME_TARGET_INPUT); + final InputTarget imeInputTarget = dc.getImeInputTarget(); final InsetsControlTarget imeControlTarget = dc.getImeTarget(IME_TARGET_CONTROL); if (imeLayeringTarget != null) { pw.print(" imeLayeringTarget in display# "); pw.print(displayId); @@ -7714,7 +7722,8 @@ public class WindowManagerService extends IWindowManager.Stub + " imeTargetWindowToken=" + imeTargetWindowToken); } synchronized (mGlobalLock) { - final WindowState imeTarget = mWindowMap.get(imeTargetWindowToken); + InputTarget imeTarget = + getInputTargetFromWindowTokenLocked(imeTargetWindowToken); if (imeTarget != null) { imeTarget.getDisplayContent().updateImeInputAndControlTarget(imeTarget); } @@ -7794,11 +7803,11 @@ public class WindowManagerService extends IWindowManager.Stub } synchronized (mGlobalLock) { final DisplayContent displayContent = mRoot.getTopFocusedDisplayContent(); - final WindowState window = mWindowMap.get(windowToken); - if (window == null) { + InputTarget target = getInputTargetFromWindowTokenLocked(windowToken); + if (target == null) { return ImeClientFocusResult.NOT_IME_TARGET_WINDOW; } - final int tokenDisplayId = window.getDisplayContent().getDisplayId(); + final int tokenDisplayId = target.getDisplayContent().getDisplayId(); if (tokenDisplayId != displayId) { Slog.e(TAG, "isInputMethodClientFocus: display ID mismatch." + " from client: " + displayId @@ -7811,7 +7820,7 @@ public class WindowManagerService extends IWindowManager.Stub return ImeClientFocusResult.INVALID_DISPLAY_ID; } - if (displayContent.isInputMethodClientFocus(uid, pid)) { + if (target.isInputMethodClientFocus(uid, pid)) { return ImeClientFocusResult.HAS_IME_FOCUS; } // Okay, how about this... what is the current focus? @@ -7835,7 +7844,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void showImePostLayout(IBinder imeTargetWindowToken) { synchronized (mGlobalLock) { - WindowState imeTarget = mWindowMap.get(imeTargetWindowToken); + InputTarget imeTarget = getInputTargetFromWindowTokenLocked(imeTargetWindowToken); if (imeTarget == null) { return; } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 26acf43cf9ed..517837c3732a 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -120,7 +120,6 @@ import static com.android.server.policy.WindowManagerPolicy.TRANSIT_ENTER; import static com.android.server.policy.WindowManagerPolicy.TRANSIT_EXIT; import static com.android.server.policy.WindowManagerPolicy.TRANSIT_PREVIEW_DONE; import static com.android.server.wm.AnimationSpecProto.MOVE; -import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.DisplayContent.logsGestureExclusionRestrictions; import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER; @@ -1602,14 +1601,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } @Override - DisplayContent getDisplayContent() { + public DisplayContent getDisplayContent() { return mToken.getDisplayContent(); } @Override void onDisplayChanged(DisplayContent dc) { if (dc != null && mDisplayContent != null && dc != mDisplayContent - && getImeInputTarget() == this) { + && mDisplayContent.getImeInputTarget() == this) { dc.updateImeInputAndControlTarget(getImeInputTarget()); mDisplayContent.setImeInputTarget(null); } @@ -1749,6 +1748,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mSession.mPid; } + @Override + public int getUid() { + return mSession.mUid; + } + Task getTask() { return mActivityRecord != null ? mActivityRecord.getTask() : null; } @@ -2348,7 +2352,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override public void onConfigurationChanged(Configuration newParentConfig) { - if (getDisplayContent().getImeTarget(IME_TARGET_INPUT) != this && !isImeLayeringTarget()) { + if (getDisplayContent().getImeInputTarget() != this && !isImeLayeringTarget()) { super.onConfigurationChanged(newParentConfig); return; } @@ -2424,7 +2428,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP dc.setImeLayeringTarget(null); dc.computeImeTarget(true /* updateImeTarget */); } - if (dc.getImeTarget(IME_TARGET_INPUT) == this) { + if (dc.getImeInputTarget() == this) { dc.updateImeInputAndControlTarget(null); } @@ -5596,7 +5600,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP * @return {@link InsetsControlTarget} of host that controls the IME. * When window is doesn't have a parent, it is returned as-is. */ - InsetsControlTarget getImeControlTarget() { + @Override + public InsetsControlTarget getImeControlTarget() { return getDisplayContent().getImeHostOrFallback(this); } @@ -5731,8 +5736,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } WindowState getImeInputTarget() { - final InsetsControlTarget target = mDisplayContent.getImeTarget(IME_TARGET_INPUT); - return target != null ? target.getWindow() : null; + final InputTarget target = mDisplayContent.getImeInputTarget(); + return target != null ? target.getWindowState() : null; } void forceReportingResized() { @@ -6117,4 +6122,37 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; mGivenTouchableRegion.setEmpty(); } + + @Override + public boolean shouldControlIme() { + return !inMultiWindowMode(); + } + + @Override + public boolean canScreenshotIme() { + return !isSecureLocked(); + } + + @Override + public ActivityRecord getActivityRecord() { + return mActivityRecord; + } + + @Override + public void unfreezeInsetsAfterStartInput() { + if (mActivityRecord != null) { + mActivityRecord.mImeInsetsFrozenUntilStartInput = false; + } + } + + @Override + public boolean isInputMethodClientFocus(int uid, int pid) { + return getDisplayContent().isInputMethodClientFocus(uid, pid); + } + + @Override + public void dumpProto(ProtoOutputStream proto, long fieldId, + @WindowTraceLogLevel int logLevel) { + dumpDebug(proto, fieldId, logLevel); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 9f7130e45483..c08387024818 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -75,7 +75,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.same; 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.ActivityTaskSupervisor.ON_TOP; -import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_FIXED_TRANSFORM; @@ -1117,7 +1116,7 @@ public class DisplayContentTests extends WindowTestsBase { app.removeImmediately(); - assertNull(dc.getImeTarget(IME_TARGET_INPUT)); + assertNull(dc.getImeInputTarget()); assertNull(dc.computeImeControlTarget()); } @@ -1126,19 +1125,19 @@ public class DisplayContentTests extends WindowTestsBase { final DisplayContent dc = createNewDisplay(); dc.setRemoteInsetsController(createDisplayWindowInsetsController()); dc.setImeInputTarget(createWindow(null, TYPE_BASE_APPLICATION, "app")); - dc.setImeLayeringTarget(dc.getImeTarget(IME_TARGET_INPUT).getWindow()); - assertEquals(dc.getImeTarget(IME_TARGET_INPUT).getWindow(), dc.computeImeControlTarget()); + dc.setImeLayeringTarget(dc.getImeInputTarget().getWindowState()); + assertEquals(dc.getImeInputTarget().getWindowState(), dc.computeImeControlTarget()); } @Test public void testComputeImeControlTarget_splitscreen() throws Exception { final DisplayContent dc = createNewDisplay(); dc.setImeInputTarget(createWindow(null, TYPE_BASE_APPLICATION, "app")); - dc.getImeTarget(IME_TARGET_INPUT).getWindow().setWindowingMode( + dc.getImeInputTarget().getWindowState().setWindowingMode( WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW); - dc.setImeLayeringTarget(dc.getImeTarget(IME_TARGET_INPUT).getWindow()); + dc.setImeLayeringTarget(dc.getImeInputTarget().getWindowState()); dc.setRemoteInsetsController(createDisplayWindowInsetsController()); - assertNotEquals(dc.getImeTarget(IME_TARGET_INPUT).getWindow(), + assertNotEquals(dc.getImeInputTarget().getWindowState(), dc.computeImeControlTarget()); } @@ -1149,7 +1148,7 @@ public class DisplayContentTests extends WindowTestsBase { doReturn(false).when(mAppWindow.mActivityRecord).matchParentBounds(); mDisplayContent.setImeInputTarget(mAppWindow); mDisplayContent.setImeLayeringTarget( - mDisplayContent.getImeTarget(IME_TARGET_INPUT).getWindow()); + mDisplayContent.getImeInputTarget().getWindowState()); mDisplayContent.setRemoteInsetsController(createDisplayWindowInsetsController()); assertEquals(mAppWindow, mDisplayContent.computeImeControlTarget()); } @@ -1927,7 +1926,7 @@ public class DisplayContentTests extends WindowTestsBase { child1.removeImmediately(); verify(mDisplayContent).computeImeTarget(true); - assertNull(mDisplayContent.getImeTarget(IME_TARGET_INPUT)); + assertNull(mDisplayContent.getImeInputTarget()); verify(child1, never()).needsRelativeLayeringToIme(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index e3876150bf99..90a6918644fa 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -30,7 +30,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; -import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static org.junit.Assert.assertEquals; @@ -182,12 +181,13 @@ public class InsetsStateControllerTest extends WindowTestsBase { // Make IME and stay visible during the test. mImeWindow.setHasSurface(true); getController().getSourceProvider(ITYPE_IME).setWindowContainer(mImeWindow, null, null); - getController().onImeControlTargetChanged(mDisplayContent.getImeTarget(IME_TARGET_INPUT)); + getController().onImeControlTargetChanged( + mDisplayContent.getImeInputTarget().getWindowState()); final InsetsVisibilities requestedVisibilities = new InsetsVisibilities(); requestedVisibilities.setVisibility(ITYPE_IME, true); - mDisplayContent.getImeTarget(IME_TARGET_INPUT).getWindow() + mDisplayContent.getImeInputTarget().getWindowState() .setRequestedVisibilities(requestedVisibilities); - getController().onInsetsModified(mDisplayContent.getImeTarget(IME_TARGET_INPUT)); + getController().onInsetsModified(mDisplayContent.getImeInputTarget().getWindowState()); // Send our spy window (app) into the system so that we can detect the invocation. final WindowState win = createWindow(null, TYPE_APPLICATION, "app"); |