| /* |
| * Copyright (C) 2021 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.LauncherState.TASKBAR; |
| |
| import android.animation.Animator; |
| |
| import com.android.launcher3.BaseQuickstepLauncher; |
| import com.android.launcher3.Utilities; |
| import com.android.launcher3.taskbar.LauncherTaskbarUIController.TaskbarAnimationControllerCallbacks; |
| import com.android.quickstep.AnimatedFloat; |
| import com.android.quickstep.SystemUiProxy; |
| import com.android.systemui.shared.system.QuickStepContract; |
| |
| /** |
| * Works with TaskbarController to update the TaskbarView's visual properties based on factors such |
| * as LauncherState, whether Launcher is in the foreground, etc. |
| */ |
| public class TaskbarAnimationController { |
| |
| private static final long IME_VISIBILITY_ALPHA_DURATION = 120; |
| |
| private final BaseQuickstepLauncher mLauncher; |
| private final TaskbarAnimationControllerCallbacks mTaskbarCallbacks; |
| |
| // Background alpha. |
| private final AnimatedFloat mTaskbarBackgroundAlpha = new AnimatedFloat( |
| this::onTaskbarBackgroundAlphaChanged); |
| |
| // Overall visibility. |
| private final AnimatedFloat mTaskbarVisibilityAlphaForLauncherState = new AnimatedFloat( |
| this::updateVisibilityAlpha); |
| private final AnimatedFloat mTaskbarVisibilityAlphaForIme = new AnimatedFloat( |
| this::updateVisibilityAlphaForIme); |
| |
| // Scale. |
| private final AnimatedFloat mTaskbarScaleForLauncherState = new AnimatedFloat( |
| this::updateScale); |
| |
| // TranslationY. |
| private final AnimatedFloat mTaskbarTranslationYForLauncherState = new AnimatedFloat( |
| this::updateTranslationY); |
| |
| public TaskbarAnimationController(BaseQuickstepLauncher launcher, |
| TaskbarAnimationControllerCallbacks taskbarCallbacks) { |
| mLauncher = launcher; |
| mTaskbarCallbacks = taskbarCallbacks; |
| } |
| |
| protected void init() { |
| mTaskbarBackgroundAlpha.updateValue(mLauncher.hasBeenResumed() ? 0f : 1f); |
| boolean isVisibleForLauncherState = (mLauncher.getStateManager().getState() |
| .getVisibleElements(mLauncher) & TASKBAR) != 0; |
| mTaskbarVisibilityAlphaForLauncherState.updateValue(isVisibleForLauncherState ? 1f : 0f); |
| boolean isImeVisible = (SystemUiProxy.INSTANCE.get(mLauncher).getLastSystemUiStateFlags() |
| & QuickStepContract.SYSUI_STATE_IME_SHOWING) != 0; |
| mTaskbarVisibilityAlphaForIme.updateValue(isImeVisible ? 0f : 1f); |
| |
| onTaskbarBackgroundAlphaChanged(); |
| updateVisibilityAlpha(); |
| } |
| |
| protected void cleanup() { |
| setNavBarButtonAlpha(1f); |
| } |
| |
| protected AnimatedFloat getTaskbarVisibilityForLauncherState() { |
| return mTaskbarVisibilityAlphaForLauncherState; |
| } |
| |
| protected AnimatedFloat getTaskbarScaleForLauncherState() { |
| return mTaskbarScaleForLauncherState; |
| } |
| |
| protected AnimatedFloat getTaskbarTranslationYForLauncherState() { |
| return mTaskbarTranslationYForLauncherState; |
| } |
| |
| protected Animator createAnimToBackgroundAlpha(float toAlpha, long duration) { |
| return mTaskbarBackgroundAlpha.animateToValue(mTaskbarBackgroundAlpha.value, toAlpha) |
| .setDuration(duration); |
| } |
| |
| protected void animateToVisibilityForIme(float toAlpha) { |
| mTaskbarVisibilityAlphaForIme.animateToValue(mTaskbarVisibilityAlphaForIme.value, toAlpha) |
| .setDuration(IME_VISIBILITY_ALPHA_DURATION).start(); |
| } |
| |
| private void onTaskbarBackgroundAlphaChanged() { |
| mTaskbarCallbacks.updateTaskbarBackgroundAlpha(mTaskbarBackgroundAlpha.value); |
| updateVisibilityAlpha(); |
| updateScale(); |
| updateTranslationY(); |
| } |
| |
| private void updateVisibilityAlpha() { |
| // We use mTaskbarBackgroundAlpha as a proxy for whether Launcher is resumed/paused, the |
| // assumption being that Taskbar should always be visible regardless of the current |
| // LauncherState if Launcher is paused. |
| float alphaDueToIme = mTaskbarVisibilityAlphaForIme.value; |
| float alphaDueToLauncher = Math.max(mTaskbarBackgroundAlpha.value, |
| mTaskbarVisibilityAlphaForLauncherState.value); |
| float taskbarAlpha = alphaDueToLauncher * alphaDueToIme; |
| mTaskbarCallbacks.updateTaskbarVisibilityAlpha(taskbarAlpha); |
| |
| // Make the nav bar invisible if taskbar is visible. |
| setNavBarButtonAlpha(1f - taskbarAlpha); |
| } |
| |
| private void updateVisibilityAlphaForIme() { |
| updateVisibilityAlpha(); |
| float taskbarAlphaDueToIme = mTaskbarVisibilityAlphaForIme.value; |
| mTaskbarCallbacks.updateImeBarVisibilityAlpha(1f - taskbarAlphaDueToIme); |
| } |
| |
| private void updateScale() { |
| // We use mTaskbarBackgroundAlpha as a proxy for whether Launcher is resumed/paused, the |
| // assumption being that Taskbar should always be at scale 1f regardless of the current |
| // LauncherState if Launcher is paused. |
| float scale = mTaskbarScaleForLauncherState.value; |
| scale = Utilities.mapRange(mTaskbarBackgroundAlpha.value, scale, 1f); |
| mTaskbarCallbacks.updateTaskbarScale(scale); |
| } |
| |
| private void updateTranslationY() { |
| // We use mTaskbarBackgroundAlpha as a proxy for whether Launcher is resumed/paused, the |
| // assumption being that Taskbar should always be at translationY 0f regardless of the |
| // current LauncherState if Launcher is paused. |
| float translationY = mTaskbarTranslationYForLauncherState.value; |
| translationY = Utilities.mapRange(mTaskbarBackgroundAlpha.value, translationY, 0f); |
| mTaskbarCallbacks.updateTaskbarTranslationY(translationY); |
| } |
| |
| private void setNavBarButtonAlpha(float navBarAlpha) { |
| SystemUiProxy.INSTANCE.get(mLauncher).setNavBarButtonAlpha(navBarAlpha, false); |
| } |
| } |