Merge "Use NavBarHelper to keep shared initalizing state between nav/taskbar" into tm-qpr-dev

This commit is contained in:
Vinit Nayak
2022-11-24 18:22:27 +00:00
committed by Android (Google) Code Review
5 changed files with 114 additions and 5 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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"));
} }

View File

@@ -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);