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

Commit 04b5ac1b authored by Riley Jones's avatar Riley Jones
Browse files

LightBarController updates button tint on navigation mode change

This ensures lighting changes made while in gesture navigation
are properly applied when switching to 3-button navigation.

Flag: android.view.accessibility.light_bar_update_button_tint_on_nav_mode_change
Bug: 387395420
Test: atest LightBarControllerTest
Change-Id: I9a89079a4ec9195aa826c5728dbd6d1449ba5304
parent 58ba36c9
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -212,6 +212,16 @@ flag {
    is_exported: true
}

flag {
    name: "light_bar_update_button_tint_on_nav_mode_change"
    namespace: "accessibility"
    description: "adds logic to update navbar button tint when navigation mode changes"
    bug: "387395420"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "motion_event_observing"
    is_exported: true
+35 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.phone;

import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;

import static com.android.systemui.shared.statusbar.phone.BarTransitions.MODE_TRANSPARENT;

@@ -35,6 +36,8 @@ import static org.mockito.Mockito.when;

import android.graphics.Color;
import android.graphics.Rect;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;

import androidx.annotation.ColorInt;
@@ -78,7 +81,7 @@ public class LightBarControllerTest extends SysuiTestCase {
    private LightBarTransitionsController mLightBarTransitionsController;
    private LightBarTransitionsController mNavBarController;
    private SysuiDarkIconDispatcher mStatusBarIconController;
    private LightBarController mLightBarController;
    private LightBarControllerImpl mLightBarController;
    private final TestScope mTestScope = TestScopeProvider.getTestScope();
    private final FakeStatusBarModePerDisplayRepository mStatusBarModeRepository =
            new FakeStatusBarModePerDisplayRepository();
@@ -91,12 +94,14 @@ public class LightBarControllerTest extends SysuiTestCase {
        mLightBarTransitionsController = mock(LightBarTransitionsController.class);
        when(mStatusBarIconController.getTransitionsController()).thenReturn(
                mLightBarTransitionsController);
        NavigationModeController navigationModeController = mock(NavigationModeController.class);

        mLightBarController = new LightBarControllerImpl(
                mContext.getDisplayId(),
                mTestScope,
                mStatusBarIconController,
                mock(BatteryController.class),
                mock(NavigationModeController.class),
                navigationModeController,
                mStatusBarModeRepository,
                mock(DumpManager.class),
                mTestScope.getCoroutineContext(),
@@ -430,8 +435,36 @@ public class LightBarControllerTest extends SysuiTestCase {
        verifyNavBarIconsDark(false, /* didFireEvent= */ false);
    }

    @Test
    @EnableFlags(
            android.view.accessibility.Flags.FLAG_LIGHT_BAR_UPDATE_BUTTON_TINT_ON_NAV_MODE_CHANGE)
    public void navModeChanges_3buttonNavigation_setsDark() {
        mLightBarController.setNavigationBar(mNavBarController);
        clearInvocations(mNavBarController);

        mLightBarController.onNavigationModeChanged(NAV_BAR_MODE_3BUTTON);
        verifyNavBarIconsWereChanged();
    }

    @Test
    @DisableFlags(
            android.view.accessibility.Flags.FLAG_LIGHT_BAR_UPDATE_BUTTON_TINT_ON_NAV_MODE_CHANGE)
    public void navModeChanges_3buttonNavigation_doesNotSetDark() {
        mLightBarController.setNavigationBar(mNavBarController);
        clearInvocations(mNavBarController);

        mLightBarController.onNavigationModeChanged(NAV_BAR_MODE_3BUTTON);
        verifyNavBarIconsUnchanged();
    }

    private void verifyNavBarIconsWereChanged() {
        verify(mNavBarController).setIconsDark(anyBoolean(), anyBoolean());
        clearInvocations(mNavBarController);
    }

    private void verifyNavBarIconsUnchanged() {
        verify(mNavBarController, never()).setIconsDark(anyBoolean(), anyBoolean());
        clearInvocations(mNavBarController);
    }

    private void verifyNavBarIconsDarkSetTo(boolean iconsDark) {
+12 −6
Original line number Diff line number Diff line
@@ -60,7 +60,8 @@ import java.util.ArrayList;
 * Controls how light status bar flag applies to the icons.
 */
public class LightBarControllerImpl implements
        BatteryController.BatteryStateChangeCallback, LightBarController {
        BatteryController.BatteryStateChangeCallback, LightBarController,
        NavigationModeController.ModeChangedListener {

    private static final String TAG = "LightBarController";
    private static final boolean DEBUG_NAVBAR = Compile.IS_DEBUG;
@@ -127,9 +128,6 @@ public class LightBarControllerImpl implements

    private final String mDumpableName;

    private final NavigationModeController.ModeChangedListener mNavigationModeListener =
            (mode) -> mNavigationMode = mode;

    @AssistedInject
    public LightBarControllerImpl(
            @Assisted int displayId,
@@ -158,7 +156,7 @@ public class LightBarControllerImpl implements
    public void start() {
        mDumpManager.registerCriticalDumpable(mDumpableName, this);
        mBatteryController.addCallback(this);
        mNavigationMode = mNavModeController.addListener(mNavigationModeListener);
        mNavigationMode = mNavModeController.addListener(this);
        JavaAdapterKt.collectFlow(
                mCoroutineScope,
                mMainContext,
@@ -170,7 +168,7 @@ public class LightBarControllerImpl implements
    public void stop() {
        mDumpManager.unregisterDumpable(mDumpableName);
        mBatteryController.removeCallback(this);
        mNavModeController.removeListener(mNavigationModeListener);
        mNavModeController.removeListener(this);
    }

    @Override
@@ -480,6 +478,14 @@ public class LightBarControllerImpl implements
        }
    }

    @Override
    public void onNavigationModeChanged(int mode) {
        mNavigationMode = mode;
        if (android.view.accessibility.Flags.lightBarUpdateButtonTintOnNavModeChange()) {
            updateNavigation();
        }
    }

    /** Injectable factory for creating a {@link LightBarControllerImpl}. */
    @AssistedFactory
    @FunctionalInterface