Use configuration for display rotation instead of display

- Unlike configuration updates, there are no synchronization guarantees
  with when a context's display information is updated, so in rare cases
  where a seamless display rotation happens, the nav bar can be resized
  and layout can happen before the context's display registers the new
  rotation, and in such cases we fail to update the button order to keep
  the button in the same physical position on the device.

Bug: 228398192
Test: Open camera in 3 button nav, rotate a bunch of times
Change-Id: I2769bc3fb4c069071b6984a0a22dfbe13cf13450
This commit is contained in:
Winson Chung
2022-05-10 00:06:16 +00:00
parent 446df44b6e
commit 1291424277

View File

@@ -317,7 +317,7 @@ public class NavigationBarView extends FrameLayout {
R.drawable.ic_sysbar_rotate_button_ccw_start_90,
R.drawable.ic_sysbar_rotate_button_cw_start_0,
R.drawable.ic_sysbar_rotate_button_cw_start_90,
() -> getDisplay().getRotation());
() -> mCurrentRotation);
mConfiguration = new Configuration();
mTmpLastConfiguration = new Configuration();
@@ -979,15 +979,27 @@ public class NavigationBarView extends FrameLayout {
return mCurrentRotation != rotation;
}
private void updateCurrentRotation() {
final int rotation = mConfiguration.windowConfiguration.getDisplayRotation();
if (mCurrentRotation == rotation) {
return;
}
mCurrentRotation = rotation;
mNavigationInflaterView.setAlternativeOrder(mCurrentRotation == Surface.ROTATION_90);
mDeadZone.onConfigurationChanged(mCurrentRotation);
if (DEBUG) {
Log.d(TAG, "updateCurrentRotation(): rot=" + mCurrentRotation);
}
}
private void updateCurrentView() {
resetViews();
mCurrentView = mIsVertical ? mVertical : mHorizontal;
mCurrentView.setVisibility(View.VISIBLE);
mNavigationInflaterView.setVertical(mIsVertical);
mCurrentRotation = getContextDisplay().getRotation();
mNavigationInflaterView.setAlternativeOrder(mCurrentRotation == Surface.ROTATION_90);
mNavigationInflaterView.updateButtonDispatchersCurrentView();
updateLayoutTransitionsEnabled();
updateCurrentRotation();
}
private void resetViews() {
@@ -1020,17 +1032,11 @@ public class NavigationBarView extends FrameLayout {
public void reorient() {
updateCurrentView();
((NavigationBarFrame) getRootView()).setDeadZone(mDeadZone);
mDeadZone.onConfigurationChanged(mCurrentRotation);
// force the low profile & disabled states into compliance
mBarTransitions.init();
if (DEBUG) {
Log.d(TAG, "reorient(): rot=" + mCurrentRotation);
}
// Resolve layout direction if not resolved since components changing layout direction such
// as changing languages will recreate this view and the direction will be resolved later
if (!isLayoutDirectionResolved()) {
@@ -1101,6 +1107,7 @@ public class NavigationBarView extends FrameLayout {
boolean uiCarModeChanged = updateCarMode();
updateIcons(mTmpLastConfiguration);
updateRecentsIcon();
updateCurrentRotation();
mEdgeBackGestureHandler.onConfigurationChanged(mConfiguration);
if (uiCarModeChanged || mTmpLastConfiguration.densityDpi != mConfiguration.densityDpi
|| mTmpLastConfiguration.getLayoutDirection() != mConfiguration.getLayoutDirection()) {