1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.launcher3.taskbar; 17 18 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED; 19 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_MANAGE_MENU_EXPANDED; 20 21 import android.animation.ObjectAnimator; 22 import android.view.animation.Interpolator; 23 import android.view.animation.PathInterpolator; 24 25 import com.android.launcher3.anim.AnimatedFloat; 26 import com.android.quickstep.SystemUiProxy; 27 28 import java.io.PrintWriter; 29 30 /** 31 * Handles properties/data collection, and passes the results to {@link TaskbarScrimView} to render. 32 */ 33 public class TaskbarScrimViewController implements TaskbarControllers.LoggableTaskbarController, 34 TaskbarControllers.BackgroundRendererController { 35 36 private static final float SCRIM_ALPHA = 0.6f; 37 38 private static final Interpolator SCRIM_ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f); 39 private static final Interpolator SCRIM_ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f); 40 41 private final TaskbarActivityContext mActivity; 42 private final TaskbarScrimView mScrimView; 43 44 // Alpha property for the scrim. 45 private final AnimatedFloat mScrimAlpha = new AnimatedFloat(this::updateScrimAlpha); 46 47 // Initialized in init. 48 private TaskbarControllers mControllers; 49 TaskbarScrimViewController(TaskbarActivityContext activity, TaskbarScrimView scrimView)50 public TaskbarScrimViewController(TaskbarActivityContext activity, TaskbarScrimView scrimView) { 51 mActivity = activity; 52 mScrimView = scrimView; 53 } 54 55 /** 56 * Initializes the controller 57 */ init(TaskbarControllers controllers)58 public void init(TaskbarControllers controllers) { 59 mControllers = controllers; 60 } 61 62 /** 63 * Updates the scrim state based on the flags. 64 */ updateStateForSysuiFlags(int stateFlags, boolean skipAnim)65 public void updateStateForSysuiFlags(int stateFlags, boolean skipAnim) { 66 final boolean bubblesExpanded = (stateFlags & SYSUI_STATE_BUBBLES_EXPANDED) != 0; 67 final boolean manageMenuExpanded = 68 (stateFlags & SYSUI_STATE_BUBBLES_MANAGE_MENU_EXPANDED) != 0; 69 final boolean showScrim = !mControllers.navbarButtonsViewController.isImeVisible() 70 && bubblesExpanded 71 && mControllers.taskbarStashController.isTaskbarVisibleAndNotStashing(); 72 final float scrimAlpha = manageMenuExpanded 73 // When manage menu shows there's the first scrim and second scrim so figure out 74 // what the total transparency would be. 75 ? (SCRIM_ALPHA + (SCRIM_ALPHA * (1 - SCRIM_ALPHA))) 76 : showScrim ? SCRIM_ALPHA : 0; 77 showScrim(showScrim, scrimAlpha, skipAnim); 78 } 79 showScrim(boolean showScrim, float alpha, boolean skipAnim)80 private void showScrim(boolean showScrim, float alpha, boolean skipAnim) { 81 mScrimView.setOnClickListener(showScrim ? (view) -> onClick() : null); 82 mScrimView.setClickable(showScrim); 83 ObjectAnimator anim = mScrimAlpha.animateToValue(showScrim ? alpha : 0); 84 anim.setInterpolator(showScrim ? SCRIM_ALPHA_IN : SCRIM_ALPHA_OUT); 85 anim.start(); 86 if (skipAnim) { 87 anim.end(); 88 } 89 } 90 updateScrimAlpha()91 private void updateScrimAlpha() { 92 mScrimView.setScrimAlpha(mScrimAlpha.value); 93 } 94 onClick()95 private void onClick() { 96 SystemUiProxy.INSTANCE.get(mActivity).onBackPressed(); 97 } 98 99 @Override setCornerRoundness(float cornerRoundness)100 public void setCornerRoundness(float cornerRoundness) { 101 mScrimView.setCornerRoundness(cornerRoundness); 102 } 103 104 @Override dumpLogs(String prefix, PrintWriter pw)105 public void dumpLogs(String prefix, PrintWriter pw) { 106 pw.println(prefix + "TaskbarScrimViewController:"); 107 108 pw.println(prefix + "\tmScrimAlpha.value=" + mScrimAlpha.value); 109 } 110 } 111