# androiddev

Published articles for androiddev.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Setup On Device Gemma 4 Android Development on Emulator

DevFeed: [Setup On Device Gemma 4 Android Development on Emulator](<https://devfeed.tech/articles/setup-on-device-gemma-4-android-development-on-emulator-29460.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/setup-on-device-gemma-4-android-development-on-emulator-738876f03733?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-09-11T14:27:55Z

Content type: tutorial

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [gemma4](<https://devfeed.tech/topics/gemma4.md>), [Android](<https://devfeed.tech/topics/android.md>), [Emulator](<https://devfeed.tech/topics/emulator.md>), [android-development](<https://devfeed.tech/topics/android-development.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [artificial-intelligence](<https://devfeed.tech/tags/artificial-intelligence.md>), [emulator](<https://devfeed.tech/tags/emulator.md>), [gemma](<https://devfeed.tech/tags/gemma.md>), [gemma-4](<https://devfeed.tech/tags/gemma-4.md>), [google](<https://devfeed.tech/tags/google.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [on-device](<https://devfeed.tech/tags/on-device.md>)

### AI overview

A tutorial explaining how to set up and run the Gemma 4 large language model locally on an Android Emulator, including downloading and testing the Google AI Edge Gallery sample app. It notes that emulator storage and memory may affect model use.

### Source excerpt

Create Android Project with Downloadable Android On Device Gemma 4 Model Continue reading on Mobile App Development Publication "

## From Permissions to Sessions: Rethinking Location Access in Android 17

DevFeed: [From Permissions to Sessions: Rethinking Location Access in Android 17](<https://devfeed.tech/articles/from-permissions-to-sessions-rethinking-location-access-in-android-17-22946.md>)

Original publisher: [Read original article](<https://proandroiddev.com/from-permissions-to-sessions-rethinking-location-access-in-android-17-5a13124b777d?source=rss----c72404660798---4>)

Author: Nav Singh

Published: 2026-09-09T01:15:51Z

Content type: tutorial

Language: en

Sources: [ProAndroidDev - Medium](<https://devfeed.tech/sources/proandroiddev-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [ui](<https://devfeed.tech/topics/ui.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [android-permissions](<https://devfeed.tech/tags/android-permissions.md>), [android17](<https://devfeed.tech/tags/android17.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [feature](<https://devfeed.tech/tags/feature.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [permission](<https://devfeed.tech/tags/permission.md>)

### AI overview

A tutorial on implementing Android 17's system-rendered Location Button in Jetpack Compose. The button uses the USE_LOCATION_BUTTON permission and grants precise location for the current session, with local rendering fallback on older Android versions or when remote rendering fails.

### Source excerpt

Image generated using Gemini In this article, we will learn how to implement the new 📍Location button introduced in Android 17 in Jetpack Compose-based Android applications. Android 17 adds a system-rendered 📍Location Button that we can drop into the layout via a Jetpack library, and tapping it gives the app precise location for that session only, gated by a new USE_LOCATION_BUTTON permission. What the feature is Android now exposes a system-owned, standard location button that we can embed in our UI instead of designing a custom control. When the user taps it, the system handles the permission flow, then grants the app precise location for the current session only, rather than long-lived access. How it changes permissions Instead of immediately requesting ACCESS_FINE_LOCATION (and maybe ACCESS_COARSE_LOCATION) at runtime, we declare the new USE_LOCATION_BUTTON permission to host the button. <!-- Standard Coarse and Fine Location Permissions + onlyForLocationButton --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:usesPermissionFlags="onlyForLocationButton"/> <!-- Required system permission for rendering the LocationButton --> <uses-permission android:name="android.permission.USE_LOCATION_BUTTON" />Developer benefits Less custom permission boilerplate: We lean on system UX and the Jetpack library for the hardest parts of location consent. [versions] locationbuttonCompose = "1.0.0-alpha01" [libraries] androidx-locationbutton-compose = { group = "androidx.core.locationbutton", name = "locationbutton-compose", version.ref = "locationbuttonCompose" } Higher trust and clarity for users: the control looks and behaves consistently across apps, and session-only precise access is easier to understand than broader access. Implementation As we all know, Android development is now Compose-first, so we will implement it using the LocationButton composable provided by th

## Pair Programming With Your AI Agent

DevFeed: [Pair Programming With Your AI Agent](<https://devfeed.tech/articles/pair-programming-with-your-ai-agent-24913.md>)

Original publisher: [Read original article](<https://blog.blundellapps.co.uk/pair-programming-with-your-ai-agent/>)

Author: blundell

Published: 2026-09-06T21:50:09Z

Content type: tutorial

Language: en

Sources: [Blundell](<https://devfeed.tech/sources/blundell.md>)

Topics: [AI Agent](<https://devfeed.tech/topics/ai-agent.md>), [Local AI](<https://devfeed.tech/topics/local-ai.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>)

Tags: [agent](<https://devfeed.tech/tags/agent.md>), [ai](<https://devfeed.tech/tags/ai.md>), [ai-agent](<https://devfeed.tech/tags/ai-agent.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [antigravity](<https://devfeed.tech/tags/antigravity.md>), [cli](<https://devfeed.tech/tags/cli.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [geminicli](<https://devfeed.tech/tags/geminicli.md>), [intermediate](<https://devfeed.tech/tags/intermediate.md>), [intermediate-reference-ai-androiddev-gemini-geminicli-pairing](<https://devfeed.tech/tags/intermediate-reference-ai-androiddev-gemini-geminicli-pairing.md>), [pair](<https://devfeed.tech/tags/pair.md>), [pairing](<https://devfeed.tech/tags/pairing.md>), [programming](<https://devfeed.tech/tags/programming.md>), [reference](<https://devfeed.tech/tags/reference.md>), [terminal](<https://devfeed.tech/tags/terminal.md>)

### AI overview

This tutorial presents sessions with a local AI agent as pair programming and maps four classic pairing styles--unstructured, Driver/Navigator, Strong-Style Pairing, and Ping Pong--to AI-assisted development. It uses Antigravity CLI for examples while noting that the approach is not specific to that tool.

### Source excerpt

This post explains how to treat a session with a local AI agent as a pair programming session, and how the four classic pairing styles map onto working with one. I'll use Antigravity CLI for the concrete examples, though nothing here is specific to it. Swap in whichever agent sits in your terminal. The idea [...] The post Pair Programming With Your AI Agent first appeared on Blundell.

## From Permissions to Sessions: Rethinking Location Access in Android 17

DevFeed: [From Permissions to Sessions: Rethinking Location Access in Android 17](<https://devfeed.tech/articles/from-permissions-to-sessions-rethinking-location-access-in-android-17-25982.md>)

Original publisher: [Read original article](<https://proandroiddev.com/from-permissions-to-sessions-rethinking-location-access-in-android-17-5a13124b777d?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-09-03T18:18:32Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [ui](<https://devfeed.tech/topics/ui.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [android-permissions](<https://devfeed.tech/tags/android-permissions.md>), [android17](<https://devfeed.tech/tags/android17.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [branding](<https://devfeed.tech/tags/branding.md>), [consent](<https://devfeed.tech/tags/consent.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [layout](<https://devfeed.tech/tags/layout.md>), [permissions](<https://devfeed.tech/tags/permissions.md>)

### AI overview

A tutorial on implementing Android 17's system-rendered Location Button in Jetpack Compose applications. It explains session-only precise location access, the USE_LOCATION_BUTTON permission, the required Jetpack library, fallback rendering, and UI customization.

### Source excerpt

Image generated using Gemini In this article, we will learn how to implement the new 📍Location button introduced in Android 17 in Jetpack Compose-based Android applications. Android 17 adds a system-rendered 📍Location Button that we can drop into the layout via a Jetpack library, and tapping it gives the app precise location for that session only, gated by a new USE_LOCATION_BUTTON permission. What the feature is Android now exposes a system-owned, standard location button that we can embed in our UI instead of designing a custom control. When the user taps it, the system handles the permission flow, then grants the app precise location for the current session only, rather than long-lived access. How it changes permissions Instead of immediately requesting ACCESS_FINE_LOCATION (and maybe ACCESS_COARSE_LOCATION) at runtime, we declare the new USE_LOCATION_BUTTON permission to host the button. <!-- Standard Coarse and Fine Location Permissions + onlyForLocationButton --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:usesPermissionFlags="onlyForLocationButton"/> <!-- Required system permission for rendering the LocationButton --> <uses-permission android:name="android.permission.USE_LOCATION_BUTTON" />Developer benefits Less custom permission boilerplate: We lean on system UX and the Jetpack library for the hardest parts of location consent. [versions] locationbuttonCompose = "1.0.0-alpha01" [libraries] androidx-locationbutton-compose = { group = "androidx.core.locationbutton", name = "locationbutton-compose", version.ref = "locationbuttonCompose" } Higher trust and clarity for users: the control looks and behaves consistently across apps, and session-only precise access is easier to understand than broader access. Implementation As we all know, Android development is now Compose-first, so we will implement it using the LocationButton composable provided by th

## Animating between numbers in Jetpack Compose

DevFeed: [Animating between numbers in Jetpack Compose](<https://devfeed.tech/articles/animating-between-numbers-in-jetpack-compose-25182.md>)

Original publisher: [Read original article](<https://joebirch.co/android/animating-between-numbers-in-jetpack-compose/>)

Author: hitherejoe

Published: 2026-09-02T12:37:43Z

Content type: tutorial

Language: en

Sources: [Joe Birch](<https://devfeed.tech/sources/joe-birch.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [API](<https://devfeed.tech/topics/api.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-apps](<https://devfeed.tech/tags/android-apps.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [animation](<https://devfeed.tech/tags/animation.md>), [api](<https://devfeed.tech/tags/api.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [apps](<https://devfeed.tech/tags/apps.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [jetpackcompose](<https://devfeed.tech/tags/jetpackcompose.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial explains how to animate changing numerical portfolio values in Jetpack Compose. It uses animateFloatAsState with a target value and a tween animation configured with a 500ms duration and FastOutSlowInEasing.

### Source excerpt

When it comes to displaying portfolio data inside of Sleevd, users can change the selected filters which will adjust the portfolio values based on that selection. Alongside the main graph, we show the total portfolio value along with some small statistics for collection counts. When the user moves between the filter options, the values of... Continue reading ->

## Mastering Jetpack Compose's New SelectionState API

DevFeed: [Mastering Jetpack Compose's New SelectionState API](<https://devfeed.tech/articles/mastering-jetpack-compose-s-new-selectionstate-api-25985.md>)

Original publisher: [Read original article](<https://proandroiddev.com/mastering-jetpack-composes-new-selectionstate-api-13dfa05f49db?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-08-27T01:17:44Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [API](<https://devfeed.tech/topics/api.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [api](<https://devfeed.tech/tags/api.md>), [api-news](<https://devfeed.tech/tags/api-news.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [reactive](<https://devfeed.tech/tags/reactive.md>)

### AI overview

This tutorial introduces Jetpack Compose's SelectionState API, released in August 2026, for hoisted bidirectional selection control and reactive text observation. It demonstrates programmatic selection, clearing, range selection, word-based expansion, and access to selected text.

### Source excerpt

Image generated using Gemini The Jetpack Compose August '26 release introduced a new API SelectionState for hoisted, bidirectional control and reactive text observation. Core ComponentsSelectionState An object that provides access to the selected text and methods for controlling it programmatically 🛑 We cannot use the same SelectionState with multiple SelectionContainersval selectionState = rememberSelectionState()SelectionContainer: A composable function that enables text selection of its content. SelectionContainer(state = selectionState) { Text( "Text content to be selected programmatically." ) }Programmatic Control Methods selectionState.selectAll(): Selects all the content in the container Button( onClick = { selectionState.selectAll() }) { Text("Select All") } selectionState.clear(): Clears the active selection Button(onClick = { selectionState.clear() }) { Text("Clear selection") } selectionState.select(TextRange): Selects a specific range of text Button( onClick = { selectionState.select(TextRange(0, 4)) }) { Text("Range selection") } selectionState.extendSelectionByWord(): Expands the selection of words This selects the first word in the container if there is no selection. The selection continues to the next Composable Text, if the next word is in a different Composable Text.Button( onClick = { selectionState.extendSelectionByWord()}) { Text("Extend selection") }Mutliple Text Components selectionSelected texts Provides access to the selected text. Returns List<AnnotatedString> Backed by mutableStateOf -- Observable by Composablesprivate var _selectedTexts by mutableStateOf<List<AnnotatedString>>Text(text = "Selected text: ${selectionState.selectedTexts}")Sample Code@Composable fun ProgrammaticSelectionExample() { val selectionState = rememberSelectionState() Column{ Row { Button( onClick = { selectionState.selectAll() }, ) { Text("Select All") } Button( onClick = { selectionState.clear() }, ) { Text("Clear selection") } } Row { Button( onClick = { selectionS

## Bring your KMP library to NuGet

DevFeed: [Bring your KMP library to NuGet](<https://devfeed.tech/articles/bring-your-kmp-library-to-nuget-25915.md>)

Original publisher: [Read original article](<https://proandroiddev.com/bring-your-kmp-library-to-nuget-02e1131a4707?source=rss-43bae76e8f81------2>)

Author: Isuru Rajapakse

Published: 2026-07-19T13:17:14Z

Content type: tutorial

Language: en

Sources: [Stories by Isuru Rajapakse on Medium](<https://devfeed.tech/sources/stories-by-isuru-rajapakse-on-medium.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [NuGet](<https://devfeed.tech/topics/nuget.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [C#](<https://devfeed.tech/topics/csharp.md>), [.NET](<https://devfeed.tech/topics/net.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [Library](<https://devfeed.tech/topics/library.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [interfaces](<https://devfeed.tech/tags/interfaces.md>), [kmp](<https://devfeed.tech/tags/kmp.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [library](<https://devfeed.tech/tags/library.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [net](<https://devfeed.tech/tags/net.md>), [nuget](<https://devfeed.tech/tags/nuget.md>), [nuget-package](<https://devfeed.tech/tags/nuget-package.md>)

### AI overview

The article introduces kotlin-native-nuget, a Gradle plugin that packages Kotlin/Native libraries as NuGet packages with generated idiomatic C# bindings. It explains the motivation, configuration, publishing workflow, and supported mappings for Kotlin features such as classes, enums, data classes, coroutines, generics, interfaces, and exceptions.

### Source excerpt

with kotlin-native-nuget plugin, you can bring your Kotlin to C# idiomaticallyhttps://medium.com/media/0f185efc67390bbf440bfc33f5675f42/href A little while ago, I gave a talk where I tried to take a library written in Kotlin and hand it to a .NET developer as a NuGet package. By hand. It is 30 minutes of me walking into every brick wall you can imagine - the C ABI, marshalling strings, keeping objects alive across the boundary, making any of it look like C# a human would actually want to use. Introducing kotlin-native-nuget 🪟kotlin-native-nuget plugin auto-binds your kotlin api into C# I turned all of that into a plugin, so you don't have to hit a single one of those walls. You write Kotlin, and out the other side comes a NuGet package with a proper, idiomatic C# API: classes, enums, data classes, coroutines, Flow, generics, interfaces, the works. No FFI boilerplate, no hand-written [DllImport], no "here's a C header, good luck". Your friends over in .NET just `dotnet add package` it and use it like it was C# all along. It's called kotlin-native-nuget, and it's a Gradle plugin. Here's the pitch: GitHub - xxfast/kotlin-native-nuget: A plugin that packages a Kotlin/Native library as a NuGet package with generated C# bindings, and consumes C# NuGet packages from Kotlin The pitch 🛗plugins { kotlin("multiplatform") id("io.github.xxfast.kotlin.native.nuget") version "<version>" } kotlin { mingwX64 { binaries { sharedLib { baseName = "mycatlib" } } } macosArm64 { binaries { sharedLib { baseName = "mycatlib" } } } } nuget { publish { packageId = "MyCatLib" version = "1.0.0" authors = "yourname" description = "My Kotlin/Native library" rootPackage = "com.example.cats" } } That's it. Add the plugin, point it at your native targets, and run the publish task. Out pops a .nupkg. Why though? 🤔 It's a fair question. I got it a lot (even on that talk) Kotlin Multiplatform already reaches an absurd number of places: the JVM, Android, iOS, JS, Wasm, and native desktop. But there's th

## Practical Kotlin Multiplatform: Setting up the Kotlin Multiplatform Networking Module with Ktor

DevFeed: [Practical Kotlin Multiplatform: Setting up the Kotlin Multiplatform Networking Module with Ktor](<https://devfeed.tech/articles/practical-kotlin-multiplatform-setting-up-the-kotlin-multiplatform-networking-module-with-ktor-25190.md>)

Original publisher: [Read original article](<https://joebirch.co/android/practical-kotlin-multiplatform-setting-up-the-kotlin-multiplatform-networking-module-with-ktor/>)

Author: hitherejoe

Published: 2026-07-10T16:16:31Z

Content type: tutorial

Language: en

Sources: [Joe Birch](<https://devfeed.tech/sources/joe-birch.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Ktor](<https://devfeed.tech/topics/ktor.md>), [networking](<https://devfeed.tech/topics/networking.md>), [REST API](<https://devfeed.tech/topics/rest-api.md>), [Authentication](<https://devfeed.tech/topics/authentication.md>), [Firebase](<https://devfeed.tech/topics/firebase.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Android](<https://devfeed.tech/topics/android.md>), [iOS](<https://devfeed.tech/topics/ios.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [authentication](<https://devfeed.tech/tags/authentication.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [ios](<https://devfeed.tech/tags/ios.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [ktor](<https://devfeed.tech/tags/ktor.md>), [library](<https://devfeed.tech/tags/library.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [module](<https://devfeed.tech/tags/module.md>), [networking](<https://devfeed.tech/tags/networking.md>), [rest-api](<https://devfeed.tech/tags/rest-api.md>)

### AI overview

A tutorial series installment that sets up a Kotlin Multiplatform networking module with Ktor for shared Android and iOS code. It describes building a portable Firebase Authentication and Firestore REST API layer without relying on platform-specific SDKs.

### Source excerpt

This post is part one of a series adapted from Practical KMP, my book on building production Kotlin Multiplatform apps for Android and iOS. Part 1: Creating the Kotlin Multiplatform Module In this part of the book, we'll build the complete authentication remote store, defining a repository that handles every operation our app needs for... Continue reading ->

## Google IO 26: Gemini, Big Rocks, Opportunities for Android

DevFeed: [Google IO 26: Gemini, Big Rocks, Opportunities for Android](<https://devfeed.tech/articles/google-io-26-gemini-big-rocks-opportunities-for-android-29457.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/google-io-26-gemini-big-rocks-opportunities-for-android-2d71e00c9bfb?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-07-05T09:06:38Z

Content type: article

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Google](<https://devfeed.tech/topics/google.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [AI Models](<https://devfeed.tech/topics/ai-models.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [AI tools for developers](<https://devfeed.tech/topics/ai-tools-for-developers.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [ai-models](<https://devfeed.tech/tags/ai-models.md>), [ai-tools-for-developers](<https://devfeed.tech/tags/ai-tools-for-developers.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [google](<https://devfeed.tech/tags/google.md>), [google-io](<https://devfeed.tech/tags/google-io.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>)

### AI overview

This article reviews Google I/O 26 with a focus on Gemini models, developer tools, the Android ecosystem, Android 17, and opportunities involving UI, performance, and AI.

### Source excerpt

In the AI Age, Google continue to thrive in its mobile ecosystem Continue reading on Mobile App Development Publication "

## Implement Android 17's Contact Picker

DevFeed: [Implement Android 17's Contact Picker](<https://devfeed.tech/articles/ditch-read-contacts-forever-android-17-s-secure-contact-picker-25981.md>)

Original publisher: [Read original article](<https://proandroiddev.com/ditch-read-contacts-forever-android-17s-secure-contact-picker-24c5c69b3b51?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-06-07T19:28:49Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [implementation](<https://devfeed.tech/topics/implementation.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android17](<https://devfeed.tech/tags/android17.md>), [androidappdevelopment-usa](<https://devfeed.tech/tags/androidappdevelopment-usa.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [contactpicker](<https://devfeed.tech/tags/contactpicker.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [permission](<https://devfeed.tech/tags/permission.md>), [privacy](<https://devfeed.tech/tags/privacy.md>)

### AI overview

A tutorial on implementing Android 17's Contact Picker as a privacy-preserving alternative to READ_CONTACTS. It covers requesting contact data fields, launching the picker, handling result URIs, multi-selection, and compatibility behavior.

### Source excerpt

Image generated using Perplexity In this article, we will learn how to implement the new Contact Picker introduced in Android17. Contact picker | Android Developers Contact picker -- Android17 It is a standardized, browsable interface for sharing contacts. A privacy-preserving alternative to the READ_CONTACTS permission, the picker runs on Android 17 and higher. 🪦 READ_CONTACTS Permission 🪦 It grants apps full, persistent access to all contact data -- names, phone numbers, emails, etc -- after a one-time user approval (runtime permission). Protection level: dangerous ⛔ Apps specify which data fields they need, such as phone numbers or email addresses, and users select specific contacts to share. With built-in search, profile switching, and multi-selection capabilities, the app reads only the selected data, ensuring granular control. Implementation Intent Action: ACTION_PICK_CONTACTS We will be able to specify multiple data fields our app will need at once. We do this using Intent.EXTRA_REQUESTED_DATA_FIELDS, passing an ArrayList<String> of MIME types defined in ContactsContract.CommonDataKinds. MIME Types: //... ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE //...Define the ActivityResultLauncherval contactPickerLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_OK) { val uri = result.data?.data ?: return@rememberLauncherForActivityResult // Process the result URI.... processCPResultUri(uri, context) } }Launch the ContactPicker 📲 Define the intent val requestedFields = arrayListOf( ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE ) // Set up the intent val pickContactIntent = Intent(ContactsPickerSessionContract.ACTION_PICK_CONTACTS).apply { // Enable multi-select - true/false putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) // Set limit of selectable contacts putExtra(EXTRA_PICK_CONTACTS_SE

## Google I/O 2026: The Sessions Worth Your Time

DevFeed: [Google I/O 2026: The Sessions Worth Your Time](<https://devfeed.tech/articles/google-i-o-2026-the-sessions-worth-your-time-24910.md>)

Original publisher: [Read original article](<https://blog.blundellapps.co.uk/google-i-o-2026-the-sessions-worth-your-time/>)

Author: blundell

Published: 2026-06-02T17:22:00Z

Content type: opinion

Language: en

Sources: [Blundell](<https://devfeed.tech/sources/blundell.md>)

Topics: [Google](<https://devfeed.tech/topics/google.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Android](<https://devfeed.tech/topics/android.md>), [Model Context Protocol](<https://devfeed.tech/topics/model-context-protocol.md>), [Jetpack](<https://devfeed.tech/topics/jetpack.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [2026](<https://devfeed.tech/tags/2026.md>), [agent](<https://devfeed.tech/tags/agent.md>), [agentic](<https://devfeed.tech/tags/agentic.md>), [ai](<https://devfeed.tech/tags/ai.md>), [android](<https://devfeed.tech/tags/android.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [antigravity](<https://devfeed.tech/tags/antigravity.md>), [generative-ui](<https://devfeed.tech/tags/generative-ui.md>), [google](<https://devfeed.tech/tags/google.md>), [google-i-o](<https://devfeed.tech/tags/google-i-o.md>), [google-io](<https://devfeed.tech/tags/google-io.md>), [intermediate](<https://devfeed.tech/tags/intermediate.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [mcp](<https://devfeed.tech/tags/mcp.md>), [reference](<https://devfeed.tech/tags/reference.md>), [reference-androiddev-google-io](<https://devfeed.tech/tags/reference-androiddev-google-io.md>)

### AI overview

An opinionated guide to the Google I/O 2026 sessions most relevant to developers. It highlights Gemini updates, agent transaction protocols, generative UI in Google Search, and Android App Functions, which are presented as being in preview and enabling assistants to call app capabilities.

### Source excerpt

Like every year, I binge-watched I/O. And like every year I came out the other side with more links than time. A fire-hose of announcements, most of which you'll never touch, a handful of which will change how you work next week. Here I filter for you. Links to the sessions are inline so you [...] The post Google I/O 2026: The Sessions Worth Your Time first appeared on Blundell.

## Migrating to AGP 9.2.1: Kotlin build errors I hit and how I fixed them

DevFeed: [Migrating to AGP 9.2.1: Kotlin build errors I hit and how I fixed them](<https://devfeed.tech/articles/migrating-to-agp-9-2-1-kotlin-build-errors-i-hit-and-how-i-fixed-them-25977.md>)

Original publisher: [Read original article](<https://navczydev.medium.com/migrating-to-agp-9-2-1-kotlin-build-errors-i-hit-and-how-i-fixed-them-1565bb36b96f?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-05-27T01:03:56Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [developer tooling](<https://devfeed.tech/topics/developer-tooling.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-gradle-plugin](<https://devfeed.tech/tags/android-gradle-plugin.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [dagger-hilt](<https://devfeed.tech/tags/dagger-hilt.md>), [errors](<https://devfeed.tech/tags/errors.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [ksp](<https://devfeed.tech/tags/ksp.md>), [migration](<https://devfeed.tech/tags/migration.md>)

### AI overview

A tutorial documenting a small Android project migration to AGP 9.2.1. It explains build errors caused by AGP 9's built-in Kotlin support and shows fixes involving removal of the old Kotlin Android plugin, migration from KAPT to KSP for Hilt, and replacement of the legacy kotlinOptions DSL.

### Source excerpt

Image generate using perplexity I recently upgraded an Android project to AGP 9.2.1 and ran into a chain of build errors. In my case, the project was a very small app, so there might be more issues if the project setup is complicated. Each one pointed to a different part of the new Kotlin/Gradle setup, and fixing them one by one made the migration much clearer. Why this happened AGP 9 introduces built-in Kotlin support that changes the old plugin setup (org.jetbrains.kotlin.android). 🛑 kapt, and kotlinOptions no longer work the same way. Error 1: Cannot add extension with name kotlinCannot add extension with name 'kotlin', as there is an extension already registered with that name. The fix was to remove the Kotlin Android plugin from the module and any root-level declarations that still applied it. AGP 9 already provides Kotlin support, so applying the old plugin causes a duplicate kotlin extension.Fixplugins { id("com.android.application") // remove: id("org.jetbrains.kotlin.android") }Error 2: org.jetbrains.kotlin.kapt is not compatible with built-in Kotlin support After removing the Kotlin Android plugin, the next failure came from kapt The 'org.jetbrains.kotlin.kapt' plugin is not compatible with built-in Kotlin support. Android's migration guide recommends moving to KSP, or using com.android.legacy-kapt only as a temporary fallback.Fix After removing kapt, we need to update the affected libraries. In my case, only Hilt was affected, so I updated it with the KSP plugins { //.... // Remove KAPT kotlin("kapt") // Add KSP id("com.google.devtools.ksp") } // dependencies dependencies { // kapt(libs.hilt.compiler) ksp(libs.dagger.hilt.compiler) // ... }Error 3: Unresolved reference: kotlinOptions Once kapt was out of the way, the build hit another issue 🤯 Unresolved reference 'kotlinOptions' That's because AGP 9 built-in Kotlin uses the new Kotlin compiler options DSL instead of the old android.kotlinOptions {} block. The Android migration doc says to move those setti

## Android Skills: Expert Instructions for Your AI Agent

DevFeed: [Android Skills: Expert Instructions for Your AI Agent](<https://devfeed.tech/articles/android-skills-expert-instructions-for-your-ai-agent-24902.md>)

Original publisher: [Read original article](<https://blog.blundellapps.co.uk/android-skills-expert-instructions-for-your-ai-agent/>)

Author: blundell

Published: 2026-04-24T22:10:46Z

Content type: tutorial

Language: en

Sources: [Blundell](<https://devfeed.tech/sources/blundell.md>)

Topics: [Android skills](<https://devfeed.tech/topics/android-skills.md>), [Agent Skills](<https://devfeed.tech/topics/agent-skills.md>), [AI Agent](<https://devfeed.tech/topics/ai-agent.md>), [Claude Code](<https://devfeed.tech/topics/claude-code.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [GitHub](<https://devfeed.tech/topics/github.md>)

Tags: [agent-skills](<https://devfeed.tech/tags/agent-skills.md>), [ai](<https://devfeed.tech/tags/ai.md>), [ai-agent](<https://devfeed.tech/tags/ai-agent.md>), [android](<https://devfeed.tech/tags/android.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [android-skills](<https://devfeed.tech/tags/android-skills.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [claude-code](<https://devfeed.tech/tags/claude-code.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [github](<https://devfeed.tech/tags/github.md>), [intermediate](<https://devfeed.tech/tags/intermediate.md>), [reference](<https://devfeed.tech/tags/reference.md>), [reference-ai-androiddev-claude-code-gemini](<https://devfeed.tech/tags/reference-ai-androiddev-claude-code-gemini.md>), [skills](<https://devfeed.tech/tags/skills.md>)

### AI overview

This tutorial explains Google's Android skills repository and the open agent-skills format, then shows how to make the skills available in Claude Code instead of using the repository's default Gemini CLI setup.

### Source excerpt

Google just published a set of Android skills a collection of expert, AI-optimised instructions covering the most common and painful Android development workflows. (Upgrading to AGP 9, migrating XML layouts to Compose, wiring up Navigation 3.) AI automated step-by-step procedures grounded in official Android best practices. The GitHub repo defaults to wiring them into Gemini [...] The post Android Skills: Expert Instructions for Your AI Agent first appeared on Blundell.

## A Practical Guide to Paging 3 in Jetpack Compose

DevFeed: [A Practical Guide to Paging 3 in Jetpack Compose](<https://devfeed.tech/articles/a-practical-guide-to-paging-3-in-jetpack-compose-29452.md>)

Original publisher: [Read original article](<https://medium.com/mobile-app-development-publication/a-practical-guide-to-paging-3-in-jetpack-compose-e88f56c5b2df?source=rss----f9c208bdbb09---4>)

Author: Elye - A Dev By Grace

Published: 2026-04-07T08:16:16Z

Content type: tutorial

Language: en

Sources: [Mobile App Development Publication - Medium](<https://devfeed.tech/sources/mobile-app-development-publication-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>), [API](<https://devfeed.tech/topics/api.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [mobile-app-development](<https://devfeed.tech/topics/mobile-app-development.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [api](<https://devfeed.tech/tags/api.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [guide](<https://devfeed.tech/tags/guide.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>), [programming](<https://devfeed.tech/tags/programming.md>)

### AI overview

A practical tutorial on using Paging 3 with Jetpack Compose to paginate server data from a GraphQL API in an Android application. It covers the limitations of loading very large lists at once and introduces built-in handling for loading states, retries, scroll-triggered fetching, and empty states.

### Source excerpt

How To Elegantly Page Your Server Data on Your Android App Continue reading on Mobile App Development Publication "

## Integrating the biometric-compose Library with Android Compose Applications

DevFeed: [Integrating the biometric-compose Library with Android Compose Applications](<https://devfeed.tech/articles/biometric-auth-in-compose-made-easy-the-new-library-you-need-25980.md>)

Original publisher: [Read original article](<https://proandroiddev.com/biometric-auth-in-compose-made-easy-the-new-library-you-need-29814270506d?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-04-02T02:28:19Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Authentication](<https://devfeed.tech/topics/authentication.md>), [Android](<https://devfeed.tech/topics/android.md>), [Library](<https://devfeed.tech/topics/library.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [article](<https://devfeed.tech/tags/article.md>), [auth](<https://devfeed.tech/tags/auth.md>), [authentication](<https://devfeed.tech/tags/authentication.md>), [biometric-authentication](<https://devfeed.tech/tags/biometric-authentication.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [library](<https://devfeed.tech/tags/library.md>)

### AI overview

This tutorial explains how to integrate the biometric-compose library into Android applications built with Jetpack Compose. It covers rememberAuthenticationLauncher, authentication callbacks, result handling, prompt configuration and customization, and authentication fallbacks.

### Source excerpt

Image generated using Perplexity In this article, we will learn how to integrate a new library biometric-compose into Android applications for Biometric integration. A new biometric-compose library simplifies the integration of biometrics into Compose-based applications. ImplementationDependencies implementation("androidx.biometric:biometric:1.4.0-alpha06") implementation("androidx.biometric:biometric-compose:1.4.0-alpha06")rememberAuthenticationLauncherrememberAuthenticationLauncher A composable function to streamline biometric authentication requests and callbacks directly in composables. It returns AuthenticationResultLauncher that we can use to initiate the authentication process. We need to pass a callback of type AuthenticationResultCallback . It will be called when an AuthenticationResult is available. A successful or error result will be delivered to AuthenticationResultCallback.onAuthResult , and failures will be delivered to AuthenticationResultCallback.onAuthAttemptFailed, which is set by a callback. The 👆callback will be executed on the main thread.fun AuthenticationResult.processAuthResult(){ when (this) { is AuthenticationResult.Success -> Log.d(TAG, "AuthenticationResult Success, \nAuth type: $authType, \nCrypto object: $crypto") is AuthenticationResult.Error -> Log.d(TAG,"AuthenticationResult Error, \nError code: $errorCode, \nErr string: $errString") is AuthenticationResult.CustomFallbackSelected -> { Log.d(TAG,"AuthenticationResult CustomFallbackSelected ${fallback.text}") } } }AuthenticationResultTypeAuthenticationResultTypeDemo AuthenticationResultTypeAuthenticationError (Error code)AuthenticationError (Error code)Demo AuthenticationError (Error code)🧑💻 Code: rememberAuthenticationLauncherval launcher = rememberAuthenticationLauncher( resultCallback = object : AuthenticationResultCallback { override fun onAuthResult(result: AuthenticationResult) { Log.d(TAG, "onAuthResult: $result") processAuthResult() } override fun onAuthAttemptFailed() { supe

## Meet FlexBox: The Powerful New Layout System for Compose

DevFeed: [Meet FlexBox: The Powerful New Layout System for Compose](<https://devfeed.tech/articles/meet-flexbox-the-powerful-new-layout-system-for-compose-25986.md>)

Original publisher: [Read original article](<https://proandroiddev.com/meet-flexbox-the-powerful-new-layout-system-for-compose-446b1f65cc62?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-03-27T18:22:23Z

Content type: article

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [CSS](<https://devfeed.tech/topics/css.md>)

Tags: [3](<https://devfeed.tech/tags/3.md>), [adaptive](<https://devfeed.tech/tags/adaptive.md>), [alignment](<https://devfeed.tech/tags/alignment.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [api](<https://devfeed.tech/tags/api.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [container](<https://devfeed.tech/tags/container.md>), [css](<https://devfeed.tech/tags/css.md>), [flexbox](<https://devfeed.tech/tags/flexbox.md>), [introduction](<https://devfeed.tech/tags/introduction.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [layout](<https://devfeed.tech/tags/layout.md>), [space](<https://devfeed.tech/tags/space.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial introduces FlexBox, a new Jetpack Compose layout system inspired by CSS Flexbox. It explains how FlexBox arranges children dynamically and covers FlexBoxConfig parameters for direction, wrapping, alignment, spacing, and item distribution, along with Modifier.flex controls and code samples.

### Source excerpt

Header image Jetpack Compose continues to evolve, and with the introduction of the new FlexBox layout, we finally have a powerful, flexible way to design adaptive UIs -- inspired by the CSS Flexbox model. https://developer.android.com/develop/ui/compose/layouts/adaptive/flexbox If you've ever used Row, Column, or FlowRowYou'll feel right at home. FlexBox acts as a superset, combining their capabilities while providing granular control over alignment, wrapping, and item distribution. Until now, we had to choose between rigid layouts (Row/Column) or more dynamic ones (FlowRow/FlowColumn). FlexBox merges the best of both worlds -- flexibility and simplicity. What Is FlexBox? Composable brings the concept of flexible layouts from the web into Jetpack Compose. Arranges its children dynamically, allowing them to grow, shrink, or wrap based on available space and configuration. Preview FlexBoxFlexBox API🏗 Building blocks and their roles.FlexBoxThe main composable responsible for arranging children.FlexBox( config = { direction(FlexDirection.Row) wrap(FlexWrap.Wrap) justifyContent(FlexJustifyContent.SpaceBetween) alignItems(FlexAlignItems.Center) gap(8.dp) }, modifier = Modifier .border(1.dp, Color.Black) ) { Text( "Item 1", Modifier .flex { grow(1f) } .background(color = randomColor()) .border(1.dp, Color.Black) ) Text( "Item 2", Modifier .flex { basis(80.dp) } .background(color = randomColor())) }Screenshot FlexBox SampleFlexBoxConfigConfigures the container's layout behavior -- direction, wrapping, justification, alignment, and spacing. Key parameters: direction: Controls the main axis (Row, Column). wrap: Determines if items flow onto new lines. Here we have 3 options: Wrap, NoWrap, WrapReverse justifyContent: Distributes space along the main axis(start, end, etc). alignItems: Defines how items align on the cross-axis(start, end, etc). alignContent: Controls how multiple lines are distributed along the cross-axis. This applies only when the wrap is FlexWrap.Wrap or FlexWr

## Beyond Positions: Kotlin's New Name-Based Destructuring

DevFeed: [Beyond Positions: Kotlin's New Name-Based Destructuring](<https://devfeed.tech/articles/beyond-positions-kotlin-s-new-name-based-destructuring-25979.md>)

Original publisher: [Read original article](<https://proandroiddev.com/beyond-positions-kotlins-new-name-based-destructuring-eee347d1bb5c?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-03-18T01:24:50Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>), [properties](<https://devfeed.tech/topics/properties.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [data-class](<https://devfeed.tech/tags/data-class.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-2](<https://devfeed.tech/tags/kotlin-2.md>), [kotlin-native](<https://devfeed.tech/tags/kotlin-native.md>), [properties](<https://devfeed.tech/tags/properties.md>)

### AI overview

This tutorial explains Kotlin 2.3.20's experimental name-based destructuring declarations, which match variables to properties instead of relying on componentN() position. It also covers the compiler option and supported modes.

### Source excerpt

Image generated using Perplexity Name-based destructuring declarations were introduced in Kotlin 2.3.20 and match variables to properties rather than relying on position-based componentN(). Previously, destructive declarations used position-based destruction: data class User(var firstName: String, var lastName: String) val user = User("Alice", "Husseini") // componentN() val(firstName,lastName) = user println(firstName) println(lastName)Drawback of the componentN() based approach Destructuring relies on the order of componentN() functions, lastName receives the value of firstName, and firstName receives the value of lastName 👇 data class User(var firstName: String, var lastName: String) val user = User("Alice", "Husseini") // componentN() val(lastName,firstName) = user println(firstName) -> Husseini println(lastName) -> AliceName-based destructuring ✨ It's an Experimental feature. We can control how the compiler interprets destructuring declarations with the -Xname-based-destructuring compiler option. kotlin { // .. compilerOptions { freeCompilerArgs.add("-Xname-based-destructuring=only-syntax") } }Each variable refers to a property by name.val user = User("Alice", "Husseini") // Name-based destructuring (val firstName = firstName, val lastName = lastName) = userModeshttps://kotlinlang.org/docs/whatsnew2320.html#languageMode -- Name-Mismatch⚠ Warning ⚠Name-Mismatch warningMode -- Complete Position-based destructuring using square brackets []: data class User(var firstName: String, var lastName: String) val user = User("Alice", "Husseini") // componentN() val [firstName,lastName] = userReferences What's new in Kotlin 2.3.20 | Kotlin Stay in touch https://www.linkedin.com/in/navczydev/ JavaScript is not available. navczydev - Overview navczydev.bsky.social Beyond Positions: Kotlin's New Name-Based Destructuring was originally published in ProAndroidDev on Medium, where people are continuing the conversation by highlighting and responding to this story.

## Jetpack Compose Material 3 unifies theme data in LocalMaterialTheme

DevFeed: [Jetpack Compose Material 3 unifies theme data in LocalMaterialTheme](<https://devfeed.tech/articles/localmaterialtheme-from-prop-hell-to-theme-nirvana-material3-25984.md>)

Original publisher: [Read original article](<https://proandroiddev.com/localmaterialtheme-from-prop-hell-to-theme-nirvana-material3-38b3c01ab7d4?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-03-12T19:38:30Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Design system](<https://devfeed.tech/topics/design-system.md>)

Tags: [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [design-systems](<https://devfeed.tech/tags/design-systems.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [material-design](<https://devfeed.tech/tags/material-design.md>), [material3](<https://devfeed.tech/tags/material3.md>)

### AI overview

Jetpack Compose Material 3 1.5.0-alpha15 changes MaterialTheme to use one LocalMaterialTheme CompositionLocal for color, typography, shapes, and motion. The article explains how this can simplify theme management and allow custom modifier nodes to read theme data outside composable scopes.

### Source excerpt

Image generated using Perplexity Jetpack Compose Material 3 1.5.0-alpha15 introduces a subtle but powerful refactor MaterialTheme now uses a single LocalMaterialTheme CompositionLocal instead of separate locals for color, typography, shapes, and motion. While this simplifies internal theme management, its real value emerges when building custom design systems and theme-aware Modifier libraries. The Refactor: Cleaner Under the Hood Previously, MaterialTheme relied on multiple CompositionLocals: Source:https://android-review.googlesource.com/c/platform/frameworks/support/+/3949000/16/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt Now: Everything flows through one unified source: Source:https://android-review.googlesource.com/c/platform/frameworks/support/+/3949000/16/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.ktThis reduces allocations and simplifies the theme provider.⭐ Where It Shines: Design Systems & Custom Modifiers ⭐ The game-changer is CompositionLocalConsumerModifierNode support. Custom Modifiers that handle drawing/layout outside @Composable scopes can now read theme data directly:object BrandGradientOverlayElement : ModifierNodeElement<BrandGradientOverlayNode>() { override fun create(): BrandGradientOverlayNode = BrandGradientOverlayNode() override fun update(node: BrandGradientOverlayNode) { // No-Op } override fun InspectorInfo.inspectableProperties() { name = "brandGradientOverlay" } override fun equals(other: Any?): Boolean = (this === other) override fun hashCode(): Int = javaClass.hashCode() } class BrandGradientOverlayNode : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode { override fun ContentDrawScope.draw() { // Read color scheme to access colors val colorScheme = currentValueOf(MaterialTheme.LocalMaterialTheme).colorScheme val gradient = Brush.linearGradient( listOf( colorScheme.primary, colorScheme.secondary) ) drawContent() d

## Where are all the staff+ Android product engineers?

DevFeed: [Where are all the staff+ Android product engineers?](<https://devfeed.tech/articles/where-are-all-the-staff-android-product-engineers-39046.md>)

Original publisher: [Read original article](<https://www.zacsweers.dev/where-are-the-staf-android-product-engineers/>)

Author: Zac Sweers

Published: 2026-02-09T22:32:38Z

Content type: opinion

Language: en

Sources: [Zac Sweers](<https://devfeed.tech/sources/zac-sweers.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [iOS](<https://devfeed.tech/topics/ios.md>), [Users](<https://devfeed.tech/topics/users.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [developer](<https://devfeed.tech/tags/developer.md>), [mobile](<https://devfeed.tech/tags/mobile.md>)

### AI overview

The article examines why staff-level Android product engineers are difficult for companies to find and why those engineers may struggle to find product-focused roles. It argues that many Android engineers move toward infrastructure because iOS receives greater product, design, executive, and resourcing attention at many US technology companies.

### Source excerpt

Over the years I've heard (and experienced) both sides of a rather odd coin in the Android developer world. Side 1: Companies, particularly startups and small teams, want staff+ Android product engineers and struggle to find them. Side 2: Staff+ Android engineers struggle to find jobs if they

## Android Security: mobsfscan

DevFeed: [Android Security: mobsfscan](<https://devfeed.tech/articles/android-security-mobsfscan-27032.md>)

Original publisher: [Read original article](<https://blog.stackademic.com/android-security-mobsfscan-7cd9f52e19a0?source=rss-be40b368c57e------2>)

Author: Matthew Dolan

Published: 2026-01-16T17:51:35Z

Content type: tutorial

Language: en

Sources: [Stories by Matthew Dolan on Medium](<https://devfeed.tech/sources/stories-by-matthew-dolan-on-medium.md>)

Topics: [Android Security](<https://devfeed.tech/topics/android-security.md>), [Mobile Security](<https://devfeed.tech/topics/mobile-security.md>), [Security](<https://devfeed.tech/topics/security.md>), [GitHub Actions](<https://devfeed.tech/topics/github-actions.md>), [CI/CD](<https://devfeed.tech/topics/cicd.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [Docker Image](<https://devfeed.tech/topics/docker-image.md>)

Tags: [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-security](<https://devfeed.tech/tags/android-security.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [build-secure-apps](<https://devfeed.tech/tags/build-secure-apps.md>), [ci-cd](<https://devfeed.tech/tags/ci-cd.md>), [docker-image](<https://devfeed.tech/tags/docker-image.md>), [github](<https://devfeed.tech/tags/github.md>), [github-actions](<https://devfeed.tech/tags/github-actions.md>), [mobile-security](<https://devfeed.tech/tags/mobile-security.md>), [security](<https://devfeed.tech/tags/security.md>)

### AI overview

A tutorial on using the free, open-source mobsfscan tool to detect insecure code patterns in mobile applications. It focuses on running mobsfscan with GitHub Actions and uploading SARIF results to GitHub's Security tab.

### Source excerpt

Not a medium member? "Read for free" Continue reading on Stackademic "

## Inside Jetpack ViewModel: Internal Mechanisms and Multiplatform Design

DevFeed: [Inside Jetpack ViewModel: Internal Mechanisms and Multiplatform Design](<https://devfeed.tech/articles/inside-jetpack-viewmodel-internal-mechanisms-and-multiplatform-design-25922.md>)

Original publisher: [Read original article](<https://proandroiddev.com/inside-jetpack-viewmodel-internal-mechanisms-and-multiplatform-design-2625671eaef8?source=rss-9bb203a4ab2e------2>)

Author: Jaewoong Eum

Published: 2025-12-07T02:29:08Z

Content type: tutorial

Language: en

Sources: [Stories by Jaewoong Eum on Medium](<https://devfeed.tech/sources/stories-by-jaewoong-eum-on-medium.md>)

Topics: [Jetpack](<https://devfeed.tech/topics/jetpack.md>), [Android](<https://devfeed.tech/topics/android.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [caching](<https://devfeed.tech/tags/caching.md>), [change](<https://devfeed.tech/tags/change.md>), [coroutines](<https://devfeed.tech/tags/coroutines.md>), [interface](<https://devfeed.tech/tags/interface.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [key-value-store](<https://devfeed.tech/tags/key-value-store.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [lifecycle](<https://devfeed.tech/tags/lifecycle.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [viewmodel](<https://devfeed.tech/tags/viewmodel.md>)

### AI overview

A technical tutorial explaining Jetpack ViewModel's internal mechanisms, including retention across configuration changes, ViewModelStore key-value caching, ViewModelProvider creation, factory-based instantiation, resource cleanup, and coroutine integration.

### Source excerpt

Unsplash@davidvig Jetpack's ViewModel has become an essential component of modern Android development, providing a lifecycle-aware container for UI-related data that survives configuration changes. While the API appears simple on the surface, the internal machinery reveals design decisions around lifecycle management, multiplatform abstraction, resource cleanup, and thread-safe caching. Understanding how ViewModel works under the hood helps you make better architectural decisions and avoid subtle bugs. In this article, you'll dive deep into how Jetpack ViewModel works internally, exploring how the ViewModelStore retains instances across configuration changes, how ViewModelProvider orchestrates creation and caching, how the factory pattern enables flexible instantiation, how CreationExtras enables stateless factories, how resource cleanup is managed through the Closeable pattern, and how viewModelScope integrates coroutines with the ViewModel lifecycle. The fundamental problem: Surviving configuration changes Configuration changes present a fundamental challenge for Android development. When a user rotates their device, changes language settings, or triggers any configuration change, the system destroys and recreates the Activity. Any data stored in the Activity is lost: https://medium.com/media/82ee86f042e31a1ede3f551f919b4429/href The naive approach is to use onSaveInstanceState(): https://medium.com/media/74f2c1da669e831b1488b3f297d55997/href This works for small, serializable data. But what about large datasets, network connections, or objects that can't be serialized? What about ongoing operations like network requests? The Bundle approach fails for these cases, both because of size limitations and because serialization/deserialization is expensive. ViewModel solves this by providing a lifecycle-aware container that survives configuration changes through a retained object pattern, not serialization. The ViewModelStore: The retention mechanism At the heart of Vie

## Distributing big AI models in mobile apps

DevFeed: [Distributing big AI models in mobile apps](<https://devfeed.tech/articles/distributing-big-ai-models-in-mobile-apps-22780.md>)

Original publisher: [Read original article](<https://medium.com/microsoft-mobile-engineering/distributing-big-ai-models-in-mobile-apps-ae674e501d3d?source=rss----87f10537e947---4>)

Author: SwiftKey

Published: 2025-12-04T15:31:35Z

Content type: tutorial

Language: en

Sources: [Android@Microsoft - Medium](<https://devfeed.tech/sources/android-microsoft-medium.md>)

Topics: [Mobile](<https://devfeed.tech/topics/mobile.md>), [Android](<https://devfeed.tech/topics/android.md>), [AI Models](<https://devfeed.tech/topics/ai-models.md>), [App](<https://devfeed.tech/topics/app.md>), [Generative AI](<https://devfeed.tech/topics/generative-ai.md>)

Tags: [ai-model-distribution](<https://devfeed.tech/tags/ai-model-distribution.md>), [ai-models](<https://devfeed.tech/tags/ai-models.md>), [ai-on-mobile](<https://devfeed.tech/tags/ai-on-mobile.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [app](<https://devfeed.tech/tags/app.md>), [app-size](<https://devfeed.tech/tags/app-size.md>), [apps](<https://devfeed.tech/tags/apps.md>), [generative-ai](<https://devfeed.tech/tags/generative-ai.md>), [mobile](<https://devfeed.tech/tags/mobile.md>)

### AI overview

This article explains how the Microsoft SwiftKey team approaches adding AI features to an Android mobile app while controlling download and installation size. It describes the app's size constraints, the components that can make an AI feature large, and the trade-offs teams consider when deciding how to distribute large models.

### Source excerpt

This is based on a talk given by Beatriz Viñal Murciano (LinkedIn) at droidcon SF (June 2024, video, slides) and Víctor Julián García Granado (LinkedIn) at droidcon Lisbon (September 2024, video) about how we use AI models in our app. The SwiftKey team is one of the many teams working on Android at Microsoft. We build the Microsoft SwiftKey AI Keyboard app for Android ("SwiftKey" from now on). SwiftKey is a keyboard app that lets you type by tapping on keys or sliding your finger over them, correcting and predicting what you type and learning from your typing. It supports over 700 languages (up to 6 of them at the same time) and it has an ever-increasing number of other features such as emoji, GIFs, clipboard and integration of new generative AI products like Copilot and Designer. As we evolve the product, we've made an effort to keep the app size small. SwiftKey's download size is currently around 20MB and its install size right after installation is around 55MB, although it increases over time. Size matters to our users and partners, who prefer apps that are as small as possible. It matters to us too, because apart from our wish to respect users' data and storage, if the app is bigger users are more likely to uninstall it and partnering with device manufactures is more difficult. We discussed app size at length in App size reduction at Microsoft SwiftKey. We've noticed that an increasing number of the latest feature proposals include some form of AI, i.e. they require some sort of probabilistic model that takes some data as input, does some processing, and returns some data as output. This AI is represented by a green box called "AI feature" in the diagrams to simplify. The box can include one or more models, the engine that processes the models and other related data they need to work as well, which can get quite big (usually due to the model(s) size) and may need to be handled carefully to avoid unnecessarily increasing the app size. How big does an AI feature n

## 8 steps to success with Gemini in Android Studio

DevFeed: [8 steps to success with Gemini in Android Studio](<https://devfeed.tech/articles/8-steps-to-success-with-gemini-in-android-studio-25181.md>)

Original publisher: [Read original article](<https://joebirch.co/android/8-steps-to-success-with-gemini-in-android-studio/>)

Author: hitherejoe

Published: 2025-10-31T09:43:36Z

Content type: tutorial

Language: en

Sources: [Joe Birch](<https://devfeed.tech/sources/joe-birch.md>)

Topics: [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [configuration](<https://devfeed.tech/topics/configuration.md>), [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [context](<https://devfeed.tech/topics/context.md>), [context window](<https://devfeed.tech/topics/context-window.md>), [API keys](<https://devfeed.tech/topics/api-keys.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [ai-agents](<https://devfeed.tech/tags/ai-agents.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-apps](<https://devfeed.tech/tags/android-apps.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [api](<https://devfeed.tech/tags/api.md>), [app-development](<https://devfeed.tech/tags/app-development.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [context-window](<https://devfeed.tech/tags/context-window.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [ide](<https://devfeed.tech/tags/ide.md>), [mobile-app-development](<https://devfeed.tech/tags/mobile-app-development.md>)

### AI overview

This tutorial presents configuration and workflow practices for using Gemini in Android Studio. It discusses API keys, larger context windows, agent rules, and Agents.MD files, with the goal of improving prompt results and trust in AI-assisted development.

### Source excerpt

AI tooling is becoming a key part of our day-to-day and now with solid Gemini support in Android Studio, we're seeing engineers embed this deeper in their workflows. When they work well, AI Agents can help us to work more efficiently and give us more time to focus on other tasks. But when they don't... Continue reading ->

## Using Google Gemini in a Python Script to Fix Static Analysis Issues

DevFeed: [Using Google Gemini in a Python Script to Fix Static Analysis Issues](<https://devfeed.tech/articles/linting-automated-ai-powered-static-analysis-with-gemini-24911.md>)

Original publisher: [Read original article](<https://blog.blundellapps.co.uk/linting-automated-ai-powered-static-analysis-with-gemini/>)

Author: blundell

Published: 2025-09-23T16:24:26Z

Content type: tutorial

Language: en

Sources: [Blundell](<https://devfeed.tech/sources/blundell.md>)

Topics: [Artificial Intelligence](<https://devfeed.tech/topics/ai.md>), [Code quality](<https://devfeed.tech/topics/code-quality.md>), [Python](<https://devfeed.tech/topics/python.md>), [Google](<https://devfeed.tech/topics/google.md>), [Large Language Model](<https://devfeed.tech/topics/llm.md>), [Refactoring](<https://devfeed.tech/topics/refactoring.md>), [context window](<https://devfeed.tech/topics/context-window.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [build](<https://devfeed.tech/tags/build.md>), [code-quality](<https://devfeed.tech/tags/code-quality.md>), [context-window](<https://devfeed.tech/tags/context-window.md>), [detekt](<https://devfeed.tech/tags/detekt.md>), [gemini](<https://devfeed.tech/tags/gemini.md>), [google](<https://devfeed.tech/tags/google.md>), [intermediate](<https://devfeed.tech/tags/intermediate.md>), [python](<https://devfeed.tech/tags/python.md>), [refactoring](<https://devfeed.tech/tags/refactoring.md>), [reference](<https://devfeed.tech/tags/reference.md>), [reference-ai-androiddev-detekt-gemini](<https://devfeed.tech/tags/reference-ai-androiddev-detekt-gemini.md>)

### AI overview

This tutorial describes building a Python script that uses Google Gemini to automatically fix static analysis issues. It discusses the limitations of one-shot fixes, including LLM context-window limits, and explains how to curate the context sent to the model.

### Source excerpt

Tired of fixing endless linting errors? What if an AI could do it for you? In this post, we'll walk through how to build a Python script that uses Google's Gemini to automatically fix static analysis issues, exploring the process and the lessons learned along the way. This is a journey from a simple idea [...] The post Linting, Automated: AI-Powered Static Analysis with Gemini first appeared on Blundell.

[Next page](<https://devfeed.tech/tags/androiddev.md?cursor=WyIyMDI1LTA5LTIzVDE2OjI0OjI2KzAwOjAwIiwgImJiZTNhZTc1LWI1ZjgtNDk3ZC1iMTI3LWEyMTViOTZiNzcwNCJd>)