diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java | 75 |
1 files changed, 50 insertions, 25 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index da042d2bb8ce..407be6253bfd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -113,7 +113,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private static final String EXTRA_DISABLE_STATE = "disabled_state"; private final static int BUTTON_FADE_IN_OUT_DURATION_MS = 100; - private final static int ROTATE_BUTTON_LOOP_DURATION_MS = 2000; + private final static int NAVBAR_HIDDEN_PENDING_ICON_TIMEOUT_MS = 20000; private static final int NUM_ACCEPTED_ROTATION_SUGGESTIONS_FOR_INTRODUCTION = 3; @@ -152,11 +152,14 @@ public class NavigationBarFragment extends Fragment implements Callbacks { public boolean mHomeBlockedThisTouch; private int mLastRotationSuggestion; + private boolean mPendingRotationSuggestion; private boolean mHoveringRotationSuggestion; private RotationLockController mRotationLockController; private TaskStackListenerImpl mTaskStackListener; private final Runnable mRemoveRotationProposal = () -> setRotateSuggestionButtonState(false); + private final Runnable mCancelPendingRotationProposal = + () -> mPendingRotationSuggestion = false; private Animator mRotateHideAnimator; private ViewRippler mViewRippler = new ViewRippler(); @@ -365,6 +368,11 @@ public class NavigationBarFragment extends Fragment implements Callbacks { && mNavigationBarWindowState != state) { mNavigationBarWindowState = state; if (DEBUG_WINDOW_STATE) Log.d(TAG, "Navigation bar " + windowStateToString(state)); + + // If the navbar is visible, show the rotate button if there's a pending suggestion + if (state == WINDOW_STATE_SHOWING && mPendingRotationSuggestion) { + showAndLogRotationSuggestion(); + } } } @@ -373,40 +381,53 @@ public class NavigationBarFragment extends Fragment implements Callbacks { // This method will be called on rotation suggestion changes even if the proposed rotation // is not valid for the top app. Use invalid rotation choices as a signal to remove the // rotate button if shown. - if (!isValid) { setRotateSuggestionButtonState(false); return; } + // If window rotation matches suggested rotation, remove any current suggestions final int winRotation = mWindowManager.getDefaultDisplay().getRotation(); if (rotation == winRotation) { - // Use this as a signal to remove any current suggestions - getView().getHandler().removeCallbacks(mRemoveRotationProposal); + getView().removeCallbacks(mRemoveRotationProposal); setRotateSuggestionButtonState(false); - } else { - mLastRotationSuggestion = rotation; // Remember rotation for click - - // Update the icon style to change animation parameters - if (mNavigationBarView != null) { - final boolean rotationCCW = isRotationAnimationCCW(winRotation, rotation); - int style; - if (winRotation == Surface.ROTATION_0 || winRotation == Surface.ROTATION_180) { - style = rotationCCW ? R.style.RotateButtonCCWStart90 : - R.style.RotateButtonCWStart90; - } else { // 90 or 270 - style = rotationCCW ? R.style.RotateButtonCCWStart0 : - R.style.RotateButtonCWStart0; - } - mNavigationBarView.updateRotateSuggestionButtonStyle(style, true); + return; + } + + // Prepare to show the navbar icon by updating the icon style to change anim params + mLastRotationSuggestion = rotation; // Remember rotation for click + if (mNavigationBarView != null) { + final boolean rotationCCW = isRotationAnimationCCW(winRotation, rotation); + int style; + if (winRotation == Surface.ROTATION_0 || winRotation == Surface.ROTATION_180) { + style = rotationCCW ? R.style.RotateButtonCCWStart90 : + R.style.RotateButtonCWStart90; + } else { // 90 or 270 + style = rotationCCW ? R.style.RotateButtonCCWStart0 : + R.style.RotateButtonCWStart0; } + mNavigationBarView.updateRotateSuggestionButtonStyle(style, true); + } + + if (mNavigationBarWindowState != WINDOW_STATE_SHOWING) { + // If the navbar isn't shown, flag the rotate icon to be shown should the navbar become + // visible given some time limit. + mPendingRotationSuggestion = true; + getView().removeCallbacks(mCancelPendingRotationProposal); + getView().postDelayed(mCancelPendingRotationProposal, + NAVBAR_HIDDEN_PENDING_ICON_TIMEOUT_MS); - setRotateSuggestionButtonState(true); - rescheduleRotationTimeout(false); - mMetricsLogger.visible(MetricsEvent.ROTATION_SUGGESTION_SHOWN); + } else { // The navbar is visible so show the icon right away + showAndLogRotationSuggestion(); } } + private void showAndLogRotationSuggestion() { + setRotateSuggestionButtonState(true); + rescheduleRotationTimeout(false); + mMetricsLogger.visible(MetricsEvent.ROTATION_SUGGESTION_SHOWN); + } + private boolean isRotationAnimationCCW(int from, int to) { // All 180deg WM rotation animations are CCW, match that if (from == Surface.ROTATION_0 && to == Surface.ROTATION_90) return false; @@ -453,6 +474,11 @@ public class NavigationBarFragment extends Fragment implements Callbacks { animIcon = (AnimatedVectorDrawable) kbd.getDrawable(0); } + // Clear any pending suggestion flag as it has either been nullified or is being shown + mPendingRotationSuggestion = false; + getView().removeCallbacks(mCancelPendingRotationProposal); + + // Handle the visibility change and animation if (visible) { // Appear and change (cannot force) // Stop and clear any currently running hide animations if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) { @@ -516,9 +542,8 @@ public class NavigationBarFragment extends Fragment implements Callbacks { if (!mNavigationBarView.isRotateButtonVisible()) return; } - Handler h = getView().getHandler(); - h.removeCallbacks(mRemoveRotationProposal); // Stop any pending removal - h.postDelayed(mRemoveRotationProposal, + getView().removeCallbacks(mRemoveRotationProposal); // Stop any pending removal + getView().postDelayed(mRemoveRotationProposal, computeRotationProposalTimeout()); // Schedule timeout } |