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

Commit b6a44c47 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Avoid redundant AdditionalSubtypeMapRepository#putAndSave()" into main

parents 22158774 1e4c0ddb
Loading
Loading
Loading
Loading
+30 −36
Original line number Original line Diff line number Diff line
@@ -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();
@@ -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
@@ -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;
        }
        }


@@ -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) {
@@ -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);
@@ -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());
@@ -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;
                }
                }