Merge "Use enum class for injection modes and result"

This commit is contained in:
TreeHugger Robot
2020-10-08 00:38:52 +00:00
committed by Android (Google) Code Review
3 changed files with 38 additions and 33 deletions

View File

@@ -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");
}

View File

@@ -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;

View File

@@ -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);
}
}