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

Commit 0e3c478f authored by JianYang Liu's avatar JianYang Liu
Browse files

Updated CarNavigationBar to update status bar icon appearance on start.

Bug: 155664476
Test: Manual, atest CarNavigationBarTest
Change-Id: I83dac7499c8bdcb5570df6c33f483f4928fe6549
parent d59d694f
Loading
Loading
Loading
Loading
+73 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.car.navigationbar;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.InsetsState.containsType;
import static android.view.InsetsState.containsType;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;


import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
@@ -34,26 +35,31 @@ import android.view.Display;
import android.view.Gravity;
import android.view.Gravity;
import android.view.View;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.view.WindowInsetsController;
import android.view.WindowManager;
import android.view.WindowManager;


import androidx.annotation.VisibleForTesting;
import androidx.annotation.VisibleForTesting;


import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.internal.view.AppearanceRegion;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.SystemUI;
import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.car.CarDeviceProvisionedListener;
import com.android.systemui.car.CarDeviceProvisionedListener;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.BarTransitions;
import com.android.systemui.statusbar.phone.BarTransitions;
import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy;
import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;


import java.io.FileDescriptor;
import java.io.FileDescriptor;
@@ -69,6 +75,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks


    private final Resources mResources;
    private final Resources mResources;
    private final CarNavigationBarController mCarNavigationBarController;
    private final CarNavigationBarController mCarNavigationBarController;
    private final SysuiDarkIconDispatcher mStatusBarIconController;
    private final WindowManager mWindowManager;
    private final WindowManager mWindowManager;
    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
    private final CommandQueue mCommandQueue;
    private final CommandQueue mCommandQueue;
@@ -106,6 +113,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
    private boolean mDeviceIsSetUpForUser = true;
    private boolean mDeviceIsSetUpForUser = true;
    private boolean mIsUserSetupInProgress = false;
    private boolean mIsUserSetupInProgress = false;


    private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0];
    @BarTransitions.TransitionMode
    @BarTransitions.TransitionMode
    private int mStatusBarMode;
    private int mStatusBarMode;
    @BarTransitions.TransitionMode
    @BarTransitions.TransitionMode
@@ -117,6 +125,9 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
    public CarNavigationBar(Context context,
    public CarNavigationBar(Context context,
            @Main Resources resources,
            @Main Resources resources,
            CarNavigationBarController carNavigationBarController,
            CarNavigationBarController carNavigationBarController,
            // TODO(b/156052638): Should not need to inject LightBarController
            LightBarController lightBarController,
            DarkIconDispatcher darkIconDispatcher,
            WindowManager windowManager,
            WindowManager windowManager,
            CarDeviceProvisionedController deviceProvisionedController,
            CarDeviceProvisionedController deviceProvisionedController,
            CommandQueue commandQueue,
            CommandQueue commandQueue,
@@ -133,6 +144,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
        super(context);
        super(context);
        mResources = resources;
        mResources = resources;
        mCarNavigationBarController = carNavigationBarController;
        mCarNavigationBarController = carNavigationBarController;
        mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
        mWindowManager = windowManager;
        mWindowManager = windowManager;
        mCarDeviceProvisionedController = deviceProvisionedController;
        mCarDeviceProvisionedController = deviceProvisionedController;
        mCommandQueue = commandQueue;
        mCommandQueue = commandQueue;
@@ -166,6 +178,9 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
            ex.rethrowFromSystemServer();
            ex.rethrowFromSystemServer();
        }
        }


        onSystemBarAppearanceChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions,
                result.mNavbarColorManagedByIme);

        // StatusBarManagerService has a back up of IME token and it's restored here.
        // StatusBarManagerService has a back up of IME token and it's restored here.
        setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
        setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
                result.mImeBackDisposition, result.mShowImeSwitcher);
                result.mImeBackDisposition, result.mShowImeSwitcher);
@@ -446,6 +461,64 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
                isKeyboardVisible ? View.GONE : View.VISIBLE);
                isKeyboardVisible ? View.GONE : View.VISIBLE);
    }
    }


    @Override
    public void onSystemBarAppearanceChanged(
            int displayId,
            @WindowInsetsController.Appearance int appearance,
            AppearanceRegion[] appearanceRegions,
            boolean navbarColorManagedByIme) {
        if (displayId != mDisplayId) {
            return;
        }
        boolean barModeChanged = updateStatusBarMode(
                mStatusBarTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
        int numStacks = appearanceRegions.length;
        boolean stackAppearancesChanged = mAppearanceRegions.length != numStacks;
        for (int i = 0; i < numStacks && !stackAppearancesChanged; i++) {
            stackAppearancesChanged |= !appearanceRegions[i].equals(mAppearanceRegions[i]);
        }
        if (stackAppearancesChanged || barModeChanged) {
            mAppearanceRegions = appearanceRegions;
            updateStatusBarAppearance();
        }
    }

    private void updateStatusBarAppearance() {
        int numStacks = mAppearanceRegions.length;
        int numLightStacks = 0;

        // We can only have maximum one light stack.
        int indexLightStack = -1;

        for (int i = 0; i < numStacks; i++) {
            if (isLight(mAppearanceRegions[i].getAppearance())) {
                numLightStacks++;
                indexLightStack = i;
            }
        }

        // If all stacks are light, all icons become dark.
        if (numLightStacks == numStacks) {
            mStatusBarIconController.setIconsDarkArea(null);
            mStatusBarIconController.getTransitionsController().setIconsDark(
                    /* dark= */ true, /* animate= */ false);
        } else if (numLightStacks == 0) {
            // If no one is light, all icons become white.
            mStatusBarIconController.getTransitionsController().setIconsDark(
                    /* dark= */ false, /* animate= */ false);
        } else {
            // Not the same for every stack, update icons in area only.
            mStatusBarIconController.setIconsDarkArea(
                    mAppearanceRegions[indexLightStack].getBounds());
            mStatusBarIconController.getTransitionsController().setIconsDark(
                    /* dark= */ true, /* animate= */ false);
        }
    }

    private static boolean isLight(int appearance) {
        return (appearance & APPEARANCE_LIGHT_STATUS_BARS) != 0;
    }

    @Override
    @Override
    public void showTransient(int displayId, int[] types) {
    public void showTransient(int displayId, int[] types) {
        if (displayId != mDisplayId) {
        if (displayId != mDisplayId) {
+44 −5
Original line number Original line Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.systemui.car.navigationbar;


import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_STATUS_BARS;


import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertThat;


@@ -25,6 +27,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.graphics.Rect;
import android.os.Handler;
import android.os.Handler;
import android.os.RemoteException;
import android.os.RemoteException;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
@@ -44,8 +47,11 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.time.FakeSystemClock;
@@ -69,6 +75,12 @@ public class CarNavigationBarTest extends SysuiTestCase {
    @Mock
    @Mock
    private CarNavigationBarController mCarNavigationBarController;
    private CarNavigationBarController mCarNavigationBarController;
    @Mock
    @Mock
    private LightBarController mLightBarController;
    @Mock
    private SysuiDarkIconDispatcher mStatusBarIconController;
    @Mock
    private LightBarTransitionsController mLightBarTransitionsController;
    @Mock
    private WindowManager mWindowManager;
    private WindowManager mWindowManager;
    @Mock
    @Mock
    private CarDeviceProvisionedController mDeviceProvisionedController;
    private CarDeviceProvisionedController mDeviceProvisionedController;
@@ -88,6 +100,7 @@ public class CarNavigationBarTest extends SysuiTestCase {
    private StatusBarIconController mIconController;
    private StatusBarIconController mIconController;


    private RegisterStatusBarResult mBarResult;
    private RegisterStatusBarResult mBarResult;
    private AppearanceRegion[] mAppearanceRegions;
    private FakeExecutor mUiBgExecutor;
    private FakeExecutor mUiBgExecutor;


    @Before
    @Before
@@ -96,11 +109,16 @@ public class CarNavigationBarTest extends SysuiTestCase {
        mTestableResources = mContext.getOrCreateTestableResources();
        mTestableResources = mContext.getOrCreateTestableResources();
        mHandler = Handler.getMain();
        mHandler = Handler.getMain();
        mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
        mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
        when(mStatusBarIconController.getTransitionsController()).thenReturn(
                mLightBarTransitionsController);
        mAppearanceRegions = new AppearanceRegion[] {
                new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect())
        };
        mBarResult = new RegisterStatusBarResult(
        mBarResult = new RegisterStatusBarResult(
                /* icons= */ new ArrayMap<>(),
                /* icons= */ new ArrayMap<>(),
                /* disabledFlags1= */ 0,
                /* disabledFlags1= */ 0,
                /* appearance= */ 0,
                /* appearance= */ 0,
                /* appearanceRegions= */ new AppearanceRegion[]{},
                mAppearanceRegions,
                /* imeWindowVis= */ 0,
                /* imeWindowVis= */ 0,
                /* imeBackDisposition= */ 0,
                /* imeBackDisposition= */ 0,
                /* showImeSwitcher= */ false,
                /* showImeSwitcher= */ false,
@@ -116,10 +134,11 @@ public class CarNavigationBarTest extends SysuiTestCase {
            e.printStackTrace();
            e.printStackTrace();
        }
        }
        mCarNavigationBar = new CarNavigationBar(mContext, mTestableResources.getResources(),
        mCarNavigationBar = new CarNavigationBar(mContext, mTestableResources.getResources(),
                mCarNavigationBarController, mWindowManager, mDeviceProvisionedController,
                mCarNavigationBarController, mLightBarController, mStatusBarIconController,
                new CommandQueue(mContext), mAutoHideController, mButtonSelectionStateListener,
                mWindowManager, mDeviceProvisionedController, new CommandQueue(mContext),
                mHandler, mUiBgExecutor, mBarService, () -> mKeyguardStateController,
                mAutoHideController, mButtonSelectionStateListener, mHandler, mUiBgExecutor,
                mButtonSelectionStateController, () -> mIconPolicy,  () -> mIconController);
                mBarService, () -> mKeyguardStateController, mButtonSelectionStateController,
                () -> mIconPolicy, () -> mIconController);
    }
    }


    @Test
    @Test
@@ -185,6 +204,26 @@ public class CarNavigationBarTest extends SysuiTestCase {
        verify(mCarNavigationBarController).hideAllKeyguardButtons(true);
        verify(mCarNavigationBarController).hideAllKeyguardButtons(true);
    }
    }


    @Test
    public void restartNavBars_lightAppearance_darkensAllIcons() {
        mAppearanceRegions[0] = new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect());

        mCarNavigationBar.start();

        verify(mLightBarTransitionsController).setIconsDark(
                /* dark= */ true, /* animate= */ false);
    }

    @Test
    public void restartNavBars_opaqueAppearance_lightensAllIcons() {
        mAppearanceRegions[0] = new AppearanceRegion(APPEARANCE_OPAQUE_STATUS_BARS, new Rect());

        mCarNavigationBar.start();

        verify(mLightBarTransitionsController).setIconsDark(
                /* dark= */ false, /* animate= */ false);
    }

    @Test
    @Test
    public void showTransient_wrongDisplayId_transientModeNotUpdated() {
    public void showTransient_wrongDisplayId_transientModeNotUpdated() {
        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);