From 1dd67cbe81c0290cebe986ed08236e12d72a7587 Mon Sep 17 00:00:00 2001 From: Aaron Heuckroth Date: Thu, 14 Jun 2018 14:28:08 -0400 Subject: Add delay to notifications before they can be dismissed. Test: Run jank tests. Create notifications with a delay, then attempt to swipe them away as soon as they are perceivable to the user. Swiping during the animation should not result in notification dismissal, but swiping after the animation completes should. Fixes: 70293267 Change-Id: Ibca02666255693255185b8bd326cc97d8c574b2e --- .../systemui/statusbar/ExpandableNotificationRow.java | 2 ++ .../com/android/systemui/statusbar/NotificationData.java | 15 +++++++++++++++ .../statusbar/stack/NotificationStackScrollLayout.java | 11 +++++++---- .../systemui/statusbar/stack/StackScrollAlgorithm.java | 2 +- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 135b03791ea6..8034baced3e2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -37,6 +37,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; +import android.os.SystemClock; import android.os.Bundle; import android.service.notification.StatusBarNotification; import android.util.ArraySet; @@ -992,6 +993,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); + mEntry.setInitializationTime(SystemClock.elapsedRealtime()); Dependency.get(PluginManager.class).addPluginListener(this, NotificationMenuRowPlugin.class, false /* Allow multiple */); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index 1a645d19798a..a58752c20973 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -84,6 +84,7 @@ public class NotificationData { public static final class Entry { private static final long LAUNCH_COOLDOWN = 2000; private static final long REMOTE_INPUT_COOLDOWN = 500; + private static final long INITIALIZATION_DELAY = 400; private static final long NOT_LAUNCHED_YET = -LAUNCH_COOLDOWN; private static final int COLOR_INVALID = 1; public String key; @@ -114,6 +115,9 @@ public class NotificationData { public ArraySet mActiveAppOps = new ArraySet<>(3); public CharSequence headsUpStatusBarText; public CharSequence headsUpStatusBarTextPublic; + + private long initializationTime = -1; + /** * Whether or not this row represents a system notification. Note that if this is * {@code null}, that means we were either unable to retrieve the info or have yet to @@ -169,6 +173,11 @@ public class NotificationData { return SystemClock.elapsedRealtime() < lastRemoteInputSent + REMOTE_INPUT_COOLDOWN; } + public boolean hasFinishedInitialization() { + return initializationTime == -1 || + SystemClock.elapsedRealtime() > initializationTime + INITIALIZATION_DELAY; + } + /** * Create the icons for a notification * @param context the context to create the icons with @@ -341,6 +350,12 @@ public class NotificationData { } return false; } + + public void setInitializationTime(long time) { + if (initializationTime == -1) { + initializationTime = time; + } + } } private final ArrayMap mEntries = new ArrayMap<>(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index c22bd5cba6db..a33a900f0230 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -4701,10 +4701,13 @@ public class NotificationStackScrollLayout extends ViewGroup if (currView instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) currView; - mCurrMenuRow = row.createMenu(); - mCurrMenuRow.setSwipeActionHelper(NotificationSwipeHelper.this); - mCurrMenuRow.setMenuClickListener(NotificationStackScrollLayout.this); - mCurrMenuRow.onTouchEvent(currView, ev, 0 /* velocity */); + + if (row.getEntry().hasFinishedInitialization()) { + mCurrMenuRow = row.createMenu(); + mCurrMenuRow.setSwipeActionHelper(NotificationSwipeHelper.this); + mCurrMenuRow.setMenuClickListener(NotificationStackScrollLayout.this); + mCurrMenuRow.onTouchEvent(currView, ev, 0 /* velocity */); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index 0d50f5a9eef7..ee006d3e267d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -178,7 +178,7 @@ public class StackScrollAlgorithm { return false; } ExpandableNotificationRow row = (ExpandableNotificationRow) v; - if (row.areGutsExposed()) { + if (row.areGutsExposed() || !row.getEntry().hasFinishedInitialization()) { return false; } return row.canViewBeDismissed(); -- cgit v1.2.3-59-g8ed1b