Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b8103dd authored by Cosmin Băieș's avatar Cosmin Băieș
Browse files

Improve IME layering/input/control target dumping

This starts dumping the IME layering, input and control targets in the
DisplayContent, and removes the dump from WindowManagerService (which
was originally added in [1]). This brings the dumped information in the
same place as its declaration and update logic.

Additionally improves the format of SoftInputShowHideHistory, by
updating the legacy imeTargetNameFromWm name, and by also dumping the
IME input target.

Lastly, this adds a toString for the RemoteInsetsControlTarget, so we
can see which display it corresponds to, and what requested visibile
types it has.

Flag: EXEMPT log fix
Bug: 281029564
Test: verifying output of adb shell dumpsys window
  and adb shell dumpsys input_method

  [1]: I9aa934961fb3975bd2af18599b5a2884387b5007

Change-Id: I3e1ea6836638ee50575bea9bd34c301ce608f5a6
parent 7713d255
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -4576,14 +4576,14 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                        bindingController.getCurTokenDisplayId());
        mSoftInputShowHideHistory.addEntry(new SoftInputShowHideHistory.Entry(
                userData.mImeBindingState.mFocusedWindowClient,
                userData.mImeBindingState.mFocusedWindowEditorInfo,
                info.focusedWindowName, userData.mImeBindingState.mFocusedWindowSoftInputMode,
                reason, userData.mInFullscreenMode, info.requestWindowName,
                info.imeControlTargetName, info.imeLayerTargetName, info.imeSurfaceParentName,
                userData.mImeBindingState.mFocusedWindowEditorInfo, info.mFocusedWindowName,
                userData.mImeBindingState.mFocusedWindowSoftInputMode, reason,
                userData.mInFullscreenMode, info.mRequestWindowName, info.mImeLayeringTargetName,
                info.mImeInputTargetName, info.mImeControlTargetName, info.mImeSurfaceParentName,
                userId));

        if (statsToken != null) {
            mImeTrackerService.onImmsUpdate(statsToken, info.requestWindowName);
            mImeTrackerService.onImmsUpdate(statsToken, info.mRequestWindowName);
        }
    }

+16 −10
Original line number Diff line number Diff line
@@ -58,20 +58,22 @@ final class SoftInputShowHideHistory {
        @NonNull
        final String mRequestWindowName;
        @Nullable
        final String mImeControlTargetName;
        final String mImeLayeringTargetName;
        @Nullable
        final String mImeInputTargetName;
        @Nullable
        final String mImeTargetNameFromWm;
        final String mImeControlTargetName;
        @Nullable
        final String mImeSurfaceParentName;
        @UserIdInt
        final int mImeUserId;

        Entry(ClientState client, EditorInfo editorInfo,
                String focusedWindowName,
        Entry(@Nullable ClientState client, @Nullable EditorInfo editorInfo,
                @NonNull String focusedWindowName,
                @WindowManager.LayoutParams.SoftInputModeFlags int softInputMode,
                @SoftInputShowHideReason int reason,
                boolean inFullscreenMode, String requestWindowName,
                @Nullable String imeControlTargetName, @Nullable String imeTargetName,
                @SoftInputShowHideReason int reason, boolean inFullscreenMode,
                @NonNull String requestWindowName, @Nullable String imeLayeringTargetName,
                @Nullable String imeInputTargetName, @Nullable String imeControlTargetName,
                @Nullable String imeSurfaceParentName, @UserIdInt int imeUserId) {
            mClientState = client;
            mEditorInfo = editorInfo;
@@ -82,8 +84,9 @@ final class SoftInputShowHideHistory {
            mWallTime = System.currentTimeMillis();
            mInFullscreenMode = inFullscreenMode;
            mRequestWindowName = requestWindowName;
            mImeLayeringTargetName = imeLayeringTargetName;
            mImeInputTargetName = imeInputTargetName;
            mImeControlTargetName = imeControlTargetName;
            mImeTargetNameFromWm = imeTargetName;
            mImeSurfaceParentName = imeSurfaceParentName;
            mImeUserId = imeUserId;
        }
@@ -128,10 +131,13 @@ final class SoftInputShowHideHistory {
            pw.println("  requestWindowName=" + entry.mRequestWindowName);

            pw.print(prefix);
            pw.println("  imeControlTargetName=" + entry.mImeControlTargetName);
            pw.println("  imeLayeringTargetName=" + entry.mImeLayeringTargetName);

            pw.print(prefix);
            pw.println("  imeTargetNameFromWm=" + entry.mImeTargetNameFromWm);
            pw.println("  imeInputTargetName=" + entry.mImeInputTargetName);

            pw.print(prefix);
            pw.println("  imeControlTargetName=" + entry.mImeControlTargetName);

            pw.print(prefix);
            pw.println("  imeSurfaceParentName=" + entry.mImeSurfaceParentName);
+21 −11
Original line number Diff line number Diff line
@@ -3746,18 +3746,20 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp

        pw.println();
        super.dump(pw, prefix, dumpAll);
        pw.print(prefix);
        if (mHasSetIgnoreOrientationRequest) {
            pw.print("mHasSetIgnoreOrientationRequest=true ");
        }
        pw.print(prefix); pw.print("mHasSetIgnoreOrientationRequest=");
        pw.print(mHasSetIgnoreOrientationRequest);
        pw.print(" ignoreOrientationRequest="); pw.println(getIgnoreOrientationRequest());
        pw.print(prefix); pw.print("mLayoutSeq="); pw.println(mLayoutSeq);

        pw.print("  mCurrentFocus="); pw.println(mCurrentFocus);
        pw.print("  mFocusedApp="); pw.println(mFocusedApp);
        if (mFixedRotationLaunchingApp != null) {
            pw.println("  mFixedRotationLaunchingApp=" + mFixedRotationLaunchingApp);
        }
        pw.print(prefix); pw.print("mImeLayeringTarget="); pw.println(mImeLayeringTarget);
        pw.print(prefix); pw.print("mImeInputTarget="); pw.println(mImeInputTarget);
        pw.print(prefix); pw.print("mImeControlTarget="); pw.println(mImeControlTarget);
        pw.print(prefix); pw.print("mRemoteInsetsControlTarget=");
        pw.println(mRemoteInsetsControlTarget);
        pw.print(prefix); pw.print("mCurrentFocus="); pw.println(mCurrentFocus);
        pw.print(prefix); pw.print("mFocusedApp="); pw.println(mFocusedApp);
        pw.print(prefix); pw.print("mFixedRotationLaunchingApp=");
        pw.println(mFixedRotationLaunchingApp);
        if (mAsyncRotationController != null) {
            mAsyncRotationController.dump(pw, prefix);
        }
@@ -7155,6 +7157,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
            }
        }

        @Override
        public String toString() {
            return "RemoteInsetsControlTarget{" + Integer.toHexString(System.identityHashCode(this))
                    + " displayId=" + mDisplayId
                    + " requestedVisibleTypes=" + mRequestedVisibleTypes
                    + " animatingTypes=" + mAnimatingTypes
                    + "}";
        }

        public void writeIdentifierToProto(ProtoOutputStream proto, long fieldId) {
            final long token = proto.start(fieldId);
            proto.write(HASH_CODE, System.identityHashCode(this));
@@ -7175,7 +7186,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
            proto.write(ANIMATING_TYPES, mAnimatingTypes);
            proto.end(token);
        }

    }

    MagnificationSpec getMagnificationSpec() {
+30 −23
Original line number Diff line number Diff line
@@ -972,33 +972,40 @@ public abstract class WindowManagerInternal {

    /** The information of input method target when IME is requested to show or hide. */
    public static class ImeTargetInfo {
        public final String focusedWindowName;
        public final String requestWindowName;

        /** The window name of IME Insets control target. */
        public final String imeControlTargetName;
        /** The name of the focused window. */
        @NonNull
        public final String mFocusedWindowName;

        /**
         * The current window name of the input method is on top of.
         * <p>
         * Note that the concept of this window is only used to reparent the target window behind
         * the input method window, it may be different from the window reported by
         * {@link com.android.server.inputmethod.InputMethodManagerService#reportStartInput} which
         * has input connection.
         */
        public final String imeLayerTargetName;
        /** The name of the window that requested the IME visibility change. */
        @NonNull
        public final String mRequestWindowName;

        /** The name of the {@link DisplayContent#mImeLayeringTarget}. */
        @NonNull
        public final String mImeLayeringTargetName;

        /** The name of the {@link DisplayContent#mImeInputTarget}. */
        @NonNull
        public final String mImeInputTargetName;

        /** The name of the {@link DisplayContent#mImeControlTarget}. */
        @NonNull
        public final String mImeControlTargetName;

        /** The surface parent of the IME container. */
        public final String imeSurfaceParentName;

        public ImeTargetInfo(String focusedWindowName, String requestWindowName,
                String imeControlTargetName, String imeLayerTargetName,
                String imeSurfaceParentName) {
            this.focusedWindowName = focusedWindowName;
            this.requestWindowName = requestWindowName;
            this.imeControlTargetName = imeControlTargetName;
            this.imeLayerTargetName = imeLayerTargetName;
            this.imeSurfaceParentName = imeSurfaceParentName;
        @NonNull
        public final String mImeSurfaceParentName;

        public ImeTargetInfo(@NonNull String focusedWindowName, @NonNull String requestWindowName,
                @NonNull String imeLayeringTargetName, @NonNull String imeInputTargetName,
                @NonNull String imeControlTargetName, @NonNull String imeSurfaceParentName) {
            mFocusedWindowName = focusedWindowName;
            mRequestWindowName = requestWindowName;
            mImeLayeringTargetName = imeLayeringTargetName;
            mImeInputTargetName = imeInputTargetName;
            mImeControlTargetName = imeControlTargetName;
            mImeSurfaceParentName = imeSurfaceParentName;
        }
    }

+17 −38
Original line number Diff line number Diff line
@@ -7052,21 +7052,6 @@ public class WindowManagerService extends IWindowManager.Stub
        mRoot.dumpTopFocusedDisplayId(pw);
        mRoot.forAllDisplays(dc -> {
            final int displayId = dc.getDisplayId();
            final WindowState imeLayeringTarget = dc.getImeLayeringTarget();
            final InputTarget imeInputTarget = dc.getImeInputTarget();
            final InsetsControlTarget imeControlTarget = dc.getImeControlTarget();
            if (imeLayeringTarget != null) {
                pw.print("  imeLayeringTarget in display# "); pw.print(displayId);
                pw.print(' '); pw.println(imeLayeringTarget);
            }
            if (imeInputTarget != null) {
                pw.print("  imeInputTarget in display# "); pw.print(displayId);
                pw.print(' '); pw.println(imeInputTarget);
            }
            if (imeControlTarget != null) {
                pw.print("  imeControlTarget in display# "); pw.print(displayId);
                pw.print(' '); pw.println(imeControlTarget);
            }
            pw.print("  Minimum task size of display#"); pw.print(displayId);
            pw.print(' '); pw.println(dc.mMinSizeOfResizeableTaskDp);
        });
@@ -8598,43 +8583,37 @@ public class WindowManagerService extends IWindowManager.Stub
            }
        }

        @NonNull
        @Override
        public ImeTargetInfo onToggleImeRequested(boolean show, IBinder focusedToken,
                IBinder requestToken, int displayId) {
        public ImeTargetInfo onToggleImeRequested(boolean show, @NonNull IBinder focusedToken,
                @NonNull IBinder requestToken, int displayId) {
            final String focusedWindowName;
            final String requestWindowName;
            final String imeControlTargetName;
            final String imeLayeringTargetName;
            final String imeInputTargetName;
            final String imeControlTargetName;
            final String imeSurfaceParentName;
            synchronized (mGlobalLock) {
                final WindowState focusedWin = mWindowMap.get(focusedToken);
                focusedWindowName = focusedWin != null ? focusedWin.getName() : "null";
                final WindowState requestWin = mWindowMap.get(requestToken);
                requestWindowName = requestWin != null ? requestWin.getName() : "null";
                focusedWindowName = String.valueOf(mWindowMap.get(focusedToken));
                requestWindowName = String.valueOf(mWindowMap.get(requestToken));
                final DisplayContent dc = mRoot.getDisplayContent(displayId);
                if (dc != null) {
                    final InsetsControlTarget controlTarget = dc.getImeControlTarget();
                    if (controlTarget != null) {
                        final WindowState w = InsetsControlTarget.asWindowOrNull(controlTarget);
                        imeControlTargetName = w != null ? w.getName() : controlTarget.toString();
                    } else {
                        imeControlTargetName = "null";
                    }
                    final WindowState layeringTarget = dc.getImeLayeringTarget();
                    imeLayeringTargetName = layeringTarget != null ? layeringTarget.getName()
                            : "null";
                    final SurfaceControl imeParent = dc.mInputMethodSurfaceParent;
                    imeSurfaceParentName = imeParent != null ? imeParent.toString() : "null";
                    imeLayeringTargetName = String.valueOf(dc.getImeLayeringTarget());
                    imeInputTargetName =  String.valueOf(dc.getImeInputTarget());
                    imeControlTargetName = String.valueOf(dc.getImeControlTarget());
                    imeSurfaceParentName = String.valueOf(dc.mInputMethodSurfaceParent);
                    if (show) {
                        dc.onShowImeRequested();
                    }
                } else {
                    imeControlTargetName = imeLayeringTargetName = imeSurfaceParentName =
                            "no-display";
                    imeLayeringTargetName = "no-display";
                    imeInputTargetName = "no-display";
                    imeControlTargetName = "no-display";
                    imeSurfaceParentName = "no-display";
                }
            }
            return new ImeTargetInfo(focusedWindowName, requestWindowName, imeControlTargetName,
                    imeLayeringTargetName, imeSurfaceParentName);
            return new ImeTargetInfo(focusedWindowName, requestWindowName, imeLayeringTargetName,
                    imeInputTargetName, imeControlTargetName, imeSurfaceParentName);
        }

        @Override
Loading