diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 2da8a45a3b..d41590b10b 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -85,6 +85,7 @@ import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.statehandlers.DepthController; +import com.android.launcher3.taskbar.LauncherTaskbarUIController; import com.android.launcher3.util.ActivityOptionsWrapper; import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.launcher3.util.RunnableList; @@ -427,6 +428,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener 4 - rotationChange); } } + // TODO(b/196637509): don't do this for immersive apps. + if (mDeviceProfile.isTaskbarPresentInApps) { + bounds.bottom -= mDeviceProfile.taskbarSize; + } return bounds; } @@ -511,7 +516,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final boolean scrimEnabled = ENABLE_SCRIM_FOR_APP_LAUNCH.get(); if (scrimEnabled) { - int scrimColor = Themes.getAttrColor(mLauncher, R.attr.overviewScrimColor); + boolean useTaskbarColor = mDeviceProfile.isTaskbarPresentInApps; + int scrimColor = useTaskbarColor + ? mLauncher.getResources().getColor(R.color.taskbar_background) + : Themes.getAttrColor(mLauncher, R.attr.overviewScrimColor); int scrimColorTrans = ColorUtils.setAlphaComponent(scrimColor, 0); int[] colors = isAppOpening ? new int[]{scrimColorTrans, scrimColor} @@ -524,6 +532,30 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener colors); scrim.setDuration(CONTENT_SCRIM_DURATION); scrim.setInterpolator(DEACCEL_1_5); + + if (useTaskbarColor) { + // Hide the taskbar background color since it would duplicate the scrim. + scrim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + LauncherTaskbarUIController taskbarUIController = + mLauncher.getTaskbarUIController(); + if (taskbarUIController != null) { + taskbarUIController.forceHideBackground(true); + } + } + + @Override + public void onAnimationEnd(Animator animation) { + LauncherTaskbarUIController taskbarUIController = + mLauncher.getTaskbarUIController(); + if (taskbarUIController != null) { + taskbarUIController.forceHideBackground(false); + } + } + }); + } + launcherAnimator.play(scrim); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 56c28f071e..95c7d6292c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -27,6 +27,7 @@ import android.view.MotionEvent; import androidx.annotation.NonNull; import com.android.launcher3.BaseQuickstepLauncher; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherState; import com.android.launcher3.QuickstepTransitionManager; import com.android.launcher3.R; @@ -58,9 +59,13 @@ public class LauncherTaskbarUIController extends TaskbarUIController { private final AnimatedFloat mIconAlignmentForGestureState = new AnimatedFloat(this::onIconAlignmentRatioChanged); + private final DeviceProfile.OnDeviceProfileChangeListener mOnDeviceProfileChangeListener = + this::onStashedInAppChanged; + // Initialized in init. private TaskbarControllers mControllers; private AnimatedFloat mTaskbarBackgroundAlpha; + private AnimatedFloat mTaskbarOverrideBackgroundAlpha; private AlphaProperty mIconAlphaForHome; private boolean mIsAnimatingToLauncherViaResume; private boolean mIsAnimatingToLauncherViaGesture; @@ -84,6 +89,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController { mTaskbarBackgroundAlpha = mControllers.taskbarDragLayerController .getTaskbarBackgroundAlpha(); + mTaskbarOverrideBackgroundAlpha = mControllers.taskbarDragLayerController + .getOverrideBackgroundAlpha(); MultiValueAlpha taskbarIconAlpha = mControllers.taskbarViewController.getTaskbarIconAlpha(); mIconAlphaForHome = taskbarIconAlpha.getProperty(ALPHA_INDEX_HOME); @@ -94,6 +101,9 @@ public class LauncherTaskbarUIController extends TaskbarUIController { onLauncherResumedOrPaused(mLauncher.hasBeenResumed()); mIconAlignmentForResumedState.finishAnimation(); onIconAlignmentRatioChanged(); + + onStashedInAppChanged(mLauncher.getDeviceProfile()); + mLauncher.addOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener); } @Override @@ -102,6 +112,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController { mIconAlignmentForResumedState.finishAnimation(); mIconAlignmentForGestureState.finishAnimation(); + mLauncher.removeOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener); mLauncher.getHotseat().setIconsAlpha(1f); mLauncher.setTaskbarUIController(null); } @@ -192,7 +203,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController { } private float getCurrentIconAlignmentRatio() { - return Math.max(mIconAlignmentForResumedState.value, mIconAlignmentForGestureState.value); + return Math.max(mIconAlignmentForResumedState.value, mIconAlignmentForGestureState.value); } private void onIconAlignmentRatioChanged() { @@ -233,6 +244,23 @@ public class LauncherTaskbarUIController extends TaskbarUIController { mLauncher.getHotseat().setIconsAlpha(isVisible ? 0f : 1f); } + @Override + protected void onStashedInAppChanged() { + onStashedInAppChanged(mLauncher.getDeviceProfile()); + } + + private void onStashedInAppChanged(DeviceProfile deviceProfile) { + boolean taskbarStashedInApps = mControllers.taskbarStashController.isStashedInApp(); + deviceProfile.isTaskbarPresentInApps = !taskbarStashedInApps; + } + + /** + * Sets whether the background behind the taskbar/nav bar should be hidden. + */ + public void forceHideBackground(boolean forceHide) { + mTaskbarOverrideBackgroundAlpha.updateValue(forceHide ? 0 : 1); + } + private final class TaskBarRecentsAnimationListener implements RecentsAnimationListener { private final RecentsAnimationCallbacks mCallbacks; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java index df89285c3f..14150b9e25 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java @@ -36,10 +36,14 @@ public class TaskbarDragLayerController { private final TaskbarActivityContext mActivity; private final TaskbarDragLayer mTaskbarDragLayer; private final int mFolderMargin; + // Alpha properties for taskbar background. private final AnimatedFloat mBgTaskbar = new AnimatedFloat(this::updateBackgroundAlpha); private final AnimatedFloat mBgNavbar = new AnimatedFloat(this::updateBackgroundAlpha); private final AnimatedFloat mKeyguardBgTaskbar = new AnimatedFloat(this::updateBackgroundAlpha); + // Used to hide our background color when someone else (e.g. ScrimView) is handling it. + private final AnimatedFloat mBgOverride = new AnimatedFloat(this::updateBackgroundAlpha); + // Translation property for taskbar background. private final AnimatedFloat mBgOffset = new AnimatedFloat(this::updateBackgroundOffset); @@ -58,6 +62,7 @@ public class TaskbarDragLayerController { mControllers = controllers; mTaskbarDragLayer.init(new TaskbarDragLayerCallbacks()); mKeyguardBgTaskbar.value = 1; + mBgOverride.value = 1; } public void onDestroy() { @@ -86,13 +91,19 @@ public class TaskbarDragLayerController { return mKeyguardBgTaskbar; } + public AnimatedFloat getOverrideBackgroundAlpha() { + return mBgOverride; + } + public AnimatedFloat getTaskbarBackgroundOffset() { return mBgOffset; } private void updateBackgroundAlpha() { + final float bgNavbar = mBgNavbar.value; + final float bgTaskbar = mBgTaskbar.value * mKeyguardBgTaskbar.value; mTaskbarDragLayer.setTaskbarBackgroundAlpha( - Math.max(mBgNavbar.value, mBgTaskbar.value * mKeyguardBgTaskbar.value) + mBgOverride.value * Math.max(bgNavbar, bgTaskbar) ); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 0efec5357a..949df8233a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -197,6 +197,7 @@ public class TaskbarStashController { if (wasStashed != isStashed) { SystemUiProxy.INSTANCE.get(mActivity) .notifyTaskbarStatus(/* visible */ true, /* stashed */ isStashed); + mControllers.uiController.onStashedInAppChanged(); createAnimToIsStashed(isStashed, TASKBAR_STASH_DURATION).start(); return true; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java index 260cedc706..df88e02d5e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java @@ -33,4 +33,6 @@ public class TaskbarUIController { } protected void updateContentInsets(Rect outContentInsets) { } + + protected void onStashedInAppChanged() { } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java b/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java index fe5a3475ff..4984b95720 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java @@ -23,6 +23,7 @@ import android.graphics.Color; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; +import com.android.launcher3.R; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.views.RecentsView; @@ -89,6 +90,10 @@ public class BackgroundAppState extends OverviewState { @Override public int getWorkspaceScrimColor(Launcher launcher) { + DeviceProfile dp = launcher.getDeviceProfile(); + if (dp.isTaskbarPresentInApps) { + return launcher.getColor(R.color.taskbar_background); + } return Color.TRANSPARENT; } diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index 624ade2304..571ffc23e5 100644 --- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java +++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java @@ -262,14 +262,14 @@ public abstract class BaseActivityInterface