diff options
| author | 2020-01-07 17:04:16 -0500 | |
|---|---|---|
| committer | 2020-01-08 10:10:56 -0500 | |
| commit | 6e6ce1bf293b8ef1fca3a981801c613856696071 (patch) | |
| tree | f39f52301576bf08a79b4ea999fbba18598dfe87 | |
| parent | 3c4f8c24c09b6697a13570eadc06d7042bf10fc0 (diff) | |
Store inflation error boolean on NotifEntries
To keep track of notification entries that errored on
inflating
Test: atest SystemUiTests
Change-Id: Ia915448bfc4c827a651ad7a4a3e274a78ece1a3e
8 files changed, 58 insertions, 19 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index f5b09f901580..a2578ab3cfa6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -294,6 +294,10 @@ public class NotificationEntryManager implements * WARNING: this will call back into us. Don't hold any locks. */ @Override + public void handleInflationException(NotificationEntry n, Exception e) { + handleInflationException(n.getSbn(), e); + } + public void handleInflationException(StatusBarNotification n, Exception e) { removeNotificationInternal( n.getKey(), null, null, true /* forceRemove */, false /* removedByUser */, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflaterImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflaterImpl.java index 111ff980680c..0d175574f16b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflaterImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifInflaterImpl.java @@ -34,7 +34,7 @@ import javax.inject.Singleton; /** * Handles notification inflating, rebinding, and inflation aborting. * - * Currently a wrapper for NotificationRowBinderImpl which requires some TLC. + * Currently a wrapper for NotificationRowBinderImpl. */ @Singleton public class NotifInflaterImpl implements NotifInflater { @@ -58,7 +58,7 @@ public class NotifInflaterImpl implements NotifInflater { */ public void setRowBinder(NotificationRowBinderImpl rowBinder) { mNotificationRowBinder = rowBinder; - requireBinder().setInflationCallback(mInflationCallback); + mNotificationRowBinder.setInflationCallback(mInflationCallback); } @Override @@ -78,9 +78,10 @@ public class NotifInflaterImpl implements NotifInflater { @Override public void inflateViews(NotificationEntry entry) { try { + entry.setHasInflationError(false); requireBinder().inflateViews(entry, getDismissCallback(entry)); } catch (InflationException e) { - // logged in the inflation callback + // logged in mInflationCallback.handleInflationException } } @@ -126,9 +127,11 @@ public class NotifInflaterImpl implements NotifInflater { new NotificationContentInflater.InflationCallback() { @Override public void handleInflationException( - StatusBarNotification sbn, + NotificationEntry entry, Exception e) { + entry.setHasInflationError(true); try { + final StatusBarNotification sbn = entry.getSbn(); // report notification inflation errors back up // to notification delegates mStatusBarService.onNotificationError( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 4f4fb240162d..28e486df29b9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -102,6 +102,9 @@ public final class NotificationEntry extends ListEntry { /** If this was a group child that was promoted to the top level, then who did the promoting. */ @Nullable NotifPromoter mNotifPromoter; + /** If this notification had an issue with inflating. Only used with the NewNotifPipeline **/ + private boolean mHasInflationError; + /* * Old members @@ -576,6 +579,18 @@ public final class NotificationEntry extends ListEntry { remoteInputTextWhenReset = null; } + void setHasInflationError(boolean hasError) { + mHasInflationError = hasError; + } + + /** + * Whether this notification had an error when attempting to inflate. This is only used in + * the NewNotifPipeline + */ + public boolean hasInflationError() { + return mHasInflationError; + } + public void setHasSentReply() { hasSentReply = true; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java index b52f0fe1dd2e..a14f0e1cf631 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java @@ -57,7 +57,8 @@ public class PreparationCoordinator implements Coordinator { @Override public void attach(NotifCollection notifCollection, NotifListBuilder notifListBuilder) { notifCollection.addCollectionListener(mNotifCollectionListener); - notifListBuilder.addPreRenderFilter(mNotifFilter); + notifListBuilder.addPreRenderFilter(mNotifInflationErrorFilter); + notifListBuilder.addPreRenderFilter(mNotifInflatingFilter); } private final NotifCollectionListener mNotifCollectionListener = new NotifCollectionListener() { @@ -77,7 +78,25 @@ public class PreparationCoordinator implements Coordinator { } }; - private final NotifFilter mNotifFilter = new NotifFilter(TAG) { + private final NotifFilter mNotifInflationErrorFilter = new NotifFilter( + TAG + "InflationError") { + /** + * Filters out notifications that threw an error when attempting to inflate. + */ + @Override + public boolean shouldFilterOut(NotificationEntry entry, long now) { + if (entry.hasInflationError()) { + mPendingNotifications.remove(entry); + return true; + } + return false; + } + }; + + private final NotifFilter mNotifInflatingFilter = new NotifFilter(TAG + "Inflating") { + /** + * Filters out notifications that haven't been inflated yet + */ @Override public boolean shouldFilterOut(NotificationEntry entry, long now) { return mPendingNotifications.contains(entry); @@ -90,7 +109,7 @@ public class PreparationCoordinator implements Coordinator { public void onInflationFinished(NotificationEntry entry) { mNotifLog.log(NotifEvent.INFLATED, entry); mPendingNotifications.remove(entry); - mNotifFilter.invalidateList(); + mNotifInflatingFilter.invalidateList(); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index 172b72e9b0fc..30f22ac5e161 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -397,7 +397,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder existingWrapper.onReinflated(); } } catch (Exception e) { - handleInflationError(runningInflations, e, row.getEntry().getSbn(), callback); + handleInflationError(runningInflations, e, row.getEntry(), callback); // Add a running inflation to make sure we don't trigger callbacks. // Safe to do because only happens in tests. runningInflations.put(inflationId, new CancellationSignal()); @@ -448,7 +448,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder onViewApplied(newView); } catch (Exception anotherException) { runningInflations.remove(inflationId); - handleInflationError(runningInflations, e, row.getEntry().getSbn(), + handleInflationError(runningInflations, e, row.getEntry(), callback); } } @@ -474,7 +474,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder private static void handleInflationError( HashMap<Integer, CancellationSignal> runningInflations, Exception e, - StatusBarNotification notification, @Nullable InflationCallback callback) { + NotificationEntry notification, @Nullable InflationCallback callback) { Assert.isMainThread(); runningInflations.values().forEach(CancellationSignal::cancel); if (callback != null) { @@ -707,7 +707,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder + Integer.toHexString(sbn.getId()); Log.e(StatusBar.TAG, "couldn't inflate view for notification " + ident, e); if (mCallback != null) { - mCallback.handleInflationException(sbn, + mCallback.handleInflationException(mRow.getEntry(), new InflationException("Couldn't inflate contentViews" + e)); } } @@ -729,7 +729,7 @@ public class NotificationContentInflater implements NotificationRowContentBinder } @Override - public void handleInflationException(StatusBarNotification notification, Exception e) { + public void handleInflationException(NotificationEntry entry, Exception e) { handleError(e); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinder.java index 2fe54c00bb06..9b95bff4921c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinder.java @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.row; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; -import android.service.notification.StatusBarNotification; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -138,10 +137,10 @@ public interface NotificationRowContentBinder { /** * Callback for when there is an inflation exception * - * @param notification notification which failed to inflate content + * @param entry notification which failed to inflate content * @param e exception */ - void handleInflationException(StatusBarNotification notification, Exception e); + void handleInflationException(NotificationEntry entry, Exception e); /** * Callback for after the content views finish inflating. diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java index 40b0ba9bf633..77659df738c3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java @@ -345,7 +345,7 @@ public class NotificationTestHelper { NotificationContentInflater.InflationCallback callback = new NotificationContentInflater.InflationCallback() { @Override - public void handleInflationException(StatusBarNotification notification, + public void handleInflationException(NotificationEntry entry, Exception e) { countDownLatch.countDown(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java index dc4e4980e443..f916fe5ad7fb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java @@ -33,7 +33,6 @@ import android.content.Context; import android.os.CancellationSignal; import android.os.Handler; import android.os.Looper; -import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import android.util.ArrayMap; @@ -179,7 +178,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { true /* isNewView */, (v, p, r) -> true, new InflationCallback() { @Override - public void handleInflationException(StatusBarNotification notification, + public void handleInflationException(NotificationEntry entry, Exception e) { countDownLatch.countDown(); throw new RuntimeException("No Exception expected"); @@ -261,7 +260,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { inflater.setInflateSynchronously(true); InflationCallback callback = new InflationCallback() { @Override - public void handleInflationException(StatusBarNotification notification, + public void handleInflationException(NotificationEntry entry, Exception e) { if (!expectingException) { exceptionHolder.setException(e); |