diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index cda9b233576c0..d12ed8f1595e0 100644 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -31,6 +31,8 @@ import android.util.Log; import android.util.SparseIntArray; import android.view.KeyCharacterMap.KeyData; +import java.util.concurrent.TimeUnit; + /** * Object used to report key and button events. *
@@ -1298,9 +1300,16 @@ public class KeyEvent extends InputEvent implements Parcelable {
private int mRepeatCount;
@UnsupportedAppUsage
private int mFlags;
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+ /**
+ * The time when the key initially was pressed, in nanoseconds. Only millisecond precision is
+ * exposed as public api, so this must always be converted to / from milliseconds when used.
+ */
private long mDownTime;
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+ /**
+ * The time when the current key event occurred. If mAction is ACTION_DOWN, then this is equal
+ * to mDownTime. Only millisecond precision is exposed as public api, so this must always be
+ * converted to / from milliseconds when used.
+ */
private long mEventTime;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private String mCharacters;
@@ -1400,8 +1409,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
public KeyEvent(long downTime, long eventTime, int action,
int code, int repeat) {
mId = nativeNextId();
- mDownTime = downTime;
- mEventTime = eventTime;
+ mDownTime = TimeUnit.NANOSECONDS.convert(downTime, TimeUnit.MILLISECONDS);
+ mEventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
mAction = action;
mKeyCode = code;
mRepeatCount = repeat;
@@ -1425,8 +1434,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
public KeyEvent(long downTime, long eventTime, int action,
int code, int repeat, int metaState) {
mId = nativeNextId();
- mDownTime = downTime;
- mEventTime = eventTime;
+ mDownTime = TimeUnit.NANOSECONDS.convert(downTime, TimeUnit.MILLISECONDS);
+ mEventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
mAction = action;
mKeyCode = code;
mRepeatCount = repeat;
@@ -1454,8 +1463,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
int code, int repeat, int metaState,
int deviceId, int scancode) {
mId = nativeNextId();
- mDownTime = downTime;
- mEventTime = eventTime;
+ mDownTime = TimeUnit.NANOSECONDS.convert(downTime, TimeUnit.MILLISECONDS);
+ mEventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
mAction = action;
mKeyCode = code;
mRepeatCount = repeat;
@@ -1485,8 +1494,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
int code, int repeat, int metaState,
int deviceId, int scancode, int flags) {
mId = nativeNextId();
- mDownTime = downTime;
- mEventTime = eventTime;
+ mDownTime = TimeUnit.NANOSECONDS.convert(downTime, TimeUnit.MILLISECONDS);
+ mEventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
mAction = action;
mKeyCode = code;
mRepeatCount = repeat;
@@ -1518,8 +1527,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
int code, int repeat, int metaState,
int deviceId, int scancode, int flags, int source) {
mId = nativeNextId();
- mDownTime = downTime;
- mEventTime = eventTime;
+ mDownTime = TimeUnit.NANOSECONDS.convert(downTime, TimeUnit.MILLISECONDS);
+ mEventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
mAction = action;
mKeyCode = code;
mRepeatCount = repeat;
@@ -1545,8 +1554,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
*/
public KeyEvent(long time, String characters, int deviceId, int flags) {
mId = nativeNextId();
- mDownTime = time;
- mEventTime = time;
+ mDownTime = TimeUnit.NANOSECONDS.convert(time, TimeUnit.MILLISECONDS);
+ mEventTime = TimeUnit.NANOSECONDS.convert(time, TimeUnit.MILLISECONDS);
mCharacters = characters;
mAction = ACTION_MULTIPLE;
mKeyCode = KEYCODE_UNKNOWN;
@@ -1592,7 +1601,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
public KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) {
mId = nativeNextId(); // Not an exact copy so assign a new ID.
mDownTime = origEvent.mDownTime;
- mEventTime = eventTime;
+ mEventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
mAction = origEvent.mAction;
mKeyCode = origEvent.mKeyCode;
mRepeatCount = newRepeat;
@@ -1626,14 +1635,14 @@ public class KeyEvent extends InputEvent implements Parcelable {
*
* @hide
*/
- public static KeyEvent obtain(int id, long downTime, long eventTime, int action,
+ private static KeyEvent obtain(int id, long downTimeNanos, long eventTimeNanos, int action,
int code, int repeat, int metaState,
int deviceId, int scancode, int flags, int source, int displayId, @Nullable byte[] hmac,
String characters) {
KeyEvent ev = obtain();
ev.mId = id;
- ev.mDownTime = downTime;
- ev.mEventTime = eventTime;
+ ev.mDownTime = downTimeNanos;
+ ev.mEventTime = eventTimeNanos;
ev.mAction = action;
ev.mKeyCode = code;
ev.mRepeatCount = repeat;
@@ -1656,6 +1665,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
public static KeyEvent obtain(long downTime, long eventTime, int action,
int code, int repeat, int metaState,
int deviceId, int scanCode, int flags, int source, int displayId, String characters) {
+ downTime = TimeUnit.NANOSECONDS.convert(downTime, TimeUnit.MILLISECONDS);
+ eventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
return obtain(nativeNextId(), downTime, eventTime, action, code, repeat, metaState,
deviceId, scanCode, flags, source, displayId, null /* hmac */, characters);
}
@@ -1669,6 +1680,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
public static KeyEvent obtain(long downTime, long eventTime, int action,
int code, int repeat, int metaState,
int deviceId, int scancode, int flags, int source, String characters) {
+ // Do not convert downTime and eventTime here. We are calling the obtain method above,
+ // which will do the conversion. Just specify INVALID_DISPLAY and forward the request.
return obtain(downTime, eventTime, action, code, repeat, metaState, deviceId, scancode,
flags, source, INVALID_DISPLAY, characters);
}
@@ -1768,7 +1781,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
int newRepeat, int newFlags) {
KeyEvent ret = new KeyEvent(event);
ret.mId = nativeNextId(); // Not an exact copy so assign a new ID.
- ret.mEventTime = eventTime;
+ ret.mEventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
ret.mRepeatCount = newRepeat;
ret.mFlags = newFlags;
return ret;
@@ -2617,8 +2630,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
* @hide
*/
public final void setTime(long downTime, long eventTime) {
- mDownTime = downTime;
- mEventTime = eventTime;
+ mDownTime = TimeUnit.NANOSECONDS.convert(downTime, TimeUnit.MILLISECONDS);
+ mEventTime = TimeUnit.NANOSECONDS.convert(eventTime, TimeUnit.MILLISECONDS);
}
/**
@@ -2633,7 +2646,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
* {@link android.os.SystemClock#uptimeMillis} time base
*/
public final long getDownTime() {
- return mDownTime;
+ return TimeUnit.MILLISECONDS.convert(mDownTime, TimeUnit.NANOSECONDS);
}
/**
@@ -2645,7 +2658,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
*/
@Override
public final long getEventTime() {
- return mEventTime;
+ return TimeUnit.MILLISECONDS.convert(mEventTime, TimeUnit.NANOSECONDS);
}
/**
@@ -2664,7 +2677,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
*/
@Override
public final long getEventTimeNano() {
- return mEventTime * 1000000L;
+ return mEventTime;
}
/**
diff --git a/core/jni/android_view_KeyEvent.cpp b/core/jni/android_view_KeyEvent.cpp
index 8177ec6df803a..2ef9632f0e313 100644
--- a/core/jni/android_view_KeyEvent.cpp
+++ b/core/jni/android_view_KeyEvent.cpp
@@ -98,9 +98,7 @@ jobject android_view_KeyEvent_fromNative(JNIEnv* env, const KeyEvent* event) {
ScopedLocalRef