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

Commit d1a6be1b authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Fix VDM IME handling:

1. Whenever the selected input method changes, also update the default
   device input method in settings, if the current device is the
   default one.

2. Whenever new settings instance is created, always pass the current
   device id, so the settings constructor knows whether to restore the
   stored default device id or not.

Test: atest VirtualDeviceImeTest --iterations=50
Bug: 287269288

Change-Id: Ic8646fef8a18f03cdd387dc672bea991338c6793
parent 4e07be21
Loading
Loading
Loading
Loading
+29 −1
Original line number Diff line number Diff line
@@ -3184,6 +3184,24 @@ 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());
            }
        }

        // 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
@@ -5363,7 +5381,11 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub

        if (!setSubtypeOnly) {
            // Set InputMethod here
            mSettings.putSelectedInputMethod(imi != null ? imi.getId() : "");
            final String imeId = imi != null ? imi.getId() : "";
            mSettings.putSelectedInputMethod(imeId);
            if (mDeviceIdToShowIme == DEVICE_ID_DEFAULT) {
                mSettings.putSelectedDefaultDeviceInputMethod(imeId);
            }
        }
    }

@@ -5506,6 +5528,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub
            return false; // IME is not found or not enabled.
        }
        settings.putSelectedInputMethod(imeId);
        if (mDeviceIdToShowIme == DEVICE_ID_DEFAULT) {
            settings.putSelectedDefaultDeviceInputMethod(imeId);
        }
        settings.putSelectedSubtype(NOT_A_SUBTYPE_ID);
        return true;
    }
@@ -6541,6 +6566,9 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub

                        // Reset selected IME.
                        settings.putSelectedInputMethod(nextIme);
                        if (mDeviceIdToShowIme == DEVICE_ID_DEFAULT) {
                            settings.putSelectedDefaultDeviceInputMethod(nextIme);
                        }
                        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