diff options
| author | 2020-01-15 20:42:28 +0000 | |
|---|---|---|
| committer | 2020-01-15 20:42:28 +0000 | |
| commit | 14133799f618306e016869dff6ff406d377d0e70 (patch) | |
| tree | e2c9954f6108e01413da888c4d1717c43de8c949 | |
| parent | a65024de3b736b8d95b3c3f53769ffedf63cba85 (diff) | |
| parent | b6f4dc224546371bf25fb81765ea630e308dc9ec (diff) | |
Merge "Add ListBuilder and NotifCollection to dump"
5 files changed, 158 insertions, 27 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListDumper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListDumper.java index 73bfe2536830..9f21950e347d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListDumper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ListDumper.java @@ -16,42 +16,128 @@ package com.android.systemui.statusbar.notification.collection; +import java.util.Arrays; import java.util.List; - /** * Utility class for dumping the results of a {@link ShadeListBuilder} to a debug string. */ public class ListDumper { - /** See class description */ - public static String dumpList(List<ListEntry> entries) { + /** + * Creates a debug string for a list of grouped notifications that will be printed + * in the order given in a tiered/tree structure. + * @param includeRecordKeeping whether to print out the Pluggables that caused the notification + * entry to be in its current state (ie: filter, lifeExtender) + */ + public static String dumpTree( + List<ListEntry> entries, + boolean includeRecordKeeping, + String indent) { StringBuilder sb = new StringBuilder(); - for (int i = 0; i < entries.size(); i++) { - ListEntry entry = entries.get(i); - dumpEntry(entry, Integer.toString(i), "", sb); + final String childEntryIndent = indent + INDENT; + for (int topEntryIndex = 0; topEntryIndex < entries.size(); topEntryIndex++) { + ListEntry entry = entries.get(topEntryIndex); + dumpEntry(entry, + Integer.toString(topEntryIndex), + indent, + sb, + true, + includeRecordKeeping); if (entry instanceof GroupEntry) { GroupEntry ge = (GroupEntry) entry; - for (int j = 0; j < ge.getChildren().size(); j++) { - dumpEntry( - ge.getChildren().get(j), - Integer.toString(j), - INDENT, - sb); + List<NotificationEntry> children = ge.getChildren(); + for (int childIndex = 0; childIndex < children.size(); childIndex++) { + dumpEntry(children.get(childIndex), + Integer.toString(topEntryIndex) + "." + Integer.toString(childIndex), + childEntryIndent, + sb, + true, + includeRecordKeeping); } } } return sb.toString(); } + /** + * Creates a debug string for a flat list of notifications + * @param includeRecordKeeping whether to print out the Pluggables that caused the notification + * entry to be in its current state (ie: filter, lifeExtender) + */ + public static String dumpList( + List<NotificationEntry> entries, + boolean includeRecordKeeping, + String indent) { + StringBuilder sb = new StringBuilder(); + for (int j = 0; j < entries.size(); j++) { + dumpEntry( + entries.get(j), + Integer.toString(j), + indent, + sb, + false, + includeRecordKeeping); + } + return sb.toString(); + } + private static void dumpEntry( - ListEntry entry, String index, String indent, StringBuilder sb) { + ListEntry entry, + String index, + String indent, + StringBuilder sb, + boolean includeParent, + boolean includeRecordKeeping) { sb.append(indent) .append("[").append(index).append("] ") - .append(entry.getKey()) - .append(" (parent=") - .append(entry.getParent() != null ? entry.getParent().getKey() : null) - .append(")\n"); + .append(entry.getKey()); + + if (includeParent) { + sb.append(" (parent=") + .append(entry.getParent() != null ? entry.getParent().getKey() : null) + .append(")"); + } + + if (includeRecordKeeping) { + NotificationEntry notifEntry = entry.getRepresentativeEntry(); + StringBuilder rksb = new StringBuilder(); + + if (!notifEntry.mLifetimeExtenders.isEmpty()) { + String[] lifetimeExtenderNames = new String[notifEntry.mLifetimeExtenders.size()]; + for (int i = 0; i < lifetimeExtenderNames.length; i++) { + lifetimeExtenderNames[i] = notifEntry.mLifetimeExtenders.get(i).getName(); + } + rksb.append("lifetimeExtenders=") + .append(Arrays.toString(lifetimeExtenderNames)) + .append(" "); + } + + if (notifEntry.mExcludingFilter != null) { + rksb.append("filter=") + .append(notifEntry.mExcludingFilter) + .append(" "); + } + + if (notifEntry.mNotifPromoter != null) { + rksb.append("promoter=") + .append(notifEntry.mNotifPromoter) + .append(" "); + } + + if (notifEntry.hasInflationError()) { + rksb.append("hasInflationError "); + } + + String rkString = rksb.toString(); + if (!rkString.isEmpty()) { + sb.append("\n\t") + .append(indent) + .append(rkString); + } + } + + sb.append("\n"); } private static final String INDENT = " "; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java index 4b15b7fbce5d..c488c6bb8721 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java @@ -47,6 +47,8 @@ import android.util.ArrayMap; import android.util.Log; import com.android.internal.statusbar.IStatusBarService; +import com.android.systemui.DumpController; +import com.android.systemui.Dumpable; import com.android.systemui.statusbar.notification.collection.coalescer.CoalescedEvent; import com.android.systemui.statusbar.notification.collection.coalescer.GroupCoalescer; import com.android.systemui.statusbar.notification.collection.coalescer.GroupCoalescer.BatchableNotificationHandler; @@ -56,6 +58,8 @@ import com.android.systemui.statusbar.notification.collection.notifcollection.No import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender; import com.android.systemui.util.Assert; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -92,7 +96,7 @@ import javax.inject.Singleton; */ @MainThread @Singleton -public class NotifCollection { +public class NotifCollection implements Dumpable { private final IStatusBarService mStatusBarService; private final Map<String, NotificationEntry> mNotificationSet = new ArrayMap<>(); @@ -107,9 +111,10 @@ public class NotifCollection { private boolean mAmDispatchingToOtherCode; @Inject - public NotifCollection(IStatusBarService statusBarService) { + public NotifCollection(IStatusBarService statusBarService, DumpController dumpController) { Assert.isMainThread(); mStatusBarService = statusBarService; + dumpController.registerDumpable(TAG, this); } /** Initializes the NotifCollection and registers it to receive notification events. */ @@ -442,4 +447,19 @@ public class NotifCollection { public @interface CancellationReason {} public static final int REASON_UNKNOWN = 0; + + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + final List<NotificationEntry> entries = new ArrayList<>(getActiveNotifs()); + + pw.println("\t" + TAG + " unsorted/unfiltered notifications:"); + if (entries.size() == 0) { + pw.println("\t\t None"); + } + pw.println( + ListDumper.dumpList( + entries, + true, + "\t\t")); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java index 76c524be1b8f..c19ce2730c61 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification.collection; import static com.android.systemui.statusbar.notification.collection.GroupEntry.ROOT_ENTRY; -import static com.android.systemui.statusbar.notification.collection.ListDumper.dumpList; import static com.android.systemui.statusbar.notification.collection.listbuilder.PipelineState.STATE_BUILD_STARTED; import static com.android.systemui.statusbar.notification.collection.listbuilder.PipelineState.STATE_FINALIZING; import static com.android.systemui.statusbar.notification.collection.listbuilder.PipelineState.STATE_GROUPING; @@ -32,6 +31,8 @@ import android.annotation.MainThread; import android.annotation.Nullable; import android.util.ArrayMap; +import com.android.systemui.DumpController; +import com.android.systemui.Dumpable; import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener; import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeSortListener; import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeTransformGroupsListener; @@ -46,6 +47,8 @@ import com.android.systemui.statusbar.notification.logging.NotifLog; import com.android.systemui.util.Assert; import com.android.systemui.util.time.SystemClock; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -63,7 +66,7 @@ import javax.inject.Singleton; */ @MainThread @Singleton -public class ShadeListBuilder { +public class ShadeListBuilder implements Dumpable { private final SystemClock mSystemClock; private final NotifLog mNotifLog; @@ -92,10 +95,14 @@ public class ShadeListBuilder { private final List<ListEntry> mReadOnlyNotifList = Collections.unmodifiableList(mNotifList); @Inject - public ShadeListBuilder(SystemClock systemClock, NotifLog notifLog) { + public ShadeListBuilder( + SystemClock systemClock, + NotifLog notifLog, + DumpController dumpController) { Assert.isMainThread(); mSystemClock = systemClock; mNotifLog = notifLog; + dumpController.registerDumpable(TAG, this); } /** @@ -324,7 +331,7 @@ public class ShadeListBuilder { // Step 6: Dispatch the new list, first to any listeners and then to the view layer mNotifLog.log(NotifEvent.DISPATCH_FINAL_LIST, "List finalized, is:\n" - + dumpList(mNotifList)); + + ListDumper.dumpTree(mNotifList, false, "\t\t")); dispatchOnBeforeRenderList(mReadOnlyNotifList); if (mOnRenderListListener != null) { mOnRenderListListener.onRenderList(mReadOnlyNotifList); @@ -772,6 +779,19 @@ public class ShadeListBuilder { } } + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("\t" + TAG + " shade notifications:"); + if (getShadeList().size() == 0) { + pw.println("\t\t None"); + } + + pw.println(ListDumper.dumpTree( + getShadeList(), + true, + "\t\t")); + } + /** See {@link #setOnRenderListListener(OnRenderListListener)} */ public interface OnRenderListListener { /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java index 09cc5ba204f8..fe8d76923141 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java @@ -29,6 +29,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -48,6 +49,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.NotificationVisibility; +import com.android.systemui.DumpController; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.RankingBuilder; import com.android.systemui.statusbar.notification.collection.NoManSimulator.NotifEvent; @@ -103,7 +105,7 @@ public class NotifCollectionTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); Assert.sMainLooper = TestableLooper.get(this).getLooper(); - mCollection = new NotifCollection(mStatusBarService); + mCollection = new NotifCollection(mStatusBarService, mock(DumpController.class)); mCollection.attach(mGroupCoalescer); mCollection.addCollectionListener(mCollectionListener); mCollection.setBuildListener(mBuildListener); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilderTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilderTest.java index be067481b779..0a235716c41f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilderTest.java @@ -16,7 +16,7 @@ package com.android.systemui.statusbar.notification.collection; -import static com.android.systemui.statusbar.notification.collection.ListDumper.dumpList; +import static com.android.systemui.statusbar.notification.collection.ListDumper.dumpTree; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -37,6 +38,7 @@ import android.util.ArrayMap; import androidx.test.filters.SmallTest; +import com.android.systemui.DumpController; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.collection.ShadeListBuilder.OnRenderListListener; import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener; @@ -100,7 +102,7 @@ public class ShadeListBuilderTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); Assert.sMainLooper = TestableLooper.get(this).getLooper(); - mListBuilder = new ShadeListBuilder(mSystemClock, mNotifLog); + mListBuilder = new ShadeListBuilder(mSystemClock, mNotifLog, mock(DumpController.class)); mListBuilder.setOnRenderListListener(mOnRenderListListener); mListBuilder.attach(mNotifCollection); @@ -1081,7 +1083,8 @@ public class ShadeListBuilderTest extends SysuiTestCase { } } catch (AssertionError err) { throw new AssertionError( - "List under test failed verification:\n" + dumpList(mBuiltList), err); + "List under test failed verification:\n" + dumpTree(mBuiltList, + true, ""), err); } } |