summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java53
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java43
2 files changed, 80 insertions, 16 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
index c20732471cf4..2235035fe5aa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java
@@ -24,6 +24,8 @@ import android.os.SystemClock;
import android.util.MathUtils;
import android.util.TimeUtils;
+import androidx.annotation.VisibleForTesting;
+
import com.android.app.animation.Interpolators;
import com.android.internal.policy.GestureNavigationSettingsObserver;
import com.android.systemui.Dumpable;
@@ -96,13 +98,14 @@ public class LightBarTransitionsController implements Dumpable {
private final KeyguardStateController mKeyguardStateController;
private final StatusBarStateController mStatusBarStateController;
private final CommandQueue mCommandQueue;
- private final GestureNavigationSettingsObserver mGestureNavigationSettingsObserver;
+ private GestureNavigationSettingsObserver mGestureNavigationSettingsObserver;
private boolean mTransitionDeferring;
private long mTransitionDeferringStartTime;
private long mTransitionDeferringDuration;
private boolean mTransitionPending;
private boolean mTintChangePending;
+ private boolean mNavigationButtonsForcedVisible;
private float mPendingDarkIntensity;
private ValueAnimator mTintAnimator;
private float mDarkIntensity;
@@ -137,13 +140,16 @@ public class LightBarTransitionsController implements Dumpable {
mContext = context;
mDisplayId = mContext.getDisplayId();
mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(
- mHandler, mContext, null);
+ mHandler, mContext, this::onNavigationSettingsChanged);
+ mGestureNavigationSettingsObserver.register();
+ onNavigationSettingsChanged();
}
/** Call to cleanup the LightBarTransitionsController when done with it. */
public void destroy() {
mCommandQueue.removeCallback(mCallback);
mStatusBarStateController.removeCallback(mCallback);
+ mGestureNavigationSettingsObserver.unregister();
}
public void saveState(Bundle outState) {
@@ -199,6 +205,12 @@ public class LightBarTransitionsController implements Dumpable {
mTransitionPending = false;
}
+ @VisibleForTesting
+ void setNavigationSettingsObserver(GestureNavigationSettingsObserver observer) {
+ mGestureNavigationSettingsObserver = observer;
+ onNavigationSettingsChanged();
+ }
+
public void setIconsDark(boolean dark, boolean animate) {
if (!animate) {
setIconTintInternal(dark ? 1.0f : 0.0f);
@@ -253,6 +265,28 @@ public class LightBarTransitionsController implements Dumpable {
mApplier.applyDarkIntensity(MathUtils.lerp(mDarkIntensity, 0f, mDozeAmount));
}
+ public void onDozeAmountChanged(float linear, float eased) {
+ mDozeAmount = eased;
+ dispatchDark();
+ }
+
+ /**
+ * Called when the navigation settings change.
+ */
+ private void onNavigationSettingsChanged() {
+ mNavigationButtonsForcedVisible =
+ mGestureNavigationSettingsObserver.areNavigationButtonForcedVisible();
+ }
+
+ /**
+ * Return whether to use the tint calculated in this class for nav icons.
+ */
+ public boolean supportsIconTintForNavMode(int navigationMode) {
+ // In gesture mode, we already do region sampling to update tint based on content beneath.
+ return !QuickStepContract.isGesturalMode(navigationMode)
+ || mNavigationButtonsForcedVisible;
+ }
+
@Override
public void dump(PrintWriter pw, String[] args) {
pw.print(" mTransitionDeferring="); pw.print(mTransitionDeferring);
@@ -271,20 +305,7 @@ public class LightBarTransitionsController implements Dumpable {
pw.print(" mPendingDarkIntensity="); pw.print(mPendingDarkIntensity);
pw.print(" mDarkIntensity="); pw.print(mDarkIntensity);
pw.print(" mNextDarkIntensity="); pw.println(mNextDarkIntensity);
- }
-
- public void onDozeAmountChanged(float linear, float eased) {
- mDozeAmount = eased;
- dispatchDark();
- }
-
- /**
- * Return whether to use the tint calculated in this class for nav icons.
- */
- public boolean supportsIconTintForNavMode(int navigationMode) {
- // In gesture mode, we already do region sampling to update tint based on content beneath.
- return !QuickStepContract.isGesturalMode(navigationMode)
- || mGestureNavigationSettingsObserver.areNavigationButtonForcedVisible();
+ pw.print(" mAreNavigationButtonForcedVisible="); pw.println(mNavigationButtonsForcedVisible);
}
/**
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
index 0a68406882d4..f71114d92aa3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java
@@ -16,7 +16,14 @@
package com.android.systemui.statusbar.phone;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -26,6 +33,7 @@ import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
+import com.android.internal.policy.GestureNavigationSettingsObserver;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.settings.FakeDisplayTracker;
@@ -81,4 +89,39 @@ public class LightBarTransitionsControllerTest extends SysuiTestCase {
verify(mApplier).applyDarkIntensity(eq(0f));
}
+ @Test
+ public void gestureNav_noForceNavButtons_expectNotSupportsIconTint() {
+ GestureNavigationSettingsObserver observer = mock(GestureNavigationSettingsObserver.class);
+ doReturn(false).when(observer).areNavigationButtonForcedVisible();
+ mLightBarTransitionsController.setNavigationSettingsObserver(observer);
+ assertFalse(mLightBarTransitionsController.supportsIconTintForNavMode(
+ NAV_BAR_MODE_GESTURAL));
+ }
+
+ @Test
+ public void gestureNav_forceNavButtons_expectSupportsIconTint() {
+ GestureNavigationSettingsObserver observer = mock(GestureNavigationSettingsObserver.class);
+ doReturn(true).when(observer).areNavigationButtonForcedVisible();
+ mLightBarTransitionsController.setNavigationSettingsObserver(observer);
+ assertTrue(mLightBarTransitionsController.supportsIconTintForNavMode(
+ NAV_BAR_MODE_GESTURAL));
+ }
+
+ @Test
+ public void buttonNav_noForceNavButtons_expectNotSupportsIconTint() {
+ GestureNavigationSettingsObserver observer = mock(GestureNavigationSettingsObserver.class);
+ doReturn(false).when(observer).areNavigationButtonForcedVisible();
+ mLightBarTransitionsController.setNavigationSettingsObserver(observer);
+ assertTrue(mLightBarTransitionsController.supportsIconTintForNavMode(
+ NAV_BAR_MODE_3BUTTON));
+ }
+
+ @Test
+ public void buttonNav_forceNavButtons_expectSupportsIconTint() {
+ GestureNavigationSettingsObserver observer = mock(GestureNavigationSettingsObserver.class);
+ doReturn(true).when(observer).areNavigationButtonForcedVisible();
+ mLightBarTransitionsController.setNavigationSettingsObserver(observer);
+ assertTrue(mLightBarTransitionsController.supportsIconTintForNavMode(
+ NAV_BAR_MODE_3BUTTON));
+ }
}