Merge IInputMethodManagerInvoker and IInputMethodManagerGlobalInvoker

This CL mechanically merges

  IInputMethodManagerInvoker

into

  IInputMethodManagerGlobalInvoker

without changing any observable semantics.  This allows us to remove

  InputMethodManager#mServiceInvoker

completely.

This refactoring makes it much easier for us to see whether a method
in InputMethodManger is implemented only with static methods or not.

Bug: 234882948
Test: presubmit
Change-Id: I310a33f27b876419b6a3058202dcbd663b541079
This commit is contained in:
Yohei Yukawa
2022-10-26 13:24:01 -07:00
parent f629ddf28b
commit 7cdbbbe90e
3 changed files with 385 additions and 335 deletions

View File

@@ -17,16 +17,32 @@
package android.view.inputmethod;
import android.annotation.AnyThread;
import android.annotation.DurationMillisLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresNoPermission;
import android.annotation.RequiresPermission;
import android.annotation.UserIdInt;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.view.WindowManager;
import android.window.ImeOnBackInvokedDispatcher;
import com.android.internal.inputmethod.DirectBootAwareness;
import com.android.internal.inputmethod.IInputMethodClient;
import com.android.internal.inputmethod.IRemoteAccessibilityInputConnection;
import com.android.internal.inputmethod.IRemoteInputConnection;
import com.android.internal.inputmethod.InputBindResult;
import com.android.internal.inputmethod.SoftInputShowHideReason;
import com.android.internal.inputmethod.StartInputFlags;
import com.android.internal.inputmethod.StartInputReason;
import com.android.internal.view.IInputMethodManager;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
@@ -54,9 +70,12 @@ final class IInputMethodManagerGlobalInvoker {
@AnyThread
@Nullable
private static IInputMethodManager getService() {
static IInputMethodManager getService() {
IInputMethodManager service = sServiceCache;
if (service == null) {
if (InputMethodManager.isInEditModeInternal()) {
return null;
}
service = IInputMethodManager.Stub.asInterface(
ServiceManager.getService(Context.INPUT_METHOD_SERVICE));
if (service == null) {
@@ -175,4 +194,322 @@ final class IInputMethodManagerGlobalInvoker {
handleRemoteExceptionOrRethrow(e, exceptionHandler);
}
}
@AnyThread
static void addClient(@NonNull IInputMethodClient client,
@NonNull IRemoteInputConnection fallbackInputConnection, int untrustedDisplayId) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.addClient(client, fallbackInputConnection, untrustedDisplayId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@NonNull
static List<InputMethodInfo> getInputMethodList(@UserIdInt int userId,
@DirectBootAwareness int directBootAwareness) {
final IInputMethodManager service = getService();
if (service == null) {
return new ArrayList<>();
}
try {
return service.getInputMethodList(userId, directBootAwareness);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@NonNull
static List<InputMethodInfo> getEnabledInputMethodList(@UserIdInt int userId) {
final IInputMethodManager service = getService();
if (service == null) {
return new ArrayList<>();
}
try {
return service.getEnabledInputMethodList(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@NonNull
static List<InputMethodSubtype> getEnabledInputMethodSubtypeList(@Nullable String imiId,
boolean allowsImplicitlyEnabledSubtypes, @UserIdInt int userId) {
final IInputMethodManager service = getService();
if (service == null) {
return new ArrayList<>();
}
try {
return service.getEnabledInputMethodSubtypeList(imiId,
allowsImplicitlyEnabledSubtypes, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@Nullable
static InputMethodSubtype getLastInputMethodSubtype(@UserIdInt int userId) {
final IInputMethodManager service = getService();
if (service == null) {
return null;
}
try {
return service.getLastInputMethodSubtype(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static boolean showSoftInput(@NonNull IInputMethodClient client, @Nullable IBinder windowToken,
int flags, int lastClickToolType, @Nullable ResultReceiver resultReceiver,
@SoftInputShowHideReason int reason) {
final IInputMethodManager service = getService();
if (service == null) {
return false;
}
try {
return service.showSoftInput(
client, windowToken, flags, lastClickToolType, resultReceiver, reason);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static boolean hideSoftInput(@NonNull IInputMethodClient client, @Nullable IBinder windowToken,
int flags, @Nullable ResultReceiver resultReceiver,
@SoftInputShowHideReason int reason) {
final IInputMethodManager service = getService();
if (service == null) {
return false;
}
try {
return service.hideSoftInput(client, windowToken, flags, resultReceiver, reason);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@NonNull
static InputBindResult startInputOrWindowGainedFocus(@StartInputReason int startInputReason,
@NonNull IInputMethodClient client, @Nullable IBinder windowToken,
@StartInputFlags int startInputFlags,
@WindowManager.LayoutParams.SoftInputModeFlags int softInputMode,
@WindowManager.LayoutParams.Flags int windowFlags, @Nullable EditorInfo editorInfo,
@Nullable IRemoteInputConnection remoteInputConnection,
@Nullable IRemoteAccessibilityInputConnection remoteAccessibilityInputConnection,
int unverifiedTargetSdkVersion, @UserIdInt int userId,
@NonNull ImeOnBackInvokedDispatcher imeDispatcher) {
final IInputMethodManager service = getService();
if (service == null) {
return InputBindResult.NULL;
}
try {
return service.startInputOrWindowGainedFocus(startInputReason, client, windowToken,
startInputFlags, softInputMode, windowFlags, editorInfo, remoteInputConnection,
remoteAccessibilityInputConnection, unverifiedTargetSdkVersion, userId,
imeDispatcher);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void showInputMethodPickerFromClient(@NonNull IInputMethodClient client,
int auxiliarySubtypeMode) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.showInputMethodPickerFromClient(client, auxiliarySubtypeMode);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void showInputMethodPickerFromSystem(@NonNull IInputMethodClient client,
int auxiliarySubtypeMode, int displayId) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.showInputMethodPickerFromSystem(client, auxiliarySubtypeMode, displayId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static boolean isInputMethodPickerShownForTest() {
final IInputMethodManager service = getService();
if (service == null) {
return false;
}
try {
return service.isInputMethodPickerShownForTest();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@Nullable
static InputMethodSubtype getCurrentInputMethodSubtype(@UserIdInt int userId) {
final IInputMethodManager service = getService();
if (service == null) {
return null;
}
try {
return service.getCurrentInputMethodSubtype(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void setAdditionalInputMethodSubtypes(@NonNull String imeId,
@NonNull InputMethodSubtype[] subtypes, @UserIdInt int userId) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.setAdditionalInputMethodSubtypes(imeId, subtypes, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void setExplicitlyEnabledInputMethodSubtypes(@NonNull String imeId,
@NonNull int[] subtypeHashCodes, @UserIdInt int userId) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.setExplicitlyEnabledInputMethodSubtypes(imeId, subtypeHashCodes, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static int getInputMethodWindowVisibleHeight(@NonNull IInputMethodClient client) {
final IInputMethodManager service = getService();
if (service == null) {
return 0;
}
try {
return service.getInputMethodWindowVisibleHeight(client);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void reportVirtualDisplayGeometryAsync(@NonNull IInputMethodClient client,
int childDisplayId, @Nullable float[] matrixValues) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.reportVirtualDisplayGeometryAsync(client, childDisplayId, matrixValues);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void reportPerceptibleAsync(@NonNull IBinder windowToken, boolean perceptible) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.reportPerceptibleAsync(windowToken, perceptible);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void removeImeSurfaceFromWindowAsync(@NonNull IBinder windowToken) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.removeImeSurfaceFromWindowAsync(windowToken);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void startStylusHandwriting(@NonNull IInputMethodClient client) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.startStylusHandwriting(client);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static boolean isStylusHandwritingAvailableAsUser(@UserIdInt int userId) {
final IInputMethodManager service = getService();
if (service == null) {
return false;
}
try {
return service.isStylusHandwritingAvailableAsUser(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void addVirtualStylusIdForTestSession(IInputMethodClient client) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.addVirtualStylusIdForTestSession(client);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
static void setStylusWindowIdleTimeoutForTest(
IInputMethodClient client, @DurationMillisLong long timeout) {
final IInputMethodManager service = getService();
if (service == null) {
return;
}
try {
service.setStylusWindowIdleTimeoutForTest(client, timeout);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}

View File

@@ -1,288 +0,0 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.view.inputmethod;
import android.annotation.AnyThread;
import android.annotation.DurationMillisLong;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
import android.window.ImeOnBackInvokedDispatcher;
import com.android.internal.inputmethod.DirectBootAwareness;
import com.android.internal.inputmethod.IInputMethodClient;
import com.android.internal.inputmethod.IRemoteAccessibilityInputConnection;
import com.android.internal.inputmethod.IRemoteInputConnection;
import com.android.internal.inputmethod.InputBindResult;
import com.android.internal.inputmethod.SoftInputShowHideReason;
import com.android.internal.inputmethod.StartInputFlags;
import com.android.internal.inputmethod.StartInputReason;
import com.android.internal.view.IInputMethodManager;
import java.util.List;
/**
* A wrapper class to invoke IPCs defined in {@link IInputMethodManager}.
*/
final class IInputMethodManagerInvoker {
@NonNull
private final IInputMethodManager mTarget;
private IInputMethodManagerInvoker(@NonNull IInputMethodManager target) {
mTarget = target;
}
@AnyThread
@NonNull
static IInputMethodManagerInvoker create(@NonNull IInputMethodManager imm) {
return new IInputMethodManagerInvoker(imm);
}
@AnyThread
void addClient(@NonNull IInputMethodClient client,
@NonNull IRemoteInputConnection fallbackInputConnection, int untrustedDisplayId) {
try {
mTarget.addClient(client, fallbackInputConnection, untrustedDisplayId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@NonNull
List<InputMethodInfo> getInputMethodList(@UserIdInt int userId,
@DirectBootAwareness int directBootAwareness) {
try {
return mTarget.getInputMethodList(userId, directBootAwareness);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@NonNull
List<InputMethodInfo> getEnabledInputMethodList(@UserIdInt int userId) {
try {
return mTarget.getEnabledInputMethodList(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@NonNull
List<InputMethodSubtype> getEnabledInputMethodSubtypeList(@Nullable String imiId,
boolean allowsImplicitlyEnabledSubtypes, @UserIdInt int userId) {
try {
return mTarget.getEnabledInputMethodSubtypeList(imiId,
allowsImplicitlyEnabledSubtypes, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@Nullable
InputMethodSubtype getLastInputMethodSubtype(@UserIdInt int userId) {
try {
return mTarget.getLastInputMethodSubtype(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
boolean showSoftInput(@NonNull IInputMethodClient client, @Nullable IBinder windowToken,
int flags, int lastClickToolType, @Nullable ResultReceiver resultReceiver,
@SoftInputShowHideReason int reason) {
try {
return mTarget.showSoftInput(
client, windowToken, flags, lastClickToolType, resultReceiver, reason);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
boolean hideSoftInput(@NonNull IInputMethodClient client, @Nullable IBinder windowToken,
int flags, @Nullable ResultReceiver resultReceiver,
@SoftInputShowHideReason int reason) {
try {
return mTarget.hideSoftInput(client, windowToken, flags, resultReceiver, reason);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@NonNull
InputBindResult startInputOrWindowGainedFocus(@StartInputReason int startInputReason,
@NonNull IInputMethodClient client, @Nullable IBinder windowToken,
@StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode,
@WindowManager.LayoutParams.Flags int windowFlags, @Nullable EditorInfo editorInfo,
@Nullable IRemoteInputConnection remoteInputConnection,
@Nullable IRemoteAccessibilityInputConnection remoteAccessibilityInputConnection,
int unverifiedTargetSdkVersion, @UserIdInt int userId,
@NonNull ImeOnBackInvokedDispatcher imeDispatcher) {
try {
return mTarget.startInputOrWindowGainedFocus(startInputReason, client, windowToken,
startInputFlags, softInputMode, windowFlags, editorInfo, remoteInputConnection,
remoteAccessibilityInputConnection, unverifiedTargetSdkVersion, userId,
imeDispatcher);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void showInputMethodPickerFromClient(@NonNull IInputMethodClient client,
int auxiliarySubtypeMode) {
try {
mTarget.showInputMethodPickerFromClient(client, auxiliarySubtypeMode);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void showInputMethodPickerFromSystem(@NonNull IInputMethodClient client,
int auxiliarySubtypeMode, int displayId) {
try {
mTarget.showInputMethodPickerFromSystem(client, auxiliarySubtypeMode, displayId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
boolean isInputMethodPickerShownForTest() {
try {
return mTarget.isInputMethodPickerShownForTest();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
@Nullable
InputMethodSubtype getCurrentInputMethodSubtype(@UserIdInt int userId) {
try {
return mTarget.getCurrentInputMethodSubtype(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void setAdditionalInputMethodSubtypes(@NonNull String imeId,
@NonNull InputMethodSubtype[] subtypes, @UserIdInt int userId) {
try {
mTarget.setAdditionalInputMethodSubtypes(imeId, subtypes, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void setExplicitlyEnabledInputMethodSubtypes(@NonNull String imeId,
@NonNull int[] subtypeHashCodes, @UserIdInt int userId) {
try {
mTarget.setExplicitlyEnabledInputMethodSubtypes(imeId, subtypeHashCodes, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
int getInputMethodWindowVisibleHeight(@NonNull IInputMethodClient client) {
try {
return mTarget.getInputMethodWindowVisibleHeight(client);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void reportVirtualDisplayGeometryAsync(@NonNull IInputMethodClient client, int childDisplayId,
@Nullable float[] matrixValues) {
try {
mTarget.reportVirtualDisplayGeometryAsync(client, childDisplayId, matrixValues);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void reportPerceptibleAsync(@NonNull IBinder windowToken, boolean perceptible) {
try {
mTarget.reportPerceptibleAsync(windowToken, perceptible);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void removeImeSurfaceFromWindowAsync(@NonNull IBinder windowToken) {
try {
mTarget.removeImeSurfaceFromWindowAsync(windowToken);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void startStylusHandwriting(@NonNull IInputMethodClient client) {
try {
mTarget.startStylusHandwriting(client);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
boolean isStylusHandwritingAvailableAsUser(@UserIdInt int userId) {
try {
return mTarget.isStylusHandwritingAvailableAsUser(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void addVirtualStylusIdForTestSession(IInputMethodClient client) {
try {
mTarget.addVirtualStylusIdForTestSession(client);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@AnyThread
void setStylusWindowIdleTimeoutForTest(
IInputMethodClient client, @DurationMillisLong long timeout) {
try {
mTarget.setStylusWindowIdleTimeoutForTest(client, timeout);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}

View File

@@ -70,8 +70,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
@@ -295,7 +293,7 @@ public final class InputMethodManager {
private static final String SUBTYPE_MODE_VOICE = "voice";
/**
* Provide this to {@link IInputMethodManagerInvoker#startInputOrWindowGainedFocus(int,
* Provide this to {@link IInputMethodManagerGlobalInvoker#startInputOrWindowGainedFocus(int,
* IInputMethodClient, IBinder, int, int, int, EditorInfo,
* com.android.internal.inputmethod.IRemoteInputConnection, IRemoteAccessibilityInputConnection,
* int, int, ImeOnBackInvokedDispatcher)} to receive
@@ -422,16 +420,13 @@ public final class InputMethodManager {
SystemProperties.getBoolean("debug.imm.optimize_noneditable_views", true);
/**
* @deprecated Use {@link #mServiceInvoker} instead.
* @deprecated Use {@link IInputMethodManagerGlobalInvoker} instead.
*/
@Deprecated
@UnsupportedAppUsage
final IInputMethodManager mService;
private final Looper mMainLooper;
@NonNull
private final IInputMethodManagerInvoker mServiceInvoker;
// For scheduling work on the main thread. This also serves as our
// global lock.
// Remark on @UnsupportedAppUsage: there were context leaks on old versions
@@ -735,7 +730,7 @@ public final class InputMethodManager {
* @hide
*/
public void reportPerceptible(@NonNull IBinder windowToken, boolean perceptible) {
mServiceInvoker.reportPerceptibleAsync(windowToken, perceptible);
IInputMethodManagerGlobalInvoker.reportPerceptibleAsync(windowToken, perceptible);
}
private final class DelegateImpl implements
@@ -808,7 +803,7 @@ public final class InputMethodManager {
}
// ignore the result
mServiceInvoker.startInputOrWindowGainedFocus(
IInputMethodManagerGlobalInvoker.startInputOrWindowGainedFocus(
StartInputReason.WINDOW_FOCUS_GAIN_REPORT_ONLY, mClient,
viewForWindowFocus.getWindowToken(), startInputFlags, softInputMode,
windowFlags,
@@ -1353,6 +1348,10 @@ public final class InputMethodManager {
return false;
}
static boolean isInEditModeInternal() {
return isInEditMode();
}
@NonNull
private static InputMethodManager createInstance(int displayId, Looper looper) {
return isInEditMode() ? createStubInstance(displayId, looper)
@@ -1361,12 +1360,9 @@ public final class InputMethodManager {
@NonNull
private static InputMethodManager createRealInstance(int displayId, Looper looper) {
final IInputMethodManager service;
try {
service = IInputMethodManager.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.INPUT_METHOD_SERVICE));
} catch (ServiceNotFoundException e) {
throw new IllegalStateException(e);
final IInputMethodManager service = IInputMethodManagerGlobalInvoker.getService();
if (service == null) {
throw new IllegalStateException("IInputMethodManager is not available");
}
final InputMethodManager imm = new InputMethodManager(service, displayId, looper);
// InputMethodManagerService#addClient() relies on Binder.getCalling{Pid, Uid}() to
@@ -1378,7 +1374,8 @@ public final class InputMethodManager {
// 1) doing so has no effect for A and 2) doing so is sufficient for B.
final long identity = Binder.clearCallingIdentity();
try {
imm.mServiceInvoker.addClient(imm.mClient, imm.mFallbackInputConnection, displayId);
IInputMethodManagerGlobalInvoker.addClient(imm.mClient, imm.mFallbackInputConnection,
displayId);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -1418,7 +1415,6 @@ public final class InputMethodManager {
private InputMethodManager(@NonNull IInputMethodManager service, int displayId, Looper looper) {
mService = service; // For @UnsupportedAppUsage
mServiceInvoker = IInputMethodManagerInvoker.create(service);
mMainLooper = looper;
mH = new H(looper);
mDisplayId = displayId;
@@ -1512,7 +1508,8 @@ public final class InputMethodManager {
// We intentionally do not use UserHandle.getCallingUserId() here because for system
// services InputMethodManagerInternal.getInputMethodListAsUser() should be used
// instead.
return mServiceInvoker.getInputMethodList(UserHandle.myUserId(), DirectBootAwareness.AUTO);
return IInputMethodManagerGlobalInvoker.getInputMethodList(UserHandle.myUserId(),
DirectBootAwareness.AUTO);
}
/**
@@ -1546,7 +1543,7 @@ public final class InputMethodManager {
}
return false;
}
return mServiceInvoker.isStylusHandwritingAvailableAsUser(userId);
return IInputMethodManagerGlobalInvoker.isStylusHandwritingAvailableAsUser(userId);
}
/**
@@ -1560,7 +1557,8 @@ public final class InputMethodManager {
@RequiresPermission(INTERACT_ACROSS_USERS_FULL)
@NonNull
public List<InputMethodInfo> getInputMethodListAsUser(@UserIdInt int userId) {
return mServiceInvoker.getInputMethodList(userId, DirectBootAwareness.AUTO);
return IInputMethodManagerGlobalInvoker.getInputMethodList(userId,
DirectBootAwareness.AUTO);
}
/**
@@ -1576,7 +1574,7 @@ public final class InputMethodManager {
@NonNull
public List<InputMethodInfo> getInputMethodListAsUser(@UserIdInt int userId,
@DirectBootAwareness int directBootAwareness) {
return mServiceInvoker.getInputMethodList(userId, directBootAwareness);
return IInputMethodManagerGlobalInvoker.getInputMethodList(userId, directBootAwareness);
}
/**
@@ -1591,7 +1589,7 @@ public final class InputMethodManager {
// We intentionally do not use UserHandle.getCallingUserId() here because for system
// services InputMethodManagerInternal.getEnabledInputMethodListAsUser() should be used
// instead.
return mServiceInvoker.getEnabledInputMethodList(UserHandle.myUserId());
return IInputMethodManagerGlobalInvoker.getEnabledInputMethodList(UserHandle.myUserId());
}
/**
@@ -1603,7 +1601,7 @@ public final class InputMethodManager {
*/
@RequiresPermission(INTERACT_ACROSS_USERS_FULL)
public List<InputMethodInfo> getEnabledInputMethodListAsUser(@UserIdInt int userId) {
return mServiceInvoker.getEnabledInputMethodList(userId);
return IInputMethodManagerGlobalInvoker.getEnabledInputMethodList(userId);
}
/**
@@ -1620,7 +1618,7 @@ public final class InputMethodManager {
@NonNull
public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(@Nullable InputMethodInfo imi,
boolean allowsImplicitlyEnabledSubtypes) {
return mServiceInvoker.getEnabledInputMethodSubtypeList(
return IInputMethodManagerGlobalInvoker.getEnabledInputMethodSubtypeList(
imi == null ? null : imi.getId(),
allowsImplicitlyEnabledSubtypes,
UserHandle.myUserId());
@@ -2003,7 +2001,7 @@ public final class InputMethodManager {
mH.executeOrSendMessage(Message.obtain(mH, MSG_ON_SHOW_REQUESTED));
Log.d(TAG, "showSoftInput() view=" + view + " flags=" + flags + " reason="
+ InputMethodDebug.softInputDisplayReasonToString(reason));
return mServiceInvoker.showSoftInput(
return IInputMethodManagerGlobalInvoker.showSoftInput(
mClient,
view.getWindowToken(),
flags,
@@ -2035,7 +2033,7 @@ public final class InputMethodManager {
// Makes sure to call ImeInsetsSourceConsumer#onShowRequested on the UI thread.
// TODO(b/229426865): call WindowInsetsController#show instead.
mH.executeOrSendMessage(Message.obtain(mH, MSG_ON_SHOW_REQUESTED));
mServiceInvoker.showSoftInput(
IInputMethodManagerGlobalInvoker.showSoftInput(
mClient,
mCurRootView.getView().getWindowToken(),
flags,
@@ -2116,8 +2114,8 @@ public final class InputMethodManager {
return false;
}
return mServiceInvoker.hideSoftInput(mClient, windowToken, flags, resultReceiver,
reason);
return IInputMethodManagerGlobalInvoker.hideSoftInput(mClient, windowToken, flags,
resultReceiver, reason);
}
}
@@ -2165,7 +2163,7 @@ public final class InputMethodManager {
return;
}
mServiceInvoker.startStylusHandwriting(mClient);
IInputMethodManagerGlobalInvoker.startStylusHandwriting(mClient);
// TODO(b/210039666): do we need any extra work for supporting non-native
// UI toolkits?
}
@@ -2498,7 +2496,7 @@ public final class InputMethodManager {
}
final int targetUserId = editorInfo.targetInputMethodUser != null
? editorInfo.targetInputMethodUser.getIdentifier() : UserHandle.myUserId();
res = mServiceInvoker.startInputOrWindowGainedFocus(
res = IInputMethodManagerGlobalInvoker.startInputOrWindowGainedFocus(
startInputReason, mClient, windowGainingFocus, startInputFlags,
softInputMode, windowFlags, editorInfo, servedInputConnection,
servedInputConnection == null ? null
@@ -2594,7 +2592,7 @@ public final class InputMethodManager {
@TestApi
public void addVirtualStylusIdForTestSession() {
synchronized (mH) {
mServiceInvoker.addVirtualStylusIdForTestSession(mClient);
IInputMethodManagerGlobalInvoker.addVirtualStylusIdForTestSession(mClient);
}
}
@@ -2608,7 +2606,7 @@ public final class InputMethodManager {
@TestApi
public void setStylusWindowIdleTimeoutForTest(@DurationMillisLong long timeout) {
synchronized (mH) {
mServiceInvoker.setStylusWindowIdleTimeoutForTest(mClient, timeout);
IInputMethodManagerGlobalInvoker.setStylusWindowIdleTimeoutForTest(mClient, timeout);
}
}
@@ -2745,7 +2743,7 @@ public final class InputMethodManager {
Log.w(TAG, "No current root view, ignoring closeCurrentInput()");
return;
}
mServiceInvoker.hideSoftInput(
IInputMethodManagerGlobalInvoker.hideSoftInput(
mClient,
mCurRootView.getView().getWindowToken(),
HIDE_NOT_ALWAYS,
@@ -2821,7 +2819,7 @@ public final class InputMethodManager {
synchronized (mH) {
if (isImeSessionAvailableLocked() && mCurRootView != null
&& mCurRootView.getWindowToken() == windowToken) {
mServiceInvoker.hideSoftInput(mClient, windowToken, 0 /* flags */,
IInputMethodManagerGlobalInvoker.hideSoftInput(mClient, windowToken, 0 /* flags */,
null /* resultReceiver */,
SoftInputShowHideReason.HIDE_SOFT_INPUT_BY_INSETS_API);
}
@@ -2835,7 +2833,7 @@ public final class InputMethodManager {
*/
public void removeImeSurface(@NonNull IBinder windowToken) {
synchronized (mH) {
mServiceInvoker.removeImeSurfaceFromWindowAsync(windowToken);
IInputMethodManagerGlobalInvoker.removeImeSurfaceFromWindowAsync(windowToken);
}
}
@@ -3440,12 +3438,13 @@ public final class InputMethodManager {
final int mode = showAuxiliarySubtypes
? SHOW_IM_PICKER_MODE_INCLUDE_AUXILIARY_SUBTYPES
: SHOW_IM_PICKER_MODE_EXCLUDE_AUXILIARY_SUBTYPES;
mServiceInvoker.showInputMethodPickerFromSystem(mClient, mode, displayId);
IInputMethodManagerGlobalInvoker.showInputMethodPickerFromSystem(mClient, mode, displayId);
}
@GuardedBy("mH")
private void showInputMethodPickerLocked() {
mServiceInvoker.showInputMethodPickerFromClient(mClient, SHOW_IM_PICKER_MODE_AUTO);
IInputMethodManagerGlobalInvoker.showInputMethodPickerFromClient(mClient,
SHOW_IM_PICKER_MODE_AUTO);
}
/**
@@ -3461,7 +3460,7 @@ public final class InputMethodManager {
*/
@TestApi
public boolean isInputMethodPickerShown() {
return mServiceInvoker.isInputMethodPickerShownForTest();
return IInputMethodManagerGlobalInvoker.isInputMethodPickerShownForTest();
}
/**
@@ -3500,7 +3499,7 @@ public final class InputMethodManager {
*/
@Nullable
public InputMethodSubtype getCurrentInputMethodSubtype() {
return mServiceInvoker.getCurrentInputMethodSubtype(UserHandle.myUserId());
return IInputMethodManagerGlobalInvoker.getCurrentInputMethodSubtype(UserHandle.myUserId());
}
/**
@@ -3545,7 +3544,7 @@ public final class InputMethodManager {
return false;
}
final List<InputMethodSubtype> enabledSubtypes =
mServiceInvoker.getEnabledInputMethodSubtypeList(imeId, true,
IInputMethodManagerGlobalInvoker.getEnabledInputMethodSubtypeList(imeId, true,
UserHandle.myUserId());
final int numSubtypes = enabledSubtypes.size();
for (int i = 0; i < numSubtypes; ++i) {
@@ -3611,7 +3610,7 @@ public final class InputMethodManager {
@UnsupportedAppUsage(trackingBug = 204906124, maxTargetSdk = Build.VERSION_CODES.TIRAMISU,
publicAlternatives = "Use {@link android.view.WindowInsets} instead")
public int getInputMethodWindowVisibleHeight() {
return mServiceInvoker.getInputMethodWindowVisibleHeight(mClient);
return IInputMethodManagerGlobalInvoker.getInputMethodWindowVisibleHeight(mClient);
}
/**
@@ -3631,7 +3630,8 @@ public final class InputMethodManager {
matrixValues = new float[9];
matrix.getValues(matrixValues);
}
mServiceInvoker.reportVirtualDisplayGeometryAsync(mClient, childDisplayId, matrixValues);
IInputMethodManagerGlobalInvoker.reportVirtualDisplayGeometryAsync(mClient, childDisplayId,
matrixValues);
}
/**
@@ -3738,7 +3738,8 @@ public final class InputMethodManager {
@Deprecated
public void setAdditionalInputMethodSubtypes(@NonNull String imiId,
@NonNull InputMethodSubtype[] subtypes) {
mServiceInvoker.setAdditionalInputMethodSubtypes(imiId, subtypes, UserHandle.myUserId());
IInputMethodManagerGlobalInvoker.setAdditionalInputMethodSubtypes(imiId, subtypes,
UserHandle.myUserId());
}
/**
@@ -3787,8 +3788,8 @@ public final class InputMethodManager {
*/
public void setExplicitlyEnabledInputMethodSubtypes(@NonNull String imiId,
@NonNull int[] subtypeHashCodes) {
mServiceInvoker.setExplicitlyEnabledInputMethodSubtypes(imiId, subtypeHashCodes,
UserHandle.myUserId());
IInputMethodManagerGlobalInvoker.setExplicitlyEnabledInputMethodSubtypes(imiId,
subtypeHashCodes, UserHandle.myUserId());
}
/**
@@ -3798,7 +3799,7 @@ public final class InputMethodManager {
*/
@Nullable
public InputMethodSubtype getLastInputMethodSubtype() {
return mServiceInvoker.getLastInputMethodSubtype(UserHandle.myUserId());
return IInputMethodManagerGlobalInvoker.getLastInputMethodSubtype(UserHandle.myUserId());
}
/**