Merge "Fix LightBarController's dark/light logic for the Navigation Bar" into udc-dev
This commit is contained in:
@@ -128,6 +128,7 @@ import com.android.systemui.settings.UserTracker;
|
|||||||
import com.android.systemui.statusbar.NotificationShadeWindowController;
|
import com.android.systemui.statusbar.NotificationShadeWindowController;
|
||||||
import com.android.systemui.statusbar.VibratorHelper;
|
import com.android.systemui.statusbar.VibratorHelper;
|
||||||
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
||||||
|
import com.android.systemui.statusbar.phone.LightBarController;
|
||||||
import com.android.systemui.statusbar.phone.SystemUIDialog;
|
import com.android.systemui.statusbar.phone.SystemUIDialog;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||||
@@ -240,6 +241,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
private final ScreenshotHelper mScreenshotHelper;
|
private final ScreenshotHelper mScreenshotHelper;
|
||||||
private final SysuiColorExtractor mSysuiColorExtractor;
|
private final SysuiColorExtractor mSysuiColorExtractor;
|
||||||
private final IStatusBarService mStatusBarService;
|
private final IStatusBarService mStatusBarService;
|
||||||
|
protected final LightBarController mLightBarController;
|
||||||
protected final NotificationShadeWindowController mNotificationShadeWindowController;
|
protected final NotificationShadeWindowController mNotificationShadeWindowController;
|
||||||
private final IWindowManager mIWindowManager;
|
private final IWindowManager mIWindowManager;
|
||||||
private final Executor mBackgroundExecutor;
|
private final Executor mBackgroundExecutor;
|
||||||
@@ -349,6 +351,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
MetricsLogger metricsLogger,
|
MetricsLogger metricsLogger,
|
||||||
SysuiColorExtractor colorExtractor,
|
SysuiColorExtractor colorExtractor,
|
||||||
IStatusBarService statusBarService,
|
IStatusBarService statusBarService,
|
||||||
|
LightBarController lightBarController,
|
||||||
NotificationShadeWindowController notificationShadeWindowController,
|
NotificationShadeWindowController notificationShadeWindowController,
|
||||||
IWindowManager iWindowManager,
|
IWindowManager iWindowManager,
|
||||||
@Background Executor backgroundExecutor,
|
@Background Executor backgroundExecutor,
|
||||||
@@ -381,6 +384,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
mUiEventLogger = uiEventLogger;
|
mUiEventLogger = uiEventLogger;
|
||||||
mSysuiColorExtractor = colorExtractor;
|
mSysuiColorExtractor = colorExtractor;
|
||||||
mStatusBarService = statusBarService;
|
mStatusBarService = statusBarService;
|
||||||
|
mLightBarController = lightBarController;
|
||||||
mNotificationShadeWindowController = notificationShadeWindowController;
|
mNotificationShadeWindowController = notificationShadeWindowController;
|
||||||
mIWindowManager = iWindowManager;
|
mIWindowManager = iWindowManager;
|
||||||
mBackgroundExecutor = backgroundExecutor;
|
mBackgroundExecutor = backgroundExecutor;
|
||||||
@@ -694,6 +698,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
ActionsDialogLite dialog = new ActionsDialogLite(mContext,
|
ActionsDialogLite dialog = new ActionsDialogLite(mContext,
|
||||||
com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite,
|
com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite,
|
||||||
mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService,
|
mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService,
|
||||||
|
mLightBarController,
|
||||||
mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing,
|
mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing,
|
||||||
mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor,
|
mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor,
|
||||||
mLockPatternUtils);
|
mLockPatternUtils);
|
||||||
@@ -2192,6 +2197,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
protected final SysuiColorExtractor mColorExtractor;
|
protected final SysuiColorExtractor mColorExtractor;
|
||||||
private boolean mKeyguardShowing;
|
private boolean mKeyguardShowing;
|
||||||
protected float mScrimAlpha;
|
protected float mScrimAlpha;
|
||||||
|
protected final LightBarController mLightBarController;
|
||||||
protected final NotificationShadeWindowController mNotificationShadeWindowController;
|
protected final NotificationShadeWindowController mNotificationShadeWindowController;
|
||||||
private ListPopupWindow mOverflowPopup;
|
private ListPopupWindow mOverflowPopup;
|
||||||
private Dialog mPowerOptionsDialog;
|
private Dialog mPowerOptionsDialog;
|
||||||
@@ -2267,6 +2273,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
ActionsDialogLite(Context context, int themeRes, MyAdapter adapter,
|
ActionsDialogLite(Context context, int themeRes, MyAdapter adapter,
|
||||||
MyOverflowAdapter overflowAdapter,
|
MyOverflowAdapter overflowAdapter,
|
||||||
SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
|
SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
|
||||||
|
LightBarController lightBarController,
|
||||||
NotificationShadeWindowController notificationShadeWindowController,
|
NotificationShadeWindowController notificationShadeWindowController,
|
||||||
Runnable onRefreshCallback, boolean keyguardShowing,
|
Runnable onRefreshCallback, boolean keyguardShowing,
|
||||||
MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger,
|
MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger,
|
||||||
@@ -2282,6 +2289,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
mPowerOptionsAdapter = powerAdapter;
|
mPowerOptionsAdapter = powerAdapter;
|
||||||
mColorExtractor = sysuiColorExtractor;
|
mColorExtractor = sysuiColorExtractor;
|
||||||
mStatusBarService = statusBarService;
|
mStatusBarService = statusBarService;
|
||||||
|
mLightBarController = lightBarController;
|
||||||
mNotificationShadeWindowController = notificationShadeWindowController;
|
mNotificationShadeWindowController = notificationShadeWindowController;
|
||||||
mOnRefreshCallback = onRefreshCallback;
|
mOnRefreshCallback = onRefreshCallback;
|
||||||
mKeyguardShowing = keyguardShowing;
|
mKeyguardShowing = keyguardShowing;
|
||||||
@@ -2474,6 +2482,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
@Override
|
@Override
|
||||||
protected void start() {
|
protected void start() {
|
||||||
mGlobalActionsLayout.updateList();
|
mGlobalActionsLayout.updateList();
|
||||||
|
mLightBarController.setGlobalActionsVisible(true);
|
||||||
|
|
||||||
if (mBackgroundDrawable instanceof ScrimDrawable) {
|
if (mBackgroundDrawable instanceof ScrimDrawable) {
|
||||||
mColorExtractor.addOnColorsChangedListener(this);
|
mColorExtractor.addOnColorsChangedListener(this);
|
||||||
@@ -2504,6 +2513,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void stop() {
|
protected void stop() {
|
||||||
|
mLightBarController.setGlobalActionsVisible(false);
|
||||||
mColorExtractor.removeOnColorsChangedListener(this);
|
mColorExtractor.removeOnColorsChangedListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
|
|||||||
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
|
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
|
||||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
||||||
|
import com.android.systemui.statusbar.phone.LightBarController;
|
||||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
||||||
import com.android.systemui.statusbar.phone.ScrimController;
|
import com.android.systemui.statusbar.phone.ScrimController;
|
||||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||||
@@ -117,6 +118,7 @@ public class QuickSettingsController {
|
|||||||
private final PulseExpansionHandler mPulseExpansionHandler;
|
private final PulseExpansionHandler mPulseExpansionHandler;
|
||||||
private final ShadeExpansionStateManager mShadeExpansionStateManager;
|
private final ShadeExpansionStateManager mShadeExpansionStateManager;
|
||||||
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||||
|
private final LightBarController mLightBarController;
|
||||||
private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
|
private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
|
||||||
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
|
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
|
||||||
private final NotificationShadeDepthController mDepthController;
|
private final NotificationShadeDepthController mDepthController;
|
||||||
@@ -304,6 +306,7 @@ public class QuickSettingsController {
|
|||||||
NotificationRemoteInputManager remoteInputManager,
|
NotificationRemoteInputManager remoteInputManager,
|
||||||
ShadeExpansionStateManager shadeExpansionStateManager,
|
ShadeExpansionStateManager shadeExpansionStateManager,
|
||||||
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
|
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
|
||||||
|
LightBarController lightBarController,
|
||||||
NotificationStackScrollLayoutController notificationStackScrollLayoutController,
|
NotificationStackScrollLayoutController notificationStackScrollLayoutController,
|
||||||
LockscreenShadeTransitionController lockscreenShadeTransitionController,
|
LockscreenShadeTransitionController lockscreenShadeTransitionController,
|
||||||
NotificationShadeDepthController notificationShadeDepthController,
|
NotificationShadeDepthController notificationShadeDepthController,
|
||||||
@@ -346,6 +349,7 @@ public class QuickSettingsController {
|
|||||||
mRemoteInputManager = remoteInputManager;
|
mRemoteInputManager = remoteInputManager;
|
||||||
mShadeExpansionStateManager = shadeExpansionStateManager;
|
mShadeExpansionStateManager = shadeExpansionStateManager;
|
||||||
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
|
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
|
||||||
|
mLightBarController = lightBarController;
|
||||||
mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
|
mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
|
||||||
mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
|
mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
|
||||||
mDepthController = notificationShadeDepthController;
|
mDepthController = notificationShadeDepthController;
|
||||||
@@ -1018,6 +1022,9 @@ public class QuickSettingsController {
|
|||||||
mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction);
|
mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction);
|
||||||
mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction);
|
mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction);
|
||||||
mShadeHeaderController.setQsVisible(mVisible);
|
mShadeHeaderController.setQsVisible(mVisible);
|
||||||
|
|
||||||
|
// Update the light bar
|
||||||
|
mLightBarController.setQsExpanded(mFullyExpanded);
|
||||||
}
|
}
|
||||||
|
|
||||||
float getLockscreenShadeDragProgress() {
|
float getLockscreenShadeDragProgress() {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE
|
|||||||
import android.annotation.ColorInt;
|
import android.annotation.ColorInt;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.InsetsFlags;
|
import android.view.InsetsFlags;
|
||||||
import android.view.ViewDebug;
|
import android.view.ViewDebug;
|
||||||
import android.view.WindowInsetsController.Appearance;
|
import android.view.WindowInsetsController.Appearance;
|
||||||
@@ -35,13 +36,17 @@ import com.android.systemui.Dumpable;
|
|||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.dagger.SysUISingleton;
|
import com.android.systemui.dagger.SysUISingleton;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.flags.FeatureFlags;
|
||||||
|
import com.android.systemui.flags.Flags;
|
||||||
import com.android.systemui.navigationbar.NavigationModeController;
|
import com.android.systemui.navigationbar.NavigationModeController;
|
||||||
import com.android.systemui.plugins.DarkIconDispatcher;
|
import com.android.systemui.plugins.DarkIconDispatcher;
|
||||||
import com.android.systemui.settings.DisplayTracker;
|
import com.android.systemui.settings.DisplayTracker;
|
||||||
import com.android.systemui.statusbar.policy.BatteryController;
|
import com.android.systemui.statusbar.policy.BatteryController;
|
||||||
|
import com.android.systemui.util.Compile;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
@@ -51,10 +56,14 @@ import javax.inject.Inject;
|
|||||||
@SysUISingleton
|
@SysUISingleton
|
||||||
public class LightBarController implements BatteryController.BatteryStateChangeCallback, Dumpable {
|
public class LightBarController implements BatteryController.BatteryStateChangeCallback, Dumpable {
|
||||||
|
|
||||||
|
private static final String TAG = "LightBarController";
|
||||||
|
private static final boolean DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG);
|
||||||
|
|
||||||
private static final float NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD = 0.1f;
|
private static final float NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD = 0.1f;
|
||||||
|
|
||||||
private final SysuiDarkIconDispatcher mStatusBarIconController;
|
private final SysuiDarkIconDispatcher mStatusBarIconController;
|
||||||
private final BatteryController mBatteryController;
|
private final BatteryController mBatteryController;
|
||||||
|
private final boolean mUseNewLightBarLogic;
|
||||||
private BiometricUnlockController mBiometricUnlockController;
|
private BiometricUnlockController mBiometricUnlockController;
|
||||||
|
|
||||||
private LightBarTransitionsController mNavigationBarController;
|
private LightBarTransitionsController mNavigationBarController;
|
||||||
@@ -67,13 +76,17 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
private final int mLightIconColor;
|
private final int mLightIconColor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the navigation bar should be light factoring in already how much alpha the scrim has
|
* Whether the navigation bar should be light factoring in already how much alpha the scrim has.
|
||||||
|
* "Light" refers to the background color of the navigation bar, so when this is true,
|
||||||
|
* it's referring to a state where the navigation bar icons are tinted dark.
|
||||||
*/
|
*/
|
||||||
private boolean mNavigationLight;
|
private boolean mNavigationLight;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the flags indicate that a light status bar is requested. This doesn't factor in the
|
* Whether the flags indicate that a light navigation bar is requested.
|
||||||
* scrim alpha yet.
|
* "Light" refers to the background color of the navigation bar, so when this is true,
|
||||||
|
* it's referring to a state where the navigation bar icons would be tinted dark.
|
||||||
|
* This doesn't factor in the scrim alpha yet.
|
||||||
*/
|
*/
|
||||||
private boolean mHasLightNavigationBar;
|
private boolean mHasLightNavigationBar;
|
||||||
|
|
||||||
@@ -82,22 +95,34 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
* {@link #mNavigationLight} {@code false}.
|
* {@link #mNavigationLight} {@code false}.
|
||||||
*/
|
*/
|
||||||
private boolean mForceDarkForScrim;
|
private boolean mForceDarkForScrim;
|
||||||
|
/**
|
||||||
|
* {@code true} if {@link #mHasLightNavigationBar} should be ignored and forcefully make
|
||||||
|
* {@link #mNavigationLight} {@code true}.
|
||||||
|
*/
|
||||||
|
private boolean mForceLightForScrim;
|
||||||
|
|
||||||
private boolean mQsCustomizing;
|
private boolean mQsCustomizing;
|
||||||
|
private boolean mQsExpanded;
|
||||||
|
private boolean mGlobalActionsVisible;
|
||||||
|
|
||||||
private boolean mDirectReplying;
|
private boolean mDirectReplying;
|
||||||
private boolean mNavbarColorManagedByIme;
|
private boolean mNavbarColorManagedByIme;
|
||||||
|
|
||||||
private boolean mIsCustomizingForBackNav;
|
private boolean mIsCustomizingForBackNav;
|
||||||
|
|
||||||
|
private String mLastSetScrimStateLog;
|
||||||
|
private String mLastNavigationBarAppearanceChangedLog;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public LightBarController(
|
public LightBarController(
|
||||||
Context ctx,
|
Context ctx,
|
||||||
DarkIconDispatcher darkIconDispatcher,
|
DarkIconDispatcher darkIconDispatcher,
|
||||||
BatteryController batteryController,
|
BatteryController batteryController,
|
||||||
NavigationModeController navModeController,
|
NavigationModeController navModeController,
|
||||||
|
FeatureFlags featureFlags,
|
||||||
DumpManager dumpManager,
|
DumpManager dumpManager,
|
||||||
DisplayTracker displayTracker) {
|
DisplayTracker displayTracker) {
|
||||||
|
mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC);
|
||||||
mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone);
|
mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone);
|
||||||
mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone);
|
mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone);
|
||||||
mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
|
mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
|
||||||
@@ -159,9 +184,42 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
final boolean last = mNavigationLight;
|
final boolean last = mNavigationLight;
|
||||||
mHasLightNavigationBar = isLight(appearance, navigationBarMode,
|
mHasLightNavigationBar = isLight(appearance, navigationBarMode,
|
||||||
APPEARANCE_LIGHT_NAVIGATION_BARS);
|
APPEARANCE_LIGHT_NAVIGATION_BARS);
|
||||||
mNavigationLight = mHasLightNavigationBar
|
if (mUseNewLightBarLogic) {
|
||||||
&& (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim)
|
final boolean ignoreScrimForce = mDirectReplying && mNavbarColorManagedByIme;
|
||||||
&& !mQsCustomizing;
|
final boolean darkForScrim = mForceDarkForScrim && !ignoreScrimForce;
|
||||||
|
final boolean lightForScrim = mForceLightForScrim && !ignoreScrimForce;
|
||||||
|
final boolean darkForQs = mQsCustomizing || mQsExpanded || mGlobalActionsVisible;
|
||||||
|
mNavigationLight =
|
||||||
|
((mHasLightNavigationBar && !darkForScrim) || lightForScrim) && !darkForQs;
|
||||||
|
mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()"
|
||||||
|
+ " appearance=" + appearance
|
||||||
|
+ " nbModeChanged=" + nbModeChanged
|
||||||
|
+ " navigationBarMode=" + navigationBarMode
|
||||||
|
+ " navbarColorManagedByIme=" + navbarColorManagedByIme
|
||||||
|
+ " mHasLightNavigationBar=" + mHasLightNavigationBar
|
||||||
|
+ " ignoreScrimForce=" + ignoreScrimForce
|
||||||
|
+ " darkForScrim=" + darkForScrim
|
||||||
|
+ " lightForScrim=" + lightForScrim
|
||||||
|
+ " darkForQs=" + darkForQs
|
||||||
|
+ " mNavigationLight=" + mNavigationLight
|
||||||
|
+ " last=" + last
|
||||||
|
+ " timestamp=" + new Date();
|
||||||
|
if (DEBUG) Log.d(TAG, mLastNavigationBarAppearanceChangedLog);
|
||||||
|
} else {
|
||||||
|
mNavigationLight = mHasLightNavigationBar
|
||||||
|
&& (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim)
|
||||||
|
&& !mQsCustomizing;
|
||||||
|
mLastNavigationBarAppearanceChangedLog = "onNavigationBarAppearanceChanged()"
|
||||||
|
+ " appearance=" + appearance
|
||||||
|
+ " nbModeChanged=" + nbModeChanged
|
||||||
|
+ " navigationBarMode=" + navigationBarMode
|
||||||
|
+ " navbarColorManagedByIme=" + navbarColorManagedByIme
|
||||||
|
+ " mHasLightNavigationBar=" + mHasLightNavigationBar
|
||||||
|
+ " mNavigationLight=" + mNavigationLight
|
||||||
|
+ " last=" + last
|
||||||
|
+ " timestamp=" + new Date();
|
||||||
|
if (DEBUG) Log.d(TAG, mLastNavigationBarAppearanceChangedLog);
|
||||||
|
}
|
||||||
if (mNavigationLight != last) {
|
if (mNavigationLight != last) {
|
||||||
updateNavigation();
|
updateNavigation();
|
||||||
}
|
}
|
||||||
@@ -188,6 +246,20 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
reevaluate();
|
reevaluate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set if Quick Settings is fully expanded, which affects notification scrim visibility */
|
||||||
|
public void setQsExpanded(boolean expanded) {
|
||||||
|
if (mQsExpanded == expanded) return;
|
||||||
|
mQsExpanded = expanded;
|
||||||
|
reevaluate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set if Global Actions dialog is visible, which requires dark mode (light buttons) */
|
||||||
|
public void setGlobalActionsVisible(boolean visible) {
|
||||||
|
if (mGlobalActionsVisible == visible) return;
|
||||||
|
mGlobalActionsVisible = visible;
|
||||||
|
reevaluate();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controls the light status bar temporarily for back navigation.
|
* Controls the light status bar temporarily for back navigation.
|
||||||
* @param appearance the custmoized appearance.
|
* @param appearance the custmoized appearance.
|
||||||
@@ -225,16 +297,52 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
|
|
||||||
public void setScrimState(ScrimState scrimState, float scrimBehindAlpha,
|
public void setScrimState(ScrimState scrimState, float scrimBehindAlpha,
|
||||||
GradientColors scrimInFrontColor) {
|
GradientColors scrimInFrontColor) {
|
||||||
boolean forceDarkForScrimLast = mForceDarkForScrim;
|
if (mUseNewLightBarLogic) {
|
||||||
// For BOUNCER/BOUNCER_SCRIMMED cases, we assume that alpha is always below threshold.
|
boolean forceDarkForScrimLast = mForceDarkForScrim;
|
||||||
// This enables IMEs to control the navigation bar color.
|
boolean forceLightForScrimLast = mForceLightForScrim;
|
||||||
// For other cases, scrim should be able to veto the light navigation bar.
|
final boolean forceForScrim =
|
||||||
mForceDarkForScrim = scrimState != ScrimState.BOUNCER
|
scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD;
|
||||||
&& scrimState != ScrimState.BOUNCER_SCRIMMED
|
final boolean scrimColorIsLight = scrimInFrontColor.supportsDarkText();
|
||||||
&& scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD
|
|
||||||
&& !scrimInFrontColor.supportsDarkText();
|
mForceDarkForScrim = forceForScrim && !scrimColorIsLight;
|
||||||
if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) {
|
mForceLightForScrim = forceForScrim && scrimColorIsLight;
|
||||||
reevaluate();
|
if (mHasLightNavigationBar) {
|
||||||
|
if (mForceDarkForScrim != forceDarkForScrimLast) reevaluate();
|
||||||
|
} else {
|
||||||
|
if (mForceLightForScrim != forceLightForScrimLast) reevaluate();
|
||||||
|
}
|
||||||
|
mLastSetScrimStateLog = "setScrimState()"
|
||||||
|
+ " scrimState=" + scrimState
|
||||||
|
+ " scrimBehindAlpha=" + scrimBehindAlpha
|
||||||
|
+ " scrimInFrontColor=" + scrimInFrontColor
|
||||||
|
+ " forceForScrim=" + forceForScrim
|
||||||
|
+ " scrimColorIsLight=" + scrimColorIsLight
|
||||||
|
+ " mHasLightNavigationBar=" + mHasLightNavigationBar
|
||||||
|
+ " mForceDarkForScrim=" + mForceDarkForScrim
|
||||||
|
+ " mForceLightForScrim=" + mForceLightForScrim
|
||||||
|
+ " timestamp=" + new Date();
|
||||||
|
if (DEBUG) Log.d(TAG, mLastSetScrimStateLog);
|
||||||
|
} else {
|
||||||
|
boolean forceDarkForScrimLast = mForceDarkForScrim;
|
||||||
|
// For BOUNCER/BOUNCER_SCRIMMED cases, we assume that alpha is always below threshold.
|
||||||
|
// This enables IMEs to control the navigation bar color.
|
||||||
|
// For other cases, scrim should be able to veto the light navigation bar.
|
||||||
|
// NOTE: this was also wrong for S and has been removed in the new logic.
|
||||||
|
mForceDarkForScrim = scrimState != ScrimState.BOUNCER
|
||||||
|
&& scrimState != ScrimState.BOUNCER_SCRIMMED
|
||||||
|
&& scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD
|
||||||
|
&& !scrimInFrontColor.supportsDarkText();
|
||||||
|
if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) {
|
||||||
|
reevaluate();
|
||||||
|
}
|
||||||
|
mLastSetScrimStateLog = "setScrimState()"
|
||||||
|
+ " scrimState=" + scrimState
|
||||||
|
+ " scrimBehindAlpha=" + scrimBehindAlpha
|
||||||
|
+ " scrimInFrontColor=" + scrimInFrontColor
|
||||||
|
+ " mHasLightNavigationBar=" + mHasLightNavigationBar
|
||||||
|
+ " mForceDarkForScrim=" + mForceDarkForScrim
|
||||||
|
+ " timestamp=" + new Date();
|
||||||
|
if (DEBUG) Log.d(TAG, mLastSetScrimStateLog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,16 +417,24 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
pw.print(mAppearanceRegions[i].toString()); pw.print(" isLight="); pw.println(isLight);
|
pw.print(mAppearanceRegions[i].toString()); pw.print(" isLight="); pw.println(isLight);
|
||||||
}
|
}
|
||||||
|
|
||||||
pw.print(" mNavigationLight="); pw.print(mNavigationLight);
|
pw.print(" mNavigationLight="); pw.println(mNavigationLight);
|
||||||
pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar);
|
pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar);
|
||||||
|
pw.println();
|
||||||
pw.print(" mStatusBarMode="); pw.print(mStatusBarMode);
|
pw.print(" mStatusBarMode="); pw.print(mStatusBarMode);
|
||||||
pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode);
|
pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode);
|
||||||
|
pw.println();
|
||||||
pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim);
|
pw.print(" mForceDarkForScrim="); pw.println(mForceDarkForScrim);
|
||||||
pw.print(" mQsCustomizing="); pw.print(mQsCustomizing);
|
pw.print(" mForceLightForScrim="); pw.println(mForceLightForScrim);
|
||||||
|
pw.println();
|
||||||
|
pw.print(" mQsCustomizing="); pw.println(mQsCustomizing);
|
||||||
|
pw.print(" mQsExpanded="); pw.println(mQsExpanded);
|
||||||
|
pw.print(" mGlobalActionsVisible="); pw.println(mGlobalActionsVisible);
|
||||||
pw.print(" mDirectReplying="); pw.println(mDirectReplying);
|
pw.print(" mDirectReplying="); pw.println(mDirectReplying);
|
||||||
pw.print(" mNavbarColorManagedByIme="); pw.println(mNavbarColorManagedByIme);
|
pw.print(" mNavbarColorManagedByIme="); pw.println(mNavbarColorManagedByIme);
|
||||||
|
pw.println();
|
||||||
|
pw.println(" Recent Calculation Logs:");
|
||||||
|
pw.print(" "); pw.println(mLastSetScrimStateLog);
|
||||||
|
pw.print(" "); pw.println(mLastNavigationBarAppearanceChangedLog);
|
||||||
|
|
||||||
pw.println();
|
pw.println();
|
||||||
|
|
||||||
@@ -344,6 +460,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
private final DarkIconDispatcher mDarkIconDispatcher;
|
private final DarkIconDispatcher mDarkIconDispatcher;
|
||||||
private final BatteryController mBatteryController;
|
private final BatteryController mBatteryController;
|
||||||
private final NavigationModeController mNavModeController;
|
private final NavigationModeController mNavModeController;
|
||||||
|
private final FeatureFlags mFeatureFlags;
|
||||||
private final DumpManager mDumpManager;
|
private final DumpManager mDumpManager;
|
||||||
private final DisplayTracker mDisplayTracker;
|
private final DisplayTracker mDisplayTracker;
|
||||||
|
|
||||||
@@ -352,12 +469,14 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
DarkIconDispatcher darkIconDispatcher,
|
DarkIconDispatcher darkIconDispatcher,
|
||||||
BatteryController batteryController,
|
BatteryController batteryController,
|
||||||
NavigationModeController navModeController,
|
NavigationModeController navModeController,
|
||||||
|
FeatureFlags featureFlags,
|
||||||
DumpManager dumpManager,
|
DumpManager dumpManager,
|
||||||
DisplayTracker displayTracker) {
|
DisplayTracker displayTracker) {
|
||||||
|
|
||||||
mDarkIconDispatcher = darkIconDispatcher;
|
mDarkIconDispatcher = darkIconDispatcher;
|
||||||
mBatteryController = batteryController;
|
mBatteryController = batteryController;
|
||||||
mNavModeController = navModeController;
|
mNavModeController = navModeController;
|
||||||
|
mFeatureFlags = featureFlags;
|
||||||
mDumpManager = dumpManager;
|
mDumpManager = dumpManager;
|
||||||
mDisplayTracker = displayTracker;
|
mDisplayTracker = displayTracker;
|
||||||
}
|
}
|
||||||
@@ -365,7 +484,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
/** Create an {@link LightBarController} */
|
/** Create an {@link LightBarController} */
|
||||||
public LightBarController create(Context context) {
|
public LightBarController create(Context context) {
|
||||||
return new LightBarController(context, mDarkIconDispatcher, mBatteryController,
|
return new LightBarController(context, mDarkIconDispatcher, mBatteryController,
|
||||||
mNavModeController, mDumpManager, mDisplayTracker);
|
mNavModeController, mFeatureFlags, mDumpManager, mDisplayTracker);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import androidx.annotation.Nullable;
|
|||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
|
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
|
||||||
import com.android.internal.graphics.ColorUtils;
|
import com.android.internal.graphics.ColorUtils;
|
||||||
|
import com.android.internal.util.ContrastColorUtil;
|
||||||
import com.android.internal.util.function.TriConsumer;
|
import com.android.internal.util.function.TriConsumer;
|
||||||
import com.android.keyguard.BouncerPanelExpansionCalculator;
|
import com.android.keyguard.BouncerPanelExpansionCalculator;
|
||||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||||
@@ -249,6 +250,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
|||||||
private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener;
|
private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener;
|
||||||
private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
|
private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
|
||||||
private final FeatureFlags mFeatureFlags;
|
private final FeatureFlags mFeatureFlags;
|
||||||
|
private final boolean mUseNewLightBarLogic;
|
||||||
private Consumer<Integer> mScrimVisibleListener;
|
private Consumer<Integer> mScrimVisibleListener;
|
||||||
private boolean mBlankScreen;
|
private boolean mBlankScreen;
|
||||||
private boolean mScreenBlankingCallbackCalled;
|
private boolean mScreenBlankingCallbackCalled;
|
||||||
@@ -306,6 +308,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
|||||||
mScrimStateListener = lightBarController::setScrimState;
|
mScrimStateListener = lightBarController::setScrimState;
|
||||||
mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
|
mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
|
||||||
mFeatureFlags = featureFlags;
|
mFeatureFlags = featureFlags;
|
||||||
|
mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC);
|
||||||
mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;
|
mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;
|
||||||
|
|
||||||
mKeyguardStateController = keyguardStateController;
|
mKeyguardStateController = keyguardStateController;
|
||||||
@@ -1159,7 +1162,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
|||||||
if (mClipsQsScrim && mQsBottomVisible) {
|
if (mClipsQsScrim && mQsBottomVisible) {
|
||||||
alpha = mNotificationsAlpha;
|
alpha = mNotificationsAlpha;
|
||||||
}
|
}
|
||||||
mScrimStateListener.accept(mState, alpha, mScrimInFront.getColors());
|
if (mUseNewLightBarLogic) {
|
||||||
|
mScrimStateListener.accept(mState, alpha, mColors);
|
||||||
|
} else {
|
||||||
|
// NOTE: This wasn't wrong, but it implied that each scrim might have different colors,
|
||||||
|
// when in fact they all share the same GradientColors instance, which we own.
|
||||||
|
mScrimStateListener.accept(mState, alpha, mScrimInFront.getColors());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dispatchScrimsVisible() {
|
private void dispatchScrimsVisible() {
|
||||||
@@ -1487,8 +1496,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
|||||||
int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor();
|
int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor();
|
||||||
mColors.setMainColor(background);
|
mColors.setMainColor(background);
|
||||||
mColors.setSecondaryColor(accent);
|
mColors.setSecondaryColor(accent);
|
||||||
mColors.setSupportsDarkText(
|
if (mUseNewLightBarLogic) {
|
||||||
ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5);
|
final boolean isBackgroundLight = !ContrastColorUtil.isColorDark(background);
|
||||||
|
mColors.setSupportsDarkText(isBackgroundLight);
|
||||||
|
} else {
|
||||||
|
// NOTE: This was totally backward, but LightBarController was flipping it back.
|
||||||
|
// There may be other consumers of this which would struggle though
|
||||||
|
mColors.setSupportsDarkText(
|
||||||
|
ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5);
|
||||||
|
}
|
||||||
mNeedsDrawableColorUpdate = true;
|
mNeedsDrawableColorUpdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ import com.android.systemui.settings.UserTracker;
|
|||||||
import com.android.systemui.statusbar.NotificationShadeWindowController;
|
import com.android.systemui.statusbar.NotificationShadeWindowController;
|
||||||
import com.android.systemui.statusbar.VibratorHelper;
|
import com.android.systemui.statusbar.VibratorHelper;
|
||||||
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
||||||
|
import com.android.systemui.statusbar.phone.LightBarController;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||||
import com.android.systemui.telephony.TelephonyListenerManager;
|
import com.android.systemui.telephony.TelephonyListenerManager;
|
||||||
@@ -115,6 +116,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
|
|||||||
@Mock private MetricsLogger mMetricsLogger;
|
@Mock private MetricsLogger mMetricsLogger;
|
||||||
@Mock private SysuiColorExtractor mColorExtractor;
|
@Mock private SysuiColorExtractor mColorExtractor;
|
||||||
@Mock private IStatusBarService mStatusBarService;
|
@Mock private IStatusBarService mStatusBarService;
|
||||||
|
@Mock private LightBarController mLightBarController;
|
||||||
@Mock private NotificationShadeWindowController mNotificationShadeWindowController;
|
@Mock private NotificationShadeWindowController mNotificationShadeWindowController;
|
||||||
@Mock private IWindowManager mWindowManager;
|
@Mock private IWindowManager mWindowManager;
|
||||||
@Mock private Executor mBackgroundExecutor;
|
@Mock private Executor mBackgroundExecutor;
|
||||||
@@ -166,6 +168,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
|
|||||||
mMetricsLogger,
|
mMetricsLogger,
|
||||||
mColorExtractor,
|
mColorExtractor,
|
||||||
mStatusBarService,
|
mStatusBarService,
|
||||||
|
mLightBarController,
|
||||||
mNotificationShadeWindowController,
|
mNotificationShadeWindowController,
|
||||||
mWindowManager,
|
mWindowManager,
|
||||||
mBackgroundExecutor,
|
mBackgroundExecutor,
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController;
|
|||||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
||||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController;
|
import com.android.systemui.statusbar.phone.KeyguardStatusBarViewController;
|
||||||
|
import com.android.systemui.statusbar.phone.LightBarController;
|
||||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
||||||
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
|
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
|
||||||
import com.android.systemui.statusbar.phone.ScrimController;
|
import com.android.systemui.statusbar.phone.ScrimController;
|
||||||
@@ -240,6 +241,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
|
|||||||
@Mock protected KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent;
|
@Mock protected KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent;
|
||||||
@Mock protected KeyguardClockSwitchController mKeyguardClockSwitchController;
|
@Mock protected KeyguardClockSwitchController mKeyguardClockSwitchController;
|
||||||
@Mock protected KeyguardStatusBarViewController mKeyguardStatusBarViewController;
|
@Mock protected KeyguardStatusBarViewController mKeyguardStatusBarViewController;
|
||||||
|
@Mock protected LightBarController mLightBarController;
|
||||||
@Mock protected NotificationStackScrollLayoutController
|
@Mock protected NotificationStackScrollLayoutController
|
||||||
mNotificationStackScrollLayoutController;
|
mNotificationStackScrollLayoutController;
|
||||||
@Mock protected NotificationShadeDepthController mNotificationShadeDepthController;
|
@Mock protected NotificationShadeDepthController mNotificationShadeDepthController;
|
||||||
@@ -655,6 +657,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
|
|||||||
mNotificationRemoteInputManager,
|
mNotificationRemoteInputManager,
|
||||||
mShadeExpansionStateManager,
|
mShadeExpansionStateManager,
|
||||||
mStatusBarKeyguardViewManager,
|
mStatusBarKeyguardViewManager,
|
||||||
|
mLightBarController,
|
||||||
mNotificationStackScrollLayoutController,
|
mNotificationStackScrollLayoutController,
|
||||||
mLockscreenShadeTransitionController,
|
mLockscreenShadeTransitionController,
|
||||||
mNotificationShadeDepthController,
|
mNotificationShadeDepthController,
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
|
|||||||
import com.android.systemui.statusbar.phone.KeyguardBottomAreaView;
|
import com.android.systemui.statusbar.phone.KeyguardBottomAreaView;
|
||||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||||
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
|
||||||
|
import com.android.systemui.statusbar.phone.LightBarController;
|
||||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
import com.android.systemui.statusbar.phone.LockscreenGestureLogger;
|
||||||
import com.android.systemui.statusbar.phone.ScrimController;
|
import com.android.systemui.statusbar.phone.ScrimController;
|
||||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||||
@@ -133,6 +134,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase {
|
|||||||
@Mock private PulseExpansionHandler mPulseExpansionHandler;
|
@Mock private PulseExpansionHandler mPulseExpansionHandler;
|
||||||
@Mock private NotificationRemoteInputManager mNotificationRemoteInputManager;
|
@Mock private NotificationRemoteInputManager mNotificationRemoteInputManager;
|
||||||
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||||
|
@Mock private LightBarController mLightBarController;
|
||||||
@Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
|
@Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
|
||||||
@Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController;
|
@Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController;
|
||||||
@Mock private NotificationShadeDepthController mNotificationShadeDepthController;
|
@Mock private NotificationShadeDepthController mNotificationShadeDepthController;
|
||||||
@@ -223,6 +225,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase {
|
|||||||
mNotificationRemoteInputManager,
|
mNotificationRemoteInputManager,
|
||||||
mShadeExpansionStateManager,
|
mShadeExpansionStateManager,
|
||||||
mStatusBarKeyguardViewManager,
|
mStatusBarKeyguardViewManager,
|
||||||
|
mLightBarController,
|
||||||
mNotificationStackScrollLayoutController,
|
mNotificationStackScrollLayoutController,
|
||||||
mLockscreenShadeTransitionController,
|
mLockscreenShadeTransitionController,
|
||||||
mNotificationShadeDepthController,
|
mNotificationShadeDepthController,
|
||||||
|
|||||||
@@ -22,21 +22,31 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE
|
|||||||
|
|
||||||
import static junit.framework.Assert.assertTrue;
|
import static junit.framework.Assert.assertTrue;
|
||||||
|
|
||||||
|
import static org.junit.Assume.assumeTrue;
|
||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.clearInvocations;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.graphics.Color;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.testing.TestableLooper;
|
import android.testing.TestableLooper;
|
||||||
|
|
||||||
|
import androidx.annotation.ColorInt;
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
|
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
|
||||||
|
import com.android.internal.util.ContrastColorUtil;
|
||||||
import com.android.internal.view.AppearanceRegion;
|
import com.android.internal.view.AppearanceRegion;
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.flags.FakeFeatureFlags;
|
||||||
|
import com.android.systemui.flags.Flags;
|
||||||
import com.android.systemui.navigationbar.NavigationModeController;
|
import com.android.systemui.navigationbar.NavigationModeController;
|
||||||
import com.android.systemui.settings.FakeDisplayTracker;
|
import com.android.systemui.settings.FakeDisplayTracker;
|
||||||
import com.android.systemui.statusbar.policy.BatteryController;
|
import com.android.systemui.statusbar.policy.BatteryController;
|
||||||
@@ -53,13 +63,25 @@ import java.util.ArrayList;
|
|||||||
@TestableLooper.RunWithLooper
|
@TestableLooper.RunWithLooper
|
||||||
public class LightBarControllerTest extends SysuiTestCase {
|
public class LightBarControllerTest extends SysuiTestCase {
|
||||||
|
|
||||||
|
private static final GradientColors COLORS_LIGHT = makeColors(Color.WHITE);
|
||||||
|
private static final GradientColors COLORS_DARK = makeColors(Color.BLACK);
|
||||||
|
private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
|
||||||
private LightBarTransitionsController mLightBarTransitionsController;
|
private LightBarTransitionsController mLightBarTransitionsController;
|
||||||
|
private LightBarTransitionsController mNavBarController;
|
||||||
private SysuiDarkIconDispatcher mStatusBarIconController;
|
private SysuiDarkIconDispatcher mStatusBarIconController;
|
||||||
private LightBarController mLightBarController;
|
private LightBarController mLightBarController;
|
||||||
|
|
||||||
|
/** Allow testing with NEW_LIGHT_BAR_LOGIC flag in different states */
|
||||||
|
protected boolean testNewLightBarLogic() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
|
mFeatureFlags.set(Flags.NEW_LIGHT_BAR_LOGIC, testNewLightBarLogic());
|
||||||
mStatusBarIconController = mock(SysuiDarkIconDispatcher.class);
|
mStatusBarIconController = mock(SysuiDarkIconDispatcher.class);
|
||||||
|
mNavBarController = mock(LightBarTransitionsController.class);
|
||||||
|
when(mNavBarController.supportsIconTintForNavMode(anyInt())).thenReturn(true);
|
||||||
mLightBarTransitionsController = mock(LightBarTransitionsController.class);
|
mLightBarTransitionsController = mock(LightBarTransitionsController.class);
|
||||||
when(mStatusBarIconController.getTransitionsController()).thenReturn(
|
when(mStatusBarIconController.getTransitionsController()).thenReturn(
|
||||||
mLightBarTransitionsController);
|
mLightBarTransitionsController);
|
||||||
@@ -68,10 +90,19 @@ public class LightBarControllerTest extends SysuiTestCase {
|
|||||||
mStatusBarIconController,
|
mStatusBarIconController,
|
||||||
mock(BatteryController.class),
|
mock(BatteryController.class),
|
||||||
mock(NavigationModeController.class),
|
mock(NavigationModeController.class),
|
||||||
|
mFeatureFlags,
|
||||||
mock(DumpManager.class),
|
mock(DumpManager.class),
|
||||||
new FakeDisplayTracker(mContext));
|
new FakeDisplayTracker(mContext));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static GradientColors makeColors(@ColorInt int bgColor) {
|
||||||
|
GradientColors colors = new GradientColors();
|
||||||
|
colors.setMainColor(bgColor);
|
||||||
|
colors.setSecondaryColor(bgColor);
|
||||||
|
colors.setSupportsDarkText(!ContrastColorUtil.isColorDark(bgColor));
|
||||||
|
return colors;
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testOnStatusBarAppearanceChanged_multipleStacks_allStacksLight() {
|
public void testOnStatusBarAppearanceChanged_multipleStacks_allStacksLight() {
|
||||||
final Rect firstBounds = new Rect(0, 0, 1, 1);
|
final Rect firstBounds = new Rect(0, 0, 1, 1);
|
||||||
@@ -177,4 +208,54 @@ public class LightBarControllerTest extends SysuiTestCase {
|
|||||||
false /* navbarColorManagedByIme */);
|
false /* navbarColorManagedByIme */);
|
||||||
verify(mLightBarTransitionsController).setIconsDark(eq(false), anyBoolean());
|
verify(mLightBarTransitionsController).setIconsDark(eq(false), anyBoolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void validateNavBarChangesUpdateIcons() {
|
||||||
|
assumeTrue(testNewLightBarLogic()); // Only run in the new suite
|
||||||
|
|
||||||
|
// On the launcher in dark mode buttons are light
|
||||||
|
mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_DARK);
|
||||||
|
mLightBarController.onNavigationBarAppearanceChanged(
|
||||||
|
0, /* nbModeChanged = */ true,
|
||||||
|
MODE_TRANSPARENT, /* navbarColorManagedByIme = */ false);
|
||||||
|
verifyNavBarIconsUnchanged(); // no changes yet; not attached
|
||||||
|
|
||||||
|
// Initial state is set when controller is set
|
||||||
|
mLightBarController.setNavigationBar(mNavBarController);
|
||||||
|
verifyNavBarIconsDarkSetTo(false);
|
||||||
|
|
||||||
|
// Changing the color of the transparent scrim has no effect
|
||||||
|
mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_LIGHT);
|
||||||
|
verifyNavBarIconsUnchanged(); // still light
|
||||||
|
|
||||||
|
// Showing the notification shade with white scrim requires dark icons
|
||||||
|
mLightBarController.setScrimState(ScrimState.UNLOCKED, 1f, COLORS_LIGHT);
|
||||||
|
verifyNavBarIconsDarkSetTo(true);
|
||||||
|
|
||||||
|
// Expanded QS always provides a black background, so icons become light again
|
||||||
|
mLightBarController.setQsExpanded(true);
|
||||||
|
verifyNavBarIconsDarkSetTo(false);
|
||||||
|
|
||||||
|
// Tapping the QS tile to change to dark theme has no effect in this state
|
||||||
|
mLightBarController.setScrimState(ScrimState.UNLOCKED, 1f, COLORS_DARK);
|
||||||
|
verifyNavBarIconsUnchanged(); // still light
|
||||||
|
|
||||||
|
// collapsing QS in dark mode doesn't affect button color
|
||||||
|
mLightBarController.setQsExpanded(false);
|
||||||
|
verifyNavBarIconsUnchanged(); // still light
|
||||||
|
|
||||||
|
// Closing the shade has no affect
|
||||||
|
mLightBarController.setScrimState(ScrimState.UNLOCKED, 0f, COLORS_DARK);
|
||||||
|
verifyNavBarIconsUnchanged(); // still light
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyNavBarIconsUnchanged() {
|
||||||
|
verify(mNavBarController, never()).setIconsDark(anyBoolean(), anyBoolean());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyNavBarIconsDarkSetTo(boolean iconsDark) {
|
||||||
|
verify(mNavBarController).setIconsDark(eq(iconsDark), anyBoolean());
|
||||||
|
verify(mNavBarController, never()).setIconsDark(eq(!iconsDark), anyBoolean());
|
||||||
|
clearInvocations(mNavBarController);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.systemui.statusbar.phone
|
||||||
|
|
||||||
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.systemui.flags.Flags.NEW_LIGHT_BAR_LOGIC
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file only needs to live as long as [NEW_LIGHT_BAR_LOGIC] does. When we delete that flag, we
|
||||||
|
* can roll this back into the old test.
|
||||||
|
*/
|
||||||
|
@SmallTest
|
||||||
|
class LightBarControllerWithNewLogicTest : LightBarControllerTest() {
|
||||||
|
override fun testNewLightBarLogic(): Boolean = true
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user