| /* |
| * Copyright (C) 2016 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; |
| |
| /** |
| * Keeps track of when thresholds are passed during a pinch gesture, |
| * used to inform {@link PinchAnimationManager} throughout. |
| * |
| * @see PinchToOverviewListener |
| * @see PinchAnimationManager |
| */ |
| public class PinchThresholdManager { |
| public static final float THRESHOLD_ZERO = 0.0f; |
| public static final float THRESHOLD_ONE = 0.40f; |
| public static final float THRESHOLD_TWO = 0.70f; |
| public static final float THRESHOLD_THREE = 0.95f; |
| |
| private Workspace mWorkspace; |
| |
| private float mPassedThreshold = THRESHOLD_ZERO; |
| |
| public PinchThresholdManager(Workspace workspace) { |
| mWorkspace = workspace; |
| } |
| |
| /** |
| * Uses the pinch progress to determine whether a threshold has been passed, |
| * and asks the {@param animationManager} to animate if so. |
| * @param progress From 0 to 1, where 0 is overview and 1 is workspace. |
| * @param animationManager Animates the threshold change if one is passed. |
| * @return The last passed threshold, one of |
| * {@link PinchThresholdManager#THRESHOLD_ZERO}, |
| * {@link PinchThresholdManager#THRESHOLD_ONE}, |
| * {@link PinchThresholdManager#THRESHOLD_TWO}, or |
| * {@link PinchThresholdManager#THRESHOLD_THREE} |
| */ |
| public float updateAndAnimatePassedThreshold(float progress, |
| PinchAnimationManager animationManager) { |
| if (!mWorkspace.isInOverviewMode()) { |
| // Invert the progress, because going from workspace to overview is 1 to 0. |
| progress = 1f - progress; |
| } |
| |
| float previousPassedThreshold = mPassedThreshold; |
| |
| if (progress < THRESHOLD_ONE) { |
| mPassedThreshold = THRESHOLD_ZERO; |
| } else if (progress < THRESHOLD_TWO) { |
| mPassedThreshold = THRESHOLD_ONE; |
| } else if (progress < THRESHOLD_THREE) { |
| mPassedThreshold = THRESHOLD_TWO; |
| } else { |
| mPassedThreshold = THRESHOLD_THREE; |
| } |
| |
| if (mPassedThreshold != previousPassedThreshold) { |
| Workspace.State fromState = mWorkspace.isInOverviewMode() ? Workspace.State.OVERVIEW |
| : Workspace.State.NORMAL; |
| Workspace.State toState = mWorkspace.isInOverviewMode() ? Workspace.State.NORMAL |
| : Workspace.State.OVERVIEW; |
| float thresholdToAnimate = mPassedThreshold; |
| if (mPassedThreshold < previousPassedThreshold) { |
| // User reversed pinch, so heading back to the state that they started from. |
| toState = fromState; |
| thresholdToAnimate = previousPassedThreshold; |
| } |
| animationManager.animateThreshold(thresholdToAnimate, fromState, toState); |
| } |
| return mPassedThreshold; |
| } |
| |
| public float getPassedThreshold() { |
| return mPassedThreshold; |
| } |
| |
| public void reset() { |
| mPassedThreshold = THRESHOLD_ZERO; |
| } |
| } |