summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Rob Carr <racarr@google.com> 2022-02-27 00:13:58 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-02-27 00:13:58 +0000
commit045bc655a3c7156c72b87b7fecf99b2dd1a0cfb2 (patch)
treed7216ee8877d63655db307f0d70c09f41ab4b6b3
parentffe63c3182e2ec9985df58cac2172fe6a9270546 (diff)
parent205da89cafb811db24cdc8d73e49f27dfd2656c8 (diff)
Merge "IME Support for SurfaceControlViewHost" into tm-dev
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java7
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java58
-rw-r--r--services/core/java/com/android/server/wm/EmbeddedWindowController.java68
-rw-r--r--services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java3
-rw-r--r--services/core/java/com/android/server/wm/InputTarget.java20
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java25
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java54
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java17
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java8
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");