Merge "Fix LightBarController's dark/light logic for the Navigation Bar" into udc-dev

This commit is contained in:
Jeff DeCew
2023-04-27 16:13:57 +00:00
committed by Android (Google) Code Review
9 changed files with 295 additions and 25 deletions

View File

@@ -128,6 +128,7 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.VibratorHelper;
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.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -240,6 +241,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
private final ScreenshotHelper mScreenshotHelper;
private final SysuiColorExtractor mSysuiColorExtractor;
private final IStatusBarService mStatusBarService;
protected final LightBarController mLightBarController;
protected final NotificationShadeWindowController mNotificationShadeWindowController;
private final IWindowManager mIWindowManager;
private final Executor mBackgroundExecutor;
@@ -349,6 +351,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
MetricsLogger metricsLogger,
SysuiColorExtractor colorExtractor,
IStatusBarService statusBarService,
LightBarController lightBarController,
NotificationShadeWindowController notificationShadeWindowController,
IWindowManager iWindowManager,
@Background Executor backgroundExecutor,
@@ -381,6 +384,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mUiEventLogger = uiEventLogger;
mSysuiColorExtractor = colorExtractor;
mStatusBarService = statusBarService;
mLightBarController = lightBarController;
mNotificationShadeWindowController = notificationShadeWindowController;
mIWindowManager = iWindowManager;
mBackgroundExecutor = backgroundExecutor;
@@ -694,6 +698,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
ActionsDialogLite dialog = new ActionsDialogLite(mContext,
com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActionsLite,
mAdapter, mOverflowAdapter, mSysuiColorExtractor, mStatusBarService,
mLightBarController,
mNotificationShadeWindowController, this::onRefresh, mKeyguardShowing,
mPowerAdapter, mUiEventLogger, mCentralSurfacesOptional, mKeyguardUpdateMonitor,
mLockPatternUtils);
@@ -2192,6 +2197,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
protected final SysuiColorExtractor mColorExtractor;
private boolean mKeyguardShowing;
protected float mScrimAlpha;
protected final LightBarController mLightBarController;
protected final NotificationShadeWindowController mNotificationShadeWindowController;
private ListPopupWindow mOverflowPopup;
private Dialog mPowerOptionsDialog;
@@ -2267,6 +2273,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
ActionsDialogLite(Context context, int themeRes, MyAdapter adapter,
MyOverflowAdapter overflowAdapter,
SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
LightBarController lightBarController,
NotificationShadeWindowController notificationShadeWindowController,
Runnable onRefreshCallback, boolean keyguardShowing,
MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger,
@@ -2282,6 +2289,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mPowerOptionsAdapter = powerAdapter;
mColorExtractor = sysuiColorExtractor;
mStatusBarService = statusBarService;
mLightBarController = lightBarController;
mNotificationShadeWindowController = notificationShadeWindowController;
mOnRefreshCallback = onRefreshCallback;
mKeyguardShowing = keyguardShowing;
@@ -2474,6 +2482,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
@Override
protected void start() {
mGlobalActionsLayout.updateList();
mLightBarController.setGlobalActionsVisible(true);
if (mBackgroundDrawable instanceof ScrimDrawable) {
mColorExtractor.addOnColorsChangedListener(this);
@@ -2504,6 +2513,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
@Override
protected void stop() {
mLightBarController.setGlobalActionsVisible(false);
mColorExtractor.removeOnColorsChangedListener(this);
}

View File

@@ -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.phone.KeyguardBypassController;
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.ScrimController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -117,6 +118,7 @@ public class QuickSettingsController {
private final PulseExpansionHandler mPulseExpansionHandler;
private final ShadeExpansionStateManager mShadeExpansionStateManager;
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private final LightBarController mLightBarController;
private final NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
private final NotificationShadeDepthController mDepthController;
@@ -304,6 +306,7 @@ public class QuickSettingsController {
NotificationRemoteInputManager remoteInputManager,
ShadeExpansionStateManager shadeExpansionStateManager,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
LightBarController lightBarController,
NotificationStackScrollLayoutController notificationStackScrollLayoutController,
LockscreenShadeTransitionController lockscreenShadeTransitionController,
NotificationShadeDepthController notificationShadeDepthController,
@@ -346,6 +349,7 @@ public class QuickSettingsController {
mRemoteInputManager = remoteInputManager;
mShadeExpansionStateManager = shadeExpansionStateManager;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mLightBarController = lightBarController;
mNotificationStackScrollLayoutController = notificationStackScrollLayoutController;
mLockscreenShadeTransitionController = lockscreenShadeTransitionController;
mDepthController = notificationShadeDepthController;
@@ -1018,6 +1022,9 @@ public class QuickSettingsController {
mShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction);
mShadeHeaderController.setQsExpandedFraction(qsExpansionFraction);
mShadeHeaderController.setQsVisible(mVisible);
// Update the light bar
mLightBarController.setQsExpanded(mFullyExpanded);
}
float getLockscreenShadeDragProgress() {

View File

@@ -25,6 +25,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE
import android.annotation.ColorInt;
import android.content.Context;
import android.graphics.Rect;
import android.util.Log;
import android.view.InsetsFlags;
import android.view.ViewDebug;
import android.view.WindowInsetsController.Appearance;
@@ -35,13 +36,17 @@ import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
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.plugins.DarkIconDispatcher;
import com.android.systemui.settings.DisplayTracker;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.util.Compile;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import javax.inject.Inject;
@@ -51,10 +56,14 @@ import javax.inject.Inject;
@SysUISingleton
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 final SysuiDarkIconDispatcher mStatusBarIconController;
private final BatteryController mBatteryController;
private final boolean mUseNewLightBarLogic;
private BiometricUnlockController mBiometricUnlockController;
private LightBarTransitionsController mNavigationBarController;
@@ -67,13 +76,17 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
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;
/**
* Whether the flags indicate that a light status bar is requested. This doesn't factor in the
* scrim alpha yet.
* Whether the flags indicate that a light navigation bar is requested.
* "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;
@@ -82,22 +95,34 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
* {@link #mNavigationLight} {@code false}.
*/
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 mQsExpanded;
private boolean mGlobalActionsVisible;
private boolean mDirectReplying;
private boolean mNavbarColorManagedByIme;
private boolean mIsCustomizingForBackNav;
private String mLastSetScrimStateLog;
private String mLastNavigationBarAppearanceChangedLog;
@Inject
public LightBarController(
Context ctx,
DarkIconDispatcher darkIconDispatcher,
BatteryController batteryController,
NavigationModeController navModeController,
FeatureFlags featureFlags,
DumpManager dumpManager,
DisplayTracker displayTracker) {
mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC);
mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone);
mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone);
mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
@@ -159,9 +184,42 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
final boolean last = mNavigationLight;
mHasLightNavigationBar = isLight(appearance, navigationBarMode,
APPEARANCE_LIGHT_NAVIGATION_BARS);
mNavigationLight = mHasLightNavigationBar
&& (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim)
&& !mQsCustomizing;
if (mUseNewLightBarLogic) {
final boolean ignoreScrimForce = mDirectReplying && mNavbarColorManagedByIme;
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) {
updateNavigation();
}
@@ -188,6 +246,20 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
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.
* @param appearance the custmoized appearance.
@@ -225,16 +297,52 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
public void setScrimState(ScrimState scrimState, float scrimBehindAlpha,
GradientColors scrimInFrontColor) {
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.
mForceDarkForScrim = scrimState != ScrimState.BOUNCER
&& scrimState != ScrimState.BOUNCER_SCRIMMED
&& scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD
&& !scrimInFrontColor.supportsDarkText();
if (mHasLightNavigationBar && (mForceDarkForScrim != forceDarkForScrimLast)) {
reevaluate();
if (mUseNewLightBarLogic) {
boolean forceDarkForScrimLast = mForceDarkForScrim;
boolean forceLightForScrimLast = mForceLightForScrim;
final boolean forceForScrim =
scrimBehindAlpha >= NAV_BAR_INVERSION_SCRIM_ALPHA_THRESHOLD;
final boolean scrimColorIsLight = scrimInFrontColor.supportsDarkText();
mForceDarkForScrim = forceForScrim && !scrimColorIsLight;
mForceLightForScrim = forceForScrim && scrimColorIsLight;
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(" mNavigationLight="); pw.print(mNavigationLight);
pw.print(" mNavigationLight="); pw.println(mNavigationLight);
pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar);
pw.println();
pw.print(" mStatusBarMode="); pw.print(mStatusBarMode);
pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode);
pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim);
pw.print(" mQsCustomizing="); pw.print(mQsCustomizing);
pw.println();
pw.print(" mForceDarkForScrim="); pw.println(mForceDarkForScrim);
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(" mNavbarColorManagedByIme="); pw.println(mNavbarColorManagedByIme);
pw.println();
pw.println(" Recent Calculation Logs:");
pw.print(" "); pw.println(mLastSetScrimStateLog);
pw.print(" "); pw.println(mLastNavigationBarAppearanceChangedLog);
pw.println();
@@ -344,6 +460,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
private final DarkIconDispatcher mDarkIconDispatcher;
private final BatteryController mBatteryController;
private final NavigationModeController mNavModeController;
private final FeatureFlags mFeatureFlags;
private final DumpManager mDumpManager;
private final DisplayTracker mDisplayTracker;
@@ -352,12 +469,14 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
DarkIconDispatcher darkIconDispatcher,
BatteryController batteryController,
NavigationModeController navModeController,
FeatureFlags featureFlags,
DumpManager dumpManager,
DisplayTracker displayTracker) {
mDarkIconDispatcher = darkIconDispatcher;
mBatteryController = batteryController;
mNavModeController = navModeController;
mFeatureFlags = featureFlags;
mDumpManager = dumpManager;
mDisplayTracker = displayTracker;
}
@@ -365,7 +484,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
/** Create an {@link LightBarController} */
public LightBarController create(Context context) {
return new LightBarController(context, mDarkIconDispatcher, mBatteryController,
mNavModeController, mDumpManager, mDisplayTracker);
mNavModeController, mFeatureFlags, mDumpManager, mDisplayTracker);
}
}
}

View File

@@ -42,6 +42,7 @@ import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.util.function.TriConsumer;
import com.android.keyguard.BouncerPanelExpansionCalculator;
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 LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
private final FeatureFlags mFeatureFlags;
private final boolean mUseNewLightBarLogic;
private Consumer<Integer> mScrimVisibleListener;
private boolean mBlankScreen;
private boolean mScreenBlankingCallbackCalled;
@@ -306,6 +308,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
mScrimStateListener = lightBarController::setScrimState;
mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
mFeatureFlags = featureFlags;
mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC);
mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;
mKeyguardStateController = keyguardStateController;
@@ -1159,7 +1162,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
if (mClipsQsScrim && mQsBottomVisible) {
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() {
@@ -1487,8 +1496,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
int accent = Utils.getColorAccent(mScrimBehind.getContext()).getDefaultColor();
mColors.setMainColor(background);
mColors.setSecondaryColor(accent);
mColors.setSupportsDarkText(
ColorUtils.calculateContrast(mColors.getMainColor(), Color.WHITE) > 4.5);
if (mUseNewLightBarLogic) {
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;
}

View File

@@ -70,6 +70,7 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.VibratorHelper;
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.KeyguardStateController;
import com.android.systemui.telephony.TelephonyListenerManager;
@@ -115,6 +116,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
@Mock private MetricsLogger mMetricsLogger;
@Mock private SysuiColorExtractor mColorExtractor;
@Mock private IStatusBarService mStatusBarService;
@Mock private LightBarController mLightBarController;
@Mock private NotificationShadeWindowController mNotificationShadeWindowController;
@Mock private IWindowManager mWindowManager;
@Mock private Executor mBackgroundExecutor;
@@ -166,6 +168,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
mMetricsLogger,
mColorExtractor,
mStatusBarService,
mLightBarController,
mNotificationShadeWindowController,
mWindowManager,
mBackgroundExecutor,

View File

@@ -151,6 +151,7 @@ import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
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.ScreenOffAnimationController;
import com.android.systemui.statusbar.phone.ScrimController;
@@ -240,6 +241,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
@Mock protected KeyguardStatusBarViewComponent mKeyguardStatusBarViewComponent;
@Mock protected KeyguardClockSwitchController mKeyguardClockSwitchController;
@Mock protected KeyguardStatusBarViewController mKeyguardStatusBarViewController;
@Mock protected LightBarController mLightBarController;
@Mock protected NotificationStackScrollLayoutController
mNotificationStackScrollLayoutController;
@Mock protected NotificationShadeDepthController mNotificationShadeDepthController;
@@ -655,6 +657,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
mNotificationRemoteInputManager,
mShadeExpansionStateManager,
mStatusBarKeyguardViewManager,
mLightBarController,
mNotificationStackScrollLayoutController,
mLockscreenShadeTransitionController,
mNotificationShadeDepthController,

View File

@@ -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.KeyguardBypassController;
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.ScrimController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -133,6 +134,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase {
@Mock private PulseExpansionHandler mPulseExpansionHandler;
@Mock private NotificationRemoteInputManager mNotificationRemoteInputManager;
@Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Mock private LightBarController mLightBarController;
@Mock private NotificationStackScrollLayoutController mNotificationStackScrollLayoutController;
@Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController;
@Mock private NotificationShadeDepthController mNotificationShadeDepthController;
@@ -223,6 +225,7 @@ public class QuickSettingsControllerTest extends SysuiTestCase {
mNotificationRemoteInputManager,
mShadeExpansionStateManager,
mStatusBarKeyguardViewManager,
mLightBarController,
mNotificationStackScrollLayoutController,
mLockscreenShadeTransitionController,
mNotificationShadeDepthController,

View File

@@ -22,21 +22,31 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE
import static junit.framework.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.graphics.Color;
import android.graphics.Rect;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.annotation.ColorInt;
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.systemui.SysuiTestCase;
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.settings.FakeDisplayTracker;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -53,13 +63,25 @@ import java.util.ArrayList;
@TestableLooper.RunWithLooper
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 mNavBarController;
private SysuiDarkIconDispatcher mStatusBarIconController;
private LightBarController mLightBarController;
/** Allow testing with NEW_LIGHT_BAR_LOGIC flag in different states */
protected boolean testNewLightBarLogic() {
return false;
}
@Before
public void setup() {
mFeatureFlags.set(Flags.NEW_LIGHT_BAR_LOGIC, testNewLightBarLogic());
mStatusBarIconController = mock(SysuiDarkIconDispatcher.class);
mNavBarController = mock(LightBarTransitionsController.class);
when(mNavBarController.supportsIconTintForNavMode(anyInt())).thenReturn(true);
mLightBarTransitionsController = mock(LightBarTransitionsController.class);
when(mStatusBarIconController.getTransitionsController()).thenReturn(
mLightBarTransitionsController);
@@ -68,10 +90,19 @@ public class LightBarControllerTest extends SysuiTestCase {
mStatusBarIconController,
mock(BatteryController.class),
mock(NavigationModeController.class),
mFeatureFlags,
mock(DumpManager.class),
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
public void testOnStatusBarAppearanceChanged_multipleStacks_allStacksLight() {
final Rect firstBounds = new Rect(0, 0, 1, 1);
@@ -177,4 +208,54 @@ public class LightBarControllerTest extends SysuiTestCase {
false /* navbarColorManagedByIme */);
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);
}
}

View File

@@ -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
}