From 7ffe7418ea075aaebff1bb6d153bd531c65b4717 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Thu, 13 May 2021 21:16:37 -0700 Subject: [PATCH] [Live Tile] Do not allow rotation in Overview when home rotation is off In live tile mode, the live tile app is considered the top window and therefore rotation proposals are sent even when home rotation is disabled. To detect this, launcher needs to send over home rotation state, besides the nav bar needs to listen to recents animation state. Fixes: 185962767 Test: manual Change-Id: Ibc873d1067a8a3b37b6c20672cdb32ea356d9f21 --- .../shared/recents/ISystemUiProxy.aidl | 5 ++- .../systemui/navigationbar/NavigationBar.java | 6 ++++ .../RotationButtonController.java | 34 +++++++++++++++---- .../recents/OverviewProxyService.java | 22 ++++++++++++ 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl index 1e98f866bd4e7..f61cadb73a67b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl @@ -134,5 +134,8 @@ interface ISystemUiProxy { */ void onBackPressed() = 44; - // Next id = 45 + /** Sets home rotation enabled. */ + void setHomeRotationEnabled(boolean enabled) = 45; + + // Next id = 46 } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 4e41d75e3f437..04f519958d567 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -363,6 +363,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } } + @Override + public void onHomeRotationEnabled(boolean enabled) { + mNavigationBarView.getRotationButtonController().setHomeRotationEnabled(enabled); + } + @Override public void onOverviewShown(boolean fromHome) { // If the overview has fixed orientation that may change display to natural rotation, @@ -951,6 +956,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, if (running) { mNavbarOverlayController.setButtonState(/* visible */false, /* force */true); } + mNavigationBarView.getRotationButtonController().setRecentsAnimationRunning(running); } /** Restores the appearance and the transient saved state to {@link NavigationBar}. */ diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java index ddf089bac25e8..649ac875b4c22 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java @@ -71,6 +71,8 @@ public class RotationButtonController { private final ViewRippler mViewRippler = new ViewRippler(); private RotationButton mRotationButton; + private boolean mIsRecentsAnimationRunning; + private boolean mHomeRotationEnabled; private int mLastRotationSuggestion; private boolean mPendingRotationSuggestion; private boolean mHoveringRotationSuggestion; @@ -92,7 +94,6 @@ public class RotationButtonController { () -> mPendingRotationSuggestion = false; private Animator mRotateHideAnimator; - private final Stub mRotationWatcher = new Stub() { @Override public void onRotationChanged(final int rotation) throws RemoteException { @@ -105,7 +106,7 @@ public class RotationButtonController { if (shouldOverrideUserLockPrefs(rotation)) { setRotationLockedAtAngle(rotation); } - setRotateSuggestionButtonState(false /* visible */, true /* forced */); + setRotateSuggestionButtonState(false /* visible */, true /* hideImmediately */); } if (mRotWatcherListener != null) { @@ -192,10 +193,14 @@ public class RotationButtonController { } void setRotateSuggestionButtonState(boolean visible) { - setRotateSuggestionButtonState(visible, false /* force */); + setRotateSuggestionButtonState(visible, false /* hideImmediately */); } - void setRotateSuggestionButtonState(final boolean visible, final boolean force) { + /** + * Change the visibility of rotate suggestion button. If {@code hideImmediately} is true, + * it doesn't wait until the completion of the running animation. + */ + void setRotateSuggestionButtonState(final boolean visible, final boolean hideImmediately) { // At any point the the button can become invisible because an a11y service became active. // Similarly, a call to make the button visible may be rejected because an a11y service is // active. Must account for this. @@ -236,7 +241,7 @@ public class RotationButtonController { } else { // Hide mViewRippler.stop(); // Prevent any pending ripples, force hide or not - if (force) { + if (hideImmediately) { // If a hide animator is running stop it and make invisible if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) { mRotateHideAnimator.pause(); @@ -263,12 +268,29 @@ public class RotationButtonController { } } + void setRecentsAnimationRunning(boolean running) { + mIsRecentsAnimationRunning = running; + updateRotationButtonStateInOverview(); + } + + void setHomeRotationEnabled(boolean enabled) { + mHomeRotationEnabled = enabled; + updateRotationButtonStateInOverview(); + } + + private void updateRotationButtonStateInOverview() { + if (mIsRecentsAnimationRunning && !mHomeRotationEnabled) { + setRotateSuggestionButtonState(false, true /* hideImmediately */ ); + } + } + void setDarkIntensity(float darkIntensity) { mRotationButton.setDarkIntensity(darkIntensity); } void onRotationProposal(int rotation, int windowRotation, boolean isValid) { - if (!mRotationButton.acceptRotationProposal()) { + if (!mRotationButton.acceptRotationProposal() || (!mHomeRotationEnabled + && mIsRecentsAnimationRunning)) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 63adbd0b59f16..20c3e818e0976 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -259,6 +259,21 @@ public class OverviewProxyService extends CurrentUserTracker implements } } + @Override + public void setHomeRotationEnabled(boolean enabled) { + if (!verifyCaller("setHomeRotationEnabled")) { + return; + } + final long token = Binder.clearCallingIdentity(); + try { + mHandler.post(() -> { + mHandler.post(() -> notifyHomeRotationEnabled(enabled)); + }); + } finally { + Binder.restoreCallingIdentity(token); + } + } + private boolean sendEvent(int action, int code) { long when = SystemClock.uptimeMillis(); final KeyEvent ev = new KeyEvent(when, when, action, code, 0 /* repeat */, @@ -847,6 +862,12 @@ public class OverviewProxyService extends CurrentUserTracker implements } } + private void notifyHomeRotationEnabled(boolean enabled) { + for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { + mConnectionCallbacks.get(i).onHomeRotationEnabled(enabled); + } + } + private void notifyConnectionChanged() { for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { mConnectionCallbacks.get(i).onConnectionChanged(mOverviewProxy != null); @@ -994,6 +1015,7 @@ public class OverviewProxyService extends CurrentUserTracker implements default void onToggleRecentApps() {} /** Notify changes in the nav bar button alpha */ default void onNavBarButtonAlphaChanged(float alpha, boolean animate) {} + default void onHomeRotationEnabled(boolean enabled) {} default void onSystemUiStateChanged(int sysuiStateFlags) {} default void onAssistantProgress(@FloatRange(from = 0.0, to = 1.0) float progress) {} default void onAssistantGestureCompletion(float velocity) {}