Merge "Remove quick switch and simplify quickstep code for scrub" into pi-dev
am: f15f291777
Change-Id: Idcf30a15a5a94cce655cde27dfb663533f230108
This commit is contained in:
@@ -35,20 +35,12 @@ oneway interface IOverviewProxy {
|
||||
* guarantees the following order of events:
|
||||
*
|
||||
* Normal gesture: DOWN, (MOVE/POINTER_DOWN/POINTER_UP)*, UP
|
||||
* Quick switch: DOWN, (MOVE/POINTER_DOWN/POINTER_UP)*, SWITCH
|
||||
* Quick scrub: DOWN, (MOVE/POINTER_DOWN/POINTER_UP)*, SCRUB_START, SCRUB_PROGRESS*, SCRUB_END
|
||||
*
|
||||
* Once quick switch/scrub is sent, then no further motion events will be provided.
|
||||
* Once quick scrub is sent, then no further motion events will be provided.
|
||||
*/
|
||||
void onMotionEvent(in MotionEvent event);
|
||||
|
||||
/**
|
||||
* Sent when a user has quickly flinged on the nav bar to switch tasks. Once this event is sent
|
||||
* the caller will stop sending any motion events and will no longer preemptively cancel any
|
||||
* recents animations started as a part of the motion event handling.
|
||||
*/
|
||||
void onQuickSwitch();
|
||||
|
||||
/**
|
||||
* Sent when the user starts to actively scrub the nav bar to switch tasks. Once this event is
|
||||
* sent the caller will stop sending any motion events and will no longer preemptively cancel
|
||||
@@ -89,8 +81,8 @@ oneway interface IOverviewProxy {
|
||||
* {@link onMotionEvent}. Since motion events will be sent, motion up or cancel can still be
|
||||
* sent to cancel overview regardless the current state of launcher (eg. if overview is already
|
||||
* visible, this event will still be sent if user swipes up). When this signal is sent,
|
||||
* navigation bar will not handle any gestures such as quick scrub or switch and the home button
|
||||
* will cancel (long) press.
|
||||
* navigation bar will not handle any gestures such as quick scrub and the home button will
|
||||
* cancel (long) press.
|
||||
*/
|
||||
void onQuickStep(in MotionEvent event);
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ public class NavigationBarCompat {
|
||||
|
||||
public static final int FLAG_DISABLE_SWIPE_UP = 0x1;
|
||||
/**
|
||||
* Interaction type: enable quick scrub and switch interaction on the home button
|
||||
* Interaction type: enable quick scrub interaction on the home button
|
||||
*/
|
||||
public static final int FLAG_DISABLE_QUICK_SCRUB = 0x2;
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@ import android.os.Handler;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Log;
|
||||
import android.util.Slog;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewConfiguration;
|
||||
@@ -54,28 +53,16 @@ import static com.android.systemui.OverviewProxyService.TAG_OPS;
|
||||
import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_HOME;
|
||||
|
||||
/**
|
||||
* Class to detect gestures on the navigation bar and implement quick scrub and switch.
|
||||
* Class to detect gestures on the navigation bar and implement quick scrub.
|
||||
*/
|
||||
public class QuickStepController extends GestureDetector.SimpleOnGestureListener implements
|
||||
GestureHelper {
|
||||
public class QuickStepController implements GestureHelper {
|
||||
|
||||
private static final String TAG = "QuickStepController";
|
||||
private static final int QUICK_SWITCH_FLING_VELOCITY = 0;
|
||||
private static final int ANIM_DURATION_MS = 200;
|
||||
private static final long LONG_PRESS_DELAY_MS = 225;
|
||||
|
||||
/**
|
||||
* For quick step, set a damping value to allow the button to stick closer its origin position
|
||||
* when dragging before quick scrub is active.
|
||||
*/
|
||||
private static final int SWITCH_STICKINESS = 4;
|
||||
|
||||
private NavigationBarView mNavigationBarView;
|
||||
private GestureDetector mGestureDetector;
|
||||
|
||||
private boolean mDraggingActive;
|
||||
private boolean mQuickScrubActive;
|
||||
private boolean mAllowQuickSwitch;
|
||||
private boolean mAllowGestureDetection;
|
||||
private boolean mQuickStepStarted;
|
||||
private float mDownOffset;
|
||||
@@ -134,45 +121,10 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
}
|
||||
};
|
||||
|
||||
private Runnable mLongPressRunnable = this::startQuickScrub;
|
||||
|
||||
private final GestureDetector.SimpleOnGestureListener mGestureListener =
|
||||
new GestureDetector.SimpleOnGestureListener() {
|
||||
@Override
|
||||
public boolean onFling(MotionEvent e1, MotionEvent e2, float velX, float velY) {
|
||||
if (!mNavigationBarView.isQuickScrubEnabled() || mQuickScrubActive
|
||||
|| !mAllowQuickSwitch
|
||||
|| mNavigationBarView.getDownHitTarget() != HIT_TARGET_HOME) {
|
||||
return false;
|
||||
}
|
||||
float velocityX = mIsRTL ? -velX : velX;
|
||||
float absVelY = Math.abs(velY);
|
||||
final boolean isValidFling = velocityX > QUICK_SWITCH_FLING_VELOCITY &&
|
||||
mIsVertical ? (absVelY > velocityX) : (velocityX > absVelY);
|
||||
if (isValidFling) {
|
||||
mDraggingActive = false;
|
||||
animateEnd();
|
||||
mHandler.removeCallbacks(mLongPressRunnable);
|
||||
try {
|
||||
final IOverviewProxy overviewProxy = mOverviewEventSender.getProxy();
|
||||
overviewProxy.onQuickSwitch();
|
||||
if (DEBUG_OVERVIEW_PROXY) {
|
||||
Log.d(TAG_OPS, "Quick Switch");
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed to send start of quick switch.", e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
public QuickStepController(Context context) {
|
||||
mContext = context;
|
||||
mScrollTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
|
||||
mOverviewEventSender = Dependency.get(OverviewProxyService.class);
|
||||
mGestureDetector = new GestureDetector(mContext, mGestureListener);
|
||||
mTrackThickness = getDimensionPixelSize(mContext, R.dimen.nav_quick_scrub_track_thickness);
|
||||
mTrackPadding = getDimensionPixelSize(mContext, R.dimen.nav_quick_scrub_track_edge_padding);
|
||||
mTrackPaint.setAlpha(0);
|
||||
@@ -195,8 +147,8 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if we want to intercept touch events for quick scrub/switch and prevent proxying
|
||||
* the event to the overview service.
|
||||
* @return true if we want to intercept touch events for quick scrub and prevent proxying the
|
||||
* event to the overview service.
|
||||
*/
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent event) {
|
||||
@@ -204,8 +156,8 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if we want to handle touch events for quick scrub/switch or if down event (that
|
||||
* will get consumed and ignored). No events will be proxied to the overview service.
|
||||
* @return true if we want to handle touch events for quick scrub or if down event (that will
|
||||
* get consumed and ignored). No events will be proxied to the overview service.
|
||||
*/
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
@@ -224,10 +176,6 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
mNavigationBarView.requestUnbufferedDispatch(event);
|
||||
|
||||
final ButtonDispatcher homeButton = mNavigationBarView.getHomeButton();
|
||||
if (mGestureDetector.onTouchEvent(event)) {
|
||||
// If the fling has been handled on UP, then skip proxying the UP
|
||||
return true;
|
||||
}
|
||||
final boolean homePressed = mNavigationBarView.getDownHitTarget() == HIT_TARGET_HOME;
|
||||
int action = event.getAction();
|
||||
switch (action & MotionEvent.ACTION_MASK) {
|
||||
@@ -242,15 +190,11 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
homeButton.setDelayTouchFeedback(true /* delay */);
|
||||
mTouchDownX = x;
|
||||
mTouchDownY = y;
|
||||
if (homePressed) {
|
||||
mHandler.postDelayed(mLongPressRunnable, LONG_PRESS_DELAY_MS);
|
||||
}
|
||||
mTransformGlobalMatrix.set(Matrix.IDENTITY_MATRIX);
|
||||
mTransformLocalMatrix.set(Matrix.IDENTITY_MATRIX);
|
||||
mNavigationBarView.transformMatrixToGlobal(mTransformGlobalMatrix);
|
||||
mNavigationBarView.transformMatrixToLocal(mTransformLocalMatrix);
|
||||
mQuickStepStarted = false;
|
||||
mAllowQuickSwitch = true;
|
||||
mAllowGestureDetection = true;
|
||||
break;
|
||||
}
|
||||
@@ -284,14 +228,14 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
}
|
||||
// Decide to start quickstep if dragging away from the navigation bar, otherwise in
|
||||
// the parallel direction, decide to start quickscrub. Only one may run.
|
||||
if (!mDraggingActive && !mQuickScrubActive && exceededPerpendicularTouchSlop) {
|
||||
if (!mQuickScrubActive && exceededPerpendicularTouchSlop) {
|
||||
if (mNavigationBarView.isQuickStepSwipeUpEnabled()) {
|
||||
startQuickStep(event);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Do not handle quick scrub/switch if disabled or hit target is not home button
|
||||
// Do not handle quick scrub if disabled or hit target is not home button
|
||||
if (!homePressed || !mNavigationBarView.isQuickScrubEnabled()) {
|
||||
break;
|
||||
}
|
||||
@@ -301,32 +245,28 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
}
|
||||
|
||||
// Control the button movement
|
||||
if (!mDraggingActive && exceededTouchSlop) {
|
||||
if (!mQuickScrubActive && exceededTouchSlop) {
|
||||
boolean allowDrag = !mDragPositive
|
||||
? offset < 0 && pos < touchDown : offset >= 0 && pos > touchDown;
|
||||
if (allowDrag) {
|
||||
mDownOffset = offset;
|
||||
homeButton.abortCurrentGesture();
|
||||
mDraggingActive = true;
|
||||
startQuickScrub();
|
||||
}
|
||||
}
|
||||
if (mDraggingActive && (mDragPositive && offset >= 0
|
||||
if (mQuickScrubActive && (mDragPositive && offset >= 0
|
||||
|| !mDragPositive && offset <= 0)) {
|
||||
float scrubFraction = Utilities.clamp(Math.abs(offset) * 1f / trackSize, 0, 1);
|
||||
mTranslation = !mDragPositive
|
||||
? Utilities.clamp(offset - mDownOffset, -trackSize, 0)
|
||||
: Utilities.clamp(offset - mDownOffset, 0, trackSize);
|
||||
if (mQuickScrubActive) {
|
||||
try {
|
||||
mOverviewEventSender.getProxy().onQuickScrubProgress(scrubFraction);
|
||||
if (DEBUG_OVERVIEW_PROXY) {
|
||||
Log.d(TAG_OPS, "Quick Scrub Progress:" + scrubFraction);
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed to send progress of quick scrub.", e);
|
||||
try {
|
||||
mOverviewEventSender.getProxy().onQuickScrubProgress(scrubFraction);
|
||||
if (DEBUG_OVERVIEW_PROXY) {
|
||||
Log.d(TAG_OPS, "Quick Scrub Progress:" + scrubFraction);
|
||||
}
|
||||
} else {
|
||||
mTranslation /= SWITCH_STICKINESS;
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Failed to send progress of quick scrub.", e);
|
||||
}
|
||||
if (mIsVertical) {
|
||||
mHomeButtonView.setTranslationY(mTranslation);
|
||||
@@ -342,12 +282,11 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
break;
|
||||
}
|
||||
|
||||
// Proxy motion events to launcher if not handled by quick scrub/switch
|
||||
boolean handled = mDraggingActive || mQuickScrubActive;
|
||||
if (!handled && mAllowGestureDetection) {
|
||||
// Proxy motion events to launcher if not handled by quick scrub
|
||||
if (!mQuickScrubActive && mAllowGestureDetection) {
|
||||
proxyMotionEvents(event);
|
||||
}
|
||||
return handled || mQuickStepStarted;
|
||||
return mQuickScrubActive || mQuickStepStarted;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -428,12 +367,11 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
}
|
||||
mOverviewEventSender.notifyQuickStepStarted();
|
||||
mNavigationBarView.getHomeButton().abortCurrentGesture();
|
||||
cancelQuickSwitch();
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
private void startQuickScrub() {
|
||||
if (!mQuickScrubActive && mDraggingActive) {
|
||||
if (!mQuickScrubActive) {
|
||||
mQuickScrubActive = true;
|
||||
mLightTrackColor = mContext.getColor(R.color.quick_step_track_background_light);
|
||||
mDarkTrackColor = mContext.getColor(R.color.quick_step_track_background_dark);
|
||||
@@ -451,8 +389,7 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
}
|
||||
|
||||
private void endQuickScrub(boolean animate) {
|
||||
mHandler.removeCallbacks(mLongPressRunnable);
|
||||
if (mDraggingActive || mQuickScrubActive) {
|
||||
if (mQuickScrubActive) {
|
||||
animateEnd();
|
||||
try {
|
||||
mOverviewEventSender.getProxy().onQuickScrubEnd();
|
||||
@@ -466,7 +403,6 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
if (mHomeButtonView != null && !animate) {
|
||||
mQuickScrubEndAnimator.end();
|
||||
}
|
||||
mDraggingActive = false;
|
||||
}
|
||||
|
||||
private boolean proxyMotionEvents(MotionEvent event) {
|
||||
@@ -489,11 +425,6 @@ public class QuickStepController extends GestureDetector.SimpleOnGestureListener
|
||||
return false;
|
||||
}
|
||||
|
||||
public void cancelQuickSwitch() {
|
||||
mAllowQuickSwitch = false;
|
||||
mHandler.removeCallbacks(mLongPressRunnable);
|
||||
}
|
||||
|
||||
private void animateEnd() {
|
||||
mButtonAnimator.setIntValues((int) mTranslation, 0);
|
||||
mTrackAnimator.setFloatValues(mTrackAlpha, 0);
|
||||
|
||||
Reference in New Issue
Block a user