diff options
4 files changed, 44 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 2d0af98c29f6..6241ebbc60cc 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -116,6 +116,7 @@ import com.android.server.DisplayThread; import com.android.server.LocalServices; import com.android.server.Watchdog; import com.android.server.input.InputManagerInternal.LidSwitchCallback; +import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.policy.WindowManagerPolicy; import libcore.io.IoUtils; @@ -165,6 +166,8 @@ public class InputManagerService extends IInputManager.Stub private final InputManagerHandler mHandler; private DisplayManagerInternal mDisplayManagerInternal; + private InputMethodManagerInternal mInputMethodManagerInternal; + // Context cache used for loading pointer resources. private Context mPointerIconDisplayContext; @@ -510,6 +513,8 @@ public class InputManagerService extends IInputManager.Stub } mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); + mInputMethodManagerInternal = + LocalServices.getService(InputMethodManagerInternal.class); mSettingsObserver.registerAndUpdate(); @@ -2784,6 +2789,13 @@ public class InputManagerService extends IInputManager.Stub yPosition)).sendToTarget(); } + // Native callback. + @SuppressWarnings("unused") + boolean isInputMethodConnectionActive() { + return mInputMethodManagerInternal != null + && mInputMethodManagerInternal.isAnyInputConnectionActive(); + } + /** * Callback interface implemented by the Window Manager. */ diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java index 8c7658e53dcd..08503cb2e9f8 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java @@ -186,6 +186,12 @@ public abstract class InputMethodManagerInternal { public abstract void switchKeyboardLayout(int direction); /** + * Returns true if any InputConnection is currently active. + * {@hide} + */ + public abstract boolean isAnyInputConnectionActive(); + + /** * Fake implementation of {@link InputMethodManagerInternal}. All the methods do nothing. */ private static final InputMethodManagerInternal NOP = @@ -268,6 +274,11 @@ public abstract class InputMethodManagerInternal { @Override public void switchKeyboardLayout(int direction) { } + + @Override + public boolean isAnyInputConnectionActive() { + return false; + } }; /** diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index c5fbcb968ab6..cfcb4620bf25 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -5937,6 +5937,14 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub } } } + + /** + * Returns true if any InputConnection is currently active. + */ + @Override + public boolean isAnyInputConnectionActive() { + return mCurInputConnection != null; + } } @BinderThread diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index ec6c75bb1991..7c8c558474bb 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -108,6 +108,7 @@ static struct { jmethodID notifySensorEvent; jmethodID notifySensorAccuracy; jmethodID notifyStylusGestureStarted; + jmethodID isInputMethodConnectionActive; jmethodID notifyVibratorState; jmethodID filterInputEvent; jmethodID interceptKeyBeforeQueueing; @@ -321,6 +322,7 @@ public: TouchAffineTransformation getTouchAffineTransformation(JNIEnv* env, jfloatArray matrixArr); void notifyStylusGestureStarted(int32_t deviceId, nsecs_t eventTime) override; + bool isInputMethodConnectionActive() override; /* --- InputDispatcherPolicyInterface implementation --- */ @@ -1307,6 +1309,14 @@ void NativeInputManager::notifyStylusGestureStarted(int32_t deviceId, nsecs_t ev checkAndClearExceptionFromCallback(env, "notifyStylusGestureStarted"); } +bool NativeInputManager::isInputMethodConnectionActive() { + JNIEnv* env = jniEnv(); + const jboolean result = + env->CallBooleanMethod(mServiceObj, gServiceClassInfo.isInputMethodConnectionActive); + checkAndClearExceptionFromCallback(env, "isInputMethodConnectionActive"); + return result; +} + bool NativeInputManager::filterInputEvent(const InputEvent& inputEvent, uint32_t policyFlags) { ATRACE_CALL(); JNIEnv* env = jniEnv(); @@ -2749,6 +2759,9 @@ int register_android_server_InputManager(JNIEnv* env) { GET_METHOD_ID(gServiceClassInfo.notifyStylusGestureStarted, clazz, "notifyStylusGestureStarted", "(IJ)V"); + GET_METHOD_ID(gServiceClassInfo.isInputMethodConnectionActive, clazz, + "isInputMethodConnectionActive", "()Z"); + GET_METHOD_ID(gServiceClassInfo.notifyVibratorState, clazz, "notifyVibratorState", "(IZ)V"); GET_METHOD_ID(gServiceClassInfo.notifyNoFocusedWindowAnr, clazz, "notifyNoFocusedWindowAnr", |