Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7e34ec6 authored by Winson Chung's avatar Winson Chung
Browse files

Cache force-navigation settings state

Fixes: 308798376
Test: atest LightBarTransitionsControllerTest
Test: Run through SUW and ensure the value is used correctly and it is
      cached across fold/unfold
Change-Id: If1f1a1ae6af7ce1f9c75e0c56c4ef64579e08821
parent 0edd8471
Loading
Loading
Loading
Loading
+37 −16
Original line number Original line Diff line number Diff line
@@ -24,6 +24,8 @@ import android.os.SystemClock;
import android.util.MathUtils;
import android.util.MathUtils;
import android.util.TimeUtils;
import android.util.TimeUtils;


import androidx.annotation.VisibleForTesting;

import com.android.app.animation.Interpolators;
import com.android.app.animation.Interpolators;
import com.android.internal.policy.GestureNavigationSettingsObserver;
import com.android.internal.policy.GestureNavigationSettingsObserver;
import com.android.systemui.Dumpable;
import com.android.systemui.Dumpable;
@@ -96,13 +98,14 @@ public class LightBarTransitionsController implements Dumpable {
    private final KeyguardStateController mKeyguardStateController;
    private final KeyguardStateController mKeyguardStateController;
    private final StatusBarStateController mStatusBarStateController;
    private final StatusBarStateController mStatusBarStateController;
    private final CommandQueue mCommandQueue;
    private final CommandQueue mCommandQueue;
    private final GestureNavigationSettingsObserver mGestureNavigationSettingsObserver;
    private GestureNavigationSettingsObserver mGestureNavigationSettingsObserver;


    private boolean mTransitionDeferring;
    private boolean mTransitionDeferring;
    private long mTransitionDeferringStartTime;
    private long mTransitionDeferringStartTime;
    private long mTransitionDeferringDuration;
    private long mTransitionDeferringDuration;
    private boolean mTransitionPending;
    private boolean mTransitionPending;
    private boolean mTintChangePending;
    private boolean mTintChangePending;
    private boolean mNavigationButtonsForcedVisible;
    private float mPendingDarkIntensity;
    private float mPendingDarkIntensity;
    private ValueAnimator mTintAnimator;
    private ValueAnimator mTintAnimator;
    private float mDarkIntensity;
    private float mDarkIntensity;
@@ -137,13 +140,16 @@ public class LightBarTransitionsController implements Dumpable {
        mContext = context;
        mContext = context;
        mDisplayId = mContext.getDisplayId();
        mDisplayId = mContext.getDisplayId();
        mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(
        mGestureNavigationSettingsObserver = new GestureNavigationSettingsObserver(
                mHandler, mContext, null);
                mHandler, mContext, this::onNavigationSettingsChanged);
        mGestureNavigationSettingsObserver.register();
        onNavigationSettingsChanged();
    }
    }


    /** Call to cleanup the LightBarTransitionsController when done with it. */
    /** Call to cleanup the LightBarTransitionsController when done with it. */
    public void destroy() {
    public void destroy() {
        mCommandQueue.removeCallback(mCallback);
        mCommandQueue.removeCallback(mCallback);
        mStatusBarStateController.removeCallback(mCallback);
        mStatusBarStateController.removeCallback(mCallback);
        mGestureNavigationSettingsObserver.unregister();
    }
    }


    public void saveState(Bundle outState) {
    public void saveState(Bundle outState) {
@@ -199,6 +205,12 @@ public class LightBarTransitionsController implements Dumpable {
        mTransitionPending = false;
        mTransitionPending = false;
    }
    }


    @VisibleForTesting
    void setNavigationSettingsObserver(GestureNavigationSettingsObserver observer) {
        mGestureNavigationSettingsObserver = observer;
        onNavigationSettingsChanged();
    }

    public void setIconsDark(boolean dark, boolean animate) {
    public void setIconsDark(boolean dark, boolean animate) {
        if (!animate) {
        if (!animate) {
            setIconTintInternal(dark ? 1.0f : 0.0f);
            setIconTintInternal(dark ? 1.0f : 0.0f);
@@ -253,6 +265,28 @@ public class LightBarTransitionsController implements Dumpable {
        mApplier.applyDarkIntensity(MathUtils.lerp(mDarkIntensity, 0f, mDozeAmount));
        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
    @Override
    public void dump(PrintWriter pw, String[] args) {
    public void dump(PrintWriter pw, String[] args) {
        pw.print("  mTransitionDeferring="); pw.print(mTransitionDeferring);
        pw.print("  mTransitionDeferring="); pw.print(mTransitionDeferring);
@@ -271,20 +305,7 @@ public class LightBarTransitionsController implements Dumpable {
        pw.print("  mPendingDarkIntensity="); pw.print(mPendingDarkIntensity);
        pw.print("  mPendingDarkIntensity="); pw.print(mPendingDarkIntensity);
        pw.print(" mDarkIntensity="); pw.print(mDarkIntensity);
        pw.print(" mDarkIntensity="); pw.print(mDarkIntensity);
        pw.print(" mNextDarkIntensity="); pw.println(mNextDarkIntensity);
        pw.print(" mNextDarkIntensity="); pw.println(mNextDarkIntensity);
    }
        pw.print(" mAreNavigationButtonForcedVisible="); pw.println(mNavigationButtonsForcedVisible);

    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();
    }
    }


    /**
    /**
+43 −0
Original line number Original line Diff line number Diff line
@@ -16,7 +16,14 @@


package com.android.systemui.statusbar.phone;
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.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.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
@@ -26,6 +33,7 @@ import android.testing.TestableLooper;


import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;


import com.android.internal.policy.GestureNavigationSettingsObserver;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.settings.FakeDisplayTracker;
import com.android.systemui.settings.FakeDisplayTracker;
@@ -81,4 +89,39 @@ public class LightBarTransitionsControllerTest extends SysuiTestCase {
        verify(mApplier).applyDarkIntensity(eq(0f));
        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));
    }
}
}