Early supporters get:
• All future updates at a reduced price
• Help decide which topics get covered in the remaining chapters
If you want to ship quality apps with confidence, join the waitlist: alexzh.com/books/maste...
Early supporters get:
• All future updates at a reduced price
• Help decide which topics get covered in the remaining chapters
If you want to ship quality apps with confidence, join the waitlist: alexzh.com/books/maste...
The first release covers 10 chapters, which is 50% of the full book.
The remaining chapters will be shaped by feedback from Android developers, making the final version more practical and impactful.
Plus hands-on examples of screenshot testing a real app:
• Themes
• Localization
• Adaptive UIs
• Font sizes
• CI/CD integration
• Future trends
• AI-assisted screenshot testing
The book dives deep into:
• Why screenshot testing matters for mobile apps
• In-depth comparison of frameworks: Android Testify, Dropshots, Paparazzi, Roborazzi, Shot, and Compose Preview Screenshot Testing
• Practical use of ComposablePreviewScanner and AndroidUiTestingUtils
2.5 years: 1,000+ hours of writing, 2 full drafts, and over 50,000 words, and that's not even counting the code.
I'm writing a book on Android screenshot testing, and the first release is coming in April 2026.
Here's what it covers ⬇️
Just found out you can now generate widget previews using Jetpack Compose.
Override "providePreview" in your widget class.
⚠️ Android 15+ only (Glance 1.2.0-rc01).
For older versions, combine with XML (12+) or images as a fallback.
Your date formatter may work locally, but break elsewhere.
SimpleDateFormat(...) and DateTimeFormatter.ofLocalizedDate(...) do not guarantee the result your users expect.
Use DateFormat.getBestDateTimePattern() for the right locale pattern.
#AndroidDev
"Just display the number. What could go wrong?"
Localize your app into Arabic and find out.
Instead of using raw numbers in your UI, use NumberFormat.
Not only digits depend on the locale, but also decimal separators, thousand groupings, and many other formatting conventions.
Starting with ui-tooling-preview:1.10.0, you can override "getDisplayName()" in your PreviewParameterProvider to replace index-based naming with meaningful labels.
It takes less than 5 minutes to set up, but it removes the confusion every time you open the preview panel.
Last week I published a short article about a small but annoying problem with PreviewParameterProvider in Jetpack Compose.
If you've ever used PreviewParameterProvider, you know the pain: your previews have names like "uiState 0", "uiState 1", "uiState 2".
Here's how to fit ⬇️
If you use PreviewParameterProvider in Jetpack Compose, you know the frustration of seeing index-based preview names, like uiState 1.
Good news: ui-tooling-preview:1.10.0 finally lets you add custom names to your preview states.
Here's how to use it:
alexzh.com/how-to-fix-...
How many preview functions do you use per component or screen in Jetpack Compose?
If it's more than two, consider using PreviewParameterProvider.
Less code. Same coverage.
#AndroidDev #JetpackCompose
Screenshot testing is no longer optional.
Most devs never check out your branch; instead, they read the diff and approve.
Now AI writes code faster than humans can review. As a result, more and more UI bugs go to production.
Catch them before your users do.
#AndroidDev
Recommended website to download Material Icons: fonts.google.com/icons
Link to official update: developer.android.com/jetpack/and...
Do you use the "material-icons" library for Jetpack Compose?
Important news: Google team will no longer publish updates for this library, as it's not the recommended way for displaying Material Icons in Compose.
Recommended way: Downloading a Vector Drawable XML from the official website (link ⬇️).
Compose Preview Screenshot Testing forces moving your previews into the "screenshotTest" source set, which leads to code duplication or losing your previews.
Instead, reuse your preview functions in the screenshotTest source set.
Previews + screenshot tests. No duplication.
#AndroidDev
Want to dive deeper into each test type? I wrote a detailed breakdown of UI testing types with practical examples: alexzh.com/not-all-ui-...
When you match the right type of tests to the right job, your E2E suite shrinks dramatically—and execution time stops being a problem.
Stop asking "how do we make E2E faster?" Start asking "should this even be an E2E test?"
What percentage of your UI tests are currently E2E?
The only way to make your UI tests fast and reliable is to replace most of your E2E tests with different test types:
• E2E tests → Verify production environment integrations
• UI tests with fake data → Verify state handling (loading, success, error)
• Screenshot tests → Verify the pixel perfectness
Most teams believe end-to-end tests are the only UI testing strategy available. So they focus on improving infrastructure or switching to a "better" framework.
But E2E tests were never designed to test everything. They verify one thing: how your app talks to the production environment.
"How do we make our E2E tests fast and stable?"
I've answered this question after every UI testing talk I've ever given, and my response always surprises people.
But, there's a crucial point: your tests might pass even if your UI is broken.
That's why I'm writing a book on Visual Testing for Android.
Join the waitlist to find out when it launches and to access early bird pricing: alexzh.com/android-vis...
Thank you to everyone who attended my talk at @droidcon.it about tools and frameworks for E2E and UI tests with fake data, including:
• Android Journey
• Maestro
• Espresso
• Compose UI Test
• Kaspresso
Slides from my talk:
speakerdeck.com/alexzhukovi...
#DroidconIt #AndroidDev
3/3 I realized this after spending some time improving my layout for the medium layout and checking it on a single device. We should design layouts based on screen sizes, not device types.
Does your application support foldable devices?
2/3 Here's the problem:
Google's window size classes aren't device categories—they're viewport measurements. The Pixel 9 Pro Fold jumps straight from compact to expanded, never using medium.
On the other side, Samsung's Z Fold 5 uses medium.
Same device category, but different screen sizes.
1/3 Foldable devices always use the medium window size class.
I believed this too. Then I opened my app on a Pixel 9 Pro Fold and was surprised that the "foldable" layout was skipped, and the "tablet" layout appeared on the screen.
#AndroidDev #KMP #MaterialDesign
Did you know that the OutputTransformation API lets you format text fields in Jetpack Compose in real time?
Here's how to improve entering a card number. You can also use it for phone numbers, dates, postcodes, and more.
Do you already use OutputTransformation in your project?
Your preview functions can be used not only for development but also as a tool to releasing apps without pixel imperfections.
Want to dive deeper into visual testing? Subscribe to my newsletter. Plus, you’ll be the first to know when my book on visual testing is released!
alexzh.com/
#AndroidDev
You now need only to make minor adjustments to implement visual tests.
Start strategically:
• Convert your design system and/or common components first
• Add preview functions for the most critical screens
• Gradually expand coverage to less critical screens