CINXE.COM
Compose Foundation | Jetpack | Android Developers
<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Android Developers"> <meta property="og:type" content="website"><meta name="theme-color" content="#34a853"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/android/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500,600,700|Google+Sans+Text:400,400italic,500,500italic,600,600italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/css/app.css"> <link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/css/dark-theme.css" disabled> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/favicon.svg"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/touchicon-180.png"><link rel="canonical" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation"><link rel="search" type="application/opensearchdescription+xml" title="Android Developers" href="https://developer.android.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation" /><link rel="alternate" hreflang="x-default" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation" /><link rel="alternate" hreflang="ar" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=fr" /><link rel="alternate" hreflang="de" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=de" /><link rel="alternate" hreflang="he" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=he" /><link rel="alternate" hreflang="hi" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=hi" /><link rel="alternate" hreflang="id" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=id" /><link rel="alternate" hreflang="it" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=it" /><link rel="alternate" hreflang="ja" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=th" /><link rel="alternate" hreflang="tr" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developer.android.com/jetpack/androidx/releases/compose-foundation?hl=vi" /><title>Compose Foundation | Jetpack | Android Developers</title> <meta property="og:title" content="Compose Foundation | Jetpack | Android Developers"><meta property="og:url" content="https://developer.android.com/jetpack/androidx/releases/compose-foundation"><meta property="og:image" content="https://developer.android.com/static/images/social/android-developers.png"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="675"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Compose Foundation" } </script><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Get started", "item": "https://developer.android.com/get-started/overview" },{ "@type": "ListItem", "position": 2, "name": "Jetpack", "item": "https://developer.android.com/jetpack" },{ "@type": "ListItem", "position": 3, "name": "Compose Foundation", "item": "https://developer.android.com/jetpack/androidx/releases/compose-foundation" }] } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="android-theme" type="article" appearance layout="docs" display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="androidDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="Android Developers"> <img src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg" class="devsite-site-logo" alt="Android Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab class="devsite-dropdown devsite-dropdown-full devsite-active "> <a href="https://developer.android.com/jetpack" track-metadata-eventdetail="https://developer.android.com/jetpack" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - essentials" track-metadata-module="primary nav" aria-label="Essentials, selected" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" > Essentials </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Essentials" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack" track-metadata-position="nav - essentials" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown android-dropdown-primary android-dropdown-studio"> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Gemini in Android Studio</li> <li class="devsite-nav-description">Your AI development companion for Android development. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/gemini-in-android" track-type="nav" track-metadata-eventdetail="https://developer.android.com/gemini-in-android" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="gemini in android studio" tooltip class="button button-primary" > <div class="devsite-nav-item-title"> Learn more </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="gemini in android studio" tooltip class="button button-white" > <div class="devsite-nav-item-title"> Get Android Studio </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-launch"> <li class="devsite-nav-title" role="heading" tooltip>Get started</li> <li class="devsite-nav-description">Start by creating your first app. Go deeper with our training courses or explore app development on your own. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/get-started/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started/overview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Hello world </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/courses" track-type="nav" track-metadata-eventdetail="https://developer.android.com/courses" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Training courses </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/get-started/codelabs" track-type="nav" track-metadata-eventdetail="https://developer.android.com/get-started/codelabs" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Tutorials </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/kotlin" track-type="nav" track-metadata-eventdetail="https://developer.android.com/kotlin" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Kotlin for Android </div> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/console/about/guides/monetize/" track-type="nav" track-metadata-eventdetail="https://play.google.com/console/about/guides/monetize/" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get started" tooltip > <div class="devsite-nav-item-title"> Monetization with Play ↗️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-multiple-screens"> <li class="devsite-nav-title" role="heading" tooltip>Extend by device</li> <li class="devsite-nav-description">Build apps that give your users seamless experiences from phones to tablets, watches, and more. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/adaptive-apps" track-type="nav" track-metadata-eventdetail="https://developer.android.com/adaptive-apps" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Adaptive apps </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/wear" track-type="nav" track-metadata-eventdetail="https://developer.android.com/wear" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/cars" track-type="nav" track-metadata-eventdetail="https://developer.android.com/cars" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android for Cars </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/tv" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/chrome-os" track-type="nav" track-metadata-eventdetail="https://developer.android.com/chrome-os" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> ChromeOS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/multi-device-development" track-type="nav" track-metadata-eventdetail="https://developer.android.com/multi-device-development" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="extend by device" tooltip > <div class="devsite-nav-item-title"> Cross-device SDK </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-platform"> <li class="devsite-nav-title" role="heading" tooltip>Build by category</li> <li class="devsite-nav-description">Learn to build for your use case by following Google's prescriptive and opinionated guidance. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/games" track-type="nav" track-metadata-eventdetail="https://developer.android.com/games" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Games </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/media" track-type="nav" track-metadata-eventdetail="https://developer.android.com/media" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Camera & Media </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/social-and-messaging" track-type="nav" track-metadata-eventdetail="https://developer.android.com/social-and-messaging" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Social & messaging </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/health-and-fitness" track-type="nav" track-metadata-eventdetail="https://developer.android.com/health-and-fitness" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Health & Fitness </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/productivity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/productivity" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Productivity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/work/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/work/overview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="build by category" tooltip > <div class="devsite-nav-item-title"> Enterprise apps </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-stars"> <li class="devsite-nav-title" role="heading" tooltip>Get the latest</li> <li class="devsite-nav-description">Stay in touch with the latest releases throughout the year, join our preview programs, and give us your feedback. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/latest-updates" track-type="nav" track-metadata-eventdetail="https://developer.android.com/latest-updates" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Latest updates </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/latest-updates/experimental" track-type="nav" track-metadata-eventdetail="https://developer.android.com/latest-updates/experimental" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Experimental updates </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio/preview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio/preview" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Android Studio preview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/versions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/versions" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Jetpack & Compose libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/wearables/versions/4" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/wearables/versions/4" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Wear OS preview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design-for-safety/privacy-sandbox" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design-for-safety/privacy-sandbox" track-metadata-position="nav - essentials" track-metadata-module="tertiary nav" track-metadata-module_headline="get the latest" tooltip > <div class="devsite-nav-item-title"> Privacy Sandbox </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-dropdown-full "> <a href="https://developer.android.com/design" track-metadata-eventdetail="https://developer.android.com/design" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - design & plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" > Design & Plan </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Design & Plan" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design" track-metadata-position="nav - design & plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-layout"> <li class="devsite-nav-title" role="heading" tooltip>UI Design</li> <li class="devsite-nav-description">Design a beautiful user interface using Android best practices.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Design for Android </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/mobile" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/mobile" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Mobile </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/large-screens" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/large-screens" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Large screens (e.g., tablets) </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/widget" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/widget" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Widgets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/wear" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/wear" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/design/ui/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design/ui/tv" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="ui design" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-design"> <li class="devsite-nav-title" role="heading" tooltip>Architecture</li> <li class="devsite-nav-description">Design robust, testable, and maintainable app logic and services.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/architecture/intro" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/architecture/intro" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Introduction </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/libraries/view-binding" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/libraries/view-binding" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/navigation/navigation-principles" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/navigation/navigation-principles" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Navigation </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/modularization" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/modularization" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Modularization </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/testing/fundamentals" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/testing/fundamentals" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="architecture" tooltip > <div class="devsite-nav-item-title"> Testing </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-vitals"> <li class="devsite-nav-title" role="heading" tooltip>Quality</li> <li class="devsite-nav-description">Plan for app quality and align with Play store guidelines.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/core-value" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/core-value" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Core value </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/user-experience" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/user-experience" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> User experience </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/technical" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/technical" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Technical quality </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quality/privacy-and-security" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quality/privacy-and-security" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="quality" tooltip > <div class="devsite-nav-item-title"> Security </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-security-2"> <li class="devsite-nav-title" role="heading" tooltip>Security</li> <li class="devsite-nav-description">Safeguard users against threats and ensure a secure Android experience.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/security" track-type="nav" track-metadata-eventdetail="https://developer.android.com/security" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/privacy-and-security/about" track-type="nav" track-metadata-eventdetail="https://developer.android.com/privacy-and-security/about" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Privacy </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/identity" track-type="nav" track-metadata-eventdetail="https://developer.android.com/identity" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Identity </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/security/fraud-prevention" track-type="nav" track-metadata-eventdetail="https://developer.android.com/security/fraud-prevention" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="security" tooltip > <div class="devsite-nav-item-title"> Fraud prevention </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-earth"> <li class="devsite-nav-title" role="heading" tooltip>Build for Billions</li> <li class="devsite-nav-description">Create the best experience for entry-level devices</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/build-for-billions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/build-for-billions" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> Overview </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/docs/quality-guidelines/build-for-billions" track-type="nav" track-metadata-eventdetail="https://developer.android.com/docs/quality-guidelines/build-for-billions" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> About new markets </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/androidgo" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/androidgo" track-metadata-position="nav - design & plan" track-metadata-module="tertiary nav" track-metadata-module_headline="build for billions" tooltip > <div class="devsite-nav-item-title"> Android (Go edition) </div> </a> </li> </ul> </div> </div> </div> </tab> <tab class="devsite-dropdown devsite-dropdown-full "> <a href="https://developer.android.com/develop" track-metadata-eventdetail="https://developer.android.com/develop" class="devsite-tabs-content gc-analytics-event android-dropdown-tab" track-type="nav" track-metadata-position="nav - develop" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > Develop </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Develop" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop" track-metadata-position="nav - develop" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></a> <div class="devsite-tabs-dropdown" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column android-dropdown android-dropdown-primary android-dropdown-ai"> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-title" role="heading" tooltip>Build AI experiences</li> <li class="devsite-nav-description">Build AI-powered Android apps with Gemini APIs and more. </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/ai" track-type="nav" track-metadata-eventdetail="https://developer.android.com/ai" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="build ai experiences" tooltip class="button button-primary" > <div class="devsite-nav-item-title"> Get started </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-flag"> <li class="devsite-nav-title" role="heading" tooltip>Core areas</li> <li class="devsite-nav-description">Get the samples and docs for the features you need.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/samples" track-type="nav" track-metadata-eventdetail="https://developer.android.com/samples" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Samples </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/quick-guides" track-type="nav" track-metadata-eventdetail="https://developer.android.com/quick-guides" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Try Quick Guidesᵇᵉᵗᵃ </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/ui" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/ui" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> User interfaces </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/permissions/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/permissions/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Permissions </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop/background-work" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop/background-work" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Background work </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/data" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/data" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> Data and files </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/develop#core-areas" track-type="nav" track-metadata-eventdetail="https://developer.android.com/develop#core-areas" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="core areas" tooltip > <div class="devsite-nav-item-title"> All core areas ⤵️ </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-tools-2"> <li class="devsite-nav-title" role="heading" tooltip>Tools and workflow</li> <li class="devsite-nav-description">Use the IDE to write and build your app, or create your own pipeline.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/studio/write" track-type="nav" track-metadata-eventdetail="https://developer.android.com/studio/write" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Write and debug code </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/build/gradle-build-overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/build/gradle-build-overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Build projects </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/testing" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/testing" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Test your app </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/topic/performance/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/topic/performance/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Performance </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/tools" track-type="nav" track-metadata-eventdetail="https://developer.android.com/tools" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Command-line tools </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/reference/tools/gradle-api" track-type="nav" track-metadata-eventdetail="https://developer.android.com/reference/tools/gradle-api" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="tools and workflow" tooltip > <div class="devsite-nav-item-title"> Gradle plugin API </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-multiple-screens"> <li class="devsite-nav-title" role="heading" tooltip>Device tech</li> <li class="devsite-nav-description">Write code for form factors. Connect devices and share data.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/large-screens/get-started-with-large-screens" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/large-screens/get-started-with-large-screens" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Large screens (e.g., tablets) </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/wearables" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/wearables" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Wear OS </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/health-and-fitness/guides" track-type="nav" track-metadata-eventdetail="https://developer.android.com/health-and-fitness/guides" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android Health </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/guide/topics/connectivity/cross-device-sdk/overview" track-type="nav" track-metadata-eventdetail="https://developer.android.com/guide/topics/connectivity/cross-device-sdk/overview" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Cross-device SDK </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/cars" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/cars" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android for Cars </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/training/tv" track-type="nav" track-metadata-eventdetail="https://developer.android.com/training/tv" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> Android TV </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/chrome-os/intro" track-type="nav" track-metadata-eventdetail="https://developer.android.com/chrome-os/intro" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="device tech" tooltip > <div class="devsite-nav-item-title"> ChromeOS </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column android-dropdown"> <ul class="devsite-tabs-dropdown-section android-dropdown-section-icon android-dropdown-section-icon-core-library"> <li class="devsite-nav-title" role="heading" tooltip>Libraries</li> <li class="devsite-nav-description">Browse API reference documentation with all the details.</li> <li class="devsite-nav-item"> <a href="https://developer.android.com/reference/packages" track-type="nav" track-metadata-eventdetail="https://developer.android.com/reference/packages" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Android platform </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/explorer" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/explorer" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Jetpack libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developer.android.com/jetpack/androidx/releases/compose" track-type="nav" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/releases/compose" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Compose libraries </div> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/android/reference/packages" track-type="nav" track-metadata-eventdetail="https://developers.google.com/android/reference/packages" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Google Play services ↗️ </div> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/sdks" track-type="nav" track-metadata-eventdetail="https://play.google.com/sdks" track-metadata-position="nav - develop" track-metadata-module="tertiary nav" track-metadata-module_headline="libraries" tooltip > <div class="devsite-nav-item-title"> Google Play SDK index ↗️ </div> </a> </li> </ul> </div> </div> </div> </tab> <tab > <a href="https://developer.android.com/distribute" track-metadata-eventdetail="https://developer.android.com/distribute" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - google play" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Google Play" track-name="google play" > Google Play </a> </tab> <tab > <a href="https://developer.android.com/community" track-metadata-eventdetail="https://developer.android.com/community" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - community" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" > Community </a> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="Jetpack" tenant-name="Android Developers" > <form class="devsite-search-form" action="https://developer.android.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-appearance-selector></devsite-appearance-selector> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <a class="devsite-header-link devsite-top-button button gc-analytics-event" href="https://developer.android.com/studio" data-category="Site-Wide Custom Events" data-label="Site header link" > Android Studio </a> <devsite-user enable-profiles id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-product-id-row" > <div class="devsite-product-description-row"> <ul class="devsite-breadcrumb-list" aria-label="Lower header breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developer.android.com/get-started/overview" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Get started" > Get started </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Jetpack" > Jetpack </a> </li> </ul> </div> </div> <div class="devsite-doc-set-nav-row"> <devsite-tabs class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab > <a href="https://developer.android.com/jetpack" track-metadata-eventdetail="https://developer.android.com/jetpack" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - overview" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" > Overview </a> </tab> <tab > <a href="https://developer.android.com/jetpack/getting-started" track-metadata-eventdetail="https://developer.android.com/jetpack/getting-started" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - guides" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" > Guides </a> </tab> <tab > <a href="https://developer.android.com/jetpack/samples" track-metadata-eventdetail="https://developer.android.com/jetpack/samples" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - samples" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" > Samples </a> </tab> <tab class="devsite-active"> <a href="https://developer.android.com/jetpack/androidx/explorer" track-metadata-eventdetail="https://developer.android.com/jetpack/androidx/explorer" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - libraries" track-metadata-module="primary nav" aria-label="Libraries, selected" data-category="Site-Wide Custom Events" data-label="Tab: Libraries" track-name="libraries" > Libraries </a> </tab> </nav> </devsite-tabs> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="androidDevelopers" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="Android Developers"> <img src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg" class="devsite-site-logo" alt="Android Developers"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/jetpack" class="devsite-nav-title gc-analytics-event devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Essentials" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Essentials </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Essentials" track-name="essentials" > <span class="devsite-nav-text" tooltip menu="Essentials"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Essentials"> </span> </span> </li> </ul> <ul class="devsite-nav-responsive-tabs"> <li class="devsite-nav-item"> <a href="/jetpack" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/getting-started" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Guides" track-name="guides" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Guides" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Guides </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/samples" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Samples" track-name="samples" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Samples </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Libraries" track-name="libraries" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Libraries" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip menu="_book"> Libraries </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/design" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design & Plan" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design & Plan </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Design & Plan" track-name="design & plan" > <span class="devsite-nav-text" tooltip menu="Design & Plan"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Design & Plan"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/develop" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Develop" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Develop </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Develop" track-name="develop" > <span class="devsite-nav-text" tooltip menu="Develop"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Develop"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/distribute" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Google Play" track-name="google play" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play </span> </a> </li> <li class="devsite-nav-item"> <a href="/community" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Community" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Community </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio </span> </a> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item"><a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/explorer" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/explorer" ><span class="devsite-nav-text" tooltip>Explore the libraries</span></a></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Library Releases</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/versions" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/all-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/all-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/all-channel" ><span class="devsite-nav-text" tooltip>All Channels</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/stable-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/stable-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/stable-channel" ><span class="devsite-nav-text" tooltip>Stable Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/rc-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/rc-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/rc-channel" ><span class="devsite-nav-text" tooltip>RC Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/beta-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/beta-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/beta-channel" ><span class="devsite-nav-text" tooltip>Beta Channel</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/versions/alpha-channel" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/versions/alpha-channel" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/versions/alpha-channel" ><span class="devsite-nav-text" tooltip>Alpha Channel</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Release Notes</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/activity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/activity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/activity" ><span class="devsite-nav-text" tooltip>androidx.activity</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/ads" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/ads" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/ads" ><span class="devsite-nav-text" tooltip>androidx.ads</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/annotation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/annotation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/annotation" ><span class="devsite-nav-text" tooltip>androidx.annotation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/appcompat" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/appcompat" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/appcompat" ><span class="devsite-nav-text" tooltip>androidx.appcompat</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/appsearch" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/appsearch" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/appsearch" ><span class="devsite-nav-text" tooltip>androidx.appsearch</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/arch-core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/arch-core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/arch-core" ><span class="devsite-nav-text" tooltip>androidx.arch.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/asynclayoutinflater" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/asynclayoutinflater" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/asynclayoutinflater" ><span class="devsite-nav-text" tooltip>androidx.asynclayoutinflater</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/autofill" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/autofill" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/autofill" ><span class="devsite-nav-text" tooltip>androidx.autofill</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/benchmark" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/benchmark" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/benchmark" ><span class="devsite-nav-text" tooltip>androidx.benchmark</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/biometric" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/biometric" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/biometric" ><span class="devsite-nav-text" tooltip>androidx.biometric</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/bluetooth" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/bluetooth" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/bluetooth" ><span class="devsite-nav-text" tooltip>androidx.bluetooth</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/browser" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/browser" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/browser" ><span class="devsite-nav-text" tooltip>androidx.browser</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/camera" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/camera" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/camera" ><span class="devsite-nav-text" tooltip>androidx.camera</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/camera-viewfinder" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/camera-viewfinder" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/camera-viewfinder" ><span class="devsite-nav-text" tooltip>androidx.camera.viewfinder</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/car" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/car" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/car" ><span class="devsite-nav-text" tooltip>androidx.car</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/car-app" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/car-app" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/car-app" ><span class="devsite-nav-text" tooltip>androidx.car.app</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/cardview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/cardview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/cardview" ><span class="devsite-nav-text" tooltip>androidx.cardview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/collection" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/collection" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/collection" ><span class="devsite-nav-text" tooltip>androidx.collection</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose" ><span class="devsite-nav-text" tooltip>androidx.compose</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-animation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-animation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-animation" ><span class="devsite-nav-text" tooltip>androidx.compose.animation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-compiler" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-compiler" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-compiler" ><span class="devsite-nav-text" tooltip>androidx.compose.compiler</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-foundation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-foundation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-foundation" ><span class="devsite-nav-text" tooltip>androidx.compose.foundation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material" ><span class="devsite-nav-text" tooltip>androidx.compose.material</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material3" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material3" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material3" ><span class="devsite-nav-text" tooltip>androidx.compose.material3</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-material3-adaptive" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-material3-adaptive" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-material3-adaptive" ><span class="devsite-nav-text" tooltip>androidx.compose.material3.adaptive</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-runtime" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-runtime" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-runtime" ><span class="devsite-nav-text" tooltip>androidx.compose.runtime</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-ui" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-ui" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-ui" ><span class="devsite-nav-text" tooltip>androidx.compose.ui</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/concurrent" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/concurrent" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/concurrent" ><span class="devsite-nav-text" tooltip>androidx.concurrent</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/constraintlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/constraintlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/constraintlayout" ><span class="devsite-nav-text" tooltip>androidx.constraintlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/contentpager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/contentpager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/contentpager" ><span class="devsite-nav-text" tooltip>androidx.contentpager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/coordinatorlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/coordinatorlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/coordinatorlayout" ><span class="devsite-nav-text" tooltip>androidx.coordinatorlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/core" ><span class="devsite-nav-text" tooltip>androidx.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/core-uwb" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/core-uwb" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/core-uwb" ><span class="devsite-nav-text" tooltip>androidx.core.uwb</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/credentials" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/credentials" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/credentials" ><span class="devsite-nav-text" tooltip>androidx.credentials</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/credentials/registry" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/credentials/registry" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/credentials/registry" ><span class="devsite-nav-text" tooltip>androidx.credentials.registry</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/cursoradapter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/cursoradapter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/cursoradapter" ><span class="devsite-nav-text" tooltip>androidx.cursoradapter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/customview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/customview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/customview" ><span class="devsite-nav-text" tooltip>androidx.customview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/databinding" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/databinding" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/databinding" ><span class="devsite-nav-text" tooltip>androidx.databinding</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/datastore" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/datastore" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/datastore" ><span class="devsite-nav-text" tooltip>androidx.datastore</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/documentfile" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/documentfile" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/documentfile" ><span class="devsite-nav-text" tooltip>androidx.documentfile</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/draganddrop" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/draganddrop" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/draganddrop" ><span class="devsite-nav-text" tooltip>androidx.draganddrop</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/drawerlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/drawerlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/drawerlayout" ><span class="devsite-nav-text" tooltip>androidx.drawerlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/dynamicanimation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/dynamicanimation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/dynamicanimation" ><span class="devsite-nav-text" tooltip>androidx.dynamicanimation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/emoji" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/emoji" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/emoji" ><span class="devsite-nav-text" tooltip>androidx.emoji</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/emoji2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/emoji2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/emoji2" ><span class="devsite-nav-text" tooltip>androidx.emoji2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/enterprise" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/enterprise" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/enterprise" ><span class="devsite-nav-text" tooltip>androidx.enterprise</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/exifinterface" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/exifinterface" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/exifinterface" ><span class="devsite-nav-text" tooltip>androidx.exifinterface</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/fragment" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/fragment" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/fragment" ><span class="devsite-nav-text" tooltip>androidx.fragment</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/games" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/games" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/games" ><span class="devsite-nav-text" tooltip>androidx.games</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/glance" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/glance" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/glance" ><span class="devsite-nav-text" tooltip>androidx.glance</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/graphics" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/graphics" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/graphics" ><span class="devsite-nav-text" tooltip>androidx.graphics</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/gridlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/gridlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/gridlayout" ><span class="devsite-nav-text" tooltip>androidx.gridlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/health" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/health" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/health" ><span class="devsite-nav-text" tooltip>androidx.health</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/health-connect" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/health-connect" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/health-connect" ><span class="devsite-nav-text" tooltip>androidx.health.connect</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/heifwriter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/heifwriter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/heifwriter" ><span class="devsite-nav-text" tooltip>androidx.heifwriter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/hilt" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/hilt" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/hilt" ><span class="devsite-nav-text" tooltip>androidx.hilt</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/ink" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/ink" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/ink" ><span class="devsite-nav-text" tooltip>androidx.ink</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/input" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/input" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/input" ><span class="devsite-nav-text" tooltip>androidx.input</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/interpolator" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/interpolator" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/interpolator" ><span class="devsite-nav-text" tooltip>androidx.interpolator</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/javascriptengine" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/javascriptengine" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/javascriptengine" ><span class="devsite-nav-text" tooltip>androidx.javascriptengine</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/leanback" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/leanback" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/leanback" ><span class="devsite-nav-text" tooltip>androidx.leanback</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/legacy" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/legacy" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/legacy" ><span class="devsite-nav-text" tooltip>androidx.legacy</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/lifecycle" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/lifecycle" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/lifecycle" ><span class="devsite-nav-text" tooltip>androidx.lifecycle</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/lint" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/lint" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/lint" ><span class="devsite-nav-text" tooltip>androidx.lint</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/loader" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/loader" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/loader" ><span class="devsite-nav-text" tooltip>androidx.loader</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/localbroadcastmanager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/localbroadcastmanager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/localbroadcastmanager" ><span class="devsite-nav-text" tooltip>androidx.localbroadcastmanager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media" ><span class="devsite-nav-text" tooltip>androidx.media</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media2" ><span class="devsite-nav-text" tooltip>androidx.media2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/media3" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/media3" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/media3" ><span class="devsite-nav-text" tooltip>androidx.media3</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/mediarouter" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/mediarouter" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/mediarouter" ><span class="devsite-nav-text" tooltip>androidx.mediarouter</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/multidex" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/multidex" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/multidex" ><span class="devsite-nav-text" tooltip>androidx.multidex</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/metrics" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/metrics" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/metrics" ><span class="devsite-nav-text" tooltip>androidx.metrics</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/navigation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/navigation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/navigation" ><span class="devsite-nav-text" tooltip>androidx.navigation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/paging" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/paging" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/paging" ><span class="devsite-nav-text" tooltip>androidx.paging</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/palette" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/palette" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/palette" ><span class="devsite-nav-text" tooltip>androidx.palette</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/pdf" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/pdf" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/pdf" ><span class="devsite-nav-text" tooltip>androidx.pdf</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/percentlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/percentlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/percentlayout" ><span class="devsite-nav-text" tooltip>androidx.percentlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/preference" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/preference" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/preference" ><span class="devsite-nav-text" tooltip>androidx.preference</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/print" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/print" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/print" ><span class="devsite-nav-text" tooltip>androidx.print</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-activity" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-activity" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-activity" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.activity</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-ads" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-ads" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-ads" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.ads</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-plugins" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-plugins" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-plugins" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.plugins</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-sdkruntime" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-sdkruntime" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-sdkruntime" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.sdkruntime</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-tools" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-tools" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-tools" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.tools</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/privacysandbox-ui" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/privacysandbox-ui" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/privacysandbox-ui" ><span class="devsite-nav-text" tooltip>androidx.privacysandbox.ui</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/profileinstaller" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/profileinstaller" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/profileinstaller" ><span class="devsite-nav-text" tooltip>androidx.profileinstaller</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/recommendation" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/recommendation" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/recommendation" ><span class="devsite-nav-text" tooltip>androidx.recommendation</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/recyclerview" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/recyclerview" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/recyclerview" ><span class="devsite-nav-text" tooltip>androidx.recyclerview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/remotecallback" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/remotecallback" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/remotecallback" ><span class="devsite-nav-text" tooltip>androidx.remotecallback</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/resourceinspection" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/resourceinspection" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/resourceinspection" ><span class="devsite-nav-text" tooltip>androidx.resourceinspection</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/room" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/room" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/room" ><span class="devsite-nav-text" tooltip>androidx.room</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/savedstate" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/savedstate" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/savedstate" ><span class="devsite-nav-text" tooltip>androidx.savedstate</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/security" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/security" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/security" ><span class="devsite-nav-text" tooltip>androidx.security</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/sharetarget" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/sharetarget" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/sharetarget" ><span class="devsite-nav-text" tooltip>androidx.sharetarget</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/slice" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/slice" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/slice" ><span class="devsite-nav-text" tooltip>androidx.slice</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/slidingpanelayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/slidingpanelayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/slidingpanelayout" ><span class="devsite-nav-text" tooltip>androidx.slidingpanelayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/sqlite" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/sqlite" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/sqlite" ><span class="devsite-nav-text" tooltip>androidx.sqlite</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/startup" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/startup" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/startup" ><span class="devsite-nav-text" tooltip>androidx.startup</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/swiperefreshlayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/swiperefreshlayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/swiperefreshlayout" ><span class="devsite-nav-text" tooltip>androidx.swiperefreshlayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/test" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/test" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/test" ><span class="devsite-nav-text" tooltip>androidx.test</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/test-uiautomator" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/test-uiautomator" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/test-uiautomator" ><span class="devsite-nav-text" tooltip>androidx.test.uiautomator</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/textclassifier" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/textclassifier" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/textclassifier" ><span class="devsite-nav-text" tooltip>androidx.textclassifier</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tracing" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tracing" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tracing" ><span class="devsite-nav-text" tooltip>androidx.tracing</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/transition" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/transition" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/transition" ><span class="devsite-nav-text" tooltip>androidx.transition</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tv" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tv" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tv" ><span class="devsite-nav-text" tooltip>androidx.tv</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/tvprovider" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/tvprovider" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/tvprovider" ><span class="devsite-nav-text" tooltip>androidx.tvprovider</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/vectordrawable" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/vectordrawable" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/vectordrawable" ><span class="devsite-nav-text" tooltip>androidx.vectordrawable</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/versionedparcelable" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/versionedparcelable" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/versionedparcelable" ><span class="devsite-nav-text" tooltip>androidx.versionedparcelable</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/viewpager" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/viewpager" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/viewpager" ><span class="devsite-nav-text" tooltip>androidx.viewpager</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/viewpager2" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/viewpager2" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/viewpager2" ><span class="devsite-nav-text" tooltip>androidx.viewpager2</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear" ><span class="devsite-nav-text" tooltip>androidx.wear</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-compose" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-compose" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-compose" ><span class="devsite-nav-text" tooltip>androidx.wear.compose</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-protolayout" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-protolayout" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-protolayout" ><span class="devsite-nav-text" tooltip>androidx.wear.protolayout</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-tiles" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-tiles" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-tiles" ><span class="devsite-nav-text" tooltip>androidx.wear.tiles</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/wear-watchface" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/wear-watchface" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/wear-watchface" ><span class="devsite-nav-text" tooltip>androidx.wear.watchface</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/webkit" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/webkit" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/webkit" ><span class="devsite-nav-text" tooltip>androidx.webkit</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/window" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/window" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/window" ><span class="devsite-nav-text" tooltip>androidx.window</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/window-extensions-core" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/window-extensions-core" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/window-extensions-core" ><span class="devsite-nav-text" tooltip>androidx.window.extensions.core</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/work" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/work" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/work" ><span class="devsite-nav-text" tooltip>androidx.work</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/jetifier" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/jetifier" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/jetifier" ><span class="devsite-nav-text" tooltip>tools.build.jetifier</span></a></li></ul></div></li> <li class="devsite-nav-item devsite-nav-expandable"><div class="devsite-expandable-nav"> <a class="devsite-nav-toggle" aria-hidden="true"></a><div class="devsite-nav-title devsite-nav-title-no-path" tabindex="0" role="button"> <span class="devsite-nav-text" tooltip>Release Note Archive</span> </div><ul class="devsite-nav-section"><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive" ><span class="devsite-nav-text" tooltip>Overview</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/test" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/test" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/test" ><span class="devsite-nav-text" tooltip>Test</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/arch" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/arch" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/arch" ><span class="devsite-nav-text" tooltip>Architecture Components</span></a></li><li class="devsite-nav-item"><a href="/jetpack/androidx/releases/archive/androidx" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/archive/androidx" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/archive/androidx" ><span class="devsite-nav-text" tooltip>AndroidX</span></a></li></ul></div></li> <li class="devsite-nav-item"><a href="/jetpack/androidx/compose-roadmap" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/compose-roadmap" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/compose-roadmap" ><span class="devsite-nav-text" tooltip>Jetpack Compose Roadmap</span></a></li> <li class="devsite-nav-item"><a href="/jetpack/androidx/releases/compose-kotlin" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /jetpack/androidx/releases/compose-kotlin" track-type="bookNav" track-name="click" track-metadata-eventdetail="/jetpack/androidx/releases/compose-kotlin" ><span class="devsite-nav-text" tooltip>Jetpack Compose Kotlin Compatibility</span></a></li> </ul> <ul class="devsite-nav-list" menu="Essentials" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Gemini in Android Studio </span> </span> </li> <li class="devsite-nav-item"> <a href="/gemini-in-android" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Learn more" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Learn more </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get Android Studio" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Get Android Studio </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Get started </span> </span> </li> <li class="devsite-nav-item"> <a href="/get-started/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Hello world" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Hello world </span> </a> </li> <li class="devsite-nav-item"> <a href="/courses" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Training courses" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Training courses </span> </a> </li> <li class="devsite-nav-item"> <a href="/get-started/codelabs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Tutorials" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Tutorials </span> </a> </li> <li class="devsite-nav-item"> <a href="/kotlin" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Kotlin for Android" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Kotlin for Android </span> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/console/about/guides/monetize/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Monetization with Play ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Monetization with Play ↗️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Extend by device </span> </span> </li> <li class="devsite-nav-item"> <a href="/adaptive-apps" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Adaptive apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Adaptive apps </span> </a> </li> <li class="devsite-nav-item"> <a href="/wear" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/cars" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android for Cars" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android for Cars </span> </a> </li> <li class="devsite-nav-item"> <a href="/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item"> <a href="/chrome-os" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: ChromeOS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > ChromeOS </span> </a> </li> <li class="devsite-nav-item"> <a href="/multi-device-development" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cross-device SDK" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cross-device SDK </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build by category </span> </span> </li> <li class="devsite-nav-item"> <a href="/games" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Games" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Games </span> </a> </li> <li class="devsite-nav-item"> <a href="/media" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Camera & Media" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Camera & Media </span> </a> </li> <li class="devsite-nav-item"> <a href="/social-and-messaging" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Social & messaging" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Social & messaging </span> </a> </li> <li class="devsite-nav-item"> <a href="/health-and-fitness" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Health & Fitness" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Health & Fitness </span> </a> </li> <li class="devsite-nav-item"> <a href="/productivity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Productivity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Productivity </span> </a> </li> <li class="devsite-nav-item"> <a href="/work/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Enterprise apps" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Enterprise apps </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Get the latest </span> </span> </li> <li class="devsite-nav-item"> <a href="/latest-updates" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Latest updates" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Latest updates </span> </a> </li> <li class="devsite-nav-item"> <a href="/latest-updates/experimental" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Experimental updates" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Experimental updates </span> </a> </li> <li class="devsite-nav-item"> <a href="/studio/preview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Studio preview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Studio preview </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/versions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Jetpack & Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack & Compose libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/wearables/versions/4" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS preview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS preview </span> </a> </li> <li class="devsite-nav-item"> <a href="/design-for-safety/privacy-sandbox" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy Sandbox" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy Sandbox </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Design & Plan" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > UI Design </span> </span> </li> <li class="devsite-nav-item"> <a href="/design/ui" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design for Android" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design for Android </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/mobile" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Mobile" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Mobile </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/large-screens" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Large screens (e.g., tablets)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Large screens (e.g., tablets) </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/widget" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Widgets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Widgets </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/wear" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/design/ui/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Architecture </span> </span> </li> <li class="devsite-nav-item"> <a href="/topic/architecture/intro" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Introduction" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Introduction </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/libraries/view-binding" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/navigation/navigation-principles" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Navigation" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Navigation </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/modularization" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Modularization" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Modularization </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/testing/fundamentals" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Testing" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Testing </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Quality </span> </span> </li> <li class="devsite-nav-item"> <a href="/quality" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/core-value" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Core value" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Core value </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/user-experience" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: User experience" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User experience </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/technical" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Technical quality" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Technical quality </span> </a> </li> <li class="devsite-nav-item"> <a href="/quality/privacy-and-security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Security" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Security </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Security </span> </span> </li> <li class="devsite-nav-item"> <a href="/security" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-and-security/about" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy </span> </a> </li> <li class="devsite-nav-item"> <a href="/identity" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Identity" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Identity </span> </a> </li> <li class="devsite-nav-item"> <a href="/security/fraud-prevention" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Fraud prevention" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Fraud prevention </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build for Billions </span> </span> </li> <li class="devsite-nav-item"> <a href="/build-for-billions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs/quality-guidelines/build-for-billions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: About new markets" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > About new markets </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/androidgo" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android (Go edition)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android (Go edition) </span> </a> </li> </ul> <ul class="devsite-nav-list" menu="Develop" aria-label="Side menu" hidden> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Build AI experiences </span> </span> </li> <li class="devsite-nav-item"> <a href="/ai" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Get started" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Get started </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Core areas </span> </span> </li> <li class="devsite-nav-item"> <a href="/samples" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Samples" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Samples </span> </a> </li> <li class="devsite-nav-item"> <a href="/quick-guides" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Try Quick Guidesᵇᵉᵗᵃ" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Try Quick Guidesᵇᵉᵗᵃ </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/ui" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: User interfaces" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User interfaces </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/permissions/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Permissions" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Permissions </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop/background-work" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Background work" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Background work </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/data" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Data and files" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Data and files </span> </a> </li> <li class="devsite-nav-item"> <a href="/develop#core-areas" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: All core areas ⤵️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > All core areas ⤵️ </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Tools and workflow </span> </span> </li> <li class="devsite-nav-item"> <a href="/studio/write" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Write and debug code" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Write and debug code </span> </a> </li> <li class="devsite-nav-item"> <a href="/build/gradle-build-overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Build projects" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Build projects </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/testing" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Test your app" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Test your app </span> </a> </li> <li class="devsite-nav-item"> <a href="/topic/performance/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Performance" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Performance </span> </a> </li> <li class="devsite-nav-item"> <a href="/tools" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Command-line tools" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Command-line tools </span> </a> </li> <li class="devsite-nav-item"> <a href="/reference/tools/gradle-api" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Gradle plugin API" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Gradle plugin API </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Device tech </span> </span> </li> <li class="devsite-nav-item"> <a href="/guide/topics/large-screens/get-started-with-large-screens" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Large screens (e.g., tablets)" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Large screens (e.g., tablets) </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/wearables" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Wear OS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Wear OS </span> </a> </li> <li class="devsite-nav-item"> <a href="/health-and-fitness/guides" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android Health" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android Health </span> </a> </li> <li class="devsite-nav-item"> <a href="/guide/topics/connectivity/cross-device-sdk/overview" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cross-device SDK" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cross-device SDK </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/cars" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android for Cars" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android for Cars </span> </a> </li> <li class="devsite-nav-item"> <a href="/training/tv" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android TV" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android TV </span> </a> </li> <li class="devsite-nav-item"> <a href="/chrome-os/intro" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: ChromeOS" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > ChromeOS </span> </a> </li> <li class="devsite-nav-item devsite-nav-heading"> <span class="devsite-nav-title" tooltip > <span class="devsite-nav-text" tooltip > Libraries </span> </span> </li> <li class="devsite-nav-item"> <a href="/reference/packages" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Android platform" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Android platform </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/explorer" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Jetpack libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="/jetpack/androidx/releases/compose" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Compose libraries </span> </a> </li> <li class="devsite-nav-item"> <a href="https://developers.google.com/android/reference/packages" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play services ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play services ↗️ </span> </a> </li> <li class="devsite-nav-item"> <a href="https://play.google.com/sdks" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Google Play SDK index ↗️" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Google Play SDK index ↗️ </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" class="devsite-main-content" has-book-nav has-sidebar > <div class="devsite-sidebar"> <div class="devsite-sidebar-content"> <devsite-toc class="devsite-nav" role="navigation" aria-label="On this page" depth="2" scrollbars ></devsite-toc> <devsite-recommendations-sidebar class="nocontent devsite-nav"> </devsite-recommendations-sidebar> </div> </div> <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developer.android.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Android Developers" > Android Developers </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/get-started/overview" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Get started" > Get started </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="3" track-type="globalNav" track-name="breadcrumb" track-metadata-position="3" track-metadata-eventdetail="Jetpack" > Jetpack </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developer.android.com/jetpack/androidx/explorer" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="4" track-type="globalNav" track-name="breadcrumb" track-metadata-position="4" track-metadata-eventdetail="" > Libraries </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <devsite-recommendations-dropdown class="nocontent"></devsite-recommendations-dropdown> <div class="devsite-article-body clearfix devsite-no-page-title"> <h1 class="devsite-page-title" style="width:50%" id="compose-foundation" data-text="Compose Foundation" tabindex="-1">Compose Foundation</h1> <div style="align:right; text-align:right; padding-bottom:21px; margin-top:-45px; border-bottom:1px solid black;"> <a href="/jetpack/compose/tutorial">User Guide</a> <a href="https://github.com/android/compose-samples">Code Sample</a> </div> <div style="float:left; font-size:medium; margin-bottom:5px; margin-top:10px" class="nocontent"> <div style="text-align:left; font-size:90%; padding-right:30px; margin-right:10px; margin-bottom:10px;"> API Reference<br> <a href="/reference/kotlin/androidx/compose/foundation/package-summary">androidx.compose.foundation</a><br> <a href="/reference/kotlin/androidx/compose/foundation/layout/package-summary">androidx.compose.foundation.layout</a><br> <a href="/reference/kotlin/androidx/compose/foundation/gestures/package-summary">androidx.compose.foundation.gestures</a><br> <a href="/reference/kotlin/androidx/compose/foundation/selection/package-summary">androidx.compose.foundation.selection</a><br> <a href="/reference/kotlin/androidx/compose/foundation/lazy/package-summary">androidx.compose.foundation.lazy</a><br> <a href="/reference/kotlin/androidx/compose/foundation/interaction/package-summary">androidx.compose.foundation.interaction</a><br> <a href="/reference/kotlin/androidx/compose/foundation/text/package-summary">androidx.compose.foundation.text</a><br> (<em>See the API reference docs for all compose packages</em>) </div> </div> <div style="text-align:left; padding-left:10px; margin-left:10px; margin-top:15px; margin-bottom:10px;"> Write Jetpack Compose applications with ready to use building blocks and extend foundation to build your own design system pieces. </div> <div style="clear:both"></div> <table style="width:100%"> <tr> <th style="width:15%">Latest Update</th> <th style="width:15%">Stable Release</th> <th style="width:15%">Release Candidate</th> <th style="width:15%">Beta Release</th> <th style="width:15%">Alpha Release</th></tr> <tr> <td>November 13, 2024</td> <td><a href="/jetpack/androidx/releases/compose-foundation#1.7.5">1.7.5</a></td> <td>-</td> <td>-</td> <td><a href="/jetpack/androidx/releases/compose-foundation#1.8.0-alpha06">1.8.0-alpha06</a></td> </tr> </table> <h2 id="structure" data-text="Structure" tabindex="-1">Structure</h2> <p>Compose is combination of 7 Maven Group Ids within <code translate="no" dir="ltr">androidx</code>. Each Group contains a targeted subset of functionality, each with its own set of release notes.</p> <p>This table explains the groups and links to each set of release notes.</p> <table> <thead> <tr><th>Group</th><th>Description</th></tr> </thead> <tbody class="list"> <tr><td><a href="/jetpack/androidx/releases/compose-animation">compose.animation</a></td><td>Build animations in their Jetpack Compose applications to enrich the user experience.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-compiler">compose.compiler</a></td><td>Transform @Composable functions and enable optimizations with a Kotlin compiler plugin.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-foundation">compose.foundation</a></td><td>Write Jetpack Compose applications with ready to use building blocks and extend foundation to build your own design system pieces.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-material">compose.material</a></td><td>Build Jetpack Compose UIs with ready to use Material Design Components. This is the higher level entry point of Compose, designed to provide components that match those described at www.material.io.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-material3">compose.material3</a></td><td>Build Jetpack Compose UIs with Material Design 3 Components, the next evolution of Material Design. Material 3 includes updated theming and components and Material You personalization features like dynamic color, and is designed to be cohesive with the new Android 12 visual style and system UI.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-runtime">compose.runtime</a></td><td>Fundamental building blocks of Compose's programming model and state management, and core runtime for the Compose Compiler Plugin to target.</td></tr> <tr><td><a href="/jetpack/androidx/releases/compose-ui">compose.ui</a></td><td>Fundamental components of compose UI needed to interact with the device, including layout, drawing, and input.</td></tr> </tbody> </table> <h2 id="declaring_dependencies" data-text="Declaring dependencies" tabindex="-1">Declaring dependencies</h2> <p>To add a dependency on Compose, you must add the Google Maven repository to your project. Read <a href="/studio/build/dependencies#google-maven">Google's Maven repository</a> for more information.</p> <p>Add the dependencies for the artifacts you need in the <code translate="no" dir="ltr">build.gradle</code> file for your app or module:</p> <div> <div class="ds-selector-tabs"><section><h3 id="groovy" data-text="Groovy" tabindex="-1">Groovy</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><span class="devsite-syntax-n">dependencies</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"androidx.compose.foundation:foundation:1.7.5"</span> <span class="devsite-syntax-o">}</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildFeatures</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">compose</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">composeOptions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">kotlinCompilerExtensionVersion</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"1.5.15"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">kotlinOptions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">jvmTarget</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"1.8"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-o">}</span></pre></devsite-code> </section><section><h3 id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><span class="devsite-syntax-n">dependencies</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">implementation</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"androidx.compose.foundation:foundation:1.7.5"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">buildFeatures</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">compose</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kc">true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">composeOptions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">kotlinCompilerExtensionVersion</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"1.5.15"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">kotlinOptions</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">jvmTarget</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"1.8"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span></pre></devsite-code> </section></div> </div> <p>For more information about dependencies, see <a href="/studio/build/dependencies">Add build dependencies</a>.</p> <h2 id="feedback" data-text="Feedback" tabindex="-1">Feedback</h2> <p>Your feedback helps make Jetpack better. Let us know if you discover new issues or have ideas for improving this library. Please take a look at the <a href="https://issuetracker.google.com/issues?q=componentid:856989%20status:open">existing issues</a> in this library before you create a new one. You can add your vote to an existing issue by clicking the star button.</p> <p><a href="https://issuetracker.google.com/issues/new?component=856989&template=1425922" class="button dac-button dac-outline-button">Create a new issue</a></p> <p>See the <a href="https://developers.google.com/issue-tracker">Issue Tracker documentation</a> for more information.</p> <h2 id="version_18_2" data-text="Version 1.8" tabindex="-1">Version 1.8</h2> <h3 id="1.8.0-alpha06" data-text="Version 1.8.0-alpha06" tabindex="-1">Version 1.8.0-alpha06</h3> <p>November 13, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.8.0-alpha06</code> is released. Version 1.8.0-alpha06 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/ccd90a76bd7c4acf4f4f01eca76350e383bc441e..6f09cf2ae979e48fdb19485f757a033e4a34bb82/compose/foundation">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Adds <code translate="no" dir="ltr">stylusHoverIcon</code> modifier. (<a href="https://android-review.googlesource.com/#/q/Iff20af03b451228bc44c4356d4b4e89956cc3b45">Iff20a</a>, <a href="https://issuetracker.google.com/issues/331289114">b/331289114</a>)</li> <li>Deprecated <code translate="no" dir="ltr">AnchoredDraggableState</code>'s <code translate="no" dir="ltr">confirmValueChange</code>. Instead of vetoing state changes, disallowed anchors should not be in the active anchor set, and an <code translate="no" dir="ltr">OverscrollEffect</code> should be used to indicate the unavailability of the requested action. (<a href="https://android-review.googlesource.com/#/q/Ia717fb7dba3db65609a933a55b164d2186e25806">Ia717f</a>)</li> <li>Changes Autofill manager to be an interface. (<a href="https://android-review.googlesource.com/#/q/I8491407de5699bf7273b9f88bda11cc438e2fd62">I84914</a>, <a href="https://issuetracker.google.com/issues/376080755">b/376080755</a>)</li> <li>Adds <code translate="no" dir="ltr">OverscrollEffect#withoutDrawing</code> and <code translate="no" dir="ltr">OverscrollEffect#withoutEventHandling</code> APIs - these APIs create a wrapped instance of the provided overscroll effect that doesn't draw / handle events respectively, which allows for rendering overscroll in a separate component from the component that is dispatching events. For example, disabling drawing the overscroll inside a lazy list, and then drawing the overscroll separately on top / elsewhere. (<a href="https://android-review.googlesource.com/#/q/Idbb3d91546b49c1987a041f959bce4b2b09a9f61">Idbb3d</a>, <a href="https://issuetracker.google.com/issues/266550551">b/266550551</a>, <a href="https://issuetracker.google.com/issues/204650733">b/204650733</a>, <a href="https://issuetracker.google.com/issues/255554340">b/255554340</a>, <a href="https://issuetracker.google.com/issues/229537244">b/229537244</a>)</li> <li>Adding autofill support in text toolbar. (<a href="https://android-review.googlesource.com/#/q/Ie6a4c0542737d76d603a925f85c389c81eb49747">Ie6a4c</a>)</li> <li>Deprecates <code translate="no" dir="ltr">OverscrollConfiguration</code> and <code translate="no" dir="ltr">LocalOverscrollConfiguration</code>, and adds <code translate="no" dir="ltr">rememberPlatformOverscrollFactory</code> to create an instance of / customize parameters of the default overscroll implementation. To disable overscroll, instead of <code translate="no" dir="ltr">LocalOverscrollConfiguration provides null</code>, use <code translate="no" dir="ltr">LocalOverscrollFactory provides null</code>. To change the glow color / padding, instead of <code translate="no" dir="ltr">LocalOverscrollConfiguration provides OverscrollConfiguration(myColor, myPadding)</code>, use <code translate="no" dir="ltr">LocalOverscrollFactory provides rememberPlatformOverscrollFactory(myColor, myPadding)</code>. (<a href="https://android-review.googlesource.com/#/q/Ie71f9a016face13262f4fe16ac56c40a0d6f9712">Ie71f9</a>, <a href="https://issuetracker.google.com/issues/255554340">b/255554340</a>, <a href="https://issuetracker.google.com/issues/234451516">b/234451516</a>)</li> <li>Changed the <code translate="no" dir="ltr">effectModifier</code> property on <code translate="no" dir="ltr">OverscrollEffect</code> to be <code translate="no" dir="ltr">node: DelegatableNode</code>, consistent with other APIs. (<a href="https://android-review.googlesource.com/#/q/Ic0b46a80aa7d9426ced0731531b3492093e1654e">Ic0b46</a>, <a href="https://issuetracker.google.com/issues/255554340">b/255554340</a>)</li> <li>Removed the experimental <code translate="no" dir="ltr">GlobalAssertions</code> API. It's intended use was to run accessibility checks, see <code translate="no" dir="ltr">enableAccessibilityChecks()</code> for that purpose instead. (<a href="https://android-review.googlesource.com/#/q/I5932296f2aca4c3daa30a013dd00e876ecebb077">I59322</a>)</li> </ul> <h3 id="1.8.0-alpha05" data-text="Version 1.8.0-alpha05" tabindex="-1">Version 1.8.0-alpha05</h3> <p>October 30, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.8.0-alpha05</code> is released. Version 1.8.0-alpha05 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/b8a68b0896897fa158508d73a31998a26161d9a7..ccd90a76bd7c4acf4f4f01eca76350e383bc441e/compose/foundation">these commits</a>.</p> <p><strong>New Features</strong></p> <ul> <li>Support for auto-sizing text. Pass an <code translate="no" dir="ltr">AutoSize</code> instance (e.g. <code translate="no" dir="ltr">AutoSize.StepBased</code>) to your favorite text composable (like <code translate="no" dir="ltr">BasicText</code>) and see your text size adapt to the available space! (<a href="https://android-review.googlesource.com/#/q/Ice7e09b9cac7be10ab5e681ec57d994d50102583">Ice7e0</a>, <a href="https://issuetracker.google.com/issues/139320827">b/139320827</a>)</li> <li>Adds <code translate="no" dir="ltr">OverscrollFactory</code> and <code translate="no" dir="ltr">LocalOverscrollFactory</code> APIs to allow configuring overscroll within a hierarchy. The value provided through <code translate="no" dir="ltr">LocalOverscrollFactory</code> will be used by default to create an <code translate="no" dir="ltr">OverscrollEffect</code>. To create and remember an effect from the current provided factory, use <code translate="no" dir="ltr">rememberOverscrollEffect()</code>. (<a href="https://android-review.googlesource.com/#/q/I51ca476f3efcf0249640873f74cf7d40beebb788">I51ca4</a>, <a href="https://issuetracker.google.com/issues/255554340">b/255554340</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Introduce <code translate="no" dir="ltr">CompositionLocal</code> that can be used to modify the hue of Autofill's successful filling highlight. (<a href="https://android-review.googlesource.com/#/q/I320926246d1811c2c974a6793f48941907c33afe">I32092</a>)</li> <li>Removed <code translate="no" dir="ltr">ScrollableDefaults.overscrollEffect</code> - instead you should use <code translate="no" dir="ltr">rememberOverscrollEffect</code>. This will create an instance of the current overscroll implementation provided with <code translate="no" dir="ltr">LocalOverscrollFactory</code>. (<a href="https://android-review.googlesource.com/#/q/I1651acbab8ddb4b35399af103e3db76b37361303">I1651a</a>, <a href="https://issuetracker.google.com/issues/255554340">b/255554340</a>),(<a href="https://issuetracker.google.com/issues/234451516">b/234451516</a>)</li> <li>Introduces new <code translate="no" dir="ltr">AutofillManager</code> interface that can be used to fine-tune users' Autofill journey and a <code translate="no" dir="ltr">isSemanticAutofillEnabled</code> flag to turn on this new version of Autofill. (<a href="https://android-review.googlesource.com/#/q/I9d4842cc35b289158e889f89b7b65346f049e884">I9d484</a>)</li> <li>Removes <code translate="no" dir="ltr">CombinedClickableNode</code>. This experimental API was temporarily exposed to unblock performance work, but is no longer needed. Instead you should directly use <code translate="no" dir="ltr">Modifier.combinedClickable</code> as with other modifier APIs. (<a href="https://android-review.googlesource.com/#/q/I4b658dabfefb13eb5bff42029502486ab89b7a6f">I4b658</a>)</li> <li>Adds overloads to <code translate="no" dir="ltr">horizontalScroll</code>, <code translate="no" dir="ltr">verticalScroll</code>, <code translate="no" dir="ltr">LazyColumn</code>, <code translate="no" dir="ltr">LazyRow</code>, <code translate="no" dir="ltr">LazyHorizontalGrid</code>, <code translate="no" dir="ltr">LazyVerticalGrid</code>, <code translate="no" dir="ltr">LazyHorizontalStaggeredGrid</code>, <code translate="no" dir="ltr">LazyVerticalStaggeredGrid</code>, <code translate="no" dir="ltr">HorizontalPager</code>, and <code translate="no" dir="ltr">VerticalPager</code> with support for specifying a custom <code translate="no" dir="ltr">OverscrollEffect</code>. The provided <code translate="no" dir="ltr">OverscrollEffect</code> will receive events, and be rendered within the bounds of these components. Note that drawing the same <code translate="no" dir="ltr">OverscrollEffect</code> twice is unsupported - so you cannot draw the same <code translate="no" dir="ltr">OverscrollEffect</code> provided to one of these components separately with <code translate="no" dir="ltr">Modifier.overscroll</code>. The use case of drawing the overscroll outside of the bounds of these components will be addressed separately in the future. (<a href="https://android-review.googlesource.com/#/q/I2dc42851c824a63e495312246eb5389c33121af8">I2dc42</a>, <a href="https://issuetracker.google.com/issues/266550551">b/266550551</a>, <a href="https://issuetracker.google.com/issues/234274772">b/234274772</a>, <a href="https://issuetracker.google.com/issues/224572538">b/224572538</a>, <a href="https://issuetracker.google.com/issues/353805117">b/353805117</a>)</li> </ul> <h3 id="1.8.0-alpha04" data-text="Version 1.8.0-alpha04" tabindex="-1">Version 1.8.0-alpha04</h3> <p>October 16, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.8.0-alpha04</code> is released. Version 1.8.0-alpha04 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/b6ae8d0a0e8cd803f7b84f30101eda1af4f1d6b6..b8a68b0896897fa158508d73a31998a26161d9a7/compose/foundation">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Adds <code translate="no" dir="ltr">DelegatableNode#onDensityChange</code> and <code translate="no" dir="ltr">DelegatableNode#onLayoutDirectionChange</code> callbacks to allow updating node state when these change. (<a href="https://android-review.googlesource.com/#/q/I04f3e3afea5aabdc6225b1afb197df18133eb018">I04f3e</a>, <a href="https://issuetracker.google.com/issues/340662451">b/340662451</a>)</li> <li>Paragraph and <code translate="no" dir="ltr">ParagraphIntrinsics</code> now takes a list of all annotations applied to the <code translate="no" dir="ltr">AnnotatedString</code>, previously it only had a list of <code translate="no" dir="ltr">SpanStyles</code>. (<a href="https://android-review.googlesource.com/#/q/I12f8071e3bb8ed7871bb659e256569182680d49e">I12f80</a>)</li> <li>Introduced <code translate="no" dir="ltr">PointerInputModifierNode#touchBoundsExpansion</code>, which can be used to enlarge the touch bounds of a single pointer input modifier. (<a href="https://android-review.googlesource.com/#/q/Iccf028b886639d3b24e7a257a023320362399389">Iccf02</a>, <a href="https://issuetracker.google.com/issues/335339283">b/335339283</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug where positional thresholds passed to <code translate="no" dir="ltr">AnchoredDraggableDefaults.flingBehavior</code> were not considered correctly in some scenarios. (<a href="https://android-review.googlesource.com/#/q/Ifdf0dfcf3d7ff8288affee56e7092bbed473d6ab">Ifdf0d</a>, <a href="https://issuetracker.google.com/issues/367660226">b/367660226</a>)</li> <li>Introduce a fix for nested scrollables that are removed from the node tree during an ongoing fling. Now these nodes will cancel the fling and correctly send the <code translate="no" dir="ltr">onPostFling</code> event with the remaining velocity. We're also introducing the flag <code translate="no" dir="ltr">NewNestedScrollFlingDispatchingEnabled</code> to control the behavior in case of regressions. The flag will be removed before beta. (<a href="https://android-review.googlesource.com/#/q/I05c37b5d0ae42d8ed97c014383fe9df3282d61d6">I05c37</a>, <a href="https://issuetracker.google.com/issues/371168883">b/371168883</a>)</li> <li>Fixed a bug where <code translate="no" dir="ltr">OverscrollEffects</code> passed to <code translate="no" dir="ltr">Modifier.anchoredDraggable</code> would receive 2D deltas instead of 1D. (<a href="https://android-review.googlesource.com/#/q/Ie52c0db5e85eef359cf82b2f88713a31cf6802f4">Ie52c0</a>)</li> </ul> <h3 id="1.8.0-alpha03" data-text="Version 1.8.0-alpha03" tabindex="-1">Version 1.8.0-alpha03</h3> <p>October 2, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.8.0-alpha03</code> is released. Version 1.8.0-alpha03 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/0431b84980e97d6bafdfda7c9038bc4d9529564f..b6ae8d0a0e8cd803f7b84f30101eda1af4f1d6b6/compose/foundation">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Kotlin version update to 1.9 (<a href="https://android-review.googlesource.com/#/q/I1a14ce236e70bdc55f94afd42ead44587018c097">I1a14c</a>)</li> <li>Introduced flag <code translate="no" dir="ltr">DraggableAddDownEventFixEnabled</code> (<a href="https://android-review.googlesource.com/#/q/I848d5633a27bdf6c115df486e1cc9d881d4547b7">I848d5</a>)</li> <li>Introduced a new Semantics Role called Carousel to emulate the list behavior in Pagers for a11y services. (<a href="https://android-review.googlesource.com/#/q/Id354b132da03348aaa68da0dd8459d4528438018">Id354b</a>, <a href="https://issuetracker.google.com/issues/354109776">b/354109776</a>, <a href="https://issuetracker.google.com/issues/239672673">b/239672673</a>)</li> <li>Removed the implicit <code translate="no" dir="ltr">graphicsLayer</code> modifier from <code translate="no" dir="ltr">BasicText</code> composable. Added experimental <code translate="no" dir="ltr">ComposeFoundationFlags.RemoveBasicTextGraphicsLayerEnabled</code> flag to be able to revert to the old behavior. (<a href="https://android-review.googlesource.com/#/q/Ie478db03fec7f5a7ee48b46e03a63c4b718fe69c">Ie478d</a>)</li> <li>Added <code translate="no" dir="ltr">Modifier.recalculateWindowInsets()</code> to allow children in the hierarchy to use <code translate="no" dir="ltr">insetsPadding</code> even when parents aligned them without <code translate="no" dir="ltr">consumeWindowInsets()</code>. (<a href="https://android-review.googlesource.com/#/q/I7f9e42ad23eb6a8706ab9c04dc60460b3e91695d">I7f9e4</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Implement gesture pick-up in <code translate="no" dir="ltr">detectDragGestures</code>, draggables and scrollables. Now if a child draggable gives up on a gesture, the parent has the opportunity to pick it up. This allows for a more continuous and integrated gesture handling. (<a href="https://android-review.googlesource.com/#/q/Ic88fe7a8d34eb49ae279b922ef570a3464924727">Ic88fe</a>)</li> <li>Update fling cancellation behavior in scrollables. Now if a scrollable flings and hits the bounds it will correctly pass on the fling velocity to the next scrollable in the chain instead of continue to drive the fling. (<a href="https://android-review.googlesource.com/#/q/I9326ad40271d77d6b2f8038c6fb9eb313873d8b6">I9326a</a>)</li> </ul> <h3 id="1.8.0-alpha02" data-text="Version 1.8.0-alpha02" tabindex="-1">Version 1.8.0-alpha02</h3> <p>September 18, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.8.0-alpha02</code> is released. Version 1.8.0-alpha02 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/71a0e55934198cacb4c897d9b20e26e2b7275988..0431b84980e97d6bafdfda7c9038bc4d9529564f/compose/foundation">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">TextOverflow.StartEllipsis</code> and <code translate="no" dir="ltr">TextOverflow.MiddleEllipsis</code> are now available which allows to place ellipsis at the start or middle of the line of the single line text (<a href="https://android-review.googlesource.com/#/q/I389132c71774d5c13afce85a8719af697431cef9">I38913</a>, <a href="https://issuetracker.google.com/issues/185418980">b/185418980</a>)</li> </ul> <h3 id="1.8.0-alpha01" data-text="Version 1.8.0-alpha01" tabindex="-1">Version 1.8.0-alpha01</h3> <p>September 4, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.8.0-alpha01</code> is released. Version 1.8.0-alpha01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/6a69101fd0edc8d02aa316df1f43e0552fd2d7c4..80f82d37cb9b40250ee9eb15d9cbe9e93849355e/compose/foundation">these commits</a>.</p> <h2 id="version_17_2" data-text="Version 1.7" tabindex="-1">Version 1.7</h2> <h3 id="1.7.5" data-text="Version 1.7.5" tabindex="-1">Version 1.7.5</h3> <p>October 30, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.5</code> is released. Version 1.7.5 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/6b0ae0e41147a8a917cab35b4a6487af4fce6ead..4cbf03b378a865660d8209d0229c2bb1928c6e33/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Ensure that pinned items are not subcomposed twice in the content padding area. (<a href="https://android-review.googlesource.com/#/q/Ic62242563f2ed9790dd34d7efd15f0e3cb1a4b3b">Ic6224</a>)</li> </ul> <h3 id="1.7.4" data-text="Version 1.7.4" tabindex="-1">Version 1.7.4</h3> <p>October 16, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.4</code> is released. Version 1.7.4 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/00e91ed140ce2c4677f56fc06692b182b8a07fcf..6b0ae0e41147a8a917cab35b4a6487af4fce6ead/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug causing a rare crash in text fields. (<a href="https://android-review.googlesource.com/#/q/I475c69d27d3a15ba36c13b47695086a4ec5841f2">I475c6</a>, <a href="https://issuetracker.google.com/issues/313010266">b/313010266</a>)</li> <li>Removed <code translate="no" dir="ltr">ReusableContentHost</code> at the root of Lazy layout items. This was a potential root cause for “measure called on a deactivated node” crashes. (<a href="https://android-review.googlesource.com/#/q/Id6e6087b1ac571d991de535d85c465936a3e4c1c">Id6e60</a>)</li> </ul> <h3 id="1.7.3" data-text="Version 1.7.3" tabindex="-1">Version 1.7.3</h3> <p>October 2, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.3</code> is released. Version 1.7.3 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/baa5cf7b949ae30f236d40b11ba88f9b0c8cffb9..00e91ed140ce2c4677f56fc06692b182b8a07fcf/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a memory leak with <code translate="no" dir="ltr">BasicText</code> when minLines is set to a non-default value.</li> </ul> <h3 id="1.7.2" data-text="Version 1.7.2" tabindex="-1">Version 1.7.2</h3> <p>September 18, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.2</code> is released. Version 1.7.2 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/1efd0b233a17f707cd918993df1fa12e0bf9ae83..baa5cf7b949ae30f236d40b11ba88f9b0c8cffb9/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix issue with draggable that was missing down events which caused flings to look slower than normal.</li> </ul> <h3 id="1.7.1" data-text="Version 1.7.1" tabindex="-1">Version 1.7.1</h3> <p>September 10, 2024</p> <ul> <li>No changes to Android artifacts. <code translate="no" dir="ltr">-desktop</code> artifacts were removed and <code translate="no" dir="ltr">-jvmStubs</code> and <code translate="no" dir="ltr">-linuxx64Stubs</code> artifacts were added. None of these targets are meant to be used, they are placeholders to help Jetbrains Compose efforts.</li> </ul> <h3 id="1.7.0" data-text="Version 1.7.0" tabindex="-1">Version 1.7.0</h3> <p>September 4, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0</code> is released. Version 1.7.0 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/d8995e2377dd4baad64b39becb6d480cadd05c86..38ffb9c315c3f894412184bda180c1b58b2a8556/compose/foundation">these commits</a>.</p> <p><strong>Important changes since 1.6.0</strong></p> <ul> <li>Performance of <code translate="no" dir="ltr">Modifier.clickable</code>, <code translate="no" dir="ltr">Modifier.focusable</code>, <code translate="no" dir="ltr">Modifier.indication</code>, <code translate="no" dir="ltr">Modifier.scrollable</code> and <code translate="no" dir="ltr">Modifier.draggable</code> has been significantly improved. As a part of this effort, the following API changes were made in addition to internal changes <ul> <li>Added a new Indication API, <code translate="no" dir="ltr">IndicationNodeFactory</code>. This leads to more performant Indication implementations compared to the previous (now deprecated) <code translate="no" dir="ltr">rememberUpdatedInstance</code> API. For migration information, see <a href="http://developer.android.com/">developer.android.com</a>.</li> <li><code translate="no" dir="ltr">clickable</code> / <code translate="no" dir="ltr">combinedClickable</code> / <code translate="no" dir="ltr">selectable</code> / <code translate="no" dir="ltr">toggleable</code> now accepts a nullable <code translate="no" dir="ltr">MutableInteractionSource</code> parameter. If null, and the provided Indication is an <code translate="no" dir="ltr">IndicationNodeFactory</code>, the Indication can be lazily created only when needed, which improves performance. If you are not hoisting and using the <code translate="no" dir="ltr">MutableInteractionSource</code>, it is recommended to pass null instead of passing <code translate="no" dir="ltr">remember { MutableInteractionSource() }</code>.</li> <li><code translate="no" dir="ltr">Indication#rememberUpdatedInstance</code> has been deprecated. It has a high unavoidable performance penalty, and prevents other optimizations. Instead, you should use the new <code translate="no" dir="ltr">IndicationNodeFactory</code> API.</li> </ul></li> <li><code translate="no" dir="ltr">BasicTextField</code> using a <a href="https://developer.android.com/reference/kotlin/androidx/compose/foundation/text/input/TextFieldState"><code translate="no" dir="ltr">TextFieldState</code></a> is now stable and we advise all call-sites to begin migration from <code translate="no" dir="ltr">BasicTextField(value, onValueChange)</code> to <code translate="no" dir="ltr">BasicTextField(TextFieldState)</code>.</li> <li>The <code translate="no" dir="ltr">ClickableText</code> has been deprecated. To add clickable links to your text, use <code translate="no" dir="ltr">BasicText</code> with the new <a href="https://developer.android.com/reference/kotlin/androidx/compose/ui/text/LinkAnnotation"><code translate="no" dir="ltr">LinkAnnotation</code></a> annotation in your <code translate="no" dir="ltr">AnnotatedString</code>. <code translate="no" dir="ltr">LinkAnnotation</code> allows for custom styling based on link state (e.g. focused, hovered).</li> <li>Introducing <code translate="no" dir="ltr">ContextualFlowRow</code> and <code translate="no" dir="ltr">Enhanced FlowRow/Column</code> with <code translate="no" dir="ltr">MaxLines</code> and <code translate="no" dir="ltr">Overflow</code>. We are excited to announce enhancements to the experimental <code translate="no" dir="ltr">FlowRow</code> and <code translate="no" dir="ltr">FlowColumn</code>, now featuring <code translate="no" dir="ltr">maxLines</code> and overflow support, alongside the debut of <code translate="no" dir="ltr">ContextualFlowRow</code> and <code translate="no" dir="ltr">ContextualFlowColumn</code>. This update is designed to provide performance optimal components, where <code translate="no" dir="ltr">ContextualFlow*</code> is perfect for a large number of items making use of a small maxLines config and dynamic +N see more buttons, and <code translate="no" dir="ltr">FlowRow</code> and <code translate="no" dir="ltr">FlowColumn</code> is perfect for a small number of items, less than 100 items. Important: To maintain existing behavior in <code translate="no" dir="ltr">FlowRow</code> or <code translate="no" dir="ltr">FlowColumn</code> where all items are composed regardless of if they fit the cross axis max, set overflow to <code translate="no" dir="ltr">FlowRowOverflow.Visible</code> or <code translate="no" dir="ltr">FlowColumnOverflow.Visible</code> during initialization. Explore <code translate="no" dir="ltr">ContextualFlowRowSample</code> and <code translate="no" dir="ltr">FlowRowSample</code> for examples of these new features in action. (<a href="https://android-review.googlesource.com/#/q/Ib913509969a79ff002eafb0075e6722a7a118531">Ib9135</a>, <a href="https://issuetracker.google.com/issues/293577082">b/293577082</a>)</li> <li>Item appearance and disappearance animation support was added into <code translate="no" dir="ltr">LazyColumn</code> and <code translate="no" dir="ltr">LazyRow</code>. Previously it was possible to add <code translate="no" dir="ltr">Modifier.animateItemPlacement()</code> modifier in order to support placement (reordering) animations. We deprecated this modifier and introduced a new non-experimental modifier called <code translate="no" dir="ltr">Modifier.animateItem()</code> which allows you to support all three animation types: appearance (fade in), disappearance (fade out) and reordering. (<a href="https://android-review.googlesource.com/#/q/I2d7f7a376cea26c0a36a59a4586d2705ab04cab7">I2d7f7</a>, <a href="https://issuetracker.google.com/issues/150812265">b/150812265</a>)</li> <li>Implemented experimental support for long screenshots in Compose scroll containers using the official Android API (<code translate="no" dir="ltr">ScrollCaptureCallback</code>).</li> <li><code translate="no" dir="ltr">NestedScroll</code> sources Drag and Fling are being replaced by <code translate="no" dir="ltr">UserInput</code> and <code translate="no" dir="ltr">SideEffect</code> to accommodate for the extended definition of these sources that now include animations (Side Effect) and Mouse Wheel and Keyboard (<code translate="no" dir="ltr">UserInput</code>).</li> <li><code translate="no" dir="ltr">LazyLayout</code> prefetch requests can be marked as urgent now, meaning that we expect this item to be needed in the next frame and want to ignore frame budget to make sure to do more work in advance (<a href="https://android-review.googlesource.com/#/q/Id513f17517aa1b240e91afb3468837b12ed54da8">Id513f</a>)</li> <li>Support stylus handwriting feature on devices after Android U. (<a href="https://android-review.googlesource.com/#/q/I002e4f3218bb909833fcb92b8d1ff9b2153931d7">I002e4</a>)</li> <li>Various APIs have been promoted to stable <ul> <li>Pagers, snapping, window insets</li> </ul></li> </ul> <h3 id="1.7.0-rc01" data-text="Version 1.7.0-rc01" tabindex="-1">Version 1.7.0-rc01</h3> <p>August 21, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-rc01</code> is released. Version 1.7.0-rc01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/98bc1cf10201a973793b72d2ff1ae728070e47e4..d8995e2377dd4baad64b39becb6d480cadd05c86/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a regression where the crash occurred when any element is focused inside a parent that is focusable (or clickable) and disabled. (<a href="https://issuetracker.google.com/issues/317561689">b/317561689</a>)</li> </ul> <h3 id="1.7.0-beta07" data-text="Version 1.7.0-beta07" tabindex="-1">Version 1.7.0-beta07</h3> <p>August 7, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-beta07</code> is released. Version 1.7.0-beta07 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/16151cbc8a68e976da6f2b0f624c2e9883c55aa3..98bc1cf10201a973793b72d2ff1ae728070e47e4/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Text input related <code translate="no" dir="ltr">SemanticsNodeInteraction</code> functions <code translate="no" dir="ltr">performTextReplacement</code>, <code translate="no" dir="ltr">performTextInput</code>, and <code translate="no" dir="ltr">performTextClearance</code> is now going to throw assertion errors when they are called on read only <code translate="no" dir="ltr">TextFields</code>. (<a href="https://android-review.googlesource.com/#/q/I4ae8f255bd02f3b13af2a106340f49f5595a78a8">I4ae8f</a>)</li> <li>Fixed a visual glitch in hyperlinks. (<a href="https://android-review.googlesource.com/#/q/I233110029159eb93c49cd24562387c3f868d9d89">I23311</a>)</li> <li>Fixed <code translate="no" dir="ltr">contentReceiver</code> modifier not working with some IMEs.</li> <li>Velocity generation: Prevent propagation of NaN values in Compose UI and Foundation.</li> </ul> <h3 id="1.7.0-beta06" data-text="Version 1.7.0-beta06" tabindex="-1">Version 1.7.0-beta06</h3> <p>July 24, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-beta06</code> is released. Version 1.7.0-beta06 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/8346df8de9f86a546fc9c316113bd4a3cc82ede9..16151cbc8a68e976da6f2b0f624c2e9883c55aa3/compose/foundation">these commits</a>.</p> <h3 id="1.7.0-beta05" data-text="Version 1.7.0-beta05" tabindex="-1">Version 1.7.0-beta05</h3> <p>July 10, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-beta05</code> is released. Version 1.7.0-beta05 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/487d2b07dba29c903cfd87a8dc7f99483084ebb6..8346df8de9f86a546fc9c316113bd4a3cc82ede9/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix for treatment of Nan values in <code translate="no" dir="ltr">SnapFlingBehavior</code> and Pager.</li> </ul> <h3 id="1.7.0-beta04" data-text="Version 1.7.0-beta04" tabindex="-1">Version 1.7.0-beta04</h3> <p>June 26, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-beta04</code> is released. Version 1.7.0-beta04 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/c29f7383c14ede0af9cb64be9f3eee63714bc73c..487d2b07dba29c903cfd87a8dc7f99483084ebb6/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Avoid crashes when measuring very large text lines (e.g. 10k characters) (<a href="https://android.googlesource.com/platform/frameworks/support/+/8157ab1cf5d805e9d626b17e710df49bd6e5d680">8157ab</a>)</li> <li>Fixes measurement of very large text causing crash in the new <code translate="no" dir="ltr">BasicTextField</code> (<a href="https://android.googlesource.com/platform/frameworks/support/+/6b75757fbd5bd38f144b3126a4a1af49c0328430">6b7575</a>)</li> <li>Reverts a behavior change in Row/Column measurement that breaks Text usage in certain scenarios (<a href="https://android.googlesource.com/platform/frameworks/support/+/69e8ba04943fb0ba364f1220f8c762163d001c00">69e8ba</a>)</li> </ul> <h3 id="1.7.0-beta03" data-text="Version 1.7.0-beta03" tabindex="-1">Version 1.7.0-beta03</h3> <p>June 12, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-beta03</code> is released. Version 1.7.0-beta03 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/1a123f646cfea1599f9efead6da546b0c26063fa..c29f7383c14ede0af9cb64be9f3eee63714bc73c/compose/foundation">these commits</a>.</p> <h3 id="1.7.0-beta02" data-text="Version 1.7.0-beta02" tabindex="-1">Version 1.7.0-beta02</h3> <p>May 29, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-beta02</code> is released. Version 1.7.0-beta02 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/6a69101fd0edc8d02aa316df1f43e0552fd2d7c4..1a123f646cfea1599f9efead6da546b0c26063fa/compose/foundation">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Adds an experimental API for configuring prefetch behavior of <code translate="no" dir="ltr">LazyGrids</code> similar to the existing experimental API for <code translate="no" dir="ltr">LazyLists</code>. This includes support for prefetching items in nested <code translate="no" dir="ltr">LazyGrids</code>. Similiar to <code translate="no" dir="ltr">LazyListPrefetchStrategy</code>, the implementation default is to prefetch the first 2 nested items of each grid, but this can be configured by the new <code translate="no" dir="ltr">LazyGridPrefetchStrategy(nestedPrefetchItemCount)</code> and <code translate="no" dir="ltr">LazyListPrefetchStrategy#onNestedPrefetch</code> APIs. (<a href="https://android-review.googlesource.com/#/q/I591c4e8959ba225b9e1817765c6e6bc10b7fac1a">I591c4</a>)</li> <li>Renamed <code translate="no" dir="ltr">SemanticsProperties.Editable</code> to <code translate="no" dir="ltr">IsEditable</code> and changes <code translate="no" dir="ltr">SemanticsPropertyReceiver.editable</code> to a val <code translate="no" dir="ltr">isEditable</code>. The property is now a boolean and always specified by text fields. (<a href="https://android-review.googlesource.com/#/q/I8acd87bcdfc80b70de9665ba45708ca529ccdf69">I8acd8</a>)</li> <li>Moved <code translate="no" dir="ltr">basicMarquee</code> default values into <code translate="no" dir="ltr">MarqueeDefaults</code> object. (<a href="https://android-review.googlesource.com/#/q/I12ff617e3c8bddc43c3cc44d8be14926ac20378b">I12ff6</a>)</li> <li>Renamed <code translate="no" dir="ltr">basicMarquee</code> <code translate="no" dir="ltr">delayMillis</code> parameter to <code translate="no" dir="ltr">repeatDelayMillis</code>. (<a href="https://android-review.googlesource.com/#/q/I12ff617e3c8bddc43c3cc44d8be14926ac20378b">I12ff6</a>)</li> <li>Update API for styling the links: moved the <code translate="no" dir="ltr">TextLinkStyles</code> to the <code translate="no" dir="ltr">TextStyle</code> and removed the <code translate="no" dir="ltr">TextDefaults</code> from material (<a href="https://android-review.googlesource.com/#/q/I5477bdb498b6b4f33ab3bc998e2be59d8a4ff7e4">I5477b</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Renamed <code translate="no" dir="ltr">LayoutCoordinates.introducesFrameOfReference</code> to <code translate="no" dir="ltr">LayoutCoordinates.introducesMotionFrameOfReference</code> to better reflect its purpose. Renamed related function to calculate coordinates based on that flag. (<a href="https://android-review.googlesource.com/#/q/I3a3301164ea2c08728b09faed6cf72ae089ead72">I3a330</a>)</li> <li>Removed 'Default' from the <code translate="no" dir="ltr">MarqueeDefaults</code> properties. (<a href="https://android-review.googlesource.com/#/q/I1d8a0a53a7b74aa116a5595013a815a201f16c01">I1d8a0</a>)</li> <li>Removed 'Marquee' from <code translate="no" dir="ltr">MarqueeDefaults</code> properties. (<a href="https://android-review.googlesource.com/#/q/Iad4f44b7803faf57f5a3a1445bfdbe94e4693d80">Iad4f4</a>)</li> <li>Removed <code translate="no" dir="ltr">TextLinkStyles</code> from the <code translate="no" dir="ltr">TextStyle</code> class. Instead, <code translate="no" dir="ltr">TextLinkStyles</code> is part of the <code translate="no" dir="ltr">LinkAnntation</code> constructor and the <code translate="no" dir="ltr">AnnotatedString.fromHtml</code> method (<a href="https://android-review.googlesource.com/#/q/I90b2b73e126d9c1106c223de823dda8babaf6708">I90b2b</a>)</li> <li>Fixed a bug where Pager would snap when flinging towards a bound while already settled at the bound. (<a href="https://android-review.googlesource.com/#/q/I9f3730a6c168c19e077fd4d29325f444f54c1070">I9f373</a>, <a href="https://issuetracker.google.com/issues/339171222">b/339171222</a>)</li> <li>BTF2 now has correct mouse selection gestures. (<a href="https://android-review.googlesource.com/#/q/Ibe8c678df325fd1cd55962ab023d8d3b40ab4aa3">Ibe8c6</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Resubmit 'Make compose/measure time calculation content-type based in prefetch to improve accuracy' (<a href="https://android-review.googlesource.com/#/q/Iea6227ee19a6ef6ed4d6a09f8c28f3d012c5594c">Iea622</a>)</li> <li>Make compose/measure time calculation content-type based in prefetch to improve accuracy (<a href="https://android-review.googlesource.com/#/q/Ibccb1d3bfcc5c5409eea4ab47904f9f10e1f7fc5">Ibccb1</a>)</li> <li>Make <code translate="no" dir="ltr">WindowInsetsPadding</code> modifiers available from common source set (<a href="https://android-review.googlesource.com/#/q/I070b2fbfc6dcae41be4bc9bf313d5847065d4053">I070b2</a>)</li> </ul> <h3 id="1.7.0-beta01" data-text="Version 1.7.0-beta01" tabindex="-1">Version 1.7.0-beta01</h3> <p>May 14, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-beta01</code> is released. Version 1.7.0-beta01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/06bfcd36801b67b9fe9b9bcae0d16a55e7d40fd7..6a69101fd0edc8d02aa316df1f43e0552fd2d7c4/compose/foundation">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">KeyboardOptions.shouldShowKeyboardOnFocus</code> property back as deprecated hidden for binary compatibility. (<a href="https://android-review.googlesource.com/#/q/I15cfef582c07970eb66b28fdc1dd046692ee69aa">I15cfe</a>)</li> <li><code translate="no" dir="ltr">Modifier.anchoredDraggable</code> now reverses drag deltas by default for components with a Horizontal orientation when used in an RTL layout. (<a href="https://android-review.googlesource.com/#/q/I3c6d950cedc30b1790e09e140d3d83d19a5d312b">I3c6d9</a>)</li> <li><code translate="no" dir="ltr">AnnotatedString.hasEqualsAnnotations</code> is now <code translate="no" dir="ltr">hasEqualAnnotations</code>. (<a href="https://android-review.googlesource.com/#/q/I685c066bc518b511146443d67926462b341991b2">I685c0</a>)</li> <li>Updated the API for getting Material themed links in text. Specifically, removed the methods from the <code translate="no" dir="ltr">TextDefaults</code> for constructing themed <code translate="no" dir="ltr">LinkAnnotations</code> and parse HTML with themed links. Instead, added a <code translate="no" dir="ltr">TextLinkStyles</code> class that allows to style the links as a parameter to the Text composable. (<a href="https://android-review.googlesource.com/#/q/I31b93f4460f4a0a50c7a86996a499d359ba455c8">I31b93</a>)</li> <li>Replaced <code translate="no" dir="ltr">onDragStarted</code> and <code translate="no" dir="ltr">onDragStopped</code> with non-suspend callbacks. (<a href="https://android-review.googlesource.com/#/q/I59de8c2b7adb0353420da1e7c8f3c9aa9d46f7e7">I59de8</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug where Pager would crash when the <code translate="no" dir="ltr">contentPadding</code> was bigger than the incoming constraints. Pager now coerces negative values returned from <code translate="no" dir="ltr">PageSize</code> to 0. (<a href="https://android-review.googlesource.com/#/q/Iba5d8eccddaf1a49bb09dc4f93d8a4f38276d60b">Iba5d8</a>, <a href="https://issuetracker.google.com/issues/314008560">b/314008560</a>)</li> </ul> <h3 id="1.7.0-alpha08" data-text="Version 1.7.0-alpha08" tabindex="-1">Version 1.7.0-alpha08</h3> <p>May 1, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-alpha08</code> is released. Version 1.7.0-alpha08 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/67004410fdbff19f90caa4cc43965ab21dca1943..06bfcd36801b67b9fe9b9bcae0d16a55e7d40fd7/compose/foundation">these commits</a>.</p> <p><strong>New Features</strong></p> <ul> <li>Added right-click context menu to <code translate="no" dir="ltr">BasicTextField</code> and <code translate="no" dir="ltr">SelectionContainer</code> with items for cut, copy, paste, and select-all actions. (<a href="https://android-review.googlesource.com/#/q/If8c9399d197d8c3c436ccca436e3ddfed3bc959e">If8c93</a>, <a href="https://android-review.googlesource.com/#/q/Ia2b4973e4535ff4c083a7ab39258bfcf9c6ae81e">Ia2b49</a>, <a href="https://android-review.googlesource.com/#/q/I6f268a534acee4fa8732b1058bc636a9ce6b1108">I6f268</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">LazyLayout</code> prefetch requests can be marked as urgent now, meaning that we expect this item to be needed in the next frame and want to ignore frame budget to make sure to do more work in advance (<a href="https://android-review.googlesource.com/#/q/Id513f17517aa1b240e91afb3468837b12ed54da8">Id513f</a>)</li> <li>Renamed <code translate="no" dir="ltr">isPositionedByParentWithDirectManipulation</code> to <code translate="no" dir="ltr">introducesFrameOfReference</code>. Note that it now has the reverse effect, meaning that by default, most <code translate="no" dir="ltr">LayoutCoordinates</code> introduce a frame of reference, and, only when placed under direct manipulation the property will be false. To query position with only those that introduce a frame of reference, use <code translate="no" dir="ltr">positionInLocalFrameOfReference(...)</code>. Or <code translate="no" dir="ltr">positionInLocalLookaheadFrameOfReference</code> from a <code translate="no" dir="ltr">LookaheadScope</code>. (<a href="https://android-review.googlesource.com/#/q/Ifc5f78c683543035e13ff727edf14a79075b1a84">Ifc5f7</a>)</li> <li>Renamed <code translate="no" dir="ltr">onClicked</code> to <code translate="no" dir="ltr">onClick</code> inside <code translate="no" dir="ltr">LinkInteractionListener</code> (<a href="https://android-review.googlesource.com/#/q/Iaa35cd1c54bdea113071a2eaf1e7d700e0eb5f19">Iaa35c</a>)</li> <li>Change action lambda for <code translate="no" dir="ltr">getScrollViewportLength</code> as per API council feedback. (<a href="https://android-review.googlesource.com/#/q/Ibc74abf76a2d5d88f97b9c5853a3d3b2d58585b9">Ibc74a</a>)</li> <li>Renamed stylus handwriting delegation APIs. (<a href="https://android-review.googlesource.com/#/q/Ica45f13c23a7bc0472bf10c99195e924ba3a32d7">Ica45f</a>, <a href="https://issuetracker.google.com/issues/327271923">b/327271923</a>)</li> <li>Rename <code translate="no" dir="ltr">TextInclusionStrategy.isInside</code> to <code translate="no" dir="ltr">isIncluded</code>. Make <code translate="no" dir="ltr">Paragraph/MultiParagraph#getRangeForRect()</code> return type non nullable. (<a href="https://android-review.googlesource.com/#/q/I51f269566495a3781946c8a72e6b615af2da57b9">I51f26</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Added "Select all" to all text contextual menus in <code translate="no" dir="ltr">SelectionContainer</code>. (<a href="https://android-review.googlesource.com/#/q/Ib750e9580a290c68356c02cc83bab4cc048e4cc8">Ib750e</a>, <a href="https://issuetracker.google.com/issues/240143283">b/240143283</a>)</li> <li>Fixed long screenshot capture for scrolling containers with <code translate="no" dir="ltr">reverseScrolling=true</code>. (<a href="https://android-review.googlesource.com/#/q/I7c59cd9f43ca6968f3eefadbcfc7582c1aec51c7">I7c59c</a>)</li> <li>Fixed an issue where <code translate="no" dir="ltr">AnchoredDraggableState</code>'s <code translate="no" dir="ltr">currentValue</code> would change when approaching the state's bounds. (<a href="https://android-review.googlesource.com/#/q/Iea30b4ea0764f2cd817f4406011ab7b18b5e575a">Iea30b</a>, <a href="https://issuetracker.google.com/issues/333846848">b/333846848</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Renamed <code translate="no" dir="ltr">PrefetchExecutor</code> -> <code translate="no" dir="ltr">PrefetchScheduler</code> to better reflect its responsibilities. (<a href="https://android-review.googlesource.com/#/q/Ib915439b1f029adfcfff0ee716b1ad5759f4a35d">Ib9154</a>)</li> <li>Added support for prefetching items in nested <code translate="no" dir="ltr">LazyLists</code> (e.g. a <code translate="no" dir="ltr">LazyColumn</code> that renders nested <code translate="no" dir="ltr">LazyRows</code>). This change is expected to reduce frame drops during scrolling for these <code translate="no" dir="ltr">LazyLists</code>. The implementation default is to prefetch the first 2 nested items, however this behavior can be controlled by the new <code translate="no" dir="ltr">LazyLayoutPrefetchStrategy(nestedPrefetchItemCount)</code> and <code translate="no" dir="ltr">LazyListPrefetchStrategy#onNestedPrefetch</code> APIs. (<a href="https://android-review.googlesource.com/#/q/I519526a694d8e9a89a1a040cd179d0416fa2d6d9">I51952</a>)</li> </ul> <h3 id="1.7.0-alpha07" data-text="Version 1.7.0-alpha07" tabindex="-1">Version 1.7.0-alpha07</h3> <p>April 17, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-alpha07</code> is released. Version 1.7.0-alpha07 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/02b55f664eba38e42e362e1af3913be1df552d55..67004410fdbff19f90caa4cc43965ab21dca1943/compose/foundation">these commits</a>.</p> <p><strong>New Features</strong></p> <ul> <li>Added a <code translate="no" dir="ltr">TextDefaults</code> object that contains methods to construct a <code translate="no" dir="ltr">LinkAnnotation</code> and parse HTML-tagged string which apply <code translate="no" dir="ltr">MaterialTheme</code> to the links. (<a href="https://android-review.googlesource.com/#/q/I98532f3512d1930416f66dd195746eeeba884497">I98532</a>, <a href="https://issuetracker.google.com/issues/139312671">b/139312671</a>)</li> <li>Item appearance and disappearance animation support was added into<code translate="no" dir="ltr">LazyVerticalGrid</code> and <code translate="no" dir="ltr">LazyHorizontalGrid</code>. Previously it was possible to add <code translate="no" dir="ltr">Modifier.animateItemPlacement()</code> modifier in order to support placement (reordering) animations. We deprecated this modifier and introduced a new non-experimental modifier called <code translate="no" dir="ltr">Modifier.animateItem()</code> which allows you to support all three animation types: appearance (fade in), disappearance (fade out) and reordering. (<a href="https://android-review.googlesource.com/#/q/Ib7d120e5dfec53dae00dc662e982dafeab1a6b0f">Ib7d12</a>, <a href="https://issuetracker.google.com/issues/330510929">b/330510929</a>)</li> <li>Item appearance and disappearance animation support was added into <code translate="no" dir="ltr">LazyVerticalStaggeredGrid</code> and <code translate="no" dir="ltr">LazyHorizontalStaggeredGrid</code>. Previously it was possible to add <code translate="no" dir="ltr">Modifier.animateItemPlacement()</code> modifier in order to support placement (reordering) animations. We deprecated this modifier and introduced a new non-experimental modifier called <code translate="no" dir="ltr">Modifier.animateItem()</code> which allows you to support all three animation types: appearance (fade in), disappearance (fade out) and reordering. (<a href="https://android-review.googlesource.com/#/q/I69bc9cc1999c8b166e3ff6bb749bbb73a768bffe">I69bc9</a>, <a href="https://issuetracker.google.com/issues/330511290">b/330511290</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Adds <code translate="no" dir="ltr">ContextMenuColors</code> and the associated <code translate="no" dir="ltr">LocalContextMenuTheme</code> <code translate="no" dir="ltr">ProvidableCompositionLocal</code>. The colors of the context menu on text fields and selectable text can be modified by providing the composition local. (<a href="https://android-review.googlesource.com/#/q/Ifa154a761c372822bca1182023b70cb82b2a14b9">Ifa154</a>)</li> <li>Text links got pressed state styling option in addition to normal styling, hovered and focused. (<a href="https://android-review.googlesource.com/#/q/I5f864b3fd1b1af6ff39dee03e1aa65ede7e16d32">I5f864</a>, <a href="https://issuetracker.google.com/issues/139312671">b/139312671</a>)</li> <li>Introduce <code translate="no" dir="ltr">ViewConfiguration.HandwritingGestureLineMargin</code> for handwriting gestures. Support handwriting gesture for <code translate="no" dir="ltr">BasicTextField</code>. (<a href="https://android-review.googlesource.com/#/q/Ie6e13b41cc82da1fd3c9ecc7ac34c3ff88dfa235">Ie6e13</a>, <a href="https://issuetracker.google.com/issues/325660505">b/325660505</a>)</li> <li>Removed <code translate="no" dir="ltr">DelegatableNode.scrollIntoView</code> for the 1.7 release since we didn't have time to finish stabilizing the rest of the related API surface. This function will be re-introduced in 1.8 (<a href="https://android-review.googlesource.com/#/q/I6cf6120f4cb0b4fbb4fbaff7bf57793b854da202">I6cf61</a>, <a href="https://issuetracker.google.com/issues/333421581">b/333421581</a>, <a href="https://issuetracker.google.com/issues/332900232">b/332900232</a>)</li> <li>When querying Layout coordinates, you may now use the <code translate="no" dir="ltr">excludeDirectManipulationOffset</code> argument to exclude the offset set by parent Layouts that placed their children using <code translate="no" dir="ltr">Placeable.PlacementScope.withDirectManipulationPlacement</code>. Likewise, a Layout that changes the position of its children frequently may now place them using <code translate="no" dir="ltr">withDirectManipulationPlacement</code> (such as Scroll, implemented by default). This helps <code translate="no" dir="ltr">approachLayout</code> based animations to be more intuitive, having now the opportunity to differentiate what offset to animate, and what to apply directly when deciding to animate their approach. (<a href="https://android-review.googlesource.com/#/q/I60ec77cec9d448ffdfed8b661ba2e433f3adaa55">I60ec7</a>)</li> <li>Introduce <code translate="no" dir="ltr">requestScrollToItem</code> for <code translate="no" dir="ltr">LazyStaggeredGrid</code>. For each measure-pass, the client may now opt-out of maintaining index based on the key by calling <code translate="no" dir="ltr">requestScrollToItem</code>. This does not change existing behavior in any way unless <code translate="no" dir="ltr">requestScrollToItem</code> is called. (<a href="https://android-review.googlesource.com/#/q/I63983a31730ea445dc4a1839f8a0afa9d2f8ee80">I63983</a>)</li> <li>Introduce <code translate="no" dir="ltr">requestScrollToPage</code> in Pager. For each measure-pass, the client may now opt-out of maintaining index based on the key by calling <code translate="no" dir="ltr">requestScrollToPage</code>. This does not change existing behavior in any way unless <code translate="no" dir="ltr">requestScrollToPage</code> is called. (<a href="https://android-review.googlesource.com/#/q/Ic4213b831da197ac47c01ce26260cc147d797787">Ic4213</a>)</li> <li>Introduced <code translate="no" dir="ltr">requestScrollToItem</code> for <code translate="no" dir="ltr">LazyGrids</code>. For each measure-pass, the client may now opt-out of maintaining index based on the key by calling <code translate="no" dir="ltr">requestScrollToItem</code>. This does not change existing behavior in any way unless <code translate="no" dir="ltr">requestScrollToItem</code> is called. (<a href="https://android-review.googlesource.com/#/q/I0a7a06d25850d4ff11b782568bc42e6724b3c862">I0a7a0</a>)</li> <li><code translate="no" dir="ltr">ClickableText</code> is marked as deprecated. To add links to the text, create an <code translate="no" dir="ltr">AnnotatedString</code> with a <code translate="no" dir="ltr">LinkAnnotation</code> corresponding to your link and pass this <code translate="no" dir="ltr">AnnotatedString</code> to the <code translate="no" dir="ltr">Text</code> composable (<a href="https://android-review.googlesource.com/#/q/I34d4bf29a9386820f8582765e62576a5fcfcd3c6">I34d4b</a>, <a href="https://issuetracker.google.com/issues/323346994">b/323346994</a>)</li> <li><code translate="no" dir="ltr">UrlAnnotation</code> is deprecated, use <code translate="no" dir="ltr">LinkAnnotation.Url</code> instead. If you're using Material theming, then use <code translate="no" dir="ltr">TextDefaults</code> object to create the annotation with Material theming applied to it (<a href="https://android-review.googlesource.com/#/q/I8d18033220b74bb84f74380855ef5efb5e3e92bb">I8d180</a>, <a href="https://issuetracker.google.com/issues/323346545">b/323346545</a>)</li> <li><code translate="no" dir="ltr">String.parseAsHtml</code> renamed to <code translate="no" dir="ltr">AnnotatedString.Companion.fromHtml</code> (<a href="https://android-review.googlesource.com/#/q/I43dcd5b6f6ddc634879f5747df4b911953f84632">I43dcd</a>)</li> <li>Added styling arguments (<code translate="no" dir="ltr">linkStyle</code>, <code translate="no" dir="ltr">focusedLinkStyle</code>, <code translate="no" dir="ltr">hoveredLinkStyle</code>) and a link interaction listener to the <code translate="no" dir="ltr">parseAsHtml</code> method. When parsing the HTML-tagged string with <code translate="no" dir="ltr"><a></code> tags, the method will construct a <code translate="no" dir="ltr">LinkAnnotation.Url</code> for each such tag and pass the styling objects and link interaction listener to each annotation. (<a href="https://android-review.googlesource.com/#/q/I7c9777a340e04ccf4dc10258c83d18e69831b3c6">I7c977</a>)</li> <li><code translate="no" dir="ltr">LinkAnnotation</code> now takes the state-based styling arguments and a <code translate="no" dir="ltr">LinkInteractionListener</code>. Add this annotation to the <code translate="no" dir="ltr">AnnotatedString</code> to get a hyperlink. By passing <code translate="no" dir="ltr">focusedState</code> and/or <code translate="no" dir="ltr">hoveredState</code> you can define the visual configuration for links when they are focused and/or hovered. (<a href="https://android-review.googlesource.com/#/q/I81ce4350b8a1e37881000fd82f081b7afb8e0f42">I81ce4</a>, <a href="https://issuetracker.google.com/issues/139312671">b/139312671</a>)</li> <li>The feature flag for long screenshots has been removed. (<a href="https://android-review.googlesource.com/#/q/I28648d10fcd1293913a289ea21e64611248693a6">I28648</a>, <a href="https://issuetracker.google.com/issues/329128246">b/329128246</a>)</li> <li><code translate="no" dir="ltr">LazyColumn</code> will now render sticky headers correctly in long screenshots. (<a href="https://android-review.googlesource.com/#/q/I8d239dddc5301c16a76b348edfab482adcdd157d">I8d239</a>, <a href="https://issuetracker.google.com/issues/329296635">b/329296635</a>)</li> <li>Stabilized majority of the remaining experimental APIs that were introduced with the new <code translate="no" dir="ltr">BasicTextField</code>. (<a href="https://android-review.googlesource.com/#/q/I714e2dec19b189e9b74411fefbd636a8cc8e60d1">I714e2</a>)</li> <li>Added <code translate="no" dir="ltr">textObfuscationCharacter</code> parameter to <code translate="no" dir="ltr">BasicSecureTextField</code> that controls which character to use while obfuscating the contents. (<a href="https://android-review.googlesource.com/#/q/I0588b5b978e74feb4a473b24bab3792281998114">I0588b</a>)</li> <li><code translate="no" dir="ltr">NestedScroll</code> sources Drag and Fling are being replaced by <code translate="no" dir="ltr">UserInput</code> and <code translate="no" dir="ltr">SideEffect</code> to accommodate for the extended definition of these sources that now include animations (Side Effect) and Mouse Wheel and Keyboard (<code translate="no" dir="ltr">UserInput</code>). (<a href="https://android-review.googlesource.com/#/q/I40579c9b053d6bcf477191b212c7a72876a588b7">I40579</a>)</li> <li>Introduce <code translate="no" dir="ltr">LocalBringIntoViewSpec</code>, a platform dependent focus scrolling behavior that is applied at the Scrollable modifier layer. (<a href="https://android-review.googlesource.com/#/q/I27aa527cf8088eb3295f97da7501c76e4c4456f4">I27aa5</a>, <a href="https://issuetracker.google.com/issues/317453911">b/317453911</a>)</li> <li>Removed <code translate="no" dir="ltr">TextFieldCharSequence</code>. <code translate="no" dir="ltr">TextFieldBuffer.originalValues</code> is replaced with <code translate="no" dir="ltr">TextFieldBuffer.originalText</code> and <code translate="no" dir="ltr">TextFieldBuffer.originalSelection</code>. (<a href="https://android-review.googlesource.com/#/q/I2c7d6d00ddd9a6412ed97f4ec893f97b0e2342c9">I2c7d6</a>)</li> <li><code translate="no" dir="ltr">ImeOptions.hintLocales</code> is no longer nullable. If you want to pass an empty Locale list, please use <code translate="no" dir="ltr">LocaleList.Empty</code>. (<a href="https://android-review.googlesource.com/#/q/Ic5bc4e784d61b40ebc69778758515eb240c01e20">Ic5bc4</a>)</li> <li>Renamed <code translate="no" dir="ltr">getOffsetFractionForPage</code> to <code translate="no" dir="ltr">getOffsetDistanceInPages</code>. (<a href="https://android-review.googlesource.com/#/q/Ia05e2e47d2d1372e099766bbe337d64e9c374b58">Ia05e2</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>When <code translate="no" dir="ltr">InputTransformations</code> are joined with <code translate="no" dir="ltr">next</code>, their <code translate="no" dir="ltr">KeyboardOptions</code> are now properly merged by individual options using the new <code translate="no" dir="ltr">KeyboardOptions.merge</code> method. (<a href="https://android-review.googlesource.com/#/q/Ie530405a5d45080f3907d65345f988108515adb4">Ie5304</a>, <a href="https://issuetracker.google.com/issues/295951492">b/295951492</a>)</li> <li><code translate="no" dir="ltr">AnchoredDraggableState</code>'s <code translate="no" dir="ltr">targetValue</code> now does <em>not</em> consider positional thresholds anymore. It now has an implicit threshold of 50%, meaning that the <code translate="no" dir="ltr">targetValue</code> changes at the midpoint between two anchors. (<a href="https://android-review.googlesource.com/#/q/I82c2c160f078ebdee15c74e0b0016ed60446cc94">I82c2c</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Renamed 2 scroll APIs (<a href="https://android-review.googlesource.com/#/q/I56a75db3b76a9b31b58f66872b5b49ae1d907e69">I56a75</a>)</li> </ul> <h3 id="1.7.0-alpha06" data-text="Version 1.7.0-alpha06" tabindex="-1">Version 1.7.0-alpha06</h3> <p>April 3, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-alpha06</code> is released. Version 1.7.0-alpha06 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/a57d7d17753695012b58c9ce7ad55a8d39157e62..02b55f664eba38e42e362e1af3913be1df552d55/compose/foundation">these commits</a>.</p> <p><strong>New Features</strong></p> <ul> <li>Item appearance and disappearance animation support was added into <code translate="no" dir="ltr">LazyColumn</code> and <code translate="no" dir="ltr">LazyRow</code>. Previously it was possible to add <code translate="no" dir="ltr">Modifier.animateItemPlacement()</code> modifier in order to support placement (reordering) animations. We deprecated this modifier and introduced a new non-experimental modifier called <code translate="no" dir="ltr">Modifier.animateItem()</code> which allows you to support all three animation types: appearance (fade in), disappearance (fade out) and reordering. (<a href="https://android-review.googlesource.com/#/q/I2d7f7a376cea26c0a36a59a4586d2705ab04cab7">I2d7f7</a>, <a href="https://issuetracker.google.com/issues/150812265">b/150812265</a>)</li> <li>Clients of <code translate="no" dir="ltr">LazyColumn/LazyRow</code>may now opt-out of maintaining an index based on the key for the upcoming measure-pass by calling a non-suspend <code translate="no" dir="ltr">LazyListState.requestToScroll</code>. (<a href="https://android-review.googlesource.com/#/q/I98036297fdf1bdf73125c6713fe746d71d6d94a8">I98036</a>, <a href="https://issuetracker.google.com/issues/209652366">b/209652366</a>)</li> <li>Added <code translate="no" dir="ltr">parseAsHtml</code> method for styled strings: it allows to convert a string marked with HTML tags into <code translate="no" dir="ltr">AnnotatedString</code>. Note that not all tags are supported, for example you won't be able to display bullet lists yet. (<a href="https://android-review.googlesource.com/#/q/I84d3d1881805e964cea940eb1c68a5bba16f6416">I84d3d</a>)</li> <li>Implemented experimental support for long screenshots in Compose scroll containers using the official Android API (<code translate="no" dir="ltr">ScrollCaptureCallback</code>). This feature is experimental and may not currently handle all cases correctly. For that reason it is currently disabled by default. To opt-in, set the <code translate="no" dir="ltr">ComposeFeatureFlag_LongScreenshotsEnabled</code> flag to true. This flag will be removed before 1.7 beta. (<a href="https://android-review.googlesource.com/#/q/I2b0552d34c530b127d64ac58f48a0fa399b3edde">I2b055</a>, <a href="https://issuetracker.google.com/issues/329296471">b/329296471</a>)</li> <li>Introduce new <code translate="no" dir="ltr">GraphicsLayer</code> API to provide more flexibility in placement and rendering of <code translate="no" dir="ltr">GraphicsLayer</code> instances and support intrinsic rendering features without needing to coordinate with Composable implementations to specify <code translate="no" dir="ltr">GraphicsLayer</code> modifier instances.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>All <code translate="no" dir="ltr">KeyboardOptions</code> parameters now have an unspecified value by default. Added <code translate="no" dir="ltr">KeyboardOptions.merge</code> method.</li> <li>Renamed <code translate="no" dir="ltr">KeyboardOptions.autoCorrect</code> to <code translate="no" dir="ltr">autoCorrectEnabled</code> and made it nullable, where null indicates no value was specified. (<a href="https://android-review.googlesource.com/#/q/Ia8ba0fb1235a7a1c6c42d140119ddcb40b65892d">Ia8ba0</a>, <a href="https://issuetracker.google.com/issues/295951492">b/295951492</a>)</li> <li>Renamed <code translate="no" dir="ltr">outOfBoundsPageCount</code> to <code translate="no" dir="ltr">beyondViewportPageCount</code>. (<a href="https://android-review.googlesource.com/#/q/I129c68df1d82f992e102b4141427c0b425b38799">I129c6</a>)</li> <li><code translate="no" dir="ltr">fun ClipEntry.getMetadata()</code> is changed to <code translate="no" dir="ltr">val ClipEntry.clipMetadata</code>. (<a href="https://android-review.googlesource.com/#/q/I50155cef29574f74be45e850d210d0c405aa69f5">I50155</a>)</li> <li>Removed <code translate="no" dir="ltr">TextFieldState.valueAsFlow()</code>. Prefer using <code translate="no" dir="ltr">snapshotFlow { state.text }</code>, or <code translate="no" dir="ltr">snapshotFlow { TextFieldCharSequence(state.text, state.selection) }</code> (<a href="https://android-review.googlesource.com/#/q/I7d629547848fe91ac6127b83c2836fe4c358c1ef">I7d629</a>)</li> <li>Reorganized <code translate="no" dir="ltr">InputTransformation.transformInput</code> parameters. Removed <code translate="no" dir="ltr">originalValue: TextFieldCharSequence</code>. Instead <code translate="no" dir="ltr">TextFieldBuffer</code> now carries this value with the same name. Also removed the <code translate="no" dir="ltr">valueWithChanges: TextFieldBuffer</code> parameter. <code translate="no" dir="ltr">TextFieldBuffer</code> now is the receiver scope on the function. (<a href="https://android-review.googlesource.com/#/q/I919cc112d32cc821ee5beb7d90888020a060e024">I919cc</a>)</li> <li><code translate="no" dir="ltr">BasicTextField(state)</code> variant and <code translate="no" dir="ltr">BasicSecureTextField</code> now use <code translate="no" dir="ltr">KeyboardActionHandler</code> instead of <code translate="no" dir="ltr">KeyboardActions</code> to process actions taken by the software keyboard. (<a href="https://android-review.googlesource.com/#/q/I58dda71cd89a62a1fa34df44a40f7bc0e7384991">I58dda</a>)</li> <li>Stylus handwriting delegation APIs to support stylus handwriting on "fake" text input fields. (<a href="https://android-review.googlesource.com/#/q/I9c09c7c66896625e812674f262eceeb00938d983">I9c09c</a>, <a href="https://issuetracker.google.com/issues/327271923">b/327271923</a>)</li> <li>Renamed <code translate="no" dir="ltr">KeyboardOptions.shouldShowKeyboardOnFocus</code> to <code translate="no" dir="ltr">showKeyboardOnFocus</code>. (<a href="https://android-review.googlesource.com/#/q/Ib4b7af571c6bdfb06c3b0e160482cbb62c5277fa">Ib4b7a</a>, <a href="https://issuetracker.google.com/issues/295951492">b/295951492</a>)</li> <li>Removed <code translate="no" dir="ltr">hintMediaTypes</code> parameter from <code translate="no" dir="ltr">Modifier.contentReceiver</code>. Developers were already encouraged to check the received <code translate="no" dir="ltr">TransferableContent</code>'s media type since it could be incompatible with the configured <code translate="no" dir="ltr">hintMediaTypes</code>. (<a href="https://android-review.googlesource.com/#/q/I82f995187934e7d62ff2c6312869964ba7ca3b6a">I82f99</a>)</li> <li>Reordered the parameters of <code translate="no" dir="ltr">BasicSecureTextField</code>. Removed <code translate="no" dir="ltr">keyboardType</code> and <code translate="no" dir="ltr">imeAction</code> parameters in favor of full <code translate="no" dir="ltr">KeyboardOptions</code> class while keeping the same defaults appropriate for <code translate="no" dir="ltr">BasicSecureTextField</code>. Also removed the <code translate="no" dir="ltr">scrollState</code> parameter. (<a href="https://android-review.googlesource.com/#/q/Ibbfa90ce45ab4e5ef7e4e38aed293d8f831af674">Ibbfa9</a>)</li> <li><code translate="no" dir="ltr">TextFieldState.text</code>'s type is changed from <code translate="no" dir="ltr">TextFieldCharSequence</code> to just <code translate="no" dir="ltr">CharSequence</code>. Therefore, added <code translate="no" dir="ltr">TextFieldState.selection: TextRange</code> and <code translate="no" dir="ltr">TextFieldState.composition: TextRange?</code> to read the current selection and composition values directly from the state object.</li> <li>Removed <code translate="no" dir="ltr">TextFieldState.forEachTextValue</code>. (<a href="https://android-review.googlesource.com/#/q/Idb2a216a1866957e336c12ad6ee0c1338f0f530d">Idb2a2</a>)</li> <li>Removed <code translate="no" dir="ltr">ClipboardManager.getClipMetadata</code> and <code translate="no" dir="ltr">ClipboardManager.hasClip</code> functions. Please use <code translate="no" dir="ltr">clipEntry.getMetadata()</code> to read the current clip entry's metadata. Also check <code translate="no" dir="ltr">ClipboardManager.getClip</code>'s result if it's null or not to understand whether Clipboard has a current clip. (<a href="https://android-review.googlesource.com/#/q/I504988d835b71009609c01919b387239a1e2bee0">I50498</a>)</li> <li><code translate="no" dir="ltr">ClipboardManager.setClip</code> now accepts null to be able to clear the Clipboard. (<a href="https://android-review.googlesource.com/#/q/I7d2e957005fb2efecc64b7273d8209161016b36a">I7d2e9</a>)</li> <li><code translate="no" dir="ltr">ReceiveContentListener</code> is converted to a function interface. Also <code translate="no" dir="ltr">Modifier.receiveContent</code> overload that takes in a lambda is removed since <code translate="no" dir="ltr">ReceiveContentListener</code> is a function interface now.</li> <li><code translate="no" dir="ltr">Modifier.receiveContent</code> is renamed to <code translate="no" dir="ltr">Modifier.contentReceiver</code>. (<a href="https://android-review.googlesource.com/#/q/I1e6affb8908f738c0a27f57f67479bf7ee091a7e">I1e6af</a>)</li> <li>Renamed <code translate="no" dir="ltr">TransferableContent.consumeEach</code> to <code translate="no" dir="ltr">TransferableContent.consume</code>. (<a href="https://android-review.googlesource.com/#/q/I1e462742e827d84c9dec6e8184a9a2f9acb84540">I1e462</a>)</li> <li><code translate="no" dir="ltr">rememberTextFieldState</code> has graduated to a Stable API. (<a href="https://android-review.googlesource.com/#/q/I3799979f1211c2182f32e45af82be5d13e181f3d">I37999</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug where <code translate="no" dir="ltr">BasicTextField(state)</code> variant did not work with CJK(composition based) keyboards. (<a href="https://android-review.googlesource.com/#/q/I544255c03179f59e86974710d59308cfea48b036">I54425</a>)</li> <li>Fixed a bug where <code translate="no" dir="ltr">Modifier.dragAndDropTarget()</code> could reference stale data in certain scenarios with <code translate="no" dir="ltr">Modifier.Node</code> re-use. (<a href="https://android-review.googlesource.com/#/q/I05bb1a7dea19acf4234f88fe988f51e3c2822f4b">I05bb1</a>)</li> <li>Reverted a recent contract change where <code translate="no" dir="ltr">AnchoredDraggableState#anchoredDrag</code> calls would snap at the end of an <code translate="no" dir="ltr">anchoredDrag</code> operation. (<a href="https://android-review.googlesource.com/#/q/I9571542e53b0bd026e6bcb8ca6abead58ca4a4ae">I95715</a>)</li> </ul> <h3 id="1.7.0-alpha05" data-text="Version 1.7.0-alpha05" tabindex="-1">Version 1.7.0-alpha05</h3> <p>March 20, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-alpha05</code> is released. Version 1.7.0-alpha05 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/638a8d3a474af45f6ad5fdc3d6d1836ea42d1778..a57d7d17753695012b58c9ce7ad55a8d39157e62/compose/foundation">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Removed experimental <code translate="no" dir="ltr">LocalTextLinkStyle</code> composition local for styling hyperlinks. (<a href="https://android-review.googlesource.com/#/q/Iebfa7af5ec45e276de9b57191400e37638e2997f">Iebfa7</a>)</li> <li>Removed experimental override of <code translate="no" dir="ltr">BasicText</code> with <code translate="no" dir="ltr">onLinkClicked</code> argument. A replacement API for hyperlinks support will follow in the future. (<a href="https://android-review.googlesource.com/#/q/I107d5d08153db444fac816ad7c9c65057d931a81">I107d5</a>)</li> <li>Removed Codepoints related methods and properties under <code translate="no" dir="ltr">TextFieldState</code> and <code translate="no" dir="ltr">TextFieldBuffer</code>. Also removed the <code translate="no" dir="ltr">inChars</code> suffixes from the remaining selection and composition related APIs. (<a href="https://android-review.googlesource.com/#/q/Ief7ce54a84a9276d79b1e5bed50801b7d9b9b524">Ief7ce</a>)</li> <li><code translate="no" dir="ltr">AnchoredDraggable</code>'s <code translate="no" dir="ltr">currentValue</code> will now update when passing through an anchor point. Use <code translate="no" dir="ltr">settledValue</code> to receive the previous <code translate="no" dir="ltr">currentValue</code> semantics, only updating when settling at an anchor. The progress is now exposed as a function (requiring a starting and end point) instead of a property. (<a href="https://android-review.googlesource.com/#/q/Ibe6e88f172b099e8f1f841722946471e4641f999">Ibe6e8</a>, <a href="https://issuetracker.google.com/issues/318707189">b/318707189</a>, <a href="https://issuetracker.google.com/issues/298271489">b/298271489</a>, <a href="https://issuetracker.google.com/issues/294991954">b/294991954</a>)</li> <li><code translate="no" dir="ltr">BasicTextField(state)</code>, <code translate="no" dir="ltr">TextFieldState</code>, <code translate="no" dir="ltr">InputTransformation</code>, <code translate="no" dir="ltr">OutputTransformation</code>, <code translate="no" dir="ltr">TextFieldLineLimits</code>, <code translate="no" dir="ltr">TextFieldDecorator</code> are graduated to stable. (<a href="https://android-review.googlesource.com/#/q/I9582b7fab87b79a08f617122ed7bd1d2c5b61b9a">I9582b</a>)</li> <li>Introduced <code translate="no" dir="ltr">InterceptPlatformTextInput</code> for helping write low-level IME-related tests and other low-level IME use cases. <code translate="no" dir="ltr">PlatformTextInputTestOverride</code> has been deprecated. (<a href="https://android-review.googlesource.com/#/q/I862ed2e997d6a98e33a25da2ff536a2779ae173d">I862ed</a>, <a href="https://issuetracker.google.com/issues/322680547">b/322680547</a>)</li> <li>Split <code translate="no" dir="ltr">restrictedConstraints()</code> to two methods: <code translate="no" dir="ltr">fitPrioritizingWidth()</code> and <code translate="no" dir="ltr">fitPrioritizingHeight()</code> (<a href="https://android-review.googlesource.com/#/q/I6d7fd3811fffff13b3343c5365290e73cb151bcb">I6d7fd</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Added 2 new API <code translate="no" dir="ltr">isLastScrollForward</code>/<code translate="no" dir="ltr">isLastScrollBackward</code> to check scroll direction for latest scroll action, return false if no scroll action yet. (<a href="https://android-review.googlesource.com/#/q/I63a0e2181d19fdbb945ff1f71781b44559923537">I63a0e</a>)</li> </ul> <h3 id="1.7.0-alpha04" data-text="Version 1.7.0-alpha04" tabindex="-1">Version 1.7.0-alpha04</h3> <p>March 6, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-alpha04</code> is released. Version 1.7.0-alpha04 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/e1b82c49c59d8e976ce558aba5586f6c61bc9054..638a8d3a474af45f6ad5fdc3d6d1836ea42d1778/compose/foundation">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Support stylus handwriting feature on devices after Android U. (<a href="https://android-review.googlesource.com/#/q/I002e4f3218bb909833fcb92b8d1ff9b2153931d7">I002e4</a>)</li> <li>Added <code translate="no" dir="ltr">hintLocales</code> to <code translate="no" dir="ltr">KeyboardOptions</code> to provide <code translate="no" dir="ltr">TextFields</code> with the ability to hint IMEs with specific locales to preset a preferred language. (<a href="https://android-review.googlesource.com/#/q/Id18c27ef6047856a416e98c899674e2b5295e939">Id18c2</a>)</li> <li>Removed the Experimental <code translate="no" dir="ltr">BasicTextField2</code> and <code translate="no" dir="ltr">BasicSecureTextField</code> overloads that took <code translate="no" dir="ltr">value: String</code> and <code translate="no" dir="ltr">onValueChange: () -> String</code> parameters. (<a href="https://android-review.googlesource.com/#/q/I568b4fc59c404938cf38f45e0f8ba1f2b35e8fc1">I568b4</a>)</li> <li>Add an optional <code translate="no" dir="ltr">applySemantics</code> function to <code translate="no" dir="ltr">InputTransformation</code> to influence the semantics of the <code translate="no" dir="ltr">BasicTextField2</code> that it's applied to. (<a href="https://android-review.googlesource.com/#/q/I74a2f4db178fe2660862749f10367bac57761ae9">I74a2f</a>, <a href="https://issuetracker.google.com/issues/170648072">b/170648072</a>)</li> <li>In this CL we are adding the <code translate="no" dir="ltr">GetScrollViewportLength</code> semantic action so we can pipe up information about the components being scrolled in compose to the a11y system. This CL also applies the usage of said property in Foundation Scrollable Lists. (<a href="https://android-review.googlesource.com/#/q/Ic5fa297df4613636529e12037a0b7d03bcacc534">Ic5fa2</a>)</li> <li><code translate="no" dir="ltr">BasicTextField2</code> is renamed to <code translate="no" dir="ltr">BasicTextField</code>. (<a href="https://android-review.googlesource.com/#/q/Ie5713a5542fa0980aefc5a15b41c9ba8f777b277">Ie5713</a>)</li> <li><code translate="no" dir="ltr">FocusRequester.createRefs</code> is now stable (<a href="https://android-review.googlesource.com/#/q/I4d92c644c57436fcd4883bc73fe0120ffa0a6fb2">I4d92c</a>, <a href="https://issuetracker.google.com/issues/261436820">b/261436820</a>)</li> <li>Introduced <code translate="no" dir="ltr">DelegatableNode.scrollIntoView()</code> to allow modifier nodes to make <code translate="no" dir="ltr">scrollIntoView</code> requests directly. (<a href="https://android-review.googlesource.com/#/q/I2b3b7b59a4906f213ae161c531d5af667b4049c7">I2b3b7</a>, <a href="https://issuetracker.google.com/issues/299939840">b/299939840</a>)</li> <li>Introduced <code translate="no" dir="ltr">DelegatableNode.requireView()</code> to allow modifier nodes to get the current Android <code translate="no" dir="ltr">View</code> without reading a composition local. (<a href="https://android-review.googlesource.com/#/q/I407682883cafa8315d1ede370288afdaf62d97a4">I40768</a>)</li> <li>Introducing contextual layout information within Contextual Flow Row Scope and Contextual Flow Column Scope, featuring line index, position, and constraints on maximum width and height to stay in specified position. Items exceeding maximum width/height may flow to the next line or be omitted based on overflow settings. (<a href="https://android-review.googlesource.com/#/q/Id13f86913c1c7a2c87c2980d451374db187e83ae">Id13f8</a>, <a href="https://issuetracker.google.com/issues/292114798">b/292114798</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug where in certain conditions toggling <code translate="no" dir="ltr">enabled</code> or <code translate="no" dir="ltr">readOnly</code> attributes of <code translate="no" dir="ltr">TextField</code> would cause a crash. (<a href="https://android-review.googlesource.com/#/q/Iae17bf3ac4f0da228413f4f3efbed729e0621a6d">Iae17b</a>)</li> </ul> <h3 id="1.7.0-alpha03" data-text="Version 1.7.0-alpha03" tabindex="-1">Version 1.7.0-alpha03</h3> <p>February 21, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ca2a8cf8da3a3502fccc593974f8085653e38261..e1b82c49c59d8e976ce558aba5586f6c61bc9054/compose/foundation">Version 1.7.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Introduced <code translate="no" dir="ltr">DelegatableNode.requireLayoutCoordinates()</code> as a way to get a <code translate="no" dir="ltr">Modifier.Node</code>'s current <code translate="no" dir="ltr">LayoutCoordinates</code> without needing to override <code translate="no" dir="ltr">onPlaced</code> and store the coordinates in a property yourself. (<a href="https://android-review.googlesource.com/#/q/Ia86579f48f389b7bc8d8a8be25602edfded6160c">Ia8657</a>)</li> <li>Introduced <code translate="no" dir="ltr">DelegatableNode.currentLayoutCoordinates</code> as a way to get a <code translate="no" dir="ltr">Modifier.Node</code>'s current <code translate="no" dir="ltr">LayoutCoordinates</code> without needing to override <code translate="no" dir="ltr">onPlaced</code> and store the coordinates in a property yourself. (<a href="https://android-review.googlesource.com/#/q/Iaebaa704ca29bb366bea5f85958fc4ddaae8be2f">Iaebaa</a>)</li> <li>Performance optimizations in <code translate="no" dir="ltr">DraggableAnchors</code> used by <code translate="no" dir="ltr">AnchoredDraggable</code>. (<a href="https://android-review.googlesource.com/#/q/I89cffe9b91f9559d0295b064e7237d68393023a2">I89cff</a>)</li> <li><code translate="no" dir="ltr">BasicTextField2</code> and related APIs under <code translate="no" dir="ltr">androidx.compose.foundation.text2</code> package are moved to <code translate="no" dir="ltr">androidx.compose.foundation.text</code>. (<a href="https://android-review.googlesource.com/#/q/I9f6355e98b573d8985af9ec5135634da58bcc597">I9f635</a>)</li> <li><code translate="no" dir="ltr">BasicTextField2</code> no longer accepts a <code translate="no" dir="ltr">CodepointTransformation</code> parameter. Use <code translate="no" dir="ltr">BasicSecureTextField</code> or <code translate="no" dir="ltr">OutputTransformation</code>. (<a href="https://android-review.googlesource.com/#/q/Id34ffdd13deb8079fcc678cc519511fe9d1c97a5">Id34ff</a>)</li> <li>Added method to compare only the annotations of two <code translate="no" dir="ltr">AnnotatedStrings</code>. (<a href="https://android-review.googlesource.com/#/q/I3265940a29ab587c50c96bfcbeb35590cad48100">I32659</a>)</li> <li>Introducing <code translate="no" dir="ltr">ContextualFlowRow</code> and Enhanced <code translate="no" dir="ltr">FlowRow</code>/<code translate="no" dir="ltr">Column</code> with <code translate="no" dir="ltr">MaxLines</code> and <code translate="no" dir="ltr">Overflow</code>. We are excited to announce enhancements to the experimental <code translate="no" dir="ltr">FlowRow</code> and <code translate="no" dir="ltr">FlowColumn</code>, now featuring <code translate="no" dir="ltr">maxLines</code> and overflow support, alongside the debut of <code translate="no" dir="ltr">ContextualFlowRow</code> and <code translate="no" dir="ltr">ContextualFlowColumn</code>. This update is designed to provide performance optimal components, where <code translate="no" dir="ltr">ContextualFlow*</code> is perfect for a large number of items making use of a small <code translate="no" dir="ltr">maxLines</code> config and dynamic +N see more buttons, and <code translate="no" dir="ltr">FlowRow</code> and <code translate="no" dir="ltr">FlowColumn</code> is perfect for a small number of items, less than 100 items. Important: To maintain existing behavior in <code translate="no" dir="ltr">FlowRow</code> or <code translate="no" dir="ltr">FlowColumn</code> where all items are composed regardless of if they fit the cross axis max, set <code translate="no" dir="ltr">overflow</code> to <code translate="no" dir="ltr">FlowRowOverflow.Visible</code> or <code translate="no" dir="ltr">FlowColumnOverflow.Visible</code> during initialization. Explore <code translate="no" dir="ltr">ContextualFlowRowSample</code> and <code translate="no" dir="ltr">FlowRowSample</code> for examples of these new features in action. (<a href="https://android-review.googlesource.com/#/q/Ib913509969a79ff002eafb0075e6722a7a118531">Ib9135</a>, <a href="https://issuetracker.google.com/issues/293577082">b/293577082</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Cursor animation no longer requests frames between on and off states. (<a href="https://android-review.googlesource.com/#/q/Ia22537827b1735a0c2f6f5c732bebf79aaa3b773">Ia2253</a>)</li> <li><code translate="no" dir="ltr">KeyboardOptions</code>' deprecated copy constructors will now correctly copy all properties. (<a href="https://android-review.googlesource.com/#/q/If12deae291313795562ab37f59afe4255012960e">If12de</a>)</li> </ul> <h3 id="1.7.0-alpha02" data-text="Version 1.7.0-alpha02" tabindex="-1">Version 1.7.0-alpha02</h3> <p>February 7, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2b3fea6e026942389e9db59a4d68f2bb32c94e8f..ca2a8cf8da3a3502fccc593974f8085653e38261/compose/foundation">Version 1.7.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">HorizontalPager</code>, <code translate="no" dir="ltr">VerticalPager</code> and <code translate="no" dir="ltr">PagerState</code> are promoted to stable. (<a href="https://android-review.googlesource.com/#/q/I67660aa3cc1d44ae3dae5b002bae4459a1b25ae3">I67660</a>, <a href="https://issuetracker.google.com/issues/316966909">b/316966909</a>)</li> <li>Added <code translate="no" dir="ltr">LocalTextLinkStyle</code> composition local that allows to change the style of the links in Text across the app. If you're using your own theme in the app, you should be setting this composition local according to your theming. When using Material theme the color of the link by default will be set to Material's primary color. (<a href="https://android-review.googlesource.com/#/q/I7eb10b55fcec1b268c60744de700058eb11a385a">I7eb10</a>)</li> <li>Introduced <code translate="no" dir="ltr">receiveContent</code> modifier that provides developers with a way to <a href="/develop/ui/views/receive-rich-content">receive rich content</a> in Jetpack Compose.</li> <li><code translate="no" dir="ltr">receiveContent</code> integrates with <code translate="no" dir="ltr">BasicTextField2</code> to accept rich content provided by the software keyboard, or via Clipboard paste action. (<a href="https://android-review.googlesource.com/#/q/I81b72a6f0e851618fdd7346d9b1b7a8cf4e3ec3e">I81b72</a>)</li> <li>In this change we're replacing <code translate="no" dir="ltr">SnapFlingBehavior</code> with <code translate="no" dir="ltr">TargetedFlingBehavior</code> in pager to unlock other use cases and provide greater flexibility. (<a href="https://android-review.googlesource.com/#/q/I762eac32d9f1f1545efa8d8eb79ceb97833a77ed">I762ea</a>)</li> <li>In this change we're making Snapping APIs Stable. We're also cleaning up some of the testing code and adding more samples to Snapping. (<a href="https://android-review.googlesource.com/#/q/Id8da9bf3d268eae6a5a7372170c6122d7adaea1e">Id8da9</a>)</li> <li>Introduce <code translate="no" dir="ltr">TargetedFlingBehavior</code>, a <code translate="no" dir="ltr">FlingBehavior</code> that allows propagating information about the state of the ongoing animation and it's target scroll offset. (<a href="https://android-review.googlesource.com/#/q/I6a2070d346b92d9cfa6e9bb5d2315c4a521dbb79">I6a207</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">BasicTextField2</code> now keeps the cursor in view while typing when it has been scrolled out of view or would move out of view due to input. (<a href="https://android-review.googlesource.com/#/q/Ieb85691dd1a7cf98ab5fc188721d4e4475aec762">Ieb856</a>, <a href="https://issuetracker.google.com/issues/237190748">b/237190748</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Adds an experimental API for configuring prefetch behavior of LazyLists. (<a href="https://android-review.googlesource.com/#/q/I022a469c6d89d8742511cf10715afeced732d27e">I022a4</a>)</li> </ul> <h3 id="1.7.0-alpha01" data-text="Version 1.7.0-alpha01" tabindex="-1">Version 1.7.0-alpha01</h3> <p>January 24, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.7.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2b3fea6e026942389e9db59a4d68f2bb32c94e8f/compose/foundation">Version 1.7.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Added a new <code translate="no" dir="ltr">Indication API</code>, <code translate="no" dir="ltr">IndicationNodeFactory</code>. This leads to more performant <code translate="no" dir="ltr">Indication</code> implementations compared to the previous (now deprecated) <code translate="no" dir="ltr">rememberUpdatedInstance</code> API. For migration information, see <a href="http://developer.android.com">developer.android.com</a>.</li> <li><code translate="no" dir="ltr">clickable / combinedClickable / selectable / toggleable</code> now accepts a nullable <code translate="no" dir="ltr">MutableInteractionSource</code> parameter. If null, and the provided <code translate="no" dir="ltr">Indication</code> is an <code translate="no" dir="ltr">IndicationNodeFactory</code>, the <code translate="no" dir="ltr">Indication</code> can be lazily created only when needed, which improves performance. If you are not hoisting and using the <code translate="no" dir="ltr">MutableInteractionSource</code>, it is recommended to pass null.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Introduce <code translate="no" dir="ltr">DecayAnimation</code> in <code translate="no" dir="ltr">AnchoredDraggable</code>, this change adds a <code translate="no" dir="ltr">decayAnimationSpec</code> parameter to <code translate="no" dir="ltr">AnchoredDraggable</code> allowing to use decay animation when settling to one of the anchors. The change also includes renaming the existing <code translate="no" dir="ltr">animationSpec</code> to <code translate="no" dir="ltr">snapAnimationSpec</code> to help understanding the use case of each spec.</li> <li><code translate="no" dir="ltr">BasicTextField2</code> is available for experimental use. It should be roughly at feature parity with <code translate="no" dir="ltr">BasicTextField</code>, and behavior should be production-ready. However, the API remains experimental for now. Before stabilizing, it will be renamed to <code translate="no" dir="ltr">BasicTextField</code> and moved into the same package.</li> <li>Introduced the first draft of the <code translate="no" dir="ltr">OutputTransformation</code> API for <code translate="no" dir="ltr">BasicTextField2</code>. This API replaces most of the use cases of <code translate="no" dir="ltr">VisualTransformation</code> in the old <code translate="no" dir="ltr">BasicTextField</code>. However it is not complete yet, and some things won't work correctly, but we'd appreciate any feedback on the API usability for your use cases. (<a href="https://r.android.com/2708848">aosp/2708848</a>)</li> <li>Introduced <code translate="no" dir="ltr">LinkAnnotation</code> that allows to add links and clickables into text. Links feature is not complete yet and more API changes are coming.</li> <li>Introduced <code translate="no" dir="ltr">receiveContent</code> modifier that provides developers with a way to <a href="https://developer.android.com/develop/ui/views/receive-rich-content">receive rich content</a> in Jetpack Compose.</li> <li><code translate="no" dir="ltr">receiveContent</code> integrates with <code translate="no" dir="ltr">BasicTextField2</code> to accept rich content provided by the software keyboard, or via paste from Clipboard.</li> <li><code translate="no" dir="ltr">KeyboardOptions.shouldShowKeyboardOnFocus</code> allows you to disable the default behavior of <code translate="no" dir="ltr">BasicTextField</code> of requesting a software keyboard on focus.</li> <li><code translate="no" dir="ltr">TextInputService</code> and <code translate="no" dir="ltr">LocalTextInputService</code> are now deprecated. Use <code translate="no" dir="ltr">PlatformTextInputModifierNode</code> to integrate directly with platform IME APIs instead. (<a href="https://r.android.com/2862698">aosp/2862698</a>)</li> <li><code translate="no" dir="ltr">Indication#rememberUpdatedInstance</code> has been deprecated. It has a high unavoidable performance penalty, and prevents other optimizations. Instead, you should use the new <code translate="no" dir="ltr">IndicationNodeFactory</code> API.</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">BasicTextField</code> will now pre-validate a small selection of offset mappings when <code translate="no" dir="ltr">VisualTransformation</code> is passed. This helps catch common coding errors that lead to unrecoverable exceptions in later measure or draw passes. By throwing during composition, it is more likely developers will see these errors during development helping avoid production crashes. (<a href="https://android.googlesource.com/c/platform/frameworks/support/+/290461">I0fd42</a>)</li> <li><code translate="no" dir="ltr">VisualTransformation</code> will not throw if you return an invalid index for an invalid index (<a href="http://b/316401857">b/316401857 </a>)</li> </ul> <h2 id="version_16_2" data-text="Version 1.6" tabindex="-1">Version 1.6</h2> <h3 id="1.6.8" data-text="Version 1.6.8" tabindex="-1">Version 1.6.8</h3> <p>June 12, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.8</code> is released. Version 1.6.8 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/9a13a0e3b1197d66bfc19b9051576bc705f2c337..9dbbab668fd22cd643de4651197354a828aaa7b9/compose/foundation">these commits</a>.</p> <h3 id="1.6.7" data-text="Version 1.6.7" tabindex="-1">Version 1.6.7</h3> <p>May 1, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.7</code> is released. Version 1.6.7 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/a886cfe86852600d131eb7fa1ec8b7d0a8fc1e6b..9a13a0e3b1197d66bfc19b9051576bc705f2c337/compose/foundation">these commits</a>.</p> <h3 id="1.6.6" data-text="Version 1.6.6" tabindex="-1">Version 1.6.6</h3> <p>April 17, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.6</code> is released. Version 1.6.6 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/917ada96acf0ac343128c3f4af9bd67a4b80b99c..a886cfe86852600d131eb7fa1ec8b7d0a8fc1e6b/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug where in certain conditions toggling <code translate="no" dir="ltr">enabled</code> or <code translate="no" dir="ltr">readOnly</code> attributes of <code translate="no" dir="ltr">TextField</code> would cause a crash. (<a href="https://android-review.googlesource.com/#/q/Iae17bf3ac4f0da228413f4f3efbed729e0621a6d">Iae17b</a>)</li> </ul> <h3 id="1.6.5" data-text="Version 1.6.5" tabindex="-1">Version 1.6.5</h3> <p>April 3, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.5</code> is released. Version 1.6.5 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/1cbb6ee3e46f538bb2dc7ef6ce8e9c4b3cbc4dc3..917ada96acf0ac343128c3f4af9bd67a4b80b99c/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Adds debugging logs to hard-to-reproduce bugs in Row/Column: (<a href="https://issuetracker.google.com/issues/300280216">b/300280216</a> and <a href="https://issuetracker.google.com/issues/297974033">b/297974033</a>)</li> </ul> <h3 id="1.6.4" data-text="Version 1.6.4" tabindex="-1">Version 1.6.4</h3> <p>March 20, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.4</code> is released. Version 1.6.4 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/22b329dfa8888198eb3024650d236b3afe6c0907..1cbb6ee3e46f538bb2dc7ef6ce8e9c4b3cbc4dc3/compose/foundation">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>A long-press-then-drag selection gesture which moves out of the text’s layout bounds in the first frame of the drag no longer crashes. (<a href="https://android-review.googlesource.com/#/q/Icdf907784adf27d418cd140864c1778dd73a9ec5">Icdf90</a>, <a href="https://issuetracker.google.com/issues/325307463">b/325307463</a>)</li> </ul> <h3 id="1.6.3" data-text="Version 1.6.3" tabindex="-1">Version 1.6.3</h3> <p>March 6, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.3</code> is released. Version 1.6.3 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/af119e2e31de85654fb7b2e5a2c7e724231131fd..22b329dfa8888198eb3024650d236b3afe6c0907/compose/foundation">these commits</a>.</p> <h3 id="1.6.2" data-text="Version 1.6.2" tabindex="-1">Version 1.6.2</h3> <p>February 21, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.2</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f639ccf09a84fa5af4a9016fa239539aeed40b94..af119e2e31de85654fb7b2e5a2c7e724231131fd/compose/foundation">Version 1.6.2 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix <code translate="no" dir="ltr">AnimateContentSize</code> not resetting properly. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2933952">I07051</a>)</li> <li>Fix issue where <code translate="no" dir="ltr">intrinsicHeight</code> of text would be over-cached in some circumstances. (<a href="https://android.googlesource.com/platform/frameworks/support/+/3cd398c1ce0d79dab4738f00a6998f05d039801b">3cd398</a>, <a href="https://issuetracker.google.com/issues/217910352">b/217910352</a>)</li> </ul> <h3 id="1.6.1" data-text="Version 1.6.1" tabindex="-1">Version 1.6.1</h3> <p>February 7, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4c61c4d68d2bf0ccc61e316bc2a03754bb6979cf..f639ccf09a84fa5af4a9016fa239539aeed40b94/compose/foundation">Version 1.6.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix staggered grid measure when scrolled over limit. (<a href="https://android.googlesource.com/platform/frameworks/support/+/bffc39c4b6a48e9763d9176a513db9667f5185eb">bffc39</a>)</li> <li>Add check for layout with large dimensions. (<a href="https://android.googlesource.com/platform/frameworks/support/+/e74af5db9d9f23e962b70a70b702c7b8ab60dcc1">e74af5</a>)</li> <li>Fix placement of 0-sized items at the start of the staggered grid. (<a href="https://android.googlesource.com/platform/frameworks/support/+/785f94541e8d67ec374eb0554c8baca2c067fb1b">785f94</a>)</li> <li>Call onRelease callback in the same order as onForgotten. (<a href="https://android.googlesource.com/platform/frameworks/support/+/31ce3be612d118cbe53543f5af8965a665e5f7d9">31ce3b</a>)</li> </ul> <h3 id="1.6.0" data-text="Version 1.6.0" tabindex="-1">Version 1.6.0</h3> <p>January 24, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/296c44d6ba03d2167bdea85d53e8387d7b1644f9..4c61c4d68d2bf0ccc61e316bc2a03754bb6979cf/compose/foundation">Version 1.6.0 contains these commits.</a></p> <p><strong>Important changes since 1.5.0</strong></p> <ul> <li>New Modifier <code translate="no" dir="ltr">Modifier.anchoredDraggable</code> that unlocks the ability to drag and animate between predefined set of anchors. This modifier is intended to be a replacement for <code translate="no" dir="ltr">Modifier.swipeable</code>. Learn how to use it and migrate from <code translate="no" dir="ltr">Modifier.swipeable</code> in the <a href="https://developer.android.com/jetpack/compose/touch-input/pointer-input/migrate-swipeable">migration guide</a>.</li> <li>Drag and drop functionality between apps and components has been added. Refer to <a href="/reference/kotlin/androidx/compose/ui/draganddrop/DragAndDropTarget"><code translate="no" dir="ltr">DragAndDropTarget</code></a>, <a href="/reference/kotlin/androidx/compose/foundation/draganddrop/package-summary#(androidx.compose.ui.Modifier).dragAndDropSource(kotlin.coroutines.SuspendFunction1)"><code translate="no" dir="ltr">Modifier.dragAndDropSource</code></a> and other APIs to get started</li> <li><code translate="no" dir="ltr">Modifier.draggable2D</code> is the new modifier that allows for easy 2d dragging support. See <a href="https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/Draggable2DSamples.kt">Sample</a>.</li> <li><a href="/reference/kotlin/androidx/compose/foundation/package-summary#AndroidExternalSurface(androidx.compose.ui.Modifier,kotlin.Boolean,androidx.compose.ui.unit.IntSize,androidx.compose.foundation.AndroidExternalSurfaceZOrder,kotlin.Boolean,kotlin.Function1)"><code translate="no" dir="ltr">AndroidExternalSurface</code></a> and <a href="/reference/kotlin/androidx/compose/foundation/package-summary#AndroidEmbeddedExternalSurface(androidx.compose.ui.Modifier,kotlin.Boolean,androidx.compose.ui.unit.IntSize,androidx.compose.ui.graphics.Matrix,kotlin.Function1)"><code translate="no" dir="ltr">AndroidEmbeddedExternalSurface</code></a> have been added to make it easier to add surface-driven components in compose</li> <li>Various API changes and improvements in <code translate="no" dir="ltr">Pager</code> and <code translate="no" dir="ltr">snapFlingBehaviour</code></li> <li>Various focus, text and insets APIs have been promoted to stable APIs</li> </ul> <h3 id="1.6.0-rc01" data-text="Version 1.6.0-rc01" tabindex="-1">Version 1.6.0-rc01</h3> <p>January 10, 2024</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/fc038a4bc84de9ab20493d6efa8d26f4a70214ae..296c44d6ba03d2167bdea85d53e8387d7b1644f9/compose/foundation">Version 1.6.0-rc01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>The <code translate="no" dir="ltr">DragAndDropTarget()</code> extension constructor has been removed. Create a new instance using <code translate="no" dir="ltr">object: DragAndDropTarget {}</code>. (<a href="https://android-review.googlesource.com/#/q/I323182a88276948803412494d5d24aefd23db32d">I32318</a>)</li> </ul> <h3 id="1.6.0-beta03" data-text="Version 1.6.0-beta03" tabindex="-1">Version 1.6.0-beta03</h3> <p>December 13, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/15c82aaef0f1fd0307d6c00061859e5b6c4384c6..b76585a287cbcfdae38c3e16e5acbc6e26e808e2/compose/foundation">Version 1.6.0-beta03 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix crash that impacted very large text measured with infinite constraints. (<a href="https://android-review.googlesource.com/#/q/I1a7df0f35e5506b4ca05c4e2091142012a07908f">I1a7df</a>, <a href="https://issuetracker.google.com/issues/312294386">b/312294386</a>)</li> <li><code translate="no" dir="ltr">PlatformImeOptions</code> is now a concrete class instead of an interface. (<a href="https://android-review.googlesource.com/#/q/If40a4c3e832e7852f214e18af469f5ce68e798b7">If40a4</a>)</li> </ul> <h3 id="1.6.0-beta02" data-text="Version 1.6.0-beta02" tabindex="-1">Version 1.6.0-beta02</h3> <p>November 29, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f80a6f0c1cb96288c04124001fa2c9bd29617d6..15c82aaef0f1fd0307d6c00061859e5b6c4384c6/compose/foundation">Version 1.6.0-beta02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix for <code translate="no" dir="ltr">canScroll</code> not being updated after relayout-only scroll. (<a href="https://android.googlesource.com/platform/frameworks/support/+/2d15876146ccf201f7e15cacc78bfca762060624">I60a86</a>)</li> <li>Fix for <code translate="no" dir="ltr">Modifier.animateItemPlacement()</code> and <code translate="no" dir="ltr">LookaheadScope</code> after small scrolls. (<a href="https://android.googlesource.com/platform/frameworks/support/+/14a894f3270c310a12a68f7ae1d0eda2ffe1c81e">I3a2b7</a>)</li> </ul> <h3 id="1.6.0-beta01" data-text="Version 1.6.0-beta01" tabindex="-1">Version 1.6.0-beta01</h3> <p>November 15, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/465c5c5b7a0d79793bddb26a695f67aba8ea2f7e..1f80a6f0c1cb96288c04124001fa2c9bd29617d6/compose">Version 1.6.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>The <code translate="no" dir="ltr">DragAndDropTarget</code> modifier now takes in the receiving <code translate="no" dir="ltr">DragAndDropTarget</code> explicitly and has a lambda to opt into a drag and drop session. There are now two factory functions for a <code translate="no" dir="ltr">DragAndDropModifierNode</code>. One for receiving transfers and one for transferring data (<a href="https://android-review.googlesource.com/#/q/I69481ca031bfa52b3f8ff910b159e3ee8f7ffaf9">I69481</a>)</li> <li>Updated <code translate="no" dir="ltr">maximumFlingVelocity</code> to be represented as Float. Updated documentation to be more clear about the <code translate="no" dir="ltr">maximumFlingVelocity</code> unity. (<a href="https://android-review.googlesource.com/#/q/I8adc73327ca3c0d43a9ea31d871ddae1da5e9496">I8adc7</a>)</li> <li><p><code translate="no" dir="ltr">onDragAndDropStart</code> in the <code translate="no" dir="ltr">DragAndDropModifierNode</code> factory has been renamed to <code translate="no" dir="ltr">acceptDragAndDropTransfer</code>.</p> <p><code translate="no" dir="ltr">acceptsDragAndDropTransfer</code> has been added to the <code translate="no" dir="ltr">dragAndDropTarget</code> <code translate="no" dir="ltr">Modifier</code> to accept from a drag and drop session. This lambda returns a viable <code translate="no" dir="ltr">DragAndDropTarget</code> if interested in a drag and drop session. Other lambdas for processing drag events have been replaced by this.</p> <p>a <code translate="no" dir="ltr">DragAndDropTarget</code> factory function has been added to receive from drag and drop sessions (<a href="https://android-review.googlesource.com/#/q/Iebf3a243ad9e4515dfe43b1947ab98ade6804a99">Iebf3a</a>)</p></li> <li><p>Exposing <code translate="no" dir="ltr">startDragImmediately</code> in <code translate="no" dir="ltr">AnchoredDraggable</code> gives control for detecting dragging gestures when using it. It is useful to set it when the widget is animating to a target anchor. See <a href="https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/AnchoredDraggableSample.kt?q=java%2Fandroidx%2Fcompose%2Ffoundation%2Fsamples%2FAnchoredDraggableSample.kt#:%7E:text=AnchoredDraggableCatchAnimatingWidgetSample">Sample</a>. (<a href="https://android-review.googlesource.com/#/q/Ie6d134277bb4f25bbab7ff1929d59bba00ede235">Ie6d13</a>, <a href="https://issuetracker.google.com/issues/285139987">b/285139987</a>)</p></li> <li><p>Foundation Tooltip APIs are now <code translate="no" dir="ltr">@ExperimentalFoundationApi</code> (<a href="https://android-review.googlesource.com/#/q/I30b0b47c0d7d048369779600071fde5f2452e71d">I30b0b</a>)</p></li> <li><p>Removed <code translate="no" dir="ltr">DragAndDropInfo</code> as a type <code translate="no" dir="ltr">DragAndDropModifierNode.drag</code> now takes parameters for the <code translate="no" dir="ltr">transferData</code>, decoration size and drag decoration <code translate="no" dir="ltr">DrawScope</code> lambda</p> <p><code translate="no" dir="ltr">DragAndDropTarget</code> has methods for particular drag and drop events instead of being a single abstract method</p> <p><code translate="no" dir="ltr">onDragAndDropEvent</code> in the factory function for a <code translate="no" dir="ltr">DragAndDropModifierNode</code> has been renamed to <code translate="no" dir="ltr">onDragAndDropStart</code> to better communicate that the <code translate="no" dir="ltr">DragAndDropTarget</code> provided is valid for a given drag and drop session only</p> <p>The <code translate="no" dir="ltr">DragAndDropEventType</code> has been removed (<a href="https://android-review.googlesource.com/#/q/I645b1531085bceef359daebf7f36aa9119f6017b">I645b1</a>)</p></li> <li><p>Renamed <code translate="no" dir="ltr">PlatformTextInputModifierNode.runTextInputSession</code> to <code translate="no" dir="ltr">establishTextInputSession</code>. (<a href="https://android-review.googlesource.com/#/q/I03cd0d84be09a89ed7a763d1b5921cb4975b72a0">I03cd0</a>)</p></li> <li><p>Replace <code translate="no" dir="ltr">OriginalText</code> by <code translate="no" dir="ltr">TextSubstitution</code>. (<a href="https://android-review.googlesource.com/#/q/Ifa5a8d6a2efd776c384642d9148dbf40b23eb6e3">Ifa5a8</a>)</p></li> <li><p>Renamed <code translate="no" dir="ltr">PlatformTextInputModifierNode.textInputSession</code> to <code translate="no" dir="ltr">runTextInputSession</code>. (<a href="https://android-review.googlesource.com/#/q/Ie9c6b37420dc9c024d68bbfc94fdcbbef105a547">Ie9c6b</a>)</p></li> <li><p>The children of <code translate="no" dir="ltr">SubcomposeLayout</code> (and layouts like <code translate="no" dir="ltr">LazyColumn</code> based on it) which are retained to be reused in future are considered deactivated. New <code translate="no" dir="ltr">assertIsDeactivated()</code> test API was introduced to test such nodes. The rest of the test apis will filter out deactivated nodes by default. (<a href="https://android-review.googlesource.com/#/q/I2ef84fb2ed578238bb20c07655c475df6fb8dbd0">I2ef84</a>, <a href="https://issuetracker.google.com/issues/187188981">b/187188981</a>)</p></li> <li><p><code translate="no" dir="ltr">clippingEnabled</code> parameter of <code translate="no" dir="ltr">Modifier.magnifier</code> is renamed to <code translate="no" dir="ltr">clip</code>.</p></li> <li><p><code translate="no" dir="ltr">magnifierCenter</code> parameter of <code translate="no" dir="ltr">Modifier.magnifier</code> is made nullable preserving the same default behavior. (<a href="https://android-review.googlesource.com/#/q/I6aa66e52283bd467372b6a04132341642549f20d">I6aa66</a>)</p></li> <li><p>Material <code translate="no" dir="ltr">SwipeToReveal</code> APIs (for Cards and Chips) now rely on a slot based API (as recommended by Compose) instead of data class based instances to create those slots. This is a breaking change, please see the demo and sample code for examples on how to use the new API. (<a href="https://android-review.googlesource.com/#/q/Ia89431e240b0602bfe08bceb660ff9ef1137d938">Ia8943</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Implement equals and hashcode for <code translate="no" dir="ltr">PageSize.Fixed</code>. (<a href="https://android-review.googlesource.com/#/q/Ie3edea3aafd75068cd57c04aafdd7055ead20ad7">Ie3ede</a>, <a href="https://issuetracker.google.com/issues/300134276">b/300134276</a>)</li> <li>Fixed a bug that would cause <code translate="no" dir="ltr">BasicText</code> layout to not shrink when <code translate="no" dir="ltr">minWidth</code> changed and <code translate="no" dir="ltr">minWidth</code> less than initial measure constraints <code translate="no" dir="ltr">maxWidth</code> (<a href="https://android-review.googlesource.com/#/q/Idb19ce3a2975761c189962887575eab3066a04b7">Idb19c</a>)</li> <li>Add renderer support for Sweep Gradient in <code translate="no" dir="ltr">ArcLine</code>. (<a href="https://android-review.googlesource.com/#/q/I4d5bb5948d2216dca2a29d2449fd97519b2b65bb">I4d5bb</a>)</li> <li>Fix binary compatibility issue with Window Inset change (<a href="https://android-review.googlesource.com/#/q/Iee695f0f1b2bf24a820b5a1bccfe550d9c29a5fa">Iee695</a>)</li> <li>Remove material core layer for Material3 Chip/Button as the microbenchmarks show better performance without it. (<a href="https://android-review.googlesource.com/#/q/I5555573520638dd3c7f0d202e048ae6fffde19e5">I55555</a>)</li> </ul> <h3 id="1.6.0-alpha08" data-text="Version 1.6.0-alpha08" tabindex="-1">Version 1.6.0-alpha08</h3> <p>October 18, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-alpha08</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f7407d4293384a1b91bc142880e3525048b3443..465c5c5b7a0d79793bddb26a695f67aba8ea2f7e/compose/foundation">Version 1.6.0-alpha08 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><code translate="no" dir="ltr">Modifier.draggable2D</code> is the new modifier that allows for easy 2d dragging support. See <a href="https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/Draggable2DSamples.kt">Sample</a> (<a href="https://android-review.googlesource.com/#/q/Id95f5706cb31e2c0d4bbd17bb127f527a313df6f">Id95f5</a>, <a href="https://issuetracker.google.com/issues/214412658">b/214412658</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">Modifier.dragAndDrawSource</code> has had the <code translate="no" dir="ltr">onDrawDragShadow</code> lambda renamed to <code translate="no" dir="ltr">drawDragDecoration</code> and <code translate="no" dir="ltr">DragAndDropInfo</code> has had the size parameter renamed to <code translate="no" dir="ltr">dragDecorationSize</code>. (<a href="https://android-review.googlesource.com/#/q/Id0e3037697efad03dcf74c2c9393a733e6ab0489">Id0e30</a>, <a href="https://issuetracker.google.com/issues/303904810">b/303904810</a>)</li> <li><code translate="no" dir="ltr">BasicTextField2</code>'s <code translate="no" dir="ltr">decorationBox</code> parameter is renamed to <code translate="no" dir="ltr">decorator</code>. Its type is also changed to an equivalent fun interface <code translate="no" dir="ltr">TextFieldDecorator</code>. (<a href="https://android-review.googlesource.com/#/q/I23c1cbb759aa823d100689bba3375166686573b4">I23c1c</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Improved documentation on <code translate="no" dir="ltr">BasicTextField</code> regarding <code translate="no" dir="ltr">onValueChange</code> requirements. (<a href="https://android-review.googlesource.com/#/q/I90fc9dea845dafbf35fd439fe7813b2a752d9189">I90fc9</a>, <a href="https://issuetracker.google.com/issues/160257648">b/160257648</a>)</li> </ul> <h3 id="1.6.0-alpha07" data-text="Version 1.6.0-alpha07" tabindex="-1">Version 1.6.0-alpha07</h3> <p>October 4, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-alpha07</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f7407d4293384a1b91bc142880e3525048b3443/compose/foundation">Version 1.6.0-alpha07 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Introduced <code translate="no" dir="ltr">PlatformTextInputMethodTestOverride</code> for writing tests for custom text editors. (<a href="https://android-review.googlesource.com/#/q/Id159b5ddf642d02a2427950d6f5fbe71e34fdf60">Id159b</a>)</li> <li>Renamed <code translate="no" dir="ltr">GraphicsSurface</code> to <code translate="no" dir="ltr">AndroidExternalSurface</code> (<a href="https://android-review.googlesource.com/#/q/I1168074a32ebd7b8586ba80cc78c343b7e489097">I11680</a>)</li> <li>Added <code translate="no" dir="ltr">DisableNonLinearFontScalingInCompose</code> temporary flag to disable non-linear font scaling. Set <code translate="no" dir="ltr">DisableNonLinearFontScalingInCompose = true</code> in your tests if you need time to clean them up. This flag will be removed in Compose 1.6.0-beta01. (<a href="https://android-review.googlesource.com/#/q/Ic94869c0be14f0a131ebcee03cd08b9256f308ab">Ic9486</a>)</li> <li>Added <code translate="no" dir="ltr">ColorList</code> and <code translate="no" dir="ltr">ColorSet</code> collections that avoid allocations. (<a href="https://android-review.googlesource.com/#/q/I744bdc5040eb4153b8cb5030e66d910157b8e41c">I744bd</a>)</li> <li>This change removes <code translate="no" dir="ltr">shortSnapVelocityThreshold</code> which has been turned into an implementation detail of the implementations of <code translate="no" dir="ltr">SnapLayoutInfoProvider</code>. (<a href="https://android-review.googlesource.com/#/q/I65f6d577ecfb9ffbad9b2921f1cf1dcc813d24a6">I65f6d</a>)</li> <li>Adds <code translate="no" dir="ltr">dragAndDropSource</code> Modifier for starting drag and drop sessions, and <code translate="no" dir="ltr">dragAndDropTarget</code> Modifier for receiving from drag and drop sessions (<a href="https://android-review.googlesource.com/#/q/Ib782848c37656fd704f0cb2ef42baa16a4dc4f81">Ib7828</a>, <a href="https://issuetracker.google.com/issues/286038936">b/286038936</a>)</li> <li>Update <code translate="no" dir="ltr">SnapPositionInLayout</code> documentation and position method. Introduce content paddings to the position method in <code translate="no" dir="ltr">SnapPositionInLayout</code>. (<a href="https://android-review.googlesource.com/#/q/Id79383a2bc99bc7db54f716fdfd7b0aa6708cfac">Id7938</a>, <a href="https://issuetracker.google.com/issues/300116110">b/300116110</a>)</li> <li>Added <code translate="no" dir="ltr">UndoState</code> to <code translate="no" dir="ltr">TextFieldState</code> that provides the ability to undo/redo the changes made by the user. (<a href="https://android-review.googlesource.com/#/q/Icc024ae43fe9046d7f20ddfe52de3a7810e8d0ce">Icc024</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed <code translate="no" dir="ltr">basicMarquee</code> not animating after velocity change. (<a href="https://android-review.googlesource.com/#/q/Id2e77b47a3fd5cc046e59594cc1d5f01c99f34a0">Id2e77</a>, <a href="https://issuetracker.google.com/issues/297974036">b/297974036</a>)</li> </ul> <h3 id="1.6.0-alpha06" data-text="Version 1.6.0-alpha06" tabindex="-1">Version 1.6.0-alpha06</h3> <p>September 20, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-alpha06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9ce75ea1baa2af10dda8f787f69c40c6654bcac1..91bb8c1f81dcb031bda00fcd8e55f1e890b56f06/compose/foundation">Version 1.6.0-alpha06 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>New Composable wrappers for <code translate="no" dir="ltr">SurfaceView</code> and <code translate="no" dir="ltr">TextureView: GraphicsSurface()</code> and <code translate="no" dir="ltr">EmbeddedGraphicsSurface()</code>. It is an experimental API and is subject to changes and modifications. (<a href="https://android-review.googlesource.com/#/q/I9ddb2355e01aacb20b9e595c7d58c7e972f63630">I9ddb2</a>)</li> <li><code translate="no" dir="ltr">Modifier.magnifier()</code> is now a stable API. This includes the removal of <code translate="no" dir="ltr">MagnifierStyle</code> in favor of inline parameters in the modifier itself. (<a href="https://android-review.googlesource.com/#/q/I83bec09bc5ec419cb007d6f1e1340fba99f122d6">I83bec</a>, <a href="https://issuetracker.google.com/issues/298381260">b/298381260</a>, <a href="https://issuetracker.google.com/issues/262367109">b/262367109</a>, <a href="https://issuetracker.google.com/issues/261438887">b/261438887</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Introduced <code translate="no" dir="ltr">updateCurrentPage</code> and <code translate="no" dir="ltr">updateTargetPage</code> in <code translate="no" dir="ltr">ScrollScope</code>, these are the last pieces necessary to allowing customization of animated scroll through <code translate="no" dir="ltr">PagerState.scroll</code>. (<a href="https://android-review.googlesource.com/#/q/I9cad5789ef0d48da46b0e38fbc04bd9ac740861e">I9cad5</a>, <a href="https://issuetracker.google.com/issues/267744105">b/267744105</a>, <a href="https://issuetracker.google.com/issues/243786897">b/243786897</a>)</li> <li>Remove density from <code translate="no" dir="ltr">SnapFlingBehavior</code>. All implementations of <code translate="no" dir="ltr">SnapLayoutInfoProvider</code> already have a way of accessing the density, the receiver scope could be removed which will lead to a less complex implementation of both <code translate="no" dir="ltr">SnapFlingBehavior</code> and <code translate="no" dir="ltr">SnapLayoutInfoProviders</code>. (<a href="https://android-review.googlesource.com/#/q/I153c358968d8f4bfec027f0568f29c887aa06d53">I153c3</a>)</li> <li>More modifiers marked as stable. (<a href="https://android-review.googlesource.com/#/q/I56af1d5a1f7e93a0e228a57e6631957ff94f82a3">I56af1</a>, <a href="https://issuetracker.google.com/issues/298046462">b/298046462</a>)</li> <li>Removed <code translate="no" dir="ltr">SnapStepSize</code> from <code translate="no" dir="ltr">SnapLayoutInfoProvider</code>. The calculation should be done using the Layout information and provided through the approach or snapping offsets. (<a href="https://android-review.googlesource.com/#/q/If320cd680d318151d7c83f1f1df1878385c56078">If320c</a>)</li> </ul> <p><strong>Behavior Changes</strong></p> <ul> <li>Compose now uses non-linear font scaling for better readability and accessibility. When font scale > 100% in system settings, small text will increase in size normally, but already-large text will only increase a little bit. Also, line heights defined in SP will automatically adjust to stay proportional to the 100% scale intended height. See the <a href="https://goo.gle/font-scaling-best-practices">Font Scaling Best Practices</a> for more info. (<a href="https://android-review.googlesource.com/#/q/I115181d1e91dff483c68aeb781e7cae4609e73d4">I11518</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Remove the use of <code translate="no" dir="ltr">rememberSaveable</code> for tooltips. (<a href="https://android-review.googlesource.com/#/q/Icc131c852cc3b3c722954aecb0a002711e13ca96">Icc131</a>, <a href="https://issuetracker.google.com/issues/299500338">b/299500338</a>)</li> </ul> <h3 id="1.6.0-alpha05" data-text="Version 1.6.0-alpha05" tabindex="-1">Version 1.6.0-alpha05</h3> <p>September 6, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/216f103fa4a5c7247f7bafc8bb3014616c265f0c..9ce75ea1baa2af10dda8f787f69c40c6654bcac1/compose/foundation">Version 1.6.0-alpha05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Add overloads for <code translate="no" dir="ltr">BasicSecureTextField</code> that accept an immutable value and a callback to change that value, just like the current <code translate="no" dir="ltr">BasicTextField</code> API. (<a href="https://android-review.googlesource.com/#/q/Ia4882ce8689f486cd7d7cf5bf5b51e0cf7b1d374">Ia4882</a>)</li> <li>Add <code translate="no" dir="ltr">Modifier.preferKeepClear()</code> to mark as composable as preferring to keep clear of floating windows on API 33 and above. (<a href="https://android-review.googlesource.com/#/q/Ib51d57d785da1e0503f26604819ba7d29940e052">Ib51d5</a>, <a href="https://issuetracker.google.com/issues/297260115">b/297260115</a>)</li> <li>Fling velocities in View components like <code translate="no" dir="ltr">ScrollView</code> and <code translate="no" dir="ltr">RecyclerView</code> are capped at <code translate="no" dir="ltr">ViewConfiguration.ScaledMaximumFlingVelocity</code>. Compose now contains its own version of <code translate="no" dir="ltr">maximumFlingVelocity</code> which now applies to <code translate="no" dir="ltr">Draggable</code>. (<a href="https://android-review.googlesource.com/#/q/Ibf974df663c88da673be5c549fbae31303c6ba14">Ibf974</a>)</li> <li>Removed deprecated <code translate="no" dir="ltr">Pager</code> and <code translate="no" dir="ltr">PagerState</code> overloads. (<a href="https://android-review.googlesource.com/#/q/Iea07e3c441146d90f2a53d6d0706445ce4ad7dea">Iea07e</a>)</li> <li>Added <code translate="no" dir="ltr">BasicTooltipBox</code> to <code translate="no" dir="ltr">compose.foundation</code> and updated <code translate="no" dir="ltr">PlainTooltipBox</code> and <code translate="no" dir="ltr">RichTooltipBox</code> to use <code translate="no" dir="ltr">TooltipBox</code> with new <code translate="no" dir="ltr">PlainTooltip</code> and <code translate="no" dir="ltr">RichTooltip</code> composables. (<a href="https://android-review.googlesource.com/#/q/I79e1df0ac02fdccc3399dcf8d24a515d6461fde9">I79e1d</a>)</li> </ul> <h3 id="1.6.0-alpha04" data-text="Version 1.6.0-alpha04" tabindex="-1">Version 1.6.0-alpha04</h3> <p>August 23, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5d7dd999525725bd038a00ca4e89e0fef624a6da..216f103fa4a5c7247f7bafc8bb3014616c265f0c/compose/foundation">Version 1.6.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Add <code translate="no" dir="ltr">ReusableComposition</code> interface for managing lifecycle and reuse of subcompositions. (<a href="https://android-review.googlesource.com/#/q/I812d1fa36791857a04471882d5edabea1400c15e">I812d1</a>, <a href="https://issuetracker.google.com/issues/252846775">b/252846775</a>)</li> <li><code translate="no" dir="ltr">Modifier.focusGroup</code> has been promoted to stable APIs. (<a href="https://android-review.googlesource.com/#/q/I7ffa30d82e2e382865fcd57f5ee7640959c087e2">I7ffa3</a>)</li> <li>Add overloads for <code translate="no" dir="ltr">BasicTextField2</code> that accept an immutable value and a callback to change that value, just like the current <code translate="no" dir="ltr">BasicTextField</code> API. (<a href="https://android-review.googlesource.com/#/q/I3f2b851e744fe2cd6f9c0c79e9f2ecbf35d2fdca">I3f2b8</a>)</li> <li><code translate="no" dir="ltr">GridItemSpan::currentLineSpan</code> is now a stable API. (<a href="https://android-review.googlesource.com/#/q/Icc29c5af036d72c218cc4c630e166c4088209049">Icc29c</a>)</li> <li>Canvas that accepts <code translate="no" dir="ltr">contentDescription</code> is now a stable API. (<a href="https://android-review.googlesource.com/#/q/Ib3d2916e9521268daf351ad17dce8d6a35d57aa5">Ib3d29</a>)</li> <li>Introduced <code translate="no" dir="ltr">viewportSize</code> in <code translate="no" dir="ltr">ScrollState</code>, a way of knowing the <code translate="no" dir="ltr">viewPort</code> size of the component that uses <code translate="no" dir="ltr">ScrollState</code> after measuring happens. (<a href="https://android-review.googlesource.com/#/q/I8b85a0058db96f4b0eb5a6afa32e5293adaaeda5">I8b85a</a>, <a href="https://issuetracker.google.com/issues/283102682">b/283102682</a>)</li> <li>Fixed an issue where the prefetching in Pager did not match the behavior in Views. (<a href="https://android-review.googlesource.com/#/q/I93352e6de29fa8bc23b3af7516872d3e2da7ce0e">I93352</a>, <a href="https://issuetracker.google.com/issues/289088847">b/289088847</a>)</li> <li><code translate="no" dir="ltr">Modifier.consumeWindowInsets(PaddingValues)</code> is now stable. <ul> <li><code translate="no" dir="ltr">Deprecated Modifier.consumedWindowInsets</code> API is now removed. Use <code translate="no" dir="ltr">Modifier.consumeWindowInsets</code> instead. (<a href="https://android-review.googlesource.com/#/q/Id72bbe3b02da9e9c34295a963b9efd1ceed96e41">Id72bb</a>)</li> </ul></li> </ul> <h3 id="1.6.0-alpha03" data-text="Version 1.6.0-alpha03" tabindex="-1">Version 1.6.0-alpha03</h3> <p>August 9, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4aed940027a19667e67d155563fc5fa8b7279313..5d7dd999525725bd038a00ca4e89e0fef624a6da/compose/foundation">Version 1.6.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Overload of <code translate="no" dir="ltr">LazyLayout</code> added, it accepts a lambda of <code translate="no" dir="ltr">LazyLayoutItemProvider</code>, not a plain object as it was before. The previous overload is deprecated. (<a href="https://android-review.googlesource.com/#/q/I42a5a3d5933deaccac5b5fc6df15c47194cf8b05">I42a5a</a>)</li> <li>Added support for configuring <code translate="no" dir="ltr">privateImeOptions</code> (<a href="https://android-review.googlesource.com/#/q/Idb772f8091a3a415659ccb0fb58846917c8e229c">Idb772</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed text fields showing keyboard and being editable when <code translate="no" dir="ltr">readOnly</code> is true. Also fixed the keyboard not showing when <code translate="no" dir="ltr">readOnly</code> is changed from true to false while focused. (<a href="https://android-review.googlesource.com/#/q/I34a19a80d8f44b10f23db0ca0dd7b43b69311c7c">I34a19</a>, <a href="https://issuetracker.google.com/issues/246909589">b/246909589</a>)</li> </ul> <h3 id="1.6.0-alpha02" data-text="Version 1.6.0-alpha02" tabindex="-1">Version 1.6.0-alpha02</h3> <p>July 26, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/3b5b931546a48163444a9eddc533489fcddd7494..4aed940027a19667e67d155563fc5fa8b7279313/compose/foundation">Version 1.6.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Introduced <code translate="no" dir="ltr">PagerLayoutInfo</code> with information collected after a measure pass in <code translate="no" dir="ltr">Pager</code>. Also introduced <code translate="no" dir="ltr">PageInfo</code>, the information about a single measured Page in <code translate="no" dir="ltr">Pager</code>. (<a href="https://android-review.googlesource.com/#/q/Iad003bd71d5d26a6b0507f0c6c06751b3969d95c">Iad003</a>, <a href="https://issuetracker.google.com/issues/283098900">b/283098900</a>)</li> <li>Additional annotations to specify allowed inputs to composables (<a href="https://android-review.googlesource.com/#/q/I51109ce34ab8bb50a8104572d79d2a94b67f3b17">I51109</a>)</li> <li>Added <code translate="no" dir="ltr">SemanticsNodeInteraction.requestFocus</code> as a more convenient and discoverable way to request focus in tests. (<a href="https://android-review.googlesource.com/#/q/Ie87224a465a60cd462ee0eaf7c2d3797f1d63347">Ie8722</a>)</li> <li>Completely redesigned <code translate="no" dir="ltr">PlatformTextInput*</code> API. (<a href="https://android-review.googlesource.com/#/q/I6c93a1111561b5cb55c6a34e2fc3738be3c8941d">I6c93a</a>, <a href="https://issuetracker.google.com/issues/274661182">b/274661182</a>, <a href="https://issuetracker.google.com/issues/267235947">b/267235947</a>, <a href="https://issuetracker.google.com/issues/277380808">b/277380808</a>)</li> <li><code translate="no" dir="ltr">SoftwareKeyboardController</code> and <code translate="no" dir="ltr">LocalSoftwareKeyboardController</code> are no longer experimental. <code translate="no" dir="ltr">LocalSoftwareKeyboardController</code> is also now a proper <code translate="no" dir="ltr">CompositionLocal</code>. (<a href="https://android-review.googlesource.com/#/q/I4c3647f331eacc78f15bd5aa6b19a31ff748b23d">I4c364</a>)</li> <li><code translate="no" dir="ltr">Modifier.transformable</code> now provides pan delta in <code translate="no" dir="ltr">canPan</code> parameter to help determine the direction of the pan to allow or disallow it. (<a href="https://android-review.googlesource.com/#/q/I692aa5bf43084658ca6a20175869d9d593986f2b">I692aa</a>, <a href="https://issuetracker.google.com/issues/266829800">b/266829800</a>)</li> <li>Updates the modifier <code translate="no" dir="ltr">consumeWindowInsets</code> to extend the superclass <code translate="no" dir="ltr">AbstractComposeView</code> (<a href="https://android-review.googlesource.com/#/q/Iacd74d1928c018276c3d923d55c959c644273b22">Iacd74</a>, <a href="https://issuetracker.google.com/issues/269479941">b/269479941</a>)</li> </ul> <h3 id="1.6.0-alpha01" data-text="Version 1.6.0-alpha01" tabindex="-1">Version 1.6.0-alpha01</h3> <p>June 21, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.6.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9eb2d144f9209cb9c4205ad1f981eb7ddf29b96e..3b5b931546a48163444a9eddc533489fcddd7494/compose/foundation">Version 1.6.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Introduced a new <code translate="no" dir="ltr">AnchoredDraggable</code> API in Foundation. It can be used to build components that can be dragged between discrete states, like modal bottom sheets. This API replaces Material's <code translate="no" dir="ltr">Swipeable</code> API. (<a href="https://android-review.googlesource.com/#/q/I4a2ed763cbe73ee71f49311cf27f38105cdbd6e6">I4a2ed</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Support <code translate="no" dir="ltr">InputConnection#requestCursorUpdates</code> (<a href="https://android-review.googlesource.com/#/q/I0c69bf50846ad6a639fe3f3f5f77f89747035b26">I0c69b</a>)</li> <li>Introduced <code translate="no" dir="ltr">scrollAnimationSpec</code> to allow custom animation specs. Updated <code translate="no" dir="ltr">BringIntoViewCalculator</code> to <code translate="no" dir="ltr">BringIntoViewScroller</code>. (<a href="https://android-review.googlesource.com/#/q/Idb741a8f55df781cc93448159dace9f339aec7b4">Idb741</a>)</li> <li>Add <code translate="no" dir="ltr">ResourceResolutionException</code> type to wrap throwables thrown when attempting to load bitmap assets with a description of the asset path that failed to load. (<a href="https://android-review.googlesource.com/#/q/I19f445605ae8b171532b73b7ae4697cec0453767">I19f44</a>, <a href="https://issuetracker.google.com/issues/230166331">b/230166331</a>, <a href="https://issuetracker.google.com/issues/278424788">b/278424788</a>)</li> <li>Added semantics properties and actions to support text translation. (<a href="https://android-review.googlesource.com/#/q/I4a6bc0e167389b8604135d05fbcae7b3cebab0d1">I4a6bc</a>)</li> <li>Introduced a <code translate="no" dir="ltr">BringIntoViewCalculator</code> API that can be used to customize how components like <code translate="no" dir="ltr">Scrollable</code> respond to <code translate="no" dir="ltr">bringIntoView</code> requests. Changed the overload of scrollable to optionally accept an instance of <code translate="no" dir="ltr">BringIntoViewCalculator</code>. (<a href="https://android-review.googlesource.com/#/q/Iaf5af8c24b8545a3e5cb2af379111faea16015c8">Iaf5af</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Added a lint check to warn if you are creating a <code translate="no" dir="ltr">MutableInteractionSource</code> in composition without remembering it, similar to the lint checks for creating mutable state / <code translate="no" dir="ltr">Animatable</code>. (<a href="https://android-review.googlesource.com/#/q/I5daae036829f03ab257564e80edda0849aa21e63">I5daae</a>)</li> <li>Added support for selection by mouse. Touch based selection will expand by word, and shrink by character. (<a href="https://android-review.googlesource.com/#/q/Ic0c6c247aefb9cf567525369468fe19fe77dc986">Ic0c6c</a>, <a href="https://issuetracker.google.com/issues/180639271">b/180639271</a>)</li> <li>Added <code translate="no" dir="ltr">FocusTargetModifierNode</code> interface that can be used to create a custom <code translate="no" dir="ltr">FocusTarget</code>. (<a href="https://android-review.googlesource.com/#/q/I9790ef90091a66436fd7f03d0be787741b42935c">I9790e</a>)</li> </ul> <h2 id="version_15_2" data-text="Version 1.5" tabindex="-1">Version 1.5</h2> <h3 id="1.5.4" data-text="Version 1.5.4" tabindex="-1">Version 1.5.4</h3> <p>October 18, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.4</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4ed495b997a532cc4cbe39abdbaa98b8fc6f3764..b6d5e6e62e40f6938bdbcfef1d6c8a79e25006f8/compose/foundation">Version 1.5.4 contains these commits.</a></p> <h3 id="1.5.3" data-text="Version 1.5.3" tabindex="-1">Version 1.5.3</h3> <p>October 4, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.3</code> is released. This version has no changes.</p> <h3 id="1.5.2" data-text="Version 1.5.2" tabindex="-1">Version 1.5.2</h3> <p>September 27, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.2</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/0a2cac855f7723e1e485c20ac68d34dc8bb68d1e..2bc777611812ef8ef7329a332fbaf8348af05ec7/compose/foundation">Version 1.5.2 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug in text that led to crashes in certain circumstances when semantics were invalidated.</li> </ul> <h3 id="1.5.1" data-text="Version 1.5.1" tabindex="-1">Version 1.5.1</h3> <p>September 6, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/65e3f15108d25a7e1c5c841c0855b21eca194070..824a15c9a34e9d13a5f58f4066029f0a784186b6/compose/foundation">Version 1.5.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed text fields showing keyboard and being editable when <code translate="no" dir="ltr">readOnly</code> is true. Also fixed the keyboard not showing when <code translate="no" dir="ltr">readOnly</code> is changed from true to false while focused. (<a href="https://android-review.googlesource.com/#/q/I34a19a80d8f44b10f23db0ca0dd7b43b69311c7c">I34a19</a>, <a href="https://issuetracker.google.com/issues/246909589">b/246909589</a>)</li> </ul> <h3 id="1.5.0" data-text="Version 1.5.0" tabindex="-1">Version 1.5.0</h3> <p>August 9, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/e423b92ad8e8707ff4031626131f05e33979eac8..65e3f15108d25a7e1c5c841c0855b21eca194070/compose/foundation">Version 1.5.0 contains these commits.</a></p> <p><strong>Important changes since 1.4.0</strong></p> <ul> <li>Many foundational modifiers, including <code translate="no" dir="ltr">Modifier.clickable</code>,<code translate="no" dir="ltr">Modifier.draggable</code>, <code translate="no" dir="ltr">Modifier.scrollable</code>, layout modifier and more have been migrated to <code translate="no" dir="ltr">Modifier.Node</code> API, reducing the overhead on the initial composition.</li> <li>Improvements in Pagers stability. Many bugs have been addressed.</li> <li><code translate="no" dir="ltr">pageCount</code> parameters now lives in <code translate="no" dir="ltr">PagerState</code> instead of the Pager itself</li> </ul> <h3 id="1.5.0-rc01" data-text="Version 1.5.0-rc01" tabindex="-1">Version 1.5.0-rc01</h3> <p>July 26, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/81e6706c269471032b283755131d2aa4e8821a89..e423b92ad8e8707ff4031626131f05e33979eac8/compose">Version 1.5.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li><p>An optional inspection to recommend migrating <code translate="no" dir="ltr">mutableStateOf()</code> calls to their corresponding specialized types for primitives is available. Its lint ID is <code translate="no" dir="ltr">AutoboxingStateCreation</code>. Previously, this inspection was enabled by default for all projects. To see this warning in Android Studio's editor and your project's lint outputs, change its severity from informational to warning (or higher) by declaring <code translate="no" dir="ltr">warning "AutoboxingStateCreation"</code> inside your module's <code translate="no" dir="ltr">build.gradle</code> or <code translate="no" dir="ltr">build.gradle.kts</code> configuration as shown (<a href="https://android-review.googlesource.com/#/q/I34f7ea540f782ae95630f7f94cab93d842dfdd0f">I34f7e</a>):</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Groovy"><code translate="no" dir="ltr"><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">android</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">lint</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">warning</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s2">"AutoboxingStateCreation"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">...</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">}</span> </code></pre></devsite-code></li> </ul> <h3 id="1.5.0-beta03" data-text="Version 1.5.0-beta03" tabindex="-1">Version 1.5.0-beta03</h3> <p>June 28, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9eb2d144f9209cb9c4205ad1f981eb7ddf29b96e..24dc7b0781cb908b2385ec207ca1b3a72cb90093/compose/foundation">Version 1.5.0-beta03 contains these commits.</a></p> <h3 id="1.5.0-beta02" data-text="Version 1.5.0-beta02" tabindex="-1">Version 1.5.0-beta02</h3> <p>June 7, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d26ca4055c940126ae1663ad0d54aafd23205ea4..9eb2d144f9209cb9c4205ad1f981eb7ddf29b96e/compose/foundation">Version 1.5.0-beta02 contains these commits.</a></p> <h3 id="1.5.0-beta01" data-text="Version 1.5.0-beta01" tabindex="-1">Version 1.5.0-beta01</h3> <p>May 24, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation-*:1.5.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6f3ac2bd197d5e61ab2708125b57d6ae4003ad68..d26ca4055c940126ae1663ad0d54aafd23205ea4/compose/foundation">Version 1.5.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Implement <code translate="no" dir="ltr">PlatformDataProvider</code> to provide heart rate and daily steps. <code translate="no" dir="ltr">SensorGateway</code> interface is removed from the public API. (<a href="https://android-review.googlesource.com/#/q/I55b84b6b9bffc5f0a6b812307f1bd4ad61750d65">I55b84</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Reduce allocations during lazy list/grids/etc. measurements (<a href="https://android-review.googlesource.com/#/q/Iaf9e27f481ce2cf0f03395fca03fb3d0b2eee7f1">Iaf9e2</a>)</li> <li>Reduced allocations when applying snapshots (<a href="https://android-review.googlesource.com/#/q/I65c09492518269d6605a4731effd164d93be023a">I65c09</a>)</li> <li>Removed allocations from spring animations (<a href="https://android-review.googlesource.com/#/q/Ie94317f7206752e917cd5e74eb19e6abede8e656">Ie9431</a>)</li> <li>Removed allocation from <code translate="no" dir="ltr">TextLayout</code> (<a href="https://android-review.googlesource.com/#/q/I0fd1110a5b5b5e4c3f101209efe93dc54140a201">I0fd11</a>)</li> <li>Removed multiple allocations in pointer velocity tracking (<a href="https://android-review.googlesource.com/#/q/I26baee3d57a0ea73292c03d73479078b47f39a75">I26bae</a>)</li> </ul> <h3 id="1.5.0-alpha04" data-text="Version 1.5.0-alpha04" tabindex="-1">Version 1.5.0-alpha04</h3> <p>May 10, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.5.0-alpha04</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.5.0-alpha04</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/01bd392d5702480f8bfe61a8f8bbbea64cf362a0..6f3ac2bd197d5e61ab2708125b57d6ae4003ad68/compose/foundation">Version 1.5.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added optimized <code translate="no" dir="ltr">TextStyle.merge(...)</code> with full parameter list. (<a href="https://android-review.googlesource.com/#/q/Iad23419809af1c7405ba9a9d42569521e7647034">Iad234</a>, <a href="https://issuetracker.google.com/issues/246961787">b/246961787</a>)</li> <li>Introduce a <code translate="no" dir="ltr">SnapLayoutInfoProvider</code> that can be used with <code translate="no" dir="ltr">LazyGridState</code>. (<a href="https://android-review.googlesource.com/#/q/I92134d4e64e639774e0239814a2705d44467bbcf">I92134</a>, <a href="https://issuetracker.google.com/issues/269237141">b/269237141</a>, <a href="https://issuetracker.google.com/issues/260914964">b/260914964</a>)</li> <li>Experimental <code translate="no" dir="ltr">Modifier.animateItemPlacement()</code> was added for the lazy staggered grids item scope. You can apply it on the items in order to achieve the automation position change/reordering animations. (<a href="https://android-review.googlesource.com/#/q/I4b62dc65bf21e9376678c2e86f368bd3b8ee7ae0">I4b62d</a>, <a href="https://issuetracker.google.com/issues/257034719">b/257034719</a>)</li> <li>Promote <code translate="no" dir="ltr">GridCells.FixedSize</code> to stable. <code translate="no" dir="ltr">FixedSize</code> defines a <code translate="no" dir="ltr">LazyGrid</code> where each cell takes exact size on cross axis, with the remaining space distributed by cross axis arrangement. (<a href="https://android-review.googlesource.com/#/q/I8542f31f185efcdb71169f2eba0f389c2222f2fc">I8542f</a>)</li> <li>Introduced receiver scope <code translate="no" dir="ltr">PagerScope</code> for Pager and an utility function for calculation a given page offset. (<a href="https://android-review.googlesource.com/#/q/If25778c9ed12b11732fe98a3ca751542ebd69cc5">If2577</a>)</li> <li>Introduce the <code translate="no" dir="ltr">snapPositionalThreshold</code> when creating a snap fling behavior. Use this parameter to specify a positional threshold to short snapping in Pager. (<a href="https://android-review.googlesource.com/#/q/If8f7f5c5c95cca74c7e810969c6bf14cb064683b">If8f7f</a>)</li> <li>Replaced <code translate="no" dir="ltr">SnapLayoutInfoProvider.calculateSnappingOffsetBounds</code> with <code translate="no" dir="ltr">calculateSnappingOffset</code>. In this new method we simply request the next offset to snap to. The calculation of the bounds should be performed at the implementation level as this may differ depending on how one needs snapping to happen. (<a href="https://android-review.googlesource.com/#/q/I923a4f8fbfa08db31446a52fd9bb869e33daf9fd">I923a4</a>)</li> <li><code translate="no" dir="ltr">LazyStaggeredGrid</code> APIs have been promoted to stable. (<a href="https://android-review.googlesource.com/#/q/I633a5534c0eaeee8e6cff80ed872a60bf42fdb20">I633a5</a>)</li> <li>Remove <code translate="no" dir="ltr">pageCount</code> from <code translate="no" dir="ltr">Horizontal/VerticalPager</code>. This should be provided at the state creation. Updated <code translate="no" dir="ltr">PagerState</code> and <code translate="no" dir="ltr">rememberPagerState</code> to accept the <code translate="no" dir="ltr">pageCount</code>. (<a href="https://android-review.googlesource.com/#/q/Ieb52d10f08c4a45beaa4ce0a72734a44afb60ce7">Ieb52d</a>, <a href="https://issuetracker.google.com/issues/266965072">b/266965072</a>)</li> <li>Remove <code translate="no" dir="ltr">pageCount</code> from <code translate="no" dir="ltr">Horizontal/VerticalPager</code>. This should be provided at the state creation. Updated <code translate="no" dir="ltr">PagerState</code> and <code translate="no" dir="ltr">rememberPagerState</code> to accept the <code translate="no" dir="ltr">pageCount</code>. (<a href="https://android-review.googlesource.com/#/q/Ifa3cb3f0444ed1493efbeb3e6268f50684dec44a">Ifa3cb</a>, <a href="https://issuetracker.google.com/issues/266965072">b/266965072</a>)</li> <li>Introduce <code translate="no" dir="ltr">shortSnapVelocityThreshold</code> in Pager's <code translate="no" dir="ltr">SnapFlingBehavior</code>. (<a href="https://android-review.googlesource.com/#/q/I7379e457b8b7321aba6605a81cccd2245122a80e">I7379e</a>, <a href="https://issuetracker.google.com/issues/275579012">b/275579012</a>)</li> <li>Adds a <code translate="no" dir="ltr">FlowRowScope</code> and <code translate="no" dir="ltr">FlowColumnScope</code>. (<a href="https://android-review.googlesource.com/#/q/I54fe2b0945ebcd8a2bf99cf58ce4a06c12e0553d">I54fe2</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Calls to get semantics on Text when constraints have <code translate="no" dir="ltr">minWidth</code> and <code translate="no" dir="ltr">minHeight</code> no longer crash. (<a href="https://android-review.googlesource.com/#/q/Ibd0723171145265198eee10bf4666fdaa6efd06d">Ibd072</a>)</li> <li>Fixed regression where keyboard wasn't showing for text fields inside dialogs not created by the <code translate="no" dir="ltr">Dialog</code> composable. (<a href="https://android-review.googlesource.com/#/q/I825512cde7e41dadfc8b7491bd24190d21b14729">I82551</a>, <a href="https://issuetracker.google.com/issues/262140644">b/262140644</a>)</li> </ul> <h3 id="1.5.0-alpha03" data-text="Version 1.5.0-alpha03" tabindex="-1">Version 1.5.0-alpha03</h3> <p>April 19, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.5.0-alpha03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.5.0-alpha03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/a200cb82769634cecdb118ec4f0bfdf0b086e597..01bd392d5702480f8bfe61a8f8bbbea64cf362a0/compose/foundation">Version 1.5.0-alpha03 contains these commits.</a></p> <p>This release enables the new text rendering stack for Compose. The new stack is performance optimized, and you should see no visible changes.</p> <p>If you do see changes in rendered text, you can debug by setting <code translate="no" dir="ltr">NewTextRendering1_5 = false</code> to confirm the behavior difference. Setting this will force recomposition. Please file any behavior differences as bugs.</p> <p>The debug flag will be removed before the 1.5 beta01 release.(<a href="https://android-review.googlesource.com/#/q/Iada234d046dffb92e45c1a910f6976aa1dd339cf">Iada23</a>, <a href="https://issuetracker.google.com/issues/246960758">b/246960758</a>)</p> <p><strong>API Changes</strong></p> <ul> <li>Make <code translate="no" dir="ltr">FlowColumn/FlowRow</code> inline. (<a href="https://android-review.googlesource.com/#/q/Idab37f7d83de66cf713ee29ba4c2f1f0243d4172">Idab37</a>)</li> </ul> <h3 id="1.5.0-alpha02" data-text="Version 1.5.0-alpha02" tabindex="-1">Version 1.5.0-alpha02</h3> <p>April 5, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.5.0-alpha02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.5.0-alpha02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5e7d256f82fbafb6d059ab7b18fddd87c7531553..a200cb82769634cecdb118ec4f0bfdf0b086e597/compose/foundation">Version 1.5.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added support for fixed size cells in <code translate="no" dir="ltr">LazyGrid</code> and arranging them with cross axis arrangement. (<a href="https://android-review.googlesource.com/#/q/I83ed9c6fa41d500ab049726b85373fade65a7ccc">I83ed9</a>, <a href="https://issuetracker.google.com/issues/235121277">b/235121277</a>, <a href="https://issuetracker.google.com/issues/267942510">b/267942510</a>)</li> <li>Added support for fixed size lanes in <code translate="no" dir="ltr">LazyStaggeredGrid</code> and arranging them with cross axis arrangement. (<a href="https://android-review.googlesource.com/#/q/I7d51967becb63f581d15c8e2d40b5d00e25ceb1f">I7d519</a>)</li> <li><code translate="no" dir="ltr">UrlAnnotation</code>s in <code translate="no" dir="ltr">AnnotatedString</code>s can now be opened via accessibility services like <code translate="no" dir="ltr">TalkBack</code>. (<a href="https://android-review.googlesource.com/#/q/If4d82999d8c62aa3718e1e681eeeaac12a9b0f55">If4d82</a>, <a href="https://issuetracker.google.com/issues/253292081">b/253292081</a>)</li> <li>Added the <code translate="no" dir="ltr">InsertTextAtCursor</code> semantics action for text fields. (<a href="https://android-review.googlesource.com/#/q/I11ed573be29737b234a114863c3c8f81e0fd65b1">I11ed5</a>)</li> <li>Text-related test actions (e.g. <code translate="no" dir="ltr">performTextInput</code>) will now request focus directly, using the semantics action, instead of clicking on the field. (<a href="https://android-review.googlesource.com/#/q/I6ed05394845155b1a7335e341ed3548a322f04f5">I6ed05</a>)</li> <li>Adds support for cross axis spacing/arrangement using the <code translate="no" dir="ltr">verticalArrangement</code> in <code translate="no" dir="ltr">FlowRow</code> and <code translate="no" dir="ltr">horizontalArrangement</code> in <code translate="no" dir="ltr">FlowColumn</code>. We also remove the top-level <code translate="no" dir="ltr">verticalAlignment</code> and <code translate="no" dir="ltr">horizontalAlignment</code> in <code translate="no" dir="ltr">FlowRow/FlowColumn</code>. Developers can use <code translate="no" dir="ltr">Modifier.align</code> instead. This reduces confusion between the naming conventions of <code translate="no" dir="ltr">verticalAlignment</code> and <code translate="no" dir="ltr">verticalArrangement</code>. (<a href="https://android-review.googlesource.com/#/q/I87b60b6bb09586d9126b9494e998be0710df3b62">I87b60</a>, <a href="https://issuetracker.google.com/issues/268365538">b/268365538</a>)</li> </ul> <h3 id="1.5.0-alpha01" data-text="Version 1.5.0-alpha01" tabindex="-1">Version 1.5.0-alpha01</h3> <p>March 22, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.5.0-alpha01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.5.0-alpha01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ce5f1f96b304c7952d07c5bb472112c4b0ee2312..5e7d256f82fbafb6d059ab7b18fddd87c7531553/compose/foundation">Version 1.5.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Text and <code translate="no" dir="ltr">BasicText</code> is refactored to use the new modifier system. This leads to substantial performance improvements in many cases. No changes should be visible. (<a href="https://android-review.googlesource.com/#/q/If1d17135e10b5eb6678842331421cb810e0d967e">If1d17</a>, <a href="https://issuetracker.google.com/issues/246961435">b/246961435</a>)</li> <li>Added the <code translate="no" dir="ltr">PerformImeAction</code> semantics action to invoke the IME action on text editor nodes. (<a href="https://android-review.googlesource.com/#/q/Ic606f69ba8860017a6d11f0f50dc0da063af0512">Ic606f</a>, <a href="https://issuetracker.google.com/issues/269633506">b/269633506</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Updated internals of <code translate="no" dir="ltr">Modifier.hoverable</code>. The <code translate="no" dir="ltr">hoverable</code> modifier will only be shown in the inspector if it is enabled. (<a href="https://android-review.googlesource.com/#/q/I82103dc33bad80b014b9c9546effaa76f1915ce2">I82103</a>)</li> </ul> <h2 id="version_14_2" data-text="Version 1.4" tabindex="-1">Version 1.4</h2> <h3 id="1.4.3" data-text="Version 1.4.3" tabindex="-1">Version 1.4.3</h3> <p>May 3, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.3</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.3</code> are released with no changes (only a version bump).</p> <h3 id="1.4.2" data-text="Version 1.4.2" tabindex="-1">Version 1.4.2</h3> <p>April 19, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.2</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.2</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5dcb085369a3574f1b09eaaf2a58ee0ea01c22d5..0872f930da585f7fbf6e17c74b1dc42045e8b2c6/compose/foundation">Version 1.4.2 contains these commits.</a></p> <h3 id="1.4.1" data-text="Version 1.4.1" tabindex="-1">Version 1.4.1</h3> <p>April 5, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.1</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.1</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/c13b30cf6683e0a43585416f30b55e07bf2b560e..5dcb085369a3574f1b09eaaf2a58ee0ea01c22d5/compose/foundation">Version 1.4.1 contains these commits.</a></p> <h3 id="1.4.0" data-text="Version 1.4.0" tabindex="-1">Version 1.4.0</h3> <p>March 22, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/548c8ac2570ae6cf15798fea1380491f7d93796b..c5b142d6ab0494c996b2378d5008ac1cd6da75f3/compose/foundation">Version 1.4.0 contains these commits.</a></p> <p><strong>Important changes since 1.3.0</strong></p> <ul> <li>Added Emoji compat integration to <code translate="no" dir="ltr">Text</code> and <code translate="no" dir="ltr">TextField</code>, as well as the lower level Paragraph. It is enabled by default when emojicompat is configured.</li> <li><code translate="no" dir="ltr">EmojiCompat</code> can be configured on a specific Text using <code translate="no" dir="ltr">PlatformParagraphStyle</code>.</li> <li>Added full line span support to <code translate="no" dir="ltr">LazyStaggeredGrid</code><a href="https://android-review.googlesource.com/#/q/I28252ba175f719bb6f731341cfad476c98e9c5e8">(I28252)</a></li> <li>Adding experimental <code translate="no" dir="ltr">onHover</code> to <code translate="no" dir="ltr">ClickableText</code><a href="https://android-review.googlesource.com/#/q/I6938fee052331eb671c07839e30e71e338adf897"> (I6938f)</a></li> <li>Introduced new experimental overloads for the <code translate="no" dir="ltr">runComposeUiTest</code> function and <code translate="no" dir="ltr">create*ComposeRule</code> functions that accept <code translate="no" dir="ltr">CoroutineContext</code> parameters. The context will be used for the test composition and any <code translate="no" dir="ltr">LaunchedEffect</code> and <code translate="no" dir="ltr">rememberCoroutineScope()</code> calls in the composition. (<a href="https://android-review.googlesource.com/#/q/I10614adabdb137ad44fb51f65403866b5b184ac1">I10614</a>, <a href="https://issuetracker.google.com/issues/265177763">b/265177763</a>)</li> <li><code translate="no" dir="ltr">FlowRow</code> and <code translate="no" dir="ltr">FlowColumn</code> are now available as <code translate="no" dir="ltr">@ExperimentalFoundationApi</code> that allow for a more flexible row and column based layout of components that will break to a new line if there is not enough space on the main axis. (<a href="https://android-review.googlesource.com/#/q/I3a7b26bff88ec172df7ab4acf62c2eefd5edb16d">I3a7b2</a>)</li> <li><code translate="no" dir="ltr">Modifier.basicMarquee()</code> is available as experimental for displaying content with a scrolling marquee effect. (<a href="https://android-review.googlesource.com/#/q/I2df44c3343afa8400b0da768a642b77da94c103d">I2df44</a>, <a href="https://issuetracker.google.com/issues/139321650">b/139321650</a>)</li> </ul> <h3 id="1.4.0-rc01" data-text="Version 1.4.0-rc01" tabindex="-1">Version 1.4.0-rc01</h3> <p>March 8, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0-rc01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0-rc01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/87533b4ff06971ed59028936cd9b6da988cd4522..6022301db806601f282c53b8cbb5a981923a1589/compose/foundation">Version 1.4.0-rc01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Introduced new low-level <code translate="no" dir="ltr">PlatformTextInputAdapter</code> API for building custom text input implementations that talk directly to platform APIs. (<a href="https://android-review.googlesource.com/#/q/I58df46daa7a88f9761dcd711519c6eddf8524b6d">I58df4</a>)</li> <li>Add support for reverse layout to <code translate="no" dir="ltr">LazyStaggeredGrid</code>. (<a href="https://android-review.googlesource.com/#/q/I3ef4ac9464b116d22515411acd6c7fd303894025">I3ef4a</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">BasicTextField</code>'s <code translate="no" dir="ltr">SetText</code> semantics action will now update the text buffer using the same code path as IME updates and the testing functions (e.g. <code translate="no" dir="ltr">performTextReplacement</code>).</li> <li>Text testing functions <code translate="no" dir="ltr">performTextClearance</code>, <code translate="no" dir="ltr">performTextReplacement</code>, and <code translate="no" dir="ltr">performTextSelection</code> now use <code translate="no" dir="ltr">SemanticsActions</code>. (<a href="https://android-review.googlesource.com/#/q/I0807d73975224ac5bf02fc232c1ab615f76c1c7d">I0807d</a>, <a href="https://issuetracker.google.com/issues/269633168">b/269633168</a>, <a href="https://issuetracker.google.com/issues/269624358">b/269624358</a>)</li> </ul> <h3 id="1.4.0-beta02" data-text="Version 1.4.0-beta02" tabindex="-1">Version 1.4.0-beta02</h3> <p>February 22, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0-beta02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0-beta02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f7337eab774a6ce3b17367d5f31708564b66e677..87533b4ff06971ed59028936cd9b6da988cd4522/compose/foundation">Version 1.4.0-beta02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added a new <code translate="no" dir="ltr">Modifier.Node.onReset()</code> callback allowing you to reset some local state to properly handle the case when the <code translate="no" dir="ltr">Layout</code> will be reused (for example as an item of <code translate="no" dir="ltr">LazyColumn</code>). Fixed <code translate="no" dir="ltr">FocusTargetModifierNode</code> to properly reset the focused state. (<a href="https://android-review.googlesource.com/#/q/I65495712cdeafeb3fedc3e4272627c024f952ddb">I65495</a>, <a href="https://issuetracker.google.com/issues/265201972">b/265201972</a>)</li> <li>Added <code translate="no" dir="ltr">BlendMode</code> parameter to <code translate="no" dir="ltr">DrawScope.drawText</code>, <code translate="no" dir="ltr">Paragraph.paint</code>, and <code translate="no" dir="ltr">MultiParagraph.paint</code> methods to support different blending algorithms when drawing text on Canvas. (<a href="https://android-review.googlesource.com/#/q/I57508ab06da481f63b4061ecb8ad72c3a733b0a7">I57508</a>)</li> <li>Removed the <code translate="no" dir="ltr">modifierElementOf()</code> API. Please extend from <code translate="no" dir="ltr">ModifierNodeElement</code> directly instead. (<a href="https://android-review.googlesource.com/#/q/Ie6d218280e3f9cdcd130f6abce2c5e549b12b765">Ie6d21</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Adjusting selection handles can no longer select a partial character. (<a href="https://android-review.googlesource.com/#/q/Idedd1679a5d1a2f2a8c93405b8d2f0450e793feb">Idedd1</a>)</li> <li>Fix crash when ctrl+backspace on empty <code translate="no" dir="ltr">TextField</code> (<a href="https://android-review.googlesource.com/#/q/I0427f936ddc519955d4b8092a86e10e0825c8696">I0427f</a>, <a href="https://issuetracker.google.com/issues/244185537">b/244185537</a>)</li> </ul> <h3 id="1.4.0-beta01" data-text="Version 1.4.0-beta01" tabindex="-1">Version 1.4.0-beta01</h3> <p>February 8, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0-beta01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0-beta01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/e5dad1e7d1c225f89f7c2d5a39a7a0de8d637d7b..f7337eab774a6ce3b17367d5f31708564b66e677/compose/foundation">Version 1.4.0-beta01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Since 1.3, added Emoji compat integration to <code translate="no" dir="ltr">Text</code> and <code translate="no" dir="ltr">TextField</code>, as well as the lower level Paragraph. It is enabled by default when emojicompat is configured.</li> <li><code translate="no" dir="ltr">EmojiCompat</code> can be configured on a specific Text using <code translate="no" dir="ltr">PlatformParagraphStyle</code>.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Added common implementation of <code translate="no" dir="ltr">PinnableContainer</code> API used in all <code translate="no" dir="ltr">LazyLayouts</code> to retain items that exit composition, but still need to be active. (<a href="https://android-review.googlesource.com/#/q/If45a40f06ea4c71a05c014d837dbb9bc5bfe8387">If45a4</a>)</li> <li><code translate="no" dir="ltr">PinnableContainer.PinnedHandle.unpin()</code> was renamed to <code translate="no" dir="ltr">release()</code> (<a href="https://android-review.googlesource.com/#/q/I4667a137f47ffe29f66940c010a50b254ab9bdb2">I4667a</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Added <code translate="no" dir="ltr">mainAxisItemSpacing</code> property to <code translate="no" dir="ltr">LazyListLayoutInfo</code>, <code translate="no" dir="ltr">LazyGridLayoutInfo</code> and <code translate="no" dir="ltr">LazyStaggeredGridItemInfo</code> (<a href="https://android-review.googlesource.com/#/q/I52fad30754e5fdda03fb47ac4d08c0c0b4cde2dc">I52fad</a>)</li> </ul> <h3 id="1.4.0-alpha05" data-text="Version 1.4.0-alpha05" tabindex="-1">Version 1.4.0-alpha05</h3> <p>January 25, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0-alpha05</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0-alpha05</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/adf1c279a86ab3886e1666c08e2c3efba783367b..e5dad1e7d1c225f89f7c2d5a39a7a0de8d637d7b/compose/foundation">Version 1.4.0-alpha05 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Added full line span support to <code translate="no" dir="ltr">LazyStaggeredGrid</code> (<a href="https://android-review.googlesource.com/#/q/I28252ba175f719bb6f731341cfad476c98e9c5e8">I28252</a>)</li> <li>Adding experimental <code translate="no" dir="ltr">onHover</code> to <code translate="no" dir="ltr">ClickableText</code> (<a href="https://android-review.googlesource.com/#/q/I6938fee052331eb671c07839e30e71e338adf897">I6938f</a>)</li> <li>Introduced new experimental overloads for the <code translate="no" dir="ltr">runComposeUiTest</code> function and <code translate="no" dir="ltr">create*ComposeRule</code> functions that accept <code translate="no" dir="ltr">CoroutineContext</code> parameters. The context will be used for the test composition and any <code translate="no" dir="ltr">LaunchedEffect</code> and <code translate="no" dir="ltr">rememberCoroutineScope()</code> calls in the composition. (<a href="https://android-review.googlesource.com/#/q/I10614adabdb137ad44fb51f65403866b5b184ac1">I10614</a>, <a href="https://issuetracker.google.com/issues/265177763">b/265177763</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Merges the pre/post APIs of <code translate="no" dir="ltr">OverscrollEffect</code> into combined 'decorator' <code translate="no" dir="ltr">applyToScroll</code> and <code translate="no" dir="ltr">applyToFling</code> functions. See the updated samples in the documentation for examples of how to implement an overscroll effect with the new API shape. (<a href="https://android-review.googlesource.com/#/q/I8a9c487a2d4a5438925d4664ac45c17f4a1b7e53">I8a9c4</a>, <a href="https://issuetracker.google.com/issues/255554340">b/255554340</a>)</li> <li>More type/nullability of inline/deprecated-hidden functions (<a href="https://android-review.googlesource.com/#/q/I24f91d55dabdd4f7ee05b8a679a4e928acc95d6d">I24f91</a>)</li> <li><code translate="no" dir="ltr">LineBreak</code> and <code translate="no" dir="ltr">Hyphens</code> APIs in <code translate="no" dir="ltr">TextStyle</code> are graduated to stable. (<a href="https://android-review.googlesource.com/#/q/Ic1e1d5f43e0601251aa3cac549cd45b7cbb70aee">Ic1e1d</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>The cursor in text fields will now continue to blink even when animations are disabled. (<a href="https://android-review.googlesource.com/#/q/I95e700ee40223cbc3970160b5c267a427d614f39">I95e70</a>, <a href="https://issuetracker.google.com/issues/265177763">b/265177763</a>)</li> <li><code translate="no" dir="ltr">Modifier.basicMarquee</code> now animates even when animations are disabled in the system settings. (<a href="https://android-review.googlesource.com/#/q/I23389686f06f2bf749a5f0326d0a33e6da23a1ec">I23389</a>, <a href="https://issuetracker.google.com/issues/262298306">b/262298306</a>, <a href="https://issuetracker.google.com/issues/265177763">b/265177763</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li><code translate="no" dir="ltr">notifyFocusedRect</code> methods in <code translate="no" dir="ltr">TextInputSession</code> and <code translate="no" dir="ltr">TextInputService</code> are not deprecated again. (<a href="https://android-review.googlesource.com/#/q/I23a0425b573a644fcc114a2b60d7bbbdaf5b04ed">I23a04</a>, <a href="https://issuetracker.google.com/issues/262648050">b/262648050</a>)</li> </ul> <h3 id="1.4.0-alpha04" data-text="Version 1.4.0-alpha04" tabindex="-1">Version 1.4.0-alpha04</h3> <p>January 11, 2023</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0-alpha04</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0-alpha04</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/047e199bdcb8a5cd744cc7a2f986631bfb350ec7..adf1c279a86ab3886e1666c08e2c3efba783367b/compose/foundation">Version 1.4.0-alpha04 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><code translate="no" dir="ltr">FlowRow</code> and <code translate="no" dir="ltr">FlowColumn</code> are now available as <code translate="no" dir="ltr">@ExperimentalFoundationApi</code> that allow for a more flexible row and column based layout of components that will break to a new line if there is not enough space on the main axis. (<a href="https://android-review.googlesource.com/#/q/I3a7b26bff88ec172df7ab4acf62c2eefd5edb16d">I3a7b2</a>)</li> <li><code translate="no" dir="ltr">Modifier.basicMarquee()</code>is available as experimental for displaying content with a scrolling marquee effect. (<a href="https://android-review.googlesource.com/#/q/I2df44c3343afa8400b0da768a642b77da94c103d">I2df44</a>, <a href="https://issuetracker.google.com/issues/139321650">b/139321650</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">FocusRequesterModifier</code> is deprecated in favor of <code translate="no" dir="ltr">FocusRequesterNode</code> (<a href="https://android-review.googlesource.com/#/q/I7f4d7a99aa42f7f3e4f49d034f8358a41ed42d0f">I7f4d7</a>, <a href="https://issuetracker.google.com/issues/247708726">b/247708726</a>, <a href="https://issuetracker.google.com/issues/255352203">b/255352203</a>, <a href="https://issuetracker.google.com/issues/253043481">b/253043481</a>, <a href="https://issuetracker.google.com/issues/247716483">b/247716483</a>, <a href="https://issuetracker.google.com/issues/254529934">b/254529934</a>, <a href="https://issuetracker.google.com/issues/251840112">b/251840112</a>, <a href="https://issuetracker.google.com/issues/251859987">b/251859987</a>, <a href="https://issuetracker.google.com/issues/257141589">b/257141589</a>)</li> <li><code translate="no" dir="ltr">AndroidFont</code> constructor with <code translate="no" dir="ltr">variationSettings</code> is now a stable API, and can be used to create new types of font descriptors. (<a href="https://android-review.googlesource.com/#/q/I5adcc8bd923050d20021d4725fcfe0b36f258ae1">I5adcc</a>, <a href="https://issuetracker.google.com/issues/261565807">b/261565807</a>)</li> <li>Introduced <code translate="no" dir="ltr">PinnableContainer</code> api propagated by lazy lists via a composition local which allows to pin current item. This means such item will not be disposed when it is scrolled away from the view. For example, <code translate="no" dir="ltr">Modifier.focusable()</code> will pin the current focused item via this mechanism. (<a href="https://android-review.googlesource.com/#/q/Ib8881191a529c9d9dc5e886570650b1987763207">Ib8881</a>, <a href="https://issuetracker.google.com/issues/259274257">b/259274257</a>, <a href="https://issuetracker.google.com/issues/195049010">b/195049010</a>)</li> <li>Rewrote the way scrollables respond to <code translate="no" dir="ltr">bringIntoViewRequesters</code> and focusables to better model the complexity of those operations and handle more edge cases. (<a href="https://android-review.googlesource.com/#/q/I2e5fec8c8582a8fe1f191e37fd0f4f9165678664">I2e5fe</a>, <a href="https://issuetracker.google.com/issues/241591211">b/241591211</a>, <a href="https://issuetracker.google.com/issues/192043120">b/192043120</a>, <a href="https://issuetracker.google.com/issues/237190748">b/237190748</a>, <a href="https://issuetracker.google.com/issues/230756508">b/230756508</a>, <a href="https://issuetracker.google.com/issues/239451114">b/239451114</a>)</li> <li>More return type nullability of deprecated-hidden functions (<a href="https://android-review.googlesource.com/#/q/Ibf7b0ada56eb08983e6109d30fad5294f6b841f0">Ibf7b0</a>)</li> <li>Added experimental <code translate="no" dir="ltr">TextMotion</code> to <code translate="no" dir="ltr">TextStyle</code> to define Text either to be <code translate="no" dir="ltr">Static(default)</code> or Animated. Use <code translate="no" dir="ltr">TextMotion.Animated</code> if Text is going to be scaled, translated, or rotated via animation. (<a href="https://android-review.googlesource.com/#/q/I24dd75e606184220ed3eebc3c80f84d5c977c14c">I24dd7</a>)</li> <li>Add <code translate="no" dir="ltr">TextFieldFocusModifier</code> to fix focus navigation behaviour for android platform (<a href="https://android-review.googlesource.com/#/q/I0030377131b9328f30ad62d8cb7f1a98f188b330">I00303</a>)</li> <li>Replaced <code translate="no" dir="ltr">maxSize: IntSize</code> argument in <code translate="no" dir="ltr">drawText</code> with <code translate="no" dir="ltr">size: Size</code> to be inline with other <code translate="no" dir="ltr">DrawScope</code> functions. <code translate="no" dir="ltr">size</code> is set to <code translate="no" dir="ltr">Size.Unspecified</code> by default which should not change the previous default behavior. (<a href="https://android-review.googlesource.com/#/q/Icd27ddc109548e76c7bc4fba08fb9dfc174afa40">Icd27d</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Adjustments in the snapping physics in <code translate="no" dir="ltr">SnapFlingBehaviour</code> for a more natural feel.</li> </ul> <p><strong>Known Issue</strong></p> <ul> <li>When updating from <code translate="no" dir="ltr">androidx.compose.foundation:1.4.0-alpha03</code> to <code translate="no" dir="ltr">androidx.compose.foundation:1.4.0-alpha04</code>, you might experience a <code translate="no" dir="ltr">java.lang.NoSuchFieldError</code> error. <a href="https://issuetracker.google.com/issues/265172081">Here</a> is where the issue was orginially reported. A fix has been submitted, and will be available on the next Compose update. As a work around, update your <code translate="no" dir="ltr">androidx.compose.material</code> and <code translate="no" dir="ltr">androidx.compose.material3</code> libraries to the latest version(1.1.0-alpha04) or downgrade your <code translate="no" dir="ltr">androidx.compose.foundation</code> to 1.4.0-alpha03.</li> </ul> <h3 id="1.4.0-alpha03" data-text="Version 1.4.0-alpha03" tabindex="-1">Version 1.4.0-alpha03</h3> <p>December 7, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0-alpha03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0-alpha03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/a1e318590b217ecfce1b2de17eed2f18b6a680bb..047e199bdcb8a5cd744cc7a2f986631bfb350ec7/compose/foundation">Version 1.4.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>In UI tests using a Compose rule, continuations resumed during <code translate="no" dir="ltr">withFrameNanos</code> callbacks will not be dispatched until after all frame callbacks have finished running. This matches the behavior of compose when running normally. However, tests that rely on the old behavior may fail. This should only affect code that calls <code translate="no" dir="ltr">withFrameNanos</code> or <code translate="no" dir="ltr">withFrameMillis</code> directly, and has logic outside of callback passed to those functions that may need to be moved inside the callbacks. See the animation test changes in <a href="https://android-review.googlesource.com/#/q/Idb41309445a030c91e8e4ae05daa9642b450505c">this CL for examples</a>.</li> <li>Added optional <code translate="no" dir="ltr">onPerformTraversals: (Long) -> Unit</code> parameter to <code translate="no" dir="ltr">TestMonotonicFrameClock</code> constructor and factory function to run code after <code translate="no" dir="ltr">withFrameNanos</code> callbacks but before resuming callers' coroutines. (<a href="https://android-review.googlesource.com/#/q/Idb41309445a030c91e8e4ae05daa9642b450505c">Idb413</a>, <a href="https://issuetracker.google.com/issues/254115946">b/254115946</a>, <a href="https://issuetracker.google.com/issues/222093277">b/222093277</a>, <a href="https://issuetracker.google.com/issues/255802670">b/255802670</a>)</li> <li>Introduce Page accessibility actions: <code translate="no" dir="ltr">PageUp</code>, <code translate="no" dir="ltr">PageDown</code>, <code translate="no" dir="ltr">PageLeft</code>, <code translate="no" dir="ltr">PageRight</code>. Note that these are only available from API 29. (<a href="https://android-review.googlesource.com/#/q/Ida4ab069a2c7f8d2fc06bf20555c611f4a360728">Ida4ab</a>)</li> <li>Introduce <code translate="no" dir="ltr">HorizontalPager</code> and <code translate="no" dir="ltr">VerticalPager</code>, a way of showing composables in a Pager manner. Introduced <code translate="no" dir="ltr">PagerState</code> to control the Pagers as well as query information about the Pager's current state. Introduced <code translate="no" dir="ltr">PageSize</code>, a way of controlling the size of a Pager's page, this can be used to create a carousel like Pagers. Introduced <code translate="no" dir="ltr">PagerSnapDistance</code>, a way to control how snapping will work in Pager's fling behavior. (<a href="https://android-review.googlesource.com/#/q/I01120224eaccd9ee255890eb409e87a7ef7ffd5f">I01120</a>)</li> <li>Introduced an overload in <code translate="no" dir="ltr">SnapFlingBehavior.performFling</code> to help to understand where the fling will settle. (<a href="https://android-review.googlesource.com/#/q/I569f6480401d4250f7a4e8a73f02d29d9c8c3b95">I569f6</a>)</li> <li>Removed <code translate="no" dir="ltr">OverscrollEffect#isEnabled</code>. Instead of needing to remember and set this flag, just don't dispatch events to the overscroll effect in cases where you do not want overscroll to show (for example if <code translate="no" dir="ltr">ScrollableState#canScrollForward/backward</code> both return false). (<a href="https://android-review.googlesource.com/#/q/I1a4b07627dca47f13d7adb7481fd25097b6eb6a9">I1a4b0</a>, <a href="https://issuetracker.google.com/issues/255554340">b/255554340</a>, <a href="https://issuetracker.google.com/issues/255557085">b/255557085</a>)</li> <li>Added <code translate="no" dir="ltr">ScrollableState#canScrollForward</code> and <code translate="no" dir="ltr">ScrollableState#canScrollBackward</code> to query whether a <code translate="no" dir="ltr">ScrollableState</code> has room to scroll in either direction (whether it is at the minimum / maximum of its range). This defaults to true for backwards compatibility with existing implementations of <code translate="no" dir="ltr">ScrollableState</code>. Consumers can use this to show indication to the user that there is still room to scroll, and this could also be used to avoid dispatching delta to <code translate="no" dir="ltr">ScrollableStates</code> that have no room to scroll in a given direction, to reduce unnecessary work. (<a href="https://android-review.googlesource.com/#/q/Idf1a066bdd86d2205d4bd5bab121c73059ada054">Idf1a0</a>, <a href="https://issuetracker.google.com/issues/255557085">b/255557085</a>)</li> <li>Added an Modifier API to query ancestors scroll info. (<a href="https://android-review.googlesource.com/#/q/I2ba9d6d55f853e5d2775fe9a9f15e7a41d41e359">I2ba9d</a>, <a href="https://issuetracker.google.com/issues/203141462">b/203141462</a>)</li> <li>Used in <code translate="no" dir="ltr">Clickable</code> to correctly delay press interactions, when gestures could become scroll events.</li> <li>Fixed <code translate="no" dir="ltr">Clickables</code> not correctly delaying ripples, when used inside an <code translate="no" dir="ltr">Scrollable ViewGroup</code>.</li> <li>Updated Drawers and Sheets to correctly delay presses in case gestures can become scroll events.</li> <li>Update <code translate="no" dir="ltr">snapStepSize</code> naming to be consistent with other methods in <code translate="no" dir="ltr">SnapLayoutInfoProvider</code>. (<a href="https://android-review.googlesource.com/#/q/Ife67c7ed561e4e8169f3e6234dab33819998234c">Ife67c</a>)</li> <li>Added <code translate="no" dir="ltr">EmojiCompat</code> to <code translate="no" dir="ltr">Compose</code> (<a href="https://android-review.googlesource.com/#/q/Ibf6f9f9d37c6280fe1b051269b127f0dfb1d6b6a">Ibf6f9</a>, <a href="https://issuetracker.google.com/issues/139326806">b/139326806</a>)</li> <li>Renamed <code translate="no" dir="ltr">consumedWindowInsets()</code> to <code translate="no" dir="ltr">consumeWindowInsets()</code> and <code translate="no" dir="ltr">withConsumedWindowInsets()</code> to <code translate="no" dir="ltr">onConsumedWindowInsetsChanged()</code> and made the Modifiers public. (<a href="https://android-review.googlesource.com/#/q/Ie44e1304babf2007f6dc5894716ca92c2ef6d067">Ie44e1</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>The crash with <code translate="no" dir="ltr">Modifier.animateItemPlacement()</code> and Lazy grids was fixed. It was happening in some conditions when the new items count is smaller then the previous one. (<a href="https://android-review.googlesource.com/#/q/I0bcac889f7916ab032be277ba11fcfb723e56516">I0bcac</a>, <a href="https://issuetracker.google.com/issues/253195989">b/253195989</a>)</li> </ul> <h3 id="1.4.0-alpha02" data-text="Version 1.4.0-alpha02" tabindex="-1">Version 1.4.0-alpha02</h3> <p>November 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0-alpha02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0-alpha02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/548c8ac2570ae6cf15798fea1380491f7d93796b..a1e318590b217ecfce1b2de17eed2f18b6a680bb/compose/foundation">Version 1.4.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">awaitFirstDown</code> and <code translate="no" dir="ltr">waitForUpOrCancellation</code> now accept a <code translate="no" dir="ltr">PointerEventPass</code> for greater flexibility. (<a href="https://android-review.googlesource.com/#/q/I7579a2dbb44c748a3fd3e515d2e7ab086aaff443">I7579a</a>, <a href="https://issuetracker.google.com/issues/212091796">b/212091796</a>)</li> <li>Revert <code translate="no" dir="ltr">beyondBoundCount</code> API from Lazy* APIs (<a href="https://android-review.googlesource.com/#/q/I121974911a3cca2210f27df5c88683dcdc77b545">I12197</a>)</li> <li>Introduced parameter in Lazy APIs to compose and place out of viewport items (<a href="https://android-review.googlesource.com/#/q/I69e8973974b1e7fa0e1bd075b63ef42cbb4709cb">I69e89</a>, <a href="https://issuetracker.google.com/issues/172029355">b/172029355</a>)</li> <li>Added <code translate="no" dir="ltr">minLines</code> parameter to the <code translate="no" dir="ltr">BasicText</code> and <code translate="no" dir="ltr">BasicTextField</code>. It allows to set the minimum height of these composables in terms of number of lines (<a href="https://android-review.googlesource.com/#/q/I2429479960eef317f467fa054b979c12fd73689d">I24294</a>, <a href="https://issuetracker.google.com/issues/122476634">b/122476634</a>)</li> </ul> <h3 id="1.4.0-alpha01" data-text="Version 1.4.0-alpha01" tabindex="-1">Version 1.4.0-alpha01</h3> <p>October 24, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.4.0-alpha01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.4.0-alpha01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/e6ab75d133443eb5c1d92f910f625741041fc591..548c8ac2570ae6cf15798fea1380491f7d93796b/compose/foundation">Version 1.4.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>A new method, <code translate="no" dir="ltr">awaitEachGesture()</code>, for gesture detectors was added. It operates similar to <code translate="no" dir="ltr">forEachGesture()</code>, but the loop over gestures operates entirely within the <code translate="no" dir="ltr">AwaitPointerEventScope</code> so events can't be lost between iterations.</li> <li><code translate="no" dir="ltr">forEachGesture()</code> has been deprecated in favor of <code translate="no" dir="ltr">awaitEachGesture()</code> because it allows events to be lost between gestures. (<a href="https://android-review.googlesource.com/#/q/Iffc3fb8cf53d0e5eb9b529c023b3e2d29003e86f">Iffc3f</a>, <a href="https://issuetracker.google.com/issues/251260206">b/251260206</a>)</li> <li>Added <code translate="no" dir="ltr">WindowInsets.imeAnimationSourc</code>e and <code translate="no" dir="ltr">WindowInsets.imeAnimationTarget</code> to determine the animation progress and know where the IME will be after animation completes. (<a href="https://android-review.googlesource.com/#/q/I356f1bac4ac4ff311573eb8df7227098b9186c20">I356f1</a>, <a href="https://issuetracker.google.com/issues/217770337">b/217770337</a>)</li> </ul> <h2 id="version_13_2" data-text="Version 1.3" tabindex="-1">Version 1.3</h2> <h3 id="1.3.1" data-text="Version 1.3.1" tabindex="-1">Version 1.3.1</h3> <p>November 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.1</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.1</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b5cb4dae1f526ce2408f450b50ade8708684b2be..d29f2a87e3c1d5cb6dfde828400d67b6f161be63/compose/foundation">Version 1.3.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix performance issue in <code translate="no" dir="ltr">BeyondBoundsLayout</code> (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2255266">aosp/2255266</a>)</li> <li><code translate="no" dir="ltr">ContentInViewModifier</code> will not read layout coordinates unless attached (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2241316">aosp/2241316</a>)</li> </ul> <h3 id="1.3.0" data-text="Version 1.3.0" tabindex="-1">Version 1.3.0</h3> <p>October 24, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.0</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.0</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/3c2d5397fb8ef697bb04bfc7e98721e2dc0aa255..b5cb4dae1f526ce2408f450b50ade8708684b2be/compose/foundation">Version 1.3.0 contains these commits.</a></p> <p><strong>Important changes since 1.2.0</strong></p> <ul> <li>Experimental versions of <code translate="no" dir="ltr">LazyVerticalStaggeredGrid</code> and <code translate="no" dir="ltr">LazyHorizontalStaggeredGrid</code> were introduced.</li> <li><code translate="no" dir="ltr">SnapFlingBehavior</code>, <code translate="no" dir="ltr">rememberSnapFlingBehavior</code> and other corresponding APIs were added as experimental.</li> <li><code translate="no" dir="ltr">Modifier.clickable</code>, <code translate="no" dir="ltr">Modifier.toggleable</code>, and <code translate="no" dir="ltr">Modifier.selectable</code> now show ripples if clicked with the keyboard or d-pad on a remote control.</li> </ul> <h3 id="1.3.0-rc01" data-text="Version 1.3.0-rc01" tabindex="-1">Version 1.3.0-rc01</h3> <p>October 5, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.0-rc01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.0-rc01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bdce26bd7556b92d2d4d2af3de881dd8e2c51459..e6ab75d133443eb5c1d92f910f625741041fc591/compose/foundation">Version 1.3.0-rc01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Introduced <code translate="no" dir="ltr">lowVelocityAnimationSpec</code> used by the approach step when there's not enough fling velocity to decay. (<a href="https://android-review.googlesource.com/#/q/Iaeb272de77d42e142c01cc3f514a85331e9ef856">Iaeb27</a>)</li> <li>Added new experimental API Hyphens to support automatic hyphenation in Text (<a href="https://android-review.googlesource.com/#/q/Iaa869b15b0cf6d9b4f4ab87ddf687c2388b886e8">Iaa869</a>)</li> </ul> <h3 id="1.3.0-beta03" data-text="Version 1.3.0-beta03" tabindex="-1">Version 1.3.0-beta03</h3> <p>September 21, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.0-beta03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.0-beta03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/cce7b70f6a5ebf955cf748a73c18b63228b22c74..bdce26bd7556b92d2d4d2af3de881dd8e2c51459/compose/foundation">Version 1.3.0-beta03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Add options to customize line breaking in Text. (<a href="https://android-review.googlesource.com/#/q/I8690771e479fd832dcd991a234c49bfcca1beaa0">I86907</a>)</li> <li><code translate="no" dir="ltr">BringIntoViewResponder</code>s are now able to get the most up-to-date bounds of a request while processing it. (<a href="https://android-review.googlesource.com/#/q/If86a581463c14db3fa5638720aabca9830720630">If86a5</a>, <a href="https://issuetracker.google.com/issues/241591211">b/241591211</a>)</li> <li>Introduce support for spacings between items to experimental <code translate="no" dir="ltr">Staggered Grid</code> (<a href="https://android-review.googlesource.com/#/q/I10b82056a2da0df7b19889c14bf92d307adbec52">I10b82</a>)</li> <li>Introduce content padding to experimental <code translate="no" dir="ltr">Staggered Grid</code> (<a href="https://android-review.googlesource.com/#/q/I342ea10af989e837517299ed85ad587606c14a02">I342ea</a>)</li> <li>Changed <code translate="no" dir="ltr">size:IntSize</code> argument with <code translate="no" dir="ltr">constraints: Constraints</code> in <code translate="no" dir="ltr">TextMeasurer.measure</code> method to support minimum width constraints. (<a href="https://android-review.googlesource.com/#/q/I37530a2f80f5a2226c6e155985491b824f08a0c0">I37530</a>, <a href="https://issuetracker.google.com/issues/242707525">b/242707525</a>)</li> <li>Added <code translate="no" dir="ltr">Modifier.withConsumedWindowInsets()</code> to get consumed <code translate="no" dir="ltr">WindowInsets</code> for use outside <code translate="no" dir="ltr">windowInsetsPadding</code>.</li> <li>Added <code translate="no" dir="ltr">MutableWindowInsets</code> to allow easily changing <code translate="no" dir="ltr">WindowInsets</code> without recomposition. (<a href="https://android-review.googlesource.com/#/q/I7fd28c29953ca10b4182d07996f16b66263548b1">I7fd28</a>, <a href="https://issuetracker.google.com/issues/237019262">b/237019262</a>, <a href="https://issuetracker.google.com/issues/243119659">b/243119659</a>)</li> </ul> <h3 id="1.3.0-beta02" data-text="Version 1.3.0-beta02" tabindex="-1">Version 1.3.0-beta02</h3> <p>September 7, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.0-beta02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.0-beta02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d9910e143f859716fd850a1f0036147622d6089b..cce7b70f6a5ebf955cf748a73c18b63228b22c74/compose/foundation">Version 1.3.0-beta02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Initial version of experimental <code translate="no" dir="ltr">StaggeredGrid</code> (<a href="https://android-review.googlesource.com/#/q/Ia48bee0578661d2c1ecb3fdcab207e615097835f">Ia48be</a>)</li> <li>Renamed <code translate="no" dir="ltr">FocusDirection.In</code> and <code translate="no" dir="ltr">FocusDirection.Out</code> to <code translate="no" dir="ltr">FocusDirection.Enter</code> and <code translate="no" dir="ltr">FocusDirection.Exit</code> (<a href="https://android-review.googlesource.com/#/q/Ia4262d2f8edc3ec36d2edc9ed2858895971ba33c">Ia4262</a>, <a href="https://issuetracker.google.com/issues/183746982">b/183746982</a>)</li> <li>Introduced a <code translate="no" dir="ltr">rememberSnapFlingBehavior</code> overload that provides a quick way of enabling snapping in <code translate="no" dir="ltr">LazyLists</code>. (<a href="https://android-review.googlesource.com/#/q/Ifb48aa88914ef278b32c0f0f5861c6bbc5ff7f6c">Ifb48a</a>)</li> <li>Replaced the <code translate="no" dir="ltr">snapFlingBehavior</code> factory with a concrete <code translate="no" dir="ltr">SnapFlingBehavior</code> class. Scoped <code translate="no" dir="ltr">SnapLayoutInfoProvider</code> methods to Density to make Dp<->Px conversions easier for the API users. (<a href="https://android-review.googlesource.com/#/q/I54a1185e1402e2f5b0a7f05655155bdfe6cb953e">I54a11</a>)</li> <li>Update <code translate="no" dir="ltr">LazyLayoutMeasureScope.measure</code> to return list of placeables, highlighting desired immutability of the returned value. (<a href="https://android-review.googlesource.com/#/q/I48b7ced0d579cc40287c3307a967b27439eb5c94">I48b7c</a>)</li> <li>Introduced <code translate="no" dir="ltr">SnapLayoutInfoProvider</code> which takes a <code translate="no" dir="ltr">LazyListState</code> to create an instance of <code translate="no" dir="ltr">SnapLayoutInfoProvider</code> that can be used to enable a snap <code translate="no" dir="ltr">FlingBehavior</code> for <code translate="no" dir="ltr">LazyLists</code>. (<a href="https://android-review.googlesource.com/#/q/I2dd101bbbff6a75c05d89962f240fd0e4e278c38">I2dd10</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Refactors <code translate="no" dir="ltr">AwaitPointerEventScope#awaitLongPressOrCancellation</code> to match other await functions (<a href="https://android-review.googlesource.com/#/q/I646e6fb3477573b98183c10830c0f9dd4cfa715f">I646e6</a>)</li> </ul> <h3 id="1.3.0-beta01" data-text="Version 1.3.0-beta01" tabindex="-1">Version 1.3.0-beta01</h3> <p>August 24, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.0-beta01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.0-beta01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bea814b246f89ff7244e3c6b0648f0b57e47897c..d9910e143f859716fd850a1f0036147622d6089b/compose/foundation">Version 1.3.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Removed <code translate="no" dir="ltr">pointerPosition</code> from <code translate="no" dir="ltr">OverscrollEffect</code> - effects that care about pointer position can use <code translate="no" dir="ltr">Modifier.pointerInput { }</code> in the <code translate="no" dir="ltr">effectModifier</code> to get the current pointer position instead. (<a href="https://android-review.googlesource.com/#/q/I9f606c640cc23d7483b32ed98b7caf790c9d2e36">I9f606</a>, <a href="https://issuetracker.google.com/issues/241239306">b/241239306</a>)</li> <li>Exposed <code translate="no" dir="ltr">AwaitPointerEventScope#awaitLongPressOrCancellation</code> as additional building block for more complex gesture detection (<a href="https://android-review.googlesource.com/#/q/I646e6fb3477573b98183c10830c0f9dd4cfa715f">I04374</a>, <a href="https://issuetracker.google.com/issues/181577176">b/181577176</a>)</li> <li>Introduced <code translate="no" dir="ltr">lazyListSnapLayoutInfoProvider</code> to enable snapping in Lazy Lists. (<a href="https://android-review.googlesource.com/#/q/I3ecdfe2b0584be65057eb9a4dab29fcbc401dbca">I3ecdf</a>)</li> <li>Introduced <code translate="no" dir="ltr">SnapFlingBehavior</code>, a fling behavior that enables list snapping. Provide an instance of <code translate="no" dir="ltr">SnapLayoutInfoProvider</code> with information about your snapping layout. (<a href="https://android-review.googlesource.com/#/q/Ie754cce97819d2f81c6bd72a68ff79e1af31c51e">Ie754c</a>)</li> </ul> <h3 id="1.3.0-alpha03" data-text="Version 1.3.0-alpha03" tabindex="-1">Version 1.3.0-alpha03</h3> <p>August 10, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.0-alpha03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.0-alpha03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/a7f0710ad21f556f0dde9bf7bdab6d2135170fd4..bea814b246f89ff7244e3c6b0648f0b57e47897c/compose/foundation">Version 1.3.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Resource Fonts now support setting font variation settings (API 26+). (<a href="https://android-review.googlesource.com/#/q/I900dde1f539e580a66db9c14d389ada691377c91">I900dd</a>, <a href="https://issuetracker.google.com/issues/143703328">b/143703328</a>)</li> <li>Variable font support in <code translate="no" dir="ltr">DeviceFontFamilyNameFont</code> (<a href="https://android-review.googlesource.com/#/q/Ic1279b2dcb1c29e75b8037791179853a9f828c02">Ic1279</a>, <a href="https://issuetracker.google.com/issues/143703328">b/143703328</a>)</li> <li>Removed experimental annotation from <code translate="no" dir="ltr">PlatformTextStyle</code> and <code translate="no" dir="ltr">LineHeightStyle</code>. (<a href="https://android-review.googlesource.com/#/q/I64bef65f524025ac386bf0cf0d362eb7ac9a7352">I64bef</a>)</li> <li>Text fields will now throw more detailed exceptions when the <code translate="no" dir="ltr">OffsetMapping</code> provided by a <code translate="no" dir="ltr">VisualTransformation</code> returns invalid indices. (<a href="https://android-review.googlesource.com/#/q/Ie73f9a652c29dde66d073a868a2e1c181feaa98d">Ie73f9</a>, <a href="https://issuetracker.google.com/issues/229378536">b/229378536</a>)</li> <li>Introduce experimental APIs to share item provider logic between Lazy layouts. (<a href="https://android-review.googlesource.com/#/q/Ic891c22570c755e56ca35f65e8f8408048ce8d20">Ic891c</a>)</li> <li><code translate="no" dir="ltr">ScrollableDefaults.reverseDirection()</code> is not experimental anymore. (<a href="https://android-review.googlesource.com/#/q/Iba64650ce62b9073b3554a6acf3385806711c4a5">Iba646</a>)</li> <li>Deprecated <code translate="no" dir="ltr">SemanticsModifier.id</code> and moved the semantics id to <code translate="no" dir="ltr">LayoutInfo.semanticsId</code> instead. (<a href="https://android-review.googlesource.com/#/q/Iac808fc0e3ff14f1c1a95ee3f1f24cd436245a0e">Iac808</a>, <a href="https://issuetracker.google.com/issues/203559524">b/203559524</a>)</li> <li><code translate="no" dir="ltr">checkScrollableContainerConstraints()</code> is not experimental anymore. (<a href="https://android-review.googlesource.com/#/q/I2c290705f35f9b8f15ff14d3fa1fc8d8fcf395de">I2c290</a>)</li> <li><code translate="no" dir="ltr">Modifier.clipScrollableContainer()</code> is not experimental anymore. (<a href="https://android-review.googlesource.com/#/q/Ia2b44e094e37bab71992d5fb366e866cf9dd3c31">Ia2b44</a>)</li> <li>Deprecate <code translate="no" dir="ltr">TextInputService.show|hideSoftwareKeyboard</code>. Please use <code translate="no" dir="ltr">SoftwareKeyboardController</code> instead in app code and <code translate="no" dir="ltr">TextInputSession</code> in IME-management code. (<a href="https://android-review.googlesource.com/#/q/I14e4cb6e685dd9a0a172797d8d3f363446aeb89d">I14e4c</a>, <a href="https://issuetracker.google.com/issues/183448615">b/183448615</a>)</li> </ul> <h3 id="1.3.0-alpha02" data-text="Version 1.3.0-alpha02" tabindex="-1">Version 1.3.0-alpha02</h3> <p>July 27, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.0-alpha02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.0-alpha02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8094b683499b4098092c01028b55a38b49e357f2..a7f0710ad21f556f0dde9bf7bdab6d2135170fd4/compose/foundation">Version 1.3.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">drawText</code> extension function on <code translate="no" dir="ltr">DrawScope</code> to provide a way to draw multi-styled text on composables and modifiers that operate on a <code translate="no" dir="ltr">DrawScope</code> like <code translate="no" dir="ltr">Canvas</code> and <code translate="no" dir="ltr">drawBehind</code>. (<a href="https://android-review.googlesource.com/#/q/I16a6226ae83d879f2c493fb811f1ecef77a1fc15">I16a62</a>, <a href="https://issuetracker.google.com/issues/190787898">b/190787898</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Soft keyboard will now be hidden when a text field is disabled while focused. (<a href="https://android-review.googlesource.com/#/q/I6e3e4c264a0927710ee2413740154ddb6ac392bf">I6e3e4</a>, <a href="https://issuetracker.google.com/issues/237308379">b/237308379</a>)</li> <li>When adding <code translate="no" dir="ltr">InputEventChange</code> events to Velocity Tracker we will consider now deltas instead of positions, this will guarantee the velocity is correctly calculated for all cases even if the target element moves (<a href="https://android-review.googlesource.com/#/q/Icea9d76a43643a6b17da11f3c539d27cb8fa6f6e">Icea9d</a>, <a href="https://issuetracker.google.com/issues/216582726">b/216582726</a>, <a href="https://issuetracker.google.com/issues/223440806">b/223440806</a>, <a href="https://issuetracker.google.com/issues/227709803">b/227709803</a>)</li> <li>When a scrollable has a focused child, it will now correctly scroll to keep the focused child in view when its size is decreased, even when the size is animated. (<a href="https://android-review.googlesource.com/#/q/I8086717b14174e566b299f2643f1dd6c0b250773">I80867</a>, <a href="https://issuetracker.google.com/issues/230756508">b/230756508</a>, <a href="https://issuetracker.google.com/issues/220119990">b/220119990</a>)</li> <li>Fixed a crash where <code translate="no" dir="ltr">TextField</code> is cleared and refilled while selection is active. (<a href="https://android-review.googlesource.com/#/q/I1235b669921e67dcbec9e55a6d1a95ff609fe4b6">I1235b</a>, <a href="https://issuetracker.google.com/issues/208655565">b/208655565</a>, <a href="https://issuetracker.google.com/issues/214253689">b/214253689</a>)</li> </ul> <h3 id="1.3.0-alpha01" data-text="Version 1.3.0-alpha01" tabindex="-1">Version 1.3.0-alpha01</h3> <p>June 29, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.3.0-alpha01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.3.0-alpha01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8328bd32e5ca96bc5a53d6369130e856cd2ca80b..8094b683499b4098092c01028b55a38b49e357f2/compose/foundation">Version 1.3.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Introduced the <code translate="no" dir="ltr">UrlAnnotation</code> annotation type and associated methods to support <code translate="no" dir="ltr">TalkBack</code> link support in <code translate="no" dir="ltr">AnnotatedString</code>s. (<a href="https://android-review.googlesource.com/#/q/I1c754dfa0ce88a36989888b43816333dfc94b0aa">I1c754</a>, <a href="https://issuetracker.google.com/issues/231495122">b/231495122</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">BasicTextField</code> <code translate="no" dir="ltr">cursorBrush</code> may now be animated without restarting the cursor timer. (<a href="https://android-review.googlesource.com/#/q/I812e6d2fd1db29b16401e121a2132aa37f6d7b51">I812e6</a>, <a href="https://issuetracker.google.com/issues/236383522">b/236383522</a>)</li> </ul> <h2 id="version_12_2" data-text="Version 1.2" tabindex="-1">Version 1.2</h2> <h3 id="1.2.1" data-text="Version 1.2.1" tabindex="-1">Version 1.2.1</h3> <p>August 10, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.1</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.1</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1e0793130863c72dc4a2d02bc975128f3ef0158b..3c2d5397fb8ef697bb04bfc7e98721e2dc0aa255/compose/foundation">Version 1.2.1 contains these commits.</a></p> <h3 id="1.2.0" data-text="Version 1.2.0" tabindex="-1">Version 1.2.0</h3> <p>July 27, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7ff668d1061ec9e732d65ec3bfa9dc3db50fd87a..1e0793130863c72dc4a2d02bc975128f3ef0158b/compose/foundation">Version 1.2.0 contains these commits.</a></p> <p><strong>Important changes since 1.1.0</strong></p> <ul> <li><code translate="no" dir="ltr">LazyVerticalGrid</code> and <code translate="no" dir="ltr">LazyHorizontalGrid</code> are stable now.</li> <li>You can now specify a content type for items in Lazy lists and grids. This will allow the components to reuse elements more efficiently.</li> <li>Lazy lists and grids now have <code translate="no" dir="ltr">userScrollEnabled</code> param which allows to disable scrolling via the user gestures.</li> <li>A new experimental API called <code translate="no" dir="ltr">LazyLayout</code> was added. It It is the API we use internally to power Lazy lists and grids.</li> <li><code translate="no" dir="ltr">OverscrollEffect</code> API has been introduced as experimental. You can define custom overscroll effects as well as adding a standard platform one to custom scrollable containers.</li> <li><a href="/jetpack/compose/gestures#nested-scrolling-interop">Nested scrolling interoperability APIs</a> have been introduced to allow for interoperability between views and compose scrolling actors.</li> <li>Mouse and trackpad scrolling has been added to all scrolling containers.</li> </ul> <h3 id="1.2.0-rc03" data-text="Version 1.2.0-rc03" tabindex="-1">Version 1.2.0-rc03</h3> <p>June 29, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-rc03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-rc03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8328bd32e5ca96bc5a53d6369130e856cd2ca80b..e8af23f4f30713a3f6073d57558e7cde0f3056e9/compose/foundation">Version 1.2.0-rc03 contains these commits.</a></p> <ul> <li>No changes since 1.2.0-rc02.</li> </ul> <h3 id="1.2.0-rc02" data-text="Version 1.2.0-rc02" tabindex="-1">Version 1.2.0-rc02</h3> <p>June 22, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-rc02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-rc02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2d8badfd263991345376562fc0f247bc76ca6312..8328bd32e5ca96bc5a53d6369130e856cd2ca80b/compose/foundation">Version 1.2.0-rc02 contains these commits.</a></p> <h3 id="1.2.0-rc01" data-text="Version 1.2.0-rc01" tabindex="-1">Version 1.2.0-rc01</h3> <p>June 15, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-rc01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-rc01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5973fd35e79471563d11a6776b6a1816b1e33409..2d8badfd263991345376562fc0f247bc76ca6312/compose/foundation">Version 1.2.0-rc01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>An experimental <code translate="no" dir="ltr">OverscrollEffect</code> has been introduced to allow for custom overscroll effects, alongside the <code translate="no" dir="ltr">Modifier.scrollable</code> overloads that accept it.</li> <li>Experimental <code translate="no" dir="ltr">LocalOverScrollConfiguration</code> has been moved from <code translate="no" dir="ltr">foundation.gesture</code> to foundation package and renamed to <code translate="no" dir="ltr">LocalOverscrollConfiguration</code> (<a href="https://android-review.googlesource.com/#/q/If19fb8063922eddf1ffcb020ec6a8fbe48471ccf">If19fb</a>, <a href="https://issuetracker.google.com/issues/204650733">b/204650733</a>)</li> <li>Interfaces in compose libraries are now built using jdk8 default interface methods (<a href="https://android-review.googlesource.com/#/q/I5bcf197603f66ec66177c98c01c3fe4868d60997">I5bcf1</a>)</li> <li>Introduced an experimental api <code translate="no" dir="ltr">checkScrollableContainerConstraints()</code> which allows to check that we do not nest scrollable containers. You can use it when create your own scrollable lazy layouts via <code translate="no" dir="ltr">LazyLayout</code>. (<a href="https://android-review.googlesource.com/#/q/Id6fabde2877f20155be3d9642c2e74e0e7d4dab0">Id6fab</a>, <a href="https://issuetracker.google.com/issues/233352497">b/233352497</a>)</li> <li>Removed deprecated <code translate="no" dir="ltr">LazyVerticalGrid</code> from <code translate="no" dir="ltr">androidx.compose.foundation.lazy</code> package. The new stable api is located in <code translate="no" dir="ltr">androidx.compose.foundation.lazy.grid</code> (<a href="https://android-review.googlesource.com/#/q/I73c76e02e0b95692dbceeae372b1e15f33aa57d7">I73c76</a>, <a href="https://issuetracker.google.com/issues/225192009">b/225192009</a>)</li> </ul> <h3 id="1.2.0-beta03" data-text="Version 1.2.0-beta03" tabindex="-1">Version 1.2.0-beta03</h3> <p>June 1, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-beta03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-beta03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6266a22ad9adaed6fa88fe98aa8adaa46eb96ccc..7cbb37cc779160b89644d03e042c129d0ce025d2/compose/foundation">Version 1.2.0-beta03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added new experimental <code translate="no" dir="ltr">IntervalList</code> and <code translate="no" dir="ltr">MutableIntervalList</code>. It allows to represent some list of values via multiple intervals. It will be useful when you want to define your own dsl similar to the one used by <code translate="no" dir="ltr">LazyColumn</code> where list items can be defined via multiple item/items calls. (<a href="https://android-review.googlesource.com/#/q/I2d05e91646068eab522514024b483d88d77be309">I2d05e</a>, <a href="https://issuetracker.google.com/issues/228580728">b/228580728</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Clarified the documentation for <code translate="no" dir="ltr">WindowInsets.ime</code> to state that <code translate="no" dir="ltr">ime</code> insets are reported as far back as API 23, but only <em>animated</em> on 30+. (<a href="https://android-review.googlesource.com/#/q/Ia7fc002bde64074be7a176121483bff3017f24a8">Ia7fc0</a>, <a href="https://issuetracker.google.com/issues/230756508">b/230756508</a>)</li> <li>Pressing the forward delete key when the cursor is at the end of a text field will no longer crash.</li> <li><code translate="no" dir="ltr">DeleteSurroundingTextCommand</code> and <code translate="no" dir="ltr">DeleteSurroundingTextInCodePointsCommand</code> now require their constructor arguments to be non-negative. (<a href="https://android-review.googlesource.com/#/q/Ica8e66d221137a82ac8aaa59372decab096a6ef6">Ica8e6</a>, <a href="https://issuetracker.google.com/issues/199919707">b/199919707</a>)</li> </ul> <h3 id="1.2.0-beta02" data-text="Version 1.2.0-beta02" tabindex="-1">Version 1.2.0-beta02</h3> <p>May 18, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-beta02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-beta02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/eea19c54f6d94f1c234c4305c1329f7f1427867a..6266a22ad9adaed6fa88fe98aa8adaa46eb96ccc/compose/foundation">Version 1.2.0-beta02 contains these commits.</a></p> <ul> <li>Downloadable font resolution that does not change the layout size of Text or <code translate="no" dir="ltr">TextField</code> previously would not redraw, leading to stale font display. This bugfix ensures that text layout always triggers redraw (b/229727404). (<a href="https://android-review.googlesource.com/#/q/I1d49e9b977c234c9bc0317def7918d7821b321eb">I1d49e</a>, <a href="https://issuetracker.google.com/issues/229727404">b/229727404</a>)</li> </ul> <h3 id="1.2.0-beta01" data-text="Version 1.2.0-beta01" tabindex="-1">Version 1.2.0-beta01</h3> <p>May 11, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-beta01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-beta01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/41a4e31408842caa2b58db5e4ee6ec708464425f..eea19c54f6d94f1c234c4305c1329f7f1427867a/compose/foundation">Version 1.2.0-beta01 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>This is the first beta release of 1.2!</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Added experimental <code translate="no" dir="ltr">BeyondBoundsInterval</code> that can be used by custom implementations of <code translate="no" dir="ltr">LazyList</code> when they layout items beyond visible bounds (<a href="https://android-review.googlesource.com/#/q/Ifabfbd95ba53bad23ce73bdb74f816c7854222bf">Ifabfb</a>, <a href="https://issuetracker.google.com/issues/184670295">b/184670295</a>)</li> <li><code translate="no" dir="ltr">LineHeightBehavior</code> is renamed as <code translate="no" dir="ltr">LineHeightStyle</code></li> <li><code translate="no" dir="ltr">LineVerticalAlignment</code> is renamed as <code translate="no" dir="ltr">LineHeightStyle.Alignment</code></li> <li>Renames <code translate="no" dir="ltr">LineHeightTrim</code> is renamed as <code translate="no" dir="ltr">LineHeightStyle.Trim</code></li> <li>Default constructor values from <code translate="no" dir="ltr">LineHeightStyle</code> is removed (<a href="https://android-review.googlesource.com/#/q/I582bf09152d60b30362b3cce9bd60d57fc488fe7">I582bf</a>, <a href="https://issuetracker.google.com/issues/181155707">b/181155707</a>)</li> <li>Added default values for the optional members of <code translate="no" dir="ltr">LazyLayoutItemProvider</code> interface. (<a href="https://android-review.googlesource.com/#/q/Iba8a0196e68efce0afe0610a8b6e79fe3f02ee83">Iba8a0</a>)</li> <li>In the <code translate="no" dir="ltr">LazyLayoutItemProvider</code> api instead of a factory returning the composable lambda by index we now have a simpler composable function Item accepting the index. (<a href="https://android-review.googlesource.com/#/q/Id21962ddb1fd14b8946d89c948d4f1779dc8fc8c">Id2196</a>)</li> <li>LazyLayoutItemsProvider is renamed to LazyLayoutItemProvider (<a href="https://android-review.googlesource.com/#/q/I0638c931ced98a63b63bf7e2122f1a14dbe37cf0">I0638c</a>)</li> <li><code translate="no" dir="ltr">LazyLayoutItemsProvider.itemsCount</code> is renamed to <code translate="no" dir="ltr">itemCount</code> (<a href="https://android-review.googlesource.com/#/q/Id409c7afef79f35cc3e2ef019b9842c2ad507f58">Id409c</a>)</li> <li>Added Brush to <code translate="no" dir="ltr">TextStyle</code> and <code translate="no" dir="ltr">SpanStyle</code> to provide a way to draw text with gradient coloring. (<a href="https://android-review.googlesource.com/#/q/I538698c22f5a03b57ed811ea733dd1194deaaa6a">I53869</a>, <a href="https://issuetracker.google.com/issues/187839528">b/187839528</a>)</li> <li><code translate="no" dir="ltr">trimFirstLineTop</code>, <code translate="no" dir="ltr">trimLastLineBottom</code> attributes of <code translate="no" dir="ltr">LineHeightBehavior</code> changed into a single enum: <code translate="no" dir="ltr">LineHeightTrim</code>. <code translate="no" dir="ltr">LineHeightTrim</code> have values of 4 states defined by two booleans: <code translate="no" dir="ltr">FirstLineTop</code>, <code translate="no" dir="ltr">LastLineBottom</code>, Both and None (<a href="https://android-review.googlesource.com/#/q/Ifc6a5912eab7a0e41ae6cd4045ea9cbdf3c0a146">Ifc6a5</a>, <a href="https://issuetracker.google.com/issues/181155707">b/181155707</a>)</li> <li><p>Added <code translate="no" dir="ltr">LineHeightBehavior</code> to the <code translate="no" dir="ltr">TextStyle</code> and <code translate="no" dir="ltr">ParagraphStyle. LineHeightBehavior</code> controls whether line height is applied to the top of the first line and to the bottom of the last line. It also defines the alignment of line in the space provided by <code translate="no" dir="ltr">TextStyle</code>(<code translate="no" dir="ltr">lineHeight</code>).</p> <p>For example it is possible to get a behavior similar to what CSS defines via <code translate="no" dir="ltr">LineHeightBehavior(alignment = LineVerticalAlignment.Center, trimFirstLineTop=false, trimLastLineBottom = false)</code>.</p></li> <li><p><code translate="no" dir="ltr">trimFirstLineTop</code>, <code translate="no" dir="ltr">trimLastLineBottom</code> configurations works correctly only when <code translate="no" dir="ltr">includeFontPadding</code> is false. (<a href="https://android-review.googlesource.com/#/q/I973329a540ca9f5a6e225f1e5aaffeaa1ff9cc61">I97332</a>, <a href="https://issuetracker.google.com/issues/181155707">b/181155707</a>)</p></li> <li><p>Added experimental <code translate="no" dir="ltr">imeNestedScroll()</code> modifier so that developers can control the IME through scrolling. (<a href="https://android-review.googlesource.com/#/q/I6075942f67d2fbbdde97e5ce58f6fc871e51b7bc">I60759</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed regression where text fields would not hide the keyboard when removed from the composition while focused. (<a href="https://android-review.googlesource.com/#/q/I7a41031f5fb257200cf9958fe0d2a64af2519c9a">I7a410</a>, <a href="https://issuetracker.google.com/issues/230536793">b/230536793</a>, <a href="https://issuetracker.google.com/issues/225541817">b/225541817</a>)</li> <li>Support ellipsis when height is limited and doesn't fit all text lines (<a href="https://android-review.googlesource.com/#/q/Ie528c603d4c76c31ea71524a8381000d43d1cf42">Ie528c</a>, <a href="https://issuetracker.google.com/issues/168720622">b/168720622</a>)</li> <li><code translate="no" dir="ltr">BringIntoViewRequester.bringIntoView</code> will now always suspend until the request is either completed or was interrupted by a newer, non-overlapping request. Overlapping requests will be queued. (<a href="https://android-review.googlesource.com/#/q/I43e7f73af86615f08e2d2d05bfd05ac96d0c65e4">I43e7f</a>, <a href="https://issuetracker.google.com/issues/216790855">b/216790855</a>)</li> <li>Concurrent <code translate="no" dir="ltr">BringIntoViewRequester.bringIntoView</code> calls for rectangles that are completely overlapping will now only honor the larger rectangle's request. (<a href="https://android-review.googlesource.com/#/q/I34be70f23527e4fea694fd5266bbc127cc1d1b0b">I34be7</a>, <a href="https://issuetracker.google.com/issues/216790855">b/216790855</a>, <a href="https://issuetracker.google.com/issues/184760918">b/184760918</a>)</li> <li>Turned on default <code translate="no" dir="ltr">includeFontPadding</code>. It is possible to turn off the <code translate="no" dir="ltr">includeFontPadding</code> using <code translate="no" dir="ltr">TextStyle.platformTextStyle</code> attribute. In the near future we will change the default behavior however until that time this allows us to better integrate line height improvements (aosp/2058653) and solve <code translate="no" dir="ltr">TextField</code> clipping issues. (<a href="https://android-review.googlesource.com/#/q/I01423d9a0042a1f3e462236e1fdadb60a20678fc">I01423</a>, <a href="https://issuetracker.google.com/issues/171394808">b/171394808</a>)</li> <li><code translate="no" dir="ltr">Modifier.bringIntoViewRequester</code> no longer uses <code translate="no" dir="ltr">onGloballyPositioned</code>. (<a href="https://android-review.googlesource.com/#/q/I630f552bc59f31e91852aeaf3345216bb1f8c403">I630f5</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li><code translate="no" dir="ltr">MouseInjectionScope.scroll(delta = someDelta)</code> is now inverted on Android if we scroll vertically (if someDelta is positive, it will scroll downward) (<a href="https://android-review.googlesource.com/#/q/Ifb697a9ae8bc05a2d54d0a6cb4018713e156baf8">Ifb697</a>, <a href="https://issuetracker.google.com/issues/224992993">b/224992993</a>)</li> </ul> <h3 id="1.2.0-alpha08" data-text="Version 1.2.0-alpha08" tabindex="-1">Version 1.2.0-alpha08</h3> <p>April 20, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-alpha08</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-alpha08</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7ca43e00a517eaeeedc0a21f482b17f06e3d2181..41a4e31408842caa2b58db5e4ee6ec708464425f/compose/foundation">Version 1.2.0-alpha08 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Display all available weights for systems fonts on Android when using <code translate="no" dir="ltr">FontFamily.SansSerif</code>. This will use fallback font names like sans-serif-medium internally on API 21-28. This is a behavior change as previously only weights 400 and 700 were supported on API 21-28. (<a href="https://android-review.googlesource.com/#/q/I380fecb5ba839eecbf0b08acbca6247082b605d7">I380fe</a>, <a href="https://issuetracker.google.com/issues/156048036">b/156048036</a>, <a href="https://issuetracker.google.com/issues/226441992">b/226441992</a>)</li> <li>Paragraph and MultiParagraph are now accepting Constraints parameter. Passing <code translate="no" dir="ltr">Constraints.maxHeight</code> is a no-op at the moment but will allow to do some calculation in the future, like ellipsizing based on the height. (<a href="https://android-review.googlesource.com/#/q/I6afeecb15d34ade2e82cad0381018f0736a167c1">I6afee</a>, <a href="https://issuetracker.google.com/issues/168720622">b/168720622</a>)</li> <li><code translate="no" dir="ltr">SubcomposeSlotReusePolicy.getSlotsToRetain()</code> now accepts a custom MutableSet-like class which doesn't allow adding new items in it. (<a href="https://android-review.googlesource.com/#/q/Icd314177f35c2ba05d1042454ca47834cf196e10">Icd314</a>)</li> <li>Partial consumption (down OR position) has been deprecated in <code translate="no" dir="ltr">PointerInputChange</code>. You can use <code translate="no" dir="ltr">consume()</code> to consume the change completely. You can use <code translate="no" dir="ltr">isConsumed</code> to determine whether or not someone else has previously consumed the change.</li> <li><code translate="no" dir="ltr">PointerInputChange::copy()</code> now always makes a shallow copy. It means that copies of <code translate="no" dir="ltr">PointerInputChange</code> will be consumed once one of the copies is consumed. If you want to create an unbound <code translate="no" dir="ltr">PointerInputChange</code>, use constructor instead. (<a href="https://android-review.googlesource.com/#/q/Ie6be471e6ed2a843e38712922c2231fdfd26213a">Ie6be4</a>, <a href="https://issuetracker.google.com/issues/225669674">b/225669674</a>)</li> <li>New experimental <code translate="no" dir="ltr">LazyLayout</code> API is introduced. This allows you to build your own components like <code translate="no" dir="ltr">LazyColumn</code> of <code translate="no" dir="ltr">LazyVerticalGrid</code>. Note that the API is in its early stages and can be changed in the future releases. (<a href="https://android-review.googlesource.com/#/q/Iba2bcf7e48fb1693c61e9e0b93e0a9e97f9ecf8c">Iba2bc</a>, <a href="https://issuetracker.google.com/issues/166591700">b/166591700</a>)</li> <li><code translate="no" dir="ltr">AndroidFont</code> now takes <code translate="no" dir="ltr">typefaceLoader</code> as a constructor parameter. (<a href="https://android-review.googlesource.com/#/q/I2c9718fa02b6f84813e5d5cdb499c89b355b0b4b">I2c971</a>)</li> <li><code translate="no" dir="ltr">WindowInsets</code> companion now exposes the visibility (whether they are on the screen, regardless of whether they intersect with the window) and the size they could be if they are available on the device, but not currently active. (<a href="https://android-review.googlesource.com/#/q/I65182e3c8cdc868b9f6de3aef403c9f4d5074711">I65182</a>, <a href="https://issuetracker.google.com/issues/217770337">b/217770337</a>)</li> </ul> <h3 id="1.2.0-alpha07" data-text="Version 1.2.0-alpha07" tabindex="-1">Version 1.2.0-alpha07</h3> <p>April 6, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-alpha07</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-alpha07</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5ef5671233460b844828e14a816255dbf7904868..7ca43e00a517eaeeedc0a21f482b17f06e3d2181/compose/foundation">Version 1.2.0-alpha07 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added a <code translate="no" dir="ltr">PinnableParent</code> API that allows children of lazy layouts to prevent the currently composed items from being disposed (<a href="https://android-review.googlesource.com/#/q/Ibbdd02b0d25db2e0de343d5d2278287ab1991831">Ibbdd0</a>, <a href="https://issuetracker.google.com/issues/184670295">b/184670295</a>)</li> <li><code translate="no" dir="ltr">LazyListLayoutInfo</code> and <code translate="no" dir="ltr">LazyGridLayoutInfo</code> now have <code translate="no" dir="ltr">beforeContentPadding</code> and <code translate="no" dir="ltr">afterContentPadding</code> fields (<a href="https://android-review.googlesource.com/#/q/I3b628e4f4fdfc27b7629c3ac1cd2b47375ff31f2">I3b628</a>, <a href="https://issuetracker.google.com/issues/200920410">b/200920410</a>)</li> <li>Added <code translate="no" dir="ltr">KeyboardType.Decimal</code> as an alternative to <code translate="no" dir="ltr">Keyboard.Number</code> for specifically including decimal separator in IME. (<a href="https://android-review.googlesource.com/#/q/Iec4c84be81e72f8eaf136f2df23f9d12567cc3dc">Iec4c8</a>, <a href="https://issuetracker.google.com/issues/209835363">b/209835363</a>)</li> <li>Add new font descriptor Font(DeviceFontFamilyName) to optionally lookup system-installed fonts during font fallback chains. (<a href="https://android-review.googlesource.com/#/q/I30468e48564fb9891e17cbee8bdb4026df0daf89">I30468</a>, <a href="https://issuetracker.google.com/issues/219754572">b/219754572</a>)</li> <li><code translate="no" dir="ltr">PointerEventType.Scroll</code> and <code translate="no" dir="ltr">PointerEvent.scrollDelta</code> are stable APIs now (<a href="https://android-review.googlesource.com/#/q/I574c579abec9e26dfc16ae00014faab8627bd688">I574c5</a>, <a href="https://issuetracker.google.com/issues/225669674">b/225669674</a>)</li> <li>Added temporary compatibility configuration for <code translate="no" dir="ltr">includeFontPadding</code> in <code translate="no" dir="ltr">TextStyle/ParagraphStyle. includeFontPadding</code> can be changed via <code translate="no" dir="ltr">TextStyle(platformStyle = PlatformTextStyle(includeFontPadding = true/false))</code>. This is a temporary configuration option to enable migration and will be removed. (<a href="https://android-review.googlesource.com/#/q/If47be074f53de9ccf12af114648b21e25722d166">If47be</a>, <a href="https://issuetracker.google.com/issues/171394808">b/171394808</a>)</li> <li>Updated <code translate="no" dir="ltr">FontFamily.Resolver</code> to integrate System-wide bold text accessibility setting (<a href="https://android-review.googlesource.com/#/q/I6c1e77e9cc8d1ce353d129d8a233271db0139a07">I6c1e7</a>)</li> <li>The <code translate="no" dir="ltr">consumeWindowInsets</code> extension property of <code translate="no" dir="ltr">ComposeView</code> allows developers to disable consumption of Android WindowInsets. This allows separate <code translate="no" dir="ltr">ComposeViews</code> in the hierarchy to each apply <code translate="no" dir="ltr">WindowInsets</code> without interfering with each other. (<a href="https://android-review.googlesource.com/#/q/I0ef08ca81d808408edb932f9326125f99da25bd0">I0ef08</a>, <a href="https://issuetracker.google.com/issues/220943142">b/220943142</a>)</li> </ul> <h3 id="1.2.0-alpha06" data-text="Version 1.2.0-alpha06" tabindex="-1">Version 1.2.0-alpha06</h3> <p>March 23, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-alpha06</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-alpha06</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/33cb12e8aba043a05b40470a5ef3be1b35114fd5..5ef5671233460b844828e14a816255dbf7904868/compose/foundation">Version 1.2.0-alpha06 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">RequestFocus</code> semantics action to request focus on the focusable target. (<a href="https://android-review.googlesource.com/#/q/I17b71a13ca810f3ead1b7b87245b31b8e5b28f91">I17b71</a>)</li> <li><code translate="no" dir="ltr">FocusOrder</code> has now been merged into <code translate="no" dir="ltr">FocusProperties</code> and <code translate="no" dir="ltr">focusProperties()</code> now has all the capabilities of <code translate="no" dir="ltr">focusOrder()</code>. <code translate="no" dir="ltr">FocusOrder</code> and <code translate="no" dir="ltr">focusOrder()</code> have been deprecated. <code translate="no" dir="ltr">focusOrder()</code> that accepts a <code translate="no" dir="ltr">focusRequester</code> should be replaced with a <code translate="no" dir="ltr">focusRequester()</code> modifier in combination with <code translate="no" dir="ltr">focusProperties()</code>. This allows the modifiers to have a stronger separation of concerns. (<a href="https://android-review.googlesource.com/#/q/I601b751755bcfefd849c8a0c0d019e3eaf5d459c">I601b7</a>)</li> <li><code translate="no" dir="ltr">WindowInsets.asPaddingValues(Density)</code> was added to allow developers to do the conversion without needing to be in composition. (<a href="https://android-review.googlesource.com/#/q/I94c353356d8550e56ca297be5c44a26b3a99b34a">I94c35</a>)</li> <li>Updated parsing of vector drawables to support auto mirroring to flip the content of a <code translate="no" dir="ltr">VectorPainter</code> if the current layout direction is RTL. (<a href="https://android-review.googlesource.com/#/q/I79cd946811e9b06ff4186180c4f8eaa0dcdbc879">I79cd9</a>, <a href="https://issuetracker.google.com/issues/185760237">b/185760237</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Scroll modifiers (<code translate="no" dir="ltr">Modifier.verticalScroll()</code>,<code translate="no" dir="ltr">Modifier.horizontalScroll()</code>, and <code translate="no" dir="ltr">Modifier.scrollable()</code>) will now scroll to keep the focused composable visible if the scroll area is resized and the focused composable was previously visible.</li> <li>TextFields will now be kept above the keyboard when they are focused and the keyboard is shown, when inside a non-lazy scrollable and the soft input mode is <code translate="no" dir="ltr">ADJUST_RESIZE</code>. (<a href="https://android-review.googlesource.com/#/q/I4a485a1c80aa2d500dcd55e916006903ff45da95">I4a485</a>, <a href="https://issuetracker.google.com/issues/190539358">b/190539358</a>, <a href="https://issuetracker.google.com/issues/192043120">b/192043120</a>, <a href="https://issuetracker.google.com/issues/216842427">b/216842427</a>)</li> </ul> <h3 id="1.2.0-alpha05" data-text="Version 1.2.0-alpha05" tabindex="-1">Version 1.2.0-alpha05</h3> <p>March 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-alpha05</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-alpha05</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9b2b3d8efd5f00bd4af903bbaa926f6a712d0bd8..33cb12e8aba043a05b40470a5ef3be1b35114fd5/compose/foundation">Version 1.2.0-alpha05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">LazyVerticalGrid</code> and <code translate="no" dir="ltr">LazyHorizontalGrid</code> are now stable. (<a href="https://android-review.googlesource.com/#/q/I307c0ce412c7bc762e334e429013c0442bd22fde">I307c0</a>)</li> <li><code translate="no" dir="ltr">LazyGridItemInfo.Unknown</code> was replaced with separate <code translate="no" dir="ltr">LazyGridItemInfo.UnknownRow</code> and <code translate="no" dir="ltr">LazyGridItemInfo.UnknownColumn</code> (<a href="https://android-review.googlesource.com/#/q/I56d512212459f408a00cff1601d010f72184102d">I56d51</a>)</li> <li><code translate="no" dir="ltr">LazyVerticalGrid</code>/<code translate="no" dir="ltr">LazyHorizontalGrid</code> and all related apis were moved into <code translate="no" dir="ltr">.grid</code> subpackage. Please update your imports from <code translate="no" dir="ltr">androidx.compose.foundation.lazy</code> to <code translate="no" dir="ltr">androidx.compose.foundation.lazy.grid</code>. (<a href="https://android-review.googlesource.com/#/q/I2d446e0bed6f27f0394b7dcab1152301e3404b0f">I2d446</a>, <a href="https://issuetracker.google.com/issues/219942574">b/219942574</a>)</li> <li>Text: <code translate="no" dir="ltr">includeFontPadding</code> is now turned off by default. The clipping issues as a result of <code translate="no" dir="ltr">includeFontPadding=false</code> is handled and no clipping should occur for tall scripts. (<a href="https://android-review.googlesource.com/#/q/I31c84166ae5241fea3f49e8f293dd9d8a5d712cb">I31c84</a>, <a href="https://issuetracker.google.com/issues/171394808">b/171394808</a>)</li> <li>Measured interface now exposes parentData property (<a href="https://android-review.googlesource.com/#/q/I3313f74c5eb4a75b91cb9d438c6691117b152a7d">I3313f</a>)</li> <li>Introduced experimental <code translate="no" dir="ltr">Modifier.onFocusedBoundsChanged</code> to allow observing the bounds of child focusables. (<a href="https://android-review.googlesource.com/#/q/I14283393b5273527ab65f4aa1a2d4383321b0d95">I14283</a>, <a href="https://issuetracker.google.com/issues/220030968">b/220030968</a>, <a href="https://issuetracker.google.com/issues/190539358">b/190539358</a>, <a href="https://issuetracker.google.com/issues/192043120">b/192043120</a>, <a href="https://issuetracker.google.com/issues/216842427">b/216842427</a>)</li> <li>LazyHorizontalGrid was added. (<a href="https://android-review.googlesource.com/#/q/I61ae7abe269fdb3776c301dd5c233762f9766f4d">I61ae7</a>, <a href="https://issuetracker.google.com/issues/191238807">b/191238807</a>)</li> <li>Added a new <code translate="no" dir="ltr">LazyVerticalGrid</code> API to define cross axis sizes (<a href="https://android-review.googlesource.com/#/q/I17723fdc6302a345dd643fb637e1644168a2a321">I17723</a>)</li> <li>Added FocusGroup modifier (<a href="https://android-review.googlesource.com/#/q/I64bc0b945bf172ad37b64d011d7055f4a99bfeca">I64bc0</a>, <a href="https://issuetracker.google.com/issues/213508274">b/213508274</a>, <a href="https://issuetracker.google.com/issues/184670295">b/184670295</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">WindowInsets.toString()</code> will now show the correct values. (<a href="https://android-review.googlesource.com/#/q/I1585d12df9b15b616ede0bda7db39a2cc4ead3d3">I1585d</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Updated to use Kotlinx coroutines 1.6.0 (<a href="https://android-review.googlesource.com/#/q/I3366d5111b2fb830d619da5402c12ea4c929391a">I3366d</a>)</li> </ul> <h3 id="1.2.0-alpha04" data-text="Version 1.2.0-alpha04" tabindex="-1">Version 1.2.0-alpha04</h3> <p>February 23, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-alpha04</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-alpha04</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/db2ecbef194afcddfaede22e1d884a8959a9277c..9b2b3d8efd5f00bd4af903bbaa926f6a712d0bd8/compose/foundation">Version 1.2.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">BringIntoViewResponders</code> are no longer required to manually pass requests up to parent responders, and are instead required to immediately return the rectangle they want their parent to bring into view. (<a href="https://android-review.googlesource.com/#/q/I8e66acfde483dd1a3b67dbf37cc815967eae746a">I8e66a</a>)</li> <li>Support async font loading in Text (<a href="https://android-review.googlesource.com/#/q/I77057da6e45e78bea9622f480343c32d0bb25ce3">I77057</a>, <a href="https://issuetracker.google.com/issues/214587005">b/214587005</a>)</li> <li><code translate="no" dir="ltr">LazyVerticalGrid</code> now supports <code translate="no" dir="ltr">line breaking</code> before items with span not fitting inside the current line. (<a href="https://android-review.googlesource.com/#/q/I05c405c9ccf81fb1682a8f84eb36481d3b13ceea">I05c40</a>, <a href="https://issuetracker.google.com/issues/207462103">b/207462103</a>)</li> <li>Renamed <code translate="no" dir="ltr">excludeFromSystemGestures</code> to <code translate="no" dir="ltr">systemGesturesExclusion</code> (<a href="https://android-review.googlesource.com/#/q/I19526f6c1f89946c5ec433f477c65ff41ec3b10d">I19526</a>)</li> <li><code translate="no" dir="ltr">LazyVerticalGrid</code> now supports reverseLayout. (<a href="https://android-review.googlesource.com/#/q/I6d7d7057318b873fc22b78a212480e1205ccb8c0">I6d7d7</a>, <a href="https://issuetracker.google.com/issues/215572963">b/215572963</a>, <a href="https://issuetracker.google.com/issues/211753558">b/211753558</a>)</li> <li>Add <code translate="no" dir="ltr">WindowInsets.only()</code> method to allow developers to include only dimensions from the WindowInsets. (<a href="https://android-review.googlesource.com/#/q/I14c94c017d0b7a31f5fc3248f478d5331332d18f">I14c94</a>, <a href="https://issuetracker.google.com/issues/217768486">b/217768486</a>)</li> <li><p>Added <code translate="no" dir="ltr">ComposableTarget</code>, <code translate="no" dir="ltr">ComposableTargetMarker</code> and <code translate="no" dir="ltr">ComposableOpenTarget</code> that allows compile time reporting of when a composable function is called targeting an applier it was not designed to use.</p> <p>In most cases the annotations can be inferred by the compose compiler plugin so using these annotation directly should be rare . The cases that cannot be inferred include creating and using a custom applier, abstract composable functions (such as interface methods), fields or global variables that are composable lambdas (local variables and parameters are inferred), or when using <code translate="no" dir="ltr">ComposeNode</code> or a related composable functions.</p> <p>For custom appliers the composable functions that calls <code translate="no" dir="ltr">ComposeNode</code> or <code translate="no" dir="ltr">ReusableComposeNode</code> need to add a <code translate="no" dir="ltr">CompoableTarget</code> annotation for the function and any composable lambda parameter types. It is recommended, however, to create an annotation that is annotated with <code translate="no" dir="ltr">ComposableTargetMarker</code> and then the marked annotation be used instead of <code translate="no" dir="ltr">ComposableTarget</code> directly. A composable annotation marked with <code translate="no" dir="ltr">ComposableTargetMarker</code> is equivalent to a <code translate="no" dir="ltr">ComposbleTarget</code> with the fully qualified name of the attribute class as the applier parameter. For an example of using <code translate="no" dir="ltr">ComposableTargetMarker</code> see <code translate="no" dir="ltr">anroidx.compose.ui.UiComposable</code>. (<a href="https://android-review.googlesource.com/#/q/I38f11b789291db89fc0bb92fc14ac5b3fcba0283">I38f11</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Now it is allowed to pass negative scroll offsets into <code translate="no" dir="ltr">LazyGridState.scrollToItem()</code> and <code translate="no" dir="ltr">LazyGridState.animateScrollToItem()</code>. (<a href="https://android-review.googlesource.com/#/q/I025c608ce2eef36f90ad657bba78229b62bcd725">I025c6</a>, <a href="https://issuetracker.google.com/issues/211753558">b/211753558</a>)</li> <li>Support async font loading for TextField. (<a href="https://android-review.googlesource.com/#/q/Icc4bf288dde6406b470c700dc760a9d99bdc0971">Icc4bf</a>, <a href="https://issuetracker.google.com/issues/214587005">b/214587005</a>)</li> </ul> <h3 id="1.2.0-alpha03" data-text="Version 1.2.0-alpha03" tabindex="-1">Version 1.2.0-alpha03</h3> <p>February 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-alpha03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-alpha03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9dceceb54300ed028a7e8fc7a3454f270337ffde..db2ecbef194afcddfaede22e1d884a8959a9277c/compose/foundation">Version 1.2.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">notifyFocusedRect</code> methods in <code translate="no" dir="ltr">TextInputSession</code> and <code translate="no" dir="ltr">TextInputService</code> are now deprecated and won't be called. Use <code translate="no" dir="ltr">BringIntoViewRequester</code> instead. (<a href="https://android-review.googlesource.com/#/q/Ia4302c5f6ee79eec30a9f42c149da8775e1ed57e">Ia4302</a>, <a href="https://issuetracker.google.com/issues/192043120">b/192043120</a>, <a href="https://issuetracker.google.com/issues/216842427">b/216842427</a>, <a href="https://issuetracker.google.com/issues/178211874">b/178211874</a>)</li> <li>Animations were enabled for items of lazy grids with Modifier.animateItemPlacement(). (<a href="https://android-review.googlesource.com/#/q/Ib66210f8959214b5f94fd1fcc49100294cd0e2d6">Ib6621</a>, <a href="https://issuetracker.google.com/issues/211753218">b/211753218</a>)</li> <li><code translate="no" dir="ltr">BringIntoViewRequester</code> now propagates requests to the hosting Android View. (<a href="https://android-review.googlesource.com/#/q/Ia7a5163a1eeb3e9d2f1623fa280f33cb98d4fb6d">Ia7a51</a>)</li> <li><code translate="no" dir="ltr">FontFamilyResolver</code> is now available via <code translate="no" dir="ltr">LocalFontFamilyResolver.current</code> <ul> <li>Added <code translate="no" dir="ltr">createFontFamilyResolver(context)</code> and <code translate="no" dir="ltr">createFontFamilyResolver(context, coroutineScope)</code> to create new FontFamily resolvers outside of compose usage.</li> <li>Paragraph and MultiParagraph now take <code translate="no" dir="ltr">FontFamily.Resolver</code></li> <li><code translate="no" dir="ltr">TextLayoutResult.layoutInput.fontFamilyResolver</code> now contains the resolver used for this layout, deprecated <code translate="no" dir="ltr">TextLayoutResult.layoutInput.resourceLoader</code> as it is no longer used. (<a href="https://android-review.googlesource.com/#/q/Id5a45c72bb6f33910643ee3da7f81a78dc093d86">Id5a45</a>, <a href="https://issuetracker.google.com/issues/174162090">b/174162090</a>)</li> </ul></li> <li>Added <code translate="no" dir="ltr">AndroidFont</code>, a new low-level API for providing new types of font resource descriptors on Android. For example, loading fonts from an app-specific backend, optionally locating pre-installed fonts on-device, or loading a font from a resource not provided by the current Font factories. <ul> <li>Expanded <code translate="no" dir="ltr">Font.ResourceLoaded</code> API to support optional and async font loading. It is not recommended that application developers use this API directly. To add new types of fonts see AndroidFont.</li> <li><code translate="no" dir="ltr">Font.AndroidResourceLoader</code> extension function allows construction of a <code translate="no" dir="ltr">Font.ResourceLoader</code> when outside of composition.</li> <li>Added <code translate="no" dir="ltr">loadingStrategy</code> parameter to resource-based fonts, to allow async loading when resource font references downloadable fonts XML. (<a href="https://android-review.googlesource.com/#/q/Ie5aeadd2feaf996d2c826d87dd310b8984e106c8">Ie5aea</a>, <a href="https://issuetracker.google.com/issues/174162090">b/174162090</a>)</li> </ul></li> <li><code translate="no" dir="ltr">Typeface(FontFamily)</code> constructor is deprecated. This was previously used to preload fonts, which may take up to 10 seconds for downloadable fonts. With downloadable fonts, this call may block for 10 seconds. Instead use <code translate="no" dir="ltr">FontFamilyResolver.preload</code> <ul> <li><code translate="no" dir="ltr">fontResource(FontFamily): Typeface</code> is deprecated. This was previously used to preload fonts, which may take up to 10 seconds for downloadable fonts. Instead use <code translate="no" dir="ltr">FontFamilyResolver.preload</code> (<a href="https://android-review.googlesource.com/#/q/If8e7c6ce7cd64be8094a576587cc1329e19d246f">If8e7c</a>, <a href="https://issuetracker.google.com/issues/174162090">b/174162090</a>)</li> </ul></li> <li>You can now specify the content type for the items of <code translate="no" dir="ltr">LazyVerticalGrid</code> - item/items functions on <code translate="no" dir="ltr">LazyGridScope</code> now accept such parameter. Providing such information helps item composition reusing logic to make it more efficiently and only reuse the content between the items of similar type. (<a href="https://android-review.googlesource.com/#/q/I7b3550cf626b6ef6f65029b1e55465266bfacb18">I7b355</a>, <a href="https://issuetracker.google.com/issues/215372836">b/215372836</a>)</li> <li><code translate="no" dir="ltr">LazyListLayoutInfo</code> and <code translate="no" dir="ltr">LazyGridLayoutInfo</code> now have new properties: <code translate="no" dir="ltr">viewportSize</code>, <code translate="no" dir="ltr">orientation</code>, <code translate="no" dir="ltr">reverseLayout</code> (<a href="https://android-review.googlesource.com/#/q/Ifc8ed6a22fa14fecb3f6910ef86caa5345e6d5e4">Ifc8ed</a>, <a href="https://issuetracker.google.com/issues/200920410">b/200920410</a>)</li> <li>You can now specify the content type for the items of LazyColumn/LazyRow - item/items functions on LazyListScope now accept such parameter. Providing such information helps item composition reusing logic to make it more efficiently and only reuse the content between the items of similar type. (<a href="https://android-review.googlesource.com/#/q/I26506a2b3d0049be6ff4decf295e183c5d2b8fc3">I26506</a>)</li> <li><code translate="no" dir="ltr">SubcomposeLayoutState</code> constructor accepting <code translate="no" dir="ltr">maxSlotsToRetainForReuse</code> is now deprecated. Instead there is a new constructor accepting <code translate="no" dir="ltr">SubcomposeSlotReusePolicy</code> - a new interface allowing more granular control on what slots should be retained for the future reuse. (<a href="https://android-review.googlesource.com/#/q/I52c4d0360cd987ce03504807312beabdbe410ab0">I52c4d</a>)</li> <li>Adds Modifiers for WindowInsets, both for padding and sizing. This allows some content to extend into the inset area, and still have primary content stay out of the inset area. For example, windowInsetsPadding can be used to pad the content area to avoid areas that may be fully or partially covered. (<a href="https://android-review.googlesource.com/#/q/Id0395142409b981e92f94fb46ebf1c2ec2540048">Id0395</a>, <a href="https://issuetracker.google.com/issues/213942085">b/213942085</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>TextFields will now be kept above the keyboard when they are focused and the keyboard is shown, when the soft input mode is <code translate="no" dir="ltr">ADJUST_PAN</code>. (<a href="https://android-review.googlesource.com/#/q/I8eaebb684b7828dcf92b0678a86d796b49b349c8">I8eaeb</a>, <a href="https://issuetracker.google.com/issues/190539358">b/190539358</a>, <a href="https://issuetracker.google.com/issues/192043120">b/192043120</a>)</li> <li>Desktop uses composition local for <code translate="no" dir="ltr">FontFamily.Resolver</code> <ul> <li>Desktop <code translate="no" dir="ltr">FontLoader</code> is deprecated</li> <li>New <code translate="no" dir="ltr">createFontFamilyResolver</code> factory on Desktop (<a href="https://android-review.googlesource.com/#/q/I6bbbb76ece4ca3844f07e2fc22c2e63478bfdd8c">I6bbbb</a>, <a href="https://issuetracker.google.com/issues/174162090">b/174162090</a>)</li> </ul></li> <li>The soft keyboard input type no longer flickers when changing focus between text fields. (<a href="https://android-review.googlesource.com/#/q/I1bf50cacddd8e20f9bd3d5124f277e5fef467ac0">I1bf50</a>, <a href="https://issuetracker.google.com/issues/187746439">b/187746439</a>)</li> <li>Text fields no longer require an extra back press when the cursor handle is showing. (<a href="https://android-review.googlesource.com/#/q/Ideb4bafc9e7ada3faf16310d96ae4abf0caca734">Ideb4b</a>, <a href="https://issuetracker.google.com/issues/205726883">b/205726883</a>)</li> <li>Text selection magnifier behavior has been polished to match the platform magnifier. (<a href="https://android-review.googlesource.com/#/q/Idd918c3b321e8d7626e47a027e0b19640085a2fa">Idd918</a>, <a href="https://issuetracker.google.com/issues/206833278">b/206833278</a>)</li> </ul> <h3 id="1.2.0-alpha02" data-text="Version 1.2.0-alpha02" tabindex="-1">Version 1.2.0-alpha02</h3> <p>January 26, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-alpha02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-alpha02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f09f3e0f47cacc65a631115deac08ee8cc132ceb..9dceceb54300ed028a7e8fc7a3454f270337ffde/compose/foundation">Version 1.2.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">NonRestartableComposable</code> to methods that are overloads of existing methods without complex logic. This reduces compiler generated memoization checks (equals) for all parameters which are repeated in the inner function that is called. (<a href="https://android-review.googlesource.com/#/q/I90490b1a28bada20840ab59e47245c00c6253d11">I90490</a>)</li> <li>Added <code translate="no" dir="ltr">excludeFromSystemGesture</code> Modifiers for easy access to Android's <code translate="no" dir="ltr">setSystemGestureExclusionRects</code> (<a href="https://android-review.googlesource.com/#/q/I46f0768d06c645f23bba4d056448686976e74fca">I46f07</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Text selection magnifier behavior has been polished to match the platform magnifier. (<a href="https://android-review.googlesource.com/#/q/Idd918c3b321e8d7626e47a027e0b19640085a2fa">Idd918</a>, <a href="https://issuetracker.google.com/issues/206833278">b/206833278</a>)</li> <li><code translate="no" dir="ltr">LazyColumn</code>, <code translate="no" dir="ltr">LazyRow</code>, <code translate="no" dir="ltr">Modifier.verticalScroll</code> and other containers that use <code translate="no" dir="ltr">Modifier.scrollable</code> now support mouse wheel scrolling. (<a href="https://android-review.googlesource.com/#/q/I2b5e15f480a26878e8dc8727e34d6e7ec660e564">I2b5e1</a>, <a href="https://issuetracker.google.com/issues/198214718">b/198214718</a>)</li> </ul> <h3 id="1.2.0-alpha01" data-text="Version 1.2.0-alpha01" tabindex="-1">Version 1.2.0-alpha01</h3> <p>January 12, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.2.0-alpha01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.2.0-alpha01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8b1e748d80de10c087ce57eaaa93cd209cccebad..f09f3e0f47cacc65a631115deac08ee8cc132ceb/compose/foundation">Version 1.2.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>New parameter <code translate="no" dir="ltr">userScrollEnabled</code> was added to <code translate="no" dir="ltr">LazyColumn</code>, <code translate="no" dir="ltr">LazyRow</code>, and <code translate="no" dir="ltr">LazyVerticalGrid</code> in order to allow users to temporarily or permanently disable the user initiated scroll via touch gestures or accessibility actions. Scrolling programmatically via the methods on the state will still be allowed. (<a href="https://android-review.googlesource.com/#/q/I7eae94b090ffc56269faea51ce84fe36b0ba9ae5">I7eae9</a>, <a href="https://issuetracker.google.com/issues/201150093">b/201150093</a>)</li> <li>Add <code translate="no" dir="ltr">onSizeChanged</code> callback to magnifier modifier. (<a href="https://android-review.googlesource.com/#/q/I6879fe3b66f9bfa66abf8401159dc31753f40e9a">I6879f</a>)</li> <li>The magnifier widget now shows when dragging selection handles in a <code translate="no" dir="ltr">SelectionContainer</code>. (<a href="https://android-review.googlesource.com/#/q/I30b386701480c51bf711c5d9936e7a5e6b7b5a71">I30b38</a>, <a href="https://issuetracker.google.com/issues/139320979">b/139320979</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixes <code translate="no" dir="ltr">TextField</code> cursor handle not hiding when scrolled out of view. (<a href="https://android-review.googlesource.com/#/q/I145524fd69aa0b27ba572a1b6239d268a6fa5654">I14552</a>, <a href="https://issuetracker.google.com/issues/208883748">b/208883748</a>)</li> </ul> <p><strong>Dependency Updates</strong></p> <ul> <li>Now depends on Kotlin <code translate="no" dir="ltr">1.6.10</code>.</li> </ul> <h2 id="version_11_2" data-text="Version 1.1" tabindex="-1">Version 1.1</h2> <h3 id="1.1.1" data-text="Version 1.1.1" tabindex="-1">Version 1.1.1</h3> <p>February 23, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.1</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.1</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f9e9589a03c4b53f4401cc0cb8f763526fb885c7..564504df2d2c03ea9d48f868e09764418772a8a7/compose/foundation">Version 1.1.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix <code translate="no" dir="ltr">NullPointerException</code> at <code translate="no" dir="ltr">androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList</code> (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1947059">aosp/1947059</a>, <a href="https://issuetracker.google.com/issues/206677462">b/206677462</a>)</li> <li>Fix crash caused by clipboard content while reading from clipboard on Android. (<a href="https://android-review.googlesource.com/#/q/I0602066750e3fce55deceb709f8c04ee9a71dabf">I06020</a>, <a href="https://issuetracker.google.com/issues/197769306">b/197769306</a>)</li> <li>Fixed RTL in <code translate="no" dir="ltr">LazyVerticalGrid</code> (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1931080">aosp/1931080</a>, <a href="https://issuetracker.google.com/issues/207510535">b/207510535</a>)</li> </ul> <h3 id="1.1.0" data-text="Version 1.1.0" tabindex="-1">Version 1.1.0</h3> <p>February 9, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/0310f2e9c177573a16c2d594fffabaada9b446ea..f9e9589a03c4b53f4401cc0cb8f763526fb885c7/compose/foundation">Version 1.1.0 contains these commits.</a></p> <p><strong>Important changes since 1.0.0</strong></p> <ul> <li>Stable support for the Android 12 <a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1795727/">Overscroll effect</a></li> <li>Improvements to touch target sizing</li> <li>Note that, with respect to Compose 1.0, Material components will expand their layout space to meet Material <a href="https://material.io/design/usability/accessibility.html">accessibility guidelines</a> for <a href="https://material.io/design/usability/accessibility.html#layout-and-typography">touch target size</a>. For instance, Button touch target will expand to a minimum size of 48x48dp, even if you set the Button's size to be smaller. This aligns Compose Material to the same behavior of Material Design Components, providing consistent behavior if you mix Views and Compose. This change also ensures that when you create your UI using Compose Material components, minimum requirements for touch target accessibility will be met.</li> <li>Stable support for <a href="/reference/kotlin/androidx/compose/material3/package-summary#navigationrail">Navigation Rail</a></li> <li>Graduates a number of previously experimental APIs to stable</li> <li><a href="/jetpack/androidx/releases/compose-kotlin">Support</a> for newer versions of Kotlin</li> </ul> <h3 id="1.1.0-rc03" data-text="Version 1.1.0-rc03" tabindex="-1">Version 1.1.0-rc03</h3> <p>January 26, 2022</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-rc03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-rc03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8b1e748d80de10c087ce57eaaa93cd209cccebad..0310f2e9c177573a16c2d594fffabaada9b446ea/compose/foundation">Version 1.1.0-rc03 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Updated to support Compose Material 1.1.0-rc03</li> </ul> <h3 id="1.1.0-rc01" data-text="Version 1.1.0-rc01" tabindex="-1">Version 1.1.0-rc01</h3> <p>December 15, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-rc01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-rc01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/75784ce6dbac6faa5320e5898e9472f02ab8710c..8b1e748d80de10c087ce57eaaa93cd209cccebad/compose/foundation">Version 1.1.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Now it is allowed to pass negative scroll offsets into <code translate="no" dir="ltr">LazyListState.scrollToItem()</code> and <code translate="no" dir="ltr">LazyListState.animateScrollToItem()</code>. (<a href="https://android-review.googlesource.com/#/q/Iceb907f268a19db3e9315154ebd136764ad975a3">Iceb90</a>, <a href="https://issuetracker.google.com/issues/184252837">b/184252837</a>)</li> <li>Fixed a bug that caused missing accessibility scroll actions (<a href="https://android-review.googlesource.com/#/q/I7cbfb524b5baf98f044ee043ed19b8ad68cc9f89">I7cbfb</a>)</li> </ul> <h3 id="1.1.0-beta04" data-text="Version 1.1.0-beta04" tabindex="-1">Version 1.1.0-beta04</h3> <p>December 1, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-beta04</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-beta04</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9fee5f6a2093713639af8853adbf898f7b609969..75784ce6dbac6faa5320e5898e9472f02ab8710c/compose/foundation">Version 1.1.0-beta04 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Updated to be compatible with Kotlin <code translate="no" dir="ltr">1.6.0</code></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Cleaned up nullability in <code translate="no" dir="ltr">androidx.core.view</code>(<a href="https://android-review.googlesource.com/#/q/I7078a577cc3cab983bdf34fae57e962fa734ceb9">I7078a</a>, <a href="https://issuetracker.google.com/issues/204917439">b/204917439</a>)</li> <li>Experimental APIs were added that allow to consume PointerInputchange as a whole or check whether it was consumed or not. (<a href="https://android-review.googlesource.com/#/q/I2e59de430d24336bbdbe3d0a975948969e8d2e82">I2e59d</a>)</li> <li>Show a magnifier widget when dragging the cursor or selection handles inside text fields. (<a href="https://android-review.googlesource.com/#/q/I5391e3fab709172189dada65e8dba6a130526c15">I5391e</a>, <a href="https://issuetracker.google.com/issues/203781358">b/203781358</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix text handles not moving when IME visibility changes. (<a href="https://android-review.googlesource.com/#/q/I25f2ec3b813f179836c6e69c78bbd8ff2a636179">I25f2e</a>)</li> </ul> <h3 id="1.1.0-beta03" data-text="Version 1.1.0-beta03" tabindex="-1">Version 1.1.0-beta03</h3> <p>November 17, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-beta03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-beta03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f07d12061370a603549747200c79b60239706330..cc1240d00b28657ee0c1a937f60430eaf1b03b09/compose/foundation">Version 1.1.0-beta03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Support for horizontal spans was added to LazyVerticalGrid. (<a href="https://android-review.googlesource.com/#/q/I7e2fa4e915b28aa96980a53c4b9ad79bdb7aeeb2">I7e2fa</a>, <a href="https://issuetracker.google.com/issues/176758183">b/176758183</a>)</li> <li><p>Experimental ability to animate Lazy lists item positions was added. There is a new modifier available within LazyItemScope called <code translate="no" dir="ltr">Modifier.animateItemPlacement()</code>. Usage example:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">var</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">list</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">by</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">remember</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">mutableStateOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">listOf</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"A"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"B"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"C"</span><span class="devsite-syntax-p">))</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">LazyColumn</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">item</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Button</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">onClick</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">list</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">list</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">shuffled</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">})</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Text</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Shuffle"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">items</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">list</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">key</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nb">it</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">})</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Text</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Item </span><span class="devsite-syntax-si">$</span><span class="devsite-syntax-n">it</span><span class="devsite-syntax-s">"</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Modifier</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">animateItemPlacement</span><span class="devsite-syntax-p">())</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <ul> <li>When you provide a key via <code translate="no" dir="ltr">LazyListScope.item</code> or <code translate="no" dir="ltr">LazyListScope.items</code> this modifier will enable item reordering animations. Aside from item reordering all other position changes caused by events like arrangement or alignment changes will also be animated. (<a href="https://android-review.googlesource.com/#/q/I59e7b8fd3a4a9eb19a15a4704da150bd187a6f24">I59e7b</a>, <a href="https://issuetracker.google.com/issues/150812265">b/150812265</a>)</li> </ul></li> </ul> <h3 id="1.1.0-beta02" data-text="Version 1.1.0-beta02" tabindex="-1">Version 1.1.0-beta02</h3> <p>November 3, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-beta02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-beta02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/92af5b17ecee9d3c62f59e98b483e411c390f51b..f07d12061370a603549747200c79b60239706330/compose/foundation">Version 1.1.0-beta02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Ripples and other indications will now only be delayed if they are inside a <code translate="no" dir="ltr">Modifier.scrollable()</code> container, instead of always being delayed for a down event. (<a href="https://android-review.googlesource.com/#/q/Ibefe01bcdef89e01b6e9f7edf9fe13622450f487">Ibefe0</a>, <a href="https://issuetracker.google.com/issues/203141462">b/203141462</a>)</li> <li>Added experimental BringIntoView API that lets you send a request to parents so that they scroll to bring an item into view (<a href="https://android-review.googlesource.com/#/q/Ib918da5f0ee21833e6e1c12169dbd308ca33caf5">Ib918d</a>, <a href="https://issuetracker.google.com/issues/195353459">b/195353459</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Added <code translate="no" dir="ltr">Modifier.pointerHoverIcon</code> (<a href="https://android-review.googlesource.com/#/q/I95f011f87824926ddc87398a5ad553ca003c6f08">I95f01</a>)</li> </ul> <h3 id="1.1.0-beta01" data-text="Version 1.1.0-beta01" tabindex="-1">Version 1.1.0-beta01</h3> <p>October 27, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-beta01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-beta01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/db0888af4fa9a8eaeaf55cc1f120724bc67bdb20..92af5b17ecee9d3c62f59e98b483e411c390f51b/compose/foundation">Version 1.1.0-beta01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Added experimental BringIntoView API that lets you send a request to parents so that they scroll to bring an item into view (<a href="https://android-review.googlesource.com/#/q/Ib918da5f0ee21833e6e1c12169dbd308ca33caf5">Ib918d</a>, <a href="https://issuetracker.google.com/issues/195353459">b/195353459</a>)</li> </ul> <h3 id="1.1.0-alpha06" data-text="Version 1.1.0-alpha06" tabindex="-1">Version 1.1.0-alpha06</h3> <p>October 13, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-alpha06</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-alpha06</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/da9716386798fc4e39075f54e5bd3317384a63e6..db0888af4fa9a8eaeaf55cc1f120724bc67bdb20/compose/foundation">Version 1.1.0-alpha06 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>A child-less overload for Layout was added, with improved efficiency (<a href="https://android-review.googlesource.com/#/q/Ib0d9a0f11936c0568d20e26a3c6eaa3f938e0ccd">Ib0d9a</a>)</li> <li><code translate="no" dir="ltr">SemanticsNodeInteraction.performSemanticsAction</code> now returns the <code translate="no" dir="ltr">SemanticsNodeInteraction</code> on which the function was called. (<a href="https://android-review.googlesource.com/#/q/I9e5db630fbc3c254a4cc862c45bae71496e3c99f">I9e5db</a>)</li> <li>Added <code translate="no" dir="ltr">performScrollToNode(matcher: SemanticsMatcher)</code> that scrolls a scrollable container to the content that is matched by the given matcher. (<a href="https://android-review.googlesource.com/#/q/Ic1cb855e351c7bb683962d618d68782628b70f62">Ic1cb8</a>)</li> </ul> <h3 id="1.1.0-alpha05" data-text="Version 1.1.0-alpha05" tabindex="-1">Version 1.1.0-alpha05</h3> <p>September 29, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-alpha05</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-alpha05</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1a3dcfb231517d6104969f17063fcc6c97ba6eeb..da9716386798fc4e39075f54e5bd3317384a63e6/compose/foundation">Version 1.1.0-alpha05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added experimental historical pointers to PointerEventChange. (<a href="https://android-review.googlesource.com/#/q/Ic1fd82fd3f2335a9289cc1fc96c35e89ec9b90ee">Ic1fd8</a>, <a href="https://issuetracker.google.com/issues/197553056">b/197553056</a>, <a href="https://issuetracker.google.com/issues/199921305">b/199921305</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed accessibility support for scrollables (both lazy and non-lazy) with respect to scrolling (<a href="https://android-review.googlesource.com/#/q/I6cdb0e5114faa448deacd4d662893cec43c2d9f0">I6cdb0</a>)</li> </ul> <h3 id="1.1.0-alpha04" data-text="Version 1.1.0-alpha04" tabindex="-1">Version 1.1.0-alpha04</h3> <p>September 15, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-alpha04</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-alpha04</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bf63d633b292368932b7ea1994e4116f95a94b5c..1a3dcfb231517d6104969f17063fcc6c97ba6eeb/compose/foundation">Version 1.1.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Deprecated <code translate="no" dir="ltr">performGesture</code> and <code translate="no" dir="ltr">GestureScope</code>, which have been replaced by <code translate="no" dir="ltr">performTouchInput</code> and <code translate="no" dir="ltr">TouchInjectionScope</code>. (<a href="https://android-review.googlesource.com/#/q/Ia5f3f740c51a1add60fa82189d583d8a5192dd31">Ia5f3f</a>, <a href="https://issuetracker.google.com/issues/190493367">b/190493367</a>)</li> <li>Added <code translate="no" dir="ltr">touchBoundsInRoot</code> to <code translate="no" dir="ltr">SemanticsNode</code> that includes the minimum touch target size so that developers can ensure that touch targets meet accessibility minimums. (<a href="https://android-review.googlesource.com/#/q/I2e14bf1bab7a745aa2421353f44c734540d2489c">I2e14b</a>, <a href="https://issuetracker.google.com/issues/197751214">b/197751214</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Support for stretch overscroll has been added on Android 12 devices. (<a href="https://android-review.googlesource.com/#/q/Iccf3c3830a01469940828e21bc32b569951c187e">Iccf3c</a>, <a href="https://issuetracker.google.com/issues/171682480">b/171682480</a>)</li> </ul> <h3 id="1.1.0-alpha03" data-text="Version 1.1.0-alpha03" tabindex="-1">Version 1.1.0-alpha03</h3> <p>September 1, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-alpha03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-alpha03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1e0ab9e58c3c2ebe8152b7507938aef7e9c1acdc..bf63d633b292368932b7ea1994e4116f95a94b5c/compose/foundation">Version 1.1.0-alpha03 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Updated Compose <code translate="no" dir="ltr">1.1.0-alpha03</code> to depend on Kotlin <code translate="no" dir="ltr">1.5.30</code>. (<a href="https://android-review.googlesource.com/#/q/I74545c317093029a2a46707b9024ad3385854ecb">I74545</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Glow effect for scroll has been added. New experimental OverScrollConfiguration API has been added to allow for configuration of the overscroll visual effect. Provide null to turn off the overscroll effect. (<a href="https://android-review.googlesource.com/#/q/I0c3042f89365408e92f657330ed3164e6f3e12f8">I0c304</a>, <a href="https://issuetracker.google.com/issues/171682480">b/171682480</a>)</li> <li>AwaitPointerEventScope now has withTimeout() and withTimeoutOrNull() (<a href="https://android-review.googlesource.com/#/q/I507f0e696311ac0504126681c376f73beaa021fb">I507f0</a>, <a href="https://issuetracker.google.com/issues/179239764">b/179239764</a>, <a href="https://issuetracker.google.com/issues/182397793">b/182397793</a>)</li> <li>Added test method to get the clipped bounds. (<a href="https://android-review.googlesource.com/#/q/I6b28e437d6893a63be65c8a451a84bcb21bce906">I6b28e</a>)</li> <li>Added minimum touch target size to ViewConfiguration for use in semantics and pointer input to ensure accessibility. (<a href="https://android-review.googlesource.com/#/q/Ie861ca1fcdbfcc9455352fc3a459d5734d5d57cc">Ie861c</a>)</li> </ul> <h3 id="1.1.0-alpha02" data-text="Version 1.1.0-alpha02" tabindex="-1">Version 1.1.0-alpha02</h3> <p>August 18, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-alpha02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-alpha02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/d725303accfa9be6d5c3d61c7603ed1b9a780cbd..1e0ab9e58c3c2ebe8152b7507938aef7e9c1acdc/compose/foundation">Version 1.1.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added DpSize versions for <code translate="no" dir="ltr">Modifier.size</code> and <code translate="no" dir="ltr">requiredSize</code> (<a href="https://android-review.googlesource.com/#/q/I3fc7e0a9bd9989a8217ccc2ecf9aaea047693e1d">I3fc7e</a>, <a href="https://issuetracker.google.com/issues/194219828">b/194219828</a>)</li> </ul> <h3 id="1.1.0-alpha01" data-text="Version 1.1.0-alpha01" tabindex="-1">Version 1.1.0-alpha01</h3> <p>August 4, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.1.0-alpha01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.1.0-alpha01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1a3ba62b97c98d85f6c0ac2fb6483fc9ac60872e..d725303accfa9be6d5c3d61c7603ed1b9a780cbd/compose/foundation">Version 1.1.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Updated <code translate="no" dir="ltr">DrawScope#drawImage</code> method that consumes source and destination rects to consume an optional FilterQuality parameter. This is useful for pixel art that is intended to be pixelated when scaled up for pixel based art. Updated BitmapPainter + Image composable to also consume an optional FilterQuality parameter (<a href="https://android-review.googlesource.com/#/q/Ie4fb04013701add0fba1c5c6bb9da2812d6436e7">Ie4fb0</a>, <a href="https://issuetracker.google.com/issues/180311607">b/180311607</a>)</li> <li>TextField now clears selection when back button is pressed, which matches Android EditText behavior. (<a href="https://android-review.googlesource.com/#/q/I3ca164d09ee6d82f292aacfd2df0af05643cb1aa">I3ca16</a>, <a href="https://issuetracker.google.com/issues/174173645">b/174173645</a>)</li> <li>Add Cursor Handle. (<a href="https://android-review.googlesource.com/#/q/I07a8217c8ecbcd1c84c1a8df20c6e8b07d409148">I07a82</a>, <a href="https://issuetracker.google.com/issues/173016579">b/173016579</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Scrolling via semantics actions for lazy lists and regular scrolling components is now animated (<a href="https://android-review.googlesource.com/#/q/Id9066420fd80bbea3c0463813be0338fff017514">Id9066</a>, <a href="https://issuetracker.google.com/issues/190742024">b/190742024</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li><code translate="no" dir="ltr">LazyVerticalGrid</code> now accepts both horizontal and vertical arrangement parameters. (<a href="https://android-review.googlesource.com/#/q/If9c929e4d44f1c5e55184e426b62ab4b41c76ff6">If9c92</a>)</li> </ul> <h2 id="version_10_2" data-text="Version 1.0" tabindex="-1">Version 1.0</h2> <h3 id="1.0.5" data-text="Version 1.0.5" tabindex="-1">Version 1.0.5</h3> <p>November 3, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.5</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.5</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/74486e447dc2667c6a4cc46b2963f40210ceb348..39088e9f5278a15516318bb8979517d532bfdac3/compose/foundation">Version 1.0.5 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a crash tracking derivedStateOf instances. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1792247">aosp/1792247</a>)</li> </ul> <h3 id="1.0.4" data-text="Version 1.0.4" tabindex="-1">Version 1.0.4</h3> <p>October 13, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.4</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.4</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4b73eb10b9c34d4659d950c12ff23cf094d4d8c7..74486e447dc2667c6a4cc46b2963f40210ceb348/compose/foundation">Version 1.0.4 contains these commits.</a></p> <p><strong>Dependency Updates</strong></p> <ul> <li>Updated to depend on Kotlin <code translate="no" dir="ltr">1.5.31</code></li> </ul> <h3 id="1.0.3" data-text="Version 1.0.3" tabindex="-1">Version 1.0.3</h3> <p>September 29, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.3</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.3</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9c1876203334d14761d2c11e47c8191ef9107989..4b73eb10b9c34d4659d950c12ff23cf094d4d8c7/compose/foundation">Version 1.0.3 contains these commits.</a></p> <p><strong>Dependency Updates</strong></p> <ul> <li>Updated to depend on Kotlin <code translate="no" dir="ltr">1.5.30</code></li> </ul> <h3 id="1.0.2" data-text="Version 1.0.2" tabindex="-1">Version 1.0.2</h3> <p>September 1, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.2</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.2</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/c076d3eb651533329571facecfb54dc72e1b0fc4..9c1876203334d14761d2c11e47c8191ef9107989/compose/foundation">Version 1.0.2 contains these commits.</a></p> <p>Updated to support the Compose <code translate="no" dir="ltr">1.0.2</code> release. Compose <code translate="no" dir="ltr">1.0.2</code> is still compatible with Kotlin <code translate="no" dir="ltr">1.5.21</code>.</p> <h3 id="1.0.1" data-text="Version 1.0.1" tabindex="-1">Version 1.0.1</h3> <p>August 4, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.1</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.1</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7077236bd50d5bf31068c8ac40302765010a0e56..c076d3eb651533329571facecfb54dc72e1b0fc4/compose/foundation">Version 1.0.1 contains these commits.</a></p> <p><strong>Dependency Updates</strong></p> <ul> <li>Updated to depend on Kotlin <code translate="no" dir="ltr">1.5.21</code>.</li> </ul> <h3 id="1.0.0" data-text="Version 1.0.0" tabindex="-1">Version 1.0.0</h3> <p>July 28, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/abcc318573114e39365e63de4bea7736a81491af..7077236bd50d5bf31068c8ac40302765010a0e56/compose/foundation">Version 1.0.0 contains these commits.</a></p> <p><strong>Major features of 1.0.0</strong></p> <p>This is the first stable release of Compose. Please see the official <a href="https://android-developers.googleblog.com/2021/07/jetpack-compose-announcement.html">Compose Release blog</a> for more details!</p> <p><strong>Known Issues</strong></p> <ul> <li><p>If you are using Android Studio Bumblebee Canary 4 or AGP <code translate="no" dir="ltr">7.1.0-alpha04</code>/<code translate="no" dir="ltr">7.1.0-alpha05</code>, you may hit the following crash:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Text only"><code translate="no" dir="ltr"> java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)" </code></pre></devsite-code> <p>To fix, temporarily increase your minSdkVersion to 24+ in your <code translate="no" dir="ltr">build.gradle</code> file. This issue will be fixed in the next version of Android Studio Bumblebee and AGP <code translate="no" dir="ltr">7.1</code>. (<a href="https://issuetracker.google.com/issues/194289155">b/194289155</a>)</p></li> </ul> <h3 id="1.0.0-rc02" data-text="Version 1.0.0-rc02" tabindex="-1">Version 1.0.0-rc02</h3> <p>July 14, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-rc02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-rc02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1a3ba62b97c98d85f6c0ac2fb6483fc9ac60872e..abcc318573114e39365e63de4bea7736a81491af/compose/foundation">Version 1.0.0-rc02 contains these commits.</a></p> <ul> <li>Updated border rendering for generic shapes to address issues with paths defined with fixed dimensions. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1748871">aosp/1748871</a>, <a href="https://issuetracker.google.com/issues/191817116">b/191817116</a>)</li> </ul> <h3 id="1.0.0-rc01" data-text="Version 1.0.0-rc01" tabindex="-1">Version 1.0.0-rc01</h3> <p>July 1, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-rc01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-rc01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/f434dccf3dc4d4e82d8d965da3746615870537b4..1a3ba62b97c98d85f6c0ac2fb6483fc9ac60872e/compose/foundation">Version 1.0.0-rc01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Canvas now supports a contentDescription parameter for accessibility. (<a href="https://android-review.googlesource.com/#/q/Ib547c8fdb4c76a64f5ddcfe8ef3d46a0792f40bc">Ib547c</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Disabled Button, Card, Checkboxes and overall <code translate="no" dir="ltr">Modifier.clickable(enabled=false)</code> will block clicks from going up to the parent. (<a href="https://android-review.googlesource.com/#/q/Ic2c3b17121c3ab4676a995c4a83d15bac6c16aaa">Ic2c3b</a>, <a href="https://issuetracker.google.com/issues/183908811">b/183908811</a>)</li> </ul> <h3 id="1.0.0-beta09" data-text="Version 1.0.0-beta09" tabindex="-1">Version 1.0.0-beta09</h3> <p>June 16, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta09</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta09</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/836237c11d7a415f28bb71acab597579be1d5227..f434dccf3dc4d4e82d8d965da3746615870537b4/compose/foundation">Version 1.0.0-beta09 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Removed <code translate="no" dir="ltr">ManualFrameClock</code>. If you need to control animations, use <code translate="no" dir="ltr">composeTestRule.mainClock</code> instead. (<a href="https://android-review.googlesource.com/#/q/I3c3e8d0387c37ab3f3a29b648429056ac0eb6b26">I3c3e8</a>, <a href="https://issuetracker.google.com/issues/189951065">b/189951065</a>)</li> <li>change enum Role and LiveRegionMode to inline classes with private constructor (<a href="https://android-review.googlesource.com/#/q/Id189080b0537dde66639fc87f08ec5f46a449a97">Id1890</a>)</li> <li>KeyboardCapitalization is converted into inline class. (<a href="https://android-review.googlesource.com/#/q/Id5a1c8b2c89a65eb41aa44675b960a3bb0dc1020">Id5a1c</a>)</li> <li>TextOverflow is changed to an inline class. (<a href="https://android-review.googlesource.com/#/q/I433af65606ae4e79ea0cb281be7049c73b12fcf0">I433af</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Now when you specify the unique keys for LazyColumn/Row items the scroll position will be maintained based on the key, which means if you add/remove items before the current visible item the item with the given key will be kept as the first visible one. (<a href="https://android-review.googlesource.com/#/q/Id263f45e44fbcd5a6112ef88848da3303705c460">Id263f</a>, <a href="https://issuetracker.google.com/issues/184257857">b/184257857</a>)</li> <li>Key constants are @ExperimentalComposeUiApi for now. Consuming code can declare private constants prior to stabilization. (<a href="https://android-review.googlesource.com/#/q/Ia5d48d518c6e73f5e3458260203dc237bef5464d">Ia5d48</a>)</li> <li>Added IdlingStrategy to AndroidComposeTestRule that can be used by testing frameworks to install an alternative mechanism to await or achieve quiescence. Use <code translate="no" dir="ltr">AndroidComposeTestRule.setIdlingStrategyFactory()</code> before your test starts to install your own strategy. (<a href="https://android-review.googlesource.com/#/q/I608fa541ffd0bfff6b847e873843df0701425529">I608fa</a>)</li> </ul> <p><strong>Added Profile Rules</strong></p> <p>This release adds profile rules to the following compose modules (<a href="https://android-review.googlesource.com/#/q/I14ed64578d535320a40ed8d486f75715641b2762">I14ed6</a>):</p> <ul> <li>androidx.compose.animation</li> <li>androidx.compose.animation-core</li> <li>androidx.compose.foundation</li> <li>androidx.compose.foundation-layout</li> <li>androidx.compose.material</li> <li>androidx.compose.material-ripple</li> <li>androidx.compose.runtime</li> <li>androidx.compose.ui</li> <li>androidx.compose.ui.geometry</li> <li>androidx.compose.ui.graphics</li> <li>androidx.compose.ui.text</li> <li>androidx.compose.ui.text</li> <li>androidx.compose.ui.unit</li> <li>androidx.compose.ui.util</li> </ul> <h4 id="what_are_profile_rules_2" data-text="What are profile rules?" tabindex="-1">What are profile rules?</h4> <ul> <li><p>Profile rules for a library are specified in a text file <code translate="no" dir="ltr">baseline-prof.txt</code> located in the <code translate="no" dir="ltr">src/main</code> or equivalent directory. The file specifies a rule per line, where a rule in this case is a pattern for matching to methods or classes in the library. The syntax for these rules is a superset of the human-readable ART profile format that is used when using <code translate="no" dir="ltr">adb shell profman --dump-classes-and-methods ...</code>. These rules take one of two forms to target either methods or classes.</p></li> <li><p>A method rule will have the following pattern:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><<span class="devsite-syntax-n">FLAGS><CLASS_DESCRIPTOR></span><span class="devsite-syntax-o">-</span>><<span class="devsite-syntax-n">METHOD_SIGNATURE</span>> </code></pre></devsite-code></li> <li><p>And a class rule will have the following pattern:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><<span class="devsite-syntax-n">CLASS_DESCRIPTOR</span>> </code></pre></devsite-code></li> <li><p>Here <code translate="no" dir="ltr"><FLAGS></code> is one or more of the characters <code translate="no" dir="ltr">H</code>, <code translate="no" dir="ltr">S</code>, and <code translate="no" dir="ltr">P</code> to indicate whether or not this method should be flagged as "Hot", "Startup", or "Post Startup".</p></li> <li><p>The <code translate="no" dir="ltr"><CLASS_DESCRIPTOR></code> is the descriptor for the class that the targeted method belongs to. For example, the class <code translate="no" dir="ltr">androidx.compose.runtime.SlotTable</code> would have a descriptor of <code translate="no" dir="ltr">Landroidx/compose/runtime/SlotTable;</code>.</p></li> <li><p>The <code translate="no" dir="ltr"><METHOD_SIGNATURE></code> is the signature of the method, and includes the name, parameter types, and return types of the method. For example, the method <code translate="no" dir="ltr">fun isPlaced(): Boolean</code> on <code translate="no" dir="ltr">LayoutNode</code> has the signature <code translate="no" dir="ltr">isPlaced()Z</code>.</p></li> <li><p>These patterns can have wildcards (<code translate="no" dir="ltr">**</code>, <code translate="no" dir="ltr">*</code>, and <code translate="no" dir="ltr">?</code>) in order to have a single rule encompass multiple methods or classes.</p></li> </ul> <h4 id="what_do_the_rules_do_2" data-text="What do the rules do?" tabindex="-1">What do the rules do?</h4> <ul> <li><p>A method that has the flag <code translate="no" dir="ltr">H</code> indicates that this method is a "hot" method, and should be compiled ahead of time.</p></li> <li><p>A method that has the flag <code translate="no" dir="ltr">S</code> indicates that it is a method which is called at startup, and should be compiled ahead of time to avoid the cost of compilation and interpreting the method at startup time.</p></li> <li><p>A method that has the flag <code translate="no" dir="ltr">P</code> indicates that it is a method which is called after startup.</p></li> <li><p>A class that is present in this file indicates that it is used during startup and should be pre-allocated in the heap to avoid the cost of class loading.</p></li> </ul> <h4 id="how_does_this_work_2" data-text="How does this work?" tabindex="-1">How does this work?</h4> <ul> <li>Libraries can define these rules which will be packaged in AAR artifacts. When an app is then built which includes these artifacts, these rules are merged together and the merged rules are used to build a compact binary ART profile that is specific to the app. ART can then leverage this profile when the app is installed on devices in order to ahead-of-time compile a specific subset of the application to improve the performance of the application, especially the first run. Note that this will have no effect on debuggable applications.</li> </ul> <h3 id="1.0.0-beta08" data-text="Version 1.0.0-beta08" tabindex="-1">Version 1.0.0-beta08</h3> <p>June 2, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta08</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta08</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b648147c5fdfc5ecbad57e40e2dc0c69aa23bf12..86ff5b4bb956431ec884586ce0aea0127e189ec4/compose/foundation">Version 1.0.0-beta08 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>NestedScrollSource enum is replaced by an inline class. (<a href="https://android-review.googlesource.com/#/q/Ie321b5864dc617b2d6382ba5d632e8037dd5c1d5">Ie321b</a>, <a href="https://issuetracker.google.com/issues/187055290">b/187055290</a>)</li> <li>Refactored enum usages to inline classes to avoid issues with exhaustive when statements when new enum values are added. (<a href="https://android-review.googlesource.com/#/q/I2b5eb2f04d64d1eccf38557d80e3eef06869c310">I2b5eb</a>)</li> <li>Adds a tap timeout to clickable / toggleable to prevent showing a ripple during a scroll / drag (<a href="https://android-review.googlesource.com/#/q/Ia27044999597dd9411344119a7b77180943d9a25">Ia2704</a>, <a href="https://issuetracker.google.com/issues/168524931">b/168524931</a>)</li> <li>ContentDescription and Text semantics properties are no longer single values but lists. This enables to merge them as they are instead of concatenations. Also provided better testing APIs to utilize these changes (<a href="https://android-review.googlesource.com/#/q/Ica6bf4236d05b97357c18fb306a6305877a349f7">Ica6bf</a>, <a href="https://issuetracker.google.com/issues/184825850">b/184825850</a>)</li> <li><code translate="no" dir="ltr">Modifier.focusModifier()</code> is deprecated and replaced by <code translate="no" dir="ltr">Modifier.focusTarget()</code> (<a href="https://android-review.googlesource.com/#/q/I6c860991217cc0c4e7cb35be73207f94669ce607">I6c860</a>)</li> <li>KeyboardType enum is replaced by an inline class. (<a href="https://android-review.googlesource.com/#/q/I73045de306c082ca8f6b11d44d252d0a63a407d3">I73045</a>, <a href="https://issuetracker.google.com/issues/187055290">b/187055290</a>)</li> <li>Replaced <code translate="no" dir="ltr">FocusState</code> enum with a <code translate="no" dir="ltr">FocusState</code> interface (<a href="https://android-review.googlesource.com/#/q/Iccc1a7306fe886969b3a5c74359f53250b3901d9">Iccc1a</a>, <a href="https://issuetracker.google.com/issues/187055290">b/187055290</a>)</li> <li>ImeAction enum is replaced by an inline class. (<a href="https://android-review.googlesource.com/#/q/I18be51ba64f20257859ae634720b367ae7510e33">I18be5</a>, <a href="https://issuetracker.google.com/issues/187055290">b/187055290</a>)</li> <li><code translate="no" dir="ltr">AnnotatedString.withAnnotation</code> functions are now ExperimentalTextApi instead of ExperimentalComposeApi. (<a href="https://android-review.googlesource.com/#/q/I0cd0a64f5e0bf4cd082d479711c014162f27c763">I0cd0a</a>) <ul> <li>TextUnit constructor with TextUnitType is now ExperimentalTextApi instead of ExperimentalComposeApi.</li> </ul></li> <li>PaddingValues is now <code translate="no" dir="ltr">@Stable</code> rather than <code translate="no" dir="ltr">@Immutable</code> (<a href="https://android-review.googlesource.com/#/q/I88c506cf737fdb19d99fc495ab343395c3b23e01">I88c50</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix crashes of long press the blank area in non-empty text. (<a href="https://android-review.googlesource.com/#/q/I33ab5d732fc3564ec4fe99b16234a980f51684a8">I33ab5</a>, <a href="https://issuetracker.google.com/issues/187437299">b/187437299</a>)</li> <li>Show Toolbar after SelectAll (<a href="https://android-review.googlesource.com/#/q/I495d9fdb7c7e01cfd6085748cb5116e106906bb8">I495d9</a>, <a href="https://issuetracker.google.com/issues/185919613">b/185919613</a>)</li> <li>Fix for scrollable containers clipping its children on the cross axis. It was easily reproducible if you have a LazyRow with Card items. now the shadow will not be clipped. (<a href="https://android-review.googlesource.com/#/q/Icb6356d8dac24720981caa6afe8785546a2e7847">Icb635</a>, <a href="https://issuetracker.google.com/issues/186318448">b/186318448</a>)</li> <li>Fixed an issue where ripples / other indication would sometimes get stuck on a long click when using Modifier.combinedClickable (<a href="https://android-review.googlesource.com/#/q/I2298ce564e3940875c3f3525255424da25dc9414">I2298c</a>, <a href="https://issuetracker.google.com/issues/186223077">b/186223077</a>)</li> <li>Now <code translate="no" dir="ltr">detectDragGesures</code>, <code translate="no" dir="ltr">detectVerticalGestures</code>, and <code translate="no" dir="ltr">detectHorizontalGestures</code> will consume the position change automatically, no need to call change.consumePositionChange in the onDrag callbacks (<a href="https://android-review.googlesource.com/#/q/I42fc4a6529f73db228ae671097d10a0cda0d834b">I42fc4</a>, <a href="https://issuetracker.google.com/issues/185096350">b/185096350</a>, <a href="https://issuetracker.google.com/issues/187320697">b/187320697</a>)</li> <li><code translate="no" dir="ltr">Modifier.onGloballyPositioned()</code> was changed to report the coordinates of this modifier in the modifier chain, not the layout coordinates after applying all the modifiers. This means that now the ordering of modifiers is affecting what coordinates would be reported. (<a href="https://android-review.googlesource.com/#/q/Ieb67da0c327c9dc323a4b0a8bf33dbb66f0611e3">Ieb67d</a>, <a href="https://issuetracker.google.com/issues/177926591">b/177926591</a>)</li> </ul> <h3 id="1.0.0-beta07" data-text="Version 1.0.0-beta07" tabindex="-1">Version 1.0.0-beta07</h3> <p>May 18, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta07</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta07</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4c1927601bfcaaaf049d0fc7a4e5801ff5cf9729..b648147c5fdfc5ecbad57e40e2dc0c69aa23bf12/compose/compiler/compiler">Version 1.0.0-beta07 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> Libraries dependent on Compose will need to recompile with version <code translate="no" dir="ltr">1.0.0</code>‑<code translate="no" dir="ltr">beta07</code>. Otherwise, libraries may encounter a <code translate="no" dir="ltr">NoSuchMethodError</code>, such as:</br> <code translate="no" dir="ltr">java.lang.NoSuchMethodError: No interface method startReplaceableGroup(ILjava/lang/String;)V in class Landroidx/compose/runtime/Composer; or its super classes</code>. (<a href="https://android-review.googlesource.com/#/q/Ia34e699fdbeaeb86b74e9da27d79d186e6e71757">Ia34e6</a>)</span></aside> <p><strong>API Changes</strong></p> <ul> <li>The next visible item prefetching logic is introduced for LazyColumn/Row (<a href="https://android-review.googlesource.com/#/q/I8a4bc52322a5444e3782274822fa6d07f7c1d402">I8a4bc</a>, <a href="https://issuetracker.google.com/issues/184940225">b/184940225</a>)</li> <li>Added Clip Selection Handle (<a href="https://android-review.googlesource.com/#/q/Iff80d27fbac0e4de5e3e99fac4352cd6ef2cd201">Iff80d</a>, <a href="https://issuetracker.google.com/issues/183408447">b/183408447</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>LazyColumn/Row will now keep up to 2 previously visible items active (not disposed) even when they are scrolled out already. This allows the component to reuse the active subcompositions when we will need to compose a new item which improves the scrolling performance. (<a href="https://android-review.googlesource.com/#/q/Ie5555c9a7031dc9bd31f452a0ed9b28d8a337f5f">Ie5555</a>)</li> <li>Remove paintBackground. (<a href="https://android-review.googlesource.com/#/q/I3866020fa1fe7331604d144dcffc1ed3a0e56f50">I38660</a>)</li> <li>Draw Selection Background using DrawScope. (<a href="https://android-review.googlesource.com/#/q/I73c61bfd553fca38c412d9372e3eaa6336dcd74f">I73c61</a>, <a href="https://issuetracker.google.com/issues/186674472">b/186674472</a>)</li> <li>A beta06 regression affecting Row/Column using spacedBy arrangements to layout weighted children was fixed. (<a href="https://android-review.googlesource.com/#/q/Ifaf8c6180000d06e1aaa89553ff60e82638e9465">Ifaf8c</a>, <a href="https://issuetracker.google.com/issues/187326588">b/187326588</a>)</li> </ul> <h3 id="1.0.0-beta06" data-text="Version 1.0.0-beta06" tabindex="-1">Version 1.0.0-beta06</h3> <p>May 5, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta06</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta06</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b04f2c39ebb45a0480dc0dc04d7fb7406646eb5e..4c1927601bfcaaaf049d0fc7a4e5801ff5cf9729/compose/foundation">Version 1.0.0-beta06 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Solve Conflict with Navigation Gesture (<a href="https://android-review.googlesource.com/#/q/I1145eacbec270abcbb70f8ccb3664609a699ee47">I1145e</a>)</li> <li>Added CollectionInfo and CollectionItemInfo accessibility APIs that allows to mark collection and its items for accessibility services (<a href="https://android-review.googlesource.com/#/q/Id54ef37379e14e41ac52782b40e29de54f95eed0">Id54ef</a>, <a href="https://issuetracker.google.com/issues/180479017">b/180479017</a>)</li> <li>Added <code translate="no" dir="ltr">SemanticsActions.ScrollToIndex</code> to scroll a list with indexed items to the item with a certain index, and <code translate="no" dir="ltr">SemanticsProperties.IndexForKey</code> to get the index of an item in a list with keyed items. Both actions are implemented by LazyList. <ul> <li>Added <code translate="no" dir="ltr">SemanticsNodeInteraction.performScrollToIndex</code> that scrolls a list to the given index, and <code translate="no" dir="ltr">SemanticsNodeInteraction.performScrollToKey</code> that scrolls a list to the item with the given key. (<a href="https://android-review.googlesource.com/#/q/I4fe63399fb620794651e1973730658877bcfeff4">I4fe63</a>, <a href="https://issuetracker.google.com/issues/178483889">b/178483889</a>, <a href="https://issuetracker.google.com/issues/161584524">b/161584524</a>)</li> </ul></li> <li>AnnotatedString save support to TextFieldValue.Saver. Added addTtsAnnotation and withAnnotation utility functions to AnnotatedString.Builder (<a href="https://android-review.googlesource.com/#/q/I8cbdcfcdbe167ff7c68c760aebdd8affe2d8434e">I8cbdc</a>, <a href="https://issuetracker.google.com/issues/178446304">b/178446304</a>)</li> <li>Default <code translate="no" dir="ltr">0.dp</code> parameter values were added to <code translate="no" dir="ltr">PaddingValues(horizontal, vertical)</code> (<a href="https://android-review.googlesource.com/#/q/I0557182c68da793da30caeb6325949829101e0cf">I05571</a>, <a href="https://issuetracker.google.com/issues/181336792">b/181336792</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Row & Column children with <code translate="no" dir="ltr">weight(fill = false)</code> are no longer making the parent fill the entire available main axis space. (<a href="https://android-review.googlesource.com/#/q/Ied94da682f4cf6ead5b91e06ba08904c1a349b9f">Ied94d</a>, <a href="https://issuetracker.google.com/issues/186012444">b/186012444</a>, <a href="https://issuetracker.google.com/issues/184355105">b/184355105</a>)</li> </ul> <h3 id="1.0.0-beta05" data-text="Version 1.0.0-beta05" tabindex="-1">Version 1.0.0-beta05</h3> <p>April 21, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta05</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta05</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/0e6e72e136ada934db74265667417524ba0ba04f..b04f2c39ebb45a0480dc0dc04d7fb7406646eb5e/compose/foundation">Version 1.0.0-beta05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>FlingBehavior interface is now marked as @Stable. All implementations should comply with the <code translate="no" dir="ltr">@Stable</code> contract. (<a href="https://android-review.googlesource.com/#/q/I93354d661af9074ad27fc37ff623f83b03e4f36c">I93354</a>, <a href="https://issuetracker.google.com/issues/184830577">b/184830577</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed <code translate="no" dir="ltr">ACTION_SCROLL_FORWARD</code>, <code translate="no" dir="ltr">ACTION_SCROLL_BACKWARD</code>, <code translate="no" dir="ltr">accessibilityActionScrollLeft</code>, <code translate="no" dir="ltr">accessibilityActionScrollUp</code>, <code translate="no" dir="ltr">accessibilityActionScrollRight</code> and <code translate="no" dir="ltr">accessibilityActionScrollDown</code> accessibility scroll actions. Instead of scrolling to the end of the scrollable, it will now scroll by one screen in the given direction. (<a href="https://android-review.googlesource.com/#/q/Ieccb0a794d61dc5fe28a236b379755d776c023dc">Ieccb0</a>)</li> <li>The AndroidManifest files from ui-test-manifest and ui-tooling-data are now compatible with Android 12 (<a href="https://android-review.googlesource.com/#/q/I6f9dec0515ad6eb7fd232eeb124ee0164f4e90cb">I6f9de</a>, <a href="https://issuetracker.google.com/issues/184718994">b/184718994</a>)</li> </ul> <h3 id="1.0.0-beta04" data-text="Version 1.0.0-beta04" tabindex="-1">Version 1.0.0-beta04</h3> <p>April 7, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta04</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta04</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5c42896eb6591b09e3952030fb7ea8d9b8c42713..0e6e72e136ada934db74265667417524ba0ba04f/compose/foundation">Version 1.0.0-beta04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Rename hideSoftwareKeyboard and showSoftwareKeyboard on SoftwareKeyboardController to <code translate="no" dir="ltr">hide()</code> and <code translate="no" dir="ltr">show()</code> respectively. <ul> <li>Provide the full CompositionLocal interface for LocalSoftwareKeyboardController, allowing it to be set (especially useful in tests) (<a href="https://android-review.googlesource.com/#/q/I579a6e311d1cc96e4ea398465cad3a402a633b8d">I579a6</a>)</li> </ul></li> <li><code translate="no" dir="ltr">TextOverflow.Visible</code> is introduced. (<a href="https://android-review.googlesource.com/#/q/Ic8f898df15fa7cfa3fadf5a47d5b0e34a68f52f6">Ic8f89</a>)</li> <li>Public instances of <code translate="no" dir="ltr">RowScope</code>, <code translate="no" dir="ltr">ColumnScope</code>, <code translate="no" dir="ltr">BoxScope</code>, <code translate="no" dir="ltr">BoxWithConstraintsScope</code> were removed. (<a href="https://android-review.googlesource.com/#/q/I4e83e38b3bb85be593288720e6b9cdbe0032bceb">I4e83e</a>, <a href="https://issuetracker.google.com/issues/181869067">b/181869067</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed the issue when items of <code translate="no" dir="ltr">LazyColumn</code>/<code translate="no" dir="ltr">LazyRow</code> located on the edges were incorrectly positioned after fast fling (<a href="https://android-review.googlesource.com/#/q/Ie4d13def7dc4b12d4f52b4c5edbb0abb5150f698">Ie4d13</a>, <a href="https://issuetracker.google.com/issues/183877420">b/183877420</a>)</li> <li><p>Prior to this change, local composable functions were skippable based on their parameters. After this change, no local composable functions will skip. This change is done because it is common and expected for local functions to capture parameters from the parent and them skipping is a common source of bugs.</p> <p>To summarize, consider the example:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">Counter</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">count</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onCountChange</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-kt">Int</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">Unit</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nd">@Composable</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">ShowCount</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Text</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Count: </span><span class="devsite-syntax-si">$</span><span class="devsite-syntax-n">count</span><span class="devsite-syntax-s">"</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">ShowCount</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Button</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">onClick</span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">onCountChange</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">count</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">+</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">1</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">})</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Text</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"Increment"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <p>Prior to this change, the <code translate="no" dir="ltr">ShowCount</code> composable function would always skip, even after the <code translate="no" dir="ltr">count</code> parameter was updated. This is no longer the case. (<a href="https://android-review.googlesource.com/#/q/I5648a5f11c89e71c6b8c748f111c47bcafee9178">I5648a</a>)</p></li> </ul> <h3 id="1.0.0-beta03" data-text="Version 1.0.0-beta03" tabindex="-1">Version 1.0.0-beta03</h3> <p>March 24, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta03</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/52fbd7ed5b07ca4431fa828325a1f8da45b02e51..5c42896eb6591b09e3952030fb7ea8d9b8c42713/compose/foundation">Version 1.0.0-beta03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">DefaultMonotonicFrameClock</code> is deprecated. Calling <code translate="no" dir="ltr">withFrameNanos</code> or <code translate="no" dir="ltr">Recomposer.runRecomposeAndApplyChanges</code> with no <code translate="no" dir="ltr">MonotonicFrameClock</code> will now throw <code translate="no" dir="ltr">IllegalStateException</code>. (<a href="https://android-review.googlesource.com/#/q/I4eb0d7a8ebae7497735d25bc35e9f94c66ce2232">I4eb0d</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">FlingBehavior.performFling()</code> is now called even when velocity is 0 (<a href="https://android-review.googlesource.com/#/q/I0b6e5934c646494c1b96340c0f9822d28b9cd2c2">I0b6e5</a>, <a href="https://issuetracker.google.com/issues/181237123">b/181237123</a>)</li> </ul> <h3 id="1.0.0-beta02" data-text="Version 1.0.0-beta02" tabindex="-1">Version 1.0.0-beta02</h3> <p>March 10, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta02</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/df134e0f94ac70e36764a70dc7fb6a083e0e0fab..52fbd7ed5b07ca4431fa828325a1f8da45b02e51/compose/foundation">Version 1.0.0-beta02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Multiple small optimizations in LazyColumn measuring logic were added (<a href="https://android-review.googlesource.com/#/q/Ic6889648c8192f400dabce375d87bdfad50a6f96">Ic6889</a>)</li> <li>Added new <code translate="no" dir="ltr">LocalSoftwareKeyboardController</code> composition local API to replace previous SoftwareKeyboardController interface on TextField. (<a href="https://android-review.googlesource.com/#/q/I5951e802fbec7c26862b976de64b78640accd1f7">I5951e</a>, <a href="https://issuetracker.google.com/issues/168778053">b/168778053</a>)</li> <li>Added new <code translate="no" dir="ltr">LocalSoftwareKeyboardController</code> composition local API to replace previous SoftwareKeyboardController interface on TextField. (<a href="https://android-review.googlesource.com/#/q/I84472a517db4b15345302346c967e7c6b359109b">I84472</a>, <a href="https://issuetracker.google.com/issues/168778053">b/168778053</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Enforce restrictions on public usage of experimental APIs (<a href="https://android-review.googlesource.com/#/q/I6aa29518ed4d6a3821d921d2ae1a300e31183dcc">I6aa29</a>, <a href="https://issuetracker.google.com/issues/174531520">b/174531520</a>)</li> </ul> <h3 id="1.0.0-beta01" data-text="Version 1.0.0-beta01" tabindex="-1">Version 1.0.0-beta01</h3> <p>February 24, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-beta01</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-beta01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9ed3262e0dfca1d352bdbf8f8e10253a61ef6218..4b6cff92e45f1d4467086aa2c6aa0248b4883950/compose/foundation">Version 1.0.0-beta01 contains these commits.</a></p> <p>This is the first release of Compose 1.0.0 Beta.</p> <p><strong>API Changes</strong></p> <ul> <li>onStart callback has been added to <code translate="no" dir="ltr">detectDragGestures</code> (<a href="https://android-review.googlesource.com/#/q/I6726950322c7a3390fc79c630919b002bf7059eb">I67269</a>, <a href="https://issuetracker.google.com/issues/179995594">b/179995594</a>)</li> <li>Modifiers for sizing to intrinsics are no longer experimental. (<a href="https://android-review.googlesource.com/#/q/I15744bc96d9c9a94747901e47100fdea25e28742">I15744</a>)</li> <li>Removed dp assertions (<a href="https://android-review.googlesource.com/#/q/I798d2f7dbd5e687d8e1fb059f153cdc8150d8d27">I798d2</a>)</li> <li>Removed SoftwareKeyboardController callback from all text fields to be replaced by a new API shortly. (<a href="https://android-review.googlesource.com/#/q/Iae869e91c48300f4ab926dac2578d2d759f5fd89">Iae869</a>, <a href="https://issuetracker.google.com/issues/168778053">b/168778053</a>)</li> <li>MeasureBlocks was renamed to MeasurePolicy which became a fun interface. Layout APIs were updated / simplified to use MeasurePolicy. (<a href="https://android-review.googlesource.com/#/q/Icab485f5b5965261ce9f9d696d4c225ec158f072">Icab48</a>, <a href="https://issuetracker.google.com/issues/167662468">b/167662468</a>, <a href="https://issuetracker.google.com/issues/156751158">b/156751158</a>)</li> <li><code translate="no" dir="ltr">InteractionState</code> has been replaced with <code translate="no" dir="ltr">[Mutable]InteractionSource</code> <ul> <li>Interfaces are responsible for emitting / collecting Interaction events.</li> <li>Instead of passing <code translate="no" dir="ltr">interactionState = remember { InteractionState() }</code> to components such as <code translate="no" dir="ltr">Button</code> and <code translate="no" dir="ltr">Modifier.clickable()</code>, use <code translate="no" dir="ltr">interactionSource = remember { MutableInteractionSource() }</code>.</li> <li>Instead of: <code translate="no" dir="ltr">Interaction.Pressed in interactionState</code> you should instead use the extension functions on InteractionSource, such as InteractionSource.collectIsPressedAsState().</li> <li>For complex use cases you can use InteractionSource.interactions to observe the stream of Interactions. See the InteractionSource documentation and samples for more information.</li> <li>(<a href="https://android-review.googlesource.com/#/q/I85965d0dba39d1740c097915d1d1a367eea2a78c">I85965</a>, <a href="https://issuetracker.google.com/issues/152525426">b/152525426</a>, <a href="https://issuetracker.google.com/issues/171913923">b/171913923</a>, <a href="https://issuetracker.google.com/issues/171710801">b/171710801</a>, <a href="https://issuetracker.google.com/issues/174852378">b/174852378</a>)</li> </ul></li> <li>Removed deprecated LayoutCoordinates methods, use function instead of the property for positionInParent and boundsInParent (<a href="https://android-review.googlesource.com/#/q/I580edba74283600c3aafba6130a7af806df7d6c5">I580ed</a>, <a href="https://issuetracker.google.com/issues/169874631">b/169874631</a>, <a href="https://issuetracker.google.com/issues/175142755">b/175142755</a>)</li> <li>Created new TextInputSession for input sessions from low level text components such as CoreTextField. (<a href="https://android-review.googlesource.com/#/q/I8817f81e7c1b0066795ecb4af3674e99413362d0">I8817f</a>, <a href="https://issuetracker.google.com/issues/177662148">b/177662148</a>)</li> <li>Placeable now exposes measuredSize, representing the size which the child layout actually measured to. This size might not respect the measurement constraints. (<a href="https://android-review.googlesource.com/#/q/Ib2729a2323f67d5e50248dbfa234394fb3d7ee71">Ib2729</a>, <a href="https://issuetracker.google.com/issues/172560206">b/172560206</a>, <a href="https://issuetracker.google.com/issues/172338608">b/172338608</a>)</li> <li>Add selectionGroup modifier that allows to mark collection of Tabs or RadioButtons for accessibility purposes (<a href="https://android-review.googlesource.com/#/q/Ie5c29bc1cc0630f4f3a68ff57ebd94464c89ffd7">Ie5c29</a>)</li> <li><p>Add LazyListState.animateScrollToItem</p> <p>This method smooth scrolls to a specific item in the list. (<a href="https://android-review.googlesource.com/#/q/I4bfd722f76c600483b41d27164eae10e24cc1454">I4bfd7</a>)</p></li> <li><p>ScrollableState.smoothScrollBy() was renamed to animateScrollBy() LazyListState.snapToItemIndex() was renamed to scrollToItem() ScrollState.smoothScrollTo() was renamed to animateScrollTo() (<a href="https://android-review.googlesource.com/#/q/I35deda2585dafb47c8b4d68fc0063d289f5c78d6">I35ded</a>)</p></li> <li><p>Modifier.zoomable has been replaced my Modifier.transformable. smoothPanBy, smoothRotationBy have been added as a functionality. (<a href="https://android-review.googlesource.com/#/q/Ifc32b264ce6a99e17f38ac339bde498fe5b2337a">Ifc32b</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>The <code translate="no" dir="ltr">defaultFactory</code> for <code translate="no" dir="ltr">compositionLocalOf</code> and <code translate="no" dir="ltr">staticCompositionLocalOf</code> is now required instead of optional.</p> <p>This changes removes a potential type error for non-nullable types where no default factory was provided. Previously this would provide a null reference for a non-nullable type.</p> <p>For nullable types consider supplying <code translate="no" dir="ltr">{ null }</code> as the default factory.</p> <p>We do not recommend using locals with non-nullable types unless a sensible default can be provided. If no sensible default exists, the <code translate="no" dir="ltr">defaultFactory</code> lambda should throw an exception. However throwing an exception means that consumers of the local will have an implicit dependency on it being provided that is not enforced by the type system. (<a href="https://android-review.googlesource.com/#/q/Ifbd2a8abd2f1fc4578da4b782b570ed9de088beb">Ifbd2a</a>)</p></li> <li><p>Changed <code translate="no" dir="ltr">Indication#createIndication()</code> to <code translate="no" dir="ltr">Indication#rememberUpdatedIndication(InteractionState)</code> and removes <code translate="no" dir="ltr">InteractionState</code> parameter from I<code translate="no" dir="ltr">ndicationInstance#drawIndication()</code>. IndicationInstance should only be responsible for drawing visual effects, and not launching animations / writing state in response to InteractionState changes. These animations and state writes should happen within <code translate="no" dir="ltr">rememberUpdatedIndication()</code> instead. The <code translate="no" dir="ltr">indication</code> parameter in <code translate="no" dir="ltr">Modifier.indication</code> was also changed to be a required parameter. (<a href="https://android-review.googlesource.com/#/q/Ic1764c0417b25cd0a0dbb96ed3e1b0974618c4ca">Ic1764</a>, <a href="https://issuetracker.google.com/issues/152525426">b/152525426</a>)</p></li> <li><p>Text actions now check focus automatically (<a href="https://android-review.googlesource.com/#/q/I13777ef805c71674b929577a3b794d655948da3f">I13777</a>, <a href="https://issuetracker.google.com/issues/179648629">b/179648629</a>)</p></li> <li><p>Removed <code translate="no" dir="ltr">runBlockingWithManualClock</code> (<a href="https://android-review.googlesource.com/#/q/I15cdc97a742c764cae3b332ad52143c07f32b9bd">I15cdc</a>, <a href="https://issuetracker.google.com/issues/179664814">b/179664814</a>)</p></li> <li><p>Scroll position in Modifier.verticalScroll()/horizontalScroll() is represented with Ints now (<a href="https://android-review.googlesource.com/#/q/I81298a8767a421293ca7d5ab33ce8373e63f383c">I81298</a>)</p></li> <li><p>smoothScrollBy and scrollBy methods' packages changed to <code translate="no" dir="ltr">androidx.compose.foundation.gestures.*</code> (<a href="https://android-review.googlesource.com/#/q/I3f7c18be72b1b4e8d7958194b10d63d749f7d948">I3f7c1</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>FlingConfig has been renamed to FlingBehavior now allows for customization of suspend animation rather than predefined Decays. (<a href="https://android-review.googlesource.com/#/q/I02b8639c646d24fd19ef7ac504ef6660b8906d54">I02b86</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>Size modifiers were renamed. Modifier.width/height/size were renamed to requiredWidth/requiredHeight/requiredSize. Modifier.preferredWidth/preferredHeight/preferredSize were renamed to width/height/size. (<a href="https://android-review.googlesource.com/#/q/I5b4145953d360b1fb851c0056fc9a7875bb34088">I5b414</a>)</p></li> <li><p>defaultMinSizeConstraints was renamed to defaultMinSize. (<a href="https://android-review.googlesource.com/#/q/I4eaaec7cb1fffdb530744c7b7e42f23a26e96493">I4eaae</a>)</p></li> <li><p>Modifier.tapGestureFilter has been removed. Use <code translate="no" dir="ltr">Modifier.pointerInput { detectTapGestures(...) }</code> instead. (<a href="https://android-review.googlesource.com/#/q/I266ed741ca484924409a4a3a7d5afbbfffbd66d3">I266ed</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>partial consumption was removed from pointer input system. The recommended way of coordinating partial consumtion is Modifier.nestedScroll. (<a href="https://android-review.googlesource.com/#/q/Ie9c9b7c6f5da9a47c803b06985f45eb7df5552f2">Ie9c9b</a>)</p></li> <li><p>Orientation has been moved to foundation package. VelocirtTracker moved from ui.gesture to ui.input.pointer. (<a href="https://android-review.googlesource.com/#/q/Iff4a887648735c4850dca0d8d95fd99d782d04bb">Iff4a8</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>AnimationClockObservable and subclasses have been removed. AnimatedFloat has been removed. (<a href="https://android-review.googlesource.com/#/q/Icde5248072620b741bdf4d8cf59291e7b2994e6a">Icde52</a>, <a href="https://issuetracker.google.com/issues/177457083">b/177457083</a>)</p></li> <li><p>drawerState.open() and drawerState.close() are now suspending functions. Use rememberCoroutineScope() to get the scope of the composition to call them (<a href="https://android-review.googlesource.com/#/q/I16f608d016fa82a59e3e68b96cb4931dcebb57a6">I16f60</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>Providers has been renamed to CompositionLocalProvider</p> <ul> <li>The Composition constructor no longer accepts a key parameter, and has been deprecated.</li> <li>currentCompositeKeyHash has been turned into a composable top level property instead of a composable top level function.</li> <li>CompositionData and CompositionGroup have been moved to the androidx.compose.runtime.tooling namespace</li> <li>ComposableLambda has been made an interface instead of a concrete class, and no longer has type parameters.</li> <li>ComposableLambdaN has been made an interface instead of a concrete class, and no longer has type parameters.</li> <li>The snapshotFlow function has been moved to the androidx.compose.runtime namespace</li> <li>the merge method of SnapshotMutationPolicy is no longer experimental</li> <li>The <code translate="no" dir="ltr">@TestOnly</code> top level clearRoots function has been removed. It is no longer necessary.</li> <li>keySourceInfoOf and resetSourceInfo functions have been removed. They are no longer necessary.</li> <li>Composer.collectKeySourceInformation has been removed. It is no longer necessary.</li> <li>isJoinedKey, joinedKeyLeft, and joinedKeyRight methods have been removed. They are no longer necessary.</li> <li>Various top level APIs have been moved and reorganized into different files. Due to Kotlin’s file class semantics, this will break binary compatibility but not source compatibility, so should not be an issue for most users.</li> <li>(<a href="https://android-review.googlesource.com/#/q/I99b7de8ea0fb5d73a0ee4667a65e35d976383831">I99b7d</a>, <a href="https://issuetracker.google.com/issues/177245490">b/177245490</a>)</li> </ul></li> <li><p>Modifier.scrollable has been reworked. Now it uses Scrollable interface instead of ScrollableController class (<a href="https://android-review.googlesource.com/#/q/I4f5a5189b90cdff631ffb7166ce2e847b92db205">I4f5a5</a>, <a href="https://issuetracker.google.com/issues/174485541">b/174485541</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>Modifier.draggable now accepts DraggableState instead of a simple lambda. you can create state via <code translate="no" dir="ltr">rememberDraggableState { delta -> }</code> to get the same behaviour as before (<a href="https://android-review.googlesource.com/#/q/Ica70f33e73b6691375c9bdf07d008bae7546d48a">Ica70f</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>requiredWidth(IntrinsicSize) and requiredHeight(IntrinsicSize) modifiers were added for required sizing to intrinsic sizes. (<a href="https://android-review.googlesource.com/#/q/I0a6b4fc2f6e18c9ff160c94f67fcc6059cd4e2de">I0a6b4</a>)</p></li> <li><p>Deprecated <code translate="no" dir="ltr">emptyContent()</code> is removed. Use <code translate="no" dir="ltr">{}</code> instead. (<a href="https://android-review.googlesource.com/#/q/Idb33f22d9a1002f86b42606dd93478ee37924445">Idb33f</a>, <a href="https://issuetracker.google.com/issues/179432510">b/179432510</a>)</p></li> <li><p>Deleted some previously deprecated APIs (<a href="https://android-review.googlesource.com/#/q/Ice5dae36591015a9d905b84b26cc02662385d831">Ice5da</a>, <a href="https://issuetracker.google.com/issues/178633932">b/178633932</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Added new LocalSoftwareKeyboardController composition local API to replace previous SoftwareKeyboardController interface on TextField. (<a href="https://android-review.googlesource.com/#/q/I658b6bfc5c917db486c631312e3456469a615831">I658b6</a>, <a href="https://issuetracker.google.com/issues/168778053">b/168778053</a>)</li> </ul> <h3 id="1.0.0-alpha12" data-text="Version 1.0.0-alpha12" tabindex="-1">Version 1.0.0-alpha12</h3> <p>February 10, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha12</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha12</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6950aab50fe6c9f7e9d97cf865161f2d3999eb9e..9ed3262e0dfca1d352bdbf8f8e10253a61ef6218/compose/foundation">Version 1.0.0-alpha12 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Modifier.pointerInput now requires remember keys to indicate when the pointer input detection coroutine should restart for new dependencies. (<a href="https://android-review.googlesource.com/#/q/I849cd63912b2d4c86ebe0dd24a7d0e2eb7a4e6d1">I849cd</a>)</li> <li>Testing update: hasText() will check for both input and label/hint/placeholder texts in the text field (<a href="https://android-review.googlesource.com/#/q/Iab8030e3c98f05bd6f0ffaf203b8c15acab513bb">Iab803</a>)</li> <li>PaddingValues.Absolute was added and can be used in APIs accepting PaddingValues. (<a href="https://android-review.googlesource.com/#/q/Ia5f30058d0e5e9549132cdad9b1611a20c975359">Ia5f30</a>)</li> <li>onImeActionPerformed is deprecated. use KeyboardActions instead (<a href="https://android-review.googlesource.com/#/q/If0bbda1241018d4c19b5df3cd1811c38cce4a76d">If0bbd</a>, <a href="https://issuetracker.google.com/issues/179071523">b/179071523</a>)</li> <li>In order to better match naming conventions with ImageBitmap and ImageVector, ImagePainter has been renamed to BitmapPainter to parallel VectorPainter. (<a href="https://android-review.googlesource.com/#/q/Iba3810ae5cfd6f57442154c93eec500f35ba4ad5">Iba381</a>, <a href="https://issuetracker.google.com/issues/174565889">b/174565889</a>)</li> <li>Better substring test APIs with substring now as an argument (<a href="https://android-review.googlesource.com/#/q/Icbe78369fe75bc01bfcfa25b8e9ee2ad148fdb96">Icbe78</a>)</li> <li>Introduced an <code translate="no" dir="ltr">InfiniteAnimationPolicy</code> coroutine context element that will be applied in infinite animations. By default no policy is installed, except when running tests with <code translate="no" dir="ltr">ComposeTestRule</code>. (<a href="https://android-review.googlesource.com/#/q/I50ec421d7db495459a61c9282dbc2bfbc1f1ad02">I50ec4</a>, <a href="https://issuetracker.google.com/issues/151940543">b/151940543</a>)</li> <li>Animatable.snapTo and Animatable.stop are now suspend functions (<a href="https://android-review.googlesource.com/#/q/If42887504caa0a07a0d89477805b68ca51c9b3b4">If4288</a>)</li> <li>ComponentActivity.setContent has moved to androidx.activity.compose.setContent in the androidx.activity:activity-compose module. (<a href="https://android-review.googlesource.com/#/q/Icf4168e6078b87ce746569a946b2a90274197c72">Icf416</a>)</li> <li>Destructuring and copy() methods have been removed from several classes where they were rarely used. (<a href="https://android-review.googlesource.com/#/q/I267021d3a45314acc9a169f6bbdfbfb4295a448c">I26702</a>, <a href="https://issuetracker.google.com/issues/178659281">b/178659281</a>)</li> <li><p>Custom keys support for LazyColumn/LazyRow was added. This allows us to smarter handle items reordering. So the state you stored in remember {} blocks will move together with the item when you reorder elements or removed the item from the middle.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-n">LazyColumn</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">items</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">users</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">key</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">user</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">user</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">id</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">})</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">...</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <ul> <li>(<a href="https://android-review.googlesource.com/#/q/Ia50ef7cd8f47ab87d76edc4e0691199ce426729d">Ia50ef</a>, <a href="https://issuetracker.google.com/issues/164901852">b/164901852</a>)</li> </ul></li> <li><p>Changed Indication#createInstance to be @Composable, and changed LocalIndication to contain an Indication, not () -> Indication. (<a href="https://android-review.googlesource.com/#/q/I5eeea2424e4deda6116f0b48b690b628f8d545eb">I5eeea</a>, <a href="https://issuetracker.google.com/issues/157150564">b/157150564</a>)</p></li> <li><p><code translate="no" dir="ltr">Constraints.enforce</code> was replaced with <code translate="no" dir="ltr">Constraints.constrain</code>. (<a href="https://android-review.googlesource.com/#/q/I8b8ea7898b09ccaa411b9b6ef20a16523e8ba029">I8b8ea</a>)</p></li> <li><p>loadFontResource is deprecated. Use fontResource instead. imageResource, loadImageResource, vectorResource, and loadVectorResource are deprecated. Use painterResource instead. (<a href="https://android-review.googlesource.com/#/q/I6b8096508b2280ca49c70a432c5497f386dc570e">I6b809</a>)</p></li> <li><p>For performance reasons, ScrollAxisRange semantics now takes lambdas returning Floats instead of direct Float values. (<a href="https://android-review.googlesource.com/#/q/If4a353ef9ac511ce77cf334ccf9a589ecadcac56">If4a35</a>, <a href="https://issuetracker.google.com/issues/178657186">b/178657186</a>)</p></li> <li><p>Added EditableText semantics to mark editable input text of the text field for accessibility and corresponding test methods to check the semantics (<a href="https://android-review.googlesource.com/#/q/I8e07ab8a8f29d5c2a31fb1c979e099303083a38f">I8e07a</a>)</p></li> <li><p>Modifier.clickable now doesn't have double and long click support. Use Modifier.combinedClickable to achieve this functionality. (<a href="https://android-review.googlesource.com/#/q/Iafad17bbdb5029ce413bce94cd47f7c5233cb67b">Iafad1</a>)</p></li> <li><p>toIntPx() was renamed to roundToPx(). (<a href="https://android-review.googlesource.com/#/q/I9b7e460fb4b6e72ba65cdd8f5d1165c306461773">I9b7e4</a>, <a href="https://issuetracker.google.com/issues/173502290">b/173502290</a>)</p></li> <li><p>IntBounds was renamed to IntRect and the API was improved. (<a href="https://android-review.googlesource.com/#/q/I1f6ff3831e502856f1550ede9c367bf05c5a51b1">I1f6ff</a>)</p></li> <li><p>Modifier.dragGestureFilter has been deprecated. Use <code translate="no" dir="ltr">Modifier.pointerInput { detectDragGestures (...)}</code> instead. Alternatively, use Modifier.draggable for one axis drags (<a href="https://android-review.googlesource.com/#/q/I0ba93559f565fc2a277f322e53dce9df9855ea46">I0ba93</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>Renamed Ambients to match the Ambient -> CompositionLocal rename. Ambients used to be named AmbientFoo, now CompositionLocals are named LocalFoo. (<a href="https://android-review.googlesource.com/#/q/I2d55d1c5c38a08b04e72a569d3079db4feca1bf7">I2d55d</a>)</p></li> <li><p>Selection was moved to foundation. (<a href="https://android-review.googlesource.com/#/q/I7892b8be5d2f91849f8ecc2e1034e0a8277bb61c">I7892b</a>)</p></li> <li><p>Similarly to how we previously removed <code translate="no" dir="ltr">state { 0 }</code> composable and now promote usage like <code translate="no" dir="ltr">remember { mutableStateOf(0) }</code> we are going to remove <code translate="no" dir="ltr">savedInstanceState { 0 }</code> composable. You should use <code translate="no" dir="ltr">rememberSaveable { mutableStateOf(0) }</code> instead and it will save and restore automatically if the type used inside the MutableState can be stored in the Bundle. If previously you were passing a custom saver object now you need to use a new overload of rememberSaveable which has the <code translate="no" dir="ltr">stateSaver</code> parameter. The usage will look like this: <code translate="no" dir="ltr">val holder = rememberSaveable(stateSaver = HolderSaver) { mutableStateOf(Holder(0)) }</code> (<a href="https://android-review.googlesource.com/#/q/Ib4c266902d166f119ea1770cccbc78ac25a54ff7">Ib4c26</a>, <a href="https://issuetracker.google.com/issues/177338004">b/177338004</a>)</p></li> <li><p>Added password semantics for accessibility (<a href="https://android-review.googlesource.com/#/q/I231ce1c1e9c781c8ec8fda5536d8a0588d68755d">I231ce</a>)</p></li> <li><p>Added ProgressBarRangeInfo.Indeterminate to mark indeterminate progress bars for accessibility (<a href="https://android-review.googlesource.com/#/q/I6fe052ba60861d64f31963507ff11e95f3331d89">I6fe05</a>)</p></li> <li><p>Playtime in animation is now unfiied to nanoseconds (<a href="https://android-review.googlesource.com/#/q/If776ab3406909ddf6d841dc2e71fc0889db77047">If776a</a>)</p></li> <li><p>@ComposableContract has been deprecated in favor of three more specific annotations.</p> <p><code translate="no" dir="ltr">@ComposableContract(restartable = false)</code> has become <code translate="no" dir="ltr">@NonRestartableComposable</code> <code translate="no" dir="ltr">@ComposableContract(readonly = true)</code> has become <code translate="no" dir="ltr">@ReadOnlyComposable</code> <code translate="no" dir="ltr">@ComposableContract(preventCapture = true)</code> has become <code translate="no" dir="ltr">@DisallowComposableCalls</code> <code translate="no" dir="ltr">@ComposableContract(tracked = true)</code> has been removed. (<a href="https://android-review.googlesource.com/#/q/I60a9db0287dc0e03b38e6cf31a7d435026a2ce0f">I60a9d</a>)</p></li> <li><p><code translate="no" dir="ltr">emptyContent()</code> and <code translate="no" dir="ltr">(@Composable () -> Unit).orEmpty()</code> utilities have been deprecated as they no longer have any positive performance impact or value (<a href="https://android-review.googlesource.com/#/q/I0484d3ef439993d05eea86e53f05997eced590ab">I0484d</a>)</p></li> <li><p>Recomposers can now be closed. Closed recomposers will continue recomposition until composition child coroutines complete. Recomposer.shutDown renamed to cancel to contrast with close. (<a href="https://android-review.googlesource.com/#/q/Ib6d766b91381ee45af41a14b7951c48f794f0a90">Ib6d76</a>)</p></li> <li><p>APIs related to LazyVerticalGrid are marked as experimental (<a href="https://android-review.googlesource.com/#/q/Ia53e3b055e4278f67d52df379f3f65c2a10adcc4">Ia53e3</a>, <a href="https://issuetracker.google.com/issues/178519862">b/178519862</a>)</p></li> <li><p>rememberSavedInstanceState() was renamed to rememberSaveable() and moved to androidx.compose.runtime.saveable package. (<a href="https://android-review.googlesource.com/#/q/I1366e7fef0a5a56a43d6eeb3770967a9bf683380">I1366e</a>, <a href="https://issuetracker.google.com/issues/177338004">b/177338004</a>)</p></li> <li><p>RestorableStateHolder was renamed to SaveableStateHolder and moved to androidx.compose.runtime.saveable package. Inner method RestorableStateProvider was renamed to SaveableStateProvider. Generic type was removed so you can just pass Any as a key. Experimental annotation is not needed anymore. (<a href="https://android-review.googlesource.com/#/q/I0902eb1618d36d08ade37be7b6a9453d85b1af62">I0902e</a>, <a href="https://issuetracker.google.com/issues/174598702">b/174598702</a>)</p></li> <li><p>Saver, listSaver(), mapSaver(), autoSaver was moved from androidx.compose.runtime.savedinstancestate to androidx.compose.runtime.saveable (<a href="https://android-review.googlesource.com/#/q/I77fe618aa5e124891b84973d8b8b12735f9f909e">I77fe6</a>)</p></li> <li><p>Artefact androidx:compose:runtime:runtime-saved-instance-state was renamed to androidx:compose:runtime:runtime-saveable (<a href="https://android-review.googlesource.com/#/q/I6dcac2489cf4ec4f17b8ce73bba6eab955a54c6d">I6dcac</a>)</p></li> <li><p>Many longstanding deprecated APIs in the ui package are deleted. (<a href="https://android-review.googlesource.com/#/q/I2f2dcaf64fe719c6f2387202f3d0a5699d892657">I2f2dc</a>)</p></li> <li><p>The compose:runtime-dispatch artifact is now deprecated. MonotonicFrameClock can now be found in compose:runtime and AndroidUiDispatcher can be found in compose:ui. (<a href="https://android-review.googlesource.com/#/q/Ib5c36a427306eceac4b9b16b52a091e864e5b936">Ib5c36</a>)</p></li> <li><p>Parameters on RounderCornerShape, CutCornerShape and CornerBasedShape were renamed from left/right to start/end in order to support the shape's auto mirroring in the rtl direction. AbsoluteRounderCornerShape and AbsoluteCutCornerShape were introduced for the cases when auto-mirroring is not desired. (<a href="https://android-review.googlesource.com/#/q/I61040b7bba950191361af89ff4c736ef6cb56235">I61040</a>, <a href="https://issuetracker.google.com/issues/152756983">b/152756983</a>)</p></li> <li><p>canDrag has been removed from the Modifier.scrollable. (<a href="https://android-review.googlesource.com/#/q/Id66e70ac186ffbdd05e2a62af26c7a41e85f02e9">Id66e7</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>The API the Compose compiler plugin targets has been refactored to use an interface instead of a concrete class. The interface also no longer uses a type parameter.</p> <p>This is an internal change that should not effect source code compatibility but is a binary breaking change. (<a href="https://android-review.googlesource.com/#/q/I3b9229969aa70138bc57f5e8498602f5b2dba1e6">I3b922</a>, <a href="https://issuetracker.google.com/issues/169406779">b/169406779</a>)</p></li> <li><p>Modifier.scaleGestureFilter has been removed. Use Modifier.zoomable instead. Alternatively, use <code translate="no" dir="ltr">Modifier.pointerInput { detectMultitouchGestures { ... }}</code> (<a href="https://android-review.googlesource.com/#/q/Id5da14604597ffe92bf1dd32837a34b462eaa80d">Id5da1</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>AnimatedValue/Float is now deprecated. Please use Animatable instead. (<a href="https://android-review.googlesource.com/#/q/I713457f88b04e50fbc5deb70a5bb7bbcf777e630">I71345</a>, <a href="https://issuetracker.google.com/issues/177457083">b/177457083</a>)</p></li> <li><ul> <li>Removed CoreText and CoreTextField from public API</li> </ul> <ul> <li>Removed deprecated SelectionContainer overload (<a href="https://android-review.googlesource.com/#/q/I99c199c4f9055da1e668d9d799ef11c90239df5b">I99c19</a>)</li> </ul></li> <li><p>Remove deprecated non-suspend scrolling functions Continuing with the changes from last release, the non-suspend scrolling functions are now removed entirely. Please convert to the suspend functions with the same names. A coroutine scope can be obtained via rememberCoroutineScope(). (<a href="https://android-review.googlesource.com/#/q/I3d39c25a1d6790ee5c378f298ffe7af62047810f">I3d39c</a>, <a href="https://issuetracker.google.com/issues/178169563">b/178169563</a>)</p></li> <li><p>androidx.compose.foundation.layout.ConstraintLayout was deprecated in favor of androidx.constraintlayout.compose.ConstraintLayout. You will need to add a dependency on <code translate="no" dir="ltr">androidx.constraintlayout:constraintlayout-compose:1.0.0-alpha01</code>. (<a href="https://android-review.googlesource.com/#/q/I87adc8984e1bb9cb8f76b5779f7c90eab48d2e36">I87adc</a>)</p></li> <li><p>tapGestureFilter, doubleTapGestureFilter, longPressGestureFilter and pressIndicaitonGestureFilter have been deprecated. Use Modifier.clickable or Modifier.pointerInput with detectTapGestures function instead. (<a href="https://android-review.googlesource.com/#/q/I6baf95f881b6fa6890ca1d065d49fef3e27bce83">I6baf9</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>Removed <code translate="no" dir="ltr">Recomposer.current()</code>. [Abstract]ComposeView now default to lazily created, window-scoped Recomposers driven by the ViewTreeLifecycleOwner for the window. Recomposition and withFrameNanos-based animation ticks are paused while the host Lifecycle is stopped. (<a href="https://android-review.googlesource.com/#/q/I38e11565b2fc776966b6b6984aceafd8a1e6fed1">I38e11</a>)</p></li> <li><p>Recomposer.runningRecomposers now offers a global StateFlow of read-only RecomposerInfo for observing ongoing composition state in the process. Prefer this API to Recomposer.current(), which is now deprecated. (<a href="https://android-review.googlesource.com/#/q/If8ebe3959cfe71682ad372382d3b720035ef1605">If8ebe</a>)</p></li> </ul> <h3 id="1.0.0-alpha11" data-text="Version 1.0.0-alpha11" tabindex="-1">Version 1.0.0-alpha11</h3> <p>January 28, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha11</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha11</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6207afb1646d302c5d29c2c67d332b48db87fb27..6950aab50fe6c9f7e9d97cf865161f2d3999eb9e/compose/foundation">Version 1.0.0-alpha11 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><p>Deprecate non-suspend scrollBy, remove non-suspend scrollTo</p> <p>We now recommend using suspend functions to control scrolling and wait for the scroll to finish. We are deprecating and/or removing the non-suspend versions of these functions as part of this transition. (<a href="https://android-review.googlesource.com/#/q/Ie9cedf8bc71b54353a175699901edd92f850d02c">Ie9ced</a>)</p></li> <li><p>Deprecate non-suspend smoothScrollBy We now recommend using suspend functions to control scrolling and wait for the scroll to finish. We are deprecating the non-suspend versions of these functions as part of this transition. (<a href="https://android-review.googlesource.com/#/q/I128806c8aea7f17758d1a5d953bbe40e3bcc1b18">I12880</a>)</p></li> <li><p>Content description parameter has been added to the Image and Icon. It is used to provide description to the accessibility services (<a href="https://android-review.googlesource.com/#/q/I2ac4c1058ed0bf1e5756cc6cdae546806974409e">I2ac4c</a>)</p></li> <li><p>BasicTextField received a new parameter called 'decorationBox'. It allows to add the decorations like icons, placeholder, label and similar to the text field and increase the hit target area of it. (<a href="https://android-review.googlesource.com/#/q/I169960830df82b0406ac4b6868ea544c9f848403">I16996</a>)</p></li> <li><p>canDrag parameter has been removed from the Modifier.draggable (<a href="https://android-review.googlesource.com/#/q/Ic4bec74b6fb3a9306abe4fdee7c6961ad3a62d77">Ic4bec</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>AnimatedFloat.fling that accepts FlingConfig has been removed. Please use suspend Animatable.animateDecay instead. (<a href="https://android-review.googlesource.com/#/q/I4659b606834e8325473fd672d824114b8ec20173">I4659b</a>, <a href="https://issuetracker.google.com/issues/177457083">b/177457083</a>)</p></li> <li><p>Removed <code translate="no" dir="ltr">data class</code> from the following classes:</p> <ul> <li>InlineTextContent</li> <li>LocaleList</li> <li>(<a href="https://android-review.googlesource.com/#/q/I605c7a0e257f0a52db29f8d82ee449e4ed2c9d8e">I605c7</a>)</li> </ul></li> <li><p>clickable, toggleable and selectable can be created outside of composition now (<a href="https://android-review.googlesource.com/#/q/I0a130bfa57713c96cc8b52c67becd32145526685">I0a130</a>, <a href="https://issuetracker.google.com/issues/172938345">b/172938345</a>, <a href="https://issuetracker.google.com/issues/175294473">b/175294473</a>)</p></li> <li><p>ScrollableColumn/Row were deprecated. Using ScrollableColumn is less efficient comparing to LazyColumn when you have a large scrolling content because with LazyColumn we can only compose/measure/draw visible elements. To prevent users from going inefficient way we decided to deprecate ScrollableColumn and ScrollableRow and promote usages of LazyColumn and LazyRow instead. Users can still decide they don't need the lazy behaviour and use the modifiers directly like this: Column(Modifier.verticalScroll(rememberScrollState())) (<a href="https://android-review.googlesource.com/#/q/Ib976b534e063a86a2c587762b786a23e32cc61b6">Ib976b</a>, <a href="https://issuetracker.google.com/issues/170468083">b/170468083</a>)</p></li> <li><p>New <code translate="no" dir="ltr">items(count: Int)</code> factory method for scope of LazyColumn/LazyRow/LazyVerticalGrid. <code translate="no" dir="ltr">items(items: List)</code> and <code translate="no" dir="ltr">itemsIndexed(items: List)</code> are now extension functions so you have to manually import them when used. New extension overloads for Arrays: items(items: Array) and itemsIndexed(Array) (<a href="https://android-review.googlesource.com/#/q/I803fc5f25fac55855c710ff5064f11525f7b6010">I803fc</a>, <a href="https://issuetracker.google.com/issues/175562574">b/175562574</a>)</p></li> <li><p>The deprecated AbsoluteArrangement was removed. (<a href="https://android-review.googlesource.com/#/q/Iffa9670e9c19bc92c48eadbb28783935034e835e">Iffa96</a>, <a href="https://issuetracker.google.com/issues/177641870">b/177641870</a>)</p></li> <li><p>The propagateMinConstraints parameter was added to Box, for specifying whether the incoming min constraints should be passed to the content of the Box or not. Default is false. (<a href="https://android-review.googlesource.com/#/q/I0125bbce017b1ea8587501ace9dea02f7971c01a">I0125b</a>, <a href="https://issuetracker.google.com/issues/152613457">b/152613457</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>onCommit, onDispose, and onActive have been deprecated in favor of SideEffect and DisposableEffect APIs (<a href="https://android-review.googlesource.com/#/q/If760ec2a190c4121a35006695d953010ac22a43a">If760e</a>)</li> <li>WithConstraints was reworked as BoxWithConstraints and moved to foundation.layout. (<a href="https://android-review.googlesource.com/#/q/I9420b9e0fbea7ee048b23a6ef328165bbb11e8a8">I9420b</a>, <a href="https://issuetracker.google.com/issues/173387208">b/173387208</a>)</li> <li><p>Changes to factory functions for Font/FontFamily/Typeface</p> <ul> <li>Added factory functions that start with capital letter</li> <li>Deprecated previous factory functions with lowercase first letters</li> <li>New factory functions return the FontFamily instead of subclasses</li> <li>Hid constructors of the subclasses, so that they can only be constructed via factory functions.</li> <li>Renamed Font.asFontFamily to Font.toFontFamily</li> <li>(<a href="https://android-review.googlesource.com/#/q/I42aa7f9fb7e11eb708bc9e9828f65c57c6c9320b">I42aa7</a>)</li> </ul></li> <li><p>Introduced <code translate="no" dir="ltr">ComposeContentTestRule</code>, which extends <code translate="no" dir="ltr">ComposeTestRule</code> and defines <code translate="no" dir="ltr">setContent</code>, which has been removed from <code translate="no" dir="ltr">ComposeTestRule</code>. Added a factory method <code translate="no" dir="ltr">createEmptyComposeRule()</code> that returns a <code translate="no" dir="ltr">ComposeTestRule</code> and does not launch an Activity for you. Use this when you want to launch your Activity during your test, e.g. using <code translate="no" dir="ltr">ActivityScenario.launch</code> (<a href="https://android-review.googlesource.com/#/q/I9d78283c27d87a3135071884e115bbd814492c47">I9d782</a>, <a href="https://issuetracker.google.com/issues/174472899">b/174472899</a>)</p></li> <li><p>animateAsState is now animateFooAsState, where Foo is the type of the variable being animated. e.g. Float, Dp, Offset, etc (<a href="https://android-review.googlesource.com/#/q/Ie7e25c8978996334b0dcc757b07df1434ff346aa">Ie7e25</a>)</p></li> <li><p>Density is now receiver scope for Arrangement interfaces. (<a href="https://android-review.googlesource.com/#/q/I18aadb928b615b64ddd6ac41fb630e2ece470f08">I18aad</a>)</p></li> <li><p>TextFieldValue accepts AnnotatedString. However this is an API only change and multi-style text editing is not implemented yet.</p> <ul> <li>Removed <code translate="no" dir="ltr">initial</code> from EditingBuffer constructor parameters. (<a href="https://android-review.googlesource.com/#/q/I326d534a69911fdd39097cdb42e9341ee7987130">I326d5</a>)</li> </ul></li> <li><p>invalidate and compositionReference() are now deprecated in favor of currentRecomposeScope and rememberCompositionReference respectively. (<a href="https://android-review.googlesource.com/#/q/I583a8efa6e3d3bc303792b825b948b3722ada103">I583a8</a>)</p></li> <li><p>AnnotatedString is changed to extend from kotlin.CharSequence. Therefore length and subSequence are now instance functions, and extension functions are removed. (<a href="https://android-review.googlesource.com/#/q/Iaf429c94da9f1867cc0815cb26933961a71cc629">Iaf429</a>)</p></li> <li><p>Duration and Uptime will be replace with Long milliseconds, and this step removes the dependency of pointer input on those classes. (<a href="https://android-review.googlesource.com/#/q/Ia33b2d6835861501019481b388cb2c99441c346c">Ia33b2</a>, <a href="https://issuetracker.google.com/issues/175142755">b/175142755</a>, <a href="https://issuetracker.google.com/issues/177420019">b/177420019</a>)</p></li> <li><p>RememberObserver replaces CompositionLifecycleObserver and CompositionLifecycleObserver is now deprecated.</p> <p><code translate="no" dir="ltr">RememberObserver</code> is a replacement for <code translate="no" dir="ltr">CompositionLifecycleObserver</code> with modified semantics and renamed methods. Changing to the new API can be done mechanically for objects that are only remembered once which is, and continues to be, the recommended practice. However, if a reference was remembered more than once in a composition <code translate="no" dir="ltr">onRemembered</code> is called for each reference where <code translate="no" dir="ltr">onEnter</code> is only called once. <code translate="no" dir="ltr">onEnter</code> was called multiple time if the object was used in subcompositions, such as <code translate="no" dir="ltr">WithConstraints</code> and <code translate="no" dir="ltr">Scaffold</code> making the single <code translate="no" dir="ltr">onEnter</code> call guarantee unreliable and it was removed for <code translate="no" dir="ltr">RememberObserver</code>.</p> <p><code translate="no" dir="ltr">RememberObserver</code> adds <code translate="no" dir="ltr">onAbandoned</code> which is called if the <code translate="no" dir="ltr">RememberObserver</code> instance is returned from the callback passed to <code translate="no" dir="ltr">remember</code> but was not remembered in the composition state and, therefore, will never have <code translate="no" dir="ltr">onRemembered</code> called. This can occur if an exception terminates composition before completing or the composition is discarded because the state is was producing a composition for is no longer current or otherwise is no longer needed. If the instance of <code translate="no" dir="ltr">RememberObserver</code> following the single reference recommendation above is tracking an external resource both <code translate="no" dir="ltr">onForgotten</code> and <code translate="no" dir="ltr">onAbandoned</code> each indicate that the resource is no longer needed. If the object is tracking work started or resources allocated in <code translate="no" dir="ltr">onRemembered</code>, <code translate="no" dir="ltr">onAbandoned</code> can be ignored as it will not be called if <code translate="no" dir="ltr">onRemembered</code> is called. (<a href="https://android-review.googlesource.com/#/q/I02c364f517507abd6a5c071fb527192ad1d77239">I02c36</a>)</p></li> <li><p>Renamed TransformedText.transformedText to TransformedText.text</p> <ul> <li>TransformedText is no longer a data class (<a href="https://android-review.googlesource.com/#/q/Ie672ad03d475ce6a9bf21b8c74a431592b01040b">Ie672a</a>)</li> </ul></li> <li><p>The following classes are not data classes anymore:</p> <ul> <li>AnnotatedString</li> <li>ParagraphStyle</li> <li>SpanStyle</li> <li>TextStyle</li> <li>FontWeight</li> <li>TextDecoration</li> <li>TextGeometricTransform</li> <li>TextIndex</li> <li>TextLayoutResult</li> <li>TextLayoutInput (<a href="https://android-review.googlesource.com/#/q/Iaff995cc24f578b5ffd397aa12a6c98b75182e80">Iaff99</a>)</li> </ul></li> <li><p>Removed experimental monotonicFrameAnimationClockOf methods (<a href="https://android-review.googlesource.com/#/q/Ib753f5d3cb77dabc7727f677a73bb7da8dae5fe2">Ib753f</a>, <a href="https://issuetracker.google.com/issues/170708374">b/170708374</a>)</p></li> <li><p>Deprecated global coordinates methods and made new window-based coordinates methods. (<a href="https://android-review.googlesource.com/#/q/Iee284dee7dbc4226493feb144d446a0289b7c83e">Iee284</a>)</p></li> <li><p>Please use ImeAction.None instead of ImeAction.NoAction</p> <ul> <li>Please use ImeAction.Default instead of ImeAction.Unspecified (<a href="https://android-review.googlesource.com/#/q/Ie1bcc7bc3828c757e497b85c4dd70d37764f616f">Ie1bcc</a>)</li> </ul></li> <li><p>FocusRequester.createRefs is now marked as experimental as it might change. (<a href="https://android-review.googlesource.com/#/q/I2d898d56ed0ac33f5a08253509cfd811ee0e8a5d">I2d898</a>, <a href="https://issuetracker.google.com/issues/177000821">b/177000821</a>)</p></li> <li><p>SemanticsPropertyReceiver.hidden was renamed to invisibleToUser and marked @ExperimentalComposeUiApi. AccessibilityRangeInfo was renamed to ProgressBarRangeInfo. stateDescriptionRange was renamed to progressBarRangeInfo. AccessibilityScrollState was renamed to ScrollAxisRange. horizontalAccessibilityScrollState was renamed to horizontalScrollAxisRange. verticalAccessibilityScrollState was renamed to verticalScrollAxisRange. (<a href="https://android-review.googlesource.com/#/q/Id31487aa7cbddf4d3d163999afae458cdab4dc8a">Id3148</a>)</p></li> <li><p>Changed VisualTransformation to be a functional interface (<a href="https://android-review.googlesource.com/#/q/I3bba482675b65f234f5d46676f1e70853b21c051">I3bba4</a>)</p></li> <li><p>Leverage TestCoroutineDispatcher in testing (<a href="https://android-review.googlesource.com/#/q/I532b68e37ea6f72964fdcc267e397d285cffd9ad">I532b6</a>)</p></li> <li><p>Removed PointerInputData and modified PointerInputChange to give it all of PointerInputData's fields. Made PointerInputEvent and PointerInputEventData internal because they aren't used in any public API. (<a href="https://android-review.googlesource.com/#/q/Ifff970815031482a0ac1d5dab42a6156e10154b1">Ifff97</a>, <a href="https://issuetracker.google.com/issues/175142755">b/175142755</a>)</p></li> <li><p>Renamed TextInputService.onStateUpdated as updateState (<a href="https://android-review.googlesource.com/#/q/Id4853b777bb81a4645d1b41b5dff874322949022">Id4853</a>)</p></li> <li><p>Remove displaySize as it should be avoided. Typically it is better to use size of onRoot() or window size at least. (<a href="https://android-review.googlesource.com/#/q/I62db4535f36b09ab6f0b874c221ece0b352db962">I62db4</a>)</p></li> </ul> <h3 id="1.0.0-alpha10" data-text="Version 1.0.0-alpha10" tabindex="-1">Version 1.0.0-alpha10</h3> <p>January 13, 2021</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha10</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha10</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/72f02c12e4709ab41ae0fea9a8a668d5267a1df8..6207afb1646d302c5d29c2c67d332b48db87fb27/compose/foundation">Version 1.0.0-alpha10 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>ImeOptions and KeyboardOptions are no more a data class (<a href="https://android-review.googlesource.com/#/q/I3c898ecf1f83f64bc9886a088af4fa2a12adcff7">I3c898</a>, <a href="https://issuetracker.google.com/issues/168684531">b/168684531</a>)</li> <li>VisualTransformation API Changes <ul> <li>Renamed OffsetMap to OffsetMapping</li> <li>Renamed OffsetMapping.identityOffsetMap to OffsetMapping.Identity</li> <li>PasswordTransformation is no longer data-class</li> <li>Moved OffsetMapping to its own file</li> <li>(<a href="https://android-review.googlesource.com/#/q/I0bdf3e90ac4a1d8e6e2a3c5762f51016561f2da8">I0bdf3</a>)</li> </ul></li> <li>EditOperations API Changes <ul> <li>Renamed EditOperation as EditCommand</li> <li>Added Command suffix for EditOperation concrete implementations</li> <li>EditCommand's are no longer data classes</li> <li>Renamed EditOperation.process function to applyTo</li> <li>Renamed InputEventListener to InputEventCallback</li> <li>(<a href="https://android-review.googlesource.com/#/q/I0a366ac29c7a373efc36eb544bb759eba7f79f3d">I0a366</a>)</li> </ul></li> <li>Modified Velocity to have component parts and mathematical operations. (<a href="https://android-review.googlesource.com/#/q/Ib0447d694d7c5dc82fcef7448faeb0cdda87fced">Ib0447</a>)</li> <li>Renamed @ExperimentalTesting to @ExperimentalTestApi to be consistent with similar experimental api annotations (<a href="https://android-review.googlesource.com/#/q/Ia4502a82d5b66328b6e3e3cd322614939816901e">Ia4502</a>, <a href="https://issuetracker.google.com/issues/171464963">b/171464963</a>)</li> <li>Added experimental stickyHeader method for LazyColumn/LazyRow (<a href="https://android-review.googlesource.com/#/q/I0a81d453bc0d66501a183813af58aef34cfecaf3">I0a81d</a>)</li> <li>Ranamed Color.useOrElse() to Color.takeOrElse() (<a href="https://android-review.googlesource.com/#/q/Ifdcf503101fa33b1eaf729a33ac14d0dc03f66ff">Ifdcf5</a>)</li> <li>Deprecated TestUiDispatcher. Use Dispatchers.Main instead (<a href="https://android-review.googlesource.com/#/q/Ic171f9e9da0d7c8d3688754e0f5eed482a668560">Ic171f</a>, <a href="https://issuetracker.google.com/issues/175385255">b/175385255</a>)</li> <li>Add Toggle to foundation Strings.kt (<a href="https://android-review.googlesource.com/#/q/I4a5b74e3ed9bc3b1acd09af221331ef6ab51b9fe">I4a5b7</a>, <a href="https://issuetracker.google.com/issues/172366489">b/172366489</a>)</li> <li>Moved nativeClass to ui module and made it internal. Updated usages of nativeClass in equals implementations to use 'is MyClass' instead. (<a href="https://android-review.googlesource.com/#/q/I4f7340266d36552665f0a059ab34e9b886926f0b">I4f734</a>)</li> <li>FlowRow and FlowColumn were deprecated. Please use a custom layout instead. (<a href="https://android-review.googlesource.com/#/q/I0902712b97eed1baecddf605bbac0246938c812d">I09027</a>)</li> <li>Modifier.focus() and Modifier.focusRequester() are deprecated. Use Modifier.focusModifier() and Modifier.focusReference() instead. (<a href="https://android-review.googlesource.com/#/q/I75a483954b69de794c5d7be9efc236b6d6b8fcad">I75a48</a>, <a href="https://issuetracker.google.com/issues/175160751">b/175160751</a>, <a href="https://issuetracker.google.com/issues/175160532">b/175160532</a>, <a href="https://issuetracker.google.com/issues/175077829">b/175077829</a>)</li> <li>Introduced SelectionRegistrar.notifySelectableChange to notify Selectable updates to SelectionManager. (<a href="https://android-review.googlesource.com/#/q/I6ff3055300ca7316ad644a4bcf7872d0d48878b8">I6ff30</a>, <a href="https://issuetracker.google.com/issues/173215242">b/173215242</a>)</li> <li>Changed <code translate="no" dir="ltr">fun Dp.isFinite()</code> to a <code translate="no" dir="ltr">val Dp.isFinite</code> (<a href="https://android-review.googlesource.com/#/q/I50e0035e772c40d61500f56453cd02bb0d9dee70">I50e00</a>)</li> <li>Constraints#satisfiedBy was renamed to isSatisfiedBy. (<a href="https://android-review.googlesource.com/#/q/I9cf5c5c15c90adaf95d91eef3da4d695733268e9">I9cf5c</a>)</li> <li>Added isSpecified, isUnspecified, and useOrElse for inline classes with an Unspecified constant. (<a href="https://android-review.googlesource.com/#/q/I93f7b4f1b6c3ef08a3fc6d89fa397a122ef41348">I93f7b</a>, <a href="https://issuetracker.google.com/issues/174310811">b/174310811</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>New coroutine-based API <code translate="no" dir="ltr">Animatable</code> that ensures mutual exclusiveness among its animations. New DecayAnimationSpec to support multi-dimensional decay animation (<a href="https://android-review.googlesource.com/#/q/I820f29e24eaa512515c776db971444290dea97e9">I820f2</a>, <a href="https://issuetracker.google.com/issues/168014930">b/168014930</a>)</li> <li>Added support for disabled and read-only text fields (<a href="https://android-review.googlesource.com/#/q/I352791811a7b75189013e1ed73c9834cfa5ce961">I35279</a>, <a href="https://issuetracker.google.com/issues/171040474">b/171040474</a>, <a href="https://issuetracker.google.com/issues/166478534">b/166478534</a>)</li> <li><code translate="no" dir="ltr">animate()</code> is now replaced with <code translate="no" dir="ltr">animateAsState()</code>, which returns a <code translate="no" dir="ltr">State<T></code> instead of <code translate="no" dir="ltr">T</code>. This allows better performance, as the invalidation scope can be narrowed down to where the State value is read. (<a href="https://android-review.googlesource.com/#/q/Ib179e3f5f4bf3b72f7445fc22e73c46af7cf74de">Ib179e</a>)</li> <li>Add Semantics role API and add Role as a parameter to clickable, selectable and toggleable SemanticsModifier. Changed Modifier.progressSemantics so that Slider can also use it. (<a href="https://android-review.googlesource.com/#/q/I216cd5b9118581e569c48a095f009c841ed4418b">I216cd</a>)</li> <li>The native keyEvent can now be accessed through keyEvent.nativeKeyEvent (<a href="https://android-review.googlesource.com/#/q/I87c57d68b76441fe92d2b91f58385832fc40ec8d">I87c57</a>, <a href="https://issuetracker.google.com/issues/173086397">b/173086397</a>)</li> </ul> <h3 id="1.0.0-alpha09" data-text="Version 1.0.0-alpha09" tabindex="-1">Version 1.0.0-alpha09</h3> <p>December 16, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha09</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha09</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/10b5e9fd366c1c413d5576aed50a305d300938e1..72f02c12e4709ab41ae0fea9a8a668d5267a1df8/compose/foundation">Version 1.0.0-alpha09 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><p>Add Scrollable interface</p> <p>This allows ScrollState and LazyListState to be treated as a common type, allowing custom scrolling to be implemented across both types.</p> <p>This also moves smoothScrollBy to an extension function on Scrollable, taking advantage of this functionality. (<a href="https://android-review.googlesource.com/#/q/I2153bebb540136618210dc0e3980eae788c01392">I2153b</a>)</p></li> <li><p>LazyVerticalGrid is added. (<a href="https://android-review.googlesource.com/#/q/I172670e5a6648278604e9ad024d3db17c9c6974b">I17267</a>, <a href="https://issuetracker.google.com/issues/162213211">b/162213211</a>)</p></li> <li><p>Deprecate LazyColumnFor, LazyRowFor, LazyColumnForIndexed and LazyRowForIndexed. Use LazyColumn and LazyRow instead (<a href="https://android-review.googlesource.com/#/q/I5b48c8a3b1fef2f603ab69ded1d19709aa9f87fb">I5b48c</a>)</p></li> <li><p>For suspending pointer input APIs, renamed HandlePointerInputScope to AwaitPointerEventScope and handlePointerInput() to awaitPointerEventScope(). (<a href="https://android-review.googlesource.com/#/q/Idf0a1b94f065e72b65361cdf616122ed7939c3e7">Idf0a1</a>, <a href="https://issuetracker.google.com/issues/175142755">b/175142755</a>)</p></li> <li><p>LazyListState.layoutInfo was added which exposes the list of sizes and offsets of the currently visible items (<a href="https://android-review.googlesource.com/#/q/If86783ac8b127269d4bf8bbc5dd4eba52b3fbb77">If8678</a>, <a href="https://issuetracker.google.com/issues/170472532">b/170472532</a>)</p></li> <li><p>Removed ExperimentalPointerInput annotation (<a href="https://android-review.googlesource.com/#/q/Ia7a2473869400fc92ce70c802f42df9af7129386">Ia7a24</a>)</p></li> <li><p>InteractionState support for TextFields has been added. (<a href="https://android-review.googlesource.com/#/q/I61d91b15858fc3914ab9f15409857f0bccf67f34">I61d91</a>)</p></li> <li><p>Add reverseLayout param for LazyColumn/Row. when <code translate="no" dir="ltr">true</code> items will be composed from the bottom to the top and <code translate="no" dir="ltr">LazyListState.firstVisibleItemIndex == 0</code> will mean the first item is located at the bottom. (<a href="https://android-review.googlesource.com/#/q/I552ae9123cfc426cda2bf2e72784bf07c3c15cbf">I552ae</a>, <a href="https://issuetracker.google.com/issues/166589935">b/166589935</a>)</p></li> <li><p>verticalArrangement param was added for LazyColumn. horizontalArrangement param was added for LazyRow. Arrangement allows us to add a spacing between items and specify the arrangement of the items when we do not have enough of them to fill the whole minimum size. (<a href="https://android-review.googlesource.com/#/q/Icf79a56204f07903c5f3bd4dd5700568fb6d1343">Icf79a</a>, <a href="https://issuetracker.google.com/issues/170394300">b/170394300</a>)</p></li> <li><p>detectMultitouchGestures now uses one callback with combined centroid, pan, zoom and rotate parameters. (<a href="https://android-review.googlesource.com/#/q/Ie6e1c2d7496ed0aabc6a5256f859c91cc39a08dc">Ie6e1c</a>)</p></li> <li><p>Moved ContentDrawScope to ui-graphics module to be with DrawScope. (<a href="https://android-review.googlesource.com/#/q/Iee0437fa587fbe12a3623955f5fe720d5aae551f">Iee043</a>, <a href="https://issuetracker.google.com/issues/173832789">b/173832789</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Lambdas in offset modifiers now return IntOffset rather than Float. (<a href="https://android-review.googlesource.com/#/q/Ic9ee5c05df4c89993ee19f19ddd327a986f21bc1">Ic9ee5</a>, <a href="https://issuetracker.google.com/issues/174137212">b/174137212</a>, <a href="https://issuetracker.google.com/issues/174146755">b/174146755</a>)</li> <li><p>Removed SlotTable, SlotReader and SlotWriter from the public API. These were marked as InternalComposeAPI previously. Now they are internal to the compose module.</p> <p>CompositionData and CompositionGroup were added as a replacement for the ui-tooling API to use to extract composition information. These are public but are not intended for use outside the ui-tooling API as they provide the raw information the ui-tooling API interprets (<a href="https://android-review.googlesource.com/#/q/I31a9ca6a7e5bbf162c984394dffd7a25b059315a">I31a9c</a>)</p></li> <li><p>Refactored ShaderBrush to lazily create a shader instance when sizing information of the drawing environment is available. This is useful to define gradients that occupy the full drawing bounds of a composable at composition time, without having to implement custom DrawModifier implementations.</p> <p>Deprecated gradient function constructor APIs in favor of factory methods on a Gradient object. (<a href="https://android-review.googlesource.com/#/q/I511fc09bdeb4b41127de4a6b1e616688b10295f5">I511fc</a>, <a href="https://issuetracker.google.com/issues/173066799">b/173066799</a>)</p></li> <li><p>Modifier.focusObserver is deprecated. Use Modifier.onFocusChanged or Modifier.onFocusEvent instead (<a href="https://android-review.googlesource.com/#/q/I30f17d06d60fa9b8c510ee0468464258894a467b">I30f17</a>, <a href="https://issuetracker.google.com/issues/168511863">b/168511863</a>, <a href="https://issuetracker.google.com/issues/168511484">b/168511484</a>)</p></li> <li><p>Autofill API is now experimental API and requires opt-in (<a href="https://android-review.googlesource.com/#/q/I0a1ecfbf4ddeccaecc3cea8d2223b0a4afa60636">I0a1ec</a>)</p></li> <li><p>Adding destructuring declarations to create FocusRequester instances (<a href="https://android-review.googlesource.com/#/q/I35d84e1320bec5b62bf1fb096aa95f90cfd96e9c">I35d84</a>, <a href="https://issuetracker.google.com/issues/174817008">b/174817008</a>)</p></li> <li><p>accessibilityLabel has been renamed to contentDescription. accessibilityValue has been renamed to stateDescription. (<a href="https://android-review.googlesource.com/#/q/I250f2d41e139d4838b0b3706f18b56fcc4f515bd">I250f2</a>)</p></li> <li><p>Introduced several new functions in SelectionRegistrar and also renamed onPositionChange to notifyPositionChange. (<a href="https://android-review.googlesource.com/#/q/Ifbaf754c0ee3f485869115bba8dbcc1a8b7f5b88">Ifbaf7</a>)</p></li> <li><p>AndroidOwner made internal (<a href="https://android-review.googlesource.com/#/q/Ibcad027dbc1794f5d202be52fe0783c73d249a25">Ibcad0</a>, <a href="https://issuetracker.google.com/issues/170296980">b/170296980</a>)</p></li> <li><p>New infiniteRepeatable function for creating an InfiniteRepeatableSpec (<a href="https://android-review.googlesource.com/#/q/I668e501c0c9061aa94b258ec9646617e0f77faf1">I668e5</a>)</p></li> <li><p>The <code translate="no" dir="ltr">Applier</code> interface has changed to simplify building trees bottom-up instead of top-down.</p> <p>The <code translate="no" dir="ltr">insert()</code> method has been renamed to <code translate="no" dir="ltr">insertTopDown()</code>.</p> <p>A new method, <code translate="no" dir="ltr">insertBottomUp()</code>, was added.</p> <p>An applier either inserts nodes into the tree it is editing using <code translate="no" dir="ltr">insertTopDown()</code> or <code translate="no" dir="ltr">insertBottomUp()</code> depending on which performs better.</p> <p>Some trees, such as <code translate="no" dir="ltr">LayoutNode</code> and <code translate="no" dir="ltr">View</code>, are much more efficient to build bottom-up than top-down. Prior to this change, a stack of inserts was required to implement bottom-up which needed to be copied to every applier which needed bottom-up construction for performance. With this change an <code translate="no" dir="ltr">Applier</code> overrides <code translate="no" dir="ltr">insertBottomUp()</code> to build a tree bottom-up and <code translate="no" dir="ltr">insertTopDown()</code> to build the tree top-down. (<a href="https://android-review.googlesource.com/#/q/Icbdc2929ab8fc8fce231d633b062fc80be5c10c9">Icbdc2</a>)</p></li> <li><p>Added painterResource API to handle opaquely loading Painter objects from either rasterized asset formats (like PNGs) or VectorDrawables. Consumers no longer have to determine the type of asset in advance and can call this method to get a Painter object to use in Image composables or painter modifiers. (<a href="https://android-review.googlesource.com/#/q/I2c703e31eedbbfcf073d28064496a6e324c2027a">I2c703</a>, <a href="https://issuetracker.google.com/issues/173818471">b/173818471</a>)</p></li> <li><p>Added buildAnnotatedString factory function in order to build an AnnotatedString. Deprecated annotatedString builder function. (<a href="https://android-review.googlesource.com/#/q/Idfe0b133687e7b5f377e997b79bd4463161a6d0b">Idfe0b</a>)</p></li> </ul> <h3 id="1.0.0-alpha08" data-text="Version 1.0.0-alpha08" tabindex="-1">Version 1.0.0-alpha08</h3> <p>December 2, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha08</code> and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha08</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/358bdaf3c3c4a917883408e9f747da521fdf9e65..10b5e9fd366c1c413d5576aed50a305d300938e1/compose/foundation">Version 1.0.0-alpha08 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> This release is only compatible with Kotlin <code translate="no" dir="ltr">1.4.20</code>, so you will need to update your Kotlin version.</span></aside> <p><strong>API Changes</strong></p> <ul> <li>Removed <code translate="no" dir="ltr">maxLines</code> parameter from the <code translate="no" dir="ltr">CoreTextField</code>. If you'd like to constraint the height of the text field by the number of lines, use <code translate="no" dir="ltr">BasicTextField</code> instead. (<a href="https://android-review.googlesource.com/#/q/Iec0026dfe939c60e110304db6cda0fdaa57a034f">Iec002</a>)</li> <li>Changed the <code translate="no" dir="ltr">await*TouchSlop()</code> methods to not detect the pointer down and renamed them to <code translate="no" dir="ltr">*OrCancellation</code>. Also removed the need for <code translate="no" dir="ltr">orientationLock</code> parameter. (<a href="https://android-review.googlesource.com/#/q/Ie96e10e900244ab02936b143727db5faad1597e5">Ie96e1</a>)</li> <li>Added lint check for composable lambda parameter naming and position, to check for consistency with Compose guidelines. Also migrated some APIs using <code translate="no" dir="ltr">children</code> as the name for their trailing lambda to <code translate="no" dir="ltr">content</code>, according to the lint check and guidance. (<a href="https://android-review.googlesource.com/#/q/Iec48e38a2896785b521814d95c9fb624d2807315">Iec48e</a>)</li> <li><code translate="no" dir="ltr">foundation:foundation-text</code> apis moved to <code translate="no" dir="ltr">foundation:foundation</code>. The package structure remained the same (<a href="https://android-review.googlesource.com/#/q/Id3eb24adc68111232087cdb2a1d01132ddd49a64">Id3eb2</a>)</li> <li>New multitouch gesture detector, including helpers for detecting rotation, zoom, and panning. (<a href="https://android-review.googlesource.com/#/q/Ic459dc4c6b4e4a171dbb16a87ee8dfe780230d16">Ic459d</a>)</li> <li>New drag gesture detector suspending pointer input API, including orientation locking. (<a href="https://android-review.googlesource.com/#/q/Icef25dbc49fa8786c7631e8b97b0732b871afea6">Icef25</a>)</li> <li>Renamed VectorAsset to ImageVector Moved and renamed VectorAsset to Builder to be an inner class of ImageVector as per API council guidelines. Added typealias of VectorAssetBuilder to link to ImageVector.Builder for compat. (<a href="https://android-review.googlesource.com/#/q/Icfdc85391feb2bd0edabebeba84f31bace10883a">Icfdc8</a>)</li> <li>Renamed ImageAsset and related methods to ImageBitmap. (<a href="https://android-review.googlesource.com/#/q/Ia2d9941a6e0b8c29867cb3fbafb629fa4db10684">Ia2d99</a>)</li> <li>Moved foundation semantics properties to ui (<a href="https://android-review.googlesource.com/#/q/I6f05cc7c0bdf1e5344440cd6e492fbc0545011e7">I6f05c</a>)</li> <li><p>Add coroutine-based scrolling APIs:</p> <p>Adds LazyListState.snapToItem and LazyListState.smoothScrollBy, as well as lower-level APIs for scroll control. These APIs provide a suspend interface to control scrolling that waits until the scroll is finished before returning. (<a href="https://android-review.googlesource.com/#/q/Ie56426c01b3c8ad51afb237cb972a8578d2fefd4">Ie5642</a>)</p></li> <li><p>Added a singeLine parameter into BasicTextField, TextField and OutlinedTextField. Set this parameter to true to make the text field a single horizontally scrollable line. (<a href="https://android-review.googlesource.com/#/q/I57004dff8b341f08f6673235e28e958c9fbf63c6">I57004</a>, <a href="https://issuetracker.google.com/issues/168187755">b/168187755</a>)</p></li> <li><p>Gesture detector for tap, double-tap, long press, and press indication were added using the new suspending pointer input. A few utilities were added as well, making it easier for developers to write their own gesture detectors. (<a href="https://android-review.googlesource.com/#/q/I0080776a5672f63ceb8f4ae0a753d5f4debdc2e8">I00807</a>)</p></li> <li><p>Modifier.focusable has need added in foundation. Use this to add focusable behavior to a component, with correct semantics and accessibility. (<a href="https://android-review.googlesource.com/#/q/I41eb9d67669e19f8a7c20804c836a8c6dc0b5526">I41eb9</a>, <a href="https://issuetracker.google.com/issues/152525426">b/152525426</a>, <a href="https://issuetracker.google.com/issues/162865824">b/162865824</a>)</p></li> <li><p>Previously deprecated APIs have been removed: Border was removed, use BorderStroke instead. Modifier.drawBorder was removed, use Modifier.border instead. Modifier.gravity was removed, use Modifier.align instead. Stack was removed, use Box instead (<a href="https://android-review.googlesource.com/#/q/I32c2b7c59a199f206b8ad854e07b66f32f0ef1f9">I32c2b</a>, <a href="https://issuetracker.google.com/issues/172470874">b/172470874</a>)</p></li> <li><p>AbsoluteArrangement was renamed to Arrangement.Absolute. (<a href="https://android-review.googlesource.com/#/q/If26f210b1352608678ab175677fb8b54a631d0c9">If26f2</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Moved DrawModifier APIs from the androidx.compose.ui package to the androidx.compose.ui.draw package. Created DrawModifierDeprecated.kt file to include typealiases/helper methods to assist with the migration from the deprecated to the current APIs. (<a href="https://android-review.googlesource.com/#/q/Id6044c7119aeaf40a3ff21006fe39b03f5f1b18a">Id6044</a>, <a href="https://issuetracker.google.com/issues/173834241">b/173834241</a>)</li> <li>Renamed Modifier.drawLayer to Modifier.graphicsLayer Also updated related classes to GraphicsLayer as per API council feedback. (<a href="https://android-review.googlesource.com/#/q/I0bd297065427d19715e4e33480f7be87e51ff48a">I0bd29</a>, <a href="https://issuetracker.google.com/issues/173834241">b/173834241</a>)</li> <li><code translate="no" dir="ltr"><T></code> was removed from SubcomposeLayout declaration. You can use it without specifying a type now. (<a href="https://android-review.googlesource.com/#/q/Ib60c850964b308ebee32beca6db78d76af67fbf1">Ib60c8</a>)</li> <li>Made PointerInputData's uptime and position fields non-nullable. (<a href="https://android-review.googlesource.com/#/q/Id468a0ef7c00c30a89114ea8dc95fa019961e189">Id468a</a>)</li> <li>MaterialTheme now sets the correct colors for selection handles and selection background. Non-Material apps can manually use AmbientTextSelectionColors to customize the colors used for selection. (<a href="https://android-review.googlesource.com/#/q/I1e6f4b495bdc713e162759a08ecf0a7311b26e33">I1e6f4</a>, <a href="https://issuetracker.google.com/issues/139320372">b/139320372</a>, <a href="https://issuetracker.google.com/issues/139320907">b/139320907</a>)</li> <li>The alignment parameter of Box was renamed to contentAlignment. (<a href="https://android-review.googlesource.com/#/q/I2c95727d9ec49f056fffb3a73dce95a9d3be5b53">I2c957</a>)</li> <li>offsetPx modifiers were renamed to offset. They are now taking lambda parameters instead of State. (<a href="https://android-review.googlesource.com/#/q/Ic302174ef9cffa7ef806d1668f81cb89159363f2">Ic3021</a>, <a href="https://issuetracker.google.com/issues/173594846">b/173594846</a>)</li> <li>Added WindowManager.isWindowFocused to check if the host window is in focus, and a WindowFocusObserver that provides an onWindowFocusChanged callback. (<a href="https://android-review.googlesource.com/#/q/I53b2a702b81215dc5a5536144a752e1c93ab056e">I53b2a</a>, <a href="https://issuetracker.google.com/issues/170932874">b/170932874</a>)</li> <li>Added resetInput parameter to TextInputService#onStateUpdated (<a href="https://android-review.googlesource.com/#/q/I3e8f5404553921bd94ae424d2840ca5595b6f90b">I3e8f5</a>, <a href="https://issuetracker.google.com/issues/172239032">b/172239032</a>, <a href="https://issuetracker.google.com/issues/171860947">b/171860947</a>)</li> <li>Updated TextFieldValue API <ul> <li>made TextFieldValue.composition readonly</li> <li>removed exception thrown for invalid selection range (<a href="https://android-review.googlesource.com/#/q/I4a67592c05ab384ad5614cccf50ad6e79be52b55">I4a675</a>, <a href="https://issuetracker.google.com/issues/172239032">b/172239032</a>)</li> </ul></li> <li>Deprecated Ambients named with <code translate="no" dir="ltr">Ambient</code> as their suffix, and replaced them with new properties prefixed with Ambient, following other Ambients and Compose API guidelines. (<a href="https://android-review.googlesource.com/#/q/I334403cc490ea913b8980d29e2cbe08e98ad7945">I33440</a>)</li> <li>Added Android Typeface wrapper. You can load an Android Typeface via <code translate="no" dir="ltr">typeface</code> function i.e. <code translate="no" dir="ltr">typeface(Typeface.DEFAULT)</code>. Also renamed <code translate="no" dir="ltr">typefaceFromFontFamily()</code> to <code translate="no" dir="ltr">typeface()</code> (<a href="https://android-review.googlesource.com/#/q/I52ab713f851011796d0a0437e62693a7e762701a">I52ab7</a>)</li> <li>Added lint check to check that Modifier factories use <code translate="no" dir="ltr">androidx.compose.ui.composed {}</code> internally, instead of being marked as <code translate="no" dir="ltr">@Composable</code>. (<a href="https://android-review.googlesource.com/#/q/I3c4bcedafbd0bc9846a9c0ba75685a35cb4de371">I3c4bc</a>)</li> <li>Added lint check to check that Modifier factory functions are defined as extensions on Modifier, so they can be fluently chained together. (<a href="https://android-review.googlesource.com/#/q/I07981617a0e09137b787adbc0219f48af5b86169">I07981</a>)</li> <li>Semantics argument mergeAllDescendants was renamed to mergeDescendants. (<a href="https://android-review.googlesource.com/#/q/Ib625016bd3bbe4349c2870ba68ad52d76a0d372a">Ib6250</a>)</li> <li>Time control in tests (TestAnimationClock and its usages) is now experimental (<a href="https://android-review.googlesource.com/#/q/I6ef86c5f530422c7c751bdb086a691cbc2e837f3">I6ef86</a>, <a href="https://issuetracker.google.com/issues/171378521">b/171378521</a>)</li> <li>Remove old ui-test module and its stubs (<a href="https://android-review.googlesource.com/#/q/I3a7cbbe376d0542955983fb09afd2dc37be7647e">I3a7cb</a>)</li> <li>TextUnit.Inherit is renamed to TextUnit.Unspecified in consistent with other units. (<a href="https://android-review.googlesource.com/#/q/Ifce190ac87b01144b2fb0e7f9a8659bceed87f4e">Ifce19</a>)</li> <li>The Alignment interface was updated and made functional. (<a href="https://android-review.googlesource.com/#/q/I46a0791e261b6f305804797cdda7fdd2ef405305">I46a07</a>, <a href="https://issuetracker.google.com/issues/172311734">b/172311734</a>)</li> <li><code translate="no" dir="ltr">foundation:foundation-text</code> module has been merged into <code translate="no" dir="ltr">foundation:foundation</code> (<a href="https://android-review.googlesource.com/#/q/Idac0f648e575be6627d940b6af7f9b25e73188ce">Idac0f</a>)</li> <li>Deprecate place(Offset) and placeRelative(Offset). Use overloads with int offsets instead (<a href="https://android-review.googlesource.com/#/q/I4c5e75e6ba7382735acccd44324bb96a59d82490">I4c5e7</a>)</li> <li><code translate="no" dir="ltr">id</code> was renamed to <code translate="no" dir="ltr">layoutId</code> for <code translate="no" dir="ltr">LayoutIdParentData</code>. <code translate="no" dir="ltr">Measurable.id</code> was renamed to <code translate="no" dir="ltr">Measurable.layoutId</code>. (<a href="https://android-review.googlesource.com/#/q/Iadbcb8b5588876e0d2a512e476968025b03ada6c">Iadbcb</a>, <a href="https://issuetracker.google.com/issues/172449643">b/172449643</a>)</li> </ul> <h3 id="1.0.0-alpha07" data-text="Version 1.0.0-alpha07" tabindex="-1">Version 1.0.0-alpha07</h3> <p>November 11, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha07</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha07</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:1.0.0-alpha07</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/234e23e470a5e7f81291f6acd12d538146dc010b..358bdaf3c3c4a917883408e9f747da521fdf9e65/compose/foundation">Version 1.0.0-alpha07 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Similarly to <code translate="no" dir="ltr">Modifier.fillMaxSize[Width|Height]</code> we now support fractions in <code translate="no" dir="ltr">Modifier.fillParentMaxSize[Width|Height]</code> inside the scope of <code translate="no" dir="ltr">LazyColumn/Row</code> (<a href="https://android-review.googlesource.com/#/q/I797e279db98215aa6f7c3e705f90442b5bf31f99">I797e2</a>, <a href="https://issuetracker.google.com/issues/166586426">b/166586426</a>)</li> <li>Removed <code translate="no" dir="ltr">KeyboardOptions.toImeOptions</code> from public API. (<a href="https://android-review.googlesource.com/#/q/Ic2e4500be7841ad3815bc576356ab67e616db534">Ic2e45</a>)</li> <li>The foundation AmbientTextStyle, ProvideTextStyle, and AmbientContentColor have been deprecated. Instead use the new versions available in the Material library. For non-Material applications, you should instead create your own design system specific theming ambients that can be consumed in your own components. (<a href="https://android-review.googlesource.com/#/q/I74accf7166eaca28e9e2d14402ed08d80f8625ab">I74acc</a>, <a href="https://issuetracker.google.com/issues/172067770">b/172067770</a>)</li> <li>foundation.Text has been deprecated and replaced with material.Text. For a basic, unopinionated text API that does not consume values from a theme, see androidx.compose.foundation.BasicText. (<a href="https://android-review.googlesource.com/#/q/If64cbdd89497f171edfd1b4de907123f73279e8d">If64cb</a>)</li> <li>Added maxLines to TextFields (<a href="https://android-review.googlesource.com/#/q/Ib2a5bb1c0ec8782b6a05fc48033fd4b05622820e">Ib2a5b</a>)</li> <li>Update TextFields to accept KeyboardOptions (<a href="https://android-review.googlesource.com/#/q/Ida7f3c71647dc9fff8acdd50fc5604a15957ccec">Ida7f3</a>)</li> <li>Added KeyboardOptions for use in TextFields (<a href="https://android-review.googlesource.com/#/q/I9ca329336d80be07e6a0c1e6d7a2f84902774898">I9ca32</a>)</li> <li>Adds BasicText as a design-unopinionated API for text, parallel to BasicTextField. (<a href="https://android-review.googlesource.com/#/q/I28268e2eff13261410ea88ced1dd1b3dca509a20">I28268</a>)</li> <li>ExperimentalLazyDsl annotation was removed. LazyColumn/LazyRow can now be used without adding @OptIn (<a href="https://android-review.googlesource.com/#/q/Idab7ad1ce0d14659e5e7f54076d4c207b9449215">Idab7a</a>, <a href="https://issuetracker.google.com/issues/166584730">b/166584730</a>)</li> <li>BaseTextField has been deprecated. Use BasicTextField instead. (<a href="https://android-review.googlesource.com/#/q/I896eb0eb21e73bda5f269e1ffae4357201acb219">I896eb</a>)</li> <li>BasicTextField has been added as a replacement for both CoreTextField and BaseTextField (<a href="https://android-review.googlesource.com/#/q/Id4cea88b13c50145a6ffd8a52318bc8e2f83edb8">Id4cea</a>)</li> <li>Remove deprecated LazyColumnItems/LazyRowItems (<a href="https://android-review.googlesource.com/#/q/I1d8a809dfb424b9f066dc030d148c3b0572c4345">I1d8a8</a>)</li> <li>The deprecated composables for sizing to intrinsic measurements were removed. (<a href="https://android-review.googlesource.com/#/q/I18537b5628f76eecb30f9a163d2fde3cd5984609">I18537</a>, <a href="https://issuetracker.google.com/issues/171811496">b/171811496</a>)</li> <li>relativePaddingFrom was renamed to paddingFrom. The paddingFromBaseline modifier was added, as convenience for specifying distances from layout bounds to text baselines. (<a href="https://android-review.googlesource.com/#/q/I0440af2aea41e020cb581b9030522b7586fe952e">I0440a</a>, <a href="https://issuetracker.google.com/issues/170633813">b/170633813</a>)</li> <li>The matchHeightConstraintsFirst parameter was added to the aspectRatio modifier, which can be used to specify the modifier to size to height constraints before trying the width correspondents. (<a href="https://android-review.googlesource.com/#/q/Ie7c433d0f51d33c1df45a4b63d110e34ae0bd360">Ie7c43</a>, <a href="https://issuetracker.google.com/issues/155290593">b/155290593</a>)</li> <li>The deprecated DpConstraints was removed. (<a href="https://android-review.googlesource.com/#/q/I87884131131503fe08e78f67898cf233b2818832">I87884</a>, <a href="https://issuetracker.google.com/issues/171702471">b/171702471</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Introduced ScaleFactor inline class to represent scale factors for the horizontal and vertical axes independent of one another in order to support non-uniform scaling use cases. <ul> <li>Added computeScaleFactor method to ContentScale</li> <li>Added ContentScale.FillBounds to perform non-uniform scaling to stretch the src bounds to fully occupy the destination.</li> <li>Added operator methods to compute ScaleFactor parameters with Size parameters.</li> <li>(<a href="https://android-review.googlesource.com/#/q/Ic96a6eb421cda5550c817ceca23ab50fde337778">Ic96a6</a>, <a href="https://issuetracker.google.com/issues/172291582">b/172291582</a>)</li> </ul></li> <li>captureToBitmap moved to captureToImage. (<a href="https://android-review.googlesource.com/#/q/I86385454625b533b83c87e48d82e143dd1bcb88e">I86385</a>)</li> <li>Marks CoreText as @InternalTextApi. Use BasicText instead. (<a href="https://android-review.googlesource.com/#/q/I6aaeb3c571bc716f920409a255e07d0d03cf78d8">I6aaeb</a>)</li> <li>Rename KeyboardOptions as ImeOptions (<a href="https://android-review.googlesource.com/#/q/I82f364ca1ede4bfea9430fcc9fd227d729b39fd9">I82f36</a>)</li> <li>Moved KeyboardType and ImeAction into KeyboardOptions (<a href="https://android-review.googlesource.com/#/q/I910cea6ec0ef3568b9a94f7b193e8cb7e8b776ed">I910ce</a>)</li> <li>CoreTextField has been marked as @InternalTextApi. Use BasicTextField instead (<a href="https://android-review.googlesource.com/#/q/Ie2469cf4af3a476e8015999f45e439ea619dab23">Ie2469</a>)</li> <li>ExperimentalSubcomposeLayoutApi annotation was removed. SubcomposeLayout can now be used without adding @OptIn (<a href="https://android-review.googlesource.com/#/q/I708adafbc3c10cc6c23fe5a236f66e73146e4f56">I708ad</a>)</li> <li>Introduce ui-test-junit4 module (<a href="https://android-review.googlesource.com/#/q/Ib91f8a6792d8852427cc0dff99a40086c00b8ce4">Ib91f8</a>)</li> <li>Updated Icon API to take in Color.Unspecified as a possible tint color which will draw the provided asset or painter without a ColorFilter. Previously attempts to ignore tinting with Color.Unspecified would tint with a transparent color ending up with nothing rendered at all. (<a href="https://android-review.googlesource.com/#/q/I049e2b7464204f1fd8965d31d6dfba811b30a2bb">I049e2</a>, <a href="https://issuetracker.google.com/issues/171624632">b/171624632</a>)</li> <li>MeasureResult was moved out of MeasureScope. (<a href="https://android-review.googlesource.com/#/q/Ibf96ddadae8115015066dcda2026a57b87c2ead6">Ibf96d</a>, <a href="https://issuetracker.google.com/issues/171184002">b/171184002</a>)</li> <li>Several layout related symbols were moved from androidx.compose.ui to androidx.compose.layout.ui. (<a href="https://android-review.googlesource.com/#/q/I0fa982d87929e5ca9e3a32762fe9cf1fa8b8cfef">I0fa98</a>, <a href="https://issuetracker.google.com/issues/170475424">b/170475424</a>)</li> <li>androidx.ui.test moved to androidx.compose.ui.test (<a href="https://android-review.googlesource.com/#/q/I9ffdb165d49e8d136b58cc4e32599a4a1d5b169e">I9ffdb</a>)</li> <li>FirstBaseline and LastBaseline were moved to androidx.compose.ui.layout package (<a href="https://android-review.googlesource.com/#/q/Ied2e7ff4c8d8a45072439d719ea5c75270c28c97">Ied2e7</a>)</li> <li>Added SelectionContainer without the callback (<a href="https://android-review.googlesource.com/#/q/Ibfadba5a9f66101c5746c5b842dadf840617e1a6">Ibfadb</a>)</li> <li>Add Tests for SelectionHandles' Positions in SelectionContainer. (<a href="https://android-review.googlesource.com/#/q/Ie93dbdbebcdc55d63bc8185fdf2faa0262778c15">Ie93db</a>)</li> <li>Added Keyboard auto correct IME Option (<a href="https://android-review.googlesource.com/#/q/I57b8d4b3c65630763e198c31c7d116fcbe461c51">I57b8d</a>)</li> </ul> <h3 id="1.0.0-alpha06" data-text="Version 1.0.0-alpha06" tabindex="-1">Version 1.0.0-alpha06</h3> <p>October 28, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha06</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha06</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:1.0.0-alpha06</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/dd84d35abd1bc13fe53a4632d4b3889f6062ac81..234e23e470a5e7f81291f6acd12d538146dc010b/compose/foundation">Version 1.0.0-alpha06 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>androidx.compose.foundation.Icon has been moved to androidx.compose.material.Icon. You can also use the Image component / Modifier.paint() with a Painter if you do not want to use the Material library. (<a href="https://android-review.googlesource.com/#/q/I9f6222326427cebacde10562cde99b9ebff2490f">I9f622</a>)</li> <li>Added interactionState to Modifier.scrollable, ScrollableColumn and LazyColumnFor (<a href="https://android-review.googlesource.com/#/q/I815666e1b4544dcd5da9f253ec1b539fdd777529">I81566</a>, <a href="https://issuetracker.google.com/issues/169509805">b/169509805</a>)</li> <li>alignByBaseline was added to RowScope and alignWithSiblings was renamed to alignBy (<a href="https://android-review.googlesource.com/#/q/I06503f2d4c9b7717c6bdee3bdb466e30f8a56d52">I06503</a>, <a href="https://issuetracker.google.com/issues/170628732">b/170628732</a>)</li> <li>Box was made an inline function. (<a href="https://android-review.googlesource.com/#/q/Ibce0c1940173f06c030fd1115b9badb692ceb05a">Ibce0c</a>, <a href="https://issuetracker.google.com/issues/155056091">b/155056091</a>)</li> <li>Added maxLines to CoreTextField (<a href="https://android-review.googlesource.com/#/q/Ibee58be1331d36bfce70a0b14e83ffb5c0cfa3a2">Ibee58</a>, <a href="https://issuetracker.google.com/issues/143687793">b/143687793</a>)</li> <li>Added softwrap to CoreTextField. (<a href="https://android-review.googlesource.com/#/q/I21a4bb066176e69accc0b2b45b13faa11afd4ec5">I21a4b</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Deprecate VectorPainter in favor of rememberVectorPainter to better indicate that the composable API internally leverages 'remember' to persist data across compositions. (<a href="https://android-review.googlesource.com/#/q/Ifda43dfd1d5b581c3666f4f69b528c47dbaa0ff5">Ifda43</a>)</li> <li>Enable transitions in ComposeTestRule; remove option to enable the blinking cursor from ComposeTestRule. (<a href="https://android-review.googlesource.com/#/q/If0de36db743b7f57b161b0fe6324565750436866">If0de3</a>)</li> <li>Added single line keyboard option to CoreTextField (<a href="https://android-review.googlesource.com/#/q/I72e6d9f84abbf4ff6a9ede5355de4c30d37c3d8c">I72e6d</a>)</li> <li>Renamed Radius API to CornerRadius to better express how it is used throughout Compose. Updated documentation to indicate that negative corner radii are clamped to zero. (<a href="https://android-review.googlesource.com/#/q/I130c7e1baadaf1b2f8e6c32f1af0d3702e2cee50">I130c7</a>, <a href="https://issuetracker.google.com/issues/168762961">b/168762961</a>)</li> <li>Add ability to specify inspector info in composed modifier (<a href="https://android-review.googlesource.com/#/q/Idee08841816fb7dfc8f0621eb5a32c3663131aa1">Idee08</a>, <a href="https://issuetracker.google.com/issues/163494569">b/163494569</a>)</li> <li>Added KeyboardCapitalization IME Option (<a href="https://android-review.googlesource.com/#/q/I8ac3875c7c668bcd2868becd328bb3a253c667cd">I8ac38</a>)</li> <li>Fix Rtl Handle Position. (<a href="https://android-review.googlesource.com/#/q/I6e1e07b76476d8e2f0be50ff022257c2379edcf7">I6e1e0</a>)</li> <li>Breaking change: removed the return value from PointerInputFilter.onPointerEvent(...) given that the only value that should be able to be changed in pointer events is consumption data. Instead of returning data from PointerInputFilter.onPointerEvent(...), now you can just mutate the consumption data of the PointerEvents passed in. (<a href="https://android-review.googlesource.com/#/q/I6acd06e56ab49c8ca932ff7c2d35a517a412e2d2">I6acd0</a>)</li> <li>Added SelectAll option into selection menu (<a href="https://android-review.googlesource.com/#/q/Ief02bb5bb39d11a02112c4ace1b971d6834ec5dd">Ief02b</a>)</li> </ul> <h3 id="1.0.0-alpha05" data-text="Version 1.0.0-alpha05" tabindex="-1">Version 1.0.0-alpha05</h3> <p>October 14, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha05</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha05</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:1.0.0-alpha05</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/64c532a70705a33e1e12d83a42fe6aeaca6823f9..dd84d35abd1bc13fe53a4632d4b3889f6062ac81/compose/foundation">Version 1.0.0-alpha05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>CoreTextField now supports cursor functionality (<a href="https://android-review.googlesource.com/#/q/Id23aa3de7c74074fb9c0d37a42490b6c49f691f3">Id23aa</a>)</li> <li><p>Deprecates contentColor() and currentTextStyle() APIs, and replaces them with AmbientContentColor and AmbientTextStyle ambients respectively. You can access the current value by using <code translate="no" dir="ltr">.current</code> on the ambient property, as with any other ambient. This was change was made for consistency and to avoid having multiple ways to accomplish the same thing. Additionally renames some ambient properties to better describe their purpose as follows:</p> <ul> <li>ContentColorAmbient -> AmbientContentColor</li> <li>TextStyleAmbient -> AmbientTextStyle</li> <li>IndicationAmbient -> AmbientIndication</li> <li>EmphasisAmbient -> AmbientEmphasisLevels</li> <li>RippleThemeAmbient -> AmbientRippleTheme (<a href="https://android-review.googlesource.com/#/q/I37b6dccb9751f2a9eb550f42da32bf4b1bff4296">I37b6d</a>)</li> </ul></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>As part of the standardization of sentinel values for inline classes, rename Color.Unset to Color.Unspecified for consistency with other inline classes (<a href="https://android-review.googlesource.com/#/q/I9761102e79ade32812984466c020f2715065ac85">I97611</a>, <a href="https://issuetracker.google.com/issues/169797763">b/169797763</a>)</li> <li>Added Copy/Paste/Cut accessibility actions (<a href="https://android-review.googlesource.com/#/q/I6db4f570596e65c2e12fbc6f0821961c65671e98">I6db4f</a>)</li> <li>TextOverflow.None is introduced. When overflow is None, Text won't handle overflow anymore, and it will report its actual size to LayoutNode. (<a href="https://android-review.googlesource.com/#/q/I175c9163a70ed35e4390b10848f143ed30ed2bf3">I175c9</a>, <a href="https://issuetracker.google.com/issues/158830170">b/158830170</a>)</li> <li>Updated Size.Unspecified parameters to be Float.NaN instead of Float.POSITIVE_INFINITY. Updated Painter implementations to check against Size.Unspecified as well as non-finite Sizes. (<a href="https://android-review.googlesource.com/#/q/I95a7e394ef1bc64d4deca510a681c9dbf959b1c1">I95a7e</a>)</li> <li>Added Paging Compose module and paging integration (<a href="https://android-review.googlesource.com/#/q/Ib85da91de0128619d792484a31c1db4d31603141">Ib85da</a>)</li> <li>Modify LazyListScope to receive nullable values (<a href="https://android-review.googlesource.com/#/q/I1765bf0567a0c8dd1f75cf9c9a1ee7ac7195354b">I1765b</a>)</li> <li>OnPositionedModifier is renamed to OnGloballyPositionedModifier and onPositioned() is renamed to onGloballyPositioned(). (<a href="https://android-review.googlesource.com/#/q/I587e8b151079d9d9506d86caa4283b7108958de4">I587e8</a>, <a href="https://issuetracker.google.com/issues/169083903">b/169083903</a>)</li> <li>Added samples for LazyColumn/Row (<a href="https://android-review.googlesource.com/#/q/Idc16d2e2ced995bae92d045eb60cda97be8cb7e6">Idc16d</a>)</li> <li>Fix for the items and itemsIndexed methods to allow emptyList (<a href="https://android-review.googlesource.com/#/q/I066470185765d918c5f29e96b5ac6dfefe46cb2c">I06647</a>)</li> <li>Add a DSL for specifying inspector information (<a href="https://android-review.googlesource.com/#/q/Ic9a22ffea5cdc0bc34160512515aef2c576d9aae">Ic9a22</a>)</li> <li>Move LongPress into Text. (<a href="https://android-review.googlesource.com/#/q/Iff2bc6e44143bedf71442531f8ec2d37a40e4a19">Iff2bc</a>)</li> <li>Disable Selection in Text, and a Demo. (<a href="https://android-review.googlesource.com/#/q/Ie7e97b1bf0efd89c08c2bb554a9e676bb2d21dff">Ie7e97</a>)</li> <li>Support AnnotatedString to SpannableString conversion for accessibility. (<a href="https://android-review.googlesource.com/#/q/Ief907a05b7928fa3c59784cda5c7a7739485607b">Ief907</a>)</li> <li>Removed <code translate="no" dir="ltr">PointerInputFilter.onPointerInput(...)</code>. <code translate="no" dir="ltr">PointerInputFilter.onPointerEvent(...)</code> should be used in its place. (<a href="https://android-review.googlesource.com/#/q/I6f04a771485232d62134c22588a0ae67c909bf81">I6f04a</a>)</li> </ul> <h3 id="1.0.0-alpha04" data-text="Version 1.0.0-alpha04" tabindex="-1">Version 1.0.0-alpha04</h3> <p>October 1, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha04</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha04</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:1.0.0-alpha04</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/18a5639262f8504db530176550e338a5d0e2e044..f5a2c7477391539d8bc9f65a8f0db1e8a7bf2cf5/compose/foundation">Version 1.0.0-alpha04 contains these commits.</a></p> <aside class="note"><strong>Note:</strong><span> Compose Version 1.0.0-alpha04 is only compatible with Android Studio 4.2 Canary 13 and later.</span></aside> <p><strong>API Changes</strong></p> <ul> <li>Stack was renamed to Box. The previously existing foundation.Box will be deprecated in favor of the new Box in compose.foundation.layout. The behavior of the new Box is to stack children one on top of another when it has multiple children - this is different from the previous Box, which was behaving similar to a Column. (<a href="https://android-review.googlesource.com/#/q/I94893bca003d7826c6a5b3c05ac3878d2f6bf953">I94893</a>, <a href="https://issuetracker.google.com/issues/167680279">b/167680279</a>)</li> <li>Box decoration parameters have been deprecated. If you want to have decorations/padding on your box, use Modifiers instead (Modifier.background, Modifier.border, Modifier.padding) (<a href="https://android-review.googlesource.com/#/q/Ibae92e99d0dd8984e666ece6cd6ec6f26f6ef672">Ibae92</a>, <a href="https://issuetracker.google.com/issues/167680279">b/167680279</a>)</li> <li>Add a new LazyListState class. This allows for observation and control of the scroll position of LazyRow and LazyColumn components. Instances can be created using rememberLazyListState() and passed into the state parameter of the component. Currently, the first visible item and offsets can be observed in this initial version. (<a href="https://android-review.googlesource.com/#/q/Ic7cb72444d41ccb6add635ba0873bb0e9222cf15">Ic7cb7</a>, <a href="https://issuetracker.google.com/issues/159307669">b/159307669</a>)</li> <li>Lazy list position and scroll offset are now saved and restored across Activity recreation (<a href="https://android-review.googlesource.com/#/q/Ie045f8264ad032fd46934306d4cf603db81b23a2">Ie045f</a>, <a href="https://issuetracker.google.com/issues/166589058">b/166589058</a>)</li> <li>Add long click semantics action (<a href="https://android-review.googlesource.com/#/q/I6281b383328d549b30b3ef915e717abbbb28ddaa">I6281b</a>, <a href="https://issuetracker.google.com/issues/156468846">b/156468846</a>)</li> <li>MutatorMutex utility added for keeping a single mutator of shared state over time and cancelling conflicting mutators by priority (<a href="https://android-review.googlesource.com/#/q/I3f9751b239aba5b9769aa821be08e88909aca90e">I3f975</a>)</li> <li>Annotated rootAnimationClockFactory, transitionsEnabled, blinkingCursorEnabled and textInputServiceFactory with @VisibleForTesting, make them internal API and hide their kdoc (<a href="https://android-review.googlesource.com/#/q/I554ebefac18b216d51e387e5fd1c3a735fde9500">I554eb</a>, <a href="https://issuetracker.google.com/issues/168308412">b/168308412</a>)</li> <li>Removed inlineContent parameter from Text with String input. It won't be used because inlineContent must work with AnnotatedString. (<a href="https://android-review.googlesource.com/#/q/Ief40369f380fe1d5e970b42358e5bb002eeb8ef4">Ief403</a>)</li> <li>The deprecated custom Arrangement APIs were removed. (<a href="https://android-review.googlesource.com/#/q/Ic576d1053ebfe238d0805b4e8f0ec6a741e04645">Ic576d</a>, <a href="https://issuetracker.google.com/issues/168297922">b/168297922</a>, <a href="https://issuetracker.google.com/issues/168297923">b/168297923</a>)</li> <li>The <code translate="no" dir="ltr">unbounded</code> parameter was added to wrapContentSize modifiers, which enables measuring the layout element with infinite max constraints. (<a href="https://android-review.googlesource.com/#/q/I7795170623538cd5dd2372ce0fd52bc6d0368cbd">I77951</a>, <a href="https://issuetracker.google.com/issues/158559319">b/158559319</a>)</li> <li>We prevented static imports of contents of layout scopes (e.g. alignWithSiblings in RowScope). The explicit scope alternative should be used instead: <code translate="no" dir="ltr">with(RowScope) { Modifier.alignWithSiblings(FirstBaseline) }</code>. (<a href="https://android-review.googlesource.com/#/q/I216be6984d82e0a41432ac5b89f7d6240eef1b9d">I216be</a>, <a href="https://issuetracker.google.com/issues/166760797">b/166760797</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Updated many Graphics APIs <ul> <li>Updated scale and rotation transformation APIs to consume a single Offset parameter to represent the pivot coordinate instead of separate float parameters for the x/y coordinates in DrawScope and DrawTransform</li> <li>Removed Rect.expandToInclude and Rect.join methods</li> <li>Updated Radius documentation to say oval in addition to elliptical</li> <li>Added documentation to indicate the public constructor for the inline Radius class is not to be called directly but instead Radius objects should be instantiated through their function constructors</li> <li>Removed RoundRect APIs to query topRight, bottomRight, bottomCenter, etc.</li> <li>Deprecated Rect.shift in favor of Rect.translate</li> <li>Removed RoundRect.grow and Rect.shrink APIs</li> <li>Renamed RoundRect.outerRect to Rect.boundingRect</li> <li>Removed RoundRect.middleRect/tallMiddleRect/wideMiddleRect and Rect.isStadium methods</li> <li>Renamed RoundRect.longestSide to RoundRect.maxDimension</li> <li>Renamed RoundRect.shortestSide to RoundRect.minDimension</li> <li>Changed RoundRect.center to be a property instead of a function</li> <li>Updated RoundRect constructor to consume Radius properties instead of individual parameters for x/y radius values</li> <li>Removed Size APIs that assumed it was a Rectangle with origin at 0,0</li> <li>Added a destructing API to Radius</li> <li>Migrated various RoundRect extension functions to be properties instead</li> <li>(<a href="https://android-review.googlesource.com/#/q/I8f5c738d1629b2cabd1b6e9fc8e8241dd06cfe2c">I8f5c7</a>, <a href="https://issuetracker.google.com/issues/168762961">b/168762961</a>)</li> </ul></li> <li>Performance optimizations for LazyColumnFor/LazyRowFor scrolling by not doing unnecessary recompositions during every scroll (<a href="https://android-review.googlesource.com/#/q/I64f6568fd1193a6d28e3e2e2205b977f4a5f116b">I64f65</a>, <a href="https://issuetracker.google.com/issues/168293643">b/168293643</a>, <a href="https://issuetracker.google.com/issues/167972292">b/167972292</a>, <a href="https://issuetracker.google.com/issues/165028371">b/165028371</a>)</li> <li>Fixed crash in LazyColumnFor/LazyRowFor after scrolling and then changing items and implemented auto scrolling up when the previously visible item was removed so we don't display empty gaps in the end anymore (<a href="https://android-review.googlesource.com/#/q/I220abfb686295685653eb28019318ea671eb6755">I220ab</a>, <a href="https://issuetracker.google.com/issues/161480164">b/161480164</a>, <a href="https://issuetracker.google.com/issues/167855468">b/167855468</a>)</li> <li>Nesting scrollable in the same direction containers like ScrollableContainer and LazyColumnFor is not allowed anymore. It was never supported and was breaking the fling and all the laziness of composing the items of LazyColumnFor (<a href="https://android-review.googlesource.com/#/q/I6e1011b2fce2b5ecebda26987a28c6feb1ef6cf7">I6e101</a>)</li> <li>Updated many Graphics APIs <ul> <li>Updated DrawScope APIs with scoped transformation methods to indicate that the transformation is only applied within the callback and removed after the callback is invoked</li> <li>Updated clipPath documentation to refer to Path instead of rounded rectangle</li> <li>Fixed spacing in documentation for right parameter in clipPath</li> <li>Renamed DrawScope.drawCanvas to drawIntoCanvas and removed size parameter</li> <li>Renamed dx/dy parameters in inset method to horizontal and vertical</li> <li>Added inset overload that provides the same inset value to all 4 bounds</li> <li>Removed documentation on inset method indicating that inset would be applied to all 4 sides</li> <li>Updated documentation for Rect class</li> <li>Updated comments on Rect parameters to match kdoc style</li> <li>Removed Rect.join and Rect.expandToInclude</li> <li>Created overload for Rect.translate(offset) and deprecated Rect.shift</li> <li>(<a href="https://android-review.googlesource.com/#/q/If086a1610e1bff12482897852d45cba075dcb4a1">If086a</a>, <a href="https://issuetracker.google.com/issues/167737376">b/167737376</a>)</li> </ul></li> <li>add AccessibilityScrollState to semantics properties. (<a href="https://android-review.googlesource.com/#/q/Ifeda983f0f6b8a2a92dea82c1a594fa5607f7cc3">Ifeda9</a>)</li> <li>Make TextRange inline to avoid object creation. (<a href="https://android-review.googlesource.com/#/q/Id034bee391b277905590a94dbb7198739ad1e848">Id034b</a>)</li> <li>ParagraphConstraints is removed. Width is directly passed to Paragraph now. (<a href="https://android-review.googlesource.com/#/q/Ica712c3f10be8ab7e684c108b2339119f50eafb7">Ica712</a>)</li> </ul> <h3 id="1.0.0-alpha03" data-text="Version 1.0.0-alpha03" tabindex="-1">Version 1.0.0-alpha03</h3> <p>September 16, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha03</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha03</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:1.0.0-alpha03</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/31022a2dda22705843be1199c786552a6f9f875d..18a5639262f8504db530176550e338a5d0e2e044/compose/foundation">Version 1.0.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>InnerPadding was renamed to PaddingValues. (<a href="https://android-review.googlesource.com/#/q/I195f122095b02ee49bf2ee0bc7f15f0339ca027f">I195f1</a>, <a href="https://issuetracker.google.com/issues/167389171">b/167389171</a>)</li> <li>Usages of gravity were consistently renamed to align or alignment in layout APIs. (<a href="https://android-review.googlesource.com/#/q/I2421a4d640a7086079739cd0e569aef70bb48577">I2421a</a>, <a href="https://issuetracker.google.com/issues/164077038">b/164077038</a>)</li> <li>An alignment parameter was added to Stack, which allows specifying the default alignment for all the Stack children. (<a href="https://android-review.googlesource.com/#/q/Ie80cabdc20860227e12992b65948ba870c70f147">Ie80ca</a>, <a href="https://issuetracker.google.com/issues/164085265">b/164085265</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>DpConstraints and APIs using it were deprecated. (<a href="https://android-review.googlesource.com/#/q/I90cdbe407ae8dd69badd26cd02bbb784ba10ba6a">I90cdb</a>, <a href="https://issuetracker.google.com/issues/167389835">b/167389835</a>)</li> <li>The parameters <code translate="no" dir="ltr">minWidth</code> and <code translate="no" dir="ltr">maxWidth</code> of <code translate="no" dir="ltr">widthIn</code> were renamed to <code translate="no" dir="ltr">min</code> and <code translate="no" dir="ltr">max</code>. Similarly for <code translate="no" dir="ltr">preferredWidthIn</code>, <code translate="no" dir="ltr">heightIn</code>, <code translate="no" dir="ltr">preferredHeightIn</code>. (<a href="https://android-review.googlesource.com/#/q/I0e5e1405083224e747c54afcf7c5db5ec7472773">I0e5e1</a>, <a href="https://issuetracker.google.com/issues/167389544">b/167389544</a>)</li> <li>Added onNode and other global methods on ComposeTestRule as the current global ones are going to be deprecated. (<a href="https://android-review.googlesource.com/#/q/Ieae36a4b67a3190759e7284a638f8b755c06c1ec">Ieae36</a>)</li> <li>Fixed size and position calculations in GestureScope, which caused amongst others generation of invalid swipe gestures (<a href="https://android-review.googlesource.com/#/q/Iaf358bea0470bd6f0e907c6bdd901bb95bea0447">Iaf358</a>, <a href="https://issuetracker.google.com/issues/166589947">b/166589947</a>)</li> <li>Moved <code translate="no" dir="ltr">createAndroidComposeRule</code> and <code translate="no" dir="ltr">AndroidInputDispatcher</code> from <code translate="no" dir="ltr">androidx.ui.test.android</code> to <code translate="no" dir="ltr">androidx.ui.test</code> (<a href="https://android-review.googlesource.com/#/q/Idef08e5b796ba14140eafd054c8aa898a3d38feb">Idef08</a>, <a href="https://issuetracker.google.com/issues/164060572">b/164060572</a>)</li> </ul> <h3 id="1.0.0-alpha02" data-text="Version 1.0.0-alpha02" tabindex="-1">Version 1.0.0-alpha02</h3> <p>September 2, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha02</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha02</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:1.0.0-alpha02</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/96eb302ee1740ba656c90c9fb27df3723a1a89c1..31022a2dda22705843be1199c786552a6f9f875d/compose/foundation">Version 1.0.0-alpha02 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>TestUiDispatcher is marked experimental (<a href="https://android-review.googlesource.com/#/q/Iae99dc8853f69819d969d6c1908615e69e28fb18">Iae99d</a>, <a href="https://issuetracker.google.com/issues/161247083">b/161247083</a>)</li> <li><p>Added <code translate="no" dir="ltr">ManualFrameClock.hasAwaiters</code> to see if anything is awaiting a frame from that clock; <code translate="no" dir="ltr">runWithManualClock</code> as a replacement for <code translate="no" dir="ltr">runBlocking</code> when running tests that need a ManualFrameClock; <code translate="no" dir="ltr">TestUiDispatcher.Main</code> that gives easy access to the main UI dispatcher in your tests.</p> <p>For example:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Kotlin"><code translate="no" dir="ltr"><span class="devsite-syntax-nd">@Test</span> <span class="devsite-syntax-kd">fun</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">myTest</span><span class="devsite-syntax-p">()</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">runWithManualClock</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">clock</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// set some compose content</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">withContext</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">TestUiDispatcher</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">Main</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">clock</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">advanceClock</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-m">1000L</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">if</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">clock</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">hasAwaiters</span><span class="devsite-syntax-p">)</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">println</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"The clock has awaiters"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">else</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">println</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s">"The clock has no more awaiters"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <p>(<a href="https://android-review.googlesource.com/#/q/I0a85b019ae5f40f52f2c6b78c08958eb7b8e7485">I0a85b</a>, <a href="https://issuetracker.google.com/issues/161247083">b/161247083</a>)</p></li> </ul> <h3 id="1.0.0-alpha01" data-text="Version 1.0.0-alpha01" tabindex="-1">Version 1.0.0-alpha01</h3> <p>August 26, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:1.0.0-alpha01</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:1.0.0-alpha01</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:1.0.0-alpha01</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/96eb302ee1740ba656c90c9fb27df3723a1a89c1..c93ac38a59f31e5db0eab67687532a4ba61913d5/ui">Version 1.0.0-alpha01 contains these commits.</a></p> <h2 id="version_010-dev_2" data-text="Version 0.1.0-dev" tabindex="-1">Version 0.1.0-dev</h2> <h3 id="0.1.0-dev17" data-text="Version 0.1.0-dev17" tabindex="-1">Version 0.1.0-dev17</h3> <p>August 19, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:0.1.0-dev17</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:0.1.0-dev17</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:0.1.0-dev17</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/316f882e649c600372170f013a18515f590f490d..96eb302ee1740ba656c90c9fb27df3723a1a89c1/ui">Version 0.1.0-dev17 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>The spacedBy Arrangement was added for Row and Column, to enable positioning layout children with a fixed spacing. The aligned Arrangment was also added, to enable positioning layout children one next to the other and aligned in the Row/Column according to an Alignment. The previous Arrangement.Vertical#arrange and Arrangement.Horizontal#arrange methods were deprecated, and writing custom Arrangements will not be supported in the future. (<a href="https://android-review.googlesource.com/#/q/I6733d4a76e4abd5713bfacf95da696bdd6153932">I6733d</a>, <a href="https://issuetracker.google.com/issues/161985975">b/161985975</a>)</li> <li>Offset has become an inline class (<a href="https://android-review.googlesource.com/#/q/Iaec70bb466cae8964f03e7484c1e86857c924f82">Iaec70</a>)</li> <li>Removed onFocusChanged callbacks from TextField. Use Modifier.focusObserver instead. (<a href="https://android-review.googlesource.com/#/q/I51089bfbc858ea302770f92b13886818cf48ba9c">I51089</a>, <a href="https://issuetracker.google.com/issues/161297615">b/161297615</a>)</li> <li>Modifier.drawBorder has been deprecated. Use Modifier.border instead. Border data class has been replaced by BorderStroke (<a href="https://android-review.googlesource.com/#/q/I4257d62b222e27c9ad67e1b2581b162cc9392c9e">I4257d</a>, <a href="https://issuetracker.google.com/issues/158160576">b/158160576</a>)</li> <li>VerticalScroller and HorizontalScroller have been removed. Use ScrollableColumn/Row instead. Modifier.drawBackground has been removed. Use Modifier.background (<a href="https://android-review.googlesource.com/#/q/I73b0d940455a0a8e8dd18b5a483b12707f599304">I73b0d</a>, <a href="https://issuetracker.google.com/issues/163019183">b/163019183</a>)</li> <li>Remove marked as deprecated fillMax* modifiers from LazyItemScope as they are making it harder to add such modifiers correctly for items which are not direct children of LazyColumnFor (<a href="https://android-review.googlesource.com/#/q/Ifa78d7d5956e7f1d903c03aac4fa34b8bef5c425">Ifa78d</a>)</li> <li>added LazyColumn/LazyRow implementation as DSL (<a href="https://android-review.googlesource.com/#/q/I93cc6fbf6ba4b46561677bda17a0b16108b2bd63">I93cc6</a>)</li> <li>Constraints is now an inline class (<a href="https://android-review.googlesource.com/#/q/I88736be04376359506a2e8b4d599975c4f13aa01">I88736</a>)</li> <li>Added the ability to size a layout to a fraction of the available space, using the fillMaxWidth, fillMaxHeight and fillMaxSize modifiers. (<a href="https://android-review.googlesource.com/#/q/I945bbae02b59241d993fc93c31aa81b6e3fee3c8">I945bb</a>, <a href="https://issuetracker.google.com/issues/161562591">b/161562591</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Added a modifier param to SelectionContainer (<a href="https://android-review.googlesource.com/#/q/I4aadafd87d5705b96f73cd49af84728a463c1cc5">I4aada</a>, <a href="https://issuetracker.google.com/issues/161487952">b/161487952</a>)</li> <li>Added mergePolicy lambda to SemanticsPropertyKey. This can be used to define a custom policy for mergeAllDescendants semantics merging. The default policy is to use the parent value if already present, otherwise the child value. (<a href="https://android-review.googlesource.com/#/q/Iaf6c4cc327017ee492f4d8334c8df5167d33df58">Iaf6c4</a>, <a href="https://issuetracker.google.com/issues/161979921">b/161979921</a>)</li> <li><code translate="no" dir="ltr">PlacementScope.placeAbsolute()</code> was renamed to <code translate="no" dir="ltr">PlacementScope.place()</code>, and the previous <code translate="no" dir="ltr">PlacementScope.place()</code> was renamed to <code translate="no" dir="ltr">PlacementScope.placeRelative()</code>. As a result, the <code translate="no" dir="ltr">PlacementScope.place()</code> method will not automatically mirror the position in right-to-left contexts anymore. If this is desired, use <code translate="no" dir="ltr">PlacementScope.placeRelative()</code> instead. (<a href="https://android-review.googlesource.com/#/q/I873ac827e6c4d4bf6c85a80b7128174c61602945">I873ac</a>, <a href="https://issuetracker.google.com/issues/162916675">b/162916675</a>)</li> <li>Removed deprecated FilledTextField component. Please use TextField instead to get the Material Design implementation of the Filled text field. (<a href="https://android-review.googlesource.com/#/q/I5e88900375ee81067f24d39f82f4022bf85b3d9c">I5e889</a>)</li> <li>Added backgroundColor parameter to LinearProgressIndicator and removed internal padding from CircularProgressIndicator. Added new ProgressIndicatorConstants.DefaultProgressAnimationSpec which can be used as the default AnimationSpec when animating progress between values (<a href="https://android-review.googlesource.com/#/q/If38b5dd58d052b75c1974031e0974f22808d9776">If38b5</a>, <a href="https://issuetracker.google.com/issues/161809914">b/161809914</a>, <a href="https://issuetracker.google.com/issues/161804677">b/161804677</a>)</li> <li>The <code translate="no" dir="ltr">state { ... }</code> composable is now deprecated in favor of explicit calls to <code translate="no" dir="ltr">remember { mutableStateOf(...) }</code> for clarity. This reduces the overall API surface and number of concepts for state management, and matches the <code translate="no" dir="ltr">by mutableStateOf()</code> pattern for class property delegation. (<a href="https://android-review.googlesource.com/#/q/Ia57278556d4f35ecf2cf5e6e30888b0d1f1f8012">Ia5727</a>)</li> <li>Renamed RRect to RoundRect to better fit compose naming patterns Created similar function constructors to RRect and deprecated RRect function constructors (<a href="https://android-review.googlesource.com/#/q/I5d32529a133bc2f69ea1de94c2912b2748a0d678">I5d325</a>)</li> <li>Removed onChildPositioned and OnChildPositionedModifier. Developers should use onPositioned and OnPositionedModifier on the child layout instead. (<a href="https://android-review.googlesource.com/#/q/I4522e2cd4a0edb08fd36212eacf19d2895ae87f7">I4522e</a>, <a href="https://issuetracker.google.com/issues/162109766">b/162109766</a>)</li> <li>IntSize is now an inline class (<a href="https://android-review.googlesource.com/#/q/I2bf426245b41f4189dead45114e3791bbceb9d13">I2bf42</a>)</li> <li>LongPress the Blank Area to Edit. (<a href="https://android-review.googlesource.com/#/q/Ib1e5b6da49a1b25f4539af29c505f173c7bb6e6e">Ib1e5b</a>)</li> <li>Hide FloatingToolbar After Tapping on the Text. (<a href="https://android-review.googlesource.com/#/q/If452579ab2b744624c517332919dda25b1e32bd6">If4525</a>)</li> <li>Hide FloatingToolbar When Updating the Selection. (<a href="https://android-review.googlesource.com/#/q/I8444c88f72e19554625cfe3fdbddc693df73c647">I8444c</a>)</li> <li>Deselect When Blur. (<a href="https://android-review.googlesource.com/#/q/I781a2627786bb5938f13dcd7b5e48373f5a655d0">I781a2</a>)</li> </ul> <h3 id="0.1.0-dev16" data-text="Version 0.1.0-dev16" tabindex="-1">Version 0.1.0-dev16</h3> <p>August 5, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:0.1.0-dev16</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:0.1.0-dev16</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:0.1.0-dev16</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9c74ed7b07d1c18da576f179d55e568ca12973df..316f882e649c600372170f013a18515f590f490d/ui">Version 0.1.0-dev16 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>LazyItemScope was added for itemContent param of Lazy lists. It provides modifiers to fill the parent max size which solves the use case when the item should fill the viewport and the regular Modifier.fillMaxSize() doesn't work as the item is measured with infinity constraints. (<a href="https://android-review.googlesource.com/#/q/Ibd3b21685641c22f7deaab1bb71785d8d6135058">Ibd3b2</a>, <a href="https://issuetracker.google.com/issues/162248854">b/162248854</a>)</li> <li>Move dialog to ui (<a href="https://android-review.googlesource.com/#/q/I47fa618a788e598182b782eab755defccaf45ebb">I47fa6</a>)</li> <li>Added LazyColumnForIndexed/LazyRowForIndexed - versions of LazyColumnFor/LazyRowFor which provides both index and item in the itemCallback. It is useful when in addition to a current item you need to know a current index. (<a href="https://android-review.googlesource.com/#/q/I65ff336f568c18bd875157e67ece1f8da6985d4c">I65ff3</a>)</li> <li>Modifier.deternimateProgress has been renamed to Modifier.progressSemantics (<a href="https://android-review.googlesource.com/#/q/I9c0b48e0b7969a842a114b50c86d8c37799ede1d">I9c0b4</a>)</li> <li>LazyColumnItems was renamed to LazyColumnFor. LazyRowItems was renamed to LazyRowFor (<a href="https://android-review.googlesource.com/#/q/I84f843793994276f1ccb9f21464c4b74629aaf12">I84f84</a>)</li> <li>Add some Marks/Annotations for best practice reason. (<a href="https://android-review.googlesource.com/#/q/I66b206ffe0fe1a5ceb88bf0b0a2b0d84f2c3f6bd">I66b20</a>)</li> <li>foundation.shape.corner package were flatten to foundation.share (<a href="https://android-review.googlesource.com/#/q/I464919cb74f8941c2a02f14dea0aa417febf3691">I46491</a>, <a href="https://issuetracker.google.com/issues/161887429">b/161887429</a>)</li> <li>Added сrossaxis gravity param for LazyRowItems/LazyColumnItems. LazyRowItems/LazyColumnItems now support wrap content behaviour. (<a href="https://android-review.googlesource.com/#/q/Ib39fc1d1ec28db109f05d191ad80570230e985cd">Ib39fc</a>)</li> <li>ZoomableState has been renamed to ZoomableController. Custom curve support has been added for smoothScale. <code translate="no" dir="ltr">enabled</code> and <code translate="no" dir="ltr">onZoomStarted</code> functionality has been added (<a href="https://android-review.googlesource.com/#/q/If8b8fa81e13136f225a94b87f55d7f1c51fb6747">If8b8f</a>)</li> <li>Material FilledTextField was renamed to TextField and foundational TextField was renamed to BaseTextField to make simplest desired API easy to discover and use (<a href="https://android-review.googlesource.com/#/q/Ia62420a7a2231c02b6874a9a2867bf786a397ed3">Ia6242</a>, <a href="https://issuetracker.google.com/issues/155482676">b/155482676</a>)</li> <li>Previously deprecated AdapterList has been removed. Use LazyColumnItems instead (<a href="https://android-review.googlesource.com/#/q/I12b9b009a56b669f7024ae5e2e8fb9e5cb9f8d98">I12b9b</a>)</li> <li>Modifier.drawBackground has been renamed to Modifier.background (<a href="https://android-review.googlesource.com/#/q/I1367723fce0e07418ed4ab391fe20c69aa092f53">I13677</a>)</li> <li>The old ConstraintLayout DSL was removed. ConstraintSet2 has been renamed to ConstraintSet. (<a href="https://android-review.googlesource.com/#/q/If58d10ec7933bb5b3cd71f6b0ec257839b0309dc">If58d1</a>, <a href="https://issuetracker.google.com/issues/162450908">b/162450908</a>)</li> <li>Added Modifier.absoluteOffset() and Modifier.absoluteOffsetPx(). Unlike offset modifiers, absolute offset modifiers will not auto-mirror in right-to-left context (<a href="https://android-review.googlesource.com/#/q/I3aa2155766e3989cbf703e48f71daaf079a63f8e">I3aa21</a>)</li> <li><code translate="no" dir="ltr">Row</code> and <code translate="no" dir="ltr">Column</code> are now inline function significantly reducing the overhead of using them. (<a href="https://android-review.googlesource.com/#/q/I75c10e663b74ffc250a3293df7583fcd86ea891a">I75c10</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Address broad API fixes (<a href="https://android-review.googlesource.com/#/q/I077bcdc5c027e5dbe865d56f49420ce4a70a4e44">I077bc</a>) <ol> <li>Remove unused OffsetBase interface</li> <li>Align Offset and IntOffset classes to have a consistent API surface</li> <li>Rename IntOffset.Origin to IntOffset.Zero to be consistent with Offset API</li> <li>Moved nativeCanvas method off of Canvas interface to support consumers to create their own Canvas instances</li> <li>Created stub EmptyCanvas class to refactor DrawScope to be a non-null parameter instead of lateinit and ensure non-nullability of the field</li> <li>Renamed ClipOp enums to be Pascal Case</li> <li>Renamed FilterQuality enums to be Pascal Case</li> <li>Renamed StrokeJoin enums to be Pascal Case</li> <li>Renamed PointMode enums to be Pascal Case</li> <li>Renamed PaintingStyle enums to be Pascal Case</li> <li>Renamed PathFillType enums to be Pascal Case</li> <li>Renamed StrokeCap enums to be Pascal Case</li> <li>Updated DrawCache implementation to no longer use lateinit params</li> <li>Updated DrawScope to no longer use lazy delegation for fillPaint and strokePaint internal parameters</li> <li>Updated Image composable to avoid Box usage for less overhead</li> <li>Updated Outline class to have @Immutable annotations</li> <li>Updated PathNode to have @Immutable annotations for each path instruction</li> <li>Updated Vector subcomposition to remove redundant conditional checks for equality as compose already handles them</li> <li>Deprecated Rect companion constructor methods in favor of function constructors</li> <li>Updated Brush classes and function constructors with @Immutable and @Stable APIs</li> <li>Updated VertexMode enum to be PascalCase</li> <li>Updated DrawScope selectPaint method to conditionally overwrite stroke parameters on the paint if they have changed</li> <li>Updated Size to add destructuring API, rename UnspecifiedSize to Unspecified and removed unused methods</li> </ol></li> <li><p>Added MonotonicFrameAnimationClock that enables you to use a MonotonicFrameClock as an AnimationClockObservable to bridge the gap between the new coroutines based clocks and APIs that still use the old callback based clocks.</p> <p>The MonotonicFrameClock equivalent of ManualAnimationClock is now ManualFrameClock. (<a href="https://android-review.googlesource.com/#/q/I111c7b7182a1495f95eab1bb808d3acd6af82447">I111c7</a>, <a href="https://issuetracker.google.com/issues/161247083">b/161247083</a>)</p></li> <li><p>Removed <code translate="no" dir="ltr">SemanticsNodeInteraction.performPartialGesture</code>. Use <code translate="no" dir="ltr">SemanticsNodeInteraction.performGesture</code> instead. (<a href="https://android-review.googlesource.com/#/q/Id9b628ebe475c8a067118320b26a7b2461e98129">Id9b62</a>)</p></li> <li><p>Renamed <code translate="no" dir="ltr">SemanticsNodeInteraction.getBoundsInRoot()</code> to <code translate="no" dir="ltr">SemanticsNodeInteraction.getUnclippedBoundsInRoot()</code> (<a href="https://android-review.googlesource.com/#/q/Icafdf63b2e2f03f48d5b51371e733917dedcf422">Icafdf</a>, <a href="https://issuetracker.google.com/issues/161336532">b/161336532</a>)</p></li> <li><p>The APIs for right-to-left support has been updated. LayoutDirectionAmbient has been added, which can be used to read and change the layout direction. Modifier.rtl and Modifier.ltr have been removed. (<a href="https://android-review.googlesource.com/#/q/I080b3cb674dc32af5fbe7e696228ac21f0720d72">I080b3</a>)</p></li> <li><p>Modifier.plus has been deprecated, use Modifier.then instead. 'Then' has a stronger signal of ordering, while also prohibits to type <code translate="no" dir="ltr">Modifier.padding().background() + anotherModifier</code>, which breaks the chain and harder to read (<a href="https://android-review.googlesource.com/#/q/Iedd587edbed0ba964ef203a66b98be7297147bd7">Iedd58</a>, <a href="https://issuetracker.google.com/issues/161529964">b/161529964</a>)</p></li> <li><p>Added <code translate="no" dir="ltr">isFocused()</code> and <code translate="no" dir="ltr">isNotFocused()</code> SemanticsMatcher. (<a href="https://android-review.googlesource.com/#/q/I0b760d316a616ab385fa421b080edefee8e27681">I0b760</a>)</p></li> <li><p>RemeasurementModifier was added. It allows users to synchronously remeasure the layout. In general, you never need it as remeasure/relayout is happening automatically, but we use it inside LazyColumnItems during the scroll. (<a href="https://android-review.googlesource.com/#/q/I5f33173ba1f76153139fa086fef4e2a86d010282">I5f331</a>, <a href="https://issuetracker.google.com/issues/160791058">b/160791058</a>)</p></li> <li><p>isSystemInDarkTheme now always considers the system-wide dark theme setting, and ignores power saving status before Q, following latest guidance. (<a href="https://android-review.googlesource.com/#/q/I0c10c14676fa25da477d9faff50e58a46eb4cee8">I0c10c</a>)</p></li> <li><p>OnChildPositioned has been deprecated. Use OnPositioned on the child instead. (<a href="https://android-review.googlesource.com/#/q/I87f95da597607cbc534647def3b1a39527dcdeaa">I87f95</a>, <a href="https://issuetracker.google.com/issues/162109766">b/162109766</a>)</p></li> <li><p>Renamed AndroidComposeTestRule to createAndroidComposeRule. (<a href="https://android-review.googlesource.com/#/q/I70aaf550e1bff2871b9732cc5abf58e9af1479fe">I70aaf</a>)</p></li> <li><p>Add accessibility action to get TextLayoutResult (<a href="https://android-review.googlesource.com/#/q/I9d6e6313528500524f04638ccb5742fcfbb41392">I9d6e6</a>)</p></li> </ul> <h3 id="0.1.0-dev15" data-text="Version 0.1.0-dev15" tabindex="-1">Version 0.1.0-dev15</h3> <p>July 22, 2020</p> <p><code translate="no" dir="ltr">androidx.compose.foundation:foundation:0.1.0-dev15</code>, <code translate="no" dir="ltr">androidx.compose.foundation:foundation-layout:0.1.0-dev15</code>, and <code translate="no" dir="ltr">androidx.compose.foundation:foundation-text:0.1.0-dev15</code> are released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/9f60cc700129e30cee9df020005c317fb39d32ec/ui">Version 0.1.0-dev15 contains these commits.</a></p> <p>To use the <code translate="no" dir="ltr">0.1.0-dev15</code> version of Compose, you will need to:</p> <h4 id="dependencies_update_2" data-text="Dependencies Update" tabindex="-1">Dependencies Update</h4> <ul> <li>To use the <code translate="no" dir="ltr">0.1.0-dev15</code> version of Compose, you will need to update your dependencies according to the new code snippets shown above in <a href="#declaring_dependencies">Declaring dependencies</a>.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Similarly to the new param in ScrollableColumn/ScrollableRow LazyColumnItems/LazyRowItems now also have contentPadding param which allows to add a padding for the content after it has been clipped, which is not possible via just a modifier param. It also allows to add a spacing only before first item/after last item. (<a href="https://android-review.googlesource.com/#/q/Ibc24e9e194f9cd7cd4c24c2b843eb5be39266b35">Ibc24e</a>)</li> <li>onFocusChange callback in text fields renamed to onFocusChanged (<a href="https://android-review.googlesource.com/#/q/Ida4a1a55e5a9119c3a740d28ad2e0d9126d40853">Ida4a1</a>)</li> <li>VerticalScroller and HoriziontalScroller have been deprecated. Use ScrollableColumn and ScrollableRow for build-in experience with Column/Row behaviour and parameters, or Modifier.verticalScroll and Modifier.horizontalScroll on your own element. Similarly, ScrollerPosition has been deprecated in favor of ScrollState' (<a href="https://android-review.googlesource.com/#/q/I400ce0e6c0e33aa865e0e49defef1eb92ac40a93">I400ce</a>, <a href="https://issuetracker.google.com/issues/157225838">b/157225838</a>, <a href="https://issuetracker.google.com/issues/149460415">b/149460415</a>, <a href="https://issuetracker.google.com/issues/154105299">b/154105299</a>)</li> <li>Modifier.draggable and Modifier.scrollable APIs were reworked. DragDirection was removed in favor of Orientation. State required for scrollable has beed simplified. ScrollableState has been renamed to ScrollableController (<a href="https://android-review.googlesource.com/#/q/Iab63cb65002471a5173f387f7bc6720aa929f9e6">Iab63c</a>, <a href="https://issuetracker.google.com/issues/149460415">b/149460415</a>)</li> <li>Single-value semantics properties now use a calling style. For example, 'semantics { hidden = true }' is now written as: <code translate="no" dir="ltr">semantics { hidden() }</code>. (<a href="https://android-review.googlesource.com/#/q/Ic1afd12ea22c926babc9662f1804d80b33aa0cfc">Ic1afd</a>, <a href="https://issuetracker.google.com/issues/145951226">b/145951226</a>, <a href="https://issuetracker.google.com/issues/145955412">b/145955412</a>)</li> <li>Corner sizes used by RoundedCornerShape and CutCornerShape can now be larger than 50% (<a href="https://android-review.googlesource.com/#/q/Id2340cc5b2c3e2c8a95c9318b1110b840864dd97">Id2340</a>, <a href="https://issuetracker.google.com/issues/160400213">b/160400213</a>)</li> <li>Changed the default ContentScale parameter for the Image composable from Inside to Fit. This was done in order to get behavior to scale up the underlying Painter if the layout size is larger than the intrinsic size of the painter while maintaining the aspect ratio. This behavior better matches expectations for providing fixed sizes to the Image while not affecting the default behavior if only the intrinsic size is used to compute the size of the composable. (<a href="https://android-review.googlesource.com/#/q/I40ae3af9b6a2efc3d730ea0ba5f457a788eca1f7">I40ae3</a>, <a href="https://issuetracker.google.com/issues/159838006">b/159838006</a>)</li> <li>Use AnimationSpec instead of AnimationBuilder in the top level APIs to clarify the concept of static animation specification -Improve the transition DSL by removing the lambda requirement for creating AnimationSpecs such as tween, spring. They instead take constructor params directly. -Improve the overall ease of use of AnimationSpec opening up constructors instead of relying on builders -Change the duration and delay for KeyFrames and Tween to Int. This eliminates unnecessary type casts and method overloading (for supporting both Long and Int). (<a href="https://android-review.googlesource.com/#/q/Ica0b4cb42996d3d30f9b6dacdbe149c75af77341">Ica0b4</a>)</li> <li>Clickable was removed. Use Modifier.clickable (<a href="https://android-review.googlesource.com/#/q/I84bdf2bc75e8ccda44afbe9db49d4c879703309b">I84bdf</a>)</li> <li>Added LazyRowItems - Horizontally scrolling analogue of LazyColumnItems (<a href="https://android-review.googlesource.com/#/q/Ibbcf7fdd13264dbeda6b95d927b6bdc77cf27486">Ibbcf7</a>)</li> <li>Introduced low level stateless animation APIs. These APIs (<a href="https://android-review.googlesource.com/#/q/I63bf7d28d5ac5e5ca2caaa427ee7643828c848a5">I63bf7</a>)</li> <li>androidx.ui.foundation.TextFieldValue and androidx.ui.input.EditorValue is deprecated. TextField, FilledTextField and CoreTextField composables that uses that type is also deprecated. Please use androidx.ui.input.TextFieldValue instead (<a href="https://android-review.googlesource.com/#/q/I4066d1f4d2e3e3514753aa3495680292dc55f89d">I4066d</a>, <a href="https://issuetracker.google.com/issues/155211005">b/155211005</a>)</li> <li>Replaced usage of IntPx with Int. Replaced IntPxPosition with IntOffset. Replaced IntPxSize with IntSize. (<a href="https://android-review.googlesource.com/#/q/Ib7b44d92ce3aff86c606753f0ac5c3122b71041d">Ib7b44</a>)</li> <li>androidx.ui.foundation.shape.RectangleShape removed; use androidx.ui.graphics.RectangleShape (<a href="https://android-review.googlesource.com/#/q/I94939a33873c808440fa8256627e16a79e88472c">I94939</a>, <a href="https://issuetracker.google.com/issues/154507984">b/154507984</a>)</li> <li>In order to consolidate the number of classes used to represent sizing information, standardize on usage of the Size class instead of PxSize. This provides the benefits of an inline class to leverage a long to pack 2 float values to represent width and height represented as floats. (<a href="https://android-review.googlesource.com/#/q/Ic019171b52d2f24d262d9c47ac964728cdc1ee8b">Ic0191</a>)</li> <li>In order to consolidate the number of classes used to represent positioning information, standardize on usage of the Offset class instead of PxPosition. This provides the benefits of an inline class to leverage a long to pack 2 float values to represent x and y offsets represented as floats. (<a href="https://android-review.googlesource.com/#/q/I3ad983207bc37af20afac03e2cd09b4240777687">I3ad98</a>)</li> <li>Added Modifier.zoomable for pinch-to-zoom functionality (<a href="https://android-review.googlesource.com/#/q/Id5d63ff7d29f9dedd6d9d28df2ce74081a892cda">Id5d63</a>)</li> <li>Toggleable component has been deprecated. Use Modifier.toggleable instead (<a href="https://android-review.googlesource.com/#/q/I35220fca0d9d11198d1158cb905cfb2586965a34">I35220</a>, <a href="https://issuetracker.google.com/issues/157642842">b/157642842</a>)</li> <li>MutuallyExclusiveSetItem has been deprecated. Use Modifier.selectable instead. (<a href="https://android-review.googlesource.com/#/q/I02b473710e5a654427b51565c0b950392f68fcff">I02b47</a>, <a href="https://issuetracker.google.com/issues/157642842">b/157642842</a>)</li> <li>TestTag is now deprecated. Use Modifier.testTag instead. (<a href="https://android-review.googlesource.com/#/q/If5110df5865f5933d10d54a8aacba58f8cd1c712">If5110</a>, <a href="https://issuetracker.google.com/issues/157173105">b/157173105</a>)</li> <li>Adds fontWeight parameter to Text, which was accidentally not added previously (<a href="https://android-review.googlesource.com/#/q/I5693777e720aed4b890c10fcbcd3949c66b24a0e">I56937</a>)</li> <li>Replaced usage of Px class in various compose classes as part of the large refactoring effort to only rely on Dp and primitive types for pixel parameters (<a href="https://android-review.googlesource.com/#/q/I19d02beca10c30e9b6b444be0c2dd21227e30e9c">I19d02</a>)</li> <li>VerticalScroller now provides Column out of the box. HorizontalScroller now provides Row out of the box. (<a href="https://android-review.googlesource.com/#/q/Ieca5d185b9f6e950a7175b9daa7a9a511a439da2">Ieca5d</a>, <a href="https://issuetracker.google.com/issues/157020670">b/157020670</a>)</li> <li>Replaced usage of Px class in various compose classes as part of the large refactoring effort to only rely on Dp and primitive types for pixel parameters (<a href="https://android-review.googlesource.com/#/q/Iede0b310a8a8f4a39ba6ae4a99c753f7f590d8ed">Iede0b</a>)</li> <li>Modifier.indication has been added to foundation package. Use it to show press/drag/other indication on your custom interactable elements (<a href="https://android-review.googlesource.com/#/q/I8425fc70afc4d2815f937f8514352ce831e692ae">I8425f</a>, <a href="https://issuetracker.google.com/issues/155287131">b/155287131</a>)</li> <li>VerticalScroller and HorizontalScroller now support reversed scrolling is isReversed is set on ScrollerPosition (<a href="https://android-review.googlesource.com/#/q/I953bd0d7f4b036a030eeb29e4596d02c67dc35a1">I953bd</a>)</li> <li>Support adding composables into text layout. (<a href="https://android-review.googlesource.com/#/q/I1373cd3bcc4e9d6a70f822c520f0b4ee9ff1bc5b">I1373c</a>)</li> <li>Consolidated CanvasScope implementations so there is now just DrawScope and ContentDrawScope Renamed CanvasScope to DrawScope. Updated DrawScope to implement Density interface and provide LayoutDirection Deleted DrawScope subclass in ContentDrawScope Painter and PainterModifier have been updated to no longer maintain an RTL property themselves as DrawScope provides this already without manually providing it (<a href="https://android-review.googlesource.com/#/q/I1798e4b2b325297c3b5394aa99be3db935e369b7">I1798e</a>)</li> <li>Removed deprecated DrawBackground API in favor of drawBackground extension APIs on Modifier. Refactored color, brush and paint drawBackground implementations to reduce code paths as well as remove requirement for Modifier to be created as part of composition. (<a href="https://android-review.googlesource.com/#/q/I0343a0d32684e77f9bc72c9cf68ce55d92ec575d">I0343a</a>)</li> <li>Updated higher level compose APIs that expose a Canvas to expose CanvasScope instead. This removes the need for consumers to maintain their own Paint objects. For consumers that still require access to a Canvas they can use the drawCanvas extension method which provides a callback to issue drawing commands with the underlying Canvas. (<a href="https://android-review.googlesource.com/#/q/I80afdf4c0a648962aa6ef1efc05b1d3b65757094">I80afd</a>)</li> <li>HorizontalScroller and VerticalScroller not restores their scroll position using saved instance state. (<a href="https://android-review.googlesource.com/#/q/Ia0fae1fe0df60d85302255acb8577cd8e769d297">Ia0fae</a>, <a href="https://issuetracker.google.com/issues/155075048">b/155075048</a>)</li> <li>FocusManagerAmbient is removed. Use FocusModifier.requestFocus to obtain focus. (<a href="https://android-review.googlesource.com/#/q/Ic482662c18a1cb41f097a1e0bcc114d517b756b7">Ic4826</a>)</li> <li>Table layout was removed temporarily until we will make it available again with a refreshed API. (<a href="https://android-review.googlesource.com/#/q/Id88a7d9c0a4de2c1abd4f030c27f77f73fa21bb3">Id88a7</a>)</li> <li><p>Created CanvasScope API that wraps a Canvas object to expose a stateless, declarative drawing API surface. Transformations are contained within their own receiver scope and sizing information is also scoped to corresponding inset bounds. It does not require a consumer to maintain its own Paint state object for configuring drawing operations.</p> <p>Added CanvasScopeSample as well as updated the demo app to include a declarative graphics demo (<a href="https://android-review.googlesource.com/#/q/Ifd86d39ef5807d34cc06d06854d24330e5e00164">Ifd86d</a>)</p></li> <li><p>ColoredRect has been removed. User Box with drawBackground modifier instead (<a href="https://android-review.googlesource.com/#/q/I983c7fe9b61d873421278caf1c46ff9461307642">I983c7</a>, <a href="https://issuetracker.google.com/issues/152753731">b/152753731</a>)</p></li> <li><p>Add cursor color customisation to the TextField (<a href="https://android-review.googlesource.com/#/q/I6e33fa47950cddb5d3631528cd954c48a3f255d2">I6e33f</a>)</p></li> <li><p>Now it is possible to hide/show software keyboard by using SoftwareKeyboardController which is delivered by onTextInputStarted callback (<a href="https://android-review.googlesource.com/#/q/I8dc44f64d4f457339364b9624c0b3e946cdf01b3">I8dc44</a>, <a href="https://issuetracker.google.com/issues/151860051">b/151860051</a>)</p></li> <li><p>TextFieldValue used with TextField can now be survive activity recreation when used like this: <code translate="no" dir="ltr">var text by savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }</code> (<a href="https://android-review.googlesource.com/#/q/I5c3cee62fa592dd00c1595efc6ea950b8aeda676">I5c3ce</a>, <a href="https://issuetracker.google.com/issues/155075724">b/155075724</a>)</p></li> <li><p>Adds commonly used parameters to Text(). If you are currently creating a local text style to pass a small number of these parameters, such as <code translate="no" dir="ltr">Text(style = TextStyle(textAlign = TextAlign.Center))</code>, you can now just provide the parameters directly: <code translate="no" dir="ltr">Text(textAlign = TextAlign.Center)</code> (<a href="https://android-review.googlesource.com/#/q/I8276873965f3588ed2cbc560f70a9ddd2405027b">I82768</a>)</p></li> <li><p>Replaced CoreTextField/TextField focusIdentifier parameter with FocusNode in order to integrate with focus subsystem. (<a href="https://android-review.googlesource.com/#/q/I7ea4842b2acff06658b0731c55c877301b524757">I7ea48</a>)</p></li> <li><p>TextField update - in horizontal dimension it will occupy all available space granted to it (<a href="https://android-review.googlesource.com/#/q/Ib08dfc0363c5a3521f68c750ba6dc490a25081d3">Ib08df</a>, <a href="https://issuetracker.google.com/issues/154638552">b/154638552</a>)</p></li> <li><p>Added InteractionState and Interaction, making it easier to build components that react to UI state changes such as press, and drag (<a href="https://android-review.googlesource.com/#/q/Icfe2590a97f5df73e999334b88dd69faa91651b7">Icfe25</a>, <a href="https://issuetracker.google.com/issues/152525426">b/152525426</a>)</p></li> <li><p>RectangleShape moved from androidx.ui.foundation.shape.* to androidx.ui.graphics.* (<a href="https://android-review.googlesource.com/#/q/Ia74d5a3bbe2ee3a28bbddb57a2aef2607679d4ac">Ia74d5</a>, <a href="https://issuetracker.google.com/issues/154507984">b/154507984</a>)</p></li> <li><p>Replaced all nullable Color uses in API with non-nullable and use Color.Unset instead of null (<a href="https://android-review.googlesource.com/#/q/Iabaa7c6334857833cdb0d5958f062e2e576bd240">Iabaa7</a>)</p></li> <li><p>TextField API update - merged onFocus and onBlur callbacks into a single onFocusChange(Boolean) callback with parameter (<a href="https://android-review.googlesource.com/#/q/I66cd3b14d1df6bfbaafc25e501995368d69138ec">I66cd3</a>)</p></li> <li><p>Renamed ScaleFit to ContentScale Moved ContentScale from ui-graphics to ui-core module to live in the same module as the Alignment API. Renamed FillMaxDimension to Crop Renamed FillMinDimension to Fit Renamed Fit to Inside to better match ImageView.ScaleType equivalents Added documentation indicating that the combination of Crop and Alignment.Center achieves the same result as ImageView.ScaleType.CENTER_CROP and Fit used with Alignment.Center achieves the same result as ImageView.ScaleType.FIT_CENTER Inside used with Alignment.Center achieves the same result as ImageView.ScaleType.CENTER_INSIDE (<a href="https://android-review.googlesource.com/#/q/I45f09c681afda9c83483b20405ec21292593b41a">I45f09</a>, <a href="https://issuetracker.google.com/issues/152842521">b/152842521</a>)</p></li> <li><p>Removes ProvideContentColor, instead just use ContentColorAmbient directly with <code translate="no" dir="ltr">Providers</code> (<a href="https://android-review.googlesource.com/#/q/Iee94234bfe6f820445b3d3d986895b293271753e">Iee942</a>)</p></li> <li><p>Adds color parameter to text, allowing overriding the color of the text style without needing to manually merge with the style provided in a theme. (<a href="https://android-review.googlesource.com/#/q/I41a6676070cdb4d2dac91bf3c6422007db7f7276">I41a66</a>)</p></li> <li><p>Improve DrawModifier API:</p> <ul> <li>Made the receiver scope for draw() ContentDrawScope</li> <li>Removed all parameters on draw()</li> <li>DrawScope has same interface as former CanvasScope</li> <li>ContentDrawScope has drawContent() method (<a href="https://android-review.googlesource.com/#/q/Ibaced5feb8778510b8fe78e96f4fd3da1a6fda50">Ibaced</a>, <a href="https://issuetracker.google.com/issues/152919067">b/152919067</a>)</li> </ul></li> <li><p>ColoredRect has been deprecated. Use <code translate="no" dir="ltr">Box(Modifier.preferredSize(width, height).drawBackground(color))</code> instead. (<a href="https://android-review.googlesource.com/#/q/I499fa26b66b128943500fbdf9ba490d754adf561">I499fa</a>, <a href="https://issuetracker.google.com/issues/152753731">b/152753731</a>)</p></li> <li><p>Shape theming system is updated according to the Material design specification. Now you can provide small, medium and large shapes to be used by most of the components (<a href="https://android-review.googlesource.com/#/q/Ifb4d152de62f71c6b1759c73702752673aa27c7d">Ifb4d1</a>)</p></li> <li><p>Replaced Modifier plus operator with factory extension functions (<a href="https://android-review.googlesource.com/#/q/I225e444f50956d84e15ca4f1378b7f805d54e0ca">I225e4</a>)</p></li> <li><p>Draggable has been moved to modifier (<a href="https://android-review.googlesource.com/#/q/Id9b16db6942de069e8d2221f192525b3bc71ab7d">Id9b16</a>, <a href="https://issuetracker.google.com/issues/151959544">b/151959544</a>)</p></li> <li><p>Moved <code translate="no" dir="ltr">Text</code> to androidx.ui.foundation package, from androidx.ui.core. (<a href="https://android-review.googlesource.com/#/q/I87ce56618b325d7fcf221262fdd468840619dc7f">I87ce5</a>)</p></li> <li><p>add <code translate="no" dir="ltr">enabled</code> param to Checkbox, Switch and Toggleable (<a href="https://android-review.googlesource.com/#/q/I41c1634c860ab068308d33d7e1a0547ad79adbdb">I41c16</a>)</p></li> <li><p>Ripple is now a Modifier. While Clickable is not yet converted the recommended usage is <code translate="no" dir="ltr">Clickable(onClick = { ... }, modifier = ripple())</code> (<a href="https://android-review.googlesource.com/#/q/Ie52007f6948838a64fb25dba4dfbb7853d0e442f">Ie5200</a>, <a href="https://issuetracker.google.com/issues/151331852">b/151331852</a>, <a href="https://issuetracker.google.com/issues/150060763">b/150060763</a>)</p></li> <li><p>Added VectorPainter API to replace existing subcomposition API for vector graphics. Result of subcomposition is a VectorPainter object instead of a DrawModifier. Deprecated previous DrawVector composables in favor of VectorPainter.</p> <p>Renamed <code translate="no" dir="ltr">Image(Painter)</code> API to <code translate="no" dir="ltr">PaintBox(Painter)</code> Created Vector composable that behaves like the Image composable except with a VectorAsset instead of an ImageAsset (<a href="https://android-review.googlesource.com/#/q/I9af9a365eb744e0cdb343cf424f4df5160d6c2b4">I9af9a</a>, <a href="https://issuetracker.google.com/issues/149030271">b/149030271</a>)</p></li> <li><p>Created Image composable to handle sizing/layout in addition to drawing a given ImageAsset to the screen. This composable also supports drawing any arbitrary Painter instance respecting its intrinsic size as well as supporting a given fixed size or minimum size (<a href="https://android-review.googlesource.com/#/q/Ibcc8f4d61cf0a0fbe697055ee2b6bfe8568755ed">Ibcc8f</a>)</p></li> <li><p>Button, FloatingActionButton and Clickable now have a separate <code translate="no" dir="ltr">enabled</code> param. Some of the params on Button were renamed or reordered. (<a href="https://android-review.googlesource.com/#/q/I54b5ac613632c1cd804b756d3ad2ccb7a475a149">I54b5a</a>)</p></li> <li><p>Renamed Image to ImageAsset to better differentiate the difference between the Image data and the upcoming Image composable used to participate in layout and draw content.</p> <p>Created extension method on android.graphics.Bitmap, <code translate="no" dir="ltr">Bitmap.asImageAsset()</code>, to create an instance of an ImageAsset useful for combining traditional Android application development with the compose framework. (<a href="https://android-review.googlesource.com/#/q/Id5bbdf3fe1cf68750a76bb955b20e06d1f81a71e">Id5bbd</a>)</p></li> <li><p>DrawImage composable was removed. Use ImagePainter to draw image on existing layout, or SimpleImage to introduce Image that takes space (<a href="https://android-review.googlesource.com/#/q/I595e1cac09eb1d275b3b1ded2c2ce05b3f4b41bb">I595e1</a>, <a href="https://issuetracker.google.com/issues/149827027">b/149827027</a>)</p></li> <li><p>Stack component supports right-to-left directionality (<a href="https://android-review.googlesource.com/#/q/Ic9e00dfc5b8c16ff305c14bc38de38cdf72d4cf5">Ic9e00</a>)</p></li> <li><p>Added Icon, IconButton and IconToggleButton, removing AppBarIcon. You can directly replace existing usages of AppBarIcon with IconButton, and they will now have the correct touch target. See the samples for usage information, and see Icons for the provided Material Icons you can use directly with these components. (<a href="https://android-review.googlesource.com/#/q/I9684914dcde197df74d11f1173d827cd902e8832">I96849</a>)</p></li> <li><p>DrawShape composable was removed. Use DrawBackground modifier instead. (<a href="https://android-review.googlesource.com/#/q/I7ceb270c8571b3cb1cdc8b0494d90c985f61b3d7">I7ceb2</a>)</p></li> <li><p>Added AdapterList, a scrolling list component that only composes and lays out the visible items. Currently known issues include that it is vertical-only and does not fully handle all cases of changes to its children. (<a href="https://android-review.googlesource.com/#/q/Ib351be89aabb59dac29806a935e377e90a2da9c2">Ib351b</a>)</p></li> <li><p>Scrollable component has been added, which allows creation of custom Scrollers/Lists (<a href="https://android-review.googlesource.com/#/q/I5fd372b89269ffe08db8fe27238ec9dc0f9d84a1">I5fd37</a>)</p></li> <li><p>Renamed background to DrawBackground and make it to be memorized by default (<a href="https://android-review.googlesource.com/#/q/Ia0bd3f7657dc66ae6f492ccfcf88c44ba92bb7e0">Ia0bd3</a>)</p></li> <li><p>Add paddings, border, shape and background param to Box (<a href="https://android-review.googlesource.com/#/q/I05027a87956b6e4233a6b8992d321633e9fdcdc9">I05027</a>, <a href="https://issuetracker.google.com/issues/148147281">b/148147281</a>)</p></li> <li><p>Added Canvas component. This composable takes up some size (provided by user) and allows you to draw using CanvasScope (<a href="https://android-review.googlesource.com/#/q/I0d62259da4f70e68e57ed1b20cdc9b9aa3d8b1be">I0d622</a>)</p></li> <li><p>rename <code translate="no" dir="ltr">Border</code> modifier to <code translate="no" dir="ltr">DrawBorder</code> (<a href="https://android-review.googlesource.com/#/q/I8ffccaa928e74efd71dcdcda550f250195f2e5d3">I8ffcc</a>)</p></li> <li><p>Added Box component for combining layout and drawing common functionality. (<a href="https://android-review.googlesource.com/#/q/I6e2a71af98e847124a5944b1cbe9fee82d886b3b">I6e2a7</a>)</p></li> <li><p>Scrollers now exhibit native Android fling motion behavior. (<a href="https://android-review.googlesource.com/#/q/I922af68261f3f1e81538a98a7575603e531fc035">I922af</a>, <a href="https://issuetracker.google.com/issues/147493715">b/147493715</a>)</p></li> <li><p>Replaced DrawBorder in favor of Border Modifier (<a href="https://android-review.googlesource.com/#/q/Id335a8c2526693f8eb9d440c8d25341029f5de89">Id335a</a>)</p></li> <li><p>Modifier.tag was renamed to Modifier.layoutId, to avoid confusion with Modifier.testTag. (<a href="https://android-review.googlesource.com/#/q/I995f09d0722964ad8a5708c7299e4c6f52bec1c5">I995f0</a>)</p></li> <li><p>The percent parameter when creating ConstraintLayout guidelines has been renamed to fraction. (<a href="https://android-review.googlesource.com/#/q/Ida2db05016958daba8ebaf7cbb5cc5fbe5f0a4dc">Ida2db</a>)</p></li> <li><p>Added support for margins of ConstraintLayout barriers. (<a href="https://android-review.googlesource.com/#/q/I47ffedafd3cfd3a1164763224f8c6a61c0d1588e">I47ffe</a>)</p></li> <li><p>Fixed RTL support in ConstraintLayout. Added RTL unaware APIs. (<a href="https://android-review.googlesource.com/#/q/I3b1c75b837ef54b48306fe7938ec1d0444488d0b">I3b1c7</a>)</p></li> <li><p>A new DSL for ConstraintLayout has been added. Please see the samples for more details. (<a href="https://android-review.googlesource.com/#/q/Icaa9abed35747c227aa53f9365e7ec1100e81759">Icaa9a</a>)</p></li> <li><p>Added the @ExperimentalLayout annotation. ConstraintLayout, FlowRow and FlowColumn are now tagged with it to mark that their APIs are going to change. (<a href="https://android-review.googlesource.com/#/q/I412a82b5d6389a7cc99fb2da01aef6cae01aca0c">I412a8</a>)</p></li> <li><p><code translate="no" dir="ltr">Modifier.padding(InnerPadding)</code> has been added (<a href="https://android-review.googlesource.com/#/q/I94985666c03d8bf2748dfb9524ebc3df5d09b1ae">I94985</a>, <a href="https://issuetracker.google.com/issues/157133803">b/157133803</a>)</p></li> <li><p>Removed deprecated RowAlign, ColumnAlign in Row and Column. (<a href="https://android-review.googlesource.com/#/q/If60d4b94486fdd3fa7c768905827c3b6594bffda">If60d4</a>, <a href="https://issuetracker.google.com/issues/155858731">b/155858731</a>)</p></li> <li><p>Removed deprecated LayoutTag(), please use Modifier.tag() instead. Removed deprecated Modifier.matchParent(), please use Modifier.matchParentSize() instead. (<a href="https://android-review.googlesource.com/#/q/If8044397663695ed258a1c8f8c01caa70ff2064f">If8044</a>)</p></li> <li><p>Added the offsetPx layout modifier, which can be used to define (dynamic) offsets in px. (<a href="https://android-review.googlesource.com/#/q/I5af57f262d283f5220779c7dbca3aa9b2b1f9c06">I5af57</a>)</p></li> <li><p>AlignmentLineOffset composable is deprecated, please use relativePaddingFrom() modifier instead. CenterAlignmentLine composable is removed. (<a href="https://android-review.googlesource.com/#/q/I601076f5ba044b176e07115a1916cdee71083163">I60107</a>)</p></li> <li><p>Added defaultMinSizeConstraints layout modifier, which sets size constraints to the wrapped layout only when the incoming corresponding constraints are unspecified (0 for min constraints and infinity for max constraints). (<a href="https://android-review.googlesource.com/#/q/I311eaf525d05eea9f657f583da7fdf845ad8d64f">I311ea</a>, <a href="https://issuetracker.google.com/issues/150460257">b/150460257</a>)</p></li> <li><p>Container has been removed. Use Box instead (<a href="https://android-review.googlesource.com/#/q/Ibbc2b13b68d04a708211e6477a7e4fbd13f34ac6">Ibbc2b</a>, <a href="https://issuetracker.google.com/issues/151407926">b/151407926</a>)</p></li> <li><p>Removed deprecated LayoutWidth/Height/Size modifiers. (<a href="https://android-review.googlesource.com/#/q/Ib0bc1a7d59645ce2f4f8cea071535d89aeb80018">Ib0bc1</a>)</p></li> <li><p>Added default parameter values for the offset modifier. (<a href="https://android-review.googlesource.com/#/q/I37f06c0dc49f89601e6688c5fa0eadaf8ff3d822">I37f06</a>)</p></li> <li><p>Added symmetric padding modifier. (<a href="https://android-review.googlesource.com/#/q/I39840a44ea3ff9cbf17dc1c073b1d142d59b02ec">I39840</a>)</p></li> <li><p>Removed deprecated LayoutAspectRatio modifier. (<a href="https://android-review.googlesource.com/#/q/I65a74e1b962cfe5de21ca2b8adbbb610ddac456f">I65a74</a>)</p></li> <li><p>Removed deprecated LayoutAlign modifiers. (<a href="https://android-review.googlesource.com/#/q/I108771c0374a5c6f88a610549ddae220eab30a4f">I10877</a>)</p></li> <li><p>Fixed a bug in the width and height modifiers that was causing the wrapped layout to be measured with no opposite axis constraints. (<a href="https://android-review.googlesource.com/#/q/I210b84ad765c3ab33e593f027245ab135dd036f4">I210b8</a>, <a href="https://issuetracker.google.com/issues/154797971">b/154797971</a>)</p></li> <li><p>Added verticalGravity and horizontalGravity parameters to Row and Column, respectively. (<a href="https://android-review.googlesource.com/#/q/I7dc5a4e757370075657be68e6eda68e7498228fa">I7dc5a</a>)</p></li> <li><p>Updated wrapContentWidth and wrapContentHeight to expect vertical or horizontal Alignment rather than any Alignment. The gravity modifier was updated to accept vertical or horizontal Alignment. Row, Column and Stack were updated to support custom continuous Alignments. (<a href="https://android-review.googlesource.com/#/q/Ib07281752fa9806a13e61823e00accb26f99c1f6">Ib0728</a>)</p></li> <li><p>Made Alignment instantiable with arbitrary values. Added 1D Alignments. (<a href="https://android-review.googlesource.com/#/q/Ia0c05cfa122108b48ac22de310ee98e0460f7f3f">Ia0c05</a>)</p></li> <li><p>Renamed EdgeInsets to InnerPadding. Renamed innerPadding parameter of Material Buttons to paddding. (<a href="https://android-review.googlesource.com/#/q/I66165851232da7635a34b6bb3af7ef8dc38e3e3d">I66165</a>)</p></li> <li><p>alignToSiblings now accepts a Measured instead of Placeable. (<a href="https://android-review.googlesource.com/#/q/I5788dd1dab4d18c475e51a1e9a0440aba2bbc794">I5788d</a>)</p></li> <li><p>Added modifiers for sizing to intrinsic measurements and deprecated the components serving this purpose. (<a href="https://android-review.googlesource.com/#/q/I8295d57e17ba8ca83ea170713fc57ea7baea52fb">I8295d</a>)</p></li> <li><p>Added support for customizing dimensions of children of ConstraintLayout (<a href="https://android-review.googlesource.com/#/q/Idb1a50e90b4c1199ee693b9261a55458dd6642e1">Idb1a5</a>)</p></li> <li><p>Removed deprecated Wrap and Center composables. (<a href="https://android-review.googlesource.com/#/q/I29e238298bd43cc9c13d3b3a8315992ce02fb60c">I29e23</a>)</p></li> <li><p>Added LayoutModifier2, a new API for defining layout modifiers; deprecated LayoutModifier (<a href="https://android-review.googlesource.com/#/q/If32acbfac08c677b80f9e4d5f624fe15c95ac60d">If32ac</a>)</p></li> <li><p>RowScope and ColumnScope members are now accessible outside Row and Column. (<a href="https://android-review.googlesource.com/#/q/I3a6415334c145f6a3f610d7852c4d2478371e6e6">I3a641</a>)</p></li> <li><p>Container has been deprecated. Use Box instead. (<a href="https://android-review.googlesource.com/#/q/I675ced9614fad98dfb90c0ad37583648766cb089">I675ce</a>, <a href="https://issuetracker.google.com/issues/151407926">b/151407926</a>)</p></li> <li><p>Added the LayoutOffset modifier for offsetting layout position (<a href="https://android-review.googlesource.com/#/q/I0b8a37b9b7d11cf48b7bbe37a95cc262720dadf4">I0b8a3</a>)</p></li> <li><p>Initial support for Rtl in Compose layout (<a href="https://android-review.googlesource.com/#/q/Ia5519f42c6ded656242321a92c8c8069c2f42ab7">Ia5519</a>)</p></li> <li><p>Updated LayoutAlign to not fill the available space anymore (<a href="https://android-review.googlesource.com/#/q/I2b14f4378d92a69c32c3b4f1b8de8a31e15ec400">I2b14f</a>)</p></li> <li><p>Removed AspectRatio composable in favor of modifier. Deleted obsolete FlexColumn, FlexRow composables and Spacing modifier (<a href="https://android-review.googlesource.com/#/q/Iec8a7b87c9130310a9d80ab82cd166738c99a3df">Iec8a7</a>)</p></li> <li><p>Removed the LayoutInflexible modifier for Row and Column (<a href="https://android-review.googlesource.com/#/q/I0d820be3157459fdabd9550a57ee7407b3c3ae69">I0d820</a>)</p></li> <li><p>Implement Drag Selection Handles to change selection for TextField. (<a href="https://android-review.googlesource.com/#/q/I27032ee670131726d579612591dafcf3d60680b6">I27032</a>)</p></li> <li><p>Implements LongPressAndDrag for TextField Selection. (<a href="https://android-review.googlesource.com/#/q/I17919b9c1514c8fa7d2b54062e4acc47e7685c8e">I17919</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>FocusModifier is deprecated in favor of Modifier.focus, Modifier.focusRequester, Modifier.focusObserver. FocusState and FocusDetailedState are deprecated in favor of FocusState2 (<a href="https://android-review.googlesource.com/#/q/I469196b76ebe08130fa4df9ed297f111abddd8b1">I46919</a>, <a href="https://issuetracker.google.com/issues/160822875">b/160822875</a>, <a href="https://issuetracker.google.com/issues/160922136">b/160922136</a>)</li> <li><code translate="no" dir="ltr">runOnIdleCompose</code> renamed to <code translate="no" dir="ltr">runOnIdle</code> (<a href="https://android-review.googlesource.com/#/q/I836071f1c3c63d21417a531f336f8a93ca13f9ed">I83607</a>)</li> <li>Several testing APIs were renamed to be more intuitive. All findXYZ APIs were renamed to onNodeXYZ. All doXYZ APIs were renamed to performXYZ. (<a href="https://android-review.googlesource.com/#/q/I7f164b42b04196f023c4a2153d66825487998de4">I7f164</a>)</li> <li>Removes previously deprecated Modifier.ripple. Clickable now uses ripple as the default indication (if you have a MaterialTheme {} set in your application) so in most cases you can just use clickable and get ripple indication for free. If you need to customize the color / size / bounded parameter for the ripple, you can manually create a RippleIndication and pass it to clickable as the indication parameter. (<a href="https://android-review.googlesource.com/#/q/I663b2fcbdc3079343b54dcf713f5d467e39b87a5">I663b2</a>, <a href="https://issuetracker.google.com/issues/155375067">b/155375067</a>)</li> <li>Removed obsolete size testing APIs. (<a href="https://android-review.googlesource.com/#/q/Iba0a086e8c88cf44684cba56766792614201ba30">Iba0a0</a>)</li> <li>Made LayoutNode experimental API (<a href="https://android-review.googlesource.com/#/q/I4f2e93737020b0993f8ba5671e2a0a87f5de3ce2">I4f2e9</a>)</li> <li>Version 1 of scroll orientation locking is implemented across Compose. (<a href="https://android-review.googlesource.com/#/q/I1ce7ae095c2af931e040411458a47cbc73d29eae">I1ce7a</a>, <a href="https://issuetracker.google.com/issues/150289741">b/150289741</a>)</li> <li>Popups, Dialogs and Menus are now inheriting the contextual MaterialTheme (<a href="https://android-review.googlesource.com/#/q/Ia3665905218b4d12d7a9bd121a69a51569d82694">Ia3665</a>, <a href="https://issuetracker.google.com/issues/156527485">b/156527485</a>)</li> <li>Removed layout direction parameter from the measure block of the Layout() function. Layout direction is however available inside the callback through the measure scope object (<a href="https://android-review.googlesource.com/#/q/Ic7d9d797938e6e2a91916836e5e9688794115c22">Ic7d9d</a>)</li> <li>Add AbsoluteArrangement - allows for arrangement of the children inside the Row without automatic mirroring in RTL (<a href="https://android-review.googlesource.com/#/q/I3a1df99368838ce603137c77974763704c33ca57">I3a1df</a>)</li> <li>@Untracked annotation has been deprecated. Replace with @ComposableContract(tracked=false) (<a href="https://android-review.googlesource.com/#/q/Id211e1c7c168c5171bbf3c844792890ee87d4fc2">Id211e</a>)</li> <li>Prior to this change, the compose compiler plugin would non-trivially intercept calls to constructors inside of a @Composable function if there was an (<a href="https://android-review.googlesource.com/#/q/I5205af707238a70d600c105843cd99e88a5381e0">I5205a</a>, <a href="https://issuetracker.google.com/issues/158123804">b/158123804</a>)</li> <li>Add <code translate="no" dir="ltr">viewModel()</code> composable which allows to create or get already created ViewModel similarly to how it works in Activity or Fragment (<a href="https://android-review.googlesource.com/#/q/I5fdd19bccbb57252e928b0f65097678022f860ef">I5fdd1</a>)</li> <li><p>Refactored Radius class to be an inline class. Removed companion creation methods in favor of function constructor with default parameter to have the radius along the y-axis match that of the mandatory x-axis radius parameter.</p> <p>Updated DrawScope.drawRoundRect to consume a single Radius parameter instead of 2 separate float values for the radius along the x and y axis (<a href="https://android-review.googlesource.com/#/q/I46d1b6c89a0f738304c915ce7ee52b621e10302f">I46d1b</a>)</p></li> <li><p>Replaced usage of Px class in various compose classes as part of the large refactoring effort to only rely on Dp and primitive types for pixel parameters. Deleted Px class in its entirety (<a href="https://android-review.googlesource.com/#/q/I3ff339371abd6fb622172d060a70d12dda4822e0">I3ff33</a>)</p></li> <li><p>Replaced usage of Px class in various compose classes as part of the large refactoring effort to only rely on Dp and primitive types for pixel parameters (<a href="https://android-review.googlesource.com/#/q/I086f4744d1eb51f0f31356e36991c2a8d4433059">I086f4</a>)</p></li> <li><p>Replaced usage of Px class in various compose classes as part of the large refactoring effort to only rely on Dp and primitive types for pixel parameters (<a href="https://android-review.googlesource.com/#/q/Id343458210b56a9a4cdae4ef3d0f97ea79004942">Id3434</a>)</p></li> <li><p>Replaced usage of Px class in various compose classes as part of the large refactoring effort to only rely on Dp and primitive types for pixel parameters (<a href="https://android-review.googlesource.com/#/q/I97a5af412d913a53e5ff575bbf685f007d25c0d6">I97a5a</a>)</p></li> <li><p>TextField's cursor has a blinking animation (<a href="https://android-review.googlesource.com/#/q/Id10a71f42f66fae532cca35ec132bcc35a4bc660">Id10a7</a>)</p></li> <li><p>Partial gestures no longer require passing around of a GestureToken (<a href="https://android-review.googlesource.com/#/q/Id7ae5d8c63606f85fe7264f6d23240a75cd6a017">Id7ae5</a>)</p></li> <li><p>Replaced usage of Px class in various compose classes as part of the large refactoring effort to only rely on Dp and primitive types for pixel parameters (<a href="https://android-review.googlesource.com/#/q/I57bff9fbed3da9c71e8f5b24bbe75296d7275769">I57bff</a>)</p></li> <li><p>Modifier.semantics has been undeprecated to allow usages for high level components. (<a href="https://android-review.googlesource.com/#/q/I4cfdc837d5ac2d240af5a5ac6b755aebf800af15">I4cfdc</a>)</p></li> <li><p>Rename AnnotatedString.Builder.addAnnotationString to addStringAnnotation. (<a href="https://android-review.googlesource.com/#/q/I5059e6b6526a8fb64ab6ace7ad7e4637c718a19f">I5059e</a>)</p></li> <li><p>Updated Alignment API and added support for absolute alignment (which does not auto-mirror in Rtl context) (<a href="https://android-review.googlesource.com/#/q/I38cd32c487c9dd72486476943c28afbed96aaf4e">I38cd3</a>)</p></li> <li><p>Layout and LayoutModifier children can be measured with a different layout direction. (<a href="https://android-review.googlesource.com/#/q/Ibd7319b7caa93b2bc7fb38df3678e2bb8298652e">Ibd731</a>)</p></li> <li><p>Introduce additional optional rect parameter to ImagePainter to support drawing a subsection of underlying ImageAsset (<a href="https://android-review.googlesource.com/#/q/I0ea9ec2f991b30b0e68fa702ebdf44cbb0848901">I0ea9e</a>)</p></li> <li><p>Fixed a crash in AdapterList when removing items (<a href="https://android-review.googlesource.com/#/q/Ic64b0221db177462d76c355363c2843734f43007">Ic64b0</a>, <a href="https://issuetracker.google.com/issues/153195921">b/153195921</a>)</p></li> <li><p>We changed how we measure the first layout you put inside activity.setContent { } block. Previously it was forced to fill the whole activity screen, and now it behaves as if you put your layout inside a Stack: it can be smaller than a screen and will be positioned in the top left screen. If you want the old behaviour you can apply Modifier.fillMaxSize() for your layout. (<a href="https://android-review.googlesource.com/#/q/Ie88a713401b8d1db32acf421f2612121bd1d23f6">Ie88a7</a>, <a href="https://issuetracker.google.com/issues/153453714">b/153453714</a>)</p></li> <li><p>ui-text-compose module is renamed as ui-text. ui-text now contains CoreText and CoreTextField composables (<a href="https://android-review.googlesource.com/#/q/Ib7d4743369dbffbac262251b25d3c4351387fb36">Ib7d47</a>)</p></li> <li><p>ui-text module is renamed as ui-text-core (<a href="https://android-review.googlesource.com/#/q/I57dec72ca50e7288e37c9272ef6ce8bcc485a83e">I57dec</a>)</p></li> <li><p>Moved ui-framework/CoreText, CoreTextField composables under ui-text-compose. You might want to include ui-text-compose in your project. (<a href="https://android-review.googlesource.com/#/q/I32042a9c701b1ea3ec4f92c02811c248af6ddb84">I32042</a>)</p></li> <li><p><code translate="no" dir="ltr">runOnIdleCompose</code> and <code translate="no" dir="ltr">runOnUiThread</code> are now global functions instead of methods on ComposeTestRule. (<a href="https://android-review.googlesource.com/#/q/Icbe8fd71d52144e855ccb4ce06a4677337be731a">Icbe8f</a>)</p></li> <li><p>[Mutable]State property delegate operators moved to extensions to support Kotlin 1.4 property delegate optimizations. Callers must add imports to continue using <code translate="no" dir="ltr">by state { ... }</code> or <code translate="no" dir="ltr">by mutableStateOf(...)</code>. (<a href="https://android-review.googlesource.com/#/q/I5312cf7bdfa072cadc1be2de5d5f45ec53200f41">I5312c</a>)</p></li> <li><p>DrawLayerModifier and drawLayer() now default clipToBounds and clipToOutline to false. (<a href="https://android-review.googlesource.com/#/q/I0eb8b08323e0031cae87194d407351e6bdf5e189">I0eb8b</a>, <a href="https://issuetracker.google.com/issues/152810850">b/152810850</a>)</p></li> <li><p>Renamed LayoutResult to MeasureResult. (<a href="https://android-review.googlesource.com/#/q/Id8c686b5f08d58e8e48d015ed42570e306687882">Id8c68</a>)</p></li> <li><p>Deprecated Center composable. It should be replaced either with the LayoutSize.Fill + LayoutAlign.Center modifier, or with one of the Box or Stack composables with suitable modifiers applied (<a href="https://android-review.googlesource.com/#/q/Idf5e0d25a2a8764489d738f6fcf242eeb667e124">Idf5e0</a>)</p></li> <li><p>Renamed LayoutFlexible to LayoutWeight. Renamed tight parameter to fill. (<a href="https://android-review.googlesource.com/#/q/If4738c70c381e149ded400d657b5efd888ae5891">If4738</a>)</p></li> <li><p>DrawVector has been changed from a regular composable function to returning a Modifier drawVector() that will draw the vector as a background to a layout. (<a href="https://android-review.googlesource.com/#/q/I7b8e04d9eae7619211748b92658b31bc09e9b2a0">I7b8e0</a>)</p></li> <li><p>Replace composable function Clip with modifier drawClip(). DrawClipToBounds is a convenient modifier to use when you only need to clip to the layer bounds with a rectangle shape. (<a href="https://android-review.googlesource.com/#/q/If28eb34fe98927dcb8d87f8961657cb8317371ae">If28eb</a>)</p></li> <li><p>Replaced DrawShadow composable function with drawShadow() modifier. Shadows are now drawn as part of LayerModifier. (<a href="https://android-review.googlesource.com/#/q/I0317ac63ddafcf16bd2e24662d489aacb4bb6a7e">I0317a</a>)</p></li> <li><p>androidx.compose.ViewComposer has been moved to androidx.ui.node.UiComposer androidx.compose.Emittable has been removed. It was redundant with ComponentNode. androidx.compose.ViewAdapters has been removed. They are no longer a supported use case. Compose.composeInto has been deprecated. Use <code translate="no" dir="ltr">setContent</code> or <code translate="no" dir="ltr">setViewContent</code> instead. Compose.disposeComposition has been deprecated. Use the <code translate="no" dir="ltr">dispose</code> method on the <code translate="no" dir="ltr">Composition</code> returned by <code translate="no" dir="ltr">setContent</code> instead. androidx.compose.Compose.subcomposeInto has moved to androidx.ui.core.subcomposeInto ComponentNode#emitInsertAt has been renamed to ComponentNode#insertAt ComponentNode#emitRemoveAt has been renamed to ComponentNode#removeAt ComponentNode#emitMode has been renamed to ComponentNode#move (<a href="https://android-review.googlesource.com/#/q/Idef00fba3a2e67d7034e31d580d69192e9018b5f">Idef00</a>)</p></li> <li><p>Deprecated Wrap composable. It can be replaced either with the LayoutAlign modifier or with the Stack composable (<a href="https://android-review.googlesource.com/#/q/Ib237f0f8f8cedd87c35683e5cc1b69abfd13d111">Ib237f</a>)</p></li> <li><p>Made the layout direction be propagated from parent layout node to children. Added layout direction modifier. (<a href="https://android-review.googlesource.com/#/q/I3d9559ddec464850d22466793975b41757e0224e">I3d955</a>)</p></li> <li><p>Rename Painter.toModifier to Painter.asModifier as the newly created Modifier has a reference to the original Painter that can be shared across multiple Modifier instances (<a href="https://android-review.googlesource.com/#/q/I7195b03410cc351a2f62d89e7c01653221594571">I7195b</a>)</p></li> <li><aside class="deprecated"><strong>Deprecated:</strong><span> Draw composable is a common source of bugs as it's (<a href="https://android-review.googlesource.com/#/q/I78392f01c2d37c2419812478d96417a1b8a1293d">I78392</a>, <a href="https://issuetracker.google.com/issues/149827027">b/149827027</a>)</span></aside></li> <li><p>Support right-to-left direction in LayoutPadding modifier (<a href="https://android-review.googlesource.com/#/q/I9e8da0bfbb135ff7f34b0dc49b905f634ad7d18c">I9e8da</a>)</p></li> <li><p>Density and DensityScope were merged into one interface. Instead of ambientDensity() you can now use DensityAmbient.current. Instead of withDensity(density) just with(density) (<a href="https://android-review.googlesource.com/#/q/I11cb1f069a95f32f4ecab631f49d38dc1c071a42">I11cb1</a>)</p></li> <li><p>Removed ValueHolder class. Restructured AnimatedValue, AnimatedFloat classes to make the animation value field abstract so that subclasses can watch the value update.</p> <ul> <li>Added model classes for AnimatedValue, AnimatedFloat, etc.</li> <li>Added a new set of light-weight @Composable API for animating between values.</li> <li>(<a href="https://android-review.googlesource.com/#/q/I79530e117cfa893a52542f85a55528eaa0f11b93">I79530</a>)</li> </ul></li> <li><p>Breaking changes to the ambients API. See log and <code translate="no" dir="ltr">Ambient<T></code> documentation for details (<a href="https://android-review.googlesource.com/#/q/I4c7eea45f2b7bf41f8a8ba75fd667c06010469a9">I4c7ee</a>, <a href="https://issuetracker.google.com/issues/143769776">b/143769776</a>)</p></li> <li><p>Alignment line Int positions returned from Placeable#get(AlignmentLine) are now non-null. If the queried alignment line is missing, AlignmentLine.Unspecified will be returned. (<a href="https://android-review.googlesource.com/#/q/I896c5ef8a18919aa84413669341e716bf676e32e">I896c5</a>, <a href="https://issuetracker.google.com/issues/158134875">b/158134875</a>)</p></li> <li><p>Fixed a ConstraintLayout bug causing a crash on recompositions. (<a href="https://android-review.googlesource.com/#/q/Ibee5afd640816add9bd0c1545eee2ef747e9c2d2">Ibee5a</a>, <a href="https://issuetracker.google.com/issues/158164341">b/158164341</a>)</p></li> <li><p>WithConstraints trailing lambda API has been changed. Now instead of two params it has a receiver scope which in addition to constraints and layoutDirection provides minWidth, maxWidth, minHeight and maxHeight properties in Dp (<a href="https://android-review.googlesource.com/#/q/I91b9af740cd2613ddd4fe6d63cd539a46b52fc52">I91b9a</a>, <a href="https://issuetracker.google.com/issues/149979702">b/149979702</a>)</p></li> <li><p>Renamed LayoutModifier2 to LayoutModifier. (<a href="https://android-review.googlesource.com/#/q/Id29f36d6b19674d189abb198a7656562b3b310b5">Id29f3</a>)</p></li> <li><p>Intrinsic measurements functions in Layout and LayoutModifier2 have an IntrinsicMeasureScope receiver now which provides intrinsics query API with implicitly propagated layout direction. (<a href="https://android-review.googlesource.com/#/q/Id9945cb41842df9f99132679b5b68a0f0edda53d">Id9945</a>)</p></li> <li><p>LayoutDirectionAmbient is deprecated. To read the layout direction defined by the locale, use localeLayoutDirection on ConfigurationAmbient (<a href="https://android-review.googlesource.com/#/q/I851b137413c620a10bef4ef0a83d5c47d7a9fa6c">I851b1</a>)</p></li> <li><p>Added positionInParent and boundsInParent for LayoutCoordinates. (<a href="https://android-review.googlesource.com/#/q/Icacdd0909bc434cd5fd935c46e0a07b965c6a38d">Icacdd</a>, <a href="https://issuetracker.google.com/issues/152735784">b/152735784</a>)</p></li> <li><p>ParentData composable is deprecated. You should either create a modifier which implements ParentDataModifier interface, or use LayoutTag modifier if you simply need to tag layout children to recognize them inside the measure block. (<a href="https://android-review.googlesource.com/#/q/I51368a2cb132318f5466949297e5fa247c04d68a">I51368</a>, <a href="https://issuetracker.google.com/issues/150953183">b/150953183</a>)</p></li> <li><p>Add OnPositionedModifier and OnChildPositionedModifier to replace OnPositioned and OnChildPositioned composable functions. (<a href="https://android-review.googlesource.com/#/q/I2ec8fb4687b0b85e18174178562149745c03c7fd">I2ec8f</a>)</p></li> <li><p>Disallow negative padding in LayoutPadding. LayoutOffset should be used instead for negative position offsets. (<a href="https://android-review.googlesource.com/#/q/Ifb5b19b62ad11d5f2c0efd993acc19de39a65635">Ifb5b1</a>)</p></li> <li><p>WithConstraints got LayoutDirection parameter (<a href="https://android-review.googlesource.com/#/q/I6d6f7d5fd9a4a0428e3ee188a9a3790e1cdaf083">I6d6f7</a>)</p></li> <li><p>Updated the <code translate="no" dir="ltr">ComposeFlags.COMPOSER_PARAM</code> flag to be <code translate="no" dir="ltr">true</code>, which will change the code generation strategy for the compose plugin. At a high level, this causes @Composable functions to be generated with an additional synthetic parameter, which is passed through to subsequent @Composable calls in order for the runtime to properly manage execution. This is a significant binary breaking change, however, should preserve source-level compatibility in all sanctioned usage of compose. (<a href="https://android-review.googlesource.com/#/q/I7971ca1b6525440c38643953645fa388131e31f0">I7971c</a>)</p></li> <li><p>Changed LayoutCoordinates to make providedAlignmentLines a Set instead of a Map and have LayoutCoordinates implement the get() operator instead for retrieving a value. This makes it easier for modifiers to modify one or more value of the set without creating a new collection for each modifier. (<a href="https://android-review.googlesource.com/#/q/I0245a750ed12e822d61fa7d87c52bd708996f55d">I0245a</a>)</p></li> <li><p>LayoutCoordinates no longer has a position property. The position property does not make sense when considering LayoutModifiers, rotation, or scaling. Instead, developers should use parentCoordinates and childToLocal() to calculate the transform from one LayoutCoordinate to another.</p> <p>LayoutCoordinates uses IntPxSize for the size property instead of PxSize. Layouts use integer pixel sizes for layouts, so all layout sizes should use integers and not floating point values. (<a href="https://android-review.googlesource.com/#/q/I9367be21c2c202c8b6ad889b50a29454773f41af">I9367b</a>)</p></li> <li><p>Improvements to the API surface of Constraints (<a href="https://android-review.googlesource.com/#/q/I0fd1505ae9a68c067a82eff6ab02b43080fe153c">I0fd15</a>)</p></li> <li><p>Added TextDirection.Content (<a href="https://android-review.googlesource.com/#/q/I48f3683066739b4d88b2e998f9b216a5cd874f8d">I48f36</a>)</p></li> <li><p>Ajdust the Toolbar Menu to show copy, cut, paste properly. (<a href="https://android-review.googlesource.com/#/q/Id3955ab3845cc6ad1807b95bc39e73facf0fd358">Id3955</a>)</p></li> <li><p>Add FloatingToolbar for TextField Selection. (<a href="https://android-review.googlesource.com/#/q/Ie8b07e4405940f9d4b4147c34406c80a557b4d45">Ie8b07</a>)</p></li> <li><p>TextDirectionAlgorithm is renamed as TextDirection (<a href="https://android-review.googlesource.com/#/q/I75ce894540855ae60201b05141ad40c400bda00a">I75ce8</a>)</p></li> <li><p>TextDirection is renamed as ResolvedTextDirection (<a href="https://android-review.googlesource.com/#/q/I3ff38ad5993a0b844dced711e38c729d2b0c8697">I3ff38</a>)</p></li> <li><p>Add HapticFeedback to TextField Selection. (<a href="https://android-review.googlesource.com/#/q/I58050bcae9699346c2ee7727c7b0f9efaee0e9cd">I58050</a>)</p></li> <li><p>Add Copy, Cut, and Paste methods to TextField Selection. (<a href="https://android-review.googlesource.com/#/q/Idb70bb33b718d5ba725630e3b90abd156d8160af">Idb70b</a>)</p></li> <li><p>TestTag and Semantics have been deleted. Use Modifier.testTag and Modifier.semantics instead (<a href="https://android-review.googlesource.com/#/q/I15ff0bece5791ff8adae20c3c1bcaf48cea7f1b0">I15ff0</a>, <a href="https://issuetracker.google.com/issues/158841414">b/158841414</a>)</p></li> <li><p>Changed the package name for Locale and LocaleList from androidx.ui.text to androidx.ui.intl (<a href="https://android-review.googlesource.com/#/q/I8132c50e8be9b7ac27e858573056abe9250426ca">I8132c</a>)</p></li> <li><p>API change: <code translate="no" dir="ltr">AnnotatedString(builder: Builder)</code> is renamed to <code translate="no" dir="ltr">annotatedString(builder: Builder)</code>. (<a href="https://android-review.googlesource.com/#/q/Ia63777788348827d4362e0bd6a4ab6cd64680062">Ia6377</a>)</p></li> <li><p>API change: <code translate="no" dir="ltr">AnnotatedString.Item</code> is renamed to <code translate="no" dir="ltr">AnnotatedString.Range</code>. (<a href="https://android-review.googlesource.com/#/q/I2d44dd9e4f565d5f90eeba93dc61a052109da32e">I2d44d</a>)</p></li> <li><p>Add Toolbar for text related operations. (<a href="https://android-review.googlesource.com/#/q/I49d533345151058eac9026d1456196331ed0bf45">I49d53</a>)</p></li> <li><p>New LifecycleOwnerAmbient is now available. Now an Activity you are using with Compose UI should extend androidx.activity.ComponentActivity (or AppCompatActivity). setContent on android.app.Activity is now deprecated (<a href="https://android-review.googlesource.com/#/q/Idb25a736332b17aebbfb96e919b932c2cc284d56">Idb25a</a>, <a href="https://issuetracker.google.com/issues/153141084">b/153141084</a>)</p></li> <li><p>ui-android-text package name (androidx.text) replaced with androidx.ui.text.platform in order to align with androidx policy. (<a href="https://android-review.googlesource.com/#/q/I42711800349ba35a5d1e45747a441f150e0a15fd">I42711</a>)</p></li> </ul> <devsite-hats-survey class="nocontent" hats-id="VxqvKSur40kxBYCLVTd0SSGykbno" listnr-id="5207477"></devsite-hats-survey> </div> <devsite-recommendations display="in-page" hidden yield> </devsite-recommendations> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-recommendations id="recommendations-link" yield></devsite-recommendations> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Content and code samples on this page are subject to the licenses described in the <a href="/license">Content License</a>. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.</p> <p>Last updated 2024-11-13 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-11-13 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> <nav class="devsite-footer-promos nocontent" aria-label="Promotions"> <ul class="devsite-footer-promos-list"> <li class="devsite-footer-promo"> <a href="//x.com/AndroidDev" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer X Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-x_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="X"> <img class="devsite-footer-promo-icon" src="/_static/android/images/logo-x.svg" loading="lazy" alt="X"> </picture> <span class="devsite-footer-promo-label"> X </span> </a> <div class="devsite-footer-promo-description">Follow @AndroidDev on X</div> </li> <li class="devsite-footer-promo"> <a href="//www.youtube.com/user/androiddevelopers" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer YouTube Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-youtube_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="YouTube"> <img class="devsite-footer-promo-icon" src="//www.gstatic.com/images/icons/material/product/2x/youtube_48dp.png" loading="lazy" alt="YouTube"> </picture> <span class="devsite-footer-promo-label"> YouTube </span> </a> <div class="devsite-footer-promo-description">Check out Android Developers on YouTube</div> </li> <li class="devsite-footer-promo"> <a href="//www.linkedin.com/showcase/androiddev" class="devsite-footer-promo-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer LinkedIn Promo" > <picture> <source class="devsite-dark-theme" srcset="https://developer.android.com/_static/android/images/logo-linkedin_dt.svg" media="(prefers-color-scheme: dark)" loading="lazy" alt="LinkedIn"> <img class="devsite-footer-promo-icon" src="/_static/android/images/logo-linkedin.svg" loading="lazy" alt="LinkedIn"> </picture> <span class="devsite-footer-promo-label"> LinkedIn </span> </a> <div class="devsite-footer-promo-description">Connect with the Android Developers community on LinkedIn</div> </li> </ul> </nav> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">More Android</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com/enterprise/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Android for Enterprise </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//www.android.com/security-center/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Security </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//source.android.com" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Source </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/news" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > News </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//android-developers.googleblog.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > Blog </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/podcasts" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" > Podcasts </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Discover</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/games" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Gaming </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/ml" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Machine Learning </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/health-and-fitness" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Health & Fitness </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/media" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Camera & Media </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/privacy" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Privacy </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/training/connectivity/5g" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > 5G </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Android Devices</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/large-screens" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Large screens </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/wear" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Wear OS </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/chrome-os" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > ChromeOS devices </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/cars" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Android for cars </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/tv" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android TV </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Releases</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/15" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android 15 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/14" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Android 14 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/13" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Android 13 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/12" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Android 12 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/11" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android 11 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/10" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 6)" > Android 10 </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/about/versions/pie" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 7)" > Pie </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Documentation and Downloads</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/studio/intro" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Android Studio guide </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/guide" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Developers guides </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/reference" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > API reference </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/studio" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Download Studio </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/ndk" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Android NDK </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Support</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//issuetracker.google.com/issues/new?component=190923&template=841312" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Report platform bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//issuetracker.google.com/issues/new?component=192697" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Report documentation bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//support.google.com/googleplay/android-developer" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Google Play support </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://g.co/userresearch/androiddeveloperfooter" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Join research studies </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-sites" aria-label="Other Google Developers websites"> <a href="https://developers.google.com/" class="devsite-footer-sites-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Developers Link"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-google-for-developers-dark-theme.svg" media="(prefers-color-scheme: none)" class="devsite-dark-theme" loading="lazy" alt="Google Developers"> <img class="devsite-footer-sites-logo" src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup-google-for-developers.svg" loading="lazy" alt="Google Developers"> </picture> </a> <ul class="devsite-footer-sites-list"> <li class="devsite-footer-sites-item"> <a href="//developer.android.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Android Link" > Android </a> </li> <li class="devsite-footer-sites-item"> <a href="//developer.chrome.com/home" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Chrome Link" > Chrome </a> </li> <li class="devsite-footer-sites-item"> <a href="//firebase.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Firebase Link" > Firebase </a> </li> <li class="devsite-footer-sites-item"> <a href="//cloud.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Cloud Platform Link" > Google Cloud Platform </a> </li> <li class="devsite-footer-sites-item"> <a href="//developers.google.com/products/" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer All products Link" > All products </a> </li> </ul> </nav> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/license" data-category="Site-Wide Custom Events" data-label="Footer License link" > License </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/distribute/marketing-tools/brand-guidelines" data-category="Site-Wide Custom Events" data-label="Footer Brand guidelines link" > Brand guidelines </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> <li class="devsite-footer-utility-item devsite-footer-utility-button"> <span class="devsite-footer-utility-description">Get news and tips by email</span> <a class="devsite-footer-utility-link gc-analytics-event" href="/updates" data-category="Site-Wide Custom Events" data-label="Footer Subscribe link" > Subscribe </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[]</script> <script type="application/json" tag-management>{"at": "True", "ga4": [{"id": "G-QFRN08RN6E", "purpose": 0}], "ga4p": [{"id": "G-QFRN08RN6E", "purpose": 0}], "gtm": [{"id": "GTM-KMSWPCJ", "purpose": 0}], "parameters": {"internalUser": "False", "language": {"machineTranslated": "False", "requested": "en", "served": "en"}, "pageType": "article", "projectName": "Jetpack", "signedIn": "False", "tenant": "android", "recommendations": {"sourcePage": "", "sourceType": 0, "sourceRank": 0, "sourceIdenticalDescriptions": 0, "sourceTitleWords": 0, "sourceDescriptionWords": 0, "experiment": ""}, "experiment": {"ids": ""}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <android-fully-clickable target=" .android-case-study .devsite-landing-row-item, .android-grouped-resources .devsite-landing-row-item, .android-grouped-resources-primary .devsite-landing-row-item, .android-grouped-resources-secondary .devsite-landing-row-item, .android-guide-cards .devsite-landing-row-item, .android-illustrated-resources-index .devsite-landing-row-item, .android-illustrated-resources-primary .devsite-landing-row-item, .android-illustrated-resources-secondary .devsite-landing-row-item, .android-illustrated-resources-secondary-small .devsite-landing-row-item, .android-illustrated-resources-tertiary .devsite-landing-row-item, .android-illustrated-resources-tertiary-small .devsite-landing-row-item, .android-promo .devsite-landing-row-item, .android-quick-link, .android-samples .devsite-card-wrapper, .fully-clickable" watch=".android-samples, devsite-content"></android-fully-clickable> <script nonce="V1KmLBm//zJVZq2VBHJNabLxk6kTSG"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/js/app_loader.js', '[3,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android","https://android-dot-devsite-v2-prod.appspot.com",null,null,["/_pwa/android/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/favicon.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/android/images/lockup.svg","https://fonts.googleapis.com/css?family=Google+Sans:400,500,600,700|Google+Sans+Text:400,400italic,500,500italic,600,600italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","developer.android.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["CloudShell__cloud_code_overflow_menu","Cloud__enable_cloud_facet_chat","Search__enable_ai_eligibility_checks","MiscFeatureFlags__emergency_css","Profiles__enable_recognition_badges","Profiles__enable_public_developer_profiles","Cloud__enable_llm_concierge_chat","Search__enable_ai_search_summaries","Cloud__enable_free_trial_server_call","CloudShell__cloud_shell_button","TpcFeatures__enable_required_headers","Profiles__enable_page_saving","Concierge__enable_pushui","Profiles__enable_release_notes_notifications","MiscFeatureFlags__enable_project_variables","Cloud__enable_cloud_shell","Profiles__require_profile_eligibility_for_signin","MiscFeatureFlags__enable_firebase_utm","Significatio__enable_by_tenant","MiscFeatureFlags__enable_dark_theme","Cloud__enable_cloudx_experiment_ids","Cloud__enable_legacy_calculator_redirect","MiscFeatureFlags__developers_footer_image","Experiments__reqs_query_experiments","Profiles__enable_awarding_url","DevPro__enable_developer_subscriptions","Cloud__enable_cloudx_ping","Profiles__enable_profile_collections","Cloud__enable_cloud_shell_fte_user_flow","Profiles__enable_complete_playlist_endpoint","Profiles__enable_developer_profiles_callout","EngEduTelemetry__enable_engedu_telemetry","Search__enable_dynamic_content_confidential_banner","Search__enable_suggestions_from_borg","Analytics__enable_clearcut_logging","MiscFeatureFlags__developers_footer_dark_image","BookNav__enable_tenant_cache_key","Profiles__enable_completecodelab_endpoint","MiscFeatureFlags__enable_view_transitions","Search__enable_page_map","MiscFeatureFlags__enable_variable_operator","Cloud__enable_cloud_dlp_service","DevPro__enable_cloud_innovators_plus","Profiles__enable_dashboard_curated_recommendations","MiscFeatureFlags__enable_explain_this_code","TpcFeatures__enable_mirror_tenant_redirects"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.googleapis.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.googleapis.com",2,4,null,"https://developerprofiles-pa.googleapis.com",[3,"android","Android Developers","developer.android.com",null,"android-dot-devsite-v2-prod.appspot.com",null,null,[null,1,null,null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],[1,null,null,[1,20],"/recommendations"],null,null,null,[1,null,1],[1,1,null,1,1]],null,[18,null,null,null,null,null,"/images/lockup.svg","/images/touchicon-180.png",null,null,null,null,null,null,null,null,null,null,null,null,null,1,null,null,null,"/images/lockup-dark-theme.svg",[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,1,14,15,20,22,23,28,29,37,43],null,[[null,null,1],[1,1]],[[null,null,null,null,null,null,null,[["G-QFRN08RN6E"],null,null,[["G-QFRN08RN6E",1]]],null,null,null,null,1],null,[[2,2],[1,1]]],null,4,null,null,null,null,null,null,null,null,null,null,null,null,null,"android.devsite.google"],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m"]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>