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 ⬇️
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 ⬇️
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
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.
The results for the same date across locales:
- English (United States): February 18, 2026
- English (Germany): 18 February 2026
How are you currently handling date formatting in your Android projects?
"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.
Your future self will thank you.
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 ⬇️
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.
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:
https://alexzh.com/how-to-fix-the-compose-preview-naming-problem/
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.