Loading quickstep/src/com/android/launcher3/uioverrides/DragPauseDetector.java +25 −13 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ public class DragPauseDetector implements OnAlarmListener { private final Alarm mAlarm; private final Runnable mOnPauseCallback; private boolean mEnabled = true; private boolean mTriggered = false; private int mDisabledFlags = 0; public DragPauseDetector(Runnable onPauseCallback) { mOnPauseCallback = onPauseCallback; Loading @@ -40,8 +40,8 @@ public class DragPauseDetector implements OnAlarmListener { mAlarm.setAlarm(PAUSE_DURATION); } public void onDrag(float displacement, float velocity) { if (mTriggered || !mEnabled) { public void onDrag(float velocity) { if (mTriggered || !isEnabled()) { return; } Loading @@ -53,7 +53,7 @@ public class DragPauseDetector implements OnAlarmListener { @Override public void onAlarm(Alarm alarm) { if (!mTriggered && mEnabled) { if (!mTriggered && isEnabled()) { mTriggered = true; mOnPauseCallback.run(); } Loading @@ -64,17 +64,29 @@ public class DragPauseDetector implements OnAlarmListener { } public boolean isEnabled() { return mEnabled; return mDisabledFlags == 0; } public void setEnabled(boolean isEnabled) { if (mEnabled != isEnabled) { mEnabled = isEnabled; if (isEnabled && !mTriggered) { public void addDisabledFlags(int flags) { boolean wasEnabled = isEnabled(); mDisabledFlags |= flags; resetAlarm(wasEnabled); } public void clearDisabledFlags(int flags) { boolean wasEnabled = isEnabled(); mDisabledFlags &= ~flags; resetAlarm(wasEnabled); } private void resetAlarm(boolean wasEnabled) { boolean isEnabled = isEnabled(); if (wasEnabled == isEnabled) { // Nothing has changed } if (isEnabled && !mTriggered) { mAlarm.setAlarm(PAUSE_DURATION); } else if (!isEnabled) { mAlarm.cancelAlarm(); } } } } quickstep/src/com/android/launcher3/uioverrides/TwoStepSwipeController.java +36 −7 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.FloatRange; import com.android.launcher3.util.TouchController; import java.util.ArrayList; Loading Loading @@ -78,6 +79,14 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter */ private static final int OTHER_HANDLERS_START_INDEX = SWIPE_HANDLER_INDEX + 1; // Swipe progress range (when starting from NORMAL state) where OVERVIEW state is allowed private static final float MIN_PROGRESS_TO_OVERVIEW = 0.1f; private static final float MAX_PROGRESS_TO_OVERVIEW = 0.4f; private static final int FLAG_OVERVIEW_DISABLED_OUT_OF_RANGE = 1 << 0; private static final int FLAG_OVERVIEW_DISABLED_FLING = 1 << 1; private static final int FLAG_OVERVIEW_DISABLED_CANCEL_STATE = 1 << 2; private final Launcher mLauncher; private final SwipeDetector mDetector; Loading @@ -85,6 +94,7 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter private int mStartContainerType; private DragPauseDetector mDragPauseDetector; private FloatRange mOverviewProgressRange; private TaggedAnimatorSetBuilder mTaggedAnimatorSetBuilder; private AnimatorSet mQuickOverviewAnimation; private boolean mAnimatingToOverview; Loading Loading @@ -221,10 +231,17 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter long maxAccuracy = (long) (2 * range); mDragPauseDetector = new DragPauseDetector(this::onDragPauseDetected); mTaggedAnimatorSetBuilder = new TaggedAnimatorSetBuilder(); mDragPauseDetector.addDisabledFlags(FLAG_OVERVIEW_DISABLED_OUT_OF_RANGE); mOverviewProgressRange = new FloatRange(); mOverviewProgressRange.start = mLauncher.isInState(NORMAL) ? MIN_PROGRESS_TO_OVERVIEW : 1 - MAX_PROGRESS_TO_OVERVIEW; mOverviewProgressRange.end = mOverviewProgressRange.start + MAX_PROGRESS_TO_OVERVIEW - MIN_PROGRESS_TO_OVERVIEW; // Build current animation mToState = mLauncher.isInState(ALL_APPS) ? NORMAL : ALL_APPS; mTaggedAnimatorSetBuilder = new TaggedAnimatorSetBuilder(); mCurrentAnimation = mLauncher.getStateManager().createAnimationToNewWorkspace( mToState, mTaggedAnimatorSetBuilder, maxAccuracy); Loading @@ -235,6 +252,9 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter } else { mCurrentAnimation.pause(); mStartProgress = mCurrentAnimation.getProgressFraction(); mDragPauseDetector.clearDisabledFlags(FLAG_OVERVIEW_DISABLED_FLING); updatePauseDetectorRangeFlag(); } for (SpringAnimationHandler h : mSpringHandlers) { Loading @@ -248,13 +268,23 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter @Override public boolean onDrag(float displacement, float velocity) { mDragPauseDetector.onDrag(displacement, velocity); float deltaProgress = mProgressMultiplier * displacement; mCurrentAnimation.setPlayFraction(deltaProgress + mStartProgress); updatePauseDetectorRangeFlag(); mDragPauseDetector.onDrag(velocity); return true; } private void updatePauseDetectorRangeFlag() { if (mOverviewProgressRange.contains(mCurrentAnimation.getProgressFraction())) { mDragPauseDetector.clearDisabledFlags(FLAG_OVERVIEW_DISABLED_OUT_OF_RANGE); } else { mDragPauseDetector.addDisabledFlags(FLAG_OVERVIEW_DISABLED_OUT_OF_RANGE); } } @Override public void onDragEnd(float velocity, boolean fling) { if (!fling && mDragPauseDetector.isEnabled() && mDragPauseDetector.isTriggered()) { Loading @@ -262,6 +292,8 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter return; } mDragPauseDetector.addDisabledFlags(FLAG_OVERVIEW_DISABLED_FLING); final long animationDuration; final int logAction; final LauncherState targetState; Loading Loading @@ -306,9 +338,6 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter anim.setDuration(animationDuration); anim.setInterpolator(scrollInterpolatorForVelocity(velocity)); anim.start(); // TODO: Re-enable later mDragPauseDetector.setEnabled(false); } private void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { Loading Loading @@ -413,7 +442,7 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter mCurrentAnimation = null; mTaggedAnimatorSetBuilder = null; if (mDragPauseDetector != null) { mDragPauseDetector.setEnabled(false); mDragPauseDetector.addDisabledFlags(FLAG_OVERVIEW_DISABLED_CANCEL_STATE); } mDragPauseDetector = null; Loading src/com/android/launcher3/util/FloatRange.java 0 → 100644 +39 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.util; /** * A mutable class for describing the range of two int values. */ public class FloatRange { public float start, end; public FloatRange() { } public FloatRange(float s, float e) { set(s, e); } public void set(float s, float e) { start = s; end = e; } public boolean contains(float value) { return value >= start && value <= end; } } Loading
quickstep/src/com/android/launcher3/uioverrides/DragPauseDetector.java +25 −13 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ public class DragPauseDetector implements OnAlarmListener { private final Alarm mAlarm; private final Runnable mOnPauseCallback; private boolean mEnabled = true; private boolean mTriggered = false; private int mDisabledFlags = 0; public DragPauseDetector(Runnable onPauseCallback) { mOnPauseCallback = onPauseCallback; Loading @@ -40,8 +40,8 @@ public class DragPauseDetector implements OnAlarmListener { mAlarm.setAlarm(PAUSE_DURATION); } public void onDrag(float displacement, float velocity) { if (mTriggered || !mEnabled) { public void onDrag(float velocity) { if (mTriggered || !isEnabled()) { return; } Loading @@ -53,7 +53,7 @@ public class DragPauseDetector implements OnAlarmListener { @Override public void onAlarm(Alarm alarm) { if (!mTriggered && mEnabled) { if (!mTriggered && isEnabled()) { mTriggered = true; mOnPauseCallback.run(); } Loading @@ -64,17 +64,29 @@ public class DragPauseDetector implements OnAlarmListener { } public boolean isEnabled() { return mEnabled; return mDisabledFlags == 0; } public void setEnabled(boolean isEnabled) { if (mEnabled != isEnabled) { mEnabled = isEnabled; if (isEnabled && !mTriggered) { public void addDisabledFlags(int flags) { boolean wasEnabled = isEnabled(); mDisabledFlags |= flags; resetAlarm(wasEnabled); } public void clearDisabledFlags(int flags) { boolean wasEnabled = isEnabled(); mDisabledFlags &= ~flags; resetAlarm(wasEnabled); } private void resetAlarm(boolean wasEnabled) { boolean isEnabled = isEnabled(); if (wasEnabled == isEnabled) { // Nothing has changed } if (isEnabled && !mTriggered) { mAlarm.setAlarm(PAUSE_DURATION); } else if (!isEnabled) { mAlarm.cancelAlarm(); } } } }
quickstep/src/com/android/launcher3/uioverrides/TwoStepSwipeController.java +36 −7 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.FloatRange; import com.android.launcher3.util.TouchController; import java.util.ArrayList; Loading Loading @@ -78,6 +79,14 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter */ private static final int OTHER_HANDLERS_START_INDEX = SWIPE_HANDLER_INDEX + 1; // Swipe progress range (when starting from NORMAL state) where OVERVIEW state is allowed private static final float MIN_PROGRESS_TO_OVERVIEW = 0.1f; private static final float MAX_PROGRESS_TO_OVERVIEW = 0.4f; private static final int FLAG_OVERVIEW_DISABLED_OUT_OF_RANGE = 1 << 0; private static final int FLAG_OVERVIEW_DISABLED_FLING = 1 << 1; private static final int FLAG_OVERVIEW_DISABLED_CANCEL_STATE = 1 << 2; private final Launcher mLauncher; private final SwipeDetector mDetector; Loading @@ -85,6 +94,7 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter private int mStartContainerType; private DragPauseDetector mDragPauseDetector; private FloatRange mOverviewProgressRange; private TaggedAnimatorSetBuilder mTaggedAnimatorSetBuilder; private AnimatorSet mQuickOverviewAnimation; private boolean mAnimatingToOverview; Loading Loading @@ -221,10 +231,17 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter long maxAccuracy = (long) (2 * range); mDragPauseDetector = new DragPauseDetector(this::onDragPauseDetected); mTaggedAnimatorSetBuilder = new TaggedAnimatorSetBuilder(); mDragPauseDetector.addDisabledFlags(FLAG_OVERVIEW_DISABLED_OUT_OF_RANGE); mOverviewProgressRange = new FloatRange(); mOverviewProgressRange.start = mLauncher.isInState(NORMAL) ? MIN_PROGRESS_TO_OVERVIEW : 1 - MAX_PROGRESS_TO_OVERVIEW; mOverviewProgressRange.end = mOverviewProgressRange.start + MAX_PROGRESS_TO_OVERVIEW - MIN_PROGRESS_TO_OVERVIEW; // Build current animation mToState = mLauncher.isInState(ALL_APPS) ? NORMAL : ALL_APPS; mTaggedAnimatorSetBuilder = new TaggedAnimatorSetBuilder(); mCurrentAnimation = mLauncher.getStateManager().createAnimationToNewWorkspace( mToState, mTaggedAnimatorSetBuilder, maxAccuracy); Loading @@ -235,6 +252,9 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter } else { mCurrentAnimation.pause(); mStartProgress = mCurrentAnimation.getProgressFraction(); mDragPauseDetector.clearDisabledFlags(FLAG_OVERVIEW_DISABLED_FLING); updatePauseDetectorRangeFlag(); } for (SpringAnimationHandler h : mSpringHandlers) { Loading @@ -248,13 +268,23 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter @Override public boolean onDrag(float displacement, float velocity) { mDragPauseDetector.onDrag(displacement, velocity); float deltaProgress = mProgressMultiplier * displacement; mCurrentAnimation.setPlayFraction(deltaProgress + mStartProgress); updatePauseDetectorRangeFlag(); mDragPauseDetector.onDrag(velocity); return true; } private void updatePauseDetectorRangeFlag() { if (mOverviewProgressRange.contains(mCurrentAnimation.getProgressFraction())) { mDragPauseDetector.clearDisabledFlags(FLAG_OVERVIEW_DISABLED_OUT_OF_RANGE); } else { mDragPauseDetector.addDisabledFlags(FLAG_OVERVIEW_DISABLED_OUT_OF_RANGE); } } @Override public void onDragEnd(float velocity, boolean fling) { if (!fling && mDragPauseDetector.isEnabled() && mDragPauseDetector.isTriggered()) { Loading @@ -262,6 +292,8 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter return; } mDragPauseDetector.addDisabledFlags(FLAG_OVERVIEW_DISABLED_FLING); final long animationDuration; final int logAction; final LauncherState targetState; Loading Loading @@ -306,9 +338,6 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter anim.setDuration(animationDuration); anim.setInterpolator(scrollInterpolatorForVelocity(velocity)); anim.start(); // TODO: Re-enable later mDragPauseDetector.setEnabled(false); } private void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { Loading Loading @@ -413,7 +442,7 @@ public class TwoStepSwipeController extends AnimatorListenerAdapter mCurrentAnimation = null; mTaggedAnimatorSetBuilder = null; if (mDragPauseDetector != null) { mDragPauseDetector.setEnabled(false); mDragPauseDetector.addDisabledFlags(FLAG_OVERVIEW_DISABLED_CANCEL_STATE); } mDragPauseDetector = null; Loading
src/com/android/launcher3/util/FloatRange.java 0 → 100644 +39 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.util; /** * A mutable class for describing the range of two int values. */ public class FloatRange { public float start, end; public FloatRange() { } public FloatRange(float s, float e) { set(s, e); } public void set(float s, float e) { start = s; end = e; } public boolean contains(float value) { return value >= start && value <= end; } }