summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yohei Yukawa <yukawa@google.com> 2024-07-04 10:20:20 +0900
committer Yohei Yukawa <yukawa@google.com> 2024-07-04 10:20:20 +0900
commit363d54735a1f237a82371b17b8fc400f9f13c5a9 (patch)
treeb467a8e585b4fda1e1601e6df1123cf103629fb5
parent5ed1656b9342fa0feaffc541a55a1efedb969774 (diff)
Move SettingsObserver#mLastEnabled to UserData
In order to make InputMethodManagerService.SettingsObserver multi-user aware, one challenge is SettingsObserver#mLastEnabled, which is tightly coupled with "single-user" concept. So this CL moves it to UserData object in a mechanical manner. There must be no behavior change in the single user mode anyway, and for concurrent multi-user mode SettingsObserver is not yet fully multi-user aware so this change is not yet used. Bug: 342027196 Test: presubmit Flag: android.view.inputmethod.concurrent_input_methods Change-Id: Ie37a439fcd4155272efa9620ca20520ba4c58400
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java24
-rw-r--r--services/core/java/com/android/server/inputmethod/UserDataRepository.java7
2 files changed, 20 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 3db99522f657..3bc8d533527b 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -572,8 +572,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
class SettingsObserver extends ContentObserver {
int mUserId;
boolean mRegistered = false;
- @NonNull
- String mLastEnabled = "";
/**
* <em>This constructor must be called within the lock.</em>
@@ -593,7 +591,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
mRegistered = false;
}
if (mUserId != userId) {
- mLastEnabled = "";
mUserId = userId;
}
resolver.registerContentObserver(Settings.Secure.getUriFor(
@@ -646,8 +643,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
boolean enabledChanged = false;
String newEnabled = InputMethodSettingsRepository.get(mUserId)
.getEnabledInputMethodsStr();
- if (!mLastEnabled.equals(newEnabled)) {
- mLastEnabled = newEnabled;
+ final var userData = getUserData(mUserId);
+ if (!userData.mLastEnabledInputMethodsStr.equals(newEnabled)) {
+ userData.mLastEnabledInputMethodsStr = newEnabled;
enabledChanged = true;
}
updateInputMethodsFromSettingsLocked(enabledChanged, mUserId);
@@ -657,8 +655,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
@Override
public String toString() {
- return "SettingsObserver{mUserId=" + mUserId + " mRegistered=" + mRegistered
- + " mLastEnabled=" + mLastEnabled + "}";
+ return "SettingsObserver{mUserId=" + mUserId + " mRegistered=" + mRegistered + "}";
}
}
@@ -1305,11 +1302,15 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
maybeInitImeNavbarConfigLocked(newUserId);
+ final var newUserData = getUserData(newUserId);
+
+ // TODO(b/342027196): Double check if we need to always reset upon user switching.
+ newUserData.mLastEnabledInputMethodsStr = "";
+
// ContentObserver should be registered again when the user is changed
mSettingsObserver.registerContentObserverLocked(newUserId);
mCurrentUserId = newUserId;
- final var newUserData = getUserData(newUserId);
final String defaultImiId = SecureSettingsWrapper.getString(
Settings.Secure.DEFAULT_INPUT_METHOD, null, newUserId);
@@ -4263,9 +4264,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
}
if (currentUser) {
// To avoid unnecessary "updateInputMethodsFromSettingsLocked" from happening.
- if (mSettingsObserver != null) {
- mSettingsObserver.mLastEnabled = settings.getEnabledInputMethodsStr();
- }
+ final var userData = getUserData(userId);
+ userData.mLastEnabledInputMethodsStr = settings.getEnabledInputMethodsStr();
updateInputMethodsFromSettingsLocked(false /* enabledChanged */, userId);
}
}
@@ -6104,6 +6104,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
p.println(" inFullscreenMode=" + u.mInFullscreenMode);
p.println(" switchingController:");
u.mSwitchingController.dump(p, " ");
+ p.println(" mLastEnabledInputMethodsStr="
+ + u.mLastEnabledInputMethodsStr);
};
mUserDataRepository.forAllUserData(userDataDump);
diff --git a/services/core/java/com/android/server/inputmethod/UserDataRepository.java b/services/core/java/com/android/server/inputmethod/UserDataRepository.java
index 48284fb3163c..59411ad71bc0 100644
--- a/services/core/java/com/android/server/inputmethod/UserDataRepository.java
+++ b/services/core/java/com/android/server/inputmethod/UserDataRepository.java
@@ -174,6 +174,13 @@ final class UserDataRepository {
mEnabledAccessibilitySessions = new SparseArray<>();
/**
+ * A per-user cache of {@link InputMethodSettings#getEnabledInputMethodsStr()}.
+ */
+ @GuardedBy("ImfLock.class")
+ @NonNull
+ String mLastEnabledInputMethodsStr = "";
+
+ /**
* Intended to be instantiated only from this file.
*/
private UserData(@UserIdInt int userId,