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

Commit dbf426fe authored by Lucas Silva's avatar Lucas Silva Committed by Android (Google) Code Review
Browse files

Merge "Add tracing to widget loading" into main

parents b19af9f5 904de870
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) }
    }
}