CINXE.COM

Paging  |  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/paging"><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/paging" /><link rel="alternate" hreflang="x-default" href="https://developer.android.com/jetpack/androidx/releases/paging" /><link rel="alternate" hreflang="ar" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=fr" /><link rel="alternate" hreflang="de" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=de" /><link rel="alternate" hreflang="he" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=he" /><link rel="alternate" hreflang="hi" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=hi" /><link rel="alternate" hreflang="id" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=id" /><link rel="alternate" hreflang="it" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=it" /><link rel="alternate" hreflang="ja" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=th" /><link rel="alternate" hreflang="tr" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developer.android.com/jetpack/androidx/releases/paging?hl=vi" /><title>Paging &nbsp;|&nbsp; Jetpack &nbsp;|&nbsp; Android Developers</title> <meta property="og:title" content="Paging &nbsp;|&nbsp; Jetpack &nbsp;|&nbsp; Android Developers"><meta property="og:url" content="https://developer.android.com/jetpack/androidx/releases/paging"><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": "Paging" } </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": "Paging", "item": "https://developer.android.com/jetpack/androidx/releases/paging" }] } </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&#39;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 &amp; plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design &amp; Plan" track-name="design &amp; plan" > Design &amp; Plan </a> <a href="#" role="button" aria-haspopup="true" aria-expanded="false" aria-label="Dropdown menu for Design &amp; Plan" track-type="nav" track-metadata-eventdetail="https://developer.android.com/design" track-metadata-position="nav - design &amp; plan" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design &amp; Plan" track-name="design &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; Plan" track-name="design &amp; plan" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design &amp; Plan" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design &amp; 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 &amp; Plan" track-name="design &amp; plan" > <span class="devsite-nav-text" tooltip menu="Design &amp; Plan"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Design &amp; 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 &amp; Media" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Camera &amp; 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 &amp; messaging" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Social &amp; 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 &amp; Fitness" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Health &amp; 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 &amp; Compose libraries" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Jetpack &amp; 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 &amp; 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="paging" data-text="Paging" tabindex="-1">Paging</h1> <div style="align:right; text-align:right; padding-bottom:21px; margin-top:-45px; border-bottom:1px solid black;"> <a href="https://developer.android.com/topic/libraries/architecture/paging/v3-overview">User Guide</a>&nbsp;&nbsp;<a href="https://github.com/android/architecture-components-samples">Code Sample</a>&nbsp;&nbsp;<a href="https://codelabs.developers.google.com/codelabs/android-paging">Codelab</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/paging/package-summary">androidx.paging</a><br> </div> </div> <div style="text-align:left; padding-left:10px; margin-left:10px; margin-top:15px; margin-bottom:10px;"> The Paging Library makes it easier for you to load data gradually and gracefully within your app&#39;s <a href="/reference/androidx/recyclerview/widget/RecyclerView">RecyclerView</a>. </div> <div style="clear:both"></div> <p> This table lists all the artifacts in the <code translate="no" dir="ltr">androidx.paging</code> group. </p> <table style="width:100%"> <tr> <th style="width:20%">Artifact</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 id="paging.paging-*"> <td>paging-*</td> <td><a href="/jetpack/androidx/releases/paging#paging-*-3.3.4">3.3.4</a></td> <td>-</td> <td>-</td> <td>-</td> <tr id="paging.paging-compose"> <td>paging-compose</td> <td><a href="/jetpack/androidx/releases/paging#paging-compose-3.3.4">3.3.4</a></td> <td>-</td> <td>-</td> <td>-</td> </table> This library was last updated on: November 13, 2024 <h2 id="declaring_dependencies" data-text="Declaring dependencies" tabindex="-1">Declaring dependencies</h2> <p>To add a dependency on Paging, you must add the Google Maven repository to your project. Read <a href="/studio/build/dependencies#google-maven">Google&#39;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> <pre class="prettyprint lang-groovy" translate="no" dir="ltr"> dependencies { def paging_version = "3.3.4" implementation "androidx.paging:paging-runtime:$paging_version" // alternatively - without Android dependencies for tests testImplementation "androidx.paging:paging-common:$paging_version" // optional - RxJava2 support implementation "androidx.paging:paging-rxjava2:$paging_version" // optional - RxJava3 support implementation "androidx.paging:paging-rxjava3:$paging_version" // optional - Guava ListenableFuture support implementation "androidx.paging:paging-guava:$paging_version" // optional - Jetpack Compose integration implementation "androidx.paging:paging-compose:3.3.4" } </pre> </section><section><h3 id="kts" data-text="Kotlin" tabindex="-1">Kotlin</h3> <pre class="prettyprint lang-kotlin" translate="no" dir="ltr"> dependencies { val paging_version = "3.3.4" implementation("androidx.paging:paging-runtime:$paging_version") // alternatively - without Android dependencies for tests testImplementation("androidx.paging:paging-common:$paging_version") // optional - RxJava2 support implementation("androidx.paging:paging-rxjava2:$paging_version") // optional - RxJava3 support implementation("androidx.paging:paging-rxjava3:$paging_version") // optional - Guava ListenableFuture support implementation("androidx.paging:paging-guava:$paging_version") // optional - Jetpack Compose integration implementation("androidx.paging:paging-compose:3.3.4") } </pre> </section></div> </div> <p>For information on using Kotlin extensions, see <a href="/kotlin/ktx">ktx documentation</a>.</p> <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:413106%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=413106&template=1096385" 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_33_2" data-text="Version 3.3" tabindex="-1">Version 3.3</h2> <h3 id="3.3.4" data-text="Version 3.3.4" tabindex="-1">Version 3.3.4</h3> <p>November 13, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.4</code> is released. Version 3.3.4 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/1c46a8d0eefa9cf9c4b07e28ebd88a0d737a0508..ecec376274f1b9abeee169b3ae4f8bb8ad7baf31/paging">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Android unit tests pulling in Paging 3.3 or later will no longer throw an error such as <code translate="no" dir="ltr">Method isLoggable in android.util.Log not mocked</code>. (<a href="https://android-review.googlesource.com/#/q/Ia9400db995e7f0357cae2647cbd2cef9cf6c3398">Ia9400</a>, <a href="https://issuetracker.google.com/issues/331684448">b/331684448</a>)</li> </ul> <h3 id="3.3.2" data-text="Version 3.3.2" tabindex="-1">Version 3.3.2</h3> <p>August 7, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.2</code> is released. Version 3.3.2 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/358f66daa422fdd114efe0c11683c70b47ba1051..1c46a8d0eefa9cf9c4b07e28ebd88a0d737a0508/paging">these commits</a>.</p> <p><strong>New Features</strong></p> <ul> <li><code translate="no" dir="ltr">paging-common</code> and <code translate="no" dir="ltr">paging-testing</code> has added new Kotlin-Multiplatform targets: <code translate="no" dir="ltr">watchos</code>, <code translate="no" dir="ltr">tvos</code>, and <code translate="no" dir="ltr">linuxArm64</code> (<a href="https://android.googlesource.com/platform/frameworks/support/+/90c97683b9811e57c63ddb93d87b6fa21f02bcde">90c9768</a>), (<a href="https://android.googlesource.com/platform/frameworks/support/+/53e0eca80fb98486e38db466d6cb2449c7cecd1f">53e0eca</a>)</li> </ul> <h3 id="3.3.1" data-text="Version 3.3.1" tabindex="-1">Version 3.3.1</h3> <p>July 24, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.1</code> is released. Version 3.3.1 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/656d55d844d23f2561b23f4970d65e4b7f63debc..358f66daa422fdd114efe0c11683c70b47ba1051/paging">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed an issue where <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> or APIs built on top of it like the <code translate="no" dir="ltr">PagingDataAdapter</code> used with <code translate="no" dir="ltr">RecyclerView</code> would be unable to trigger more loads when the backing data source refreshed while scrolling. (<a href="https://android-review.googlesource.com/#/q/I60ca5c23e01c2ff28d120d10ae9b28eda57fac50">I60ca5</a>, <a href="https://issuetracker.google.com/issues/352586078">b/352586078</a>)</li> <li>Fixed a crash that occurs when items are removed from the backing data source while scrolling a <code translate="no" dir="ltr">RecyclerView</code> using a <code translate="no" dir="ltr">PagingDataAdapter</code> or <code translate="no" dir="ltr">AsyncPagingDataDiffer</code>. (<a href="https://android-review.googlesource.com/#/q/I8c65ac87639c0d501ccab1fd44fd3adbc9147a31">I8c65a</a>, <a href="https://issuetracker.google.com/issues/347649763">b/347649763</a>)</li> </ul> <h3 id="3.3.0" data-text="Version 3.3.0" tabindex="-1">Version 3.3.0</h3> <p>May 14, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.0</code> is released. Version 3.3.0 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/c6ffa207f646ff44d4ca47694e4ef62043d2fdd3..656d55d844d23f2561b23f4970d65e4b7f63debc/paging">these commits</a>.</p> <p><strong>Important changes since 3.2.0</strong></p> <ul> <li><code translate="no" dir="ltr">PagingDataPresenter</code> is now a public class. Multiplatform presenters can now be built on top of <code translate="no" dir="ltr">PagingDataPresenter</code> rather than requiring internal Paging APIs or <code translate="no" dir="ltr">paging-runtime</code>’s <code translate="no" dir="ltr">AsyncPagingDataDiffer</code>.</li> <li>Added new <code translate="no" dir="ltr">LoadStates</code> and <code translate="no" dir="ltr">CombinedLoadStates</code> helper methods in <code translate="no" dir="ltr">hasError</code> and <code translate="no" dir="ltr">isIdle</code> to check if <code translate="no" dir="ltr">LoadStates</code> is in Error or <code translate="no" dir="ltr">NotLoading</code> state, respectively. Also added a new <code translate="no" dir="ltr">awaitNotLoading()</code> Kotlin extension method on <code translate="no" dir="ltr">Flow&lt;CombinedLoadStates&gt;</code> that waits until a load has settled into either <code translate="no" dir="ltr">NotLoading</code> or Error state.</li> <li><code translate="no" dir="ltr">PagingData.empty()</code> now dispatches <code translate="no" dir="ltr">NotLoading</code> states by default unless custom <code translate="no" dir="ltr">LoadStates</code> are passed to its constructor. This departs from existing behavior where it doesn&#39;t dispatch <code translate="no" dir="ltr">LoadStates</code> when submitted to a <code translate="no" dir="ltr">PagingDataAdapter</code> or it dispatches Loading states when collected as <code translate="no" dir="ltr">LazyPagingItems</code>. When collected as <code translate="no" dir="ltr">LazyPagingItems</code>, it will now also display an empty list immediately upon initial composition.</li> </ul> <p><strong>Kotlin Multiplatform Compatibility</strong></p> <p>Paging now ships artifacts compatible with Kotlin Multiplatform, thanks in large part to upstreamed work from CashApp&#39;s <a href="https://github.com/cashapp/multiplatform-paging">multiplatform-paging</a> project.</p> <ul> <li><code translate="no" dir="ltr">paging-common</code> has moved all Paging 3 APIs to <code translate="no" dir="ltr">common</code> and is now compatible with jvm and iOS in addition to Android.</li> <li><code translate="no" dir="ltr">paging-testing</code> has moved its code to <code translate="no" dir="ltr">common</code> and is now compatible with jvm and iOS in addition to Android.</li> <li><code translate="no" dir="ltr">paging-compose</code> has moved its code to <code translate="no" dir="ltr">common</code> and ships an Android artifact, matching the multiplatform support of <code translate="no" dir="ltr">androidx.compose</code>.</li> <li><code translate="no" dir="ltr">paging-runtime</code>, <code translate="no" dir="ltr">paging-guava</code>, <code translate="no" dir="ltr">paging-rxjava2</code>, and <code translate="no" dir="ltr">paging-rxjava3</code> will remain Android only.</li> </ul> <h3 id="3.3.0-rc01" data-text="Version 3.3.0-rc01" tabindex="-1">Version 3.3.0-rc01</h3> <p>May 1, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.0-rc01</code> is released with no changes in Paging 3.3.0-beta01. Version 3.3.0-rc01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/02b55f664eba38e42e362e1af3913be1df552d55..c6ffa207f646ff44d4ca47694e4ef62043d2fdd3/paging">these commits</a>.</p> <h3 id="3.3.0-beta01" data-text="Version 3.3.0-beta01" tabindex="-1">Version 3.3.0-beta01</h3> <p>April 3, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.0-beta01</code> is released with no notable changes. Version 3.3.0-beta01 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/8fbefdc70ea49fce9c8f8cfcf80e1fa2122a7ee4..02b55f664eba38e42e362e1af3913be1df552d55/paging">these commits</a>.</p> <h3 id="3.3.0-alpha05" data-text="Version 3.3.0-alpha05" tabindex="-1">Version 3.3.0-alpha05</h3> <p>March 20, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.0-alpha05</code> is released. Version 3.3.0-alpha05 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/638a8d3a474af45f6ad5fdc3d6d1836ea42d1778..8fbefdc70ea49fce9c8f8cfcf80e1fa2122a7ee4/paging">these commits</a>.</p> <p><strong>API Changes</strong></p> <ul> <li>Paging now uses the AndroidX Annotation <code translate="no" dir="ltr">@MainThread</code> annotation for common code. (<a href="https://android-review.googlesource.com/#/q/I78f0d3cf36e3a3a9088e0698c351289cf2dbc1bf">I78f0d</a>, <a href="https://issuetracker.google.com/327682438">b/327682438</a>)</li> </ul> <h3 id="3.3.0-alpha04" data-text="Version 3.3.0-alpha04" tabindex="-1">Version 3.3.0-alpha04</h3> <p>March 6, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.0-alpha04</code> is released. Version 3.3.0-alpha04 contains <a href="https://android.googlesource.com/platform/frameworks/support/+log/ca2a8cf8da3a3502fccc593974f8085653e38261..638a8d3a474af45f6ad5fdc3d6d1836ea42d1778/paging">these commits</a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed minor documentation errors related to the addition of Kotlin multiplatform compatibility. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/2950785">aosp/2950785</a>)</li> </ul> <h3 id="3.3.0-alpha03" data-text="Version 3.3.0-alpha03" tabindex="-1">Version 3.3.0-alpha03</h3> <p>February 7, 2024</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/52fcfb71eda8bee777689ca7b4124283b37e287a..ca2a8cf8da3a3502fccc593974f8085653e38261/paging">Version 3.3.0-alpha03 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><code translate="no" dir="ltr">PagingDataPresenter</code> is now a public class. Multiplatform presenters can now be built on top of <code translate="no" dir="ltr">PagingDataPresenter</code> rather than requiring internal Paging APIs or <code translate="no" dir="ltr">paging-runtime</code>’s <code translate="no" dir="ltr">AsyncPagingDataDiffer</code>. (<a href="https://android-review.googlesource.com/#/q/Id1f748af435e6f5d733bc731ef7e8cd12455845a">Id1f74</a>, <a href="https://issuetracker.google.com/issues/315214786">b/315214786</a>)</li> <li>Added new <code translate="no" dir="ltr">LoadStates</code> and <code translate="no" dir="ltr">CombinedLoadStates</code> helper methods to check if <code translate="no" dir="ltr">LoadStates</code> is in Error or <code translate="no" dir="ltr">NotLoading</code> state. Also added a new API that awaits on a <code translate="no" dir="ltr">LoadStateFlow</code> until a load has settled into either <code translate="no" dir="ltr">NotLoading</code> or Error state. (<a href="https://android-review.googlesource.com/#/q/Id6c67a6ba3805130d1a08840bad38e179604f786">Id6c67</a>)</li> </ul> <p><strong>Behavior change</strong></p> <ul> <li><code translate="no" dir="ltr">PagingData.empty()</code> now dispatches <code translate="no" dir="ltr">NotLoading</code> states by default unless custom <code translate="no" dir="ltr">LoadStates</code> are passed to its constructor. This departs from existing behavior where it doesn&#39;t dispatch <code translate="no" dir="ltr">LoadStates</code> when submitted to a <code translate="no" dir="ltr">PagingDataAdapter</code> or it dispatches Loading states when collected as <code translate="no" dir="ltr">LazyPagingItems</code>. When collected as <code translate="no" dir="ltr">LazyPagingItems</code>, it will now also display an empty list immediately upon initial composition. (<a href="https://android-review.googlesource.com/#/q/I4d11df131d81fb0234e096581b74440a4b076a76">I4d11d</a>, <a href="https://issuetracker.google.com/issues/301833847">b/301833847</a>)</li> </ul> <h3 id="3.3.0-alpha02" data-text="Version 3.3.0-alpha02" tabindex="-1">Version 3.3.0-alpha02</h3> <p>September 20, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.3.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/aca6f23c6857800cf245fbe5b19a94dca0e71c18/paging">Version 3.3.0-alpha02 contains these commits.</a></p> <p><strong>Kotlin Multiplatform Compatibility</strong></p> <p>Paging now ships artifacts compatible with Kotlin Multiplatform, thanks in large part to upstreamed work from CashApp&#39;s <a href="https://github.com/cashapp/multiplatform-paging">multiplatform-paging</a> project. This will allow us to avoid divergence between two repositories and keep them compatible.</p> <ul> <li><code translate="no" dir="ltr">paging-common</code> has moved all Paging 3 APIs to <code translate="no" dir="ltr">common</code> and is now compatible with jvm and iOS in addition to Android.</li> <li><code translate="no" dir="ltr">paging-testing</code> has moved its code to <code translate="no" dir="ltr">common</code> and is now compatible with jvm and iOS in addition to Android.</li> <li><code translate="no" dir="ltr">paging-compose</code> has moved its code to <code translate="no" dir="ltr">common</code> and ships an Android artifact, matching the multiplatform support of <code translate="no" dir="ltr">androidx.compose</code>.</li> <li><code translate="no" dir="ltr">paging-runtime</code>, <code translate="no" dir="ltr">paging-guava</code>, <code translate="no" dir="ltr">paging-rxjava2</code>, and <code translate="no" dir="ltr">paging-rxjava3</code> will remain Android only.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>The public Logger interface that was meant only for internal usage has been deprecated (<a href="https://android-review.googlesource.com/#/q/I16e9505d60bbe864528e0be2266668c6140bcc24">I16e95</a>, <a href="https://issuetracker.google.com/issues/288623117">b/288623117</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Thanks <a href="https://github.com/veyndan">veyndan</a> from Cash App for helping move Paging to Kotlin Multiplatform (<a href="https://github.com/androidx/androidx/pull/560">#560</a>, <a href="https://github.com/androidx/androidx/pull/561">#561</a>, <a href="https://github.com/androidx/androidx/pull/562">#562</a>, <a href="https://github.com/androidx/androidx/pull/573">#573</a>, <a href="https://github.com/androidx/androidx/pull/576">#576</a>, <a href="https://github.com/androidx/androidx/pull/577">#577</a>, <a href="https://github.com/androidx/androidx/pull/578">#578</a>, <a href="https://github.com/androidx/androidx/pull/579">#579</a>, <a href="https://github.com/androidx/androidx/pull/580">#580</a>, <a href="https://github.com/androidx/androidx/pull/581">#581</a>, <a href="https://github.com/androidx/androidx/pull/583">#583</a>, <a href="https://github.com/androidx/androidx/pull/584">#584</a>, <a href="https://github.com/androidx/androidx/pull/586">#586</a>, <a href="https://github.com/androidx/androidx/pull/609">#609</a>)</li> </ul> <h3 id="3.3.0-alpha01" data-text="Version 3.3.0-alpha01" tabindex="-1">Version 3.3.0-alpha01</h3> <p>September 20, 2023</p> <ul> <li>This is the first multiplatform release of androidx.paging libraries. This version only has <code translate="no" dir="ltr">*-jvm</code>, and <code translate="no" dir="ltr">*-android</code> artifacts. For macOS, iOS, and linux variants, use <code translate="no" dir="ltr">3.3.0-alpha02</code>.</li> </ul> <h2 id="version_32_2" data-text="Version 3.2" tabindex="-1">Version 3.2</h2> <h3 id="3.2.1" data-text="Version 3.2.1" tabindex="-1">Version 3.2.1</h3> <p>September 6, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/22c1844d8a4508469b860b1415c1aea9aa46eb78..ebd21c8f3259d88fac4fd6d9769f23a8dc179ab1/paging">Version 3.2.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed an issue where the <code translate="no" dir="ltr">asSnapshot()</code> API of the Paging Testing artifact would hang when passed a Flow built using <code translate="no" dir="ltr">PagingData.from(List)</code> since <code translate="no" dir="ltr">asSnapshot()</code> would not have any information on when loading has finished (unlike the <code translate="no" dir="ltr">PagingData.from(List, LoadStates)</code> overload). This workaround only works for completable Flows (e.g., a <code translate="no" dir="ltr">flowOf(PagingData.from(...))</code>). For non-completable Flows (e.g., <code translate="no" dir="ltr">MutableStateFlow</code>, use the <code translate="no" dir="ltr">PagingData.from</code> overload that provides <code translate="no" dir="ltr">LoadStates</code>). (<a href="https://android-review.googlesource.com/#/q/I502c3653398feaf1a2dba34072cf89eb58126670">I502c3</a>)</li> <li>Paging Compose now internally uses <code translate="no" dir="ltr">AndroidUiDispatcher.Main</code> to ensure that new data is available in the same frame as loading completes. (<a href="https://android-review.googlesource.com/#/q/Ia55af9ad4aeb366d7a280922563d29424619abf9">Ia55af</a>)</li> </ul> <h3 id="3.2.0" data-text="Version 3.2.0" tabindex="-1">Version 3.2.0</h3> <p>July 26, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/c2d5f1bbc58c2910a46d02584ecc6ff02f1cc789..22c1844d8a4508469b860b1415c1aea9aa46eb78/paging">Version 3.2.0 contains these commits.</a></p> <p><strong>Important changes since 3.1.0</strong></p> <ul> <li>Paging Compose reached API stability and has been merged back into the rest of Paging where its version now matches all the other Paging artfacts. Changes since 3.1.0 include: <ul> <li>Support for previewing a list of fake data by creating a <code translate="no" dir="ltr">PagingData.from(fakeData)</code> and wrapping that <code translate="no" dir="ltr">PagingData</code> in a <code translate="no" dir="ltr">MutableStateFlow</code> (e.g. <code translate="no" dir="ltr">MutableStateFlow(PagingData.from(listOf(1, 2, 3)))</code>). Pass this flow into <code translate="no" dir="ltr">@Preview</code> composables as receiver for <code translate="no" dir="ltr">collectAsLazyPagingItems()</code> to preview.</li> <li>Support for all lazy layouts such as <code translate="no" dir="ltr">LazyVerticalGrid</code> and <code translate="no" dir="ltr">HorizontalPager</code> as well as custom lazy components from Wear and TV libraries. This was achieved through new lower level <code translate="no" dir="ltr">LazyPagingItems</code> extension methods <code translate="no" dir="ltr">itemKey</code> and <code translate="no" dir="ltr">itemContentType</code>, which helps you implement the <code translate="no" dir="ltr">key</code> and <code translate="no" dir="ltr">contentType</code> parameters to the standard <code translate="no" dir="ltr">items</code> APIs that already exist for <code translate="no" dir="ltr">LazyColumn</code>, <code translate="no" dir="ltr">LazyVerticalGrid</code> as well as their equivalents in APIs like <code translate="no" dir="ltr">HorizontalPager</code>.</li> <li><code translate="no" dir="ltr">items(lazyPagingItems)</code> and <code translate="no" dir="ltr">itemsIndexed(lazyPagingItems)</code> which only supports <code translate="no" dir="ltr">LazyListScope</code> were deprecated.</li> </ul></li> <li>New <code translate="no" dir="ltr">paging-testing</code> artifact which provides APIs designed around unit testing each layer of your app and its integration with Paging in isolation. For example, it includes <ul> <li><code translate="no" dir="ltr">TestPager</code> class that allows you to validate the behavior of your own custom <code translate="no" dir="ltr">PagingSource</code> implementation independently from the Pager and real UI.</li> <li>​​<code translate="no" dir="ltr">asPagingSourceFactory</code> APIs to transform either a <code translate="no" dir="ltr">Flow&lt;List&lt;Value&gt;&gt;</code> or a static <code translate="no" dir="ltr">List&lt;Value&gt;</code> into a <code translate="no" dir="ltr">PagingSourceFactory</code> that can be passed to a Pager in tests</li> <li><code translate="no" dir="ltr">asSnapshot</code> Kotlin extension on <code translate="no" dir="ltr">Flow&lt;PagingData&lt;Value&gt;&gt;</code>, which translates the <code translate="no" dir="ltr">Flow&lt;PagingData&lt;Value&gt;&gt;</code> into a direct <code translate="no" dir="ltr">List&lt;Value&gt;</code>. The <code translate="no" dir="ltr">asSnapshot lambda</code> allows you to mimic the UI of your app via APIs such as <code translate="no" dir="ltr">scrollTo</code> or <code translate="no" dir="ltr">appendScrollWhile</code> so that you can verify the snapshot of data is correct at any point in your set of paged data.</li> </ul></li> <li>Added default logs to expose Paging debugging information in two levels: <code translate="no" dir="ltr">VERBOSE</code> and <code translate="no" dir="ltr">DEBUG</code>. The logs can be enabled via the command <code translate="no" dir="ltr">adb shell setprop log.tag.Paging [DEBUG|VERBOSE]</code>. This applies to both Paging with views or Paging with Compose.</li> <li>Added constructors for <code translate="no" dir="ltr">PagingDataAdapter</code> and <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> which accept <code translate="no" dir="ltr">CoroutineContext</code> instead of <code translate="no" dir="ltr">CoroutineDispatcher</code>.</li> <li>Added a new <code translate="no" dir="ltr">PagingSourceFactory</code> functional interface that provides a more explicit API surface than the previous () -&gt; <code translate="no" dir="ltr">PagingSource</code> lambdas. This factory can be used to instantiate a Pager.</li> </ul> <h3 id="3.2.0-rc01" data-text="Version 3.2.0-rc01" tabindex="-1">Version 3.2.0-rc01</h3> <p>June 21, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/73f902dee011bfe400d8a0330bfd8d4bb632065f..c2d5f1bbc58c2910a46d02584ecc6ff02f1cc789/paging">Version 3.2.0-rc01 contains these commits.</a></p> <p><strong>External Contribution</strong></p> <ul> <li>Thanks <a href="https://github.com/veyndan">Veyndan</a> for contributing to moving Paging away from Android/JVM specifics. (<a href="https://github.com/androidx/androidx/pull/553">#553</a>, <a href="https://github.com/androidx/androidx/pull/554">#554</a>, <a href="https://github.com/androidx/androidx/pull/555">#555</a>, <a href="https://github.com/androidx/androidx/pull/559">#559</a>)</li> </ul> <h3 id="3.2.0-beta01" data-text="Version 3.2.0-beta01" tabindex="-1">Version 3.2.0-beta01</h3> <p>June 7, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/c5bf9bc40dd5d9f0b3f34e7273ac0d4e4f05c41d..73f902dee011bfe400d8a0330bfd8d4bb632065f/paging">Version 3.2.0-beta01 contains these commits.</a></p> <p><strong>Paging Compose</strong></p> <ul> <li>Paging Compose has officially reached API stability. As such, the version has been updated from <code translate="no" dir="ltr">1.0.0-alpha20</code> to now match the version of all other Paging artifacts.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>Removed the deprecated <code translate="no" dir="ltr">items(LazyPagingItems)</code> and <code translate="no" dir="ltr">itemsIndexed(LazyPagingItems)</code> APIs from Paging Compose. See the <a href="#1.0.0-alpha20">Paging Compose <code translate="no" dir="ltr">1.0.0-alpha20</code> release notes</a> for an example of their replacement APIs. (<a href="https://android-review.googlesource.com/#/q/I9626e55d070a11902952862c7663721f775503e4">I9626e</a>)</li> </ul> <h3 id="3.2.0-alpha06" data-text="Version 3.2.0-alpha06" tabindex="-1">Version 3.2.0-alpha06</h3> <p>May 24, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0-alpha06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6f3ac2bd197d5e61ab2708125b57d6ae4003ad68..c5bf9bc40dd5d9f0b3f34e7273ac0d4e4f05c41d/paging">Version 3.2.0-alpha06 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Added a new <code translate="no" dir="ltr">PagingSourceFactory</code> functional interface that provides a more explicit API surface than the existing <code translate="no" dir="ltr">() -&gt; PagingSource</code> lambdas. This factory can be used to instantiate a <code translate="no" dir="ltr">Pager</code>. (<a href="https://android-review.googlesource.com/#/q/I3316590a0d667566edeb40d4e99e005cd6cee3ac">I33165</a>, <a href="https://issuetracker.google.com/issues/280655188">b/280655188</a>)</li> <li>Added new <code translate="no" dir="ltr">paging-testing</code> API of <code translate="no" dir="ltr">List&lt;Value&gt;.asPagingSourceFactory()</code> to get a <code translate="no" dir="ltr">PagingSourceFactory</code> that only loads from an immutable list of data. The existing extension on <code translate="no" dir="ltr">Flow&lt;List&lt;Value&gt;&gt;</code> should still be used for testing with multiple generations of static data. (<a href="https://android-review.googlesource.com/#/q/Id34d1361119413d0c19a054a2e23dd26241faa6f">Id34d1</a>, <a href="https://issuetracker.google.com/issues/280655188">b/280655188</a>)</li> </ul> <p><strong>API Changes</strong></p> <ul> <li>All public APIs in paging-testing are now annotated with <code translate="no" dir="ltr">@VisibleForTesting</code> to ensure these APIs are used only in tests. (<a href="https://android-review.googlesource.com/#/q/I7db6e8431cb78604653220c2768339c39db88f54">I7db6e</a>)</li> <li>The <code translate="no" dir="ltr">asSnapshot</code> API no longer requires passing in a <code translate="no" dir="ltr">CoroutineScope</code>. It now defaults to using the context inherited from its parent scope. (<a href="https://android-review.googlesource.com/#/q/Id0a78cc5dd633901b39cc608d66d6b7255618549">Id0a78</a>, <a href="https://issuetracker.google.com/issues/282240990">b/282240990</a>)</li> <li>Reordered <code translate="no" dir="ltr">TestPager</code> constructor parameters to intuitively match the order of real <code translate="no" dir="ltr">Pager</code> constructor parameters (<a href="https://android-review.googlesource.com/#/q/I6185ad09fb5e695c02b50f88022d168405de39f2">I6185a</a>)</li> <li>Migrated paging-testing&#39;s use of lambda type <code translate="no" dir="ltr">() -&gt; PagingSource&lt;Key, Value&gt;</code> to type <code translate="no" dir="ltr">PagingSourceFactory&lt;Key, Value&gt;</code>. (<a href="https://android-review.googlesource.com/#/q/I4a95067989fabf8258a3392007dbf8abd35d8efa">I4a950</a>, <a href="https://issuetracker.google.com/issues/280655188">b/280655188</a>)</li> </ul> <p><strong>Behavior Changes</strong></p> <ul> <li>Main dispatcher is no longer required to run <code translate="no" dir="ltr">asSnapshot</code> Paging tests. Setting it no longer makes any changes to the test behavior. (<a href="https://android-review.googlesource.com/#/q/Ie56ead0c5fcec3ef8dce1c77c150d2f8dd0d7d5e">Ie56ea</a>)</li> </ul> <h3 id="3.2.0-alpha05" data-text="Version 3.2.0-alpha05" tabindex="-1">Version 3.2.0-alpha05</h3> <p>May 3, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7d3ac1ab1206c01fae3ebb500b5b942636070155..6f3ac2bd197d5e61ab2708125b57d6ae4003ad68/paging">Version 3.2.0-alpha05 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>The Paging Testing API of <code translate="no" dir="ltr">asSnapshot</code> now defaults its <code translate="no" dir="ltr">loadOperations</code> parameter to an empty lambda. This allows calling <code translate="no" dir="ltr">asSnapshot</code> without passing in any load operations to retrieve the data from the initial refresh load. (<a href="https://android-review.googlesource.com/#/q/Ied354f58b94c8303eb9914dc5ca784d1313ddc04">Ied354</a>, <a href="https://issuetracker.google.com/issues/277233770">b/277233770</a>)</li> </ul> <p><strong>Documentation Improvements</strong></p> <ul> <li>Updated the documentation on <code translate="no" dir="ltr">asPagingSourceFactory()</code> to clarify that it is an extension method on a <code translate="no" dir="ltr">Flow</code> which returns a reusable factory for generating <code translate="no" dir="ltr">PagingSource</code> instances. (<a href="https://android-review.googlesource.com/#/q/I5ff4f23644c737e86deab84fb9bcce7668239c7f">I5ff4f</a>, <a href="https://android-review.googlesource.com/q/I705b5ab25c0dee98d90fe8d28248e66d67ebcb40">I705b5</a>)</li> <li>Updated the documentation on the <code translate="no" dir="ltr">LoadResult.Page</code>constructor to clarify the need to override <code translate="no" dir="ltr">itemsBefore</code> and <code translate="no" dir="ltr">itemsAfter</code> to support jumping. (<a href="https://android-review.googlesource.com/#/q/I367334e2570bfaba2f43adcdf00543559fa3b37f">Ied354</a>)</li> </ul> <p><strong>External Contributions</strong></p> <ul> <li>Thanks <a href="https://github.com/veyndan">Veyndan</a> for contributing to moving Paging away from Android/JVM specifics. (<a href="https://github.com/androidx/androidx/pull/525">#525</a>, <a href="https://github.com/androidx/androidx/pull/523">#523</a>, <a href="https://github.com/androidx/androidx/pull/520">#520</a>, <a href="https://github.com/androidx/androidx/pull/519">#519</a>, <a href="https://github.com/androidx/androidx/pull/507">#507</a>, <a href="https://github.com/androidx/androidx/pull/506">#506</a>, <a href="https://github.com/androidx/androidx/pull/505">#505</a>, <a href="https://github.com/androidx/androidx/pull/499">#499</a>, <a href="https://github.com/androidx/androidx/pull/497">#497</a>, <a href="https://github.com/androidx/androidx/pull/496">#496</a>, <a href="https://github.com/androidx/androidx/pull/493">#493</a>)</li> </ul> <h3 id="3.2.0-alpha04" data-text="Version 3.2.0-alpha04" tabindex="-1">Version 3.2.0-alpha04</h3> <p>February 8, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/548c8ac2570ae6cf15798fea1380491f7d93796b..7d3ac1ab1206c01fae3ebb500b5b942636070155/paging">Version 3.2.0-alpha04 contains these commits.</a></p> <p><strong>Paging Testing</strong></p> <ul> <li>The <code translate="no" dir="ltr">paging-testing</code> artifact now contains a <code translate="no" dir="ltr">asPagingSourceFactory</code> method to create a <code translate="no" dir="ltr">pagingSourceFactory</code> from a <code translate="no" dir="ltr">Flow&lt;List&lt;Value&gt;&gt;</code> to be supplied to a Pager. Each <code translate="no" dir="ltr">List&lt;Value&gt;&gt;</code> emitted from the Flow represents a generation of Paged data. This facilitates paging tests on, for example, <code translate="no" dir="ltr">PagingData</code> transformations by faking a data source for the Pager to collect from. (<a href="https://android-review.googlesource.com/#/q/I6f230da9825c187eb0d8ae6645df7f0a67925574">I6f230</a>, <a href="https://issuetracker.google.com/issues/235528239">b/235528239</a>)</li> <li><p>The <code translate="no" dir="ltr">paging-testing</code> artifact has been expanded with new APIs suitable for verifying the data contained with a <code translate="no" dir="ltr">Flow&lt;PagingData&lt;T&gt;&gt;</code> is correct. This can be used, for example, to assert the output of a <code translate="no" dir="ltr">Flow&lt;PagingData&lt;T&gt;&gt;</code> from your ViewModel layer.</p> <p>This is done via the <code translate="no" dir="ltr">asSnapshot</code> Kotlin extension on <code translate="no" dir="ltr">Flow&lt;PagingData&lt;Value&gt;&gt;</code>, which translates the <code translate="no" dir="ltr">Flow&lt;PagingData&lt;Value&gt;&gt;</code> into a direct <code translate="no" dir="ltr">List&lt;Value&gt;</code>. The <code translate="no" dir="ltr">asSnapshot</code> lambda allows you to mimic the UI of your app via APIs such as <code translate="no" dir="ltr">scrollTo</code> or <code translate="no" dir="ltr">appendScrollWhile</code> in a way that is repeatable and consistent so that you can verify the snapshot of data is correct at any point in your set of paged data.</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-c1">// Create your ViewModel instance</span> <span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">viewModel</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-err">…</span> <span class="devsite-syntax-c1">// Get the Flow of PagingData from the ViewModel</span> <span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">data</span>&lt;<span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Flow&lt;PagingData&lt;String&gt;</span>&gt;<span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">viewModel</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">data</span> <span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">snapshot</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">List&lt;String&gt;</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">data</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">asSnapshot</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Each operation inside the lambda waits for the data to settle before continuing</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">scrollTo</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">index</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">50</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// While you can’t view the items within the asSnapshot call,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// you can continuously scroll in a direction while some condition is true</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// i.e., in this case until you hit a placeholder item</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">appendScrollWhile</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-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-kt">String</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt;<span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">item</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">!=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-err">“</span><span class="devsite-syntax-n">Header</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">1</span><span class="devsite-syntax-err">”</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-c1">// With the asSnapshot complete, you can now verify that the snapshot</span> <span class="devsite-syntax-c1">// has the expected values</span> </code></pre></devsite-code> <p><code translate="no" dir="ltr">asSnapshot</code> is a <code translate="no" dir="ltr">suspend</code> method that is expected to be run within <code translate="no" dir="ltr">runTest</code>. See <a href="/kotlin/coroutines/test">Testing Kotlin coroutines on Android</a> for more information. (<a href="https://android-review.googlesource.com/#/q/I55fd2374b68f8e18a292865a92143f9de50bbad0">I55fd2</a>, <a href="https://android-review.googlesource.com/#/q/I5bd26ec7d66f52696a3d4ea6a610b0ccabd95a84">I5bd26</a>, <a href="https://android-review.googlesource.com/#/q/I7ce345200d07fa1eef9f5d1028fd88caab1477b3">I7ce34</a>, <a href="https://android-review.googlesource.com/#/q/I51f4d2bba2a98a829eeac3ed689ecc0ea0fc7a19">I51f4d</a>, <a href="https://android-review.googlesource.com/#/q/I2249f7147213881bdef9acd42287d9fca0dfcc09">I2249f</a>, <a href="https://android-review.googlesource.com/#/q/Id6223b81ebf221456147e41c428a7718e9c494e6">Id6223</a>, <a href="https://android-review.googlesource.com/#/q/Ic4babf6783f51dbdab690693e176f65820fa3a38">Ic4bab</a>, <a href="https://android-review.googlesource.com/#/q/Ib29b92793c33a759b52d6b4881d3a3f812b26382">Ib29b9</a>, <a href="https://android-review.googlesource.com/#/q/Ic1238184b82106a5ac6ec5f517819a489dd13218">Ic1238</a>, <a href="https://android-review.googlesource.com/#/q/I96def78b99fcc9ee088a0a912ba69866d8667715">I96def</a>, <a href="https://issuetracker.google.com/issues/235528239">b/235528239</a>)</p></li> </ul> <p><strong>API Changes</strong></p> <ul> <li>UI calls to <code translate="no" dir="ltr">getItem</code> and <code translate="no" dir="ltr">peek</code> in <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> and <code translate="no" dir="ltr">PagingDataAdapter</code> are now correctly marked as only callable on the Main thread. (<a href="https://android-review.googlesource.com/#/q/I699b6d8875267b186ead2dc3254099b8c2fdd5e9">I699b6</a>)</li> <li>Removed wildcards from generic types used by <code translate="no" dir="ltr">TestPager</code>, making it easier to consume the results of those methods in code written in the Java programming language. (<a href="https://android-review.googlesource.com/#/q/I56c429dcda1a579ea1512d3e9a2b235ba33ad200">I56c42</a>)</li> </ul> <h3 id="3.2.0-alpha03" data-text="Version 3.2.0-alpha03" tabindex="-1">Version 3.2.0-alpha03</h3> <p>October 24, 2022</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bea814b246f89ff7244e3c6b0648f0b57e47897c..548c8ac2570ae6cf15798fea1380491f7d93796b/paging">Version 3.2.0-alpha03 contains these commits.</a></p> <p><strong>Paging Testing</strong></p> <p>This release contains a new artifact: <code translate="no" dir="ltr">paging-testing</code>. This artifact provides APIs designed around unit testing each layer of your app and its integration with Paging in isolation.</p> <p>For example, this first release includes a <code translate="no" dir="ltr">TestPager</code> class that allows you to validate the behavior of your own custom <code translate="no" dir="ltr">PagingSource</code> implementation independently from the <code translate="no" dir="ltr">Pager</code> and real UI you would normally need to simulate the end-to-end Paging integration.</p> <p><code translate="no" dir="ltr">TestPager</code> should be considered a <strong>fake</strong> - a <a href="//training/testing/fundamentals/test-doubles">test double</a> that mirrors the real implementation of <code translate="no" dir="ltr">Pager</code> while providing a simplified API surface for testing a <code translate="no" dir="ltr">PagingSource</code>. These APIs are <code translate="no" dir="ltr">suspend</code> APIs and should be run within <code translate="no" dir="ltr">runTest</code> as outlined in the guide for <a href="https://developer.android.com/kotlin/coroutines/test">Testing Kotlin coroutines on Android</a>.</p> <p>An example of these APIs in use can be found in the <a href="https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:room/room-paging/src/androidTest/kotlin/androidx/room/paging/LimitOffsetPagingSourceTest.kt"><code translate="no" dir="ltr">room-paging</code> tests</a>, which were refactored to use <code translate="no" dir="ltr">TestPager</code>.</p> <p><strong>API Changes</strong></p> <ul> <li>Enables convenient iteration over <code translate="no" dir="ltr">LoadResult.Page.data</code> through <code translate="no" dir="ltr">LoadResult.Page.iterator()</code>. This indirectly allows the usage of the <a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/flatten.html">Kotlin standard library <code translate="no" dir="ltr">flatten</code> method</a> when given a <code translate="no" dir="ltr">List&lt;LoadResult.Page&gt;</code> such as with the <code translate="no" dir="ltr">pages</code> property of <code translate="no" dir="ltr">PagingState</code> that is passed to the <code translate="no" dir="ltr">PagingSource.getRefreshKey</code> method. (<a href="https://android-review.googlesource.com/#/q/Ie0718ec7179434d2ec2466374cb33cf1c4aec92f">Ie0718</a>)</li> </ul> <h3 id="3.2.0-alpha02" data-text="Version 3.2.0-alpha02" tabindex="-1">Version 3.2.0-alpha02</h3> <p>August 10, 2022</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7cbb37cc779160b89644d03e042c129d0ce025d2..bea814b246f89ff7244e3c6b0648f0b57e47897c/paging">Version 3.2.0-alpha02 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Paging now provides logs via the <code translate="no" dir="ltr">AsyncPagingDataDiffer</code>or <code translate="no" dir="ltr">PagingDataAdapter</code> classes to expose debugging information collected from <code translate="no" dir="ltr">PagingData</code>.</li> <li>The logs can be enabled via the <code translate="no" dir="ltr">adb shell</code> command <code translate="no" dir="ltr">adb shell setprop log.tag.Paging [DEBUG|VERBOSE].</code>(<a href="https://issuetracker.google.com/issues/235527159">b/235527159</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed the missing <code translate="no" dir="ltr">PagingDataDiffer</code> constructor error when using <code translate="no" dir="ltr">paging-common:3.2.0-alpha01</code> with runtime <code translate="no" dir="ltr">paging-runtime:3.1.1</code> or older.(<a href="https://issuetracker.google.com/issues/235256201">b/235256201</a>)</li> </ul> <h3 id="3.2.0-alpha01" data-text="Version 3.2.0-alpha01" tabindex="-1">Version 3.2.0-alpha01</h3> <p>June 1, 2022</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.2.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/65c8f2c53158200a61e0e1cc012cdbbadaee60ab..7cbb37cc779160b89644d03e042c129d0ce025d2/paging">Version 3.2.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added constructors for <code translate="no" dir="ltr">PagingDataAdapter</code> and <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> which accept <code translate="no" dir="ltr">CoroutineContext</code> instead of <code translate="no" dir="ltr">CoroutineDispatcher</code>. (<a href="https://android-review.googlesource.com/#/q/Idc8784ff12a2d6e4a617bae51c7053582c5f1986">Idc878</a>)</li> <li>By default, <code translate="no" dir="ltr">PagingData.from()</code> and <code translate="no" dir="ltr">PagingData.empty()</code> will no longer affect <code translate="no" dir="ltr">CombinedLoadStates</code> on the presenter side. A new overload that allows passing <code translate="no" dir="ltr">sourceLoadStates</code> and <code translate="no" dir="ltr">remoteLoadStates</code> in to these constructors has been added to maintain the existing behavior of setting <code translate="no" dir="ltr">LoadStates</code> to be fully terminal (i.e., <code translate="no" dir="ltr">NotLoading(endOfPaginationReached = false)</code>), with the option to include remote states as well if needed. If <code translate="no" dir="ltr">LoadStates</code> are not passed, then the previous <code translate="no" dir="ltr">CombinedLoadStates</code> will be maintained on the presenter side when it receives the static <code translate="no" dir="ltr">PagingData</code>. (<a href="https://android-review.googlesource.com/#/q/Ic3ce54f8984e2f1d76b3f3e3412b3e41a837f1db">Ic3ce5</a>, <a href="https://issuetracker.google.com/issues/205344028">b/205344028</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>The result of <code translate="no" dir="ltr">PagingSource.getRefreshKey()</code> is now correctly priotized over <code translate="no" dir="ltr">initialKey</code> in cases where it would return null, but a non-null <code translate="no" dir="ltr">initialKey</code> was set. (<a href="https://android-review.googlesource.com/#/q/Ic9542c0062f9a72e5cfa15469bcf0c204a0934bd">Ic9542</a>, <a href="https://issuetracker.google.com/issues/230391606">b/230391606</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Updated :compose:ui:ui-test api (updateApi) due to test-coroutines-lib migration (<a href="https://android-review.googlesource.com/#/q/I3366d5111b2fb830d619da5402c12ea4c929391a">I3366d</a>)</li> </ul> <h2 id="version_31_2" data-text="Version 3.1" tabindex="-1">Version 3.1</h2> <h3 id="3.1.1" data-text="Version 3.1.1" tabindex="-1">Version 3.1.1</h3> <p>March 9, 2022</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.1.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/04b73e954d139340d0ac8b00cdcef55b103ba393..65c8f2c53158200a61e0e1cc012cdbbadaee60ab/paging">Version 3.1.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Removed intermediate <code translate="no" dir="ltr">LoadState.NotLoading</code> events between generations that were incorrectly inserted by <code translate="no" dir="ltr">.cachedIn()</code>. This change makes it much easier to react on <code translate="no" dir="ltr">LoadState</code> changes by removing redundant <code translate="no" dir="ltr">LoadState.NotLoading</code> events that were produced between retrying failed loads, when refreshing or during invalidation.</li> </ul> <h3 id="3.1.0" data-text="Version 3.1.0" tabindex="-1">Version 3.1.0</h3> <p>November 17, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.1.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b15a1d282b578971faba0bbe4e631dd2e9b5b854..04b73e954d139340d0ac8b00cdcef55b103ba393/paging">Version 3.1.0 contains these commits.</a></p> <p><strong>Important changes since 3.0.0</strong></p> <ul> <li><code translate="no" dir="ltr">Flow&lt;PagingData&gt;.observable</code> and <code translate="no" dir="ltr">Flow&lt;PagingData&gt;.flowable</code> APIs are no longer experimental</li> <li>Behavior changes to <code translate="no" dir="ltr">LoadState</code>: <ul> <li><code translate="no" dir="ltr">endOfPaginationReached</code> is now always <code translate="no" dir="ltr">false</code> for <code translate="no" dir="ltr">LoadType.REFRESH</code> for both <code translate="no" dir="ltr">PagingSource</code> and <code translate="no" dir="ltr">RemoteMediator</code></li> <li><code translate="no" dir="ltr">LoadStates</code> from Paging now await valid values from both <code translate="no" dir="ltr">PagingSource</code> and <code translate="no" dir="ltr">RemoteMediator</code> before emitting downstream. New generations of <code translate="no" dir="ltr">PagingData</code> will now always correctly begin with <code translate="no" dir="ltr">Loading</code> for refresh state instead of resetting to <code translate="no" dir="ltr">NotLoading</code> incorrectly in some cases.</li> <li><code translate="no" dir="ltr">.loadStateFlow</code> and <code translate="no" dir="ltr">.addLoadStateListener</code> on presenter APIs no longer redundantly send an initial <code translate="no" dir="ltr">CombinedLoadStates</code> that always has mediator states set to <code translate="no" dir="ltr">null</code></li> </ul></li> <li>Cancellation on past generations now happens eagerly on invalidation / new generations. It should no longer be required to use <code translate="no" dir="ltr">.collectLatest</code> on <code translate="no" dir="ltr">Flow&lt;PagingData&gt;</code>, although it is still recommended to do so.</li> <li><code translate="no" dir="ltr">PagingSource.LoadResult.Invalid</code> has been added as a new return type from <code translate="no" dir="ltr">PagingSource.load</code>, which causes Paging to discard any pending or future load requests to this <code translate="no" dir="ltr">PagingSource</code> and invalidate it. This return type is designed to handle potentially invalid or stale data that can be returned from the database or network.</li> <li>Added <code translate="no" dir="ltr">.onPagesPresented</code> and <code translate="no" dir="ltr">.addOnPagesUpdatedListener</code> presenter APIs which triggered synchronously as pages are presented in UI. Page updates can happen in the following scenarios: <ul> <li>Initial load of a new generation of PagingData completes, regardless if the new generation contains any changes to the presented items. i.e., A new generation completing initial load with no updates because the list is exactly the same will still trigger this callback.</li> <li>A page is inserted, even if the inserted page contains no new items.</li> <li>A page is dropped, even if the dropped page was empty.</li> </ul></li> </ul> <h3 id="3.1.0-rc01" data-text="Version 3.1.0-rc01" tabindex="-1">Version 3.1.0-rc01</h3> <p>November 3, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.1.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/db0888af4fa9a8eaeaf55cc1f120724bc67bdb20..b15a1d282b578971faba0bbe4e631dd2e9b5b854/paging">Version 3.1.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a race condition + memory leak in .cachedIn() in cases where multiple load events were sent by Paging downstream while there are no observers or between when an observer is switching to a new PagingData. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1869943">Ib682e</a>)</li> </ul> <h3 id="3.1.0-beta01" data-text="Version 3.1.0-beta01" tabindex="-1">Version 3.1.0-beta01</h3> <p>October 13, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.1.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f6bc4d47b7be46a5af151ed726e84db0a1cf9f9..db0888af4fa9a8eaeaf55cc1f120724bc67bdb20/paging">Version 3.1.0-beta01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed an issue where many rapid item accesses could cause them to get dropped for consideration in prefetchDistance, causing page loads to stall. This is especially an issue when many items are laid out at once in an order which would prioritize loading against the user scroll direction. These item accesses are now buffered and synchronously prioritized to prevent them from getting dropped. (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1833273">aosp/1833273</a>)</li> </ul> <h3 id="3.1.0-alpha04" data-text="Version 3.1.0-alpha04" tabindex="-1">Version 3.1.0-alpha04</h3> <p>September 29, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.1.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/97264aa4532db7f7db1ffb3f42f3a9204971dbfc..1f6bc4d47b7be46a5af151ed726e84db0a1cf9f9/paging">Version 3.1.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">Flow&lt;PagingData&gt;.observable</code> and <code translate="no" dir="ltr">Flow&lt;PagingData&gt;.flowable</code> APIs are no longer experimental. (<a href="https://android-review.googlesource.com/#/q/Ie0bdd8c453baa752836a0c53e5ff035fcf8d85c5">Ie0bdd</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>For LoadStates, <code translate="no" dir="ltr">endOfPaginationReached</code> is now always <code translate="no" dir="ltr">false</code> for <code translate="no" dir="ltr">LoadType.REFRESH</code>. Previously, it was possible for endOfPaginationReached to be <code translate="no" dir="ltr">true</code> for RemoteMediator <code translate="no" dir="ltr">REFRESH</code>, but not for PagingSource. This behavior is now consolidated to always return <code translate="no" dir="ltr">false</code> as it never makes sense for REFRESH to be terminal, and is now documented as part of the API contract in LoadStates. When deciding if pagination is terminated, you should always do so with respect to either the APPEND or PREPEND directions. (<a href="https://android-review.googlesource.com/#/q/I047b601726e8cbdb55eb68bd849cba1136dd0e3e">I047b6</a>)</li> <li><p>LoadStates from Paging now await valid values from both PagingSource and RemoteMediator before emitting downstream between generations. This prevents new generations of PagingData from sending NotLoading in CombinedLoadStates.source.refresh if it was already Loading; new generations of PagingData will now always correctly begin with Loading for refresh state instead of first resetting to NotLoading incorrectly in some cases.</p> <p>Cancellation on past generations now happen eagerly on invalidation / new generations. It should no longer be required to use .collectLatest on <code translate="no" dir="ltr">Flow&lt;PagingData&gt;</code>, although it is still highly recommended to do so. (<a href="https://android-review.googlesource.com/#/q/I0b2b5e0120e2e3a677f65d40d3955a9bbbe2e1a9">I0b2b5</a>, <a href="https://issuetracker.google.com/issues/177351336">b/177351336</a>, <a href="https://issuetracker.google.com/issues/195028524">b/195028524</a>)</p></li> <li><p><code translate="no" dir="ltr">.loadStateFlow</code> and <code translate="no" dir="ltr">.addLoadStateListener</code> on presenter APIs no longer redundantly send an initial <code translate="no" dir="ltr">CombinedLoadStates</code> that always has mediator states set to <code translate="no" dir="ltr">null</code> and source states set to <code translate="no" dir="ltr">NotLoading(endOfPaginationReached = false)</code>. This means that:</p> <ol> <li>mediator states will always be populated if you use RemoteMediator.</li> <li>Registering a new loadState listener or a new collector on <code translate="no" dir="ltr">.loadStateFlow</code> will no longer immediately emit the current value if it hasn&#39;t received a real <code translate="no" dir="ltr">CombinedLoadStates</code> from <code translate="no" dir="ltr">PagingData</code>. This can happen if a collector or listener starts before a <code translate="no" dir="ltr">PagingData</code> has been submitted. (<a href="https://android-review.googlesource.com/#/q/I1a7485edd077f1ae08f7d9656cbcdfb6bf9ec99f">I1a748</a>)</li> </ol></li> </ul> <h3 id="3.1.0-alpha03" data-text="Version 3.1.0-alpha03" tabindex="-1">Version 3.1.0-alpha03</h3> <p>July 21, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.1.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/19ae3a88ff0824d615355b492cb56049e16991f2..97264aa4532db7f7db1ffb3f42f3a9204971dbfc/paging">Version 3.1.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><p>A third LoadResult return type LoadResult.Invalid is added to PagingSource. When a PagingSource.load returns LoadResult.Invalid, paging will discard the loaded data and invalidate the PagingSource. This return type is designed to handle potentially invalid or stale data that can be returned from the database or network.</p> <p>For example, if the underlying database gets written into but the PagingSource does not invalidate in time, it may return inconsistent results if its implementation depends on the immutability of the backing dataset it loads from (e.g., LIMIT OFFSET style db implementations). In this scenario, it is recommended to check for invalidation after loading and to return LoadResult.Invalid, which causes Paging to discard any pending or future load requests to this PagingSource and invalidate it.</p> <p>This return type is also supported by Paging2 API that leverages LivePagedList or RxPagedList. When using a PagingSource with Paging2&#39;s PagedList APIs, the PagedList is immediately detached, stopping further attempts to load data on this PagedList and triggers invalidation on the PagingSource.</p> <p>LoadResult is a sealed class, which means this is a source-incompatible change such that use cases directly using PagingSource.load results will have to handle LoadResult.Invalid at compile time. For example, Kotlin users leveraging exhaustive-when to check return type will have to add a check for Invalid type. (<a href="https://android-review.googlesource.com/#/q/Id6bd3f2544f1ba97a95a0d590353438a95fedf2a">Id6bd3</a>, <a href="https://issuetracker.google.com/issues/191806126">b/191806126</a>, <a href="https://issuetracker.google.com/issues/192013267">b/192013267</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Invalidation callbacks added via PagingSource.registerInvalidatedCallback or DataSource.addInvalidatedCallback now automatically trigger if they were registered on a PagingSource / DataSource that was already invalid. This resolves a race condition which caused Paging to drop invalidation signals and get stuck when provided a Source which was already invalid during initial load. Additionally, invalidate callbacks are now properly removed after being triggered as they are guaranteed to be called at most once. (<a href="https://android-review.googlesource.com/#/q/I27e699be2bfa3d6656d10c8c0c1f2ef9638f52fc">I27e69</a>)</li> <li>Submitting the placeholder initial value (InitialPagedList) from a newly instantiated PagedList stream, e.g., LivePagedListBuilder or RxPagedListBuilder will no longer clear previously loaded data.</li> </ul> <h3 id="3.1.0-alpha02" data-text="Version 3.1.0-alpha02" tabindex="-1">Version 3.1.0-alpha02</h3> <p>July 1, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.1.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/86ff5b4bb956431ec884586ce0aea0127e189ec4..19ae3a88ff0824d615355b492cb56049e16991f2/paging">Version 3.1.0-alpha02 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li><p>Added onPagesPresented listener and flow presenter APIs which trigger immediately after presented pages are updated in UI.</p> <p>Since these updates are synchronous with UI, you may call adapter methods such as .snapshot, .getItemCount, to inspect the state after the update has been applied. Note that .snapshot() was left to be explicitly called because it can be expensive to do on every update.</p> <p>Page updates can happen in the following scenarios:</p> <ul> <li>Initial load of a new generation of PagingData completes, regardless if the new generation contains any changes to the presented items. i.e., A new generation completing initial load with no updates because the list is exactly the same will still trigger this callback.</li> <li>A page is inserted, even if the inserted page contains no new items</li> <li>A page is dropped, even if the dropped page was empty (<a href="https://android-review.googlesource.com/#/q/I272c9a6b5d80f155dffcc05d5cda176d58c18d31">I272c9</a>, <a href="https://issuetracker.google.com/issues/189999634">b/189999634</a>)</li> </ul></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Accessing PagedList.dataSource from the initial value produced by LivePagedList or RxPagedList will no longer incorrectly throw an IllegalStateException (<a href="https://android-review.googlesource.com/#/q/I96707a477f347bd19e7aeccdb52eca39d637297a">I96707</a>)</li> </ul> <h3 id="3.1.0-alpha01" data-text="Version 3.1.0-alpha01" tabindex="-1">Version 3.1.0-alpha01</h3> <p>June 2, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.1.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5651d1dbcb19d1b2d3cc50e8c379a8cc9f6ee1ad..86ff5b4bb956431ec884586ce0aea0127e189ec4/paging">Version 3.1.0-alpha01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Classes provided by <code translate="no" dir="ltr">paging-rxjava3</code> now live under the <code translate="no" dir="ltr">androidx.paging.rxjava3</code> package so that they do not conflict with <code translate="no" dir="ltr">paging-rxjava2</code> (<a href="https://android-review.googlesource.com/#/q/Ifa7f693a3207da589926b35428637dd128ffc762">Ifa7f6</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed an issue where Paging would sometimes send no-op differ events to RecyclerView, which could cause certain listeners to trigger early. (<a href="https://android-review.googlesource.com/#/q/Ic507fa793cb22ac9f8880a8f8841f8e6caa197f4">Ic507f</a>, <a href="https://issuetracker.google.com/issues/182510751">b/182510751</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Added deprecated PagedList compat APIs to rxjava3 artifact (<a href="https://android-review.googlesource.com/#/q/Id1ce2d9a3b1c7e7d1d20bf6e9f4cdc646376b43d">Id1ce2</a>, <a href="https://issuetracker.google.com/issues/182497591">b/182497591</a>)</li> </ul> <h2 id="paging_compose_version_100_2" data-text="Paging Compose Version 1.0.0" tabindex="-1">Paging Compose Version 1.0.0</h2> <h3 id="1.0.0-alpha20" data-text="Version 1.0.0-alpha20" tabindex="-1">Version 1.0.0-alpha20</h3> <p>May 24, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha20</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6f3ac2bd197d5e61ab2708125b57d6ae4003ad68..c5bf9bc40dd5d9f0b3f34e7273ac0d4e4f05c41d/paging/paging-compose">Version 1.0.0-alpha20 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Paging Compose now supports previewing a list of fake data by creating a <code translate="no" dir="ltr">PagingData.from(fakeData)</code> and wrapping that <code translate="no" dir="ltr">PagingData</code> in a <code translate="no" dir="ltr">MutableStateFlow</code> (e.g., <code translate="no" dir="ltr">MutableStateFlow(PagingData.from(listOf(1, 2, 3)))</code>). By using that data as the input into your <code translate="no" dir="ltr">@Preview</code>, calls to <code translate="no" dir="ltr">collectAsLazyPagingItems()</code> will provide previewable <code translate="no" dir="ltr">LazyPagingItems</code>. (<a href="https://android-review.googlesource.com/#/q/I8a78db059776190b833773986825579e96e042d5">I8a78d</a>, <a href="https://issuetracker.google.com/issues/194544557">b/194544557</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Cached data from <code translate="no" dir="ltr">pager.flow.cachedIn</code> that has been collected in <code translate="no" dir="ltr">LazyPagingItems</code> will now be immediately available after state restoration without requiring asynchronous collection. This means the cached data will be ready for presentation immediately upon initial composition after state is restored. (<a href="https://android-review.googlesource.com/#/q/I97a6078c0563f8017af24448c32e59b86a987465">I97a60</a>, <a href="https://issuetracker.google.com/issues/177245496">b/177245496</a>)</li> </ul> <h3 id="1.0.0-alpha19" data-text="Version 1.0.0-alpha19" tabindex="-1">Version 1.0.0-alpha19</h3> <p>May 3, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha19</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7d3ac1ab1206c01fae3ebb500b5b942636070155..6f3ac2bd197d5e61ab2708125b57d6ae4003ad68/paging/paging-compose">Version 1.0.0-alpha19 contains these commits.</a></p> <p><strong>Supporting all lazy layouts</strong></p> <p>Previously, Paging Compose provided custom <code translate="no" dir="ltr">items</code> and <code translate="no" dir="ltr">itemsIndexed</code> extensions on <code translate="no" dir="ltr">LazyListScope</code>, which meant that you could not use Paging Compose with other lazy layouts like <code translate="no" dir="ltr">LazyVerticalGrid</code>, <code translate="no" dir="ltr">HorizontalPager</code>, or other custom lazy components provided by the Wear and TV libraries. Addressing this inflexibility is the primary update for this release.</p> <p>To support more lazy layouts, we needed to build out APIs at a different layer - rather than providing a custom <code translate="no" dir="ltr">items</code> API for each lazy layout, Paging Compose now provides slightly lower level extension methods on <code translate="no" dir="ltr">LazyPagingItems</code> in <code translate="no" dir="ltr">itemKey</code> and <code translate="no" dir="ltr">itemContentType</code>. These APIs focus on helping you implement the <code translate="no" dir="ltr">key</code> and <code translate="no" dir="ltr">contentType</code> parameters to the standard <code translate="no" dir="ltr">items</code> APIs that already exist for <code translate="no" dir="ltr">LazyColumn</code>, <code translate="no" dir="ltr">LazyVerticalGrid</code> as well as their equivalents in APIs like <code translate="no" dir="ltr">HorizontalPager</code>. (<a href="https://android-review.googlesource.com/q/Ifa13b3d764203422645cac8bfc3d09278d508874">Ifa13b</a>, <a href="https://android-review.googlesource.com/q/Ib04f099111605af368c5b025d84a085ab4251fb6">Ib04f0</a>, <a href="https://issuetracker.google.com/issues/259385813">b/259385813</a>)</p> <p>This means that supporting a <code translate="no" dir="ltr">LazyVerticalGrid</code> would look like:</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-c1">// This part is unchanged</span> <span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">lazyPagingItems</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">pager</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">collectAsLazyPagingItems</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-n">LazyVerticalGrid</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">columns</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">GridCells</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">Fixed</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-m">2</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-c1">// Here we use the standard items API</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">items</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-w"> </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-n">lazyPagingItems</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">itemCount</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Here we use the new itemKey extension on LazyPagingItems to</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// handle placeholders automatically, ensuring you only need to provide</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// keys for real items</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-n">lazyPagingItems</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">itemKey</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-p">.</span><span class="devsite-syntax-na">uniqueId</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">},</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// Similarly, itemContentType lets you set a custom content type for each item</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">contentType</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">lazyPagingItems</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">itemContentType</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"contentType"</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-n">index</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">-</span>&gt; <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// As the standard items call provides only the index, we get the item</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// directly from our lazyPagingItems</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">item</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">lazyPagingItems</span><span class="devsite-syntax-o">[</span><span class="devsite-syntax-n">index</span><span class="devsite-syntax-o">]</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">PagingItem</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">item</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">item</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>For more examples of using these new APIs, please see <a href="https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:paging/paging-compose/samples/src/main/java/androidx/paging/compose/samples/PagingFoundationSample.kt?q=PagingFoundationSample">our samples</a>.</p> <p>While these changes do make the <code translate="no" dir="ltr">LazyColumn</code> and <code translate="no" dir="ltr">LazyRow</code> examples a few lines longer, we felt that consistency across all lazy layouts was an important factor for those using Paging Compose going forward. For that reason, the existing extensions to <code translate="no" dir="ltr">LazyListScope</code> have now been deprecated. (<a href="https://android-review.googlesource.com/#/q/I0c45926ecf7fbaa7b68fba7bb1201cdf6f13105d">I0c459</a>, <a href="https://android-review.googlesource.com/#/q/I92c8ffc330fd98f9fb31fe14db2da7a3f7a3b547">I92c8f</a>, <a href="https://issuetracker.google.com/issues/276989796">b/276989796</a>)</p> <aside class="note"><strong>Note:</strong><span> while the deprecated <code translate="no" dir="ltr">items</code> API has a clear equivalent, the quick fix for <code translate="no" dir="ltr">itemsIndexed</code> may still leave your code in a state where it does not compile immediately as generating keys and content types based on indices is no longer possible or recommended as this pattern is susceptible to errors when item indices shift due to prepends (i.e., item 0 actually becomes item 20 due to prepending 20 additional items). It is always recommended to use <code translate="no" dir="ltr">items</code> when using Paging Compose.</span></aside> <p><strong>API Changes</strong></p> <ul> <li>To ease the migration to the new APIs, the <code translate="no" dir="ltr">items</code> and <code translate="no" dir="ltr">itemsIndexed</code> extension functions on <code translate="no" dir="ltr">LazyListScope</code> now support a <code translate="no" dir="ltr">contentType</code> parameter, mirroring the support in the new APIs. (<a href="https://android-review.googlesource.com/#/q/Ib19181ac9cfd734c940c015a605c03440bbdfda6">Ib1918</a>, <a href="https://issuetracker.google.com/issues/255283378">b/255283378</a>)</li> </ul> <p><strong>Dependency Updates</strong></p> <ul> <li>Paging Compose has updated its dependency from Compose 1.0.5 to Compose 1.2.1. (<a href="https://android-review.googlesource.com/#/q/Ib19181ac9cfd734c940c015a605c03440bbdfda6">Ib1918</a>, <a href="https://issuetracker.google.com/issues/255283378">b/255283378</a>)</li> </ul> <h3 id="1.0.0-alpha18" data-text="Version 1.0.0-alpha18" tabindex="-1">Version 1.0.0-alpha18</h3> <p>February 8, 2023</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha18</code> is released with no changes. <a href="https://android.googlesource.com/platform/frameworks/support/+log/548c8ac2570ae6cf15798fea1380491f7d93796b..7d3ac1ab1206c01fae3ebb500b5b942636070155/paging/paging-compose">Version 1.0.0-alpha18 contains these commits.</a></p> <h3 id="1.0.0-alpha17" data-text="Version 1.0.0-alpha17" tabindex="-1">Version 1.0.0-alpha17</h3> <p>October 24, 2022</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha17</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/bea814b246f89ff7244e3c6b0648f0b57e47897c..548c8ac2570ae6cf15798fea1380491f7d93796b/paging/paging-compose">Version 1.0.0-alpha17 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Add support for a custom <code translate="no" dir="ltr">CoroutineContext</code> when calling <code translate="no" dir="ltr">collectLazyPagingItems</code>. (<a href="https://android-review.googlesource.com/#/q/I7a57418bcbd9ab86ddcbed3313b00aa82bf2398f">I7a574</a>, <a href="https://issuetracker.google.com/issues/243182795">b/243182795</a>, <a href="https://issuetracker.google.com/issues/233783862">b/233783862</a>)</li> </ul> <h3 id="1.0.0-alpha16" data-text="Version 1.0.0-alpha16" tabindex="-1">Version 1.0.0-alpha16</h3> <p>August 10, 2022</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha16</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/7cbb37cc779160b89644d03e042c129d0ce025d2..bea814b246f89ff7244e3c6b0648f0b57e47897c/paging/paging-compose">Version 1.0.0-alpha16 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Paging now provides logs via the <code translate="no" dir="ltr">LazyPagingItems</code> class to expose debugging information collected from PagingData.</li> <li>The logs can be enabled via the <code translate="no" dir="ltr">adb shell</code> command <code translate="no" dir="ltr">adb shell setprop log.tag.Paging [DEBUG|VERBOSE]</code>. ([b/235527159}(https://issuetracker.google.com/issues/235527159))</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed the missing <code translate="no" dir="ltr">PagingDataDiffer</code> constructor error when using <code translate="no" dir="ltr">paging-compose:1.0.0-alpha15</code> with <code translate="no" dir="ltr">paging-common:3.1.1</code> or older.(<a href="https://issuetracker.google.com/issues/235256201">b/235256201</a>,<a href="https://issuetracker.google.com/issues/239868768">b/239868768</a>)</li> </ul> <h3 id="1.0.0-alpha15" data-text="Version 1.0.0-alpha15" tabindex="-1">Version 1.0.0-alpha15</h3> <p>June 1, 2022</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha15</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/db0888af4fa9a8eaeaf55cc1f120724bc67bdb20..7cbb37cc779160b89644d03e042c129d0ce025d2/paging/paging-compose">Version 1.0.0-alpha15 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added constructors for <code translate="no" dir="ltr">PagingDataAdapter</code> and <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> which accept <code translate="no" dir="ltr">CoroutineContext</code> instead of <code translate="no" dir="ltr">CoroutineDispatcher</code>. (<a href="https://android-review.googlesource.com/#/q/Idc8784ff12a2d6e4a617bae51c7053582c5f1986">Idc878</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">LazyPagingItems</code> now sets the initial <code translate="no" dir="ltr">loadState</code> to have a <code translate="no" dir="ltr">LoadState.Loading</code> refresh. (<a href="https://android-review.googlesource.com/#/q/I55043244f92c8029e4667df2e23c5813dcf2f729">I55043</a>, <a href="https://issuetracker.google.com/issues/224855902">b/224855902</a>)</li> </ul> <h3 id="1.0.0-alpha14" data-text="Version 1.0.0-alpha14" tabindex="-1">Version 1.0.0-alpha14</h3> <p>October 13, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha14</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/1f6bc4d47b7be46a5af151ed726e84db0a1cf9f9..db0888af4fa9a8eaeaf55cc1f120724bc67bdb20/paging/paging-compose">Version 1.0.0-alpha14 contains these commits.</a></p> <h3 id="1.0.0-alpha13" data-text="Version 1.0.0-alpha13" tabindex="-1">Version 1.0.0-alpha13</h3> <p>September 29, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha13</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/97264aa4532db7f7db1ffb3f42f3a9204971dbfc..1f6bc4d47b7be46a5af151ed726e84db0a1cf9f9/paging/paging-compose">Version 1.0.0-alpha13 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">LazyPagingItems.snapshot()</code> function was replaced with<code translate="no" dir="ltr">LazyPagingItems.itemSnapshotList</code> property (<a href="https://android-review.googlesource.com/#/q/Ie2da86edc45827f8282b524b5bb1bfe8f349a9da">Ie2da8</a>)</li> <li>Deprecated <code translate="no" dir="ltr">LazyPagingItems.getAsState()</code> was removed (<a href="https://android-review.googlesource.com/#/q/Ie65e417e6fd3c20553dcc799bcceffdf00dfc98a">Ie65e4</a>)</li> </ul> <h3 id="paging-compose-1.0.0-alpha12" data-text="Version 1.0.0-alpha12" tabindex="-1">Version 1.0.0-alpha12</h3> <p>July 21, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha12</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/19ae3a88ff0824d615355b492cb56049e16991f2..97264aa4532db7f7db1ffb3f42f3a9204971dbfc/paging/paging-compose">Version 1.0.0-alpha12 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">items(lazyPagingItems)</code> and <code translate="no" dir="ltr">itemsIndexed(lazyPagingItems)</code> used to connect Paging with <code translate="no" dir="ltr">LazyColumn/Row</code> now accept the option key param which allows you to specify a stable key representing the item. You can read more about keys <a href="https://developer.android.com/jetpack/compose/lists#item-keys">here.</a> (<a href="https://android-review.googlesource.com/#/q/I7986d308b9588a43bb11fe7ac4f3b420bbafda70">I7986d</a>)</li> <li>Function <code translate="no" dir="ltr">lazyPagingItems.getAsState(index)</code> is now deprecated. Use <code translate="no" dir="ltr">lazyPagingItems[index]</code> instead. (<a href="https://android-review.googlesource.com/#/q/I086cbb113a0c4ddcc333c78fa1346612e4496a5b">I086cb</a>, <a href="https://issuetracker.google.com/issues/187339372">b/187339372</a>)</li> </ul> <h3 id="1.0.0-alpha11" data-text="Version 1.0.0-alpha11" tabindex="-1">Version 1.0.0-alpha11</h3> <p>June 30, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha11</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/86ff5b4bb956431ec884586ce0aea0127e189ec4..19ae3a88ff0824d615355b492cb56049e16991f2/paging/paging-compose">Version 1.0.0-alpha11 contains these commits.</a></p> <h3 id="1.0.0-alpha10" data-text="Version 1.0.0-alpha10" tabindex="-1">Version 1.0.0-alpha10</h3> <p>June 2, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha10</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b648147c5fdfc5ecbad57e40e2dc0c69aa23bf12..86ff5b4bb956431ec884586ce0aea0127e189ec4/paging/paging-compose">Version 1.0.0-alpha10 contains these commits.</a></p> <h3 id="1.0.0-alpha09" data-text="Version 1.0.0-alpha09" tabindex="-1">Version 1.0.0-alpha09</h3> <p>May 18, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha09</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/4b6cff92e45f1d4467086aa2c6aa0248b4883950..b648147c5fdfc5ecbad57e40e2dc0c69aa23bf12/paging/paging-compose">Version 1.0.0-alpha09 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>LazyPagingItems&#39; itemCount and item getter are now observable which allows it to be used with LazyVerticalGrid as well (<a href="https://android-review.googlesource.com/#/q/Ie24468ec51660c144acab71e8e520ac09d00b023">Ie2446</a>, <a href="https://issuetracker.google.com/issues/171872064">b/171872064</a>, <a href="https://issuetracker.google.com/issues/168285687">b/168285687</a>)</li> </ul> <p><strong>Compose Compatibility</strong></p> <ul> <li><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha09</code> is only compatible with Compose version <code translate="no" dir="ltr">1.0.0-beta07</code> and above.</li> </ul> <h3 id="1.0.0-alpha08" data-text="Version 1.0.0-alpha08" tabindex="-1">Version 1.0.0-alpha08</h3> <p>February 24, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha08</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/602cf9bff5e74e4355760aa47d3fc73a2e6d779b..4b6cff92e45f1d4467086aa2c6aa0248b4883950/paging/paging-compose">Version 1.0.0-alpha08 contains these commits.</a></p> <p>Updated to integrate with Compose 1.0.0-beta01.</p> <aside class="note"><strong>Note:</strong><span> Paging Compose 1.0.0-alpha08 is only compatible with Compose 1.0.0-beta01.</span></aside> <h3 id="compose-1.0.0-alpha07" data-text="Version 1.0.0-alpha07" tabindex="-1">Version 1.0.0-alpha07</h3> <p>February 10, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha07</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6950aab50fe6c9f7e9d97cf865161f2d3999eb9e..602cf9bff5e74e4355760aa47d3fc73a2e6d779b/paging/paging-compose">Version 1.0.0-alpha07 contains these commits.</a></p> <p>Updated to integrate with Compose alpha12.</p> <h3 id="compose-1.0.0-alpha06" data-text="Version 1.0.0-alpha06" tabindex="-1">Version 1.0.0-alpha06</h3> <p>January 28, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6207afb1646d302c5d29c2c67d332b48db87fb27..aee18b103203a91ee89df91f0af5df2ecff356d6/paging/paging-compose">Version 1.0.0-alpha06 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <p>Updated to depend on Compose 1.0.0-alpha11.</p> <h3 id="compose-1.0.0-alpha05" data-text="Version 1.0.0-alpha05" tabindex="-1">Version 1.0.0-alpha05</h3> <p>January 13, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/72f02c12e4709ab41ae0fea9a8a668d5267a1df8..6207afb1646d302c5d29c2c67d332b48db87fb27/paging/paging-compose">Version 1.0.0-alpha05 contains these commits.</a></p> <p>Updated to depend on Compose 1.0.0-alpha10.</p> <h3 id="compose-1.0.0-alpha04" data-text="Version 1.0.0-alpha04" tabindex="-1">Version 1.0.0-alpha04</h3> <p>December 16, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/10b5e9fd366c1c413d5576aed50a305d300938e1..72f02c12e4709ab41ae0fea9a8a668d5267a1df8/paging/paging-compose">Version 1.0.0-alpha04 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Updated the convenience properties, <code translate="no" dir="ltr">CombinedLoadStates.refresh</code>, <code translate="no" dir="ltr">CombinedLoadStates.prepend</code>, <code translate="no" dir="ltr">CombinedLoadStates.append</code> to only transition from <code translate="no" dir="ltr">Loading</code> to <code translate="no" dir="ltr">NotLoading</code> after both mediator and source load states are <code translate="no" dir="ltr">NotLoading</code> to ensure the remote update has been applied. (<a href="https://android-review.googlesource.com/#/q/I656192632c4ce073ac8e54a3f1c597bbbae77002">I65619</a>)</li> </ul> <h3 id="compose-1.0.0-alpha03" data-text="Version 1.0.0-alpha03" tabindex="-1">Version 1.0.0-alpha03</h3> <p>December 2, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2d49f9fa892a0d067580a871f3aa0cd6764f4c3b..10b5e9fd366c1c413d5576aed50a305d300938e1/paging/paging-compose">Version 1.0.0-alpha03 contains these commits.</a></p> <ul> <li>Updated to match Compose 1.0.0-alpha08.</li> </ul> <h3 id="compose-1.0.0-alpha02" data-text="Version 1.0.0-alpha02" tabindex="-1">Version 1.0.0-alpha02</h3> <p>November 11, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/234e23e470a5e7f81291f6acd12d538146dc010b..2d49f9fa892a0d067580a871f3aa0cd6764f4c3b/paging/compose">Version 1.0.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">.peek()</code>, <code translate="no" dir="ltr">.snapshot()</code>, <code translate="no" dir="ltr">.retry()</code> and <code translate="no" dir="ltr">.refresh()</code> methods to <code translate="no" dir="ltr">LazyPagingItem</code>s which expose the same functionality available in <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> / <code translate="no" dir="ltr">PagingDataAdapter</code> (<a href="https://android-review.googlesource.com/#/q/Iddfe8a8dc9339bf4aff86f562b94eabdf8f92056">Iddfe8</a>, <a href="https://issuetracker.google.com/issues/172041660">b/172041660</a>)</li> </ul> <h3 id="compose-1.0.0-alpha01" data-text="Version 1.0.0-alpha01" tabindex="-1">Version 1.0.0-alpha01</h3> <p>October 28, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-compose:1.0.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/234e23e470a5e7f81291f6acd12d538146dc010b/paging/compose">Version 1.0.0-alpha01 contains these commits.</a></p> <p><strong>New Features</strong></p> <p>The <code translate="no" dir="ltr">paging-compose</code> artifact provides integration between <a href="/paging">The Paging Library</a> and <a href="/jetpack/compose">Jetpack Compose</a>. A simple 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-nd">@Composable</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nd">@OptIn</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ExperimentalLazyDsl</span><span class="devsite-syntax-o">::</span><span class="devsite-syntax-n">class</span><span class="devsite-syntax-p">)</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">ItemsDemo</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">flow</span><span class="devsite-syntax-p">:</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">Flow&lt;PagingData&lt;String&gt;</span>&gt;<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-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">lazyPagingItems</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">flow</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">collectAsLazyPagingItems</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">items</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">lazyPagingItems</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 is </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-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> <h2 id="version_301_3" data-text="Version 3.0.1" tabindex="-1">Version 3.0.1</h2> <h3 id="3.0.1" data-text="Version 3.0.1" tabindex="-1">Version 3.0.1</h3> <p>July 21, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5651d1dbcb19d1b2d3cc50e8c379a8cc9f6ee1ad..650bc3241df3e2336ba181a08d14611087c73083/paging">Version 3.0.1 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Accessing <code translate="no" dir="ltr">PagedList.dataSource</code> from the initial value produced by <code translate="no" dir="ltr">LivePagedList</code> or <code translate="no" dir="ltr">RxPagedList</code> will no longer incorrectly throw an IllegalStateException (<a href="https://android-review.googlesource.com/#/q/I96707a477f347bd19e7aeccdb52eca39d637297a">I96707</a>)</li> </ul> <h2 id="version_300_3" data-text="Version 3.0.0" tabindex="-1">Version 3.0.0</h2> <h3 id="3.0.0" data-text="Version 3.0.0" tabindex="-1">Version 3.0.0</h3> <p>May 5, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ce0bda2d989654e33f843b4c7cb263afaca28b14..5651d1dbcb19d1b2d3cc50e8c379a8cc9f6ee1ad/paging">Version 3.0.0 contains these commits.</a></p> <p><strong>Major features of 3.0.0</strong></p> <p>The majority of the existing API from Paging 2.x.x has been deprecated in favor of the new Paging 3 APIs to bring the following improvements:</p> <ul> <li>First-class support for Kotlin coroutines and Flow</li> <li>Support for cancellation</li> <li>Built-in load state and error signals</li> <li>Retry + refresh functionality</li> <li>All three DataSource subclasses have been combined into a unified PagingSource class</li> <li>Custom page transformations including a built-in one for adding separators</li> <li>Loading state headers and footers</li> </ul> <h3 id="3.0.0-rc01" data-text="Version 3.0.0-rc01" tabindex="-1">Version 3.0.0-rc01</h3> <p>April 21, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-rc01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/5c42896eb6591b09e3952030fb7ea8d9b8c42713..ce0bda2d989654e33f843b4c7cb263afaca28b14/paging">Version 3.0.0-rc01 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed an issue where Paging would sometimes send no-op differ events to RecyclerView, which could cause certain listeners to trigger early. (<a href="https://android-review.googlesource.com/#/q/Ic507fa793cb22ac9f8880a8f8841f8e6caa197f4">Ic507f</a>, <a href="https://issuetracker.google.com/issues/182510751">b/182510751</a>)</li> </ul> <h3 id="3.0.0-beta03" data-text="Version 3.0.0-beta03" tabindex="-1">Version 3.0.0-beta03</h3> <p>March 24, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-beta03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/52fbd7ed5b07ca4431fa828325a1f8da45b02e51..5c42896eb6591b09e3952030fb7ea8d9b8c42713/paging">Version 3.0.0-beta03 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>We&#39;ve revamped how placeholders are handled when list is reloaded to prevent unexpected jumps in RecyclerView. See <a href="https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:paging/runtime/src/main/java/androidx/paging/NullPaddedDiffing.md">NullPaddedDiffing.md</a> for details. (<a href="https://android-review.googlesource.com/#/q/If1490f5bc833a61793d27eeaae9b37b26153df87">If1490</a>, <a href="https://issuetracker.google.com/issues/170027529">b/170027529</a>, <a href="https://issuetracker.google.com/issues/177338149">b/177338149</a>)</li> <li>The various PagedList builders (old compatibility path) no longer incorrectly synchronously call <code translate="no" dir="ltr">DataSource.Factory.create()</code> on Main thread when <code translate="no" dir="ltr">.build()</code> is called. (<a href="https://issuetracker.google.com/182798948">b/182798948</a>)</li> </ul> <h3 id="3.0.0-beta02" data-text="Version 3.0.0-beta02" tabindex="-1">Version 3.0.0-beta02</h3> <p>March 10, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-beta02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/602cf9bff5e74e4355760aa47d3fc73a2e6d779b..52fbd7ed5b07ca4431fa828325a1f8da45b02e51/paging">Version 3.0.0-beta02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Rx3 extensions now correctly propagate <code translate="no" dir="ltr">@ExperimentalCoroutinesApi</code> Opt-In requirement. Previously they were marked on the <code translate="no" dir="ltr">@get</code> method, which is ignored by the Kotlin Compiler due to: https://youtrack.jetbrains.com/issue/KT-45227 (<a href="https://android-review.googlesource.com/#/q/I5733cdcebf531126d4aa6bef66daefe53a8d7177">I5733c</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> <li>Fixed a bug causing <code translate="no" dir="ltr">PagingState</code> to always be <code translate="no" dir="ltr">null</code> when remote refresh is called.</li> <li>Fixed a bug where empty pages returned by PagingSource could prevent Paging from fetching again to fulfill <code translate="no" dir="ltr">prefetchDistance</code> causing Paging to get “stuck”.</li> </ul> <aside class="note"><strong>Note:</strong><span> Users using PagingSource provided by Room should upgrade to 2.3.0-beta03, which fixes a critical threading bug that could cause Paging to crash due to creating PagingSource on the main thread.</span></aside> <h3 id="3.0.0-beta01" data-text="Version 3.0.0-beta01" tabindex="-1">Version 3.0.0-beta01</h3> <p>February 10, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-beta01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/aee18b103203a91ee89df91f0af5df2ecff356d6..602cf9bff5e74e4355760aa47d3fc73a2e6d779b/paging">Version 3.0.0-beta01 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Rx2 and Rx3 wrappers now expose the experimental annotation it depends on. If you are using the Rx compat wrappers in paging-rxjava2 or paging-rxjava3, you will now need to annotate usages with <code translate="no" dir="ltr">@OptIn(ExperimentalCoroutinesApi::class)</code> (<a href="https://android-review.googlesource.com/#/q/Ib1f9d578ee9eb4c1bdf6c8bbabc99c978398c584">Ib1f9d</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed <code translate="no" dir="ltr">IndexOutOfBoundsException: Inconsistency detected</code> sometimes thrown when using v2 <code translate="no" dir="ltr">DataSource</code> APIs through compatibility paths</li> <li><code translate="no" dir="ltr">isInvalid</code> call during initialization of <code translate="no" dir="ltr">DataSource</code> when used via compatibility paths are now correctly launched on fetchDispatcher instead of on the main thread. This fixes an <code translate="no" dir="ltr">IllegalStateException</code> due to Db access on the main thread when using Room’s <code translate="no" dir="ltr">PagingSource</code> implementation.</li> </ul> <h3 id="3.0.0-alpha13" data-text="Version 3.0.0-alpha13" tabindex="-1">Version 3.0.0-alpha13</h3> <p>January 27, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha13</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/6207afb1646d302c5d29c2c67d332b48db87fb27..aee18b103203a91ee89df91f0af5df2ecff356d6/paging">Version 3.0.0-alpha13 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">PagingSource.getRefreshKey</code> is no longer optional to implement, it is now an abstract function without a default implementation. Migrating users can either continue returning the default implementation, which simply returns <code translate="no" dir="ltr">null</code>, but <code translate="no" dir="ltr">getRefreshKey()</code> should have a real implementation returning a key based on user&#39;s current scroll position that allows Paging to continue loading centered around the viewport via <code translate="no" dir="ltr">PagingState.anchorPosition</code> if possible. (<a href="https://android-review.googlesource.com/#/q/I4339a1a2962b6883451511439012d084ada84651">I4339a</a>)</li> <li><code translate="no" dir="ltr">InvalidatingPagingSourceFactory</code> is now a final class (<a href="https://android-review.googlesource.com/#/q/Ia3b0a3540f14606f120708c542071fa72030afed">Ia3b0a</a>)</li> <li>Allow configuration of terminal separator (header / footer) behavior with an additional optional SeparatorType parameter. The two options are: <ul> <li><code translate="no" dir="ltr">FULLY_COMPLETE</code> - existing behavior; wait for both PagingSource and RemoteMediator to mark endOfPaginationReached before adding terminal separators. If RemoteMediator is not used, remote loadState is ignored. This is primarily useful if you only want to show section separators when the section is fully loaded, including fetching from remote source e.g., network.</li> <li><code translate="no" dir="ltr">SOURCE_COMPLETE</code> - only wait for PagingSource to mark endOfPaginationReached even if RemoteMediator is used. This allows headers and footers to be presented synchronously with the initial load, which prevents users from needing to scroll to see terminal separators. (<a href="https://android-review.googlesource.com/#/q/Ibe9938d069e66d0deae806dc44684f3a05e651a0">Ibe993</a>, <a href="https://issuetracker.google.com/issues/174700218">b/174700218</a>)</li> </ul></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a rare memory leak which happens when a PagingSource is invalidated before PageFetcher can even begin to start loading from it. (<a href="https://android-review.googlesource.com/#/q/I9606bc3c393a40d732bf633b721b13b23c46db02">I9606b</a>, <a href="https://issuetracker.google.com/issues/174625633">b/174625633</a>)</li> </ul> <h3 id="3.0.0-alpha12" data-text="Version 3.0.0-alpha12" tabindex="-1">Version 3.0.0-alpha12</h3> <p>January 13, 2021</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha12</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/dd3c8e9c2424b78e44f55db599251891fd1cadb4..6207afb1646d302c5d29c2c67d332b48db87fb27/paging">Version 3.0.0-alpha12 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>InvalidatingPagingSourceFactory is no longer an abstract class as it never had any abstract methods. (<a href="https://android-review.googlesource.com/#/q/I4a8c48ecf20b539a058f90e8675554a671b4a653">I4a8c4</a>)</li> <li>Added an overload of .cachedIn() that accepts ViewModel instead of Lifecycle or CoroutineScope for Java users. (<a href="https://android-review.googlesource.com/#/q/I97d815a9a2750eaae3445ea9cb222c14f5125a0b">I97d81</a>, <a href="https://issuetracker.google.com/issues/175332619">b/175332619</a>)</li> <li>Allow Java callers to use PagingData transform operations in an async way, by accepting an Executor into transform operator arguments. All of the -Sync transform operators have the -Sync suffix removed now, and Kotlin Coroutine users will need to disambiguate by calling the extension function which accepts a suspending block instead. All PagingData transformation operators have been moved to extensions under the static PagingDataTransforms class. Java users will need to call them via static helpers e.g., <code translate="no" dir="ltr">PagingDataTransforms.map(pagingData, transform)</code> For Kotlin users, the syntax is the same but you&#39;ll need to import the function. (<a href="https://android-review.googlesource.com/#/q/If688562d07d96e943b1abfa3690042132db1c4d0">If6885</a>, <a href="https://issuetracker.google.com/issues/172895919">b/172895919</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a bug where <code translate="no" dir="ltr">RemoteMediator.load()</code> would not be called during <code translate="no" dir="ltr">adapter.refresh()</code> if the end of pagination had already been reached.</li> </ul> <h3 id="3.0.0-alpha11" data-text="Version 3.0.0-alpha11" tabindex="-1">Version 3.0.0-alpha11</h3> <p>December 16, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha11</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/38a668d3ef95f40ad28d6e735a2c3eb95ae4cf63..dd3c8e9c2424b78e44f55db599251891fd1cadb4/paging">Version 3.0.0-alpha11 contains these commits.</a></p> <p><strong>New Features</strong></p> <ul> <li>Saved state support added for the following basic use cases (full support, especially in the layered source case is still a work in progress): <ul> <li>flow is cached and application is not killed (e.g. flow is cached in a view model and activity is recreated in process)</li> <li>paging source is counted, placeholders are enabled and the layout is not staggered.</li> </ul></li> </ul> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">PagingSource.getRefreshKey()</code> is now stable API (<a href="https://android-review.googlesource.com/#/q/I22f6fb44ec84b33f4ed14fc7d4a3783795832c52">I22f6f</a>, <a href="https://issuetracker.google.com/issues/173530980">b/173530980</a>)</li> <li><code translate="no" dir="ltr">PagingSource.invalidate</code> is no longer an open function. If you need to get notified when invalidation happens, consider calling the registerInvalidatedCallback method instead of overriding invalidate. (<a href="https://android-review.googlesource.com/#/q/I628d9893a4ac55409aa24e49de1e2d2c35beda4f">I628d9</a>, <a href="https://issuetracker.google.com/issues/173029013">b/173029013</a>, <a href="https://issuetracker.google.com/issues/137971356">b/137971356</a>)</li> <li>Pager now has a single experimental constructor alongside its regular constructors, rather than leaking experimental APIs into non-experimental public API via the opt-in annotation. (<a href="https://android-review.googlesource.com/#/q/I9dc614204842258a72be000c6e37846fb85470c1">I9dc61</a>, <a href="https://issuetracker.google.com/issues/174531520">b/174531520</a>)</li> <li>Updated the convenience properties, <code translate="no" dir="ltr">CombinedLoadStates.refresh</code>, <code translate="no" dir="ltr">CombinedLoadStates.prepend</code>, <code translate="no" dir="ltr">CombinedLoadStates.append</code> to only transition from <code translate="no" dir="ltr">Loading</code> to <code translate="no" dir="ltr">NotLoading</code> after both mediator and source load states are <code translate="no" dir="ltr">NotLoading</code> to ensure the remote update has been applied. (<a href="https://android-review.googlesource.com/#/q/I656192632c4ce073ac8e54a3f1c597bbbae77002">I65619</a>)</li> <li><p>LoadParams.pageSize has been removed (it was already deprecated). The recommendation is to use <code translate="no" dir="ltr">LoadParams.loadSize</code> in your PagingSource.</p> <p><code translate="no" dir="ltr">LoadParams.loadSize</code> is always equal to the <code translate="no" dir="ltr">PagingConfig.pageSize</code> except for the initial load call where it is equal to the <code translate="no" dir="ltr">PagingConfig.initialLoadSize</code>.</p> <p>If you are testing your Paging2 DataSource without using a Pager or PagedList, <code translate="no" dir="ltr">pageSize</code> may not match the <code translate="no" dir="ltr">PagingConfig.pageSize</code> if you are also setting <code translate="no" dir="ltr">initialLoadSize</code>. If it is important for your tests, try using a Pager/PagedList instead which will internally set the correct PageSize for your DataSource load methods. (<a href="https://android-review.googlesource.com/#/q/I98ac735090f65919282c4afbd005bbd27b9af0f3">I98ac7</a>, <a href="https://issuetracker.google.com/issues/149157296">b/149157296</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a crash due to IllegalStateException when using separators with PagingConfig.maxSize set. (<a href="https://android-review.googlesource.com/#/q/I0ed33e86d3a09e1fb5f157c841331238d7ff83b4">I0ed33</a>, <a href="https://issuetracker.google.com/issues/174787528">b/174787528</a>)</li> <li>Fixed a bug where load state for PREPEND / APPEND would not update to <code translate="no" dir="ltr">NotLoading(endOfPaginationReached = true)</code> immediately after initial load if RemoteMediator was set (<a href="https://android-review.googlesource.com/#/q/I8cf5aec7d1b8499758d4445e3c2ede65a2447df5">I8cf5a</a>)</li> <li>Fixed a bug where presenter-side APIs such as .snapshot(), .peek(), etc., would return the previous (out-of-date) list within ListUpdateCallback updates.</li> <li>Fixed a bug where Separators operators would not add headers or footers when used with RemoteMediator</li> <li>Fixed a bug where LoadState updates to NotLoading for RemoteMediator would get stuck in the Loading state</li> <li>Fixed a bug where the Paging2.0 compatibility API, <code translate="no" dir="ltr">.asPagingSourceFactory()</code>, could cause the backing <code translate="no" dir="ltr">DataSource</code> to be initialized on the incorrect CoroutineDispatcher. This resolves a crash and possible ANR cases, especially when using Room’s current implementation of PagingSource, which uses this compatibility path.</li> </ul> <h3 id="3.0.0-alpha10" data-text="Version 3.0.0-alpha10" tabindex="-1">Version 3.0.0-alpha10</h3> <p>December 2, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha10</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/2d49f9fa892a0d067580a871f3aa0cd6764f4c3b..38a668d3ef95f40ad28d6e735a2c3eb95ae4cf63/paging">Version 3.0.0-alpha10 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><p>The deprecated <code translate="no" dir="ltr">dataRefreshFlow</code> and <code translate="no" dir="ltr">dataRefreshListener</code> APIs have been removed as they are redundant with loadStateFlow / Listener updates. For those migrating, the loadStateFlow equivalent is:</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">loadStateFlow</span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">distinctUntilChangedBy</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-p">.</span><span class="devsite-syntax-na">refresh</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-na">filter</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-p">.</span><span class="devsite-syntax-na">refresh</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-k">is</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">NotLoading</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <p>(<a href="https://android-review.googlesource.com/#/q/Ib55709c3f560711200a9eac5a4931d57c76053af">Ib5570</a>, <a href="https://issuetracker.google.com/issues/173530908">b/173530908</a>)</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>endOfPaginationReached for RemoteMediator <code translate="no" dir="ltr">REFRESH</code> now correctly propagate to LoadState updates and prevents remote <code translate="no" dir="ltr">APPEND</code> and <code translate="no" dir="ltr">PREPEND</code> from triggering. (<a href="https://android-review.googlesource.com/#/q/I94a3f787182eee6c5875b11e8c861d5e6e6e9e22">I94a3f</a>, <a href="https://issuetracker.google.com/issues/155290248">b/155290248</a>)</li> <li>Presenting an empty list either due to empty initial page or heavy filtering will no longer prevent Paging from kicking off <code translate="no" dir="ltr">PREPEND</code> or <code translate="no" dir="ltr">APPEND</code> loads. (<a href="https://android-review.googlesource.com/#/q/I3e702b6daf002f6dd3010c9b6f8867caf95135e0">I3e702</a>, <a href="https://issuetracker.google.com/issues/168169730">b/168169730</a>)</li> <li>Fixed an issue where <code translate="no" dir="ltr">getRefreshKey</code> does not get called on subsequent generations of PagingSource when invalidations occur rapidly. (<a href="https://android-review.googlesource.com/#/q/I4546070c31ed73fd285754707b8b480cba206b93">I45460</a>, <a href="https://issuetracker.google.com/issues/170027530">b/170027530</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>A new abstract class InvalidatingPagingSourceFactory has been added with an <code translate="no" dir="ltr">.invalidate()</code> API that forwards invalidate to all of the PagingSources it emits. Thanks to <a href="https://github.com/claraf3">@claraf3</a>! (<a href="https://android-review.googlesource.com/#/q/Ie71fc1cc974dbc72f42572234ea9053e31b44039">Ie71fc</a>, <a href="https://issuetracker.google.com/issues/160716447">b/160716447</a>)</li> </ul> <p><strong>Known Issues</strong></p> <ul> <li>Headers and footers from the .insertSeparators() transform may not appear immediately when using RemoteMediator <a href="https://issuetracker.google.com/172254056">b/172254056</a></li> <li>Using RemoteMediator can cause remote <code translate="no" dir="ltr">LoadState</code> to get stuck if invalidation and <code translate="no" dir="ltr">PagingSource.load(LoadParams.Refresh(...))</code> completes before <code translate="no" dir="ltr">RemoteMediator.load()</code> returns <a href="https://issuetracker.google.com/173717820">b/173717820</a></li> </ul> <h3 id="3.0.0-alpha09" data-text="Version 3.0.0-alpha09" tabindex="-1">Version 3.0.0-alpha09</h3> <p>November 11, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha09</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/234e23e470a5e7f81291f6acd12d538146dc010b..2d49f9fa892a0d067580a871f3aa0cd6764f4c3b/paging">Version 3.0.0-alpha09 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Fully deprecate dataRefreshFlow / Listener methods with a replaceWith clause. (<a href="https://android-review.googlesource.com/#/q/I6e2dd23b100bc1186dc652e5076b2d15b191c436">I6e2dd</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix for <code translate="no" dir="ltr">IllegalArgumentException</code> being throw when using separators with RemoteMediator and an invalidate is triggered while a remote load that would return endOfPagination is still running (<a href="https://android-review.googlesource.com/#/q/I3a260ff98f07f5be615192e31ce1dc533c8b75b8">I3a260</a>)</li> </ul> <h3 id="3.0.0-alpha08" data-text="Version 3.0.0-alpha08" tabindex="-1">Version 3.0.0-alpha08</h3> <p>October 28, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha08</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/8d1cacd5e482a2b20351525ac2b630ce49911228..234e23e470a5e7f81291f6acd12d538146dc010b/paging">Version 3.0.0-alpha08 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>The Kotlin / Java variants of <code translate="no" dir="ltr">DataSource.InvalidatedCallback</code> have been combined by enabling SAM-conversions in Kotlin via functional interface (available in Kotlin 1.4). This also fixes a bug where the kotlin variant of invalidate callbacks were not called after transformed by <code translate="no" dir="ltr">.map</code> or <code translate="no" dir="ltr">.mapByPage</code>. (<a href="https://android-review.googlesource.com/#/q/I1f244498bd9f78bfed2744d9e6c9d5c1c1448971">I1f244</a>, <a href="https://issuetracker.google.com/issues/165313046">b/165313046</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Paging’s interaction with ViewPager has been improved considerably. Specifically, Paging will no longer cancel a <code translate="no" dir="ltr">RemoteMediator#load</code> call due to a page invalidation. It will also no longer make an append/prepend load request, <em>if REFRESH is required</em>, until REFRESH request completes successfully. (<a href="https://android-review.googlesource.com/#/q/I6390be0c0c1073005456f928a2a8afa81c16d3ef">I6390b</a>, <a href="https://issuetracker.google.com/issues/162252536">b/162252536</a>)</li> <li>API lint check for MissingGetterMatchingBuilder is enabled for androidx (<a href="https://android-review.googlesource.com/#/q/I4bbeacf9869d8338a3d7086acb40bc56ec68c3f9">I4bbea</a>, <a href="https://issuetracker.google.com/issues/138602561">b/138602561</a>)</li> <li>Fixed a bug where <code translate="no" dir="ltr">.withLoadState*</code> <code translate="no" dir="ltr">ConcatAdapter</code> helpers would crash due to notifying RecyclerView from background thread (<a href="https://android-review.googlesource.com/#/q/I18bb54c857dfc5098cd36b5c22dce386c4776d3d">I18bb5</a>, <a href="https://issuetracker.google.com/issues/170988309">b/170988309</a>)</li> <li>Fixed a bug where loading a very small non-empty page would sometimes prevent prefetch from triggering loads correctly.<a href="https://android-review.googlesource.com/q/Iffda3a0eb7abe162045893367b4781daf75adb01">Iffda3</a> <a href="https://issuetracker.google.com/169259468">b/169259468</a></li> </ul> <h3 id="3.0.0-alpha07" data-text="Version 3.0.0-alpha07" tabindex="-1">Version 3.0.0-alpha07</h3> <p>October 1, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha07</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/31022a2dda22705843be1199c786552a6f9f875d..f5a2c7477391539d8bc9f65a8f0db1e8a7bf2cf5/paging">Version 3.0.0-alpha07 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Async PagingData Guava-based operators now accept an Executor as a param, to control execution context. (<a href="https://android-review.googlesource.com/#/q/Id4372a9d30afd3f702782bba46f4da37a1b8e30d">Id4372</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed IndexOutOfBounds exception thrown in RemoteMediator due to a race condition. (<a href="https://android-review.googlesource.com/#/q/I00b7f9b00b2a36395ba8fe5c77931fec3ce20d7a">I00b7f</a>, <a href="https://issuetracker.google.com/issues/165821814">b/165821814</a>)</li> <li>Fixed a race condition in DataSource -&gt; PagingSource conversion that could cause the resulting PagingSource to ignore invalidation signals from DataSource.</li> <li>Fixed an issue in page fetchin logic that would sometimes cause it to fail to pick up new generations of PagingSource until PagingDataAdapter.refresh() was invoked</li> <li>Fixed an issue that would cause scroll-position to sometimes be lost when using a DataSource converted into a PagingSource (such as the one produced by Room), in conjunction with RemoteMediator</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Thanks to @simonschiller for adding RxJava2, RxJava3, and Guava-based async transformation operators for PagingData!</li> </ul> <h3 id="3.0.0-alpha06" data-text="Version 3.0.0-alpha06" tabindex="-1">Version 3.0.0-alpha06</h3> <p>September 2, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha06</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/96eb302ee1740ba656c90c9fb27df3723a1a89c1..31022a2dda22705843be1199c786552a6f9f875d/paging">Version 3.0.0-alpha06 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">UnsupportedOperationException</code> with clearer messaging around lack of support for stable ids is now thrown whenever <code translate="no" dir="ltr">PagingDataAdapter.setHasStableIds</code> is called. (<a href="https://android-review.googlesource.com/#/q/Ib38903e00e30e719a8c0104d076afb1cead6c8e1">Ib3890</a>, <a href="https://issuetracker.google.com/issues/158801427">b/158801427</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>insertSeparators no longer filters out empty pages allowing prefetch distance to be respected by the presenter even in cases where many empty pages are inserted. (<a href="https://android-review.googlesource.com/#/q/I9cff68ad1cc33076254681a3260be3f8ae32b598">I9cff6</a>, <a href="https://issuetracker.google.com/issues/162538908">b/162538908</a>)</li> </ul> <h3 id="3.0.0-alpha05" data-text="Version 3.0.0-alpha05" tabindex="-1">Version 3.0.0-alpha05</h3> <p>August 19, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha05</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/316f882e649c600372170f013a18515f590f490d..96eb302ee1740ba656c90c9fb27df3723a1a89c1/paging">Version 3.0.0-alpha05 contains these commits.</a></p> <p><strong>Bug Fixes</strong></p> <ul> <li>Paging now correctly prefetches pages even when the presented data is heavily filtered</li> <li>Returning <code translate="no" dir="ltr">LoadResult.Error</code> to a retried load no longer causes Item accesses to incorrectly re-trigger retry</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Thanks to Clara F for helping clean up some tests! (<a href="https://android-review.googlesource.com/c/platform/frameworks/support/+/1394447">549612</a>)</li> </ul> <h3 id="3.0.0-alpha04" data-text="Version 3.0.0-alpha04" tabindex="-1">Version 3.0.0-alpha04</h3> <p>August 5, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha04</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/316f882e649c600372170f013a18515f590f490d/paging">Version 3.0.0-alpha04 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">peek()</code> API to <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> and <code translate="no" dir="ltr">PagingDataAdapter</code> to allow presented data access without trigger page loads. (<a href="https://android-review.googlesource.com/#/q/I388982364c55ffd87a2f515dffdada817eceaec0">I38898</a>, <a href="https://issuetracker.google.com/issues/159104197">b/159104197</a>)</li> <li>Added a <code translate="no" dir="ltr">snapshot()</code> API to <code translate="no" dir="ltr">PagingDataAdapter</code> and <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> to allow retrieving the presented items without triggering page fetch. (<a href="https://android-review.googlesource.com/#/q/I566b6044da1d9fb26278bb3cada28913684f941b">I566b6</a>, <a href="https://issuetracker.google.com/issues/159104197">b/159104197</a>)</li> <li>Added a <code translate="no" dir="ltr">PagingData.from(List&lt;T&gt;)</code> constructor to allow presenting static lists, which can be combined with the overall PagingData flow to show static lists in certain states, e.g., before initial REFRESH finishes or simply for testing transformations. (<a href="https://android-review.googlesource.com/#/q/Id134d9cdb3197a2069f74227f052793ed40971cf">Id134d</a>)</li> <li>Deprecate dataRefresh Flow / Listener APIs as they were intended to expose the presented items state on REFRESH, but with improvements to loadState Flow / Listener callback timing, and itemCount property, it is redundant (<a href="https://android-review.googlesource.com/#/q/Ia19f3a4249e4f5586894d6702e998a2d9fb22eb0">Ia19f3</a>)</li> <li>Added RxJava3 compatibility wrappers for <code translate="no" dir="ltr">PagingSource</code> and <code translate="no" dir="ltr">RemoteMediator</code> (<a href="https://android-review.googlesource.com/#/q/I49ef38fde9b84f92dd272ed0b1cd1719fbbf1761">I49ef3</a>, <a href="https://issuetracker.google.com/issues/161480176">b/161480176</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><code translate="no" dir="ltr">PositionalDataSource</code> converted into <code translate="no" dir="ltr">PagingSource</code> via <code translate="no" dir="ltr">toPagingSourceFactory</code> helper, including <code translate="no" dir="ltr">PagingSource</code> generated by Room now correctly mark themselves to support jumping. (<a href="https://android-review.googlesource.com/#/q/I3e84c2d0cb941b58862f3804f346151b8d720a37">I3e84c</a>, <a href="https://issuetracker.google.com/issues/162161201">b/162161201</a>)</li> <li>Fixed a bug where using the synchronous variant of submitData would sometimes lead to a race causing a <code translate="no" dir="ltr">ClosedSendChannelException</code> (<a href="https://android-review.googlesource.com/#/q/I4d70208a6def82099644ec88b087426a1ae0cffd">I4d702</a>, <a href="https://issuetracker.google.com/issues/160192222">b/160192222</a>)</li> </ul> <p><strong>External Contribution</strong></p> <ul> <li>Thanks to Zac Sweers for adding RxJava3 compatibility wrappers on behalf of Slack! (<a href="https://android-review.googlesource.com/#/q/I49ef38fde9b84f92dd272ed0b1cd1719fbbf1761">I49ef3</a>, <a href="https://issuetracker.google.com/issues/161480176">b/161480176</a>)</li> </ul> <h3 id="3.0.0-alpha03" data-text="Version 3.0.0-alpha03" tabindex="-1">Version 3.0.0-alpha03</h3> <p>July 22, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha03</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/b6054a1a7396b962ac2c6d80d21053cf9d2f02db..9f60cc700129e30cee9df020005c317fb39d32ec/paging">Version 3.0.0-alpha03 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>The constructor for PagingState is now public, which should make testing implementations of getRefreshKey() easier (<a href="https://android-review.googlesource.com/#/q/I8bf1577c8aad40d90a27f6fec12682ab84d2b49e">I8bf15</a>)</li> <li>Hid DataSource kotlin map function variants from Java, to resolve ambiguity between original and kotlin variants. (<a href="https://android-review.googlesource.com/#/q/If7b239bfd58391e11b46a4fcd2ea99ffd729f84d">If7b23</a>, <a href="https://issuetracker.google.com/issues/161150011">b/161150011</a>)</li> <li>Redundant APIs intended as conveniences for Kotlin users have been marked @JvmSynthetic (<a href="https://android-review.googlesource.com/#/q/I56ae584e362d046df5361f49005b39c31177f7ac">I56ae5</a>)</li> <li>Added overloads for LoadResult.Page&#39;s constructor which defaults itemsBefore and itemsAfter to COUNT_UNDEFINED (<a href="https://android-review.googlesource.com/#/q/I4784906e23efd2f552326f56c145fb4b8754c099">I47849</a>)</li> <li>Made existing PagingData operators accept suspending methods and introduced new mapSync, flatMapSync, and filterSync non-suspending operators for Java users. The existing transformation methods have been moved to extension functions so Kotlin users will now need to import them. (<a href="https://android-review.googlesource.com/#/q/I342390a7b1eb98ac87072998744a9e46c99a1000">I34239</a>, <a href="https://issuetracker.google.com/issues/159983232">b/159983232</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Room (and PositionalDataSource) PagingSources will now display a leading separator as part of the first page, so the user doesn&#39;t need to scroll to reveal it. (<a href="https://android-review.googlesource.com/#/q/I6f747ebc0b823b146c39b925ce1d659913a50421">I6f747</a>, <a href="https://issuetracker.google.com/issues/160257628">b/160257628</a>)</li> <li>Item accesses on placeholders now correctly trigger PagingSource loads until a page is returned that fulfills the requested index after being transformed by PagingData.filter() (<a href="https://android-review.googlesource.com/#/q/I95625d22c1775be75f231ec25824b50ef404150d">I95625</a>, <a href="https://issuetracker.google.com/issues/158763195">b/158763195</a>)</li> <li>Fix for a bug where sometimes scrolling after PagingSource returns an error could prevent PagingDataAdapter.retry() from retrying. (<a href="https://android-review.googlesource.com/#/q/I1084fdc5d66254bbbcaa87e154ccab1dbffd54db">I1084f</a>, <a href="https://issuetracker.google.com/issues/160194384">b/160194384</a>)</li> <li>Fixes an issue where item accesses after dropping a page might not load pages although the item access was within prefetchDistance (<a href="https://android-review.googlesource.com/#/q/Ie95ae57c4f73c35ea0ebd77fe5d7fa7dbf4923e6">Ie95ae</a>, <a href="https://issuetracker.google.com/issues/160038730">b/160038730</a>)</li> <li>Setting PagingConfig.maxSize no longer enables placeholders after a drop event (<a href="https://android-review.googlesource.com/#/q/I2be299e5ce094c8c7460295ff5218758a65dfd1f">I2be29</a>, <a href="https://issuetracker.google.com/issues/159667766">b/159667766</a>)</li> </ul> <h3 id="3.0.0-alpha02" data-text="Version 3.0.0-alpha02" tabindex="-1">Version 3.0.0-alpha02</h3> <p>June 24, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha02</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/91b99a1bab5d164df694a93d77b6694a65257e7e..b6054a1a7396b962ac2c6d80d21053cf9d2f02db/paging">Version 3.0.0-alpha02 contains these commits.</a></p> <p><strong>API Changes</strong></p> <ul> <li>Added overloads for <code translate="no" dir="ltr">PagingConfig</code>&#39;s constructor with common default values (<a href="https://android-review.googlesource.com/#/q/I39c508a7403e0372b66d2f511843538e26e7cde7">I39c50</a>, <a href="https://issuetracker.google.com/issues/158576040">b/158576040</a>)</li> <li>Added overloads for constructors of <code translate="no" dir="ltr">PagingDataAdapter</code> and <code translate="no" dir="ltr">AsyncPagingDataDiffer</code> with common default values (<a href="https://android-review.googlesource.com/#/q/Ie91f55060e17102435525ef4e90f8d943df3c90b">Ie91f5</a>)</li> <li>The adapter APIs, <code translate="no" dir="ltr">dataRefreshFlow</code> and <code translate="no" dir="ltr">dataRefreshListener</code> now pass a Boolean to signal whether a <code translate="no" dir="ltr">PagingData</code> is empty (<a href="https://android-review.googlesource.com/#/q/I6e37e844cf9f947aeefaaa99d22b2672e04f207d">I6e37e</a>, <a href="https://issuetracker.google.com/issues/159054196">b/159054196</a>)</li> <li>Added RxJava and Guava APIs for RemoteMediator - <a href="https://developer.android.com/reference/kotlin/androidx/paging/RxRemoteMediator">RxRemoteMediator</a> and <a href="https://developer.android.com/reference/kotlin/androidx/paging/ListenableFutureRemoteMediator">ListenableFutureRemoteMediator</a></li> <li>Added helpers to PagingState for common item access such as <code translate="no" dir="ltr">isEmpty()</code> and <code translate="no" dir="ltr">firstItemOrNull()</code> (<a href="https://android-review.googlesource.com/#/q/I3b5b687f5188e1408806c567417921fb8101bfdb">I3b5b6</a>, <a href="https://issuetracker.google.com/issues/158892717">b/158892717</a>)</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Pager now checks for PagingSource reuse in factory, to prevent accidental reuse of invalid PagingSources, which gave an unclear error (<a href="https://android-review.googlesource.com/q/I99809eba7ca878fb841d2f250387d6b989ef701e">I99809</a>, <a href="https://issuetracker.google.com/issues/158486430">b/158486430</a>)</li> <li>Failures from RemoteMediator REFRESH no longer prevent PagingSource from loading (<a href="https://android-review.googlesource.com/#/q/I38b1b1784af935cfbd8b937d9f4ab372f59619ed">I38b1b</a>, <a href="https://issuetracker.google.com/issues/158892717">b/158892717</a>)</li> <li>The non-suspending version of <code translate="no" dir="ltr">submitData</code> no longer causes a crash due to concurrent collection on multiple <code translate="no" dir="ltr">PagingData</code> when called after the suspending version of <code translate="no" dir="ltr">submitData</code>. (<a href="https://android-review.googlesource.com/#/q/I263580a7cb300229eadaa431fa699f25d7ac4ee1">I26358</a>, <a href="https://issuetracker.google.com/issues/158048877">b/158048877</a>)</li> <li>Fixed &quot;cannot collect twice from pager&quot; exception that could occur after config change (<a href="https://android-review.googlesource.com/#/q/I58bcc4b2bde88b1c78ed1a96cf227e068127b47e">I58bcc</a>, <a href="https://issuetracker.google.com/issues/158784811">b/158784811</a>)</li> </ul> <h3 id="3.0.0-alpha01" data-text="Version 3.0.0-alpha01" tabindex="-1">Version 3.0.0-alpha01</h3> <p>June 10, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:3.0.0-alpha01</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/91b99a1bab5d164df694a93d77b6694a65257e7e/paging">Version 3.0.0-alpha01 contains these commits.</a></p> <p>The Paging Library has updated to 3.0, to enable several major new features.</p> <p><strong>New Features of 3.0</strong></p> <ul> <li>First-class support for Kotlin coroutines and Flow.</li> <li>Support for async loading with <a href="https://developer.android.com/topic/libraries/architecture/paging/v3-paged-data#data-source">coroutines suspend functions, RxJava Single or Guava ListenableFuture primitives</a>.</li> <li><a href="https://developer.android.com/topic/libraries/architecture/paging/v3-paged-data#display-loading-state">Built-in load state and error signals</a> for responsive UI design, including retry and refresh functionality.</li> <li>Improvements to the repository layer <ul> <li><a href="https://developer.android.com/topic/libraries/architecture/paging/v3-paged-data#data-source">Simplified data source interface</a></li> <li>Simplified network + database pagination</li> <li>Cancellation support</li> </ul></li> <li>Improvements to the presentation layer <ul> <li><a href="https://developer.android.com/topic/libraries/architecture/paging/v3-transform">Custom page transformations</a></li> <li><a href="https://developer.android.com/topic/libraries/architecture/paging/v3-transform#handle-separators-ui">List separators</a></li> <li><a href="https://developer.android.com/topic/libraries/architecture/paging/v3-paged-data#load-state-adapter">Loading state headers and footers</a></li> </ul></li> </ul> <p><strong>Known Issues</strong></p> <ul> <li>Paging 3 javadocs are not yet available. In the interim, please use the guides linked above or the Kotlin docs. (<a href="https://issuetracker.google.com/issues/158614050">b/158614050</a>)</li> </ul> <h2 id="version_212_3" data-text="Version 2.1.2" tabindex="-1">Version 2.1.2</h2> <h3 id="2.1.2" data-text="Version 2.1.2" tabindex="-1">Version 2.1.2</h3> <p>March 18, 2020</p> <p><code translate="no" dir="ltr">androidx.paging:paging:2.1.2</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/ccb8e324ee105f23ea5d97e683a853330f236203..f4786c969d8bdf214a797bc7ef09f05037fdea58/paging">Version 2.1.2 contains these commits <em>against 2.1.0</em></a>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix for <code translate="no" dir="ltr">IndexOutOfBoundsException</code> in rare cases when converting a position during invalidation.</li> </ul> <p><strong>Release issue</strong></p> <ul> <li><p>Paging version <code translate="no" dir="ltr">2.1.1</code> was released incorrectly from a misconfigured branch, exposing partially-implemented APIs and functionality upcoming in a future release.</p></li> <li><p>Paging <code translate="no" dir="ltr">2.1.2</code> contains the load-centering fix originally released in 2.1.1, but this time correctly cherry-picked atop the 2.1.0 release. It is strongly recommended to upgrade to this release, if you are currently on 2.1.1.</p></li> </ul> <h2 id="version_211_3" data-text="Version 2.1.1" tabindex="-1">Version 2.1.1</h2> <aside class="caution"><strong>Caution:</strong><span> This version (<code translate="no" dir="ltr">2.1.1</code>) contains unintentionally added methods, which can cause a build or runtime failure. Please update to the latest version (<code translate="no" dir="ltr">2.1.2</code>), in which this issue has been fixed.</span></aside> <h3 id="2.1.1" data-text="Version 2.1.1" tabindex="-1">Version 2.1.1</h3> <p>December 18, 2019</p> <p><code translate="no" dir="ltr">androidx.paging:paging-*:2.1.1</code> is released. <a href="https://android.googlesource.com/platform/frameworks/support/+log/237c8946756af4b0fe9d0fa3965593e247d53698..5cad5782a1610dc724e2715c93c349e95828981e/paging">Version 2.1.1 contains these commits</a>.</p> <p><strong>Bug fixes</strong></p> <ul> <li>Contiguous initial loads from PositionalDataSources are now centered around last access when placeholders disabled</li> </ul> <h2 id="version_210_3" data-text="Version 2.1.0" tabindex="-1">Version 2.1.0</h2> <h3 id="2.1.0" data-text="Version 2.1.0" tabindex="-1">Version 2.1.0</h3> <p>January 25, 2019</p> <p>Paging <code translate="no" dir="ltr">2.1.0</code> is released with no changes from <code translate="no" dir="ltr">2.1.0-rc01</code>.</p> <h3 id="2.1.0-rc01" data-text="Version 2.1.0-rc01" tabindex="-1">Version 2.1.0-rc01</h3> <p>December 6, 2018</p> <p>Paging <code translate="no" dir="ltr">2.1.0-rc01</code> is released with no changes from <code translate="no" dir="ltr">2.1.0-beta01</code>.</p> <h3 id="2.1.0-beta01" data-text="Version 2.1.0-beta01" tabindex="-1">Version 2.1.0-beta01</h3> <p>November 1, 2018</p> <p>Paging <code translate="no" dir="ltr">2.1.0-beta01</code> is released with no changes from <code translate="no" dir="ltr">2.1.0-alpha01</code>.</p> <h3 id="2.1.0-alpha01" data-text="Version 2.1.0-alpha01" tabindex="-1">Version 2.1.0-alpha01</h3> <p>October 12, 2018</p> <p>Paging <code translate="no" dir="ltr">2.1.0-alpha01</code> has two major additions - page dropping, and KTX extension libraries for every artifact - as well as several other API changes and bugfixes.</p> <p><strong>API Changes</strong></p> <ul> <li>Added <code translate="no" dir="ltr">PagedList.Config.Builder.setMaxSize()</code> for limiting the number of loaded items in memory.</li> <li>Added <code translate="no" dir="ltr">androidx.paging.Config()</code> as a Kotlin alternative for <code translate="no" dir="ltr">PagedList.Config.Builder</code></li> <li>Added <code translate="no" dir="ltr">androidx.paging.PagedList()</code> as a Kotlin alternative for <code translate="no" dir="ltr">PagedList.Builder</code></li> <li>Added <code translate="no" dir="ltr">DataSourceFactory.toLiveData()</code> as a Kotlin alternative for <code translate="no" dir="ltr">LivePagedListBuilder</code></li> <li>Added <code translate="no" dir="ltr">DataSourceFactory.toObservable()</code> and <code translate="no" dir="ltr">toFlowable()</code> as Kotlin alternatives for <code translate="no" dir="ltr">RxPagedListBuilder</code></li> <li>Added <code translate="no" dir="ltr">AsyncPagedListDiffer.addPagedListListener()</code> for listening to when PagedList is swapped. <a href="https://issuetracker.google.com/111698609">b/111698609</a></li> <li>Added <code translate="no" dir="ltr">PagedListAdapter.onCurrentListChanged()</code> variant that passes old and new list, deprecated previous variant.</li> <li>Added <code translate="no" dir="ltr">PagedListAdapter/AsyncPagedListDiffer.submitList()</code> variants which take an additional callback that triggers if/when the pagedlist is displayed, after diffing. This allows you to synchronize a PagedList swap with other UI updates. <a href="https://issuetracker.google.com/73781068">b/73781068</a></li> <li><code translate="no" dir="ltr">PagedList.getLoadedCount()</code> added to let you know how many items are in memory. Note that the return value is always equal to <code translate="no" dir="ltr">.size()</code> if placeholders are disabled.</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a race condition when diffing if lists are reused <a href="https://issuetracker.google.com/111591017">b/111591017</a></li> <li><code translate="no" dir="ltr">PagedList.loadAround()</code> now throws <code translate="no" dir="ltr">IndexOutOfBoundsException</code> when index is invalid. Previously it could crash with an unclear other exception.</li> <li>Fixed a case where an extremely small initial load size together with unchanged data would result in no further loading <a href="https://issuetracker.google.com/113122599">b/113122599</a></li> </ul> <aside class="note"><strong>Note:</strong><span> page dropping is currently off by default - enable it with the new <code translate="no" dir="ltr">PagedList.Config.Builder.setMaxSize()</code> API. To correctly support page dropping in a custom <code translate="no" dir="ltr">ItemKeyedDataSource</code>, you must implement <code translate="no" dir="ltr">loadBefore</code>.</span></aside><aside class="note"><strong>Note:</strong><span> Page dropping is not currently supported in <code translate="no" dir="ltr">PageKeyedDataSource</code>, due to having no way to re-load the <code translate="no" dir="ltr">loadInitial</code> result incrementally.</span></aside> <h2 id="version_200_3" data-text="Version 2.0.0" tabindex="-1">Version 2.0.0</h2> <h3 id="2.0.0" data-text="Version 2.0.0" tabindex="-1">Version 2.0.0</h3> <p>October 1, 2018</p> <p>Paging <code translate="no" dir="ltr">2.0.0</code> is released with a single bugfix.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed a crash that could occur with very fast scrolling using <code translate="no" dir="ltr">PositionalDataSource</code> and placeholders <a href="https://issuetracker.google.com/114635383">b/114635383</a>.</li> </ul> <h3 id="2.0.0-beta01" data-text="Version 2.0.0-beta01" tabindex="-1">Version 2.0.0-beta01</h3> <p>July 2, 2018</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed content disappearing in some prepend cases (placeholders disabled, PositionalDataSource) <a href="https://issuetracker.google.com/issues/80149146">b/80149146</a></li> <li>(Already released in <code translate="no" dir="ltr">1.0.1</code>) Fixed crashes where <code translate="no" dir="ltr">PagedListAdapter</code> and <code translate="no" dir="ltr">AsyncPagedListDiffer</code> would fail to signal move events. <a href="https://issuetracker.google.com/issues/110711937">b/110711937</a></li> </ul> <h2 id="pre-androidx_dependencies_2" data-text="Pre-AndroidX Dependencies" tabindex="-1">Pre-AndroidX Dependencies</h2> <p>For the pre-AndroidX versions of Paging that follow, include these dependencies:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Carbon"><code translate="no" dir="ltr"><span class="devsite-syntax-nx">dependencies</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">{</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">paging_version</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"1.0.0"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">implementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"android.arch.paging:runtime:$paging_version"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// alternatively - without Android dependencies for testing</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">testImplementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"android.arch.paging:common:$paging_version"</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1">// optional - RxJava support</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-nx">implementation</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-s">"android.arch.paging:rxjava2:$paging_version"</span> <span class="devsite-syntax-p">}</span> </code></pre></devsite-code> <h2 id="version_101_3" data-text="Version 1.0.1" tabindex="-1">Version 1.0.1</h2> <h3 id="1.0.1" data-text="Version 1.0.1" tabindex="-1">Version 1.0.1</h3> <p>June 26, 2018</p> <p>Paging <code translate="no" dir="ltr">1.0.1</code> is released with a single bugfix in <code translate="no" dir="ltr">runtime</code>. We highly recommend using <code translate="no" dir="ltr">1.0.1</code> for stability. Paging RxJava2 <code translate="no" dir="ltr">1.0.1</code> is also released, and is identical to <code translate="no" dir="ltr">1.0.0-rc1</code>.</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fixed crashes where <code translate="no" dir="ltr">PagedListAdapter</code> and <code translate="no" dir="ltr">AsyncPagedListDiffer</code> would fail to signal move events. <a href="https://issuetracker.google.com/issues/110711937">b/110711937</a></li> </ul> <h2 id="rxjava2_version_100_2" data-text="RxJava2 Version 1.0.0" tabindex="-1">RxJava2 Version 1.0.0</h2> <h3 id="1.0.0-rc1" data-text="RxJava2 Version 1.0.0-rc1" tabindex="-1">RxJava2 Version 1.0.0-rc1</h3> <p>May 16, 2018</p> <p>Paging RxJava2 <code translate="no" dir="ltr">1.0.0-rc1</code> is moving to release candidate with no changes from the initial alpha.</p> <h2 id="version_100_2" data-text="Version 1.0.0" tabindex="-1">Version 1.0.0</h2> <h3 id="1.0.0-rc1" data-text="Version 1.0.0-rc1" tabindex="-1">Version 1.0.0-rc1</h3> <p>April 19, 2018 Paging Release Candidate</p> <p>We <strong>do not have</strong> any more known issues or new features scheduled for the Paging <code translate="no" dir="ltr">1.0.0</code> release. Please upgrade your projects to use <code translate="no" dir="ltr">1.0.0-rc1</code> and help us battle test it so that we can ship a rock solid <code translate="no" dir="ltr">1.0.0</code>.</p> <p>There are no changes in this release, it is the same as <code translate="no" dir="ltr">1.0.0-beta1</code>.</p> <h3 id="1.0.0-beta1" data-text="Version 1.0.0-beta1" tabindex="-1">Version 1.0.0-beta1</h3> <p>April 5, 2018</p> <p>Paging will be in beta for a short time before progressing to release candidate. We are not planning further API changes for <code translate="no" dir="ltr">Paging 1.0</code>, and the bar for any API changes is very high.</p> <p>Alpha RxJava2 support for Paging is released as a separate optional module (<code translate="no" dir="ltr">android.arch.paging:rxjava2:1.0.0-alpha1</code>) and will temporarily be versioned separately until it stabilizes.</p> <p>This new library provides an RxJava2 alternative to <code translate="no" dir="ltr">LivePagedListBuilder</code>, capable of constructing <code translate="no" dir="ltr">Observable</code>s and <code translate="no" dir="ltr">Flowable</code>s, taking <code translate="no" dir="ltr">Scheduler</code>s instead of <code translate="no" dir="ltr">Executor</code>s:</p> <div> <div class="ds-selector-tabs"><section><h3 id="kotlin" 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-kd">val</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nv">pagedItems</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">RxPagedListBuilder</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">myDataSource</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-cm">/* page size */</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-m">50</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">setFetchScheduler</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">myNetworkScheduler</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">buildObservable</span><span class="devsite-syntax-p">()</span></pre></devsite-code> </section><section><h3 id="java" data-text="Java" tabindex="-1">Java</h3> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Java"><span class="devsite-syntax-n">Observable&lt;PagedList&lt;Item</span><span class="devsite-syntax-o">>></span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">pagedItems</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-o">=</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-n">RxPagedListBuilder</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">myDataSource</span><span class="devsite-syntax-p">,</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-cm">/* page size */</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-mi">50</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">setFetchScheduler</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">myNetworkScheduler</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-w"> </span><span class="devsite-syntax-p">.</span><span class="devsite-syntax-na">buildObservable</span><span class="devsite-syntax-p">();</span></pre></devsite-code> </section></div> </div> <p><strong>New Features</strong></p> <ul> <li><code translate="no" dir="ltr">RxPagedListBuilder</code> is added via the new <code translate="no" dir="ltr">android.arch.paging:rxjava2</code> artifact.</li> </ul> <p><strong>API Changes</strong></p> <ul> <li><p>API changes to clarify the role of executors in builders:</p> <ul> <li><p>Renamed <code translate="no" dir="ltr">setBackgroundThreadExecutor()</code> to <code translate="no" dir="ltr">setFetchExecutor()</code> (in <code translate="no" dir="ltr">PagedList.Builder</code> and <code translate="no" dir="ltr">LivePagedListBuilder</code>)</p></li> <li><p>Renamed <code translate="no" dir="ltr">setMainThreadExecutor()</code> to <code translate="no" dir="ltr">setNotifyExecutor()</code> (in <code translate="no" dir="ltr">PagedList.Builder</code>).</p></li> </ul></li> <li><p>Fixed <code translate="no" dir="ltr">PagedList.mCallbacks</code> member to be private.</p></li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li><p><code translate="no" dir="ltr">LivePagedListBuilder</code> triggers initial <code translate="no" dir="ltr">PagedList</code> load on the specified executor, instead of the Arch Components IO thread pool.</p></li> <li><p>Fixed invalidate behavior in internal <code translate="no" dir="ltr">DataSource</code> wrappers (used to implement <code translate="no" dir="ltr">DataSource.map</code>, as well as placeholder-disabled <code translate="no" dir="ltr">PositionalDataSource</code> loading) <a href="https://issuetracker.google.com/issues/77237534">b/77237534</a></p></li> </ul> <h3 id="1.0.0-alpha7" data-text="Version 1.0.0-alpha7" tabindex="-1">Version 1.0.0-alpha7</h3> <p>March 21, 2018</p> <p>Paging <code translate="no" dir="ltr">1.0.0-alpha7</code> is released alongside Lifecycles <code translate="no" dir="ltr">1.1.1</code>. As Paging alpha7 depends on the move of the <code translate="no" dir="ltr">Function</code> class mentioned above, you will need to update your <code translate="no" dir="ltr">lifecycle:runtime</code> dependency to <code translate="no" dir="ltr">android.arch.lifecycle:runtime:1.1.1</code>.</p> <p>Paging <code translate="no" dir="ltr">alpha7</code> is planned to be the final release before Paging hits beta.</p> <p><strong>API Changes</strong></p> <ul> <li><code translate="no" dir="ltr">DataSource.LoadParams</code> objects now have a public constructor and <code translate="no" dir="ltr">DataSource.LoadCallback</code> objects are now abstract. This enables wrapping a <code translate="no" dir="ltr">DataSource</code> or directly testing a <code translate="no" dir="ltr">DataSource</code> with a mock callback. <a href="https://issuetracker.google.com/issues/72600421">b/72600421</a></li> <li>Mappers for DataSource and DataSource.Factory <ul> <li><code translate="no" dir="ltr">map(Function&lt;IN,OUT&gt;)</code> allows you to transform, wrap, or decorate results loaded by a <code translate="no" dir="ltr">DataSource</code>.</li> <li><code translate="no" dir="ltr">mapByPage(&lt;List&lt;IN&gt;,List&lt;OUT&gt;&gt;)</code> enables the same for batch processing (e.g. if items loaded from SQL need to additionally query a separate database, that can be done as a batch.)</li> </ul></li> <li><code translate="no" dir="ltr">PagedList#getDataSource()</code> is added as a convenience method <a href="https://issuetracker.google.com/issues/72611341">b/72611341</a></li> <li>All deprecated classes have been removed from the API, including the remains of <code translate="no" dir="ltr">recyclerview.extensions</code> package, and the <code translate="no" dir="ltr">LivePagedListProvider</code>.</li> <li><code translate="no" dir="ltr">DataSource.Factory</code> is changed from an interface to an abstract class to enable map functionality.</li> </ul> <p><strong>Bug Fixes</strong></p> <ul> <li>Changed Builders to be final. <a href="https://issuetracker.google.com/issues/70848565">b/70848565</a></li> <li>Room <code translate="no" dir="ltr">DataSource</code> implementation is now fixed to handle multi-table queries - this fix is contained within Room 1.1.0-beta1, see above.</li> <li>Fixed a bug where <code translate="no" dir="ltr">BoundaryCallback.onItemAtEndLoaded</code> would not be invoked for <code translate="no" dir="ltr">PositionalDataSource</code> if placeholders are enabled and the total size is an exact multiple of the page size.</li> </ul> <h3 id="1.0.0-alpha5" data-text="Version 1.0.0-alpha5" tabindex="-1">Version 1.0.0-alpha5</h3> <p>January 22, 2018</p> <p><strong>Bug Fixes</strong></p> <ul> <li>Fix page loading when placeholders are disabled <a href="https://issuetracker.google.com/issues/70573345">b/70573345</a></li> <li>Additional logging for tracking down IllegalArgumentException bug <a href="https://issuetracker.google.com/issues/70360195">b/70360195</a> (and speculative Room-side fix)</li> <li>Javadoc sample code fixes <a href="https://issuetracker.google.com/issues/70411933">b/70411933</a>, <a href="https://issuetracker.google.com/issues/71467637">b/71467637</a></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&amp;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>{&#34;at&#34;: &#34;True&#34;, &#34;ga4&#34;: [{&#34;id&#34;: &#34;G-QFRN08RN6E&#34;, &#34;purpose&#34;: 0}], &#34;ga4p&#34;: [{&#34;id&#34;: &#34;G-QFRN08RN6E&#34;, &#34;purpose&#34;: 0}], &#34;gtm&#34;: [{&#34;id&#34;: &#34;GTM-KMSWPCJ&#34;, &#34;purpose&#34;: 0}], &#34;parameters&#34;: {&#34;internalUser&#34;: &#34;False&#34;, &#34;language&#34;: {&#34;machineTranslated&#34;: &#34;False&#34;, &#34;requested&#34;: &#34;en&#34;, &#34;served&#34;: &#34;en&#34;}, &#34;pageType&#34;: &#34;article&#34;, &#34;projectName&#34;: &#34;Jetpack&#34;, &#34;signedIn&#34;: &#34;False&#34;, &#34;tenant&#34;: &#34;android&#34;, &#34;recommendations&#34;: {&#34;sourcePage&#34;: &#34;&#34;, &#34;sourceType&#34;: 0, &#34;sourceRank&#34;: 0, &#34;sourceIdenticalDescriptions&#34;: 0, &#34;sourceTitleWords&#34;: 0, &#34;sourceDescriptionWords&#34;: 0, &#34;experiment&#34;: &#34;&#34;}, &#34;experiment&#34;: {&#34;ids&#34;: &#34;&#34;}}}</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="HWmi9jNrtASON9wIe0FqLICxnBkAgF"> (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,["Profiles__enable_recognition_badges","Significatio__enable_by_tenant","Cloud__enable_cloud_dlp_service","Cloud__enable_llm_concierge_chat","Profiles__enable_profile_collections","EngEduTelemetry__enable_engedu_telemetry","Search__enable_page_map","Experiments__reqs_query_experiments","Search__enable_suggestions_from_borg","CloudShell__cloud_shell_button","Concierge__enable_pushui","Cloud__enable_cloudx_ping","TpcFeatures__enable_mirror_tenant_redirects","DevPro__enable_cloud_innovators_plus","DevPro__enable_developer_subscriptions","MiscFeatureFlags__enable_view_transitions","MiscFeatureFlags__enable_firebase_utm","Profiles__enable_dashboard_curated_recommendations","Profiles__enable_completecodelab_endpoint","Profiles__enable_complete_playlist_endpoint","Search__enable_ai_eligibility_checks","Profiles__enable_public_developer_profiles","MiscFeatureFlags__enable_project_variables","Cloud__enable_cloudx_experiment_ids","TpcFeatures__enable_required_headers","MiscFeatureFlags__developers_footer_image","Cloud__enable_cloud_facet_chat","Analytics__enable_clearcut_logging","Search__enable_ai_search_summaries","Profiles__enable_release_notes_notifications","MiscFeatureFlags__enable_explain_this_code","CloudShell__cloud_code_overflow_menu","Profiles__require_profile_eligibility_for_signin","Profiles__enable_developer_profiles_callout","Profiles__enable_page_saving","MiscFeatureFlags__enable_variable_operator","MiscFeatureFlags__emergency_css","Cloud__enable_free_trial_server_call","BookNav__enable_tenant_cache_key","Profiles__enable_awarding_url","Search__enable_dynamic_content_confidential_banner","Cloud__enable_cloud_shell_fte_user_flow","Cloud__enable_cloud_shell","MiscFeatureFlags__developers_footer_dark_image","Cloud__enable_legacy_calculator_redirect","MiscFeatureFlags__enable_dark_theme"],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>

Pages: 1 2 3 4 5 6 7 8 9 10