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 */); |