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:
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user