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

Commit 830ddac8 authored by Antonio Kantek's avatar Antonio Kantek
Browse files

Format IMMS#dump to display concurrent multi-users

New output format for `adb shell dumpsys input_method`:
```
Current Input Method Manager state:
  mSystemReady=...
  mInteractive=...
  mConcurrentMultiUserModeEnabled=...
  ENABLE_HIDE_IME_CAPTION_BAR=...
  mStylusIds=...
  mMenuControllerNew:
    isShowing: ...
  ...
  UserId=0
    Input Methods:
      InputMethod #0:
      ...
  UserId=10
    Input Methods:
      InputMethod #0:
      ...
  UserId=n
    ...
 [UserDataRepository]
 [ClientStates]
 [StartInputHistory]
 [SoftInputShowHideHistory]
 [ImeTrackerService]
```

Bug: 351912418
Flag: EXEMPT refactor dumpsys input_method
Test: m
Change-Id: I604784d6cb637334d933d20890998daa29181849
parent a9f5bdf3
Loading
Loading
Loading
Loading
+104 −89
Original line number Diff line number Diff line
@@ -6107,7 +6107,22 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        final int argUserId = parseUserIdFromDumpArgs(args);
        final Printer p = new PrintWriterPrinter(pw);
        p.println("Current Input Method Manager state:");
        p.println("  concurrentMultiUserModeEnabled=" + mConcurrentMultiUserModeEnabled);
        p.println("  mSystemReady=" + mSystemReady);
        p.println("  mInteractive=" + mIsInteractive);
        p.println("  mConcurrentMultiUserModeEnabled=" + mConcurrentMultiUserModeEnabled);
        p.println("  ENABLE_HIDE_IME_CAPTION_BAR="
                + InputMethodService.ENABLE_HIDE_IME_CAPTION_BAR);
        synchronized (ImfLock.class) {
            p.println("  mStylusIds=" + (mStylusIds != null
                    ? Arrays.toString(mStylusIds.toArray()) : ""));
        }
        if (Flags.imeSwitcherRevamp()) {
            p.println("  mMenuControllerNew:");
            mMenuControllerNew.dump(p, "  ");
        } else {
            p.println("  mMenuController:");
            mMenuController.dump(p, "  ");
        }
        if (mConcurrentMultiUserModeEnabled && argUserId == UserHandle.USER_NULL) {
            mUserDataRepository.forAllUserData(
                    u -> dumpAsStringNoCheckForUser(u, fd, pw, args, isCritical));
@@ -6116,6 +6131,22 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            final var userData = getUserData(userId);
            dumpAsStringNoCheckForUser(userData, fd, pw, args, isCritical);
        }

        // TODO(b/365868861): Make StartInputHistory, SoftInputShowHideHistory and ImeTracker per
        //  user.
        synchronized (ImfLock.class) {
            p.println("  mStartInputHistory:");
            mStartInputHistory.dump(pw, "    ");

            p.println("  mSoftInputShowHideHistory:");
            mSoftInputShowHideHistory.dump(pw, "    ");
        }

        p.println("  mImeTrackerService#History:");
        mImeTrackerService.dump(pw, "    ");

        dumpUserRepository(p);
        dumpClientStates(p);
    }

    @UserIdInt
@@ -6146,24 +6177,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                p.println("      InputMethod #" + i + ":");
                info.dump(p, "        ");
            }
            // Dump ClientController#mClients
            p.println("  ClientStates:");
            // TODO(b/324907325): Remove the suppress warnings once b/324907325 is fixed.
            @SuppressWarnings("GuardedBy") Consumer<ClientState> clientControllerDump = c -> {
                p.println("  " + c + ":");
                p.println("    client=" + c.mClient);
                p.println("    fallbackInputConnection="
                        + c.mFallbackInputConnection);
                p.println("    sessionRequested="
                        + c.mSessionRequested);
                p.println("    sessionRequestedForAccessibility="
                        + c.mSessionRequestedForAccessibility);
                p.println("    curSession=" + c.mCurSession);
                p.println("    selfReportedDisplayId=" + c.mSelfReportedDisplayId);
                p.println("    uid=" + c.mUid);
                p.println("    pid=" + c.mPid);
            };
            mClientController.forAllClients(clientControllerDump);
            final var bindingController = userData.mBindingController;
            p.println("        mCurMethodId=" + bindingController.getSelectedMethodId());
            client = userData.mCurClient;
@@ -6171,48 +6184,10 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    + bindingController.getSequenceNumber());
            p.println("        mFocusedWindowPerceptible=" + mFocusedWindowPerceptible);
            userData.mImeBindingState.dump(/* prefix= */ "  ", p);

            p.println("  mCurId=" + bindingController.getCurId()
                    + " mHaveConnection=" + bindingController.hasMainConnection()
                    + " mBoundToMethod=" + userData.mBoundToMethod + " mVisibleBound="
                    + bindingController.isVisibleBound());

            p.println("  mUserDataRepository=");
            // TODO(b/324907325): Remove the suppress warnings once b/324907325 is fixed.
            @SuppressWarnings("GuardedBy") Consumer<UserData> userDataDump =
                    u -> {
                        p.println("    mUserId=" + u.mUserId);
                        p.println("      unlocked=" + u.mIsUnlockingOrUnlocked.get());
                        p.println("      hasMainConnection="
                                + u.mBindingController.hasMainConnection());
                        p.println("      isVisibleBound=" + u.mBindingController.isVisibleBound());
                        p.println("      boundToMethod=" + u.mBoundToMethod);
                        p.println("      curClient=" + u.mCurClient);
                        if (u.mCurEditorInfo != null) {
                            p.println("      curEditorInfo:");
                            u.mCurEditorInfo.dump(p, "        ", false /* dumpExtras */);
                        } else {
                            p.println("      curEditorInfo: null");
                        }
                        p.println("      imeBindingState:");
                        u.mImeBindingState.dump("        ", p);
                        p.println("      enabledSession=" + u.mEnabledSession);
                        p.println("      inFullscreenMode=" + u.mInFullscreenMode);
                        p.println("      imeDrawsNavBar=" + u.mImeDrawsNavBar.get());
                        p.println("      switchingController:");
                        u.mSwitchingController.dump(p, "        ");
                        p.println("      mLastEnabledInputMethodsStr="
                                + u.mLastEnabledInputMethodsStr);
                    };
            mUserDataRepository.forAllUserData(userDataDump);

            if (Flags.imeSwitcherRevamp()) {
                p.println("  menuControllerNew:");
                mMenuControllerNew.dump(p, "  ");
            } else {
                p.println("  menuController:");
                mMenuController.dump(p, "  ");
            }
            p.println("        mCurId=" + bindingController.getCurId());
            p.println("        mHaveConnection=" + bindingController.hasMainConnection());
            p.println("        mBoundToMethod=" + userData.mBoundToMethod);
            p.println("        mVisibleBound=" + bindingController.isVisibleBound());
            p.println("        mCurToken=" + bindingController.getCurToken());
            p.println("        mCurTokenDisplayId=" + bindingController.getCurTokenDisplayId());
            p.println("        mCurHostInputToken=" + bindingController.getCurHostInputToken());
@@ -6223,21 +6198,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            final var visibilityStateComputer = userData.mVisibilityStateComputer;
            visibilityStateComputer.dump(pw, "  ");
            p.println("        mInFullscreenMode=" + userData.mInFullscreenMode);
            p.println("  mSystemReady=" + mSystemReady + " mInteractive=" + mIsInteractive);
            p.println("  mConcurrentMultiUserModeEnabled=" + mConcurrentMultiUserModeEnabled);
            p.println("  ENABLE_HIDE_IME_CAPTION_BAR="
                    + InputMethodService.ENABLE_HIDE_IME_CAPTION_BAR);
            p.println("  mStylusIds=" + (mStylusIds != null
                    ? Arrays.toString(mStylusIds.toArray()) : ""));

            p.println("  mStartInputHistory:");
            mStartInputHistory.dump(pw, "    ");

            p.println("  mSoftInputShowHideHistory:");
            mSoftInputShowHideHistory.dump(pw, "    ");

            p.println("  mImeTrackerService#History:");
            mImeTrackerService.dump(pw, "    ");
        }

        // Exit here for critical dump, as remaining sections require IPCs to other processes.
@@ -6288,6 +6248,61 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        }
    }

    private void dumpClientStates(Printer p) {
        p.println(" ClientStates:");
        // TODO(b/324907325): Remove the suppress warnings once b/324907325 is fixed.
        @SuppressWarnings("GuardedBy") Consumer<ClientState> clientControllerDump = c -> {
            p.println("   " + c + ":");
            p.println("    client=" + c.mClient);
            p.println("    fallbackInputConnection="
                    + c.mFallbackInputConnection);
            p.println("    sessionRequested="
                    + c.mSessionRequested);
            p.println("    sessionRequestedForAccessibility="
                    + c.mSessionRequestedForAccessibility);
            p.println("    curSession=" + c.mCurSession);
            p.println("    selfReportedDisplayId=" + c.mSelfReportedDisplayId);
            p.println("    uid=" + c.mUid);
            p.println("    pid=" + c.mPid);
        };
        synchronized (ImfLock.class) {
            mClientController.forAllClients(clientControllerDump);
        }
    }

    private void dumpUserRepository(Printer p) {
        p.println("  mUserDataRepository=");
        // TODO(b/324907325): Remove the suppress warnings once b/324907325 is fixed.
        @SuppressWarnings("GuardedBy") Consumer<UserData> userDataDump =
                u -> {
                    p.println("    mUserId=" + u.mUserId);
                    p.println("      unlocked=" + u.mIsUnlockingOrUnlocked.get());
                    p.println("      hasMainConnection="
                            + u.mBindingController.hasMainConnection());
                    p.println("      isVisibleBound=" + u.mBindingController.isVisibleBound());
                    p.println("      boundToMethod=" + u.mBoundToMethod);
                    p.println("      curClient=" + u.mCurClient);
                    if (u.mCurEditorInfo != null) {
                        p.println("      curEditorInfo:");
                        u.mCurEditorInfo.dump(p, "        ", false /* dumpExtras */);
                    } else {
                        p.println("      curEditorInfo: null");
                    }
                    p.println("      imeBindingState:");
                    u.mImeBindingState.dump("        ", p);
                    p.println("      enabledSession=" + u.mEnabledSession);
                    p.println("      inFullscreenMode=" + u.mInFullscreenMode);
                    p.println("      imeDrawsNavBar=" + u.mImeDrawsNavBar.get());
                    p.println("      switchingController:");
                    u.mSwitchingController.dump(p, "        ");
                    p.println("      mLastEnabledInputMethodsStr="
                            + u.mLastEnabledInputMethodsStr);
                };
        synchronized (ImfLock.class) {
            mUserDataRepository.forAllUserData(userDataDump);
        }
    }

    @BinderThread
    @Override
    public void onShellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out,