jetc.dev Newsletter Issue #315

Published: 2026-05-26

Note to self: do not take the weekend off before Google I|O. 😅

This week, we see what Google I|O 2026 brought us, marvel at JetBrains’ multiplatform velocity, explore some LLM-related Compose libraries, and debate State.

Ooooo… What Did We Get?

Reviewing the release notes for the latest Jetpack Compose update!

As JetBrains put it, Compose Multiplatform 1.11.0 Is Now Available. 🎉 The time between Compose for Android releases and the corresponding Compose Multiplatform release continues to shrink, which helps with Compose comprehension and should help with Compose Multiplatform uptake.

However, time marches on, so the Compose BOMs are up to 2026.05.01. The production BOM will point to 1.11.2 of the core Compose artifacts, with your usual bug fixes.

The alpha BOM will point to 1.12.0-alpha03 of the core Compose artifacts, with several changes:

  • The Style API has made some changes to allow for custom style scopes, but you will need to add some imports due to a somewhat-breaking API change.

  • ComposeTestRule and ComposeUiTest offer runWithoutImplicitWait(), for faster tests where you do not need the implicit synchronization

  • @PreviewWrapper now works with multi-previews

  • MeshGradientPainter, a credentialRequest semantics property, and SoundEffectOnInteraction were all added, as was a mutableTransform parameter to AnimatedVisibility and AnimatedContent

Compose Material3 is up to 1.5.0-alpha20. The biggest news is that rememberBottomSheetState() replaces rememberModalBottomSheetState() and rememberStandardBottomSheetState().

Compose Material3 Adaptive is up to 1.3.0-beta02, presumably with bug fixes.

Remote Compose reached 1.0.0-alpha11. RemoteText() now has a corresponding RemoteFontFamily, and RemoteLong now supports math.

Glance is up to 1.3.0-alpha01, with a long list of seemingly minor changes.

Wear Glance reached 1.0.0-alpha10, where developers gain access to glance.wear.health.DataType.

Nav3 has a 1.1.2 patch release (fixing a preview-related predictive back bug) and a 1.2.0-alpha03 release (adding better deep link support).

Wear Compose has 1.6.2 (bug fixes) and 1.7.0-alpha03 (one-handed gesture changes).

And, we got other Compose-related updates:

  • androidx.ink:ink-authoring-compose:1.1.0-alpha03
  • androidx.ink:ink-authoring-compose-android:1.1.0-alpha03
  • androidx.ink:ink-geometry-compose:1.1.0-alpha03
  • androidx.ink:ink-geometry-compose-android:1.1.0-alpha03
  • androidx.lifecycle:lifecycle-runtime-compose:2.11.0-beta02 (and multiplatform targets)
  • androidx.lifecycle:lifecycle-viewmodel-compose:2.11.0-beta02 (and multiplatform targets)
  • androidx.media3:media3-ui-compose:1.8.1
  • androidx.navigation:navigation-compose:2.10.0-alpha05 (and multiplatform targets)
  • androidx.savedstate:savedstate-compose:1.5.0 (and multiplatform targets)

One Off the Stack, One Off the Slack

You’ve got questions. That’s understandable!

How Can I Stop My Sheet From Dragging?

If you want scrollable content in your ModalBottomSheet(), Compose Material3 1.4.0 is adding sheetGesturesEnabled = false. Learn more in this week’s highlighted Stack Overflow question.

How Do We Extend Stuff?

With a function-based API and implementation, Compose makes composition easy and inheritance frequently impossible. And, with only so much of the Compose implementation public, even composition can be a challenge. While copying internal implementations feels icky, often it is the only option, as we see in this week’s highlighted Kotlinlang #compose Slack thread.

Google I|O 2026

Google I|O 2026 — Google AI|O, amirite? — did manage to have some Compose-related sessions! Beyond general ones like “What’s new in Android” and “What’s new in Android development tools”, they had some a bit more Compose-specific ones, including:

Composable Commentary

Posts, videos, and other new information related to Jetpack Compose!

Android is Compose-first

The biggest news out of Google I|O relative to Compose is that… Compose won! The View-based UI system is in maintenance mode, with all UI effort now being plowed into Compose. Way back when I started this newsletter, I expected that this would be the eventual outcome if Compose had positive uptake by developers.

A New Default Project Structure for Kotlin Multiplatform

JetBrains’ Márton Braun (Mastodon, Bluesky) points out “the new normal” for Compose Multiplatform project structures, where each platform now gets its own top-level module, with a shared module containing all of the cross-platform elements. This improves Android Gradle Plugin 9.0 support, offers better parallelism than the previous composeApp/iosApp pair, and will be easier to extend over time.

How to Handle Disabled State for Multicolour Icons in Android (Jetpack Compose Guide)

The inDrive.Tech team explores ways to mark an icon as disabled. For a single-colour icon, applying a “disabled” tint often is sufficient, but that wrecks multi-colour icons. Using saturation and opacity works better for the multi-colour case, and the team demonstrates how to detect how many colours an icon uses. I sure hope all these techniques also work for single-color and multi-color icons, though. 😉

Dejavu, Compose, And The Difference Between Performance Wins And Guardrails

James Cullimore wanted drama and excitement when applying Dejavu to a project, and had to settle for long-term confidence builders instead, along with an Android-related bug fix.

Medium: Dynamic Language Switching in Compose Multiplatform (Android & iOS)

Yevhen Litvintsev explores how to create a Compose Multiplatform wrapper over the native support for on-the-fly language changes in iOS and Android.

Medium: Choreographing Compose Animations with updateTransition

animate*AsState() is easy, but synchronizing multiple of them is not. Christophy Barth walks us through how to use updateTransition() to synchronize this sort of animated effect.

Medium: The Hidden Problem with Theme Switching in Jetpack Compose

Sometimes, your icons might not respect a switch between day and night themes. As Dani Mahardhika points out in this post, “even though Compose recomposes correctly during the theme changes, the underlying resource resolution may still reference stale resources if the context or resources are not refreshed in the way we expect”.

Medium: Your Compose Previews Should Be Good Enough to Skip the Emulator

Rituraj Sambherao argues that for examining your UI, previews should be all that you need… if you have a rich enough set of preview composables, powered by @PreviewParameter and PreviewParameterProvider.

Embracing Compose Snapshot State for UI Layer State Production

A long-standing debate in Compose development has been what viewmodels (or similar constructs) should expose: StateFlow or State from Compose’s snapshot system. TJ Dahunsi (Bluesky) argues that it should be State.

Resource Roundup

100% pure code!

GitHub: composablehorizons / compose-capabilities

Alex Styl (Bluesky) brings us a small library that reports what sorts of interaction capabilities are available to us, given the particular Compose Multiplatform platform we are running on. Specifically, it gives us hasTouch, hasPointer, and hasKeyboard information.

GitHub: Erkko68 / filament-kmp

Èric Bitriá Ribes is working on a Compose Multiplatform wrapper around Filament, Google’s “real-time physically based rendering engine”.

GitHub: NadeemIqbal / llm-typewriter

Nadeem Iqbal created a streaming text renderer, designed for chat interfaces to LLMs and similar “chunk at a time” text sources. It supports a wide array of features, from Markdown to screen reader support, across all major Compose Multiplatform targets.

GitHub: NadeemIqbal / prompt-bar

Nadeem Iqbal also created a text entry interface, designed for chat interfaces, such as for LLMs. It supports / command auto-completion, @ mentions, attachments, and more, across all major Compose Multiplatform targets.

GitHub: NucleusFramework / ComposePdfReader

The Nucleus team is building a pdfium-based PDF renderer and text extractor, supporting all major Compose Multiplatform targets.

Laygent

Zach Klippenstein (Mastodon, Bluesky) created a Laygent() composable. Backed by Koog and your preferred LLM, Laygent() takes a description of a layout (e.g., “Arrange items in a 3-column grid with 8 dp of spacing between them”) and renders your supplied items in it.

Notable Releases

I go away for a week, and Alex Styl blasts out 5 releases for Compose Unstyled, all in the 2.x series:

  • 2.0.0 broke the library into a couple of dozen smaller libraries, along with adding PortalHost() and Portal() for all of your teleporting needs! 😁

  • 2.1.0 added TooltipHost() and boosted test coverage

  • 2.2.0 added more regression test coverage, along with focus-visible support o focusRing

  • 2.3.0 modified buildTheme() to remove all default styling, including that from Compose Foundation

  • And 2.4.0 added a composeunstyled module to serve as the basis for custom design systems, in addition to revamping the keyboard navigation for DropdownMenu()

See this blog post for more about the 2.0 release.

A Very Particular Set of Skills

Adding Compose capabilities to your coding agents!

Here are a handful of new skills and related tools for helping you get the most out of your agents:

Featured here? Please add this badge to your article or repo! As Seen In - jetc.dev Newsletter Issue #315

Powered by Buttondown

Or, you can subscribe to the Atom feed or follow Mark Murphy on Mastodon or Bluesky.

Spread the Word!
Suggestions?
If you have ideas for items for future newsletter editions, reach out via email or contact Mark Murphy on kotlinlang Slack!