Merge "New Pipeline: log structure in dumpsys" into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2022-08-08 18:33:50 +00:00
committed by Android (Google) Code Review
13 changed files with 234 additions and 35 deletions

View File

@@ -34,6 +34,8 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.dagger.CentralSurfacesModule;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.PipelineDumpable;
import com.android.systemui.statusbar.notification.collection.PipelineDumper;
import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins;
import com.android.systemui.util.time.SystemClock;
@@ -52,7 +54,8 @@ import javax.inject.Inject;
*/
@SysUISingleton
@SuppressLint("OverrideAbstract")
public class NotificationListener extends NotificationListenerWithPlugins {
public class NotificationListener extends NotificationListenerWithPlugins implements
PipelineDumpable {
private static final String TAG = "NotificationListener";
private static final boolean DEBUG = CentralSurfaces.DEBUG;
private static final long MAX_RANKING_DELAY_MILLIS = 500L;
@@ -255,6 +258,11 @@ public class NotificationListener extends NotificationListenerWithPlugins {
}
}
@Override
public void dumpPipeline(@NonNull PipelineDumper d) {
d.dump("notificationHandlers", mNotificationHandlers);
}
private static Ranking getRankingOrTemporaryStandIn(RankingMap rankingMap, String key) {
Ranking ranking = new Ranking();
if (!rankingMap.getRanking(key, ranking)) {

View File

@@ -142,7 +142,7 @@ import javax.inject.Inject;
*/
@MainThread
@SysUISingleton
public class NotifCollection implements Dumpable {
public class NotifCollection implements Dumpable, PipelineDumpable {
private final IStatusBarService mStatusBarService;
private final SystemClock mClock;
private final NotifPipelineFlags mNotifPipelineFlags;
@@ -870,6 +870,14 @@ public class NotifCollection implements Dumpable {
}
}
@Override
public void dumpPipeline(@NonNull PipelineDumper d) {
d.dump("notifCollectionListeners", mNotifCollectionListeners);
d.dump("lifetimeExtenders", mLifetimeExtenders);
d.dump("dismissInterceptors", mDismissInterceptors);
d.dump("buildListener", mBuildListener);
}
private final BatchableNotificationHandler mNotifHandler = new BatchableNotificationHandler() {
@Override
public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {

View File

@@ -0,0 +1,21 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.notification.collection
interface PipelineDumpable {
fun dumpPipeline(d: PipelineDumper)
}

View File

@@ -0,0 +1,68 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.notification.collection
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifDismissInterceptor
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifLifetimeExtender
import com.android.systemui.util.asIndenting
import com.android.systemui.util.withIncreasedIndent
import java.io.PrintWriter
class PipelineDumper(pw: PrintWriter) {
private val ipw = pw.asIndenting()
fun print(a: Any?) = ipw.print(a)
fun println(a: Any?) = ipw.println(a)
fun withIncreasedIndent(b: () -> Unit) = ipw.withIncreasedIndent(b)
fun withIncreasedIndent(r: Runnable) = ipw.withIncreasedIndent(r)
fun dump(label: String, value: Any?) {
ipw.print("$label: ")
dump(value)
}
private fun dump(value: Any?) = when (value) {
null, is String, is Int -> println(value)
is Collection<*> -> dumpCollection(value)
else -> {
println(value.fullPipelineName)
withIncreasedIndent { (value as? PipelineDumpable)?.dumpPipeline(this) }
}
}
private fun dumpCollection(values: Collection<Any?>) {
println(values.size)
withIncreasedIndent { values.forEach { dump(it) } }
}
}
private val Any.bareClassName: String get() {
val className = javaClass.name
val packageName = javaClass.`package`.name
return className.substring(packageName.length + 1)
}
private val Any.barePipelineName: String? get() = when (this) {
is NotifLifetimeExtender -> name
is NotifDismissInterceptor -> name
is Pluggable<*> -> name
else -> null
}
private val Any.fullPipelineName: String get() =
barePipelineName?.let { "\"$it\" ($bareClassName)" } ?: bareClassName

View File

@@ -87,7 +87,7 @@ import javax.inject.Inject;
*/
@MainThread
@SysUISingleton
public class ShadeListBuilder implements Dumpable {
public class ShadeListBuilder implements Dumpable, PipelineDumpable {
private final SystemClock mSystemClock;
private final ShadeListBuilderLogger mLogger;
private final NotificationInteractionTracker mInteractionTracker;
@@ -1396,6 +1396,21 @@ public class ShadeListBuilder implements Dumpable {
"\t\t"));
}
@Override
public void dumpPipeline(@NonNull PipelineDumper d) {
d.dump("choreographer", mChoreographer);
d.dump("notifPreGroupFilters", mNotifPreGroupFilters);
d.dump("onBeforeTransformGroupsListeners", mOnBeforeTransformGroupsListeners);
d.dump("notifPromoters", mNotifPromoters);
d.dump("onBeforeSortListeners", mOnBeforeSortListeners);
d.dump("notifSections", mNotifSections);
d.dump("notifComparators", mNotifComparators);
d.dump("onBeforeFinalizeFilterListeners", mOnBeforeFinalizeFilterListeners);
d.dump("notifFinalizeFilters", mNotifFinalizeFilters);
d.dump("onBeforeRenderListListeners", mOnBeforeRenderListListeners);
d.dump("onRenderListListener", mOnRenderListListener);
}
/** See {@link #setOnRenderListListener(OnRenderListListener)} */
public interface OnRenderListListener {
/**

View File

@@ -32,6 +32,8 @@ import com.android.systemui.Dumpable;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationListener.NotificationHandler;
import com.android.systemui.statusbar.notification.collection.PipelineDumpable;
import com.android.systemui.statusbar.notification.collection.PipelineDumper;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.time.SystemClock;
@@ -63,7 +65,7 @@ import javax.inject.Inject;
* passed along to the NotifCollection.
*/
@MainThread
public class GroupCoalescer implements Dumpable {
public class GroupCoalescer implements Dumpable, PipelineDumpable {
private final DelayableExecutor mMainExecutor;
private final SystemClock mClock;
private final GroupCoalescerLogger mLogger;
@@ -314,6 +316,11 @@ public class GroupCoalescer implements Dumpable {
}
}
@Override
public void dumpPipeline(@NonNull PipelineDumper d) {
d.dump("handler", mHandler);
}
private final Comparator<CoalescedEvent> mEventComparator = (o1, o2) -> {
int cmp = Boolean.compare(
o2.getSbn().getNotification().isGroupSummary(),

View File

@@ -15,24 +15,22 @@
*/
package com.android.systemui.statusbar.notification.collection.coordinator
import com.android.systemui.Dumpable
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.notification.NotifPipelineFlags
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.PipelineDumpable
import com.android.systemui.statusbar.notification.collection.PipelineDumper
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
import java.io.PrintWriter
import javax.inject.Inject
/**
* Handles the attachment of [Coordinator]s to the [NotifPipeline] so that the
* Coordinators can register their respective callbacks.
*/
interface NotifCoordinators : Coordinator, Dumpable
interface NotifCoordinators : Coordinator, PipelineDumpable
@CoordinatorScope
class NotifCoordinatorsImpl @Inject constructor(
dumpManager: DumpManager,
notifPipelineFlags: NotifPipelineFlags,
dataStoreCoordinator: DataStoreCoordinator,
hideLocallyDismissedNotifsCoordinator: HideLocallyDismissedNotifsCoordinator,
@@ -66,8 +64,6 @@ class NotifCoordinatorsImpl @Inject constructor(
* Creates all the coordinators.
*/
init {
dumpManager.registerDumpable(TAG, this)
// TODO(b/208866714): formalize the system by which some coordinators may be required by the
// pipeline, such as this DataStoreCoordinator which cannot be removed, as it's a critical
// glue between the pipeline and parts of SystemUI which depend on pipeline output via the
@@ -121,15 +117,12 @@ class NotifCoordinatorsImpl @Inject constructor(
pipeline.setSections(mOrderedSections)
}
override fun dump(pw: PrintWriter, args: Array<String>) {
pw.println()
pw.println("$TAG:")
for (c in mCoordinators) {
pw.println("\t${c.javaClass}")
}
for (s in mOrderedSections) {
pw.println("\t${s.name}")
}
/*
* As part of the NotifPipeline dumpable, dumps the list of coordinators; sections are omitted
* as they are dumped in the RenderStageManager instead.
*/
override fun dumpPipeline(d: PipelineDumper) = with(d) {
dump("coordinators", mCoordinators)
}
companion object {

View File

@@ -18,6 +18,8 @@ package com.android.systemui.statusbar.notification.collection.init;
import android.util.Log;
import androidx.annotation.NonNull;
import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
@@ -25,12 +27,15 @@ import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.PipelineDumpable;
import com.android.systemui.statusbar.notification.collection.PipelineDumper;
import com.android.systemui.statusbar.notification.collection.ShadeListBuilder;
import com.android.systemui.statusbar.notification.collection.coalescer.GroupCoalescer;
import com.android.systemui.statusbar.notification.collection.coordinator.NotifCoordinators;
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
import com.android.systemui.statusbar.notification.collection.render.NotifStackController;
import com.android.systemui.statusbar.notification.collection.render.RenderStageManager;
import com.android.systemui.statusbar.notification.collection.render.ShadeViewManager;
import com.android.systemui.statusbar.notification.collection.render.ShadeViewManagerFactory;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
@@ -42,7 +47,7 @@ import javax.inject.Inject;
* Initialization code for the new notification pipeline.
*/
@SysUISingleton
public class NotifPipelineInitializer implements Dumpable {
public class NotifPipelineInitializer implements Dumpable, PipelineDumpable {
private final NotifPipeline mPipelineWrapper;
private final GroupCoalescer mGroupCoalescer;
private final NotifCollection mNotifCollection;
@@ -53,6 +58,9 @@ public class NotifPipelineInitializer implements Dumpable {
private final DumpManager mDumpManager;
private final ShadeViewManagerFactory mShadeViewManagerFactory;
/* These are saved just for dumping. */
private ShadeViewManager mShadeViewManager;
private NotificationListener mNotificationService;
@Inject
public NotifPipelineInitializer(
@@ -83,9 +91,10 @@ public class NotifPipelineInitializer implements Dumpable {
NotificationRowBinderImpl rowBinder,
NotificationListContainer listContainer,
NotifStackController stackController) {
mDumpManager.registerDumpable("NotifPipeline", this);
mNotificationService = notificationService;
// Setup inflation
mNotifInflater.setRowBinder(rowBinder);
@@ -93,13 +102,12 @@ public class NotifPipelineInitializer implements Dumpable {
mNotifPluggableCoordinators.attach(mPipelineWrapper);
// Wire up pipeline
mShadeViewManagerFactory
.create(listContainer, stackController)
.attach(mRenderStageManager);
mShadeViewManager = mShadeViewManagerFactory.create(listContainer, stackController);
mShadeViewManager.attach(mRenderStageManager);
mRenderStageManager.attach(mListBuilder);
mListBuilder.attach(mNotifCollection);
mNotifCollection.attach(mGroupCoalescer);
mGroupCoalescer.attach(notificationService);
mGroupCoalescer.attach(mNotificationService);
Log.d(TAG, "Notif pipeline initialized."
+ " rendering=" + true);
@@ -107,8 +115,37 @@ public class NotifPipelineInitializer implements Dumpable {
@Override
public void dump(PrintWriter pw, String[] args) {
mNotifPluggableCoordinators.dump(pw, args);
mGroupCoalescer.dump(pw, args);
dumpPipeline(new PipelineDumper(pw));
}
@Override
public void dumpPipeline(@NonNull PipelineDumper d) {
d.println("STAGE 0: SETUP");
d.dump("notifPluggableCoordinators", mNotifPluggableCoordinators);
d.println("");
d.println("STAGE 1: LISTEN");
d.dump("notificationService", mNotificationService);
d.println("");
d.println("STAGE 2: BATCH EVENTS");
d.dump("groupCoalescer", mGroupCoalescer);
d.println("");
d.println("STAGE 3: COLLECT");
d.dump("notifCollection", mNotifCollection);
d.println("");
d.println("STAGE 4: BUILD LIST");
d.dump("listBuilder", mListBuilder);
d.println("");
d.println("STAGE 5: DISPATCH RENDER");
d.dump("renderStageManager", mRenderStageManager);
d.println("");
d.println("STAGE 6: UPDATE SHADE");
d.dump("shadeViewManager", mShadeViewManager);
}
private static final String TAG = "NotifPipeline";

View File

@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.notification.collection.listbuilder
import com.android.systemui.statusbar.notification.collection.PipelineDumpable
import com.android.systemui.statusbar.notification.collection.PipelineDumper
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifComparator
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner
import com.android.systemui.statusbar.notification.collection.render.NodeController
@@ -24,10 +26,18 @@ import com.android.systemui.statusbar.notification.stack.PriorityBucket
data class NotifSection(
val sectioner: NotifSectioner,
val index: Int
) {
) : PipelineDumpable {
@PriorityBucket
val bucket: Int = sectioner.bucket
val label: String = "$index:$bucket:${sectioner.name}"
val headerController: NodeController? = sectioner.headerNodeController
val comparator: NotifComparator? = sectioner.comparator
override fun dumpPipeline(d: PipelineDumper) = with(d) {
dump("index", index)
dump("bucket", bucket)
dump("sectioner", sectioner)
dump("headerController", headerController)
dump("comparator", comparator)
}
}

View File

@@ -20,6 +20,8 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.PipelineDumpable
import com.android.systemui.statusbar.notification.collection.PipelineDumper
import com.android.systemui.statusbar.notification.collection.ShadeListBuilder
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderEntryListener
import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderGroupListener
@@ -33,7 +35,7 @@ import javax.inject.Inject
* provided to [setViewRenderer].
*/
@SysUISingleton
class RenderStageManager @Inject constructor() {
class RenderStageManager @Inject constructor() : PipelineDumpable {
private val onAfterRenderListListeners = mutableListOf<OnAfterRenderListListener>()
private val onAfterRenderGroupListeners = mutableListOf<OnAfterRenderGroupListener>()
private val onAfterRenderEntryListeners = mutableListOf<OnAfterRenderEntryListener>()
@@ -75,6 +77,13 @@ class RenderStageManager @Inject constructor() {
onAfterRenderEntryListeners.add(listener)
}
override fun dumpPipeline(d: PipelineDumper) = with(d) {
dump("ViewRenderer", viewRenderer)
dump("OnAfterRenderListListeners", onAfterRenderListListeners)
dump("OnAfterRenderGroupListeners", onAfterRenderGroupListeners)
dump("OnAfterRenderEntryListeners", onAfterRenderEntryListeners)
}
private fun dispatchOnAfterRenderList(
viewRenderer: NotifViewRenderer,
entries: List<ListEntry>
@@ -139,4 +148,4 @@ class RenderStageManager @Inject constructor() {
}
}
}
}
}

View File

@@ -17,6 +17,8 @@
package com.android.systemui.statusbar.notification.collection.render
import android.view.View
import com.android.systemui.statusbar.notification.collection.PipelineDumpable
import com.android.systemui.statusbar.notification.collection.PipelineDumper
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.row.ExpandableView
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
@@ -28,7 +30,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain
class RootNodeController(
private val listContainer: NotificationListContainer,
override val view: View
) : NodeController {
) : NodeController, PipelineDumpable {
override val nodeLabel: String = "<root>"
override fun getChildAt(index: Int): View? {
@@ -59,4 +61,8 @@ class RootNodeController(
listContainer.setChildTransferInProgress(false)
}
}
override fun dumpPipeline(d: PipelineDumper) = with(d) {
dump("listContainer", listContainer)
}
}

View File

@@ -22,6 +22,8 @@ import com.android.systemui.statusbar.notification.NotificationSectionsFeatureMa
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.PipelineDumpable
import com.android.systemui.statusbar.notification.collection.PipelineDumper
import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.util.traceSection
@@ -43,12 +45,12 @@ class ShadeViewManager @AssistedInject constructor(
nodeSpecBuilderLogger: NodeSpecBuilderLogger,
shadeViewDifferLogger: ShadeViewDifferLogger,
private val viewBarn: NotifViewBarn
) {
) : PipelineDumpable {
// We pass a shim view here because the listContainer may not actually have a view associated
// with it and the differ never actually cares about the root node's view.
private val rootController = RootNodeController(listContainer, View(context))
private val specBuilder = NodeSpecBuilder(mediaContainerController, featureManager,
sectionHeaderVisibilityProvider, viewBarn, nodeSpecBuilderLogger)
sectionHeaderVisibilityProvider, viewBarn, nodeSpecBuilderLogger)
private val viewDiffer = ShadeViewDiffer(rootController, shadeViewDifferLogger)
/** Method for attaching this manager to the pipeline. */
@@ -56,6 +58,12 @@ class ShadeViewManager @AssistedInject constructor(
renderStageManager.setViewRenderer(viewRenderer)
}
override fun dumpPipeline(d: PipelineDumper) = with(d) {
dump("rootController", rootController)
dump("specBuilder", specBuilder)
dump("viewDiffer", viewDiffer)
}
private val viewRenderer = object : NotifViewRenderer {
override fun onRenderList(notifList: List<ListEntry>) {

View File

@@ -86,6 +86,8 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.PipelineDumpable;
import com.android.systemui.statusbar.notification.collection.PipelineDumper;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy.OnGroupChangeListener;
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
@@ -1560,7 +1562,8 @@ public class NotificationStackScrollLayoutController {
}
}
private class NotificationListContainerImpl implements NotificationListContainer {
private class NotificationListContainerImpl implements NotificationListContainer,
PipelineDumpable {
@Override
public void setChildTransferInProgress(boolean childTransferInProgress) {
@@ -1706,6 +1709,12 @@ public class NotificationStackScrollLayoutController {
public void setWillExpand(boolean willExpand) {
mView.setWillExpand(willExpand);
}
@Override
public void dumpPipeline(@NonNull PipelineDumper d) {
d.dump("NotificationStackScrollLayoutController.this",
NotificationStackScrollLayoutController.this);
}
}
class TouchHandler implements Gefingerpoken {