Loading include/input/VelocityTracker.h +1 −2 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ public: INT2 = 8, LEGACY = 9, MAX = LEGACY, ftl_last = LEGACY, }; struct Estimator { Loading Loading @@ -95,8 +96,6 @@ public: // TODO(b/32830165): support axis-specific strategies. VelocityTracker(const Strategy strategy = Strategy::DEFAULT); ~VelocityTracker(); /** Return true if the axis is supported for velocity tracking, false otherwise. */ static bool isAxisSupported(int32_t axis); Loading libs/input/VelocityTracker.cpp +10 −13 Original line number Diff line number Diff line Loading @@ -16,7 +16,9 @@ #define LOG_TAG "VelocityTracker" #include <android-base/logging.h> #include <array> #include <ftl/enum.h> #include <inttypes.h> #include <limits.h> #include <math.h> Loading Loading @@ -145,27 +147,19 @@ static std::string matrixToString(const float* a, uint32_t m, uint32_t n, bool r VelocityTracker::VelocityTracker(const Strategy strategy) : mLastEventTime(0), mCurrentPointerIdBits(0), mOverrideStrategy(strategy) {} VelocityTracker::~VelocityTracker() { } bool VelocityTracker::isAxisSupported(int32_t axis) { return DEFAULT_STRATEGY_BY_AXIS.find(axis) != DEFAULT_STRATEGY_BY_AXIS.end(); } void VelocityTracker::configureStrategy(int32_t axis) { const bool isDifferentialAxis = DIFFERENTIAL_AXES.find(axis) != DIFFERENTIAL_AXES.end(); std::unique_ptr<VelocityTrackerStrategy> createdStrategy; if (mOverrideStrategy != VelocityTracker::Strategy::DEFAULT) { createdStrategy = createStrategy(mOverrideStrategy, /*deltaValues=*/isDifferentialAxis); } else { createdStrategy = createStrategy(DEFAULT_STRATEGY_BY_AXIS.at(axis), if (isDifferentialAxis || mOverrideStrategy == VelocityTracker::Strategy::DEFAULT) { // Do not allow overrides of strategies for differential axes, for now. mConfiguredStrategies[axis] = createStrategy(DEFAULT_STRATEGY_BY_AXIS.at(axis), /*deltaValues=*/isDifferentialAxis); } else { mConfiguredStrategies[axis] = createStrategy(mOverrideStrategy, /*deltaValues=*/false); } LOG_ALWAYS_FATAL_IF(createdStrategy == nullptr, "Could not create velocity tracker strategy for axis '%" PRId32 "'!", axis); mConfiguredStrategies[axis] = std::move(createdStrategy); } std::unique_ptr<VelocityTrackerStrategy> VelocityTracker::createStrategy( Loading Loading @@ -213,6 +207,9 @@ std::unique_ptr<VelocityTrackerStrategy> VelocityTracker::createStrategy( default: break; } LOG(FATAL) << "Invalid strategy: " << ftl::enum_string(strategy) << ", deltaValues = " << deltaValues; return nullptr; } Loading libs/input/tests/VelocityTracker_test.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -282,6 +282,11 @@ static void computeAndCheckAxisScrollVelocity( const std::vector<std::pair<std::chrono::nanoseconds, float>>& motions, std::optional<float> targetVelocity) { checkVelocity(computeVelocity(strategy, motions, AMOTION_EVENT_AXIS_SCROLL), targetVelocity); // The strategy LSQ2 is not compatible with AXIS_SCROLL. In those situations, we should fall // back to a strategy that supports differential axes. checkVelocity(computeVelocity(VelocityTracker::Strategy::LSQ2, motions, AMOTION_EVENT_AXIS_SCROLL), targetVelocity); } static void computeAndCheckQuadraticEstimate(const std::vector<PlanarMotionEventEntry>& motions, Loading Loading
include/input/VelocityTracker.h +1 −2 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ public: INT2 = 8, LEGACY = 9, MAX = LEGACY, ftl_last = LEGACY, }; struct Estimator { Loading Loading @@ -95,8 +96,6 @@ public: // TODO(b/32830165): support axis-specific strategies. VelocityTracker(const Strategy strategy = Strategy::DEFAULT); ~VelocityTracker(); /** Return true if the axis is supported for velocity tracking, false otherwise. */ static bool isAxisSupported(int32_t axis); Loading
libs/input/VelocityTracker.cpp +10 −13 Original line number Diff line number Diff line Loading @@ -16,7 +16,9 @@ #define LOG_TAG "VelocityTracker" #include <android-base/logging.h> #include <array> #include <ftl/enum.h> #include <inttypes.h> #include <limits.h> #include <math.h> Loading Loading @@ -145,27 +147,19 @@ static std::string matrixToString(const float* a, uint32_t m, uint32_t n, bool r VelocityTracker::VelocityTracker(const Strategy strategy) : mLastEventTime(0), mCurrentPointerIdBits(0), mOverrideStrategy(strategy) {} VelocityTracker::~VelocityTracker() { } bool VelocityTracker::isAxisSupported(int32_t axis) { return DEFAULT_STRATEGY_BY_AXIS.find(axis) != DEFAULT_STRATEGY_BY_AXIS.end(); } void VelocityTracker::configureStrategy(int32_t axis) { const bool isDifferentialAxis = DIFFERENTIAL_AXES.find(axis) != DIFFERENTIAL_AXES.end(); std::unique_ptr<VelocityTrackerStrategy> createdStrategy; if (mOverrideStrategy != VelocityTracker::Strategy::DEFAULT) { createdStrategy = createStrategy(mOverrideStrategy, /*deltaValues=*/isDifferentialAxis); } else { createdStrategy = createStrategy(DEFAULT_STRATEGY_BY_AXIS.at(axis), if (isDifferentialAxis || mOverrideStrategy == VelocityTracker::Strategy::DEFAULT) { // Do not allow overrides of strategies for differential axes, for now. mConfiguredStrategies[axis] = createStrategy(DEFAULT_STRATEGY_BY_AXIS.at(axis), /*deltaValues=*/isDifferentialAxis); } else { mConfiguredStrategies[axis] = createStrategy(mOverrideStrategy, /*deltaValues=*/false); } LOG_ALWAYS_FATAL_IF(createdStrategy == nullptr, "Could not create velocity tracker strategy for axis '%" PRId32 "'!", axis); mConfiguredStrategies[axis] = std::move(createdStrategy); } std::unique_ptr<VelocityTrackerStrategy> VelocityTracker::createStrategy( Loading Loading @@ -213,6 +207,9 @@ std::unique_ptr<VelocityTrackerStrategy> VelocityTracker::createStrategy( default: break; } LOG(FATAL) << "Invalid strategy: " << ftl::enum_string(strategy) << ", deltaValues = " << deltaValues; return nullptr; } Loading
libs/input/tests/VelocityTracker_test.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -282,6 +282,11 @@ static void computeAndCheckAxisScrollVelocity( const std::vector<std::pair<std::chrono::nanoseconds, float>>& motions, std::optional<float> targetVelocity) { checkVelocity(computeVelocity(strategy, motions, AMOTION_EVENT_AXIS_SCROLL), targetVelocity); // The strategy LSQ2 is not compatible with AXIS_SCROLL. In those situations, we should fall // back to a strategy that supports differential axes. checkVelocity(computeVelocity(VelocityTracker::Strategy::LSQ2, motions, AMOTION_EVENT_AXIS_SCROLL), targetVelocity); } static void computeAndCheckQuadraticEstimate(const std::vector<PlanarMotionEventEntry>& motions, Loading