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

Commit 9c4b2286 authored by Lucas Silva's avatar Lucas Silva
Browse files

Fix for missing widgets

This works around around a Jetpack Compose bug where if we add a child
to the element inside an AndroidView composable before the element has
been laid out, it will fail to render. We therefore delay processing the
RemoteViews for the widget until after the parent has been laid out.

Test: manually on device by verifying widgets properly show up
Flag: EXEMPT bugfix
Bug: 387938328

Change-Id: I3b094086dd133981c37fa9709547334091fcb580
parent 815fdd84
Loading
Loading
Loading
Loading
+23 −5
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.view.View
import android.view.ViewOutlineProvider
import android.widget.RemoteViews
import android.widget.RemoteViews.RemoteResponse
import androidx.core.view.doOnLayout
import com.android.systemui.animation.LaunchableView
import com.android.systemui.animation.LaunchableViewDelegate

@@ -37,10 +38,7 @@ class CommunalAppWidgetHostView(
    private val interactionHandler: RemoteViews.InteractionHandler,
) : AppWidgetHostView(context, interactionHandler), LaunchableView {
    private val launchableViewDelegate =
        LaunchableViewDelegate(
            this,
            superSetVisibility = { super.setVisibility(it) },
        )
        LaunchableViewDelegate(this, superSetVisibility = { super.setVisibility(it) })

    // Mutable corner radius.
    var enforcedCornerRadius: Float
@@ -48,6 +46,9 @@ class CommunalAppWidgetHostView(
    // Mutable `Rect`. The size will be mutated when the widget is reapplied.
    var enforcedRectangle: Rect

    private var pendingUpdate: Boolean = false
    private var pendingRemoteViews: RemoteViews? = null

    init {
        enforcedCornerRadius = RoundedCornerEnforcement.computeEnforcedRadius(context)
        enforcedRectangle = Rect()
@@ -75,6 +76,23 @@ class CommunalAppWidgetHostView(
            }
        }

    override fun updateAppWidget(remoteViews: RemoteViews?) {
        // Workaround for Jetpack Compose bug which fails to render the widget if we add the
        // RemoteViews before this parent view has been laid out. Therefore we wait for layout
        // before calling the super.updateAppWidget() to actually render the widget.
        // See b/387938328
        pendingRemoteViews = remoteViews

        if (!pendingUpdate) {
            pendingUpdate = true
            doOnLayout {
                super.updateAppWidget(pendingRemoteViews)
                pendingRemoteViews = null
                pendingUpdate = false
            }
        }
    }

    private fun enforceRoundedCorners() {
        if (enforcedCornerRadius <= 0) {
            resetRoundedCorners()
@@ -116,7 +134,7 @@ class CommunalAppWidgetHostView(
            launcherApps.getMainActivityLaunchIntent(
                activityInfo.componentName,
                null,
                activityInfo.user
                activityInfo.user,
            )
        if (intent != null) {
            interactionHandler.onInteraction(view, intent, RemoteResponse.fromPendingIntent(intent))