# Saket Narayan

A wild developer appears. He works at Square. Find him on Twitter and Bluesky.

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

## Writing interactive screenshot tests in Compose UI with Touch Robot

DevFeed: [Writing interactive screenshot tests in Compose UI with Touch Robot](<https://devfeed.tech/articles/writing-interactive-screenshot-tests-in-compose-ui-with-touch-robot-29039.md>)

Original publisher: [Read original article](<https://saket.me/touch-robot/>)

Author: Saket Narayan

Published: 2026-05-24T06:09:55Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [screenshot-testing](<https://devfeed.tech/topics/screenshot-testing.md>), [ui-testing](<https://devfeed.tech/topics/ui-testing.md>), [Testing](<https://devfeed.tech/topics/testing.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [screenshot-testing](<https://devfeed.tech/tags/screenshot-testing.md>), [snapshots](<https://devfeed.tech/tags/snapshots.md>), [testing](<https://devfeed.tech/tags/testing.md>), [ui-testing](<https://devfeed.tech/tags/ui-testing.md>)

### AI overview

The article explains how Block built Touch Robot to generate fake touch events for interactive screenshot tests in Compose UI. It describes using animated PNG snapshots to verify interactions such as clicks, swipes, drawing, and pinch gestures, with deterministic frame comparisons for regression testing.

### Source excerpt

These are some examples of real issues that were happening at Block. Each of them was frustrating because we were regularly shipping broken experiences to customers despite having sufficient test coverage. We had screenshot tests using Paparazzi, but they were mostly static snapshots that verified layout correctness. We had connected device tests, but they ran [...] The post Writing interactive screenshot tests in Compose UI with Touch Robot appeared first on Saket Narayan.

## Generating rich link previews 10x faster

DevFeed: [Generating rich link previews 10x faster](<https://devfeed.tech/articles/generating-rich-link-previews-10x-faster-29027.md>)

Original publisher: [Read original article](<https://saket.me/generating-rich-link-previews-10x-faster/>)

Author: Saket Narayan

Published: 2025-12-23T06:10:00Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Library](<https://devfeed.tech/topics/library.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [HTTP](<https://devfeed.tech/topics/http.md>), [Streaming](<https://devfeed.tech/topics/streaming.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [http](<https://devfeed.tech/tags/http.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [library](<https://devfeed.tech/tags/library.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [real-time](<https://devfeed.tech/tags/real-time.md>)

### AI overview

This article explains how the Kotlin open-source library unfurl generates rich link previews by extracting social metadata. It describes replacing full-page downloads with jsoup's streaming HTML parser, enabling the downloader to stop once the relevant metadata is found. The change made unfurl 2.3.0 an order of magnitude faster and reduced data downloads, while also enabling trials with multiple HTTP user agents.

### Source excerpt

unfurl is one of my favorite open source libraries. Not because it's clever or complex, but because it's a tiny kotlin library that does one thing well: generate rich link previews by extracting their social metadata. You can try out its demo on your computer: brew install saket/repo/unfurl unfurl https://dog.ceo If you've ever pasted a [...] The post Generating rich link previews 10x faster appeared first on Saket Narayan.

## The pursuit of fast feedback loops

DevFeed: [The pursuit of fast feedback loops](<https://devfeed.tech/articles/the-pursuit-of-fast-feedback-loops-29025.md>)

Original publisher: [Read original article](<https://saket.me/fast-feedback-loops/>)

Author: Saket Narayan

Published: 2024-11-27T17:46:56Z

Content type: opinion

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Mobile](<https://devfeed.tech/topics/mobile.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [unit tests](<https://devfeed.tech/topics/unit-tests.md>), [jetbrains](<https://devfeed.tech/topics/jetbrains.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [hot-reloading](<https://devfeed.tech/tags/hot-reloading.md>), [incremental](<https://devfeed.tech/tags/incremental.md>), [jetbrains](<https://devfeed.tech/tags/jetbrains.md>), [layout](<https://devfeed.tech/tags/layout.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [screenshot](<https://devfeed.tech/tags/screenshot.md>), [tests](<https://devfeed.tech/tags/tests.md>)

### AI overview

This opinion argues that fast feedback loops for validating software changes matter more than hot reloading itself. It discusses the reliability history of hot-reload tools and describes using screenshot tests and unit tests to shorten UI and presentation/backend iteration cycles.

### Source excerpt

Sebastian Sellmair from JetBrains recently showed off a prototype of hot-reloading Compose UI code for deploying changes without rebuilding the project. It looks exciting and I want it to succeed. At the same time, I've learned to be cautiously optimistic about hot-reload solutions. Google has tried this multiple times: their first attempt (Instant Run) was [...] The post The pursuit of fast feedback loops appeared first on Saket Narayan.

## Building a sub-sampling image viewer for Compose UI

DevFeed: [Building a sub-sampling image viewer for Compose UI](<https://devfeed.tech/articles/building-a-sub-sampling-image-viewer-for-compose-ui-29021.md>)

Original publisher: [Read original article](<https://saket.me/compose-sub-sampling-image-viewer/>)

Author: Saket Narayan

Published: 2023-08-09T21:07:52Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Library](<https://devfeed.tech/topics/library.md>)

Tags: [4k](<https://devfeed.tech/tags/4k.md>), [android](<https://devfeed.tech/tags/android.md>), [building](<https://devfeed.tech/tags/building.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [deep](<https://devfeed.tech/tags/deep.md>), [developers](<https://devfeed.tech/tags/developers.md>), [display](<https://devfeed.tech/tags/display.md>), [image](<https://devfeed.tech/tags/image.md>), [library](<https://devfeed.tech/tags/library.md>), [loading](<https://devfeed.tech/tags/loading.md>), [memory](<https://devfeed.tech/tags/memory.md>), [ui](<https://devfeed.tech/tags/ui.md>), [zoom](<https://devfeed.tech/tags/zoom.md>)

### AI overview

An Android developer describes building Telephoto, a zoomable image viewer for Compose UI. The article explains sub-sampling and tiling techniques for displaying large images while reducing memory usage.

### Source excerpt

How do you display a 100mb image on Android without running into OutOfMemoryError? You can't. But you can cheat. For years Android developers have used Dave Morrissey's excellent library, subsampling-scale-image-view for displaying large bitmaps with deep zoom. It optimizes memory usage by loading lower resolution bitmaps whenever possible and avoiding loading parts of the original [...] The post Building a sub-sampling image viewer for Compose UI appeared first on Saket Narayan.

## Drawing custom text spans in Compose UI

DevFeed: [Drawing custom text spans in Compose UI](<https://devfeed.tech/articles/drawing-custom-text-spans-in-compose-ui-29020.md>)

Original publisher: [Read original article](<https://saket.me/compose-custom-text-spans/>)

Author: Saket Narayan

Published: 2022-07-12T15:49:24Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [animation](<https://devfeed.tech/tags/animation.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [library](<https://devfeed.tech/tags/library.md>), [modifiers](<https://devfeed.tech/tags/modifiers.md>), [porting](<https://devfeed.tech/tags/porting.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

A tutorial on drawing custom text decorations in Compose UI by annotating text, calculating layout coordinates, and manually rendering animated squiggly underlines. It also demonstrates rounded-corner text backgrounds and packages the implementation as a reusable library.

### Source excerpt

While exploring how text paragraphs are rendered in Compose UI, I nerd sniped myself into porting squiggly underlines from Sam Ruston's Buzzkill app. Sam's animation was implemented using TextView custom spans, but Compose UI does not offer any alternatives for them yet. While our friends at Google are prototyping text modifiers (first, second), I figured [...] The post Drawing custom text spans in Compose UI appeared first on Saket Narayan.

## Graduating from View IDs

DevFeed: [Graduating from View IDs](<https://devfeed.tech/articles/graduating-from-view-ids-29028.md>)

Original publisher: [Read original article](<https://saket.me/graduating-from-view-ids/>)

Author: Saket Narayan

Published: 2021-12-02T08:55:21Z

Content type: opinion

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [configuration](<https://devfeed.tech/topics/configuration.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [history](<https://devfeed.tech/tags/history.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [screen](<https://devfeed.tech/tags/screen.md>), [state](<https://devfeed.tech/tags/state.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

The article argues that Compose UI reduces the need to assign and maintain View IDs for state restoration. It contrasts this with traditional layouts, where missing IDs can prevent scroll position from surviving configuration changes, and explains that Compose can generate stable keys based on code location and handle state restoration automatically in many cases.

### Source excerpt

I found an old screen in Cash App today that wasn't retaining its scroll position across configuration changes. A peek into git history revealed that the author forgot to assign an ID to its scrollable layout for enabling state restoration. And would you even blame them? Sure, View IDs are necessary, but maintaining them manually [...] The post Graduating from View IDs appeared first on Saket Narayan.

## Great teams merge fast

DevFeed: [Great teams merge fast](<https://devfeed.tech/articles/great-teams-merge-fast-29029.md>)

Original publisher: [Read original article](<https://saket.me/great-teams-merge-fast/>)

Author: Saket Narayan

Published: 2021-02-23T23:15:21Z

Content type: opinion

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Pull Request](<https://devfeed.tech/topics/pull-request.md>), [Git](<https://devfeed.tech/topics/git.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [RxJava](<https://devfeed.tech/topics/rxjava.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [git](<https://devfeed.tech/tags/git.md>), [github](<https://devfeed.tech/tags/github.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [pr-reviews](<https://devfeed.tech/tags/pr-reviews.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [square](<https://devfeed.tech/tags/square.md>), [uncategorized](<https://devfeed.tech/tags/uncategorized.md>)

### AI overview

An opinion article describes how the Square/Cash App Android team merged code multiple times a day. It attributes the faster workflow to trust-based pull-request reviews, automated linting, small stacked pull requests, and GitHub support for retargeting stacked changes.

### Source excerpt

One of the many things I was constantly amazed about during my first few weeks at Square/Cash App was seeing how fast this team shipped code. All members of the Android team (and likely other platforms as well) were merging to the main git branch multiple times every day. This was in stark contrast to [...] The post Great teams merge fast appeared first on Saket Narayan.

## Avoiding fake italic and bold text on Android

DevFeed: [Avoiding fake italic and bold text on Android](<https://devfeed.tech/articles/avoiding-fake-italic-and-bold-text-on-android-29017.md>)

Original publisher: [Read original article](<https://saket.me/android-fake-vs-true-bold-and-italic/>)

Author: Saket Narayan

Published: 2019-12-18T00:08:59Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [fonts](<https://devfeed.tech/tags/fonts.md>), [formatting](<https://devfeed.tech/tags/formatting.md>), [legibility](<https://devfeed.tech/tags/legibility.md>), [textview](<https://devfeed.tech/tags/textview.md>)

### AI overview

This Android typography tutorial explains that fake bold and italic styling is produced when the platform cannot find the requested font variant. It describes the resulting effects on visual differentiation and legibility, and recommends applying the complete font family so true variants can be selected.

### Source excerpt

Changing line heights in Android using LineHeightSpan has this ugly side-effect where the cursor ends up being very tall, extending till the full line height instead of just the text height. I've decided to go to extreme lengths to fix this over the next few days. For science. pic.twitter.com/2tWLvDq1rz -- Saket Narayan (@Saketme) November 24, [...] The post Avoiding fake italic and bold text on Android appeared first on Saket Narayan.

## Using DTMF tones to route phone calls offline in the Simple healthcare app

DevFeed: [Using DTMF tones to route phone calls offline in the Simple healthcare app](<https://devfeed.tech/articles/reinventing-the-dial-up-modem-29024.md>)

Original publisher: [Read original article](<https://saket.me/dtmf-tones/>)

Author: Saket Narayan

Published: 2019-08-18T00:55:04Z

Content type: article

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [App](<https://devfeed.tech/topics/app.md>), [Android](<https://devfeed.tech/topics/android.md>), [Internet](<https://devfeed.tech/topics/internet.md>), [data](<https://devfeed.tech/topics/data.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [communication](<https://devfeed.tech/tags/communication.md>), [data](<https://devfeed.tech/tags/data.md>), [decoding](<https://devfeed.tech/tags/decoding.md>), [dtmf](<https://devfeed.tech/tags/dtmf.md>), [offline-first](<https://devfeed.tech/tags/offline-first.md>), [proxy](<https://devfeed.tech/tags/proxy.md>), [simple](<https://devfeed.tech/tags/simple.md>), [technology](<https://devfeed.tech/tags/technology.md>)

### AI overview

The article explains how the Simple healthcare app used DTMF tones to send a patient's phone number to a server during calls, enabling phone-number masking and offline-first operation when internet access was unavailable.

### Source excerpt

While working on a healthcare app called Simple at my previous company, we wanted to improve how nurses follow up with their patients. The aim was to replace traditional paper registers + landline phones with the app, which could intelligently suggest patients who are potentially at risk based on their medical history, age, and other [...] The post Reinventing the dial-up modem appeared first on Saket Narayan.

## Building a gesture driven Reddit app

DevFeed: [Building a gesture driven Reddit app](<https://devfeed.tech/articles/building-a-gesture-driven-reddit-app-29019.md>)

Original publisher: [Read original article](<https://saket.me/building-a-gesture-driven-reddit-app/>)

Author: Saket Narayan

Published: 2019-06-16T17:45:13Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Framework](<https://devfeed.tech/topics/framework.md>), [Reddit](<https://devfeed.tech/topics/reddit.md>), [recyclerview](<https://devfeed.tech/topics/recyclerview.md>), [Material Design](<https://devfeed.tech/topics/material-design.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [apis](<https://devfeed.tech/tags/apis.md>), [components](<https://devfeed.tech/tags/components.md>), [framework](<https://devfeed.tech/tags/framework.md>), [gestures](<https://devfeed.tech/tags/gestures.md>), [material-design](<https://devfeed.tech/tags/material-design.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [public-speaking](<https://devfeed.tech/tags/public-speaking.md>), [recyclerview](<https://devfeed.tech/tags/recyclerview.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

An exploratory talk about building Dank, an open-source gesture-driven Reddit app for Android. It demonstrates material design, framework APIs, gestures, spans, custom UI components, nested scrolling, collapsible comments, image dismissal, and real-time Markdown editing.

### Source excerpt

An exploratory talk that showcases how Android can deliver a beautiful experience to the user using material design principles and various framework APIs like gestures and spans. This talk walks the user through a collection of concrete examples of custom UI components and their implementations in my gesture driven Reddit app, Dank. Recreating Google Inbox's [...] The post Building a gesture driven Reddit app appeared first on Saket Narayan.

## Sunsetting Dank

DevFeed: [Sunsetting Dank](<https://devfeed.tech/articles/sunsetting-dank-29038.md>)

Original publisher: [Read original article](<https://saket.me/sunsetting-dank/>)

Author: Saket Narayan

Published: 2018-12-15T18:41:13Z

Content type: opinion

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [App](<https://devfeed.tech/topics/app.md>), [Development](<https://devfeed.tech/topics/development.md>), [Reddit](<https://devfeed.tech/topics/reddit.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [building](<https://devfeed.tech/tags/building.md>), [dank](<https://devfeed.tech/tags/dank.md>), [developer](<https://devfeed.tech/tags/developer.md>), [development](<https://devfeed.tech/tags/development.md>), [exploring](<https://devfeed.tech/tags/exploring.md>), [github](<https://devfeed.tech/tags/github.md>), [project](<https://devfeed.tech/tags/project.md>), [reddit](<https://devfeed.tech/tags/reddit.md>), [side-project](<https://devfeed.tech/tags/side-project.md>)

### AI overview

The developer announces that they are archiving Dank, an Android Reddit app started as a side project in 2017, after burnout made it difficult to balance the project with work and life. They are releasing the source on GitHub for others to use or fork.

### Source excerpt

I've been trying to write this post for a while, but I kept throwing my words in the bin in hopes that things will improve. I believe it's now time to put an end to this. I started building Dank as a side project in January 2017. It was my playground for exploring Android. It [...] The post Sunsetting Dank appeared first on Saket Narayan.

## Smoothly reacting to keyboard visibility changes in Android

DevFeed: [Smoothly reacting to keyboard visibility changes in Android](<https://devfeed.tech/articles/smoothly-reacting-to-keyboard-visibility-changes-in-android-29037.md>)

Original publisher: [Read original article](<https://saket.me/smoothly-reacting-to-keyboard/>)

Author: Saket Narayan

Published: 2018-10-05T19:05:52Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [animation](<https://devfeed.tech/tags/animation.md>), [changes](<https://devfeed.tech/tags/changes.md>), [keyboard](<https://devfeed.tech/tags/keyboard.md>), [layout](<https://devfeed.tech/tags/layout.md>)

### AI overview

The article explains how Dank smoothly animates content resizing when Android's soft keyboard appears. It describes observing the resized content layout, restoring full height, and manually resizing it with an animator as a workaround for abrupt layout changes.

### Source excerpt

When people use Dank, one of the terms they use to describe it is fluid. The app makes a good use of motion to indicate changes on the screen, but I think one of my favorite reasons why the app feels fluid is because it handles keyboard changes smoothly. When the soft keyboard is shown, [...] The post Smoothly reacting to keyboard visibility changes in Android appeared first on Saket Narayan.

## Introducing InboxRecyclerView, a library for building expandable descendant navigation

DevFeed: [Introducing InboxRecyclerView, a library for building expandable descendant navigation](<https://devfeed.tech/articles/introducing-inboxrecyclerview-a-library-for-building-expandable-descendant-navigation-29031.md>)

Original publisher: [Read original article](<https://saket.me/inboxrecyclerview/>)

Author: Saket Narayan

Published: 2018-09-14T06:19:26Z

Content type: release

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Library](<https://devfeed.tech/topics/library.md>), [navigation](<https://devfeed.tech/topics/navigation.md>), [Android](<https://devfeed.tech/topics/android.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Material Design](<https://devfeed.tech/topics/material-design.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [animation](<https://devfeed.tech/tags/animation.md>), [building](<https://devfeed.tech/tags/building.md>), [gestures](<https://devfeed.tech/tags/gestures.md>), [library](<https://devfeed.tech/tags/library.md>), [material-design](<https://devfeed.tech/tags/material-design.md>), [navigation](<https://devfeed.tech/tags/navigation.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [performance](<https://devfeed.tech/tags/performance.md>), [recyclerview](<https://devfeed.tech/tags/recyclerview.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

The article introduces InboxRecyclerView, an Android library for building expandable descendant navigation with a pull-to-dismiss gesture. It describes how the animation recreates Inbox-style list-item expansion and discusses implementation techniques, including clipping view content and using the Transitions API with ChangeBounds.

### Source excerpt

When Google released Inbox for Android some 4 years ago, their UI was rad. I was obsessed with the navigation transition, where emails expanded from their list item when clicked, pushing all other items out of the screen. When pulled downwards, the emails collapsed back to their positions. I wanted to recreate this UI. I [...] The post Introducing InboxRecyclerView, a library for building expandable descendant navigation appeared first on Saket Narayan.

## Designing a flick dismissible image viewer

DevFeed: [Designing a flick dismissible image viewer](<https://devfeed.tech/articles/designing-a-flick-dismissible-image-viewer-29026.md>)

Original publisher: [Read original article](<https://saket.me/flick-dismissible-images/>)

Author: Saket Narayan

Published: 2018-08-15T11:37:46Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [developers](<https://devfeed.tech/tags/developers.md>), [gestures](<https://devfeed.tech/tags/gestures.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [library](<https://devfeed.tech/tags/library.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This article explains the design of Flick, a small library for dismissing images with flick gestures. It describes Android touch-event interception, horizontal and vertical gesture handling, image movement and rotation, and a border-based workaround for jagged edges caused by bitmap filtering.

### Source excerpt

While working on Dank, my primary goal was to ensure that user generated content on Reddit receive as much attention in the app as possible, while letting the UI take a back-seat. As part of this experience, all images and videos in Dank are flick-dismissible so that the user can browse through high quality cat [...] The post Designing a flick dismissible image viewer appeared first on Saket Narayan.

## Persistence as the single source of truth

DevFeed: [Persistence as the single source of truth](<https://devfeed.tech/articles/persistence-as-the-single-source-of-truth-29034.md>)

Original publisher: [Read original article](<https://saket.me/persistence-as-the-single-source-of-truth/>)

Author: Saket Narayan

Published: 2018-07-26T14:51:38Z

Content type: article

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Persistence](<https://devfeed.tech/topics/persistence.md>), [Android](<https://devfeed.tech/topics/android.md>), [data](<https://devfeed.tech/topics/data.md>), [reactive](<https://devfeed.tech/topics/reactive.md>), [ui](<https://devfeed.tech/topics/ui.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [data](<https://devfeed.tech/tags/data.md>), [flow](<https://devfeed.tech/tags/flow.md>), [offline](<https://devfeed.tech/tags/offline.md>), [persistence](<https://devfeed.tech/tags/persistence.md>), [public-speaking](<https://devfeed.tech/tags/public-speaking.md>), [reactive](<https://devfeed.tech/tags/reactive.md>), [state-management](<https://devfeed.tech/tags/state-management.md>)

### AI overview

This article describes persistence as the single source of truth for Android UI state. It proposes making persistent storage the source of data changes while the UI reactively represents persisted data, creating a unidirectional data flow. The approach is presented as architecture-agnostic and as supporting state restoration, offline use, and immediate feedback.

### Source excerpt

Simple is better than complex. Complex is better than complicated. In the world of Android, where all sources of information and user interactions are asynchronous, UI state can become hard to reason about, especially in large apps. This is not only difficult to maintain but also increases complexity with the addition of every new feature. [...] The post Persistence as the single source of truth appeared first on Saket Narayan.

## Dank: A gesture-focused Reddit app for Android

DevFeed: [Dank: A gesture-focused Reddit app for Android](<https://devfeed.tech/articles/this-is-your-next-reddit-app-dank-29022.md>)

Original publisher: [Read original article](<https://saket.me/dank/>)

Author: Saket Narayan

Published: 2018-05-11T20:07:14Z

Content type: release

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Reddit](<https://devfeed.tech/topics/reddit.md>), [Android](<https://devfeed.tech/topics/android.md>), [App](<https://devfeed.tech/topics/app.md>), [ui](<https://devfeed.tech/topics/ui.md>), [navigation](<https://devfeed.tech/topics/navigation.md>), [Markdown](<https://devfeed.tech/topics/markdown.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [dank](<https://devfeed.tech/tags/dank.md>), [gestures](<https://devfeed.tech/tags/gestures.md>), [markdown](<https://devfeed.tech/tags/markdown.md>), [notifications](<https://devfeed.tech/tags/notifications.md>), [reddit](<https://devfeed.tech/tags/reddit.md>)

### AI overview

The article announces Dank, a Reddit app for Android developed over more than a year. It describes a gesture-driven interface focused on user-generated content, with features including swipe actions, inline replies, live Markdown preview, undo and redo, GIF support, and rich media notifications.

### Source excerpt

After spending more than a year, I'm happy to announce that my Reddit app -- Dank is finally ready for the world to see. You're going to love it. It's a fresh experience for Reddit on Android. Scroll to the bottom for the download link. The first thing you're going to notice is that Dank [...] The post This is your next Reddit app -- Dank appeared first on Saket Narayan.

## Band-aiding legacy networking libraries with Retrofit and OkHttp

DevFeed: [Band-aiding legacy networking libraries with Retrofit and OkHttp](<https://devfeed.tech/articles/band-aiding-legacy-networking-libraries-with-retrofit-and-okhttp-29035.md>)

Original publisher: [Read original article](<https://saket.me/retrofit-band-aid/>)

Author: Saket Narayan

Published: 2018-04-30T09:22:05Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [legacy](<https://devfeed.tech/topics/legacy.md>), [networking](<https://devfeed.tech/topics/networking.md>), [HTTP](<https://devfeed.tech/topics/http.md>), [Library](<https://devfeed.tech/topics/library.md>), [API](<https://devfeed.tech/topics/api.md>), [MQTT](<https://devfeed.tech/topics/mqtt.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [apis](<https://devfeed.tech/tags/apis.md>), [http](<https://devfeed.tech/tags/http.md>), [legacy](<https://devfeed.tech/tags/legacy.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [networking](<https://devfeed.tech/tags/networking.md>), [okhttp](<https://devfeed.tech/tags/okhttp.md>), [refactor](<https://devfeed.tech/tags/refactor.md>), [retrofit](<https://devfeed.tech/tags/retrofit.md>)

### AI overview

This tutorial explains how to use Retrofit with a legacy networking library by adding an OkHttp interceptor that redirects network requests to the existing library. It also describes exposing nonstandard data sources through Retrofit converters.

### Source excerpt

When Uncommon was brought in to refactor a big legacy app last year, we found ourselves in a strange situation. Our client was maintaining a common library for handling networking -- HTTP, FCM, MQTT -- across all apps under their brand. This library (let's call it SadLibrary) had an API that was badly designed and dated, but not using [...] The post Band-aiding legacy networking libraries with Retrofit and OkHttp appeared first on Saket Narayan.

## Simplifying DiffUtil with RxJava

DevFeed: [Simplifying DiffUtil with RxJava](<https://devfeed.tech/articles/simplifying-diffutil-with-rxjava-29036.md>)

Original publisher: [Read original article](<https://saket.me/simplifying-diffutil-rxjava/>)

Author: Saket Narayan

Published: 2018-02-18T07:45:54Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [RxJava](<https://devfeed.tech/topics/rxjava.md>), [recyclerview](<https://devfeed.tech/topics/recyclerview.md>), [Code](<https://devfeed.tech/topics/code.md>), [implementation](<https://devfeed.tech/topics/implementation.md>)

Tags: [adapter](<https://devfeed.tech/tags/adapter.md>), [android](<https://devfeed.tech/tags/android.md>), [code](<https://devfeed.tech/tags/code.md>), [generics](<https://devfeed.tech/tags/generics.md>), [recyclerview](<https://devfeed.tech/tags/recyclerview.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [with](<https://devfeed.tech/tags/with.md>)

### AI overview

A tutorial on using RxJava's scan() and compose() operators to simplify DiffUtil implementations for RecyclerView adapter updates and item change animations.

### Source excerpt

One of my favorite parts of RxJava is that no matter how complex a state management usecase is, there's always an operator for that™. During a recent code cleanup, I found a very cool usecase of RxJava's scan() and compose() operators for simplifying the usually verbose DiffUtil implementation. I had been delaying writing this post [...] The post Simplifying DiffUtil with RxJava appeared first on Saket Narayan.

## The lesser known world of spans

DevFeed: [The lesser known world of spans](<https://devfeed.tech/articles/the-lesser-known-world-of-spans-29032.md>)

Original publisher: [Read original article](<https://saket.me/lesser-known-world-of-spans/>)

Author: Saket Narayan

Published: 2017-11-05T14:52:27Z

Content type: article

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [deep-dive](<https://devfeed.tech/tags/deep-dive.md>), [framework](<https://devfeed.tech/tags/framework.md>), [public-speaking](<https://devfeed.tech/tags/public-speaking.md>)

### AI overview

The article explains how Android spans power features such as cursor display, hyperlinks, text highlighting, styling, indentation, URL clicks, text-change listeners, spelling suggestions, and images. It introduces a talk covering built-in and custom spans.

### Source excerpt

Do you know what's common between the blinking cursor, hyperlinks and text highlighting in TextViews? They're all implemented using spans. Spans are tiny objects that Android uses heavily across the framework. If you've worked with text styling such as bold or italics, then you're already familiar with the basic usages of spans. But they are [...] The post The lesser known world of spans appeared first on Saket Narayan.

## Android Nougat and rate limiting of notification updates

DevFeed: [Android Nougat and rate limiting of notification updates](<https://devfeed.tech/articles/android-nougat-and-rate-limiting-of-notification-updates-29016.md>)

Original publisher: [Read original article](<https://saket.me/android-7-nougat-rate-limiting-notifications/>)

Author: Saket Narayan

Published: 2017-08-28T11:23:55Z

Content type: article

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [rate-limiting](<https://devfeed.tech/topics/rate-limiting.md>), [notifications](<https://devfeed.tech/topics/notifications.md>), [RxJava](<https://devfeed.tech/topics/rxjava.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [notifications](<https://devfeed.tech/tags/notifications.md>), [nougat](<https://devfeed.tech/tags/nougat.md>), [rate-limiting](<https://devfeed.tech/tags/rate-limiting.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>)

### AI overview

The article explains why progress notifications for image downloads can stop reaching 100% on Android Nougat and later. It attributes the behavior to Android notification-update rate limiting, which was reduced in Nougat, and describes using RxJava to throttle updates to about five per second. The author notes that the limit applies per package and that the issue is not fully solved.

### Source excerpt

While working on a feature for downloading images in my app, I ran into a strange issue where progress notifications were never reaching 100%. Knowing that the framework is usually not wrong, I started suspecting my own skills (as usual). To make matters worse, nobody was able to reproduce the issue in a sample project I shared with other [...] The post Android Nougat and rate limiting of notification updates appeared first on Saket Narayan.

## Displaying HTML tags on TextView the right way

DevFeed: [Displaying HTML tags on TextView the right way](<https://devfeed.tech/articles/displaying-html-tags-on-textview-the-right-way-29030.md>)

Original publisher: [Read original article](<https://saket.me/html-tags-textview/>)

Author: Saket Narayan

Published: 2017-06-29T12:59:12Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [html](<https://devfeed.tech/tags/html.md>), [spans](<https://devfeed.tech/tags/spans.md>), [textview](<https://devfeed.tech/tags/textview.md>)

### AI overview

A tutorial explaining how Android parses and displays HTML in TextView. It compares TextView#setText(), Resources#getString(), Html.fromHtml(), and Html.fromHtml() with CDATA, emphasizing CharSequence and span objects as the mechanisms for rendering styled text.

### Source excerpt

While going through the codebase of a former client, I found that I was using four different ways for showing HTML on Android. This made me realize that I didn't really know what the correct way of showing them is and I've always hammered my way using trial & error until the HTML tags have showed up. Embarrassed, I decided to explore how [...] The post Displaying HTML tags on TextView the right way appeared first on Saket Narayan.

## Tips for Android Nougat's bundled notifications

DevFeed: [Tips for Android Nougat's bundled notifications](<https://devfeed.tech/articles/tips-for-android-nougat-s-bundled-notifications-29033.md>)

Original publisher: [Read original article](<https://saket.me/nougat-bundled-notifications/>)

Author: Saket Narayan

Published: 2017-05-31T14:00:50Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [behavior](<https://devfeed.tech/tags/behavior.md>), [guide](<https://devfeed.tech/tags/guide.md>), [notifications](<https://devfeed.tech/tags/notifications.md>), [nougat](<https://devfeed.tech/tags/nougat.md>), [tips](<https://devfeed.tech/tags/tips.md>)

### AI overview

This article summarizes practical findings from implementing bundled notifications in an Android app, including differences between Nougat and older Android versions, summary-notification behavior, state management, and how grouped notifications handle sounds, vibration, and replacement.

### Source excerpt

I've been working on implementing bundled notifications in my app, which is by far one of my favourite features about Android 7.0 Nougat. While the official guide is good enough for understanding how they work, I've constantly found myself running into behaviours that were not easy to find in the documentation. This post is an attempt to summarise [...] The post Tips for Android Nougat's bundled notifications appeared first on Saket Narayan.

## A better way to handle links in TextView

DevFeed: [A better way to handle links in TextView](<https://devfeed.tech/articles/a-better-way-to-handle-links-in-textview-29018.md>)

Original publisher: [Read original article](<https://saket.me/better-url-handler-textview-android/>)

Author: Saket Narayan

Published: 2016-09-11T17:48:21Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

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

Tags: [android](<https://devfeed.tech/tags/android.md>), [browser](<https://devfeed.tech/tags/browser.md>), [google-maps](<https://devfeed.tech/tags/google-maps.md>), [library](<https://devfeed.tech/tags/library.md>), [textview](<https://devfeed.tech/tags/textview.md>)

### AI overview

The article explains problems with Android's default LinkMovementMethod for clickable URLs in TextView, including incorrect touch areas, unreliable highlighting, and limited customization. It introduces BetterLinkMovementMethod as a drop-in replacement with custom URL-handling support.

### Source excerpt

There are two ways of "linkifying" URLs in a TextView. First, as an XML attribute: <TextView ... android:autoLink="phone|web" /> and second, programmatically: TextView textView = (TextView) findViewById(R.id.text1); Linkify.addLinks(textView, Linkify.PHONE_NUMBERS | LINKIFY.WEB_URLS); In both the cases, the framework internally registers a LinkMovementMethod on the TextView that handles dispatching a ACTION_VIEW Intent when any link is clicked. This is why phone-numbers open in a dialer when clicked, [...] The post A better way to handle links in TextView appeared first on Saket Narayan.

## Deflating the LayoutInflater

DevFeed: [Deflating the LayoutInflater](<https://devfeed.tech/articles/deflating-the-layoutinflater-29023.md>)

Original publisher: [Read original article](<https://saket.me/deflating-layoutinflater/>)

Author: Saket Narayan

Published: 2016-08-28T14:46:38Z

Content type: article

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [XML](<https://devfeed.tech/topics/xml.md>), [Java](<https://devfeed.tech/topics/java.md>), [Material Design](<https://devfeed.tech/topics/material-design.md>), [Library](<https://devfeed.tech/topics/library.md>), [hooks](<https://devfeed.tech/topics/hooks.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [developers](<https://devfeed.tech/tags/developers.md>), [java](<https://devfeed.tech/tags/java.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [material-design](<https://devfeed.tech/tags/material-design.md>), [public-speaking](<https://devfeed.tech/tags/public-speaking.md>), [talk](<https://devfeed.tech/tags/talk.md>), [writing](<https://devfeed.tech/tags/writing.md>), [xml](<https://devfeed.tech/tags/xml.md>)

### AI overview

This talk explains how Android's LayoutInflater converts XML layouts into Java Views and constructs View hierarchies. It also covers why layout inflation can be slow, why custom Views need fully qualified XML names, how AppCompat back-ports Material Design, and how the Calligraphy library and custom libraries interact with the inflation process.

### Source excerpt

Android developers spend a lot of time writing XML layouts every day. This talk will explain how Android's LayoutInflater works. By the end of this talk, you will have an understanding of how XML gibberish gets converted to Views in Java, how AppCompat is able to back-port Material Design for pre-Lollipop devices auto-magically and how [...] The post Deflating the LayoutInflater appeared first on Saket Narayan.