Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java +37 −16 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); } /** Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java +43 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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)); } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java +37 −16 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); } /** Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java +43 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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)); } }