From 62c313d6da6b602c68d4135155d9efb39f1cdc1e Mon Sep 17 00:00:00 2001 From: Lorenzo Neumann <36760115+ln-12@users.noreply.github.com> Date: Fri, 17 May 2024 11:26:08 +0200 Subject: [PATCH 1/3] fix: Don't throw IllegalArgumentException when parent of marker composable is zero sized --- .../java/com/google/maps/android/compose/Marker.kt | 5 +++++ .../compose/RememberComposeBitmapDescriptor.kt | 13 +++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt b/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt index 796ce3a3..b2ceac6c 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/Marker.kt @@ -200,6 +200,8 @@ public fun Marker( /** * Composable rendering the content passed as a marker. * + * This composable must have a non-zero size in both dimensions + * * @param keys unique keys representing the state of this Marker. Any changes to one of the key will * trigger a rendering of the content composable and thus the rendering of an updated marker. * @param state the [MarkerState] to be used to control or observe the marker @@ -221,6 +223,9 @@ public fun Marker( * @param onInfoWindowClose a lambda invoked when the marker's info window is closed * @param onInfoWindowLongClick a lambda invoked when the marker's info window is long clicked * @param content composable lambda expression used to customize the marker's content + * + * @throws IllegalStateException if the composable is measured to have a size of zero in either + * dimension */ @Composable @GoogleMapComposable diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt b/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt index 8946f1ab..bc330898 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt @@ -39,6 +39,10 @@ private fun renderComposableToBitmapDescriptor( val composeView = ComposeView(parent.context) .apply { + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + ) setParentCompositionContext(compositionContext) setContent(content) } @@ -47,10 +51,15 @@ private fun renderComposableToBitmapDescriptor( composeView.draw(fakeCanvas) composeView.measure( - View.MeasureSpec.makeMeasureSpec(parent.width, View.MeasureSpec.AT_MOST), - View.MeasureSpec.makeMeasureSpec(parent.height, View.MeasureSpec.AT_MOST), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), ) + if (composeView.measuredWidth == 0 || composeView.measuredHeight == 0) { + throw IllegalStateException("The ComposeView was measured to have a width or height of " + + "zero. Make sure the parent and content have a non-zero size.") + } + composeView.layout(0, 0, composeView.measuredWidth, composeView.measuredHeight) val bitmap = From 0a30e5dc4a8337e01adb8029582dbbd790c5378e Mon Sep 17 00:00:00 2001 From: Lorenzo Neumann <36760115+ln-12@users.noreply.github.com> Date: Fri, 17 May 2024 11:28:45 +0200 Subject: [PATCH 2/3] refactor: Extracted measure specification --- .../android/compose/RememberComposeBitmapDescriptor.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt b/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt index bc330898..58607ae7 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt @@ -30,6 +30,8 @@ internal fun rememberComposeBitmapDescriptor( } } +private val measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + private fun renderComposableToBitmapDescriptor( parent: ViewGroup, compositionContext: CompositionContext, @@ -50,10 +52,7 @@ private fun renderComposableToBitmapDescriptor( composeView.draw(fakeCanvas) - composeView.measure( - View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), - View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), - ) + composeView.measure(measureSpec, measureSpec) if (composeView.measuredWidth == 0 || composeView.measuredHeight == 0) { throw IllegalStateException("The ComposeView was measured to have a width or height of " + From 81423e75b2f209ff14cf565c12516c83734463b1 Mon Sep 17 00:00:00 2001 From: Lorenzo Neumann <36760115+ln-12@users.noreply.github.com> Date: Fri, 17 May 2024 18:21:56 +0200 Subject: [PATCH 3/3] refactor: Changed exception wording --- .../maps/android/compose/RememberComposeBitmapDescriptor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt b/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt index 58607ae7..b94e7cb1 100644 --- a/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt +++ b/maps-compose/src/main/java/com/google/maps/android/compose/RememberComposeBitmapDescriptor.kt @@ -56,7 +56,7 @@ private fun renderComposableToBitmapDescriptor( if (composeView.measuredWidth == 0 || composeView.measuredHeight == 0) { throw IllegalStateException("The ComposeView was measured to have a width or height of " + - "zero. Make sure the parent and content have a non-zero size.") + "zero. Make sure that the content has a non-zero size.") } composeView.layout(0, 0, composeView.measuredWidth, composeView.measuredHeight)