From 9ceae570958ebc93ad8db3d00f72eefba34ba05e Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 4 Nov 2021 16:53:59 -0700 Subject: [PATCH] Add support for dark tint on taskbar nav buttons Tint the buttons when taskbar isn't drawing a background (either due to alpha or offset). Test: Dark icons on a light wallpaper on home screen, dark icons when light IME is showing Bug: 204256643 Change-Id: Iae634a1b604f50edc102905abd0d812a43c5346e --- .../taskbar_icon_click_feedback_roundrect.xml | 2 +- quickstep/res/layout/taskbar_nav_button.xml | 5 ++- quickstep/res/values/colors.xml | 10 +++--- .../taskbar/NavbarButtonsViewController.java | 35 ++++++++++++++++--- .../taskbar/TaskbarActivityContext.java | 9 +++-- .../taskbar/TaskbarDragLayerController.java | 21 +++++++++-- .../launcher3/taskbar/TaskbarManager.java | 7 +++- .../quickstep/TouchInteractionService.java | 6 ++++ 8 files changed, 78 insertions(+), 17 deletions(-) diff --git a/quickstep/res/drawable/taskbar_icon_click_feedback_roundrect.xml b/quickstep/res/drawable/taskbar_icon_click_feedback_roundrect.xml index d6160def0f..534f241ae9 100644 --- a/quickstep/res/drawable/taskbar_icon_click_feedback_roundrect.xml +++ b/quickstep/res/drawable/taskbar_icon_click_feedback_roundrect.xml @@ -16,7 +16,7 @@ --> + android:color="@color/taskbar_nav_icon_selection_ripple"> diff --git a/quickstep/res/layout/taskbar_nav_button.xml b/quickstep/res/layout/taskbar_nav_button.xml index 4ffb8d81dc..aea4885d15 100644 --- a/quickstep/res/layout/taskbar_nav_button.xml +++ b/quickstep/res/layout/taskbar_nav_button.xml @@ -15,7 +15,10 @@ --> \ No newline at end of file + android:scaleType="center" + android:tint="@color/taskbar_nav_icon_light_color" + tools:ignore="UseAppTint" /> \ No newline at end of file diff --git a/quickstep/res/values/colors.xml b/quickstep/res/values/colors.xml index f237d26aa6..671a617f01 100644 --- a/quickstep/res/values/colors.xml +++ b/quickstep/res/values/colors.xml @@ -25,14 +25,14 @@ @color/overview_scrim_dark - #E0E0E0 - + #E0E0E0 + #ffffff + + #99000000 #EBffffff #99000000 - #FFF - #99000000 - #FFFFFFFF diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index 4b6dacd95e..787aa19410 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -15,8 +15,6 @@ */ package com.android.launcher3.taskbar; -import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; - import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y_LONG_CLICK; @@ -36,11 +34,11 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_N import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; +import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; import android.annotation.DrawableRes; import android.annotation.IdRes; import android.annotation.LayoutRes; -import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Rect; import android.graphics.Region; @@ -94,7 +92,7 @@ public class NavbarButtonsViewController { private View.OnLongClickListener mA11yLongClickListener; private final ArrayList mPropertyHolders = new ArrayList<>(); - private final ArrayList mAllButtons = new ArrayList<>(); + private final ArrayList mAllButtons = new ArrayList<>(); private int mState; private final TaskbarActivityContext mContext; @@ -103,11 +101,17 @@ public class NavbarButtonsViewController { // Used for IME+A11Y buttons private final ViewGroup mEndContextualContainer; private final ViewGroup mStartContextualContainer; + private final int mLightIconColor; + private final int mDarkIconColor; private final AnimatedFloat mTaskbarNavButtonTranslationY = new AnimatedFloat( this::updateNavButtonTranslationY); private final AnimatedFloat mNavButtonTranslationYMultiplier = new AnimatedFloat( this::updateNavButtonTranslationY); + private final AnimatedFloat mTaskbarNavButtonDarkIntensity = new AnimatedFloat( + this::updateNavButtonDarkIntensity); + private final AnimatedFloat mNavButtonDarkIntensityMultiplier = new AnimatedFloat( + this::updateNavButtonDarkIntensity); private final RotationButtonListener mRotationButtonListener = new RotationButtonListener(); private final Rect mFloatingRotationButtonBounds = new Rect(); @@ -125,6 +129,9 @@ public class NavbarButtonsViewController { mNavButtonContainer = mNavButtonsView.findViewById(R.id.end_nav_buttons); mEndContextualContainer = mNavButtonsView.findViewById(R.id.end_contextual_buttons); mStartContextualContainer = mNavButtonsView.findViewById(R.id.start_contextual_buttons); + + mLightIconColor = context.getColor(R.color.taskbar_nav_icon_light_color); + mDarkIconColor = context.getColor(R.color.taskbar_nav_icon_dark_color); } /** @@ -379,6 +386,16 @@ public class NavbarButtonsViewController { return mTaskbarNavButtonTranslationY; } + /** Use to set the dark intensity for the all nav+contextual buttons */ + public AnimatedFloat getTaskbarNavButtonDarkIntensity() { + return mTaskbarNavButtonDarkIntensity; + } + + /** Use to determine whether to use the dark intensity requested by the underlying app */ + public AnimatedFloat getNavButtonDarkIntensityMultiplier() { + return mNavButtonDarkIntensityMultiplier; + } + /** * Does not call {@link #applyState()}. Don't forget to! */ @@ -402,6 +419,16 @@ public class NavbarButtonsViewController { * mNavButtonTranslationYMultiplier.value); } + private void updateNavButtonDarkIntensity() { + float darkIntensity = mTaskbarNavButtonDarkIntensity.value + * mNavButtonDarkIntensityMultiplier.value; + int iconColor = (int) ArgbEvaluator.getInstance().evaluate(darkIntensity, mLightIconColor, + mDarkIconColor); + for (ImageView button : mAllButtons) { + button.setImageTintList(ColorStateList.valueOf(iconColor)); + } + } + private ImageView addButton(@DrawableRes int drawableId, @TaskbarButton int buttonType, ViewGroup parent, TaskbarNavButtonController navButtonController, @IdRes int id) { return addButton(drawableId, buttonType, parent, navButtonController, id, diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index cc83431bf4..5354232e05 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -151,8 +151,8 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ buttonController, new NavbarButtonsViewController(this, navButtonsView), new RotationButtonController(this, - c.getColor(R.color.rotation_button_light_color), - c.getColor(R.color.rotation_button_dark_color), + c.getColor(R.color.taskbar_nav_icon_light_color), + c.getColor(R.color.taskbar_nav_icon_dark_color), R.drawable.ic_sysbar_rotate_button_ccw_start_0, R.drawable.ic_sysbar_rotate_button_ccw_start_90, R.drawable.ic_sysbar_rotate_button_cw_start_0, @@ -394,6 +394,11 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ mControllers.rotationButtonController.onBehaviorChanged(displayId, behavior); } + public void onNavButtonsDarkIntensityChanged(float darkIntensity) { + mControllers.navbarButtonsViewController.getTaskbarNavButtonDarkIntensity() + .updateValue(darkIntensity); + } + /** * Updates the TaskbarContainer to MATCH_PARENT vs original Taskbar size. */ diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java index 8c6185cb0f..968a64cf14 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java @@ -52,6 +52,9 @@ public class TaskbarDragLayerController { // Initialized in init. private TaskbarControllers mControllers; + private AnimatedFloat mNavButtonDarkIntensityMultiplier; + + private float mLastSetBackgroundAlpha; public TaskbarDragLayerController(TaskbarActivityContext activity, TaskbarDragLayer taskbarDragLayer) { @@ -65,6 +68,9 @@ public class TaskbarDragLayerController { mControllers = controllers; mTaskbarDragLayer.init(new TaskbarDragLayerCallbacks()); + mNavButtonDarkIntensityMultiplier = mControllers.navbarButtonsViewController + .getNavButtonDarkIntensityMultiplier(); + mBgTaskbar.value = 1; mKeyguardBgTaskbar.value = 1; mNotificationShadeBgTaskbar.value = 1; @@ -114,13 +120,22 @@ public class TaskbarDragLayerController { final float bgNavbar = mBgNavbar.value; final float bgTaskbar = mBgTaskbar.value * mKeyguardBgTaskbar.value * mNotificationShadeBgTaskbar.value; - mTaskbarDragLayer.setTaskbarBackgroundAlpha( - mBgOverride.value * Math.max(bgNavbar, bgTaskbar) - ); + mLastSetBackgroundAlpha = mBgOverride.value * Math.max(bgNavbar, bgTaskbar); + mTaskbarDragLayer.setTaskbarBackgroundAlpha(mLastSetBackgroundAlpha); + + updateNavBarDarkIntensityMultiplier(); } private void updateBackgroundOffset() { mTaskbarDragLayer.setTaskbarBackgroundOffset(mBgOffset.value); + + updateNavBarDarkIntensityMultiplier(); + } + + private void updateNavBarDarkIntensityMultiplier() { + // Zero out the app-requested dark intensity when we're drawing our own background. + float effectiveBgAlpha = mLastSetBackgroundAlpha * (1 - mBgOffset.value); + mNavButtonDarkIntensityMultiplier.updateValue(1 - effectiveBgAlpha); } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index b2b078cb4f..6b7c597b45 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -42,7 +42,6 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.statemanager.StatefulActivity; -import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.SettingsCache; @@ -269,6 +268,12 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen } } + public void onNavButtonsDarkIntensityChanged(float darkIntensity) { + if (mTaskbarActivityContext != null) { + mTaskbarActivityContext.onNavButtonsDarkIntensityChanged(darkIntensity); + } + } + /** * Called when the manager is no longer needed */ diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 377edbed5c..bda5a3044c 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -289,6 +289,12 @@ public class TouchInteractionService extends Service .onSystemBarAttributesChanged(displayId, behavior)); } + @Override + public void onNavButtonsDarkIntensityChanged(float darkIntensity) { + executeForTaskbarManager(() -> mTaskbarManager + .onNavButtonsDarkIntensityChanged(darkIntensity)); + } + private void executeForTaskbarManager(final Runnable r) { MAIN_EXECUTOR.execute(() -> { if (mTaskbarManager == null) {