RSSAmplifier

Blog

Shreyas Patil's Blog

Senior Android Engineer @ Deliveroo. Google Developer Expert for Android. Writing about Android, Kotlin, and AI.

blog.shreyaspatil.devRSS feed ↗63 posts

Latest posts

Stop Ignoring Compose Stability (Yes, Even with Strong Skipping Mode)

Strong Skipping Mode doesn't make Compose stability obsolete. Discover the hidden referential equality trap causing silent recompositions in your app.

Inside SubcomposeLayout: Jetpack Compose’s Most Misunderstood API

A deep dive into the internals of SubcomposeLayout in Jetpack Compose. Learn how subcomposition actually works, why it breaks the phase rules, and the real node-thrashing cost it carries.

Building My Dream Developer Blog with Astro, Cloudflare, and AI

How I migrated my 60+ engineering blogs from Hashnode to a custom Astro setup on Cloudflare with the help of Google Antigravity AI.

The Future of Android Apps with AppFunctions

Explore the potential of Android AppFunctions for AI agents. Learn how apps can share functionality with intelligent assistants using self-describing functions.

session-bridge: I Made Two Claude Code Sessions Talk to Each Other

Building 'session-bridge': A Claude Code plugin that allows separate AI sessions to communicate and share context across different repositories.

Exploring CompositionLocal API internals in Jetpack Compose

Deep dive into the internals of Jetpack Compose's CompositionLocal API. Trace how data flows implicitly through the composition tree under the hood.

You Can't Multitask. Your AI Agent Can.

Boost your productivity with AI agents. Learn how to delegate complex tasks to AI tools like Claude Code and Gemini to overcome human multitasking limitations.

DroidCon: Debugging App Performance at Scale

Recap of my DroidCon India 2025 talk on debugging Android app performance at scale. Watch the session and learn about performance profiling tools.

A Simple key to a Better LazyList in Jetpack Compose

Learn how to optimize Jetpack Compose LazyList performance using keys. Understand how keys help reduce recompositions and improve scrolling efficiency.

Exploring PausableComposition internals in Jetpack Compose

Explore the internals of PausableComposition in Jetpack Compose. Learn how Compose manages state and effects when a composition is paused or resumed.

Deep dive into annotations in Jetpack Compose

An extensive deep dive into annotations in Jetpack Compose. Understand how @Composable, @Stable, @ReadOnlyComposable, and others work under the hood.

Understanding Dispatchers: Main and Main.immediate

A deep dive into Kotlin Coroutine Dispatchers. Understand the subtle but important difference between Dispatchers.Main and Dispatchers.Main.immediate in Android.

#51 - My developer blogging journey so far

A personal account of my journey as a tech blogger, from my first post in 2019 to becoming a GDE. Insights on English barriers, criticism, and why sharing matters.

Benchmark Insights: Direct State Propagation vs. Lambda-based State in Jetpack Compose

Performance benchmarks of direct state propagation vs. lambda-based state in Jetpack Compose. Learn which approach minimizes recompositions for better UI performance.

Skipping the invocation of intermediate composables

Learn how Jetpack Compose optimizes UI rendering by skipping intermediate composables. Understand how to design your UI for maximum performance.

Kotlin Exception Handling: Why Singleton Exceptions are a bad idea

Understand why using singleton exceptions in Kotlin can be a bad practice and how it affects stack traces and debugging in your applications.

Effortless Compose Compiler report analysis

A guide to analyzing Jetpack Compose compiler reports easily. Learn how to diagnose stability and skippability of your composables for better performance.

Capturing composable to a bitmap without losing a state

Learn how to capture a Jetpack Compose Composable as a Bitmap without losing its current state. A deep dive into capturing high-quality UI screenshots programmatically.

Rich media input from the keyboard in Compose

Learn how to handle rich media input (like GIFs and images) from the keyboard in Jetpack Compose, essential for modern chat applications.

Collecting items from the Flow in chunks💦

Learn how to collect Kotlin Flow items in chunks or intervals without losing data. A practical guide to handling high-frequency data streams efficiently.

Runtime Surprise: Kotlin Breaks Non-Nullability Promise on Developer Cheating in Field Initialization

A cautionary tale about Kotlin's non-nullability. Discover how incorrect field initialization can lead to unexpected NullPointerExceptions at runtime.

Solving the mystery of recompositions in Compose's LazyList

Debugging recompositions in Jetpack Compose LazyLists. Learn why your list items might be recomposing unnecessarily and how to fix it.

Sleepless Concurrency: delay() vs. Thread.sleep()

Explore the difference between delay() and Thread.sleep() in Kotlin. Understand how non-blocking concurrency works from a platform perspective.

PermissionFlow: A Reactive API for knowing the status of Android app permissions

Introduction to PermissionFlow: A reactive API for Android that simplifies tracking permission status changes using Kotlin Coroutines and Flow.

Simplifying Redux in Kotlin: "mutating" immutable states with Mutekt

Simplify state management in Kotlin with Mutekt. Learn how to write 'mutating' syntax for immutable states in Redux-like architectures.

Mastering Android App Performance: Analyzing Bottlenecks with Perfetto 🚦

Master Android app performance profiling with Perfetto. Learn how to identify and fix UI janks and bottlenecks using system tracing.

Leveraging the Snapshot Mutation Policies of Jetpack Compose

Understand Snapshot Mutation Policies in Jetpack Compose. Learn how to control when and how your UI recomposes based on state changes.

ViewModel: for UI business, not UI operations 😮

Stop misusing ViewModels! Learn why ViewModels should handle UI business logic, not UI operations like showing toasts or navigation.

Exploring "select" expression of Kotlin coroutines

Learn how to use the 'select' expression in Kotlin Coroutines to await multiple suspending functions and select the first one that completes.

Combining StateFlows and transforming it into a StateFlow

Master the art of combining multiple StateFlows into a single transformed StateFlow. Explore utilities and best practices for managing complex states in Kotlin.

Leveraging the Semaphore concept in Coroutines to limit the parallelism 🔀

Explore the concept of Semaphores in Kotlin Coroutines. Learn how to limit parallelism and manage resource access in concurrent programming.

Promise compose compiler and imply when you'll change 🤞

Understand the Compose compiler's stability promises. Learn how @Stable and @Immutable impact recomposition and how to help the compiler optimize your UI.

Automate library publishing to Maven Central with GitHub Actions Workflow Dispatch 🤖

Step-by-step guide to automating JVM library publishing to Maven Central using GitHub Actions and Workflow Dispatch for one-click releases.

Filtering and modifying text input in Jetpack Compose way

Learn how to filter and modify user text input in Jetpack Compose. A guide to implementing input constraints and formatting for TextField.

Navigating Screens in Jetpack Compose (DevFest India 2021 - Mobile Track)

Recap and resources from my DevFest India 2021 talk on Navigating Screens in Jetpack Compose. Learn the best practices for Compose navigation.

🙅‍♂️ Don't let ViewModel know about framework level dependencies

Explore best practices for Android ViewModels. Learn why keeping framework references out of ViewModels is crucial for testing and preventing memory leaks.

Observing Live connectivity status in Jetpack Compose way!

Learn how to observe live network connectivity status in Jetpack Compose. A reactive approach to handling internet availability in your Android app's UI.

Composing composable in the Text line with InlineTextContent in Jetpack Compose

Learn how to use InlineTextContent in Jetpack Compose to embed Composables directly within text lines for rich, interactive text experiences.

Providing AssistedInject supported ViewModel for Composable using Hilt

Learn how to provide Hilt ViewModels with AssistedInject to Jetpack Compose Composables for dynamic dependency injection with runtime parameters.

Don't let Kotlin's single-expression function ruin your business😲

Understand why relying on Kotlin's automatic type inference in single-expression functions can lead to subtle bugs and business logic failures.

Hide internal members of Kotlin Module from JVM 🔐

Learn how to properly hide internal Kotlin members from JVM to maintain a clean API for Java consumers when developing libraries.

Let your delegates auto-nullify references☠️

Learn how to use Kotlin property delegates to automatically nullify references in Android, preventing memory leaks in Fragments and Activities.

👨‍🍳 Cooking Tasty code in Kotlin 🍴 — Part 2

Part 2 of 'Cooking Tasty Code'. Dive deeper into Kotlin features like delegation, operator overloading, and more to enhance your coding style.

👨‍🍳 Cooking Tasty code in Kotlin 🍴 — Part 1

Part 1 of the 'Cooking Tasty Code' series. Explore Kotlin's syntactic sugar and features that help write cleaner, more readable, and idiomatic code.

🔥 Quickly distribute your app with Firebase App Distribution using GitHub Actions + Fastlane 🚀

Step-by-step guide to automating Android app distribution with Firebase App Distribution, GitHub Actions, and Fastlane for faster QA cycles.

Automate publishing app to the Google Play Store with GitHub Actions⚡+ Fastlane🏃

Automate your Android app deployment to Google Play Store using GitHub Actions and Fastlane. Implement a 'Code, Push, and Chill' workflow for your projects.

DevOps-ify Android libraries with GitHub Actions and Package Registry🚀

Learn how to use GitHub Package Registry (GPR) and GitHub Actions to safely publish and consume private or public Android libraries with ease.

Hello DataStore, Bye SharedPreferences👋 — Android📱 — Part 2: Proto DataStore

Jetpack DataStore Part 2: Deep dive into Proto DataStore for type-safe data storage in Android using Protocol Buffers.

Hello DataStore, Bye SharedPreferences👋 — Android📱 — Part 1: Preference DataStore

Introduction to Jetpack DataStore Part 1: Learn how to migrate from SharedPreferences to Preference DataStore for better data storage in Android.

🕵️ Accessing device location using SIM Card 🗺️📍

Discover a clever trick to access device location using SIM card info in Android. Learn how to handle mock location scenarios for better location accuracy.