Reset HUN roundness after cancellation of disappearing animation

If the disappear animation of a notification is canceled before it
finishes, the roundness of the notification may remain in an
inconsistent state. After a debug session, it was determined that the
simplest solution was to handle the animation cancellation rather than
prevent it.

Test: atest ExpandableNotificationRowTest
Bug: 289805597
Change-Id: Ie88e1cbe2f562a7d818ae051d5cb67c4c856be8b
This commit is contained in:
omarmt
2023-07-07 15:46:34 +00:00
parent 35efb8f5d0
commit 6999144fca
2 changed files with 54 additions and 5 deletions

View File

@@ -426,16 +426,21 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
updateAppearAnimationAlpha();
updateAppearRect();
mAppearAnimator.addListener(new AnimatorListenerAdapter() {
private boolean mWasCancelled;
private boolean mRunWithoutInterruptions;
@Override
public void onAnimationEnd(Animator animation) {
if (onFinishedRunnable != null) {
onFinishedRunnable.run();
}
if (!mWasCancelled) {
if (mRunWithoutInterruptions) {
enableAppearDrawing(false);
onAppearAnimationFinished(isAppearing);
}
// We need to reset the View state, even if the animation was cancelled
onAppearAnimationFinished(isAppearing);
if (mRunWithoutInterruptions) {
InteractionJankMonitor.getInstance().end(getCujType(isAppearing));
} else {
InteractionJankMonitor.getInstance().cancel(getCujType(isAppearing));
@@ -444,7 +449,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
@Override
public void onAnimationStart(Animator animation) {
mWasCancelled = false;
mRunWithoutInterruptions = true;
Configuration.Builder builder = Configuration.Builder
.withView(getCujType(isAppearing), ActivatableNotificationView.this);
InteractionJankMonitor.getInstance().begin(builder);
@@ -452,7 +457,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
@Override
public void onAnimationCancel(Animator animation) {
mWasCancelled = true;
mRunWithoutInterruptions = false;
}
});

View File

@@ -789,6 +789,50 @@ public class ExpandableNotificationRowTest extends SysuiTestCase {
assertThat(row.isExpanded()).isTrue();
}
@Test
public void onDisappearAnimationFinished_shouldSetFalse_headsUpAnimatingAway()
throws Exception {
final ExpandableNotificationRow row = mNotificationTestHelper.createRow();
// Initial state: suppose heads up animation in progress
row.setHeadsUpAnimatingAway(true);
assertThat(row.isHeadsUpAnimatingAway()).isTrue();
// on disappear animation ends
row.onAppearAnimationFinished(/* wasAppearing = */ false);
assertThat(row.isHeadsUpAnimatingAway()).isFalse();
}
@Test
public void onHUNAppear_cancelAppearDrawing_shouldResetAnimationState() throws Exception {
final ExpandableNotificationRow row = mNotificationTestHelper.createRow();
row.performAddAnimation(/* delay */ 0, /* duration */ 1000, /* isHeadsUpAppear */ true);
waitForIdleSync();
assertThat(row.isDrawingAppearAnimation()).isTrue();
row.cancelAppearDrawing();
waitForIdleSync();
assertThat(row.isDrawingAppearAnimation()).isFalse();
}
@Test
public void onHUNDisappear_cancelAppearDrawing_shouldResetAnimationState() throws Exception {
final ExpandableNotificationRow row = mNotificationTestHelper.createRow();
row.performAddAnimation(/* delay */ 0, /* duration */ 1000, /* isHeadsUpAppear */ false);
waitForIdleSync();
assertThat(row.isDrawingAppearAnimation()).isTrue();
row.cancelAppearDrawing();
waitForIdleSync();
assertThat(row.isDrawingAppearAnimation()).isFalse();
}
private void setDrawableIconsInImageView(CachingIconView icon, Drawable iconDrawable,
Drawable rightIconDrawable) {
ImageView iconView = mock(ImageView.class);