Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 635e180e authored by Tony Wickham's avatar Tony Wickham
Browse files

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
parent f5ce2f62
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
@@ -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);
                }
            }
+29 −1
Original line number Diff line number Diff line
@@ -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);
    }
@@ -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;

+12 −1
Original line number Diff line number Diff line
@@ -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)
        );
    }

+1 −0
Original line number Diff line number Diff line
@@ -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;
            }
+2 −0
Original line number Diff line number Diff line
@@ -33,4 +33,6 @@ public class TaskbarUIController {
    }

    protected void updateContentInsets(Rect outContentInsets) { }

    protected void onStashedInAppChanged() { }
}
Loading