diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index a90af046e3..1c345a6aa4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -116,6 +116,11 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT private static final int FLAG_SCREEN_PINNING_ACTIVE = 1 << 11; private static final int FLAG_VOICE_INTERACTION_WINDOW_SHOWING = 1 << 12; private static final int FLAG_SMALL_SCREEN = 1 << 13; + private static final int FLAG_SLIDE_IN_VIEW_VISIBLE = 1 << 14; + + /** Flags where a UI could be over a slide in view, so the color override should be disabled. */ + private static final int FLAGS_SLIDE_IN_VIEW_ICON_COLOR_OVERRIDE_DISABLED = + FLAG_NOTIFICATION_SHADE_EXPANDED | FLAG_VOICE_INTERACTION_WINDOW_SHOWING; private static final String NAV_BUTTONS_SEPARATE_WINDOW_TITLE = "Taskbar Nav Buttons"; @@ -135,6 +140,8 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT private final ViewGroup mStartContextualContainer; private final int mLightIconColor; private final int mDarkIconColor; + /** Color to use for navigation bar buttons, if a slide in view is visible. */ + private final int mSlideInViewIconColor; private final AnimatedFloat mTaskbarNavButtonTranslationY = new AnimatedFloat( this::updateNavButtonTranslationY); @@ -149,6 +156,9 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT this::updateNavButtonDarkIntensity); private final AnimatedFloat mNavButtonDarkIntensityMultiplier = new AnimatedFloat( this::updateNavButtonDarkIntensity); + /** Overrides the navigation button color to {@code mSlideInViewIconColor} when {@code 1}. */ + private final AnimatedFloat mSlideInViewNavButtonColorOverride = new AnimatedFloat( + this::updateNavButtonDarkIntensity); private final RotationButtonListener mRotationButtonListener = new RotationButtonListener(); private final Rect mFloatingRotationButtonBounds = new Rect(); @@ -180,6 +190,8 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT mLightIconColor = context.getColor(R.color.taskbar_nav_icon_light_color); mDarkIconColor = context.getColor(R.color.taskbar_nav_icon_dark_color); + // Can precompute color since dark theme change recreates taskbar. + mSlideInViewIconColor = Utilities.isDarkTheme(context) ? mLightIconColor : mDarkIconColor; } /** @@ -243,6 +255,11 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT flags -> (flags & FLAG_IME_VISIBLE) != 0 && !isInKidsMode, AnimatedFloat.VALUE, transForIme, defaultButtonTransY)); + mPropertyHolders.add(new StatePropertyHolder( + mSlideInViewNavButtonColorOverride, + flags -> ((flags & FLAG_SLIDE_IN_VIEW_VISIBLE) != 0) + && ((flags & FLAGS_SLIDE_IN_VIEW_ICON_COLOR_OVERRIDE_DISABLED) == 0))); + if (alwaysShowButtons) { initButtons(mNavButtonContainer, mEndContextualContainer, mControllers.navButtonController); @@ -524,6 +541,12 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT applyState(); } + /** {@code true} if a slide in view is currently visible over taskbar. */ + public void setSlideInViewVisible(boolean isSlideInViewVisible) { + updateStateForFlag(FLAG_SLIDE_IN_VIEW_VISIBLE, isSlideInViewVisible); + applyState(); + } + /** * Returns true if IME bar is visible */ @@ -669,8 +692,11 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT private void updateNavButtonDarkIntensity() { float darkIntensity = mTaskbarNavButtonDarkIntensity.value * mNavButtonDarkIntensityMultiplier.value; - int iconColor = (int) ArgbEvaluator.getInstance().evaluate(darkIntensity, mLightIconColor, - mDarkIconColor); + ArgbEvaluator argbEvaluator = ArgbEvaluator.getInstance(); + int iconColor = (int) argbEvaluator.evaluate( + darkIntensity, mLightIconColor, mDarkIconColor); + iconColor = (int) argbEvaluator.evaluate( + mSlideInViewNavButtonColorOverride.value, iconColor, mSlideInViewIconColor); for (ImageView button : mAllButtons) { button.setImageTintList(ColorStateList.valueOf(iconColor)); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java index 32a3c10d87..454a2a4569 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java @@ -90,6 +90,9 @@ public class TaskbarEduController implements TaskbarControllers.LoggableTaskbarC mTaskbarEduView = (TaskbarEduView) mActivity.getLayoutInflater().inflate( R.layout.taskbar_edu, mActivity.getDragLayer(), false); mTaskbarEduView.init(new TaskbarEduCallbacks()); + mControllers.navbarButtonsViewController.setSlideInViewVisible(true); + mTaskbarEduView.setOnCloseBeginListener( + () -> mControllers.navbarButtonsViewController.setSlideInViewVisible(false)); mTaskbarEduView.addOnCloseListener(() -> mTaskbarEduView = null); mTaskbarEduView.show(); startAnim(createWaveAnim()); diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java index a1385c45c6..0372f67b75 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java @@ -41,6 +41,7 @@ import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.popup.PopupDataProvider; import com.android.launcher3.taskbar.BaseTaskbarContext; import com.android.launcher3.taskbar.TaskbarActivityContext; +import com.android.launcher3.taskbar.TaskbarControllers; import com.android.launcher3.taskbar.TaskbarDragController; import com.android.launcher3.taskbar.TaskbarStashController; import com.android.launcher3.testing.TestLogging; @@ -72,7 +73,7 @@ class TaskbarAllAppsContext extends BaseTaskbarContext { TaskbarAllAppsContext( TaskbarActivityContext taskbarContext, TaskbarAllAppsController windowController, - TaskbarStashController taskbarStashController) { + TaskbarControllers taskbarControllers) { super(taskbarContext.createWindowContext(TYPE_APPLICATION_OVERLAY, null)); mTaskbarContext = taskbarContext; mWindowController = windowController; @@ -86,9 +87,10 @@ class TaskbarAllAppsContext extends BaseTaskbarContext { this, slideInView, windowController, - taskbarStashController); + taskbarControllers); mAppsView = slideInView.getAppsView(); + TaskbarStashController taskbarStashController = taskbarControllers.taskbarStashController; mWillTaskbarBeVisuallyStashed = taskbarStashController.supportsVisualStashing(); mStashedTaskbarHeight = taskbarStashController.getStashedHeight(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java index 6c43e50156..1671a0f1d7 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java @@ -144,9 +144,7 @@ public final class TaskbarAllAppsController { // to catch invalid states. mControllers.getSharedState().allAppsVisible = true; - mAllAppsContext = new TaskbarAllAppsContext(mTaskbarContext, - this, - mControllers.taskbarStashController); + mAllAppsContext = new TaskbarAllAppsContext(mTaskbarContext, this, mControllers); mAllAppsContext.getDragController().init(mControllers); TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener); Optional.ofNullable(mAllAppsContext.getSystemService(WindowManager.class)) diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java index 0e62da3f63..9d48c8de89 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java @@ -30,13 +30,10 @@ import com.android.launcher3.Insettable; import com.android.launcher3.R; import com.android.launcher3.views.AbstractSlideInView; -import java.util.Optional; - /** Wrapper for taskbar all apps with slide-in behavior. */ public class TaskbarAllAppsSlideInView extends AbstractSlideInView implements Insettable, DeviceProfile.OnDeviceProfileChangeListener { private TaskbarAllAppsContainerView mAppsView; - private OnCloseListener mOnCloseBeginListener; private float mShiftRange; public TaskbarAllAppsSlideInView(Context context, AttributeSet attrs) { @@ -72,14 +69,8 @@ public class TaskbarAllAppsSlideInView extends AbstractSlideInView { + mNavbarButtonsViewController.setSlideInViewVisible(false); AbstractFloatingView.closeOpenContainer( mContext, AbstractFloatingView.TYPE_ACTION_POPUP); // Post in case view is closing due to gesture navigation. If a gesture is in progress, diff --git a/src/com/android/launcher3/views/AbstractSlideInView.java b/src/com/android/launcher3/views/AbstractSlideInView.java index 47503b118e..f73347a7b2 100644 --- a/src/com/android/launcher3/views/AbstractSlideInView.java +++ b/src/com/android/launcher3/views/AbstractSlideInView.java @@ -33,6 +33,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; +import androidx.annotation.Nullable; + import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Utilities; import com.android.launcher3.anim.Interpolators; @@ -41,6 +43,7 @@ import com.android.launcher3.touch.SingleAxisSwipeDetector; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * Extension of {@link AbstractFloatingView} with common methods for sliding in from bottom. @@ -79,6 +82,7 @@ public abstract class AbstractSlideInView protected float mTranslationShift = TRANSLATION_SHIFT_CLOSED; protected boolean mNoIntercept; + protected @Nullable OnCloseListener mOnCloseBeginListener; protected List mOnCloseListeners = new ArrayList<>(); public AbstractSlideInView(Context context, AttributeSet attrs, int defStyleAttr) { @@ -204,6 +208,11 @@ public abstract class AbstractSlideInView } } + /** Callback invoked when the view is beginning to close (e.g. close animation is started). */ + public void setOnCloseBeginListener(@Nullable OnCloseListener onCloseBeginListener) { + mOnCloseBeginListener = onCloseBeginListener; + } + /** Registers an {@link OnCloseListener}. */ public void addOnCloseListener(OnCloseListener listener) { mOnCloseListeners.add(listener); @@ -213,6 +222,8 @@ public abstract class AbstractSlideInView if (!mIsOpen) { return; } + Optional.ofNullable(mOnCloseBeginListener).ifPresent(OnCloseListener::onSlideInViewClosed); + if (!animate) { mOpenCloseAnimator.cancel(); setTranslationShift(TRANSLATION_SHIFT_CLOSED);