From f5ce2f624db11b7d2153301ff387732ff43e95f4 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 16 Aug 2021 15:21:11 -0700 Subject: [PATCH 1/2] Use WindowBounds#insets instead of WindowInsets in DeviceProfile This reports more consistently and is cheaper. Test: Log windowBounds.insets.bottom vs windowInsets.getSystemWindowInsetBottom() and note that the former is correct after fold/unfold even though the latter starts reporting 0 Bug: 196874770 Change-Id: I41eb0ab51d3761a988e680cd6d61e40bcacf567f --- src/com/android/launcher3/DeviceProfile.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index eb058e8df4..9fb8167e3d 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -17,7 +17,6 @@ package com.android.launcher3; import static android.util.DisplayMetrics.DENSITY_DEVICE_STABLE; -import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static com.android.launcher3.ResourceUtils.pxFromDp; import static com.android.launcher3.Utilities.dpiFromPx; @@ -33,11 +32,8 @@ import android.graphics.Path; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; -import android.hardware.display.DisplayManager; import android.util.DisplayMetrics; import android.view.Surface; -import android.view.WindowInsets; -import android.view.WindowManager; import com.android.launcher3.CellLayout.ContainerType; import com.android.launcher3.DevicePaddings.DevicePadding; @@ -267,13 +263,7 @@ public class DeviceProfile { // Taskbar will be added later, but provides bottom insets that we should subtract // from availableHeightPx. taskbarSize = res.getDimensionPixelSize(R.dimen.taskbar_size); - WindowInsets windowInsets = - context.createWindowContext( - context.getSystemService(DisplayManager.class).getDisplay(mInfo.id), - TYPE_APPLICATION, null) - .getSystemService(WindowManager.class) - .getCurrentWindowMetrics().getWindowInsets(); - nonOverlappingTaskbarInset = taskbarSize - windowInsets.getSystemWindowInsetBottom(); + nonOverlappingTaskbarInset = taskbarSize - windowBounds.insets.bottom; if (nonOverlappingTaskbarInset > 0) { nonFinalAvailableHeightPx -= nonOverlappingTaskbarInset; } From 635e180e56df7d32322f1eb3f3eca2a01bf3381a Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 22 Jul 2021 14:28:04 -1000 Subject: [PATCH 2/2] Extend taskbar color to entire screen in overview Only when taskbar is unstashed in apps: - Scrim workspace with the taskbar color when opening apps and in BackgroundAppState - Crop opening apps to above the taskbar - Crop TaskViews to above the taskbar during gestures If taskbar is stashed in apps, behavior is the same as before, i.e. no scrim over the wallpaper and no cropping of tasks. Added a field DeviceProfile#taskbkarPresentInApps to distinguish these cases. LauncherTaskbarUIController and TaskbarStashController ensure this value is set appropriately. Test: Ensure tasks don't appear behind taskbar when it's unstashed; set ENABLE_SCRIM_FOR_APP_LAUNCH = true to test the whole screen scrimming when opening an app Bug: 196257194 Fixes: 190681228 Change-Id: I481501457a5a6d49c380feea3db3b4058e4cf3f8 --- .../launcher3/QuickstepTransitionManager.java | 34 ++++++++++++++++++- .../taskbar/LauncherTaskbarUIController.java | 30 +++++++++++++++- .../taskbar/TaskbarDragLayerController.java | 13 ++++++- .../taskbar/TaskbarStashController.java | 1 + .../taskbar/TaskbarUIController.java | 2 ++ .../states/BackgroundAppState.java | 5 +++ .../quickstep/BaseActivityInterface.java | 4 +-- .../quickstep/util/RecentsOrientedState.java | 2 +- .../quickstep/views/TaskThumbnailView.java | 14 ++++---- .../com/android/quickstep/views/TaskView.java | 16 ++++++--- src/com/android/launcher3/DeviceProfile.java | 3 ++ 11 files changed, 107 insertions(+), 17 deletions(-) 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