diff options
| author | 2024-10-25 16:58:54 +0200 | |
|---|---|---|
| committer | 2024-10-28 10:56:10 +0100 | |
| commit | cccfbd7ec99d20e8cb674c01fc51ebec7e82b920 (patch) | |
| tree | 06c9c505e943264fc8b3c882b864d40c42aacbfe | |
| parent | 3f4654f4fa56dacb11f6698239a99cbf6b5feb59 (diff) | |
Re-order InputMethodManagerService state dump
With the changes in [1] to enable dumping the state for concurrent
multi-users, some of the dumps were re-ordered, leading to some state
being dumped after the InputMethodService dump is called. The issue is
that IMEs can override the dump method to include their own state with
an unknown number of arguments. This leads to the system state being
pushed all the way to the end of the dump.
This introduces a dumping order similar to the one before [1],
additionally fixes some mismatching in the prefix whitespace,
and introduces some missing state in the dumps.
[1]: I604784d6cb637334d933d20890998daa29181849
Flag: EXEMPT state dump
Bug: 356239178
Test: presubmit
Change-Id: Iacf9ef9f8293d5d7656505906baa7889a1a3f90d
4 files changed, 104 insertions, 104 deletions
diff --git a/services/core/java/com/android/server/inputmethod/ImeBindingState.java b/services/core/java/com/android/server/inputmethod/ImeBindingState.java index f78ea84efb77..5deed39a2dce 100644 --- a/services/core/java/com/android/server/inputmethod/ImeBindingState.java +++ b/services/core/java/com/android/server/inputmethod/ImeBindingState.java @@ -20,6 +20,7 @@ import static android.server.inputmethod.InputMethodManagerServiceProto.CUR_FOCU import static android.server.inputmethod.InputMethodManagerServiceProto.CUR_FOCUSED_WINDOW_SOFT_INPUT_MODE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.os.IBinder; @@ -86,10 +87,10 @@ final class ImeBindingState { InputMethodDebug.softInputModeToString(mFocusedWindowSoftInputMode)); } - void dump(String prefix, Printer p) { - p.println(prefix + "mFocusedWindow()=" + mFocusedWindow); - p.println(prefix + "softInputMode=" + InputMethodDebug.softInputModeToString( - mFocusedWindowSoftInputMode)); + void dump(@NonNull Printer p, @NonNull String prefix) { + p.println(prefix + "mFocusedWindow=" + mFocusedWindow); + p.println(prefix + "mFocusedWindowSoftInputMode=" + + InputMethodDebug.softInputModeToString(mFocusedWindowSoftInputMode)); p.println(prefix + "mFocusedWindowClient=" + mFocusedWindowClient); } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 83044c202a04..cf144612b65c 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -6063,42 +6063,40 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. @BinderThread @Override - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @Nullable String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; PriorityDump.dump(mPriorityDumper, fd, pw, args); } @BinderThread - private void dumpAsStringNoCheck(FileDescriptor fd, PrintWriter pw, String[] args, - boolean isCritical) { + private void dumpAsStringNoCheck(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, + @NonNull String[] args, boolean isCritical) { final int argUserId = parseUserIdFromDumpArgs(args); final Printer p = new PrintWriterPrinter(pw); - p.println("Current Input Method Manager state:"); + p.println("Input Method Manager Service state:"); 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); + final int currentImeUserId; synchronized (ImfLock.class) { + currentImeUserId = mCurrentImeUserId; + p.println(" mCurrentImeUserId=" + currentImeUserId); p.println(" mStylusIds=" + (mStylusIds != null ? Arrays.toString(mStylusIds.toArray()) : "")); } + // TODO(b/305849394): Make mMenuController multi-user aware. if (Flags.imeSwitcherRevamp()) { p.println(" mMenuControllerNew:"); - mMenuControllerNew.dump(p, " "); + 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)); - } else { - final int userId = argUserId != UserHandle.USER_NULL ? argUserId : mCurrentImeUserId; - final var userData = getUserData(userId); - dumpAsStringNoCheckForUser(userData, fd, pw, args, isCritical); + mMenuController.dump(p, " "); } + dumpClientController(p); + dumpUserRepository(p); // TODO(b/365868861): Make StartInputHistory and ImeTracker multi-user aware. synchronized (ImfLock.class) { @@ -6112,12 +6110,18 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. p.println(" mImeTrackerService#History:"); mImeTrackerService.dump(pw, " "); - dumpUserRepository(p); - dumpClientStates(p); + if (mConcurrentMultiUserModeEnabled && argUserId == UserHandle.USER_NULL) { + mUserDataRepository.forAllUserData( + u -> dumpAsStringNoCheckForUser(u, fd, pw, args, isCritical)); + } else { + final int userId = argUserId != UserHandle.USER_NULL ? argUserId : currentImeUserId; + final var userData = getUserData(userId); + dumpAsStringNoCheckForUser(userData, fd, pw, args, isCritical); + } } @UserIdInt - private static int parseUserIdFromDumpArgs(String[] args) { + private static int parseUserIdFromDumpArgs(@NonNull String[] args) { final int userIdx = Arrays.binarySearch(args, "--user"); if (userIdx == -1 || userIdx == args.length - 1) { return UserHandle.USER_NULL; @@ -6127,44 +6131,46 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. // TODO(b/356239178): Update dump format output to better group per-user info. @BinderThread - private void dumpAsStringNoCheckForUser(UserData userData, FileDescriptor fd, PrintWriter pw, - String[] args, boolean isCritical) { + private void dumpAsStringNoCheckForUser(@NonNull UserData userData, @NonNull FileDescriptor fd, + @NonNull PrintWriter pw, @NonNull String[] args, boolean isCritical) { final Printer p = new PrintWriterPrinter(pw); - IInputMethodInvoker method; ClientState client; + IInputMethodInvoker method; p.println(" UserId=" + userData.mUserId); synchronized (ImfLock.class) { - final InputMethodSettings settings = InputMethodSettingsRepository.get( - userData.mUserId); + final var bindingController = userData.mBindingController; + client = userData.mCurClient; + method = bindingController.getCurMethod(); + p.println(" mCurMethodId=" + bindingController.getSelectedMethodId()); + p.println(" mCurClient=" + client + " mCurSeq=" + + bindingController.getSequenceNumber()); + p.println(" mFocusedWindowPerceptible=" + mFocusedWindowPerceptible); + p.println(" mImeBindingState:"); + userData.mImeBindingState.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()); + p.println(" mCurIntent=" + bindingController.getCurIntent()); + p.println(" mCurImeWindowVis=" + bindingController.getImeWindowVis()); + p.println(" mCurMethod=" + method); + p.println(" mEnabledSession=" + userData.mEnabledSession); + p.println(" mVisibilityStateComputer:"); + userData.mVisibilityStateComputer.dump(pw, " "); + p.println(" mInFullscreenMode=" + userData.mInFullscreenMode); + + final var settings = InputMethodSettingsRepository.get(userData.mUserId); final List<InputMethodInfo> methodList = settings.getMethodList(); - int numImes = methodList.size(); + final int numImes = methodList.size(); p.println(" Input Methods:"); for (int i = 0; i < numImes; i++) { - InputMethodInfo info = methodList.get(i); + final InputMethodInfo info = methodList.get(i); p.println(" InputMethod #" + i + ":"); info.dump(p, " "); } - final var bindingController = userData.mBindingController; - p.println(" mCurMethodId=" + bindingController.getSelectedMethodId()); - client = userData.mCurClient; - p.println(" mCurClient=" + client + " mCurSeq=" - + bindingController.getSequenceNumber()); - p.println(" mFocusedWindowPerceptible=" + mFocusedWindowPerceptible); - userData.mImeBindingState.dump(/* prefix= */ " ", 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()); - p.println(" mCurIntent=" + bindingController.getCurIntent()); - method = bindingController.getCurMethod(); - p.println(" mCurMethod=" + method); - p.println(" mEnabledSession=" + userData.mEnabledSession); - final var visibilityStateComputer = userData.mVisibilityStateComputer; - visibilityStateComputer.dump(pw, " "); - p.println(" mInFullscreenMode=" + userData.mInFullscreenMode); } // Exit here for critical dump, as remaining sections require IPCs to other processes. @@ -6172,7 +6178,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. return; } - p.println(" "); + p.println(""); if (client != null) { pw.flush(); try { @@ -6184,25 +6190,23 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. p.println("No input method client."); } synchronized (ImfLock.class) { - if (userData.mImeBindingState.mFocusedWindowClient != null - && client != userData.mImeBindingState.mFocusedWindowClient) { - p.println(" "); - p.println("Warning: Current input method client doesn't match the last focused. " - + "window."); + final var focusedWindowClient = userData.mImeBindingState.mFocusedWindowClient; + if (focusedWindowClient != null && client != focusedWindowClient) { + p.println(""); + p.println("Warning: Current input method client doesn't match the last focused" + + " window."); p.println("Dumping input method client in the last focused window just in case."); - p.println(" "); + p.println(""); pw.flush(); try { - TransferPipe.dumpAsync( - userData.mImeBindingState.mFocusedWindowClient.mClient.asBinder(), fd, - args); + TransferPipe.dumpAsync(focusedWindowClient.mClient.asBinder(), fd, args); } catch (IOException | RemoteException e) { p.println("Failed to dump input method client in focused window: " + e); } } } - p.println(" "); + p.println(""); if (method != null) { pw.flush(); try { @@ -6215,56 +6219,51 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. } } - private void dumpClientStates(Printer p) { - p.println(" ClientStates:"); + private void dumpClientController(@NonNull Printer p) { + p.println(" mClientController:"); // 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=" + 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); + 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="); + private void dumpUserRepository(@NonNull 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); - }; + @SuppressWarnings("GuardedBy") Consumer<UserData> userDataDump = u -> { + p.println(" userId=" + 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); } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java index b5ee06863f2b..248fa60f4374 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java @@ -287,10 +287,10 @@ final class InputMethodMenuController { void dump(@NonNull Printer pw, @NonNull String prefix) { final boolean showing = isisInputMethodPickerShownForTestLocked(); - pw.println(prefix + " isShowing: " + showing); + pw.println(prefix + "isShowing: " + showing); if (showing) { - pw.println(prefix + " imList: " + mImList); + pw.println(prefix + "imList: " + mImList); } } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java index 1d0e3c639c3f..6abd5aabfabf 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java @@ -187,10 +187,10 @@ final class InputMethodMenuControllerNew { void dump(@NonNull Printer pw, @NonNull String prefix) { final boolean showing = isShowing(); - pw.println(prefix + " isShowing: " + showing); + pw.println(prefix + "isShowing: " + showing); if (showing) { - pw.println(prefix + " menuItems: " + mMenuItems); + pw.println(prefix + "menuItems: " + mMenuItems); } } |