diff options
Diffstat (limited to 'quickstep/src/com/android/launcher3/taskbar/TaskbarVisibilityController.java')
-rw-r--r-- | quickstep/src/com/android/launcher3/taskbar/TaskbarVisibilityController.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarVisibilityController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarVisibilityController.java new file mode 100644 index 0000000000..4cf55d8771 --- /dev/null +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarVisibilityController.java @@ -0,0 +1,95 @@ +/* + * 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.quickstep.AnimatedFloat; +import com.android.quickstep.SystemUiProxy; +import com.android.systemui.shared.system.QuickStepContract; + +/** + * Works with TaskbarController to update the TaskbarView's alpha based on LauncherState, whether + * Launcher is in the foreground, etc. + */ +public class TaskbarVisibilityController { + + private static final long IME_VISIBILITY_ALPHA_DURATION = 120; + + private final BaseQuickstepLauncher mLauncher; + private final TaskbarController.TaskbarVisibilityControllerCallbacks mTaskbarCallbacks; + + // Background alpha. + private AnimatedFloat mTaskbarBackgroundAlpha = new AnimatedFloat( + this::onTaskbarBackgroundAlphaChanged); + + // Overall visibility. + private AnimatedFloat mTaskbarVisibilityAlphaForLauncherState = new AnimatedFloat( + this::updateVisibilityAlpha); + private AnimatedFloat mTaskbarVisibilityAlphaForIme = new AnimatedFloat( + this::updateVisibilityAlpha); + + public TaskbarVisibilityController(BaseQuickstepLauncher launcher, + TaskbarController.TaskbarVisibilityControllerCallbacks 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); + } + + protected void cleanup() { + } + + protected AnimatedFloat getTaskbarVisibilityForLauncherState() { + return mTaskbarVisibilityAlphaForLauncherState; + } + + 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(); + } + + 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 alphaDueToLauncher = Math.max(mTaskbarBackgroundAlpha.value, + mTaskbarVisibilityAlphaForLauncherState.value); + float alphaDueToOther = mTaskbarVisibilityAlphaForIme.value; + mTaskbarCallbacks.updateTaskbarVisibilityAlpha(alphaDueToLauncher * alphaDueToOther); + } +} |