Loading services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +30 −36 Original line number Original line Diff line number Diff line Loading @@ -1247,6 +1247,14 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub */ */ private boolean mImePackageAppeared = false; 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") @GuardedBy("ImfLock.class") void clearKnownImePackageNamesLocked() { void clearKnownImePackageNamesLocked() { mKnownImePackageNames.clear(); mKnownImePackageNames.clear(); Loading Loading @@ -1350,36 +1358,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub @Override @Override public void onPackageDataCleared(String packageName, int uid) { 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 @Override Loading @@ -1391,6 +1371,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub private void clearPackageChangeState() { private void clearPackageChangeState() { // No need to lock them because we access these fields only on getRegisteredHandler(). // No need to lock them because we access these fields only on getRegisteredHandler(). mChangedPackages.clear(); mChangedPackages.clear(); mDataClearedPackages.clear(); mImePackageAppeared = false; mImePackageAppeared = false; } } Loading Loading @@ -1421,7 +1402,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub synchronized (ImfLock.class) { synchronized (ImfLock.class) { final int userId = getChangingUserId(); final int userId = getChangingUserId(); final boolean isCurrentUser = (userId == mSettings.getUserId()); final boolean isCurrentUser = (userId == mSettings.getUserId()); AdditionalSubtypeMap additionalSubtypeMap = final AdditionalSubtypeMap additionalSubtypeMap = AdditionalSubtypeMapRepository.get(userId); AdditionalSubtypeMapRepository.get(userId); final InputMethodSettings settings; final InputMethodSettings settings; if (isCurrentUser) { if (isCurrentUser) { Loading @@ -1434,6 +1415,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub InputMethodInfo curIm = null; InputMethodInfo curIm = null; String curInputMethodId = settings.getSelectedInputMethod(); String curInputMethodId = settings.getSelectedInputMethod(); final List<InputMethodInfo> methodList = settings.getMethodList(); final List<InputMethodInfo> methodList = settings.getMethodList(); final ArrayList<String> imesToClearAdditionalSubtypes = new ArrayList<>(); final int numImes = methodList.size(); final int numImes = methodList.size(); for (int i = 0; i < numImes; i++) { for (int i = 0; i < numImes; i++) { InputMethodInfo imi = methodList.get(i); InputMethodInfo imi = methodList.get(i); Loading @@ -1441,6 +1424,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub if (imiId.equals(curInputMethodId)) { if (imiId.equals(curInputMethodId)) { curIm = imi; curIm = imi; } } if (mDataClearedPackages.contains(imi.getPackageName())) { imesToClearAdditionalSubtypes.add(imiId); } int change = isPackageDisappearing(imi.getPackageName()); int change = isPackageDisappearing(imi.getPackageName()); if (change == PACKAGE_TEMPORARY_CHANGE || change == PACKAGE_PERMANENT_CHANGE) { if (change == PACKAGE_TEMPORARY_CHANGE || change == PACKAGE_PERMANENT_CHANGE) { Slog.i(TAG, "Input method uninstalled, disabling: " + imi.getComponent()); Slog.i(TAG, "Input method uninstalled, disabling: " + imi.getComponent()); Loading @@ -1455,14 +1441,22 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } else if (change == PACKAGE_UPDATING) { } else if (change == PACKAGE_UPDATING) { Slog.i(TAG, "Input method reinstalling, clearing additional subtypes: " Slog.i(TAG, "Input method reinstalling, clearing additional subtypes: " + imi.getComponent()); + imi.getComponent()); additionalSubtypeMap = imesToClearAdditionalSubtypes.add(imiId); additionalSubtypeMap.cloneWithRemoveOrSelf(imi.getId()); AdditionalSubtypeMapRepository.putAndSave(userId, additionalSubtypeMap, settings.getMethodMap()); } } } } 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; return; } } Loading Loading
services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +30 −36 Original line number Original line Diff line number Diff line Loading @@ -1247,6 +1247,14 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub */ */ private boolean mImePackageAppeared = false; 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") @GuardedBy("ImfLock.class") void clearKnownImePackageNamesLocked() { void clearKnownImePackageNamesLocked() { mKnownImePackageNames.clear(); mKnownImePackageNames.clear(); Loading Loading @@ -1350,36 +1358,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub @Override @Override public void onPackageDataCleared(String packageName, int uid) { 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 @Override Loading @@ -1391,6 +1371,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub private void clearPackageChangeState() { private void clearPackageChangeState() { // No need to lock them because we access these fields only on getRegisteredHandler(). // No need to lock them because we access these fields only on getRegisteredHandler(). mChangedPackages.clear(); mChangedPackages.clear(); mDataClearedPackages.clear(); mImePackageAppeared = false; mImePackageAppeared = false; } } Loading Loading @@ -1421,7 +1402,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub synchronized (ImfLock.class) { synchronized (ImfLock.class) { final int userId = getChangingUserId(); final int userId = getChangingUserId(); final boolean isCurrentUser = (userId == mSettings.getUserId()); final boolean isCurrentUser = (userId == mSettings.getUserId()); AdditionalSubtypeMap additionalSubtypeMap = final AdditionalSubtypeMap additionalSubtypeMap = AdditionalSubtypeMapRepository.get(userId); AdditionalSubtypeMapRepository.get(userId); final InputMethodSettings settings; final InputMethodSettings settings; if (isCurrentUser) { if (isCurrentUser) { Loading @@ -1434,6 +1415,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub InputMethodInfo curIm = null; InputMethodInfo curIm = null; String curInputMethodId = settings.getSelectedInputMethod(); String curInputMethodId = settings.getSelectedInputMethod(); final List<InputMethodInfo> methodList = settings.getMethodList(); final List<InputMethodInfo> methodList = settings.getMethodList(); final ArrayList<String> imesToClearAdditionalSubtypes = new ArrayList<>(); final int numImes = methodList.size(); final int numImes = methodList.size(); for (int i = 0; i < numImes; i++) { for (int i = 0; i < numImes; i++) { InputMethodInfo imi = methodList.get(i); InputMethodInfo imi = methodList.get(i); Loading @@ -1441,6 +1424,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub if (imiId.equals(curInputMethodId)) { if (imiId.equals(curInputMethodId)) { curIm = imi; curIm = imi; } } if (mDataClearedPackages.contains(imi.getPackageName())) { imesToClearAdditionalSubtypes.add(imiId); } int change = isPackageDisappearing(imi.getPackageName()); int change = isPackageDisappearing(imi.getPackageName()); if (change == PACKAGE_TEMPORARY_CHANGE || change == PACKAGE_PERMANENT_CHANGE) { if (change == PACKAGE_TEMPORARY_CHANGE || change == PACKAGE_PERMANENT_CHANGE) { Slog.i(TAG, "Input method uninstalled, disabling: " + imi.getComponent()); Slog.i(TAG, "Input method uninstalled, disabling: " + imi.getComponent()); Loading @@ -1455,14 +1441,22 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } else if (change == PACKAGE_UPDATING) { } else if (change == PACKAGE_UPDATING) { Slog.i(TAG, "Input method reinstalling, clearing additional subtypes: " Slog.i(TAG, "Input method reinstalling, clearing additional subtypes: " + imi.getComponent()); + imi.getComponent()); additionalSubtypeMap = imesToClearAdditionalSubtypes.add(imiId); additionalSubtypeMap.cloneWithRemoveOrSelf(imi.getId()); AdditionalSubtypeMapRepository.putAndSave(userId, additionalSubtypeMap, settings.getMethodMap()); } } } } 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; return; } } Loading