From 5a7f4924abc1ce17b8c2822f708050c06a78a31a Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 24 Jun 2025 12:56:06 +0200 Subject: [PATCH] fix IllegalStateException for LazyVerticalGrid LazyVerticalGrid was measured with infinite height, which Compose does not allow. By applying the availableHeight explicitly, this should fix the Exception: Exception java.lang.IllegalStateException: Vertically scrollable component was measured with an infinity maximum height constraints, which is disallowed. One of the common reasons is nesting layouts like LazyColumn and Column(Modifier.verticalScroll()). If you want to add a header before the list of items please add a header as a separate item() before the main items() inside the LazyColumn scope. There are could be other reasons for this to happen: your ComposeView was added into a LinearLayout with some weight, you applied Modifier.wrapContentSize(unbounded = true) or wrote a custom layout. Please try to remove the source of infinite constraints in the hierarchy above the scrolling container. at androidx.compose.foundation.CheckScrollableContainerConstraintsKt.checkScrollableContainerConstraints-K40F9xA (CheckScrollableContainerConstraints.kt:35) at androidx.compose.foundation.lazy.grid.LazyGridKt$rememberLazyGridMeasurePolicy$1$1.invoke-0kLqBqw (LazyGrid.kt:174) at androidx.compose.foundation.lazy.grid.LazyGridKt$rememberLazyGridMeasurePolicy$1$1.invoke (LazyGrid.kt:172) at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$3$2$1.invoke-0kLqBqw (LazyLayout.kt:119) at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$3$2$1.invoke (LazyLayout.kt:112) at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s (SubcomposeLayout.kt:725) at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0 (InnerNodeCoordinator.kt:135) at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s (GraphicsLayerModifier.kt:646) at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0 (LayoutModifierNodeCoordinator.kt:188) at androidx.compose.foundation.layout.FillNode.measure-3p2s80s (Size.kt:699) at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0 (LayoutModifierNodeCoordinator.kt:188) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke (LayoutNodeLayoutDelegate.kt:316) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke (LayoutNodeLayoutDelegate.kt:315) at androidx.compose.runtime.snapshots.Snapshot$Companion.observe (Snapshot.kt:503) at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe (SnapshotStateObserver.kt:502) at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads (SnapshotStateObserver.kt:258) at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release (OwnerSnapshotObserver.kt:133) at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release (OwnerSnapshotObserver.kt:113) at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:1782) at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:40) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:696) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0 (LayoutNodeLayoutDelegate.kt:672) at androidx.compose.foundation.layout.BoxMeasurePolicy.measure-3p2s80s (Box.kt:151) at androidx.compose.foundation.layout.BoxWithConstraintsKt$BoxWithConstraints$1$1.invoke-0kLqBqw (BoxWithConstraints.kt:70) at androidx.compose.foundation.layout.BoxWithConstraintsKt$BoxWithConstraints$1$1.invoke (BoxWithConstraints.kt:67) at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s (SubcomposeLayout.kt:725) at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0 (InnerNodeCoordinator.kt:135) at androidx.compose.foundation.layout.FillNode.measure-3p2s80s (Size.kt:699) at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0 (LayoutModifierNodeCoordinator.kt:188) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke (LayoutNodeLayoutDelegate.kt:316) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke (LayoutNodeLayoutDelegate.kt:315) at androidx.compose.runtime.snapshots.Snapshot$Companion.observe (Snapshot.kt:503) at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe (SnapshotStateObserver.kt:502) at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads (SnapshotStateObserver.kt:258) at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release (OwnerSnapshotObserver.kt:133) at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release (OwnerSnapshotObserver.kt:113) at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:1782) at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:40) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:696) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.measure-BRTryo0 (LayoutNodeLayoutDelegate.kt:672) at androidx.compose.ui.layout.RootMeasurePolicy.measure-3p2s80s (RootMeasurePolicy.kt:38) at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0 (InnerNodeCoordinator.kt:135) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke (LayoutNodeLayoutDelegate.kt:316) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke (LayoutNodeLayoutDelegate.kt:315) at androidx.compose.runtime.snapshots.Snapshot$Companion.observe (Snapshot.kt:2441) at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe (SnapshotStateObserver.kt:502) at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads (SnapshotStateObserver.kt:258) at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release (OwnerSnapshotObserver.kt:133) at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release (OwnerSnapshotObserver.kt:113) at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:1782) at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:40) at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0 (LayoutNodeLayoutDelegate.kt:696) at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release (LayoutNode.kt:1222) at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA (MeasureAndLayoutDelegate.kt:367) at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureOnly (MeasureAndLayoutDelegate.kt:622) at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureOnly (MeasureAndLayoutDelegate.kt:420) at androidx.compose.ui.platform.AndroidComposeView.onMeasure (AndroidComposeView.android.kt:1370) at android.view.View.measure (View.java:27557) at androidx.compose.ui.platform.AbstractComposeView.internalOnMeasure$ui_release (ComposeView.android.kt:309) at androidx.compose.ui.platform.AbstractComposeView.onMeasure (ComposeView.android.kt:296) at android.view.View.measure (View.java:27557) at android.widget.RelativeLayout.measureChild (RelativeLayout.java:696) at android.widget.RelativeLayout.onMeasure (RelativeLayout.java:499) at android.view.View.measure (View.java:27557) at android.widget.LinearLayout.measureVertical (LinearLayout.java:1031) at android.widget.LinearLayout.onMeasure (LinearLayout.java:721) at android.view.View.measure (View.java:27557) at android.widget.RelativeLayout.measureChildHorizontal (RelativeLayout.java:735) at android.widget.RelativeLayout.onMeasure (RelativeLayout.java:481) at android.view.View.measure (View.java:27557) at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:7123) at android.widget.FrameLayout.onMeasure (FrameLayout.java:194) at androidx.appcompat.widget.ContentFrameLayout.onMeasure (ContentFrameLayout.java:141) at android.view.View.measure (View.java:27557) at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:7123) at android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1608) at android.widget.LinearLayout.measureVertical (LinearLayout.java:878) at android.widget.LinearLayout.onMeasure (LinearLayout.java:721) at android.view.View.measure (View.java:27557) at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:7123) at android.widget.FrameLayout.onMeasure (FrameLayout.java:194) at android.view.View.measure (View.java:27557) at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:7123) at android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1608) at android.widget.LinearLayout.measureVertical (LinearLayout.java:878) at android.widget.LinearLayout.onMeasure (LinearLayout.java:721) at android.view.View.measure (View.java:27557) at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:7123) at android.widget.FrameLayout.onMeasure (FrameLayout.java:194) at com.android.internal.policy.DecorView.onMeasure (DecorView.java:824) at android.view.View.measure (View.java:27557) at android.view.ViewRootImpl.performMeasure (ViewRootImpl.java:4682) at android.view.ViewRootImpl.measureHierarchy (ViewRootImpl.java:3098) at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:3461) at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:2765) at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:10219) at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1544) at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1553) at android.view.Choreographer.doCallbacks (Choreographer.java:1109) at android.view.Choreographer.doFrame (Choreographer.java:994) at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1527) at android.os.Handler.handleCallback (Handler.java:958) at android.os.Handler.dispatchMessage (Handler.java:99) at android.os.Looper.loopOnce (Looper.java:257) at android.os.Looper.loop (Looper.java:368) at android.app.ActivityThread.main (ActivityThread.java:8839) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:572) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1049) Also: Suppress UnusedBoxWithConstraintsScope as it seems that the maxHeight and maxWidth variables are not recognized as being used when they are "only" used in calculations. Signed-off-by: Marcel Hibbe --- .../com/nextcloud/talk/call/components/ParticipantGrid.kt | 6 +++++- .../com/nextcloud/talk/call/components/ParticipantTile.kt | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/call/components/ParticipantGrid.kt b/app/src/main/java/com/nextcloud/talk/call/components/ParticipantGrid.kt index 66ee7a1d3..d64d62826 100644 --- a/app/src/main/java/com/nextcloud/talk/call/components/ParticipantGrid.kt +++ b/app/src/main/java/com/nextcloud/talk/call/components/ParticipantGrid.kt @@ -9,6 +9,7 @@ package com.nextcloud.talk.call.components +import android.annotation.SuppressLint import android.content.res.Configuration import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -29,6 +30,7 @@ import com.nextcloud.talk.adapters.ParticipantUiState import org.webrtc.EglBase import kotlin.math.ceil +@SuppressLint("UnusedBoxWithConstraintsScope") @Suppress("LongParameterList") @Composable fun ParticipantGrid( @@ -78,7 +80,9 @@ fun ParticipantGrid( LazyVerticalGrid( columns = GridCells.Fixed(columns), - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxWidth() + .height(availableHeight), verticalArrangement = Arrangement.spacedBy(itemSpacing), horizontalArrangement = Arrangement.spacedBy(itemSpacing), contentPadding = PaddingValues(vertical = edgePadding, horizontal = edgePadding) diff --git a/app/src/main/java/com/nextcloud/talk/call/components/ParticipantTile.kt b/app/src/main/java/com/nextcloud/talk/call/components/ParticipantTile.kt index c15edf292..e8617bfef 100644 --- a/app/src/main/java/com/nextcloud/talk/call/components/ParticipantTile.kt +++ b/app/src/main/java/com/nextcloud/talk/call/components/ParticipantTile.kt @@ -7,6 +7,7 @@ package com.nextcloud.talk.call.components +import android.annotation.SuppressLint import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints @@ -40,6 +41,7 @@ const val NICK_OFFSET = 4f const val NICK_BLUR_RADIUS = 4f const val AVATAR_SIZE_FACTOR = 0.6f +@SuppressLint("UnusedBoxWithConstraintsScope") @Suppress("Detekt.LongMethod") @Composable fun ParticipantTile(