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

Commit 8292157f authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Revert^2 "Fix VDM IME handling:"

Differences from the original CL that broke ImeSmokeTest because
externally writing to secure settings to change the default IME
was broken: it reverted the setting stored for default device IME.

 - Instead of trying to keep the two settings entries in sync, simply
   reset the default device IME to null when current device BECOMES
   the default one. This way the default device IME setting should
   only be set while a virtual device IME is active. When an
   inconsistency is detected (e.g. system crash while on virtual
   device), then the setting is restored.

 - In resetSelectedInputMethodAndSubtypeLocked, reset the current
   device and display id. They'll be computed when the IME is about
   to show.

This reverts commit 455c2204.

Reason for revert: Issues fixed

Test: atest VirtualDeviceImeTest
Test: atest ImeSmokeTest with auto lunch target

Change-Id: I4f446f657197d0ad7d5cd32d9041a59fccc1453e
parent 4e07be21
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -2525,6 +2525,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
            if (DEBUG) {
                Slog.v(TAG, "Restoring default device input method: " + defaultDeviceMethodId);
            }
            mSettings.putSelectedDefaultDeviceInputMethod(null);
            return defaultDeviceMethodId;
        }

@@ -3184,6 +3185,26 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
                }
            }
        }

        if (mDeviceIdToShowIme == DEVICE_ID_DEFAULT) {
            String ime = SecureSettingsWrapper.getString(
                    Settings.Secure.DEFAULT_INPUT_METHOD, null, mSettings.getUserId());
            String defaultDeviceIme = SecureSettingsWrapper.getString(
                    Settings.Secure.DEFAULT_DEVICE_INPUT_METHOD, null, mSettings.getUserId());
            if (defaultDeviceIme != null && !Objects.equals(ime, defaultDeviceIme)) {
                if (DEBUG) {
                    Slog.v(TAG, "Current input method " + ime + " differs from the stored default"
                            + " device input method for user " + mSettings.getUserId()
                            + " - restoring " + defaultDeviceIme);
                }
                SecureSettingsWrapper.putString(
                        Settings.Secure.DEFAULT_INPUT_METHOD, defaultDeviceIme,
                        mSettings.getUserId());
                SecureSettingsWrapper.putString(
                        Settings.Secure.DEFAULT_DEVICE_INPUT_METHOD, null, mSettings.getUserId());
            }
        }

        // We are assuming that whoever is changing DEFAULT_INPUT_METHOD and
        // ENABLED_INPUT_METHODS is taking care of keeping them correctly in
        // sync, so we will never have a DEFAULT_INPUT_METHOD that is not
@@ -5326,7 +5347,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
                            InputMethodInfoUtils.getMostApplicableDefaultIME(
                                        mSettings.getEnabledInputMethodList());
                    mSettings.putSelectedDefaultDeviceInputMethod(
                            newDefaultIme == null ? "" : newDefaultIme.getId());
                            newDefaultIme == null ? null : newDefaultIme.getId());
                }
                // Previous state was enabled.
                return true;
@@ -5369,6 +5390,10 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub

    @GuardedBy("ImfLock.class")
    private void resetSelectedInputMethodAndSubtypeLocked(String newDefaultIme) {
        mDeviceIdToShowIme = DEVICE_ID_DEFAULT;
        mDisplayIdToShowIme = INVALID_DISPLAY;
        mSettings.putSelectedDefaultDeviceInputMethod(null);

        InputMethodInfo imi = mSettings.getMethodMap().get(newDefaultIme);
        int lastSubtypeId = NOT_A_SUBTYPE_ID;
        // newDefaultIme is empty when there is no candidate for the selected IME.
@@ -6541,6 +6566,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub

                        // Reset selected IME.
                        settings.putSelectedInputMethod(nextIme);
                        settings.putSelectedDefaultDeviceInputMethod(null);
                        settings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
                    }
                    out.println("Reset current and enabled IMEs for user #" + userId);
+0 −7
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import com.android.internal.annotations.VisibleForTesting;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;

/**
@@ -88,12 +87,6 @@ final class InputMethodSettings {
        mMethodMap = methodMap;
        mMethodList = methodMap.values();
        mUserId = userId;
        String ime = getSelectedInputMethod();
        String defaultDeviceIme = getSelectedDefaultDeviceInputMethod();
        if (defaultDeviceIme != null && !Objects.equals(ime, defaultDeviceIme)) {
            putSelectedInputMethod(defaultDeviceIme);
            putSelectedDefaultDeviceInputMethod(null);
        }
    }

    @AnyThread