summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java22
-rw-r--r--services/core/java/com/android/server/inputmethod/UserData.java13
2 files changed, 35 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index ea3d7d10f3f8..0ecf5a0dab92 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -1355,6 +1355,17 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
}
updateFromSettingsLocked(true, newUserId);
+ // Special workaround for b/356879517.
+ // KeyboardLayoutManager still expects onInputMethodSubtypeChangedForKeyboardLayoutMapping
+ // to be called back upon IME user switching, while we are actively deprecating the concept
+ // of "current IME user" at b/350386877.
+ // TODO(b/356879517): Come up with a way to avoid this special handling.
+ if (newUserData.mSubtypeForKeyboardLayoutMapping != null) {
+ final var subtypeHandleAndSubtype = newUserData.mSubtypeForKeyboardLayoutMapping;
+ mInputManagerInternal.onInputMethodSubtypeChangedForKeyboardLayoutMapping(
+ newUserId, subtypeHandleAndSubtype.first, subtypeHandleAndSubtype.second);
+ }
+
if (initialUserSwitch) {
InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(
getPackageManagerForUser(mContext, newUserId),
@@ -2938,6 +2949,17 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
? subtype : null;
final InputMethodSubtypeHandle newSubtypeHandle = normalizedSubtype != null
? InputMethodSubtypeHandle.of(imi, normalizedSubtype) : null;
+
+ final var userData = getUserData(userId);
+
+ // A workaround for b/356879517. KeyboardLayoutManager has relied on an implementation
+ // detail that IMMS triggers this callback only for the current IME user.
+ // TODO(b/357663774): Figure out how to better handle this scenario.
+ userData.mSubtypeForKeyboardLayoutMapping =
+ Pair.create(newSubtypeHandle, normalizedSubtype);
+ if (userId != mCurrentUserId) {
+ return;
+ }
mInputManagerInternal.onInputMethodSubtypeChangedForKeyboardLayoutMapping(
userId, newSubtypeHandle, normalizedSubtype);
}
diff --git a/services/core/java/com/android/server/inputmethod/UserData.java b/services/core/java/com/android/server/inputmethod/UserData.java
index 28394c6a6272..c0d3428b50c3 100644
--- a/services/core/java/com/android/server/inputmethod/UserData.java
+++ b/services/core/java/com/android/server/inputmethod/UserData.java
@@ -19,14 +19,17 @@ package com.android.server.inputmethod;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.util.Pair;
import android.util.SparseArray;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.ImeTracker;
+import android.view.inputmethod.InputMethodSubtype;
import android.window.ImeOnBackInvokedDispatcher;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.inputmethod.IRemoteAccessibilityInputConnection;
import com.android.internal.inputmethod.IRemoteInputConnection;
+import com.android.internal.inputmethod.InputMethodSubtypeHandle;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -149,6 +152,16 @@ final class UserData {
String mLastEnabledInputMethodsStr = "";
/**
+ * A temporary solution to Bug 356879517, where we need to emulate the previous single-user mode
+ * behavior for KeyboardLayoutManager.
+ *
+ * <p>TODO(b/357663774): Remove this workaround</p>
+ */
+ @GuardedBy("ImfLock.class")
+ @Nullable
+ Pair<InputMethodSubtypeHandle, InputMethodSubtype> mSubtypeForKeyboardLayoutMapping;
+
+ /**
* {@code true} when the IME is responsible for drawing the navigation bar and its buttons.
*/
@NonNull