diff options
| author | 2021-11-02 20:45:33 +0000 | |
|---|---|---|
| committer | 2021-11-02 20:45:33 +0000 | |
| commit | cec069482f80019c12f3c06c817d33fc5ad6151f (patch) | |
| tree | d03b6527c01425e6ce2d17cf02fba56ab3335375 | |
| parent | 1c3b93b10a8fff3e9bcd7d2bdc6da7c3cc434852 (diff) | |
| parent | 3b5c23ba72cc4b04c8f0bd11ae950cf1fd6d6c49 (diff) | |
Merge "[Status Bar Refactor] 1/N: Define a singleton PanelExpansionStateManager and pipe existing panel expansion callbacks through it." into sc-v2-dev
17 files changed, 197 insertions, 59 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java index db729da9c8bf..fcf1b2c9500a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardViewController.java @@ -20,11 +20,14 @@ import android.os.Bundle; import android.view.View; import android.view.ViewRootImpl; +import androidx.annotation.Nullable; + import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.StatusBar; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; /** * Interface to control Keyguard View. It should be implemented by KeyguardViewManagers, which @@ -184,14 +187,10 @@ public interface KeyguardViewController { /** * Registers the StatusBar to which this Keyguard View is mounted. - * @param statusBar - * @param notificationPanelViewController - * @param biometricUnlockController - * @param notificationContainer - * @param bypassController */ void registerStatusBar(StatusBar statusBar, NotificationPanelViewController notificationPanelViewController, + @Nullable PanelExpansionStateManager panelExpansionStateManager, BiometricUnlockController biometricUnlockController, View notificationContainer, KeyguardBypassController bypassController); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 19ee50ac99cd..f438181bc367 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -82,6 +82,8 @@ import android.view.WindowManagerPolicyConstants; import android.view.animation.Animation; import android.view.animation.AnimationUtils; +import androidx.annotation.Nullable; + import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor.Configuration; import com.android.internal.policy.IKeyguardDismissCallback; @@ -117,6 +119,7 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.unfold.UnfoldLightRevealOverlayAnimation; @@ -2654,10 +2657,16 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, */ public KeyguardViewController registerStatusBar(StatusBar statusBar, NotificationPanelViewController panelView, + @Nullable PanelExpansionStateManager panelExpansionStateManager, BiometricUnlockController biometricUnlockController, View notificationContainer, KeyguardBypassController bypassController) { - mKeyguardViewControllerLazy.get().registerStatusBar(statusBar, panelView, - biometricUnlockController, notificationContainer, bypassController); + mKeyguardViewControllerLazy.get().registerStatusBar( + statusBar, + panelView, + panelExpansionStateManager, + biometricUnlockController, + notificationContainer, + bypassController); return mKeyguardViewControllerLazy.get(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index 5648741e3caf..5f2b28baf7b5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -38,8 +38,8 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.phone.BiometricUnlockController import com.android.systemui.statusbar.phone.DozeParameters -import com.android.systemui.statusbar.phone.PanelExpansionListener import com.android.systemui.statusbar.phone.ScrimController +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.WallpaperController import java.io.FileDescriptor @@ -329,10 +329,10 @@ class NotificationShadeDepthController @Inject constructor( /** * Update blurs when pulling down the shade */ - override fun onPanelExpansionChanged(rawExpansion: Float, tracking: Boolean) { + override fun onPanelExpansionChanged(rawFraction: Float, tracking: Boolean) { val timestamp = SystemClock.elapsedRealtimeNanos() val expansion = MathUtils.saturate( - (rawExpansion - panelPullDownMinFraction) / (1f - panelPullDownMinFraction)) + (rawFraction - panelPullDownMinFraction) / (1f - panelPullDownMinFraction)) if (shadeExpansion == expansion && prevTracking == tracking) { prevTimestamp = timestamp diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index a2c9ffc6bdc4..3edeec643f80 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -27,8 +27,8 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.KeyguardBypassController -import com.android.systemui.statusbar.phone.PanelExpansionListener import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener import com.android.systemui.statusbar.policy.HeadsUpManager import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener import javax.inject.Inject @@ -294,8 +294,8 @@ class NotificationWakeUpCoordinator @Inject constructor( this.state = newState } - override fun onPanelExpansionChanged(expansion: Float, tracking: Boolean) { - val collapsedEnough = expansion <= 0.9f + override fun onPanelExpansionChanged(fraction: Float, tracking: Boolean) { + val collapsedEnough = fraction <= 0.9f if (collapsedEnough != this.collapsedEnoughToHide) { val couldShowPulsingHuns = canShowPulsingHuns this.collapsedEnoughToHide = collapsedEnough diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 3fe393d99c7f..19e802594076 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -169,6 +169,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -686,6 +687,7 @@ public class NotificationPanelViewController extends PanelViewController { SplitShadeHeaderController splitShadeHeaderController, UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, LockscreenGestureLogger lockscreenGestureLogger, + PanelExpansionStateManager panelExpansionStateManager, NotificationRemoteInputManager remoteInputManager, ControlsComponent controlsComponent) { super(view, @@ -699,6 +701,7 @@ public class NotificationPanelViewController extends PanelViewController { flingAnimationUtilsBuilder.get(), statusBarTouchableRegionManager, lockscreenGestureLogger, + panelExpansionStateManager, ambientState); mView = view; mVibratorHelper = vibratorHelper; @@ -2205,10 +2208,6 @@ public class NotificationPanelViewController extends PanelViewController { mStatusBar.executeRunnableDismissingKeyguard(null, null /* cancelAction */, false /* dismissShade */, true /* afterKeyguardGone */, false /* deferred */); } - for (int i = 0; i < mExpansionListeners.size(); i++) { - mExpansionListeners.get(i).onQsExpansionChanged( - mQsMaxExpansionHeight != 0 ? mQsExpansionHeight / mQsMaxExpansionHeight : 0); - } if (DEBUG) { mView.invalidate(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java index 36bd31b2efe3..8de041287c41 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java @@ -54,6 +54,7 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.tuner.TunerService; @@ -105,6 +106,7 @@ public class NotificationShadeWindowViewController { private boolean mExpandingBelowNotch; private final DockManager mDockManager; private final NotificationPanelViewController mNotificationPanelViewController; + private final PanelExpansionStateManager mPanelExpansionStateManager; private final StatusBarWindowView mStatusBarWindowView; // Used for determining view / touch intersection @@ -134,6 +136,7 @@ public class NotificationShadeWindowViewController { NotificationShadeDepthController depthController, NotificationShadeWindowView notificationShadeWindowView, NotificationPanelViewController notificationPanelViewController, + PanelExpansionStateManager panelExpansionStateManager, StatusBarWindowView statusBarWindowView, NotificationStackScrollLayoutController notificationStackScrollLayoutController, StatusBarKeyguardViewManager statusBarKeyguardViewManager, @@ -157,6 +160,7 @@ public class NotificationShadeWindowViewController { mShadeController = shadeController; mDockManager = dockManager; mNotificationPanelViewController = notificationPanelViewController; + mPanelExpansionStateManager = panelExpansionStateManager; mDepthController = depthController; mStatusBarWindowView = statusBarWindowView; mNotificationStackScrollLayoutController = notificationStackScrollLayoutController; @@ -442,7 +446,7 @@ public class NotificationShadeWindowViewController { setDragDownHelper(mLockscreenShadeTransitionController.getTouchHelper()); mDepthController.setRoot(mView); - mNotificationPanelViewController.addExpansionListener(mDepthController); + mPanelExpansionStateManager.addListener(mDepthController); } public NotificationShadeWindowView getView() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java index e5296af86b81..83f63ba96279 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java @@ -59,12 +59,12 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.wm.shell.animation.FlingAnimationUtils; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.util.ArrayList; public abstract class PanelViewController { public static final boolean DEBUG = PanelBar.DEBUG; @@ -86,7 +86,6 @@ public abstract class PanelViewController { private boolean mVibrateOnOpening; protected boolean mIsLaunchAnimationRunning; private int mFixedDuration = NO_FIXED_DURATION; - protected ArrayList<PanelExpansionListener> mExpansionListeners = new ArrayList<>(); protected float mOverExpansion; /** @@ -185,6 +184,7 @@ public abstract class PanelViewController { protected final SysuiStatusBarStateController mStatusBarStateController; protected final AmbientState mAmbientState; protected final LockscreenGestureLogger mLockscreenGestureLogger; + private final PanelExpansionStateManager mPanelExpansionStateManager; private final TouchHandler mTouchHandler; protected abstract void onExpandingFinished(); @@ -211,20 +211,25 @@ public abstract class PanelViewController { return mAmbientState; } - public PanelViewController(PanelView view, - FalsingManager falsingManager, DozeLog dozeLog, + public PanelViewController( + PanelView view, + FalsingManager falsingManager, + DozeLog dozeLog, KeyguardStateController keyguardStateController, - SysuiStatusBarStateController statusBarStateController, VibratorHelper vibratorHelper, + SysuiStatusBarStateController statusBarStateController, + VibratorHelper vibratorHelper, StatusBarKeyguardViewManager statusBarKeyguardViewManager, LatencyTracker latencyTracker, FlingAnimationUtils.Builder flingAnimationUtilsBuilder, StatusBarTouchableRegionManager statusBarTouchableRegionManager, LockscreenGestureLogger lockscreenGestureLogger, + PanelExpansionStateManager panelExpansionStateManager, AmbientState ambientState) { mAmbientState = ambientState; mView = view; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mLockscreenGestureLogger = lockscreenGestureLogger; + mPanelExpansionStateManager = panelExpansionStateManager; mTouchHandler = createTouchHandler(); mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { @Override @@ -1088,9 +1093,7 @@ public abstract class PanelViewController { mBar.panelExpansionChanged(mExpandedFraction, isExpanded()); } updateVisibility(); - for (int i = 0; i < mExpansionListeners.size(); i++) { - mExpansionListeners.get(i).onPanelExpansionChanged(mExpandedFraction, mTracking); - } + mPanelExpansionStateManager.onPanelExpansionChanged(mExpandedFraction, mTracking); } public boolean isExpanded() { @@ -1102,10 +1105,6 @@ public abstract class PanelViewController { && !mIsSpringBackAnimation; } - public void addExpansionListener(PanelExpansionListener panelExpansionListener) { - mExpansionListeners.add(panelExpansionListener); - } - protected abstract boolean isPanelVisibleBecauseOfHeadsUp(); /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 711e9412df7e..c9dd9833999a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -219,6 +219,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -541,6 +542,7 @@ public class StatusBar extends SystemUI implements private final NotificationGutsManager mGutsManager; private final NotificationLogger mNotificationLogger; private final NotificationViewHierarchyManager mViewHierarchyManager; + private final PanelExpansionStateManager mPanelExpansionStateManager; private final KeyguardViewMediator mKeyguardViewMediator; protected final NotificationInterruptStateProvider mNotificationInterruptStateProvider; private final BrightnessSliderController.Factory mBrightnessSliderFactory; @@ -726,6 +728,7 @@ public class StatusBar extends SystemUI implements NotificationLogger notificationLogger, NotificationInterruptStateProvider notificationInterruptStateProvider, NotificationViewHierarchyManager notificationViewHierarchyManager, + PanelExpansionStateManager panelExpansionStateManager, KeyguardViewMediator keyguardViewMediator, DisplayMetrics displayMetrics, MetricsLogger metricsLogger, @@ -832,6 +835,7 @@ public class StatusBar extends SystemUI implements mNotificationLogger = notificationLogger; mNotificationInterruptStateProvider = notificationInterruptStateProvider; mViewHierarchyManager = notificationViewHierarchyManager; + mPanelExpansionStateManager = panelExpansionStateManager; mKeyguardViewMediator = keyguardViewMediator; mDisplayMetrics = displayMetrics; mMetricsLogger = metricsLogger; @@ -1158,8 +1162,8 @@ public class StatusBar extends SystemUI implements mNotificationLogger.setUpWithContainer(notifListContainer); mNotificationIconAreaController.setupShelf(mNotificationShelfController); - mNotificationPanelViewController.addExpansionListener(mWakeUpCoordinator); - mNotificationPanelViewController.addExpansionListener( + mPanelExpansionStateManager.addListener(mWakeUpCoordinator); + mPanelExpansionStateManager.addListener( this::dispatchPanelExpansionForKeyguardDismiss); mUserSwitcherController.init(mNotificationShadeWindowView); @@ -1669,8 +1673,11 @@ public class StatusBar extends SystemUI implements }); mStatusBarKeyguardViewManager.registerStatusBar( /* statusBar= */ this, - mNotificationPanelViewController, mBiometricUnlockController, - mStackScroller, mKeyguardBypassController); + mNotificationPanelViewController, + mPanelExpansionStateManager, + mBiometricUnlockController, + mStackScroller, + mKeyguardBypassController); mKeyguardIndicationController .setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); mBiometricUnlockController.setKeyguardViewController(mStatusBarKeyguardViewManager); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index cac66a3186ca..523cf1844bca 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -63,6 +63,8 @@ import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.ViewGroupFadeHelper; import com.android.systemui.statusbar.phone.KeyguardBouncer.BouncerExpansionCallback; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -266,6 +268,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void registerStatusBar(StatusBar statusBar, NotificationPanelViewController notificationPanelViewController, + PanelExpansionStateManager panelExpansionStateManager, BiometricUnlockController biometricUnlockController, View notificationContainer, KeyguardBypassController bypassController) { @@ -275,7 +278,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb ViewGroup container = mStatusBar.getBouncerContainer(); mBouncer = mKeyguardBouncerFactory.create(container, mExpansionCallback); mNotificationPanelViewController = notificationPanelViewController; - notificationPanelViewController.addExpansionListener(this); + if (panelExpansionStateManager != null) { + panelExpansionStateManager.addListener(this); + } mBypassController = bypassController; mNotificationContainer = notificationContainer; mKeyguardMessageAreaController = mKeyguardMessageAreaFactory.create( @@ -323,7 +328,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } @Override - public void onPanelExpansionChanged(float expansion, boolean tracking) { + public void onPanelExpansionChanged(float fraction, boolean tracking) { // We don't want to translate the bounce when: // • Keyguard is occluded, because we're in a FLAG_SHOW_WHEN_LOCKED activity and need to // conserve the original animation. @@ -336,14 +341,14 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE); } else if (mShowing) { if (!isWakeAndUnlocking() && !mStatusBar.isInLaunchTransition()) { - mBouncer.setExpansion(expansion); + mBouncer.setExpansion(fraction); } - if (expansion != KeyguardBouncer.EXPANSION_HIDDEN && tracking + if (fraction != KeyguardBouncer.EXPANSION_HIDDEN && tracking && !mKeyguardStateController.canDismissLockScreen() && !mBouncer.isShowing() && !mBouncer.isAnimatingAway()) { mBouncer.show(false /* resetSecuritySelection */, false /* scrimmed */); } - } else if (mPulsing && expansion == KeyguardBouncer.EXPANSION_VISIBLE) { + } else if (mPulsing && fraction == KeyguardBouncer.EXPANSION_VISIBLE) { // Panel expanded while pulsing but didn't translate the bouncer (because we are // unlocked.) Let's simply wake-up to dismiss the lock screen. mStatusBar.wakeUpIfDozing(SystemClock.uptimeMillis(), mStatusBar.getBouncerContainer(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index 959c67334108..076a9a9bb012 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -102,6 +102,7 @@ import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -164,6 +165,7 @@ public interface StatusBarPhoneModule { NotificationLogger notificationLogger, NotificationInterruptStateProvider notificationInterruptStateProvider, NotificationViewHierarchyManager notificationViewHierarchyManager, + PanelExpansionStateManager panelExpansionStateManager, KeyguardViewMediator keyguardViewMediator, DisplayMetrics displayMetrics, MetricsLogger metricsLogger, @@ -268,6 +270,7 @@ public interface StatusBarPhoneModule { notificationLogger, notificationInterruptStateProvider, notificationViewHierarchyManager, + panelExpansionStateManager, keyguardViewMediator, displayMetrics, metricsLogger, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionListener.java index 655a25d22337..774609bceb4c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionListener.java @@ -11,28 +11,20 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License + * limitations under the License. */ -package com.android.systemui.statusbar.phone; +package com.android.systemui.statusbar.phone.panelstate; -/** - * Panel and QS expansion callbacks. - */ +/** A listener interface to be notified of expansion events for the notification panel. */ public interface PanelExpansionListener { /** * Invoked whenever the notification panel expansion changes, at every animation frame. * This is the main expansion that happens when the user is swiping up to dismiss the - * lock screen. + * lock screen and swiping to pull down the notification shade. * - * @param expansion 0 when collapsed, 1 when expanded. + * @param fraction 0 when collapsed, 1 when fully expanded. * @param tracking {@code true} when the user is actively dragging the panel. */ - void onPanelExpansionChanged(float expansion, boolean tracking); - - /** - * Invoked whenever the QS expansion changes, at every animation frame. - * @param expansion 0 when collapsed, 1 when expanded. - */ - default void onQsExpansionChanged(float expansion) {}; + void onPanelExpansionChanged(float fraction, boolean tracking); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManager.kt new file mode 100644 index 000000000000..1c8b1a8ed4b5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManager.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone.panelstate + +import androidx.annotation.FloatRange +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject + +/** + * A class responsible for managing the notification panel's current state. + * + * TODO(b/200063118): Move [PanelBar.panelExpansionChanged] logic to this class and make this class + * the one source of truth for the state of panel expansion. + */ +@SysUISingleton +class PanelExpansionStateManager @Inject constructor() { + + private val listeners: MutableList<PanelExpansionListener> = mutableListOf() + + /** Adds a listener that will be notified about panel events. */ + fun addListener(listener: PanelExpansionListener) { + listeners.add(listener) + } + + /** Called when the panel expansion has changed. Notifies all listeners of change. */ + fun onPanelExpansionChanged( + @FloatRange(from = 0.0, to = 1.0) fraction: Float, + tracking: Boolean + ) { + listeners.forEach { it.onPanelExpansionChanged(fraction, tracking) } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index ead32910f943..fabe5a141a6b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -121,6 +121,7 @@ import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.FakeExecutor; @@ -444,6 +445,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mSplitShadeHeaderController, mUnlockedScreenOffAnimationController, mLockscreenGestureLogger, + new PanelExpansionStateManager(), mNotificationRemoteInputManager, mControlsComponent); mNotificationPanelViewController.initDependencies( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java index 6e9bb2d30ed3..a9db1a422ca2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java @@ -52,6 +52,7 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.tuner.TunerService; @@ -135,6 +136,7 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase { mNotificationShadeDepthController, mView, mNotificationPanelViewController, + new PanelExpansionStateManager(), mStatusBarWindowView, mNotificationStackScrollLayoutController, mStatusBarKeyguardViewManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 2d944aa707bf..fbc41287c3f7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -51,6 +51,7 @@ import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -137,9 +138,13 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mUnlockedScreenOffAnimationController, mKeyguardMessageAreaFactory, mShadeController); - mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, - mNotificationPanelView, mBiometrucUnlockController, - mNotificationContainer, mBypassController); + mStatusBarKeyguardViewManager.registerStatusBar( + mStatusBar, + mNotificationPanelView, + new PanelExpansionStateManager(), + mBiometrucUnlockController, + mNotificationContainer, + mBypassController); mStatusBarKeyguardViewManager.show(null); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index f14b1266dd2e..d0d3d41abbc7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -133,6 +133,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; +import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -385,6 +386,7 @@ public class StatusBarTest extends SysuiTestCase { notificationLogger, mNotificationInterruptStateProvider, mNotificationViewHierarchyManager, + new PanelExpansionStateManager(), mKeyguardViewMediator, new DisplayMetrics(), mMetricsLogger, @@ -464,9 +466,13 @@ public class StatusBarTest extends SysuiTestCase { mock(DumpManager.class), mActivityLaunchAnimator, mDialogLaunchAnimator); - when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), - any(NotificationPanelViewController.class), any(BiometricUnlockController.class), - any(ViewGroup.class), any(KeyguardBypassController.class))) + when(mKeyguardViewMediator.registerStatusBar( + any(StatusBar.class), + any(NotificationPanelViewController.class), + any(PanelExpansionStateManager.class), + any(BiometricUnlockController.class), + any(ViewGroup.class), + any(KeyguardBypassController.class))) .thenReturn(mStatusBarKeyguardViewManager); when(mKeyguardViewMediator.getViewMediatorCallback()).thenReturn( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManagerTest.kt new file mode 100644 index 000000000000..8a1099768483 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/panelstate/PanelExpansionStateManagerTest.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone.panelstate + +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test + +@SmallTest +class PanelExpansionStateManagerTest : SysuiTestCase() { + + private lateinit var panelExpansionStateManager: PanelExpansionStateManager + + @Before + fun setUp() { + panelExpansionStateManager = PanelExpansionStateManager() + } + + @Test + fun onPanelExpansionChanged_listenersNotified() { + val listener = TestPanelExpansionListener() + panelExpansionStateManager.addListener(listener) + val fraction = 0.6f + val tracking = true + + panelExpansionStateManager.onPanelExpansionChanged(fraction, tracking) + + assertThat(listener.fraction).isEqualTo(fraction) + assertThat(listener.tracking).isEqualTo(tracking) + } + + class TestPanelExpansionListener : PanelExpansionListener { + var fraction: Float = 0f + var tracking: Boolean = false + + override fun onPanelExpansionChanged( + fraction: Float, + tracking: Boolean + ) { + this.fraction = fraction + this.tracking = tracking + } + } +} |