Merge "Reset the clearAllInProgress flag when the shade is collapsed" into udc-dev

This commit is contained in:
Julia Reynolds
2023-06-01 12:40:21 +00:00
committed by Android (Google) Code Review
2 changed files with 80 additions and 10 deletions

View File

@@ -4079,6 +4079,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
if (!mIsExpansionChanging) {
cancelActiveSwipe();
}
finalizeClearAllAnimation();
}
updateNotificationAnimationStates();
updateChronometers();
@@ -4174,20 +4175,30 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
runAnimationFinishedRunnables();
clearTransient();
clearHeadsUpDisappearRunning();
finalizeClearAllAnimation();
}
private void finalizeClearAllAnimation() {
if (mAmbientState.isClearAllInProgress()) {
setClearAllInProgress(false);
if (mShadeNeedsToClose) {
mShadeNeedsToClose = false;
postDelayed(
() -> {
mShadeController.animateCollapseShade(CommandQueue.FLAG_EXCLUDE_NONE);
},
DELAY_BEFORE_SHADE_CLOSE /* delayMillis */);
if (mIsExpanded) {
collapseShadeDelayed();
}
}
}
}
private void collapseShadeDelayed() {
postDelayed(
() -> {
mShadeController.animateCollapseShade(
CommandQueue.FLAG_EXCLUDE_NONE);
},
DELAY_BEFORE_SHADE_CLOSE /* delayMillis */);
}
private void clearHeadsUpDisappearRunning() {
for (int i = 0; i < getChildCount(); i++) {
View view = getChildAt(i);
@@ -4535,6 +4546,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
mFooterView.setFooterLabelVisible(mHasFilteredOutSeenNotifications);
}
@VisibleForTesting
public void setClearAllInProgress(boolean clearAllInProgress) {
mClearAllInProgress = clearAllInProgress;
mAmbientState.setClearAllInProgress(clearAllInProgress);
@@ -5151,7 +5163,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
mHeadsUpAppearanceController = headsUpAppearanceController;
}
private boolean isVisible(View child) {
@VisibleForTesting
public boolean isVisible(View child) {
boolean hasClipBounds = child.getClipBounds(mTmpRect);
return child.getVisibility() == View.VISIBLE
&& (!hasClipBounds || mTmpRect.height() > 0);

View File

@@ -41,6 +41,7 @@ import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -575,10 +576,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
mStackScroller.inflateFooterView();
// add notification
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
NotificationEntry entry = mock(NotificationEntry.class);
when(row.getEntry()).thenReturn(entry);
when(entry.isClearable()).thenReturn(true);
ExpandableNotificationRow row = createClearableRow();
mStackScroller.addContainerView(row);
mStackScroller.onUpdateRowStates();
@@ -647,6 +645,50 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
assertEquals(ROWS_GENTLE, selected[0]);
}
@Test
public void testClearNotifications_clearAllInProgress() {
ExpandableNotificationRow row = createClearableRow();
when(row.getEntry().hasFinishedInitialization()).thenReturn(true);
doReturn(true).when(mStackScroller).isVisible(row);
mStackScroller.addContainerView(row);
mStackScroller.clearNotifications(ROWS_ALL, false);
assertClearAllInProgress(true);
verify(mNotificationRoundnessManager).setClearAllInProgress(true);
}
@Test
public void testOnChildAnimationFinished_resetsClearAllInProgress() {
mStackScroller.setClearAllInProgress(true);
mStackScroller.onChildAnimationFinished();
assertClearAllInProgress(false);
verify(mNotificationRoundnessManager).setClearAllInProgress(false);
}
@Test
public void testShadeCollapsed_resetsClearAllInProgress() {
mStackScroller.setClearAllInProgress(true);
mStackScroller.setIsExpanded(false);
assertClearAllInProgress(false);
verify(mNotificationRoundnessManager).setClearAllInProgress(false);
}
@Test
public void testShadeExpanded_doesntChangeClearAllInProgress() {
mStackScroller.setClearAllInProgress(true);
clearInvocations(mNotificationRoundnessManager);
mStackScroller.setIsExpanded(true);
assertClearAllInProgress(true);
verify(mNotificationRoundnessManager, never()).setClearAllInProgress(anyBoolean());
}
@Test
public void testAddNotificationUpdatesSpeedBumpIndex() {
// initial state calculated == 0
@@ -896,6 +938,21 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
mStackScroller.setStatusBarState(state);
}
private ExpandableNotificationRow createClearableRow() {
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
NotificationEntry entry = mock(NotificationEntry.class);
when(row.canViewBeCleared()).thenReturn(true);
when(row.getEntry()).thenReturn(entry);
when(entry.isClearable()).thenReturn(true);
return row;
}
private void assertClearAllInProgress(boolean expected) {
assertEquals(expected, mStackScroller.getClearAllInProgress());
assertEquals(expected, mAmbientState.isClearAllInProgress());
}
private static void mockBoundsOnScreen(View view, Rect bounds) {
doAnswer(invocation -> {
Rect out = invocation.getArgument(0);