Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +28 −0 Original line number Diff line number Diff line Loading @@ -1325,10 +1325,24 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (mOnStackYChanged != null) { mOnStackYChanged.accept(listenerNeedsAnimation); } updateStackEndHeightAndStackHeight(fraction); } @VisibleForTesting public void updateStackEndHeightAndStackHeight(float fraction) { final float oldStackHeight = mAmbientState.getStackHeight(); if (mQsExpansionFraction <= 0 && !shouldSkipHeightUpdate()) { final float endHeight = updateStackEndHeight( getHeight(), getEmptyBottomMargin(), mTopPadding); updateStackHeight(endHeight, fraction); } else { // Always updateStackHeight to prevent jumps in the stack height when this fraction // suddenly reapplies after a freeze. final float endHeight = mAmbientState.getStackEndHeight(); updateStackHeight(endHeight, fraction); } if (oldStackHeight != mAmbientState.getStackHeight()) { requestChildrenUpdate(); } } Loading @@ -1345,6 +1359,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable return stackEndHeight; } @VisibleForTesting public void updateStackHeight(float endHeight, float fraction) { // During the (AOD<=>LS) transition where dozeAmount is changing, // apply dozeAmount to stack height instead of expansionFraction Loading Loading @@ -5019,6 +5034,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void setUnlockHintRunning(boolean running) { mAmbientState.setUnlockHintRunning(running); if (!running) { // re-calculate the stack height which was frozen while running this animation updateStackPosition(); } } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void setPanelFlinging(boolean flinging) { mAmbientState.setIsFlinging(flinging); if (!flinging) { // re-calculate the stack height which was frozen while flinging updateStackPosition(); } } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +4 −0 Original line number Diff line number Diff line Loading @@ -1195,6 +1195,10 @@ public class NotificationStackScrollLayoutController { mView.setUnlockHintRunning(running); } public void setPanelFlinging(boolean flinging) { mView.setPanelFlinging(flinging); } public boolean isFooterViewNotGone() { return mView.isFooterViewNotGone(); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +2 −2 Original line number Diff line number Diff line Loading @@ -1799,14 +1799,14 @@ public class NotificationPanelViewController extends PanelViewController { mHeadsUpTouchHelper.notifyFling(!expand); mKeyguardStateController.notifyPanelFlingStart(!expand /* flingingToDismiss */); setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f); mAmbientState.setIsFlinging(true); mNotificationStackScrollLayoutController.setPanelFlinging(true); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } @Override protected void onFlingEnd(boolean cancelled) { super.onFlingEnd(cancelled); mAmbientState.setIsFlinging(false); mNotificationStackScrollLayoutController.setPanelFlinging(false); } private boolean onQsIntercept(MotionEvent event) { Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +72 −4 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading Loading @@ -122,12 +123,12 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { allowTestableLooperAsMainThread(); // Interact with real instance of AmbientState. mAmbientState = new AmbientState( mAmbientState = spy(new AmbientState( mContext, mDumpManager, mNotificationSectionsManager, mBypassController, mStatusBarKeyguardViewManager); mStatusBarKeyguardViewManager)); // Inject dependencies before initializing the layout mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState); Loading Loading @@ -190,7 +191,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { endHeight, dozeAmount); mStackScroller.updateStackHeight(endHeight, expansionFraction); assertTrue(mAmbientState.getStackHeight() == expected); assertThat(mAmbientState.getStackHeight()).isEqualTo(expected); } @Test Loading @@ -205,7 +206,74 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { endHeight, expansionFraction); mStackScroller.updateStackHeight(endHeight, expansionFraction); assertTrue(mAmbientState.getStackHeight() == expected); assertThat(mAmbientState.getStackHeight()).isEqualTo(expected); } @Test public void updateStackEndHeightAndStackHeight_normallyUpdatesBoth() { final float expansionFraction = 0.5f; mAmbientState.setStatusBarState(StatusBarState.KEYGUARD); // Validate that by default we update everything clearInvocations(mAmbientState); mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction); verify(mAmbientState).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); } @Test public void updateStackEndHeightAndStackHeight_onlyUpdatesStackHeightDuringSwipeUp() { final float expansionFraction = 0.5f; mAmbientState.setStatusBarState(StatusBarState.KEYGUARD); mAmbientState.setSwipingUp(true); // Validate that when the gesture is in progress, we update only the stackHeight clearInvocations(mAmbientState); mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction); verify(mAmbientState, never()).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); } @Test public void setPanelFlinging_updatesStackEndHeightOnlyOnFinish() { final float expansionFraction = 0.5f; mAmbientState.setStatusBarState(StatusBarState.KEYGUARD); mAmbientState.setSwipingUp(true); mStackScroller.setPanelFlinging(true); mAmbientState.setSwipingUp(false); // Validate that when the animation is running, we update only the stackHeight clearInvocations(mAmbientState); mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction); verify(mAmbientState, never()).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); // Validate that when the animation ends the stackEndHeight is recalculated immediately clearInvocations(mAmbientState); mStackScroller.setPanelFlinging(false); verify(mAmbientState).setIsFlinging(eq(false)); verify(mAmbientState).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); } @Test public void setUnlockHintRunning_updatesStackEndHeightOnlyOnFinish() { final float expansionFraction = 0.5f; mAmbientState.setStatusBarState(StatusBarState.KEYGUARD); mStackScroller.setUnlockHintRunning(true); // Validate that when the animation is running, we update only the stackHeight clearInvocations(mAmbientState); mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction); verify(mAmbientState, never()).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); // Validate that when the animation ends the stackEndHeight is recalculated immediately clearInvocations(mAmbientState); mStackScroller.setUnlockHintRunning(false); verify(mAmbientState).setUnlockHintRunning(eq(false)); verify(mAmbientState).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); } @Test Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +28 −0 Original line number Diff line number Diff line Loading @@ -1325,10 +1325,24 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (mOnStackYChanged != null) { mOnStackYChanged.accept(listenerNeedsAnimation); } updateStackEndHeightAndStackHeight(fraction); } @VisibleForTesting public void updateStackEndHeightAndStackHeight(float fraction) { final float oldStackHeight = mAmbientState.getStackHeight(); if (mQsExpansionFraction <= 0 && !shouldSkipHeightUpdate()) { final float endHeight = updateStackEndHeight( getHeight(), getEmptyBottomMargin(), mTopPadding); updateStackHeight(endHeight, fraction); } else { // Always updateStackHeight to prevent jumps in the stack height when this fraction // suddenly reapplies after a freeze. final float endHeight = mAmbientState.getStackEndHeight(); updateStackHeight(endHeight, fraction); } if (oldStackHeight != mAmbientState.getStackHeight()) { requestChildrenUpdate(); } } Loading @@ -1345,6 +1359,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable return stackEndHeight; } @VisibleForTesting public void updateStackHeight(float endHeight, float fraction) { // During the (AOD<=>LS) transition where dozeAmount is changing, // apply dozeAmount to stack height instead of expansionFraction Loading Loading @@ -5019,6 +5034,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void setUnlockHintRunning(boolean running) { mAmbientState.setUnlockHintRunning(running); if (!running) { // re-calculate the stack height which was frozen while running this animation updateStackPosition(); } } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void setPanelFlinging(boolean flinging) { mAmbientState.setIsFlinging(flinging); if (!flinging) { // re-calculate the stack height which was frozen while flinging updateStackPosition(); } } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +4 −0 Original line number Diff line number Diff line Loading @@ -1195,6 +1195,10 @@ public class NotificationStackScrollLayoutController { mView.setUnlockHintRunning(running); } public void setPanelFlinging(boolean flinging) { mView.setPanelFlinging(flinging); } public boolean isFooterViewNotGone() { return mView.isFooterViewNotGone(); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +2 −2 Original line number Diff line number Diff line Loading @@ -1799,14 +1799,14 @@ public class NotificationPanelViewController extends PanelViewController { mHeadsUpTouchHelper.notifyFling(!expand); mKeyguardStateController.notifyPanelFlingStart(!expand /* flingingToDismiss */); setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f); mAmbientState.setIsFlinging(true); mNotificationStackScrollLayoutController.setPanelFlinging(true); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } @Override protected void onFlingEnd(boolean cancelled) { super.onFlingEnd(cancelled); mAmbientState.setIsFlinging(false); mNotificationStackScrollLayoutController.setPanelFlinging(false); } private boolean onQsIntercept(MotionEvent event) { Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +72 −4 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading Loading @@ -122,12 +123,12 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { allowTestableLooperAsMainThread(); // Interact with real instance of AmbientState. mAmbientState = new AmbientState( mAmbientState = spy(new AmbientState( mContext, mDumpManager, mNotificationSectionsManager, mBypassController, mStatusBarKeyguardViewManager); mStatusBarKeyguardViewManager)); // Inject dependencies before initializing the layout mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState); Loading Loading @@ -190,7 +191,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { endHeight, dozeAmount); mStackScroller.updateStackHeight(endHeight, expansionFraction); assertTrue(mAmbientState.getStackHeight() == expected); assertThat(mAmbientState.getStackHeight()).isEqualTo(expected); } @Test Loading @@ -205,7 +206,74 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { endHeight, expansionFraction); mStackScroller.updateStackHeight(endHeight, expansionFraction); assertTrue(mAmbientState.getStackHeight() == expected); assertThat(mAmbientState.getStackHeight()).isEqualTo(expected); } @Test public void updateStackEndHeightAndStackHeight_normallyUpdatesBoth() { final float expansionFraction = 0.5f; mAmbientState.setStatusBarState(StatusBarState.KEYGUARD); // Validate that by default we update everything clearInvocations(mAmbientState); mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction); verify(mAmbientState).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); } @Test public void updateStackEndHeightAndStackHeight_onlyUpdatesStackHeightDuringSwipeUp() { final float expansionFraction = 0.5f; mAmbientState.setStatusBarState(StatusBarState.KEYGUARD); mAmbientState.setSwipingUp(true); // Validate that when the gesture is in progress, we update only the stackHeight clearInvocations(mAmbientState); mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction); verify(mAmbientState, never()).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); } @Test public void setPanelFlinging_updatesStackEndHeightOnlyOnFinish() { final float expansionFraction = 0.5f; mAmbientState.setStatusBarState(StatusBarState.KEYGUARD); mAmbientState.setSwipingUp(true); mStackScroller.setPanelFlinging(true); mAmbientState.setSwipingUp(false); // Validate that when the animation is running, we update only the stackHeight clearInvocations(mAmbientState); mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction); verify(mAmbientState, never()).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); // Validate that when the animation ends the stackEndHeight is recalculated immediately clearInvocations(mAmbientState); mStackScroller.setPanelFlinging(false); verify(mAmbientState).setIsFlinging(eq(false)); verify(mAmbientState).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); } @Test public void setUnlockHintRunning_updatesStackEndHeightOnlyOnFinish() { final float expansionFraction = 0.5f; mAmbientState.setStatusBarState(StatusBarState.KEYGUARD); mStackScroller.setUnlockHintRunning(true); // Validate that when the animation is running, we update only the stackHeight clearInvocations(mAmbientState); mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction); verify(mAmbientState, never()).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); // Validate that when the animation ends the stackEndHeight is recalculated immediately clearInvocations(mAmbientState); mStackScroller.setUnlockHintRunning(false); verify(mAmbientState).setUnlockHintRunning(eq(false)); verify(mAmbientState).setStackEndHeight(anyFloat()); verify(mAmbientState).setStackHeight(anyFloat()); } @Test Loading