summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostView.kt28
1 files changed, 23 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostView.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostView.kt
index d5497345dda5..08ecc3431511 100644
--- a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostView.kt
+++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHostView.kt
@@ -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))