diff options
3 files changed, 38 insertions, 33 deletions
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index 4f46160a71e1..3489cfd8f6a7 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -35,6 +35,7 @@ import android.os.BlockUntrustedTouchesMode; import android.os.Build; import android.os.Handler; import android.os.IBinder; +import android.os.InputEventInjectionSync; import android.os.Looper; import android.os.Message; import android.os.RemoteException; @@ -212,7 +213,7 @@ public final class InputManager { * Never blocks. Injection is asynchronous and is assumed always to be successful. * @hide */ - public static final int INJECT_INPUT_EVENT_MODE_ASYNC = 0; // see InputDispatcher.h + public static final int INJECT_INPUT_EVENT_MODE_ASYNC = InputEventInjectionSync.NONE; /** * Input Event Injection Synchronization Mode: Wait for result. @@ -222,7 +223,8 @@ public final class InputManager { * by the application. * @hide */ - public static final int INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT = 1; // see InputDispatcher.h + public static final int INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT = + InputEventInjectionSync.WAIT_FOR_RESULT; /** * Input Event Injection Synchronization Mode: Wait for finish. @@ -230,7 +232,8 @@ public final class InputManager { * @hide */ @UnsupportedAppUsage - public static final int INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH = 2; // see InputDispatcher.h + public static final int INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH = + InputEventInjectionSync.WAIT_FOR_FINISHED; /** @hide */ @Retention(RetentionPolicy.SOURCE) @@ -1022,9 +1025,9 @@ public final class InputManager { * * @param event The event to inject. * @param mode The synchronization mode. One of: - * {@link #INJECT_INPUT_EVENT_MODE_ASYNC}, - * {@link #INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT}, or - * {@link #INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH}. + * {@link android.os.InputEventInjectionSync.NONE}, + * {@link android.os.InputEventInjectionSync.WAIT_FOR_RESULT}, or + * {@link android.os.InputEventInjectionSync.WAIT_FOR_FINISHED}. * @return True if input event injection succeeded. * * @hide @@ -1034,9 +1037,9 @@ public final class InputManager { if (event == null) { throw new IllegalArgumentException("event must not be null"); } - if (mode != INJECT_INPUT_EVENT_MODE_ASYNC - && mode != INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH - && mode != INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT) { + if (mode != InputEventInjectionSync.NONE + && mode != InputEventInjectionSync.WAIT_FOR_FINISHED + && mode != InputEventInjectionSync.WAIT_FOR_RESULT) { throw new IllegalArgumentException("mode is invalid"); } diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index a2304f4ad158..653645794f95 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -55,6 +55,8 @@ import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; +import android.os.InputEventInjectionResult; +import android.os.InputEventInjectionSync; import android.os.LocaleList; import android.os.Looper; import android.os.Message; @@ -268,12 +270,6 @@ public class InputManagerService extends IInputManager.Stub private static native void nativeNotifyPortAssociationsChanged(long ptr); private static native void nativeSetMotionClassifierEnabled(long ptr, boolean enabled); - // Input event injection constants defined in InputDispatcher.h. - private static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0; - private static final int INPUT_EVENT_INJECTION_PERMISSION_DENIED = 1; - private static final int INPUT_EVENT_INJECTION_FAILED = 2; - private static final int INPUT_EVENT_INJECTION_TIMED_OUT = 3; - // Maximum number of milliseconds to wait for input event injection. private static final int INJECTION_TIMEOUT_MILLIS = 30 * 1000; @@ -691,9 +687,9 @@ public class InputManagerService extends IInputManager.Stub if (event == null) { throw new IllegalArgumentException("event must not be null"); } - if (mode != InputManager.INJECT_INPUT_EVENT_MODE_ASYNC - && mode != InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH - && mode != InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT) { + if (mode != InputEventInjectionSync.NONE + && mode != InputEventInjectionSync.WAIT_FOR_FINISHED + && mode != InputEventInjectionSync.WAIT_FOR_RESULT) { throw new IllegalArgumentException("mode is invalid"); } @@ -708,16 +704,16 @@ public class InputManagerService extends IInputManager.Stub Binder.restoreCallingIdentity(ident); } switch (result) { - case INPUT_EVENT_INJECTION_PERMISSION_DENIED: + case InputEventInjectionResult.PERMISSION_DENIED: Slog.w(TAG, "Input event injection from pid " + pid + " permission denied."); throw new SecurityException( "Injecting to another application requires INJECT_EVENTS permission"); - case INPUT_EVENT_INJECTION_SUCCEEDED: + case InputEventInjectionResult.SUCCEEDED: return true; - case INPUT_EVENT_INJECTION_TIMED_OUT: + case InputEventInjectionResult.TIMED_OUT: Slog.w(TAG, "Input event injection from pid " + pid + " timed out."); return false; - case INPUT_EVENT_INJECTION_FAILED: + case InputEventInjectionResult.FAILED: default: Slog.w(TAG, "Input event injection from pid " + pid + " failed."); return false; diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index d14780e59ab1..4413dc3df6bb 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -74,6 +74,9 @@ using android::base::ParseUint; using android::base::StringPrintf; +using android::os::BlockUntrustedTouchesMode; +using android::os::InputEventInjectionResult; +using android::os::InputEventInjectionSync; // Maximum allowable delay value in a vibration pattern before // which the delay will be truncated. @@ -1473,17 +1476,20 @@ static jint nativeInjectInputEvent(JNIEnv* env, jclass /* clazz */, jint syncMode, jint timeoutMillis, jint policyFlags) { NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); + // static_cast is safe because the value was already checked at the Java layer + InputEventInjectionSync mode = static_cast<InputEventInjectionSync>(syncMode); + if (env->IsInstanceOf(inputEventObj, gKeyEventClassInfo.clazz)) { KeyEvent keyEvent; status_t status = android_view_KeyEvent_toNative(env, inputEventObj, & keyEvent); if (status) { jniThrowRuntimeException(env, "Could not read contents of KeyEvent object."); - return INPUT_EVENT_INJECTION_FAILED; + return static_cast<jint>(InputEventInjectionResult::FAILED); } - const int32_t result = + const InputEventInjectionResult result = im->getInputManager()->getDispatcher()->injectInputEvent(&keyEvent, injectorPid, - injectorUid, syncMode, + injectorUid, mode, std::chrono::milliseconds( timeoutMillis), uint32_t(policyFlags)); @@ -1492,19 +1498,19 @@ static jint nativeInjectInputEvent(JNIEnv* env, jclass /* clazz */, const MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, inputEventObj); if (!motionEvent) { jniThrowRuntimeException(env, "Could not read contents of MotionEvent object."); - return INPUT_EVENT_INJECTION_FAILED; + return static_cast<jint>(InputEventInjectionResult::FAILED); } - const int32_t result = - (jint)im->getInputManager() - ->getDispatcher() - ->injectInputEvent(motionEvent, injectorPid, injectorUid, syncMode, - std::chrono::milliseconds(timeoutMillis), - uint32_t(policyFlags)); + const InputEventInjectionResult result = + im->getInputManager()->getDispatcher()->injectInputEvent(motionEvent, injectorPid, + injectorUid, mode, + std::chrono::milliseconds( + timeoutMillis), + uint32_t(policyFlags)); return static_cast<jint>(result); } else { jniThrowRuntimeException(env, "Invalid input event type."); - return INPUT_EVENT_INJECTION_FAILED; + return static_cast<jint>(InputEventInjectionResult::FAILED); } } |