Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 904de870 authored by Lucas Silva's avatar Lucas Silva
Browse files

Add tracing to widget loading

This can help identify what is slowing down the loading of certain
widgets - if its the initial remote views fetch or the inflation of the
widget.

Flag: EXEMPT adding tracing
Test: atest SystemUITests
Bug: 369412569
Change-Id: If4a47db38eee54299ceb897268944f542f719485
parent 7de9e84a
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import com.android.systemui.communal.widgets.CommunalAppWidgetHost
import com.android.systemui.communal.widgets.GlanceableHubWidgetManager
import com.android.systemui.concurrency.fakeExecutor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.backgroundCoroutineContext
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runTest
@@ -57,8 +58,8 @@ class CommunalAppWidgetViewModelTest(flags: FlagsParameterization) : SysuiTestCa

    private val Kosmos.listenerDelegateFactory by
        Kosmos.Fixture {
            AppWidgetHostListenerDelegate.Factory { listener ->
                AppWidgetHostListenerDelegate(fakeExecutor, listener)
            AppWidgetHostListenerDelegate.Factory { tag, listener ->
                AppWidgetHostListenerDelegate(applicationCoroutineScope, tag, listener)
            }
        }

+9 −3
Original line number Diff line number Diff line
@@ -83,7 +83,7 @@ constructor(
    }

    private suspend fun handleSetListener(appWidgetId: Int, listener: AppWidgetHostListener) =
        withContextTraced("$TAG#setListenerInner", backgroundContext) {
        withContextTraced("${TAG}_$appWidgetId#setListenerInner", backgroundContext) {
            if (
                multiUserHelper.glanceableHubHsumFlagEnabled &&
                    multiUserHelper.isInHeadlessSystemUser()
@@ -92,13 +92,19 @@ constructor(
                // remotely in the foreground user, and therefore the host listener needs to be
                // registered through the widget manager.
                with(glanceableHubWidgetManagerLazy.get()) {
                    setAppWidgetHostListener(appWidgetId, listenerDelegateFactory.create(listener))
                    setAppWidgetHostListener(
                        appWidgetId,
                        listenerDelegateFactory.create("${TAG}_$appWidgetId", listener),
                    )
                }
            } else {
                // Instead of setting the view as the listener directly, we wrap the view in a
                // delegate which ensures the callbacks always get called on the main thread.
                with(appWidgetHostLazy.get()) {
                    setListener(appWidgetId, listenerDelegateFactory.create(listener))
                    setListener(
                        appWidgetId,
                        listenerDelegateFactory.create("${TAG}_$appWidgetId", listener),
                    )
                }
            }
        }
+11 −7
Original line number Diff line number Diff line
@@ -19,11 +19,12 @@ package com.android.systemui.communal.widgets
import android.appwidget.AppWidgetHost.AppWidgetHostListener
import android.appwidget.AppWidgetProviderInfo
import android.widget.RemoteViews
import com.android.systemui.dagger.qualifiers.Main
import com.android.app.tracing.coroutines.launchTraced
import com.android.systemui.dagger.qualifiers.Application
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import java.util.concurrent.Executor
import kotlinx.coroutines.CoroutineScope

/**
 * Wrapper for an [AppWidgetHostListener] to ensure the callbacks are executed on the main thread.
@@ -31,24 +32,27 @@ import java.util.concurrent.Executor
class AppWidgetHostListenerDelegate
@AssistedInject
constructor(
    @Main private val mainExecutor: Executor,
    @Application private val mainScope: CoroutineScope,
    @Assisted private val tag: String,
    @Assisted private val listener: AppWidgetHostListener,
) : AppWidgetHostListener {

    @AssistedFactory
    fun interface Factory {
        fun create(listener: AppWidgetHostListener): AppWidgetHostListenerDelegate
        fun create(tag: String, listener: AppWidgetHostListener): AppWidgetHostListenerDelegate
    }

    override fun onUpdateProviderInfo(appWidget: AppWidgetProviderInfo?) {
        mainExecutor.execute { listener.onUpdateProviderInfo(appWidget) }
        mainScope.launchTraced("$tag#onUpdateProviderInfo") {
            listener.onUpdateProviderInfo(appWidget)
        }
    }

    override fun updateAppWidget(views: RemoteViews?) {
        mainExecutor.execute { listener.updateAppWidget(views) }
        mainScope.launchTraced("$tag#updateAppWidget") { listener.updateAppWidget(views) }
    }

    override fun onViewDataChanged(viewId: Int) {
        mainExecutor.execute { listener.onViewDataChanged(viewId) }
        mainScope.launchTraced("$tag#onViewDataChanged") { listener.onViewDataChanged(viewId) }
    }
}