diff options
4 files changed, 35 insertions, 6 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index fcb5da3f8c52..4384610b2027 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -545,6 +545,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } mNavigationBarView.setNavigationIconHints(mNavigationIconHints); mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); + mNavigationBarView.setBehavior(mBehavior); mSplitScreenOptional.ifPresent(mNavigationBarView::registerDockedListener); mPipOptional.ifPresent(mNavigationBarView::registerPipExclusionBoundsChangeListener); @@ -919,6 +920,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } if (mBehavior != behavior) { mBehavior = behavior; + if (mNavigationBarView != null) { + mNavigationBarView.setBehavior(behavior); + } updateSystemUiStateFlags(-1); } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index e7f2b2226d13..c07404c2e34d 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -57,6 +57,7 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver.InternalInsetsInfo; import android.view.ViewTreeObserver.OnComputeInternalInsetsListener; import android.view.WindowInsets; +import android.view.WindowInsetsController.Behavior; import android.view.WindowManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; @@ -626,6 +627,10 @@ public class NavigationBarView extends FrameLayout implements mRotationButtonController.onNavigationBarWindowVisibilityChange(visible); } + public void setBehavior(@Behavior int behavior) { + mRotationButtonController.onBehaviorChanged(behavior); + } + @Override public void setLayoutDirection(int layoutDirection) { reloadNavIcons(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java index df9e7a428877..33d180758f93 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java @@ -35,6 +35,8 @@ import android.view.IRotationWatcher.Stub; import android.view.MotionEvent; import android.view.Surface; import android.view.View; +import android.view.WindowInsetsController; +import android.view.WindowInsetsController.Behavior; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityManager; @@ -78,6 +80,7 @@ public class RotationButtonController { private Consumer<Integer> mRotWatcherListener; private boolean mListenersRegistered = false; private boolean mIsNavigationBarShowing; + private @Behavior int mBehavior = WindowInsetsController.BEHAVIOR_DEFAULT; private boolean mSkipOverrideUserLockPrefsOnce; private int mLightIconColor; private int mDarkIconColor; @@ -297,8 +300,8 @@ public class RotationButtonController { } mRotationButton.updateIcon(mLightIconColor, mDarkIconColor); - if (mIsNavigationBarShowing) { - // The navbar is visible so show the icon right away + if (canShowRotationButton()) { + // The navbar is visible / it's in visual immersive mode, so show the icon right away showAndLogRotationSuggestion(); } else { // If the navbar isn't shown, flag the rotate icon to be shown should the navbar become @@ -318,14 +321,28 @@ public class RotationButtonController { void onNavigationBarWindowVisibilityChange(boolean showing) { if (mIsNavigationBarShowing != showing) { mIsNavigationBarShowing = showing; + showPendingRotationButtonIfNeeded(); + } + } - // If the navbar is visible, show the rotate button if there's a pending suggestion - if (showing && mPendingRotationSuggestion) { - showAndLogRotationSuggestion(); - } + void onBehaviorChanged(@Behavior int behavior) { + if (mBehavior != behavior) { + mBehavior = behavior; + showPendingRotationButtonIfNeeded(); } } + private void showPendingRotationButtonIfNeeded() { + if (canShowRotationButton() && mPendingRotationSuggestion) { + showAndLogRotationSuggestion(); + } + } + + /** Return true when either the nav bar is visible or it's in visual immersive mode. */ + private boolean canShowRotationButton() { + return mIsNavigationBarShowing || mBehavior == WindowInsetsController.BEHAVIOR_DEFAULT; + } + public Context getContext() { return mContext; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarRotationContextTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarRotationContextTest.java index 51cf5016e8cc..47f41836f1a6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarRotationContextTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarRotationContextTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.view.View; +import android.view.WindowInsetsController; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -87,6 +88,8 @@ public class NavigationBarRotationContextTest extends SysuiTestCase { @Test public void testOnRotationProposalShowButtonShowNav() { // No navigation bar should not call to set visibility state + mRotationButtonController.onBehaviorChanged( + WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); mRotationButtonController.onNavigationBarWindowVisibilityChange(false /* showing */); verify(mRotationButtonController, times(0)).setRotateSuggestionButtonState( false /* visible */); |