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

Commit 87218eb2 authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Make MyPackageMonitor#onPackageDataCleared multi-user aware

This is a follow up CL to our previous CL [1], which aimed to fix Bug
267124364 but forgot to take care of multi-user scenarios (Bug 328098968).

With this commit

  InputMethodManagerService.MyPackageMonitor#onPackageDataCleared

becomes fully multi-user aware.

The corresponding CTS change [2] ensures that this scenario remains
fixed.

 [1]: I159d9b7a2d1dcc8df478bb45d0be706d615724a2
 [2]: Ie54f3674ca0a48cef090e528da9a414935cf74e6

Bug: 267124364
Fix: 328098968
Test: atest CtsInputMethodInstallTestCases:AdditionalSubtypeLifecycleTest
Change-Id: If42c518765171ff8cb51af000542671676cd3801
parent 3a9e332a
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -1341,20 +1341,35 @@ 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;
                final InputMethodSettings settings;
                if (isCurrentUser) {
                    additionalSubtypeMap = mAdditionalSubtypeMap;
                    settings = mSettings;
                } else {
                    additionalSubtypeMap = AdditionalSubtypeUtils.load(userId);
                    settings = queryInputMethodServicesInternal(mContext, userId,
                            additionalSubtypeMap, DirectBootAwareness.AUTO);
                }

                // Note that one package may implement multiple IMEs.
                final ArrayList<String> changedImes = new ArrayList<>();
                for (InputMethodInfo imi : mSettings.getMethodList()) {
                for (InputMethodInfo imi : settings.getMethodList()) {
                    if (imi.getPackageName().equals(packageName)) {
                        changedImes.add(imi.getId());
                    }
                }
                final AdditionalSubtypeMap newMap =
                        mAdditionalSubtypeMap.cloneWithRemoveOrSelf(changedImes);
                if (newMap != mAdditionalSubtypeMap) {
                        additionalSubtypeMap.cloneWithRemoveOrSelf(changedImes);
                if (newMap != additionalSubtypeMap) {
                    if (isCurrentUser) {
                        mAdditionalSubtypeMap = newMap;
                    }
                    AdditionalSubtypeUtils.save(
                            mAdditionalSubtypeMap, mSettings.getMethodMap(), mSettings.getUserId());
                            newMap, settings.getMethodMap(), settings.getUserId());
                }
                if (!changedImes.isEmpty()) {
                    mChangedPackages.add(packageName);