Consumer Tech

Jetpack Compose 1.12 adds mesh gradients, HDR, faster tests

Jetpack Compose 1.12 adds mesh gradients, HDR, faster tests

Download Android Studio & App Tools - Android Developers

Google’s Jetpack Compose has reached a new stable milestone. The August 2026 release promotes Compose to version 1.12 across the core modules, and the accompanying bill of materials is numbered 2026.08.00 Android Developers blog. For teams shipping Android UI in Kotlin, this version is less about one headline feature and more about a broad set of visual, integration, and performance upgrades that change daily development work.

What actually shipped in Compose 1.12

The release is described by its authors as stable rather than a preview, which matters because the APIs below are meant for production adoption Android Developers blog. The full library set is aligned through the Compose BOM 2026.08.00, so the recommended upgrade is a single version bump on the androidx.compose:compose-bom platform dependency rather than a cascade of per-library edits. The broader Jetpack family tracks these UI primitives as part of Google’s long-term plan to make Compose the default way to build Android interfaces Jetpack landing page.

Mesh gradients arrive as a first-class painter

Compose 1.12 introduces MeshGradientPainter, a tool for building multi-point, organic color gradients that were painful to fake with layered linear or radial gradients before Android Developers blog. You define a grid of vertices, each with a position and a color, and the painter interpolates between them. The pattern suits splash screens, animated backgrounds, and brand surfaces where a flat fill looks flat. Because the painter is a standard Compose graphics primitive, it composites with existing modifiers rather than requiring a custom drawing layer.

Wide color gamut and HDR rendering

Modern phone and tablet panels support extended color fidelity and higher dynamic range, and Compose 1.12 now enables full pipeline support for Wide Color Gamut (P3) and HDR rendering across graphics, paint, and shaders Android Developers blog. Colors authored in non-sRGB spaces such as Display P3 are preserved all the way to platform rendering without clamping, so a saturated brand red stays saturated instead of being flattened to sRGB. There are sensible fallbacks: colors fall back to sRGB if the color space is unsupported, if the Android version lacks support, or when running on API 28 and below. A related addition, LayerOutsets on GraphicsLayer and Modifier.graphicsLayer, lets you expand a layer’s visual bounds past its measured size and avoid the implicit clip when the layer is promoted to an offscreen buffer.

Credential Manager comes to text fields

One of the most practically useful changes is native Credential Manager integration for Compose text fields on Android 14 (API 34) and above, wired through the Autofill framework, with androidx.credentialslibrary handling older versions Android Developers blog. By attaching the new credentialRequest semantics property with CredentialRequestData, a login field can prompt for passkeys, saved credentials, or a sign-in request directly inside the input flow. For app teams, this removes a common excuse for building a custom sign-in UI that bypasses the platform credential sheet. Google positions Credential Manager as the unified path for passkeys and passwords across Android, and the official developer documentation describes how it consolidates those flows Android developer docs.

Performance: faster side effects and quicker first frames

Performance work centers on startup and side-effect cost. The team reports Time to Initial Display, the time to produce an app’s first frame, is now comparable to the traditional Views system in their benchmarks Android Developers blog. On the API side, SideEffect now accepts key arguments so you can fire one-shot effects when specific keys change. The measured result is significant: SideEffect is up to 90% faster than LaunchedEffect and around 20% faster than DisposableEffect for cases where you do not need a coroutine or a dispose block Android Developers blog. The ordering caveat is real, though: SideEffect runs before DisposableEffect and LaunchedEffect, so migrating existing effects needs care, especially for LaunchedEffect blocks that expect to start after the current frame completes.

Animation gets gesture-driven two-stage transitions

DeferredTargetAnimation has graduated out of experimental status, and two new composables, DeferredAnimatedContent and DeferredAnimatedVisibility, enable two-stage transitions useful for predictive back gesture tracking Android Developers blog. During the deferred phase, animated properties such as scale or offset can be driven manually in real time, for example by a swipe gesture, then handed off seamlessly to the automatic transition with velocity transfer when the deferred phase ends. A new permitTransformDuringDeferredTransition flag in SharedContentConfig controls whether shared elements transform along with their parent containers during that deferred phase.

Richer text editing and selection

Editable text gains programmatic rich formatting through new APIs on BasicTextField. You can apply and manipulate inline character and paragraph styles using SpanStyle and ParagraphStyle via a new addStyle() method inside a TextFieldBuffer scope, and query active styles through TextFieldState.textStyles Android Developers blog. Formatting and custom annotations persist across configuration changes. A SelectionState API adds programmatic control and observability over text selection inside a SelectionContainer, exposing selectedTexts as a reactive list and methods such as selectAll(), clear(), select(TextRange), and extendSelectionByWord(). Additional niceties include font variation settings for downloadable fonts, auto-scrolling when dragging a selection past the viewport, and automatic interaction sounds with an opt-out SoundEffectOnInteraction composable. One consequence worth noting: semantics click listeners must now run on the main thread, which may touch a small number of existing test cases.

Layout: named areas in Grid

Building complex two-dimensional layouts is easier with named areas in the @Experimental Grid component Android Developers blog. Instead of juggling numeric row and column indices, you define semantic regions such as header, sidebar, and content in a GridConfigurationScope, then place composables by area name. The KeyboardType options also expanded to include Date, Time, DateTime, and SignedDecimal, and BasicSecureTextField now defaults to TextObfuscationMode.System with RevealLastTyped as an absolute override.

Testing and tooling upgrades

Test synchronization gets new APIs aimed at cutting execution time and flakiness. hasPendingWork passively checks whether the UI has pending work without advancing the clock, and runWithoutImplicitWait temporarily disables implicit synchronization while stepping manual clock frames Android Developers blog. The captureToImage API can now capture a popup or dialog together with its anchor in a single bitmap, and onRootWithViewInteraction scopes Compose semantic searches to specific Android Views, simplifying hybrid UI tests such as RecyclerViews without unique production test tags. @PreviewWrapper annotations can now wrap custom @MultiPreview classes for reusable preview setups.

Breaking changes you must handle

Two migrations stand out. Compose 1.12 raises compileSdk to API 37 and requires a minimum AGP 9.1.1, so projects below that Gradle plugin version will need to bump it Android Developers blog. Separately, Modifier.onFirstVisible() is deprecated in favor of Modifier.onVisibilityChanged(), which offers more precise visibility threshold tracking. The Compose Styles API, previewed at Google I/O as a unified styling approach, stays experimental in this release, and the team warns to expect breaking changes as the foundational type-safety layer is finalized.

Planning your upgrade to Compose 1.12

The pragmatic path is to update the Compose BOM to 2026.08.00 in your version catalog or build file, raise compileSdk to API 37, and confirm your AGP is at least 9.1.1 before the build will succeed Android Developers blog. After that, audit any onFirstVisible() usage and migrate to onVisibilityChanged(). If you maintain a custom login screen, the new Credential Manager semantics are worth adopting early because they push users toward the platform passkey sheet. Teams already on Compose should treat the SideEffect key overload as a low-risk performance win wherever they fire analytics or one-shot updates. Teams that should move first are those with animation-heavy screens, custom login flows, or flaky Compose tests, because this release directly targets each of those pain points. Teams still on the Views system can watch from the sidelines; nothing here forces a migration, and the team reiterates that Compose continues to target the latest compileSdk each release.

If you build media experiences, Google’s Media3 1.11 update added new tools for Android media apps that pair well with Compose’s new graphics pipeline Google’s Media3 1.11 gives Android media apps new tools. For apps that mix on-device and cloud inference, our guide to building intelligent Android apps with cloud and hybrid inference covers where Compose UI fits in an AI-driven product Build intelligent Android apps: Cloud and hybrid inference.

Editorially independent: we accept no payment for coverage and currently use no affiliate links. Read our Editorial Standards and Corrections Policy. Published: Aug 14, 2026.
Jinultimate

Editor of ZBrandCo and the person accountable for what we publish — setting our sourcing standards, fact-checking claims against primary sources, and issuing corrections promptly across AI, open source, and gaming. Reach the desk at editorial@zbrandco.com.