diff options
| author | 2022-09-10 04:24:20 +0000 | |
|---|---|---|
| committer | 2022-09-10 04:24:20 +0000 | |
| commit | 4a8abca2d87fc93137edcacf7ab2979c3232add2 (patch) | |
| tree | 2ff0d8e76c24e74a1672e67a70a5a419fa24127a | |
| parent | 779bae73915513bb508f5303c4d9e9be609c3d4d (diff) | |
| parent | 8fa896d098cd63db550410e4bb77fccab4051ce3 (diff) | |
Merge "Reland "Conform to 1D VelocityTracker" (--try 2)"
| -rw-r--r-- | core/java/android/view/VelocityTracker.java | 65 | ||||
| -rw-r--r-- | core/java/com/android/internal/widget/PointerLocationView.java | 12 | ||||
| -rw-r--r-- | core/jni/android_view_VelocityTracker.cpp | 116 |
3 files changed, 56 insertions, 137 deletions
diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java index 2d4da2c88ce8..a52fc7586f72 100644 --- a/core/java/android/view/VelocityTracker.java +++ b/core/java/android/view/VelocityTracker.java @@ -180,9 +180,9 @@ public final class VelocityTracker { private static native void nativeClear(long ptr); private static native void nativeAddMovement(long ptr, MotionEvent event); private static native void nativeComputeCurrentVelocity(long ptr, int units, float maxVelocity); - private static native float nativeGetXVelocity(long ptr, int id); - private static native float nativeGetYVelocity(long ptr, int id); - private static native boolean nativeGetEstimator(long ptr, int id, Estimator outEstimator); + private static native float nativeGetVelocity(long ptr, int axis, int id); + private static native boolean nativeGetEstimator( + long ptr, int axis, int id, Estimator outEstimator); static { // Strategy string and IDs mapping lookup. @@ -361,7 +361,7 @@ public final class VelocityTracker { * @return The previously computed X velocity. */ public float getXVelocity() { - return nativeGetXVelocity(mPtr, ACTIVE_POINTER_ID); + return getXVelocity(ACTIVE_POINTER_ID); } /** @@ -371,7 +371,7 @@ public final class VelocityTracker { * @return The previously computed Y velocity. */ public float getYVelocity() { - return nativeGetYVelocity(mPtr, ACTIVE_POINTER_ID); + return getYVelocity(ACTIVE_POINTER_ID); } /** @@ -382,7 +382,7 @@ public final class VelocityTracker { * @return The previously computed X velocity. */ public float getXVelocity(int id) { - return nativeGetXVelocity(mPtr, id); + return nativeGetVelocity(mPtr, MotionEvent.AXIS_X, id); } /** @@ -393,7 +393,7 @@ public final class VelocityTracker { * @return The previously computed Y velocity. */ public float getYVelocity(int id) { - return nativeGetYVelocity(mPtr, id); + return nativeGetVelocity(mPtr, MotionEvent.AXIS_Y, id); } /** @@ -403,6 +403,8 @@ public final class VelocityTracker { * It is not necessary to call {@link #computeCurrentVelocity(int)} before calling * this method. * + * @param axis Which axis's velocity to return. + * Should be one of the axes defined in {@link MotionEvent}. * @param id Which pointer's velocity to return. * @param outEstimator The estimator to populate. * @return True if an estimator was obtained, false if there is no information @@ -410,11 +412,11 @@ public final class VelocityTracker { * * @hide For internal use only. Not a final API. */ - public boolean getEstimator(int id, Estimator outEstimator) { + public boolean getEstimator(int axis, int id, Estimator outEstimator) { if (outEstimator == null) { throw new IllegalArgumentException("outEstimator must not be null"); } - return nativeGetEstimator(mPtr, id, outEstimator); + return nativeGetEstimator(mPtr, axis, id, outEstimator); } /** @@ -434,16 +436,9 @@ public final class VelocityTracker { private static final int MAX_DEGREE = 4; /** - * Polynomial coefficients describing motion in X. + * Polynomial coefficients describing motion. */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public final float[] xCoeff = new float[MAX_DEGREE + 1]; - - /** - * Polynomial coefficients describing motion in Y. - */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) - public final float[] yCoeff = new float[MAX_DEGREE + 1]; + public final float[] coeff = new float[MAX_DEGREE + 1]; /** * Polynomial degree, or zero if only position information is available. @@ -458,39 +453,21 @@ public final class VelocityTracker { public float confidence; /** - * Gets an estimate of the X position of the pointer at the specified time point. + * Gets an estimate of the position of the pointer at the specified time point. * @param time The time point in seconds, 0 is the last recorded time. - * @return The estimated X coordinate. - */ - public float estimateX(float time) { - return estimate(time, xCoeff); - } - - /** - * Gets an estimate of the Y position of the pointer at the specified time point. - * @param time The time point in seconds, 0 is the last recorded time. - * @return The estimated Y coordinate. - */ - public float estimateY(float time) { - return estimate(time, yCoeff); - } - - /** - * Gets the X coefficient with the specified index. - * @param index The index of the coefficient to return. - * @return The X coefficient, or 0 if the index is greater than the degree. + * @return The estimated axis value. */ - public float getXCoeff(int index) { - return index <= degree ? xCoeff[index] : 0; + public float estimate(float time) { + return estimate(time, coeff); } /** - * Gets the Y coefficient with the specified index. + * Gets the coefficient with the specified index. * @param index The index of the coefficient to return. - * @return The Y coefficient, or 0 if the index is greater than the degree. + * @return The coefficient, or 0 if the index is greater than the degree. */ - public float getYCoeff(int index) { - return index <= degree ? yCoeff[index] : 0; + public float getCoeff(int index) { + return index <= degree ? coeff[index] : 0; } private float estimate(float time, float[] c) { diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java index 9ee9b8249493..80d50ff5d310 100644 --- a/core/java/com/android/internal/widget/PointerLocationView.java +++ b/core/java/com/android/internal/widget/PointerLocationView.java @@ -90,8 +90,10 @@ public class PointerLocationView extends View implements InputDeviceListener, private float mBoundingBottom; // Position estimator. - private VelocityTracker.Estimator mEstimator = new VelocityTracker.Estimator(); - private VelocityTracker.Estimator mAltEstimator = new VelocityTracker.Estimator(); + private VelocityTracker.Estimator mEstimatorX = new VelocityTracker.Estimator(); + private VelocityTracker.Estimator mAltEstimatorX = new VelocityTracker.Estimator(); + private VelocityTracker.Estimator mEstimatorY = new VelocityTracker.Estimator(); + private VelocityTracker.Estimator mAltEstimatorY = new VelocityTracker.Estimator(); @UnsupportedAppUsage public PointerState() { @@ -679,11 +681,13 @@ public class PointerLocationView extends View implements InputDeviceListener, ps.addTrace(coords.x, coords.y, true); ps.mXVelocity = mVelocity.getXVelocity(id); ps.mYVelocity = mVelocity.getYVelocity(id); - mVelocity.getEstimator(id, ps.mEstimator); + mVelocity.getEstimator(MotionEvent.AXIS_X, id, ps.mEstimatorX); + mVelocity.getEstimator(MotionEvent.AXIS_Y, id, ps.mEstimatorY); if (mAltVelocity != null) { ps.mAltXVelocity = mAltVelocity.getXVelocity(id); ps.mAltYVelocity = mAltVelocity.getYVelocity(id); - mAltVelocity.getEstimator(id, ps.mAltEstimator); + mAltVelocity.getEstimator(MotionEvent.AXIS_X, id, ps.mAltEstimatorX); + mAltVelocity.getEstimator(MotionEvent.AXIS_Y, id, ps.mAltEstimatorY); } ps.mToolType = event.getToolType(i); diff --git a/core/jni/android_view_VelocityTracker.cpp b/core/jni/android_view_VelocityTracker.cpp index 46bd6824da7e..16b9f008ec65 100644 --- a/core/jni/android_view_VelocityTracker.cpp +++ b/core/jni/android_view_VelocityTracker.cpp @@ -32,8 +32,7 @@ namespace android { static const int ACTIVE_POINTER_ID = -1; static struct { - jfieldID xCoeff; - jfieldID yCoeff; + jfieldID coeff; jfieldID degree; jfieldID confidence; } gEstimatorClassInfo; @@ -47,28 +46,22 @@ public: void clear(); void addMovement(const MotionEvent* event); + // TODO(b/32830165): consider supporting an overload that supports computing velocity only for + // a subset of the supported axes. void computeCurrentVelocity(int32_t units, float maxVelocity); - void getVelocity(int32_t id, float* outVx, float* outVy); - bool getEstimator(int32_t id, VelocityTracker::Estimator* outEstimator); + float getVelocity(int32_t axis, int32_t id); + bool getEstimator(int32_t axis, int32_t id, VelocityTracker::Estimator* outEstimator); private: - struct Velocity { - float vx, vy; - }; - VelocityTracker mVelocityTracker; - int32_t mActivePointerId; - BitSet32 mCalculatedIdBits; - Velocity mCalculatedVelocity[MAX_POINTERS]; + VelocityTracker::ComputedVelocity mComputedVelocity; }; VelocityTrackerState::VelocityTrackerState(const VelocityTracker::Strategy strategy) - : mVelocityTracker(strategy), mActivePointerId(-1) {} + : mVelocityTracker(strategy) {} void VelocityTrackerState::clear() { mVelocityTracker.clear(); - mActivePointerId = -1; - mCalculatedIdBits.clear(); } void VelocityTrackerState::addMovement(const MotionEvent* event) { @@ -76,61 +69,20 @@ void VelocityTrackerState::addMovement(const MotionEvent* event) { } void VelocityTrackerState::computeCurrentVelocity(int32_t units, float maxVelocity) { - BitSet32 idBits(mVelocityTracker.getCurrentPointerIdBits()); - mCalculatedIdBits = idBits; - - for (uint32_t index = 0; !idBits.isEmpty(); index++) { - uint32_t id = idBits.clearFirstMarkedBit(); - - float vx, vy; - mVelocityTracker.getVelocity(id, &vx, &vy); - - vx = vx * units / 1000; - vy = vy * units / 1000; - - if (vx > maxVelocity) { - vx = maxVelocity; - } else if (vx < -maxVelocity) { - vx = -maxVelocity; - } - if (vy > maxVelocity) { - vy = maxVelocity; - } else if (vy < -maxVelocity) { - vy = -maxVelocity; - } - - Velocity& velocity = mCalculatedVelocity[index]; - velocity.vx = vx; - velocity.vy = vy; - } + mComputedVelocity = mVelocityTracker.getComputedVelocity(units, maxVelocity); } -void VelocityTrackerState::getVelocity(int32_t id, float* outVx, float* outVy) { +float VelocityTrackerState::getVelocity(int32_t axis, int32_t id) { if (id == ACTIVE_POINTER_ID) { id = mVelocityTracker.getActivePointerId(); } - float vx, vy; - if (id >= 0 && id <= MAX_POINTER_ID && mCalculatedIdBits.hasBit(id)) { - uint32_t index = mCalculatedIdBits.getIndexOfBit(id); - const Velocity& velocity = mCalculatedVelocity[index]; - vx = velocity.vx; - vy = velocity.vy; - } else { - vx = 0; - vy = 0; - } - - if (outVx) { - *outVx = vx; - } - if (outVy) { - *outVy = vy; - } + return mComputedVelocity.getVelocity(axis, id).value_or(0); } -bool VelocityTrackerState::getEstimator(int32_t id, VelocityTracker::Estimator* outEstimator) { - return mVelocityTracker.getEstimator(id, outEstimator); +bool VelocityTrackerState::getEstimator(int32_t axis, int32_t id, + VelocityTracker::Estimator* outEstimator) { + return mVelocityTracker.getEstimator(axis, id, outEstimator); } // Return a strategy enum from integer value. @@ -177,37 +129,25 @@ static void android_view_VelocityTracker_nativeComputeCurrentVelocity(JNIEnv* en state->computeCurrentVelocity(units, maxVelocity); } -static jfloat android_view_VelocityTracker_nativeGetXVelocity(JNIEnv* env, jclass clazz, - jlong ptr, jint id) { +static jfloat android_view_VelocityTracker_nativeGetVelocity(JNIEnv* env, jclass clazz, jlong ptr, + jint axis, jint id) { VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); - float vx; - state->getVelocity(id, &vx, NULL); - return vx; -} - -static jfloat android_view_VelocityTracker_nativeGetYVelocity(JNIEnv* env, jclass clazz, - jlong ptr, jint id) { - VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); - float vy; - state->getVelocity(id, NULL, &vy); - return vy; + return state->getVelocity(axis, id); } static jboolean android_view_VelocityTracker_nativeGetEstimator(JNIEnv* env, jclass clazz, - jlong ptr, jint id, jobject outEstimatorObj) { + jlong ptr, jint axis, jint id, + jobject outEstimatorObj) { VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); VelocityTracker::Estimator estimator; - bool result = state->getEstimator(id, &estimator); - jfloatArray xCoeffObj = jfloatArray(env->GetObjectField(outEstimatorObj, - gEstimatorClassInfo.xCoeff)); - jfloatArray yCoeffObj = jfloatArray(env->GetObjectField(outEstimatorObj, - gEstimatorClassInfo.yCoeff)); + bool result = state->getEstimator(axis, id, &estimator); + + jfloatArray coeffObj = + jfloatArray(env->GetObjectField(outEstimatorObj, gEstimatorClassInfo.coeff)); - env->SetFloatArrayRegion(xCoeffObj, 0, VelocityTracker::Estimator::MAX_DEGREE + 1, - estimator.xCoeff); - env->SetFloatArrayRegion(yCoeffObj, 0, VelocityTracker::Estimator::MAX_DEGREE + 1, - estimator.yCoeff); + env->SetFloatArrayRegion(coeffObj, 0, VelocityTracker::Estimator::MAX_DEGREE + 1, + estimator.coeff); env->SetIntField(outEstimatorObj, gEstimatorClassInfo.degree, estimator.degree); env->SetFloatField(outEstimatorObj, gEstimatorClassInfo.confidence, estimator.confidence); return result; @@ -224,9 +164,8 @@ static const JNINativeMethod gVelocityTrackerMethods[] = { (void*)android_view_VelocityTracker_nativeAddMovement}, {"nativeComputeCurrentVelocity", "(JIF)V", (void*)android_view_VelocityTracker_nativeComputeCurrentVelocity}, - {"nativeGetXVelocity", "(JI)F", (void*)android_view_VelocityTracker_nativeGetXVelocity}, - {"nativeGetYVelocity", "(JI)F", (void*)android_view_VelocityTracker_nativeGetYVelocity}, - {"nativeGetEstimator", "(JILandroid/view/VelocityTracker$Estimator;)Z", + {"nativeGetVelocity", "(JII)F", (void*)android_view_VelocityTracker_nativeGetVelocity}, + {"nativeGetEstimator", "(JIILandroid/view/VelocityTracker$Estimator;)Z", (void*)android_view_VelocityTracker_nativeGetEstimator}, }; @@ -236,8 +175,7 @@ int register_android_view_VelocityTracker(JNIEnv* env) { jclass clazz = FindClassOrDie(env, "android/view/VelocityTracker$Estimator"); - gEstimatorClassInfo.xCoeff = GetFieldIDOrDie(env, clazz, "xCoeff", "[F"); - gEstimatorClassInfo.yCoeff = GetFieldIDOrDie(env, clazz, "yCoeff", "[F"); + gEstimatorClassInfo.coeff = GetFieldIDOrDie(env, clazz, "coeff", "[F"); gEstimatorClassInfo.degree = GetFieldIDOrDie(env, clazz, "degree", "I"); gEstimatorClassInfo.confidence = GetFieldIDOrDie(env, clazz, "confidence", "F"); |