Merge "Updated CarNavigationBar to update status bar icon appearance on start." into rvc-dev am: b4f62e7fd8

Change-Id: I5985e581623a682228416213317e9a42dee32c53
This commit is contained in:
TreeHugger Robot
2020-05-13 03:22:23 +00:00
committed by Automerger Merge Worker
2 changed files with 117 additions and 5 deletions

View File

@@ -19,6 +19,7 @@ package com.android.systemui.car.navigationbar;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
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_TRANSPARENT;
@@ -34,26 +35,31 @@ import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsetsController;
import android.view.WindowManager;
import androidx.annotation.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.internal.view.AppearanceRegion;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.car.CarDeviceProvisionedListener;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoHideController;
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.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy;
import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import java.io.FileDescriptor;
@@ -69,6 +75,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
private final Resources mResources;
private final CarNavigationBarController mCarNavigationBarController;
private final SysuiDarkIconDispatcher mStatusBarIconController;
private final WindowManager mWindowManager;
private final CarDeviceProvisionedController mCarDeviceProvisionedController;
private final CommandQueue mCommandQueue;
@@ -106,6 +113,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
private boolean mDeviceIsSetUpForUser = true;
private boolean mIsUserSetupInProgress = false;
private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0];
@BarTransitions.TransitionMode
private int mStatusBarMode;
@BarTransitions.TransitionMode
@@ -117,6 +125,9 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
public CarNavigationBar(Context context,
@Main Resources resources,
CarNavigationBarController carNavigationBarController,
// TODO(b/156052638): Should not need to inject LightBarController
LightBarController lightBarController,
DarkIconDispatcher darkIconDispatcher,
WindowManager windowManager,
CarDeviceProvisionedController deviceProvisionedController,
CommandQueue commandQueue,
@@ -133,6 +144,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
super(context);
mResources = resources;
mCarNavigationBarController = carNavigationBarController;
mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher;
mWindowManager = windowManager;
mCarDeviceProvisionedController = deviceProvisionedController;
mCommandQueue = commandQueue;
@@ -166,6 +178,9 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
ex.rethrowFromSystemServer();
}
onSystemBarAppearanceChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions,
result.mNavbarColorManagedByIme);
// StatusBarManagerService has a back up of IME token and it's restored here.
setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
result.mImeBackDisposition, result.mShowImeSwitcher);
@@ -446,6 +461,64 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
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
public void showTransient(int displayId, int[] types) {
if (displayId != mDisplayId) {

View File

@@ -18,6 +18,8 @@ package com.android.systemui.car.navigationbar;
import static android.view.InsetsState.ITYPE_NAVIGATION_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;
@@ -25,6 +27,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
import android.testing.AndroidTestingRunner;
@@ -44,8 +47,11 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.statusbar.CommandQueue;
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.StatusBarIconController;
import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
@@ -69,6 +75,12 @@ public class CarNavigationBarTest extends SysuiTestCase {
@Mock
private CarNavigationBarController mCarNavigationBarController;
@Mock
private LightBarController mLightBarController;
@Mock
private SysuiDarkIconDispatcher mStatusBarIconController;
@Mock
private LightBarTransitionsController mLightBarTransitionsController;
@Mock
private WindowManager mWindowManager;
@Mock
private CarDeviceProvisionedController mDeviceProvisionedController;
@@ -88,6 +100,7 @@ public class CarNavigationBarTest extends SysuiTestCase {
private StatusBarIconController mIconController;
private RegisterStatusBarResult mBarResult;
private AppearanceRegion[] mAppearanceRegions;
private FakeExecutor mUiBgExecutor;
@Before
@@ -96,11 +109,16 @@ public class CarNavigationBarTest extends SysuiTestCase {
mTestableResources = mContext.getOrCreateTestableResources();
mHandler = Handler.getMain();
mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
when(mStatusBarIconController.getTransitionsController()).thenReturn(
mLightBarTransitionsController);
mAppearanceRegions = new AppearanceRegion[] {
new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect())
};
mBarResult = new RegisterStatusBarResult(
/* icons= */ new ArrayMap<>(),
/* disabledFlags1= */ 0,
/* appearance= */ 0,
/* appearanceRegions= */ new AppearanceRegion[]{},
mAppearanceRegions,
/* imeWindowVis= */ 0,
/* imeBackDisposition= */ 0,
/* showImeSwitcher= */ false,
@@ -116,10 +134,11 @@ public class CarNavigationBarTest extends SysuiTestCase {
e.printStackTrace();
}
mCarNavigationBar = new CarNavigationBar(mContext, mTestableResources.getResources(),
mCarNavigationBarController, mWindowManager, mDeviceProvisionedController,
new CommandQueue(mContext), mAutoHideController, mButtonSelectionStateListener,
mHandler, mUiBgExecutor, mBarService, () -> mKeyguardStateController,
mButtonSelectionStateController, () -> mIconPolicy, () -> mIconController);
mCarNavigationBarController, mLightBarController, mStatusBarIconController,
mWindowManager, mDeviceProvisionedController, new CommandQueue(mContext),
mAutoHideController, mButtonSelectionStateListener, mHandler, mUiBgExecutor,
mBarService, () -> mKeyguardStateController, mButtonSelectionStateController,
() -> mIconPolicy, () -> mIconController);
}
@Test
@@ -185,6 +204,26 @@ public class CarNavigationBarTest extends SysuiTestCase {
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
public void showTransient_wrongDisplayId_transientModeNotUpdated() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);