Add timeout for motion pause detector
If no motion is added for some time, assume motion has paused.
Change-Id: I12b5d55abb0ed2244a082853546224c683e073ea
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/FlingAndHoldTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/FlingAndHoldTouchController.java
index b37c2e0..a41362f 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/FlingAndHoldTouchController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/FlingAndHoldTouchController.java
@@ -91,5 +91,6 @@
} else {
super.onDragEnd(velocity, fling);
}
+ mMotionPauseDetector.clear();
}
}
diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
index 84f16cb..28e8908 100644
--- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
+++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
@@ -43,6 +43,9 @@
import android.view.ViewConfiguration;
import android.view.WindowManager;
+import androidx.annotation.Nullable;
+import androidx.annotation.UiThread;
+
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.util.Preconditions;
import com.android.launcher3.util.RaceConditionTracker;
@@ -58,9 +61,6 @@
import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
import com.android.systemui.shared.system.WindowManagerWrapper;
-import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
-
/**
* Touch consumer for handling events originating from an activity other than Launcher
*/
@@ -323,6 +323,7 @@
}
mVelocityTracker.recycle();
mVelocityTracker = null;
+ mMotionPauseDetector.clear();
}
@Override
diff --git a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java
index 1156b87..21d8144 100644
--- a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java
+++ b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java
@@ -20,6 +20,7 @@
import android.os.SystemClock;
import android.view.MotionEvent;
+import com.android.launcher3.Alarm;
import com.android.launcher3.R;
/**
@@ -32,11 +33,15 @@
// The bigger this number, the easier it is to trigger the first pause.
private static final float RAPID_DECELERATION_FACTOR = 0.6f;
+ /** If no motion is added for this amount of time, assume the motion has paused. */
+ private static final long FORCE_PAUSE_TIMEOUT = 300;
+
private final float mSpeedVerySlow;
private final float mSpeedSomewhatFast;
private final float mSpeedFast;
private final float mMinDisplacementForPause;
private final float mMaxOrthogonalDisplacementForPause;
+ private final Alarm mForcePauseTimeout;
private Long mPreviousTime = null;
private Float mPreviousPosition = null;
@@ -59,6 +64,8 @@
mMinDisplacementForPause = res.getDimension(R.dimen.motion_pause_detector_min_displacement);
mMaxOrthogonalDisplacementForPause = res.getDimension(
R.dimen.motion_pause_detector_max_orthogonal_displacement);
+ mForcePauseTimeout = new Alarm();
+ mForcePauseTimeout.setOnAlarmListener(alarm -> updatePaused(true /* isPaused */));
}
/**
@@ -70,6 +77,7 @@
if (mOnMotionPauseListener != null) {
mOnMotionPauseListener.onMotionPauseChanged(mIsPaused);
}
+ mForcePauseTimeout.setAlarm(FORCE_PAUSE_TIMEOUT);
}
/**
@@ -100,6 +108,7 @@
}
mPreviousTime = time;
mPreviousPosition = position;
+ mForcePauseTimeout.setAlarm(FORCE_PAUSE_TIMEOUT);
}
private void checkMotionPaused(float velocity, float prevVelocity,
@@ -129,6 +138,10 @@
boolean passedMaxOrthogonalDisplacement =
totalDisplacement.orthogonal >= mMaxOrthogonalDisplacementForPause;
isPaused &= passedMinDisplacement && !passedMaxOrthogonalDisplacement;
+ updatePaused(isPaused);
+ }
+
+ private void updatePaused(boolean isPaused) {
if (mIsPaused != isPaused) {
mIsPaused = isPaused;
if (mIsPaused) {
@@ -149,6 +162,7 @@
mTotalDisplacement.set(0, 0);
setOnMotionPauseListener(null);
mIsPaused = mHasEverBeenPaused = false;
+ mForcePauseTimeout.cancelAlarm();
}
public boolean isPaused() {