diff options
| author | 2024-03-08 19:39:53 +0000 | |
|---|---|---|
| committer | 2024-03-08 19:39:53 +0000 | |
| commit | b6a44c4786960c3bc1c5a3ba858f3947593d7cf3 (patch) | |
| tree | 37fac1bc79ba49597af07597caf687d3a90d11a8 | |
| parent | 22158774d0c22ac1ab458218290622fcc2ada627 (diff) | |
| parent | 1e4c0ddb120eaa1513c71241505d111835648a24 (diff) | |
Merge "Avoid redundant AdditionalSubtypeMapRepository#putAndSave()" into main
| -rw-r--r-- | services/core/java/com/android/server/inputmethod/InputMethodManagerService.java | 66 |
1 files changed, 30 insertions, 36 deletions
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 19f0298a4a66..996477d9c9ba 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -1247,6 +1247,14 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub */ private boolean mImePackageAppeared = false; + /** + * Remembers package names passed to {@link #onPackageDataCleared(String, int)}. + * + * <p>This field must be accessed only from callback methods in {@link PackageMonitor}, + * which should be bound to {@link #getRegisteredHandler()}.</p> + */ + private ArrayList<String> mDataClearedPackages = new ArrayList<>(); + @GuardedBy("ImfLock.class") void clearKnownImePackageNamesLocked() { mKnownImePackageNames.clear(); @@ -1350,36 +1358,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub @Override public void onPackageDataCleared(String packageName, int uid) { - final int userId = getChangingUserId(); - synchronized (ImfLock.class) { - final boolean isCurrentUser = (userId == mSettings.getUserId()); - final AdditionalSubtypeMap additionalSubtypeMap = - AdditionalSubtypeMapRepository.get(userId); - final InputMethodSettings settings; - if (isCurrentUser) { - settings = mSettings; - } else { - settings = queryInputMethodServicesInternal(mContext, userId, - additionalSubtypeMap, DirectBootAwareness.AUTO); - } - - // Note that one package may implement multiple IMEs. - final ArrayList<String> changedImes = new ArrayList<>(); - for (InputMethodInfo imi : settings.getMethodList()) { - if (imi.getPackageName().equals(packageName)) { - changedImes.add(imi.getId()); - } - } - final AdditionalSubtypeMap newMap = - additionalSubtypeMap.cloneWithRemoveOrSelf(changedImes); - if (newMap != additionalSubtypeMap) { - AdditionalSubtypeMapRepository.putAndSave(userId, newMap, - settings.getMethodMap()); - } - if (!changedImes.isEmpty()) { - mChangedPackages.add(packageName); - } - } + mChangedPackages.add(packageName); + mDataClearedPackages.add(packageName); } @Override @@ -1391,6 +1371,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub private void clearPackageChangeState() { // No need to lock them because we access these fields only on getRegisteredHandler(). mChangedPackages.clear(); + mDataClearedPackages.clear(); mImePackageAppeared = false; } @@ -1421,7 +1402,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub synchronized (ImfLock.class) { final int userId = getChangingUserId(); final boolean isCurrentUser = (userId == mSettings.getUserId()); - AdditionalSubtypeMap additionalSubtypeMap = + final AdditionalSubtypeMap additionalSubtypeMap = AdditionalSubtypeMapRepository.get(userId); final InputMethodSettings settings; if (isCurrentUser) { @@ -1434,6 +1415,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub InputMethodInfo curIm = null; String curInputMethodId = settings.getSelectedInputMethod(); final List<InputMethodInfo> methodList = settings.getMethodList(); + + final ArrayList<String> imesToClearAdditionalSubtypes = new ArrayList<>(); final int numImes = methodList.size(); for (int i = 0; i < numImes; i++) { InputMethodInfo imi = methodList.get(i); @@ -1441,6 +1424,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub if (imiId.equals(curInputMethodId)) { curIm = imi; } + if (mDataClearedPackages.contains(imi.getPackageName())) { + imesToClearAdditionalSubtypes.add(imiId); + } int change = isPackageDisappearing(imi.getPackageName()); if (change == PACKAGE_TEMPORARY_CHANGE || change == PACKAGE_PERMANENT_CHANGE) { Slog.i(TAG, "Input method uninstalled, disabling: " + imi.getComponent()); @@ -1455,14 +1441,22 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } else if (change == PACKAGE_UPDATING) { Slog.i(TAG, "Input method reinstalling, clearing additional subtypes: " + imi.getComponent()); - additionalSubtypeMap = - additionalSubtypeMap.cloneWithRemoveOrSelf(imi.getId()); - AdditionalSubtypeMapRepository.putAndSave(userId, - additionalSubtypeMap, settings.getMethodMap()); + imesToClearAdditionalSubtypes.add(imiId); } } - if (!isCurrentUser || !shouldRebuildInputMethodListLocked()) { + // Clear additional subtypes as a batch operation. + final AdditionalSubtypeMap newAdditionalSubtypeMap = + additionalSubtypeMap.cloneWithRemoveOrSelf(imesToClearAdditionalSubtypes); + final boolean additionalSubtypeChanged = + (newAdditionalSubtypeMap != additionalSubtypeMap); + if (additionalSubtypeChanged) { + AdditionalSubtypeMapRepository.putAndSave(userId, newAdditionalSubtypeMap, + settings.getMethodMap()); + } + + if (!isCurrentUser + || !(additionalSubtypeChanged || shouldRebuildInputMethodListLocked())) { return; } |