Merge "Show floating rotation button in visual immersive mode" into sc-dev
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */);
|
||||
|
||||
Reference in New Issue
Block a user