Files
lawnchair/quickstep/src/com/android/launcher3/taskbar/TaskbarSpringOnStashController.java
Jon Miranda e30a551f93 Fix bug where unstash animation plays twice.
Fixes: 282056846
Change-Id: I372444684fafd246369f6bc1e77c5e6fbb651c6f
Flag: ENABLE_TRANSIENT_TASKBAR
Test: open app, then very quickly swipe to unstash taskbar
2023-05-12 16:27:57 -07:00

108 lines
3.7 KiB
Java

/*
* Copyright (C) 2023 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.taskbar;
import static com.android.launcher3.anim.AnimatedFloat.VALUE;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import androidx.annotation.Nullable;
import androidx.dynamicanimation.animation.SpringForce;
import com.android.launcher3.R;
import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.anim.SpringAnimationBuilder;
import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController;
import com.android.launcher3.util.DisplayController;
import java.io.PrintWriter;
/**
* Manages the spring animation when stashing the transient taskbar.
*/
public class TaskbarSpringOnStashController implements LoggableTaskbarController {
private final TaskbarActivityContext mContext;
private TaskbarControllers mControllers;
private final AnimatedFloat mTranslationForStash = new AnimatedFloat(
this::updateTranslationYForStash);
private final boolean mIsTransientTaskbar;
private final float mStartVelocityPxPerS;
public TaskbarSpringOnStashController(TaskbarActivityContext context) {
mContext = context;
mIsTransientTaskbar = DisplayController.isTransientTaskbar(mContext);
mStartVelocityPxPerS = context.getResources()
.getDimension(R.dimen.transient_taskbar_stash_spring_velocity_dp_per_s);
}
/**
* Initialization method.
*/
public void init(TaskbarControllers controllers) {
mControllers = controllers;
}
private void updateTranslationYForStash() {
if (!mIsTransientTaskbar) {
return;
}
float transY = mTranslationForStash.value;
mControllers.stashedHandleViewController.setTranslationYForStash(transY);
mControllers.taskbarViewController.setTranslationYForStash(transY);
mControllers.taskbarDragLayerController.setTranslationYForStash(transY);
}
/**
* Returns a spring animation to be used when stashing the transient taskbar.
*/
public @Nullable ValueAnimator createSpringToStash() {
if (!mIsTransientTaskbar) {
return null;
}
return new SpringAnimationBuilder(mContext)
.setStartValue(mTranslationForStash.value)
.setEndValue(0)
.setDampingRatio(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY)
.setStiffness(SpringForce.STIFFNESS_LOW)
.setStartVelocity(mStartVelocityPxPerS)
.build(mTranslationForStash, VALUE);
}
/**
* Returns an animation to reset the stash translation back to 0 when unstashing.
*/
public @Nullable ObjectAnimator createResetAnimForUnstash() {
if (!mIsTransientTaskbar) {
return null;
}
return mTranslationForStash.animateToValue(0);
}
@Override
public void dumpLogs(String prefix, PrintWriter pw) {
pw.println(prefix + "TaskbarSpringOnStashController:");
pw.println(prefix + "\tmTranslationForStash=" + mTranslationForStash.value);
pw.println(prefix + "\tmStartVelocityPxPerS=" + mStartVelocityPxPerS);
}
}