Merge "Use NavBarHelper to keep shared initalizing state between nav/taskbar" into tm-qpr-dev
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.systemui.navigationbar;
|
package com.android.systemui.navigationbar;
|
||||||
|
|
||||||
|
import static android.app.StatusBarManager.WINDOW_NAVIGATION_BAR;
|
||||||
|
import static android.app.StatusBarManager.WindowVisibleState;
|
||||||
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
|
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
|
||||||
import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
|
import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
|
||||||
import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS;
|
import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS;
|
||||||
@@ -58,6 +60,7 @@ import com.android.systemui.dump.DumpManager;
|
|||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
import com.android.systemui.settings.UserTracker;
|
import com.android.systemui.settings.UserTracker;
|
||||||
import com.android.systemui.shared.system.QuickStepContract;
|
import com.android.systemui.shared.system.QuickStepContract;
|
||||||
|
import com.android.systemui.statusbar.CommandQueue;
|
||||||
import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
|
import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
|
||||||
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
||||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||||
@@ -86,7 +89,7 @@ public final class NavBarHelper implements
|
|||||||
AccessibilityButtonModeObserver.ModeChangedListener,
|
AccessibilityButtonModeObserver.ModeChangedListener,
|
||||||
AccessibilityButtonTargetsObserver.TargetsChangedListener,
|
AccessibilityButtonTargetsObserver.TargetsChangedListener,
|
||||||
OverviewProxyService.OverviewProxyListener, NavigationModeController.ModeChangedListener,
|
OverviewProxyService.OverviewProxyListener, NavigationModeController.ModeChangedListener,
|
||||||
Dumpable {
|
Dumpable, CommandQueue.Callbacks {
|
||||||
private final AccessibilityManager mAccessibilityManager;
|
private final AccessibilityManager mAccessibilityManager;
|
||||||
private final Lazy<AssistManager> mAssistManagerLazy;
|
private final Lazy<AssistManager> mAssistManagerLazy;
|
||||||
private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
|
private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
|
||||||
@@ -97,13 +100,18 @@ public final class NavBarHelper implements
|
|||||||
private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver;
|
private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver;
|
||||||
private final List<NavbarTaskbarStateUpdater> mA11yEventListeners = new ArrayList<>();
|
private final List<NavbarTaskbarStateUpdater> mA11yEventListeners = new ArrayList<>();
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private ContentResolver mContentResolver;
|
private final CommandQueue mCommandQueue;
|
||||||
|
private final ContentResolver mContentResolver;
|
||||||
private boolean mAssistantAvailable;
|
private boolean mAssistantAvailable;
|
||||||
private boolean mLongPressHomeEnabled;
|
private boolean mLongPressHomeEnabled;
|
||||||
private boolean mAssistantTouchGestureEnabled;
|
private boolean mAssistantTouchGestureEnabled;
|
||||||
private int mNavBarMode;
|
private int mNavBarMode;
|
||||||
private int mA11yButtonState;
|
private int mA11yButtonState;
|
||||||
|
|
||||||
|
// Attributes used in NavBarHelper.CurrentSysuiState
|
||||||
|
private int mWindowStateDisplayId;
|
||||||
|
private @WindowVisibleState int mWindowState;
|
||||||
|
|
||||||
private final ContentObserver mAssistContentObserver = new ContentObserver(
|
private final ContentObserver mAssistContentObserver = new ContentObserver(
|
||||||
new Handler(Looper.getMainLooper())) {
|
new Handler(Looper.getMainLooper())) {
|
||||||
@Override
|
@Override
|
||||||
@@ -128,8 +136,10 @@ public final class NavBarHelper implements
|
|||||||
KeyguardStateController keyguardStateController,
|
KeyguardStateController keyguardStateController,
|
||||||
NavigationModeController navigationModeController,
|
NavigationModeController navigationModeController,
|
||||||
UserTracker userTracker,
|
UserTracker userTracker,
|
||||||
DumpManager dumpManager) {
|
DumpManager dumpManager,
|
||||||
|
CommandQueue commandQueue) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
|
mCommandQueue = commandQueue;
|
||||||
mContentResolver = mContext.getContentResolver();
|
mContentResolver = mContext.getContentResolver();
|
||||||
mAccessibilityManager = accessibilityManager;
|
mAccessibilityManager = accessibilityManager;
|
||||||
mAssistManagerLazy = assistManagerLazy;
|
mAssistManagerLazy = assistManagerLazy;
|
||||||
@@ -160,10 +170,13 @@ public final class NavBarHelper implements
|
|||||||
false, mAssistContentObserver, UserHandle.USER_ALL);
|
false, mAssistContentObserver, UserHandle.USER_ALL);
|
||||||
updateAssistantAvailability();
|
updateAssistantAvailability();
|
||||||
updateA11yState();
|
updateA11yState();
|
||||||
|
mCommandQueue.addCallback(this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
mContentResolver.unregisterContentObserver(mAssistContentObserver);
|
mContentResolver.unregisterContentObserver(mAssistContentObserver);
|
||||||
|
mCommandQueue.removeCallback(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -333,6 +346,20 @@ public final class NavBarHelper implements
|
|||||||
|| (!isKeyguardShowing && (vis & InputMethodService.IME_VISIBLE) != 0);
|
|| (!isKeyguardShowing && (vis & InputMethodService.IME_VISIBLE) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setWindowState(int displayId, int window, int state) {
|
||||||
|
CommandQueue.Callbacks.super.setWindowState(displayId, window, state);
|
||||||
|
if (window != WINDOW_NAVIGATION_BAR) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mWindowStateDisplayId = displayId;
|
||||||
|
mWindowState = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CurrentSysuiState getCurrentSysuiState() {
|
||||||
|
return new CurrentSysuiState();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callbacks will get fired once immediately after registering via
|
* Callbacks will get fired once immediately after registering via
|
||||||
* {@link #registerNavTaskStateUpdater(NavbarTaskbarStateUpdater)}
|
* {@link #registerNavTaskStateUpdater(NavbarTaskbarStateUpdater)}
|
||||||
@@ -342,6 +369,17 @@ public final class NavBarHelper implements
|
|||||||
void updateAssistantAvailable(boolean available);
|
void updateAssistantAvailable(boolean available);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Data class to help Taskbar/Navbar initiate state correctly when switching between the two.*/
|
||||||
|
public class CurrentSysuiState {
|
||||||
|
public final int mWindowStateDisplayId;
|
||||||
|
public final @WindowVisibleState int mWindowState;
|
||||||
|
|
||||||
|
public CurrentSysuiState() {
|
||||||
|
mWindowStateDisplayId = NavBarHelper.this.mWindowStateDisplayId;
|
||||||
|
mWindowState = NavBarHelper.this.mWindowState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static @TransitionMode int transitionMode(boolean isTransient, int appearance) {
|
static @TransitionMode int transitionMode(boolean isTransient, int appearance) {
|
||||||
final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_NAVIGATION_BARS;
|
final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_NAVIGATION_BARS;
|
||||||
if (isTransient) {
|
if (isTransient) {
|
||||||
|
|||||||
@@ -650,6 +650,9 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mDisplayId = mContext.getDisplayId();
|
mDisplayId = mContext.getDisplayId();
|
||||||
mIsOnDefaultDisplay = mDisplayId == DEFAULT_DISPLAY;
|
mIsOnDefaultDisplay = mDisplayId == DEFAULT_DISPLAY;
|
||||||
|
|
||||||
|
// Ensure we try to get currentSysuiState from navBarHelper before command queue callbacks
|
||||||
|
// start firing, since the latter is source of truth
|
||||||
|
parseCurrentSysuiState();
|
||||||
mCommandQueue.addCallback(this);
|
mCommandQueue.addCallback(this);
|
||||||
mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
|
mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
|
||||||
mNavBarHelper.init();
|
mNavBarHelper.init();
|
||||||
@@ -937,6 +940,13 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
setOrientedHandleSamplingRegion(null);
|
setOrientedHandleSamplingRegion(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void parseCurrentSysuiState() {
|
||||||
|
NavBarHelper.CurrentSysuiState state = mNavBarHelper.getCurrentSysuiState();
|
||||||
|
if (state.mWindowStateDisplayId == mDisplayId) {
|
||||||
|
mNavigationBarWindowState = state.mWindowState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void reconfigureHomeLongClick() {
|
private void reconfigureHomeLongClick() {
|
||||||
if (mView.getHomeButton().getCurrentView() == null) {
|
if (mView.getHomeButton().getCurrentView() == null) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mDisplayId = displayId;
|
mDisplayId = displayId;
|
||||||
|
parseCurrentSysuiState();
|
||||||
mCommandQueue.addCallback(this);
|
mCommandQueue.addCallback(this);
|
||||||
mOverviewProxyService.addCallback(this);
|
mOverviewProxyService.addCallback(this);
|
||||||
mEdgeBackGestureHandler.onNavigationModeChanged(
|
mEdgeBackGestureHandler.onNavigationModeChanged(
|
||||||
@@ -271,6 +272,13 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
|
|||||||
return mInitialized;
|
return mInitialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void parseCurrentSysuiState() {
|
||||||
|
NavBarHelper.CurrentSysuiState state = mNavBarHelper.getCurrentSysuiState();
|
||||||
|
if (state.mWindowStateDisplayId == mDisplayId) {
|
||||||
|
mTaskBarWindowState = state.mWindowState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updateSysuiFlags() {
|
private void updateSysuiFlags() {
|
||||||
int a11yFlags = mNavBarHelper.getA11yButtonState();
|
int a11yFlags = mNavBarHelper.getA11yButtonState();
|
||||||
boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
|
boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.systemui.navigationbar;
|
package com.android.systemui.navigationbar;
|
||||||
|
|
||||||
|
import static android.app.StatusBarManager.WINDOW_NAVIGATION_BAR;
|
||||||
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
|
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU;
|
||||||
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR;
|
import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR;
|
||||||
|
|
||||||
@@ -47,6 +48,7 @@ import com.android.systemui.assist.AssistManager;
|
|||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
import com.android.systemui.settings.UserTracker;
|
import com.android.systemui.settings.UserTracker;
|
||||||
|
import com.android.systemui.statusbar.CommandQueue;
|
||||||
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
||||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||||
|
|
||||||
@@ -69,6 +71,10 @@ import dagger.Lazy;
|
|||||||
@SmallTest
|
@SmallTest
|
||||||
public class NavBarHelperTest extends SysuiTestCase {
|
public class NavBarHelperTest extends SysuiTestCase {
|
||||||
|
|
||||||
|
private static final int DISPLAY_ID = 0;
|
||||||
|
private static final int WINDOW = WINDOW_NAVIGATION_BAR;
|
||||||
|
private static final int STATE_ID = 0;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
AccessibilityManager mAccessibilityManager;
|
AccessibilityManager mAccessibilityManager;
|
||||||
@Mock
|
@Mock
|
||||||
@@ -93,6 +99,8 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
DumpManager mDumpManager;
|
DumpManager mDumpManager;
|
||||||
@Mock
|
@Mock
|
||||||
NavBarHelper.NavbarTaskbarStateUpdater mNavbarTaskbarStateUpdater;
|
NavBarHelper.NavbarTaskbarStateUpdater mNavbarTaskbarStateUpdater;
|
||||||
|
@Mock
|
||||||
|
CommandQueue mCommandQueue;
|
||||||
private AccessibilityManager.AccessibilityServicesStateChangeListener
|
private AccessibilityManager.AccessibilityServicesStateChangeListener
|
||||||
mAccessibilityServicesStateChangeListener;
|
mAccessibilityServicesStateChangeListener;
|
||||||
|
|
||||||
@@ -114,7 +122,7 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
mAccessibilityButtonModeObserver, mAccessibilityButtonTargetObserver,
|
mAccessibilityButtonModeObserver, mAccessibilityButtonTargetObserver,
|
||||||
mSystemActions, mOverviewProxyService, mAssistManagerLazy,
|
mSystemActions, mOverviewProxyService, mAssistManagerLazy,
|
||||||
() -> Optional.of(mock(CentralSurfaces.class)), mock(KeyguardStateController.class),
|
() -> Optional.of(mock(CentralSurfaces.class)), mock(KeyguardStateController.class),
|
||||||
mNavigationModeController, mUserTracker, mDumpManager);
|
mNavigationModeController, mUserTracker, mDumpManager, mCommandQueue);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,6 +249,45 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
ACCESSIBILITY_BUTTON_CLICKABLE_STATE);
|
ACCESSIBILITY_BUTTON_CLICKABLE_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void registerCommandQueueCallbacks() {
|
||||||
|
mNavBarHelper.init();
|
||||||
|
verify(mCommandQueue, times(1)).addCallback(any());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void saveMostRecentSysuiState() {
|
||||||
|
mNavBarHelper.init();
|
||||||
|
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, STATE_ID);
|
||||||
|
NavBarHelper.CurrentSysuiState state1 = mNavBarHelper.getCurrentSysuiState();
|
||||||
|
|
||||||
|
// Update window state
|
||||||
|
int newState = STATE_ID + 1;
|
||||||
|
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, newState);
|
||||||
|
NavBarHelper.CurrentSysuiState state2 = mNavBarHelper.getCurrentSysuiState();
|
||||||
|
|
||||||
|
// Ensure we get most recent state back
|
||||||
|
assertThat(state1.mWindowState).isNotEqualTo(state2.mWindowState);
|
||||||
|
assertThat(state1.mWindowStateDisplayId).isEqualTo(state2.mWindowStateDisplayId);
|
||||||
|
assertThat(state2.mWindowState).isEqualTo(newState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ignoreNonNavbarSysuiState() {
|
||||||
|
mNavBarHelper.init();
|
||||||
|
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, STATE_ID);
|
||||||
|
NavBarHelper.CurrentSysuiState state1 = mNavBarHelper.getCurrentSysuiState();
|
||||||
|
|
||||||
|
// Update window state for other window type
|
||||||
|
int newState = STATE_ID + 1;
|
||||||
|
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW + 1, newState);
|
||||||
|
NavBarHelper.CurrentSysuiState state2 = mNavBarHelper.getCurrentSysuiState();
|
||||||
|
|
||||||
|
// Ensure we get first state back
|
||||||
|
assertThat(state2.mWindowState).isEqualTo(state1.mWindowState);
|
||||||
|
assertThat(state2.mWindowState).isNotEqualTo(newState);
|
||||||
|
}
|
||||||
|
|
||||||
private List<String> createFakeShortcutTargets() {
|
private List<String> createFakeShortcutTargets() {
|
||||||
return new ArrayList<>(List.of("a", "b", "c", "d"));
|
return new ArrayList<>(List.of("a", "b", "c", "d"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
mSystemActions, mOverviewProxyService,
|
mSystemActions, mOverviewProxyService,
|
||||||
() -> mock(AssistManager.class), () -> Optional.of(mCentralSurfaces),
|
() -> mock(AssistManager.class), () -> Optional.of(mCentralSurfaces),
|
||||||
mKeyguardStateController, mock(NavigationModeController.class),
|
mKeyguardStateController, mock(NavigationModeController.class),
|
||||||
mock(UserTracker.class), mock(DumpManager.class)));
|
mock(UserTracker.class), mock(DumpManager.class), mock(CommandQueue.class)));
|
||||||
mNavigationBar = createNavBar(mContext);
|
mNavigationBar = createNavBar(mContext);
|
||||||
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
|
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
|
||||||
});
|
});
|
||||||
@@ -438,6 +438,12 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
verify(mNavigationBarView).setVisibility(View.INVISIBLE);
|
verify(mNavigationBarView).setVisibility(View.INVISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnInit_readCurrentSysuiState() {
|
||||||
|
mNavigationBar.init();
|
||||||
|
verify(mNavBarHelper, times(1)).getCurrentSysuiState();
|
||||||
|
}
|
||||||
|
|
||||||
private NavigationBar createNavBar(Context context) {
|
private NavigationBar createNavBar(Context context) {
|
||||||
DeviceProvisionedController deviceProvisionedController =
|
DeviceProvisionedController deviceProvisionedController =
|
||||||
mock(DeviceProvisionedController.class);
|
mock(DeviceProvisionedController.class);
|
||||||
|
|||||||
Reference in New Issue
Block a user