Merge "Show floating rotation button in visual immersive mode" into sc-dev

This commit is contained in:
Tracy Zhou
2021-02-03 03:28:41 +00:00
committed by Android (Google) Code Review
4 changed files with 36 additions and 7 deletions

View File

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

View File

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

View File

@@ -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;
// If the navbar is visible, show the rotate button if there's a pending suggestion
if (showing && mPendingRotationSuggestion) {
showAndLogRotationSuggestion();
}
showPendingRotationButtonIfNeeded();
}
}
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;
}

View File

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