You Are Not Blocked A common complaint I see in the Kotlin/Java/Android community is that someone is "blocked" waiting for an open source library release. This is a bit of a red flag from a developer standpoint and a nuisance as an OSS maintainer. It leads to folks making noise in the
Kotlin Optimizing Your Kotlin Build Kotlin build times are often slow, this is a laundry list of common issues and what you can or can't do about them.
Personal Growth How I Work A high level overview of my work style and how it helps improve my productivity.
RxJava Disposables Can Cause Memory Leaks Every Disposable holds a strong reference to the observer it binds. This can lead to surprising memory leaks.
Kotlin Kapt's Hidden Test Costs TL;DR Kapt will run on your test builds even if you didn't ask it to.
time Time in UI Programming I've been digging around in time APIs a bunch lately. One thing I've found over time is that it helps to think of parts of time APIs as contextual in UI. This is similar to Locale or Android's resource system. You wouldn't usually pass around a localized string in your
Annotation Processing Kotlin Symbol Processing: Early Thoughts Google announced Kotlin Symbol Processing [https://github.com/android/kotlin/tree/ksp/libraries/tools/kotlin-symbol-processing-api] (KSP) today, a new compiler-plugin-based API for annotation processing in Kotlin. It's designed to be a faster alternative to Kapt, Kotlin's current first party tool for this. Rather than re-explain some of its excellent [https:
Dagger Party Tricks Dagger Party Tricks: Extension Functions Extension functions in Dagger for fun and profit.
Making My WFH Life Bearable With the ongoing pandemic, I've found myself struggling to feel comfortable with being home ~23hrs/day. In case it helps anyone, I wanted to jot down and share some things that I've found helpful for me.
AndroidDev Android's Built-in ProGuard Rules: The Missing Guide Android's build tools come with a few ProGuard facets to squeeze the most juice out of your release builds. In this post we'll cover what they all are, what's inside 'em, and what you can do with this knowledge!
Kotlin It's Nothing Nothing is a special type in Kotlin often used for errors. Is that all it's useful for though?
Open Source Butterfly Effects I like learning new things. That's a sufficiently vague claim, but it's intentionally broad. There's different conduits for learning: open source libraries, side projects, any sort of learning pursuit outside of your day-to-day work. I'm a big believer that these pursuits, however trivial, usually pay off in the long run.
Life How to Take a Six Month Sabbatical There's a saying someone told me this summer - there's three pillars in life: health, time, and money. At any given moment, most people have at most two. If you're fortunate enough to have all three, you make the most of it while you can. I took 6 months off
Dagger Party Tricks Dagger Party Tricks: Refactoring Techniques for refactoring Dagger code with ease.
Dagger Party Tricks Dagger Party Tricks: Private Dependencies Leveraging Dagger qualifiers to hide intermediate dependencies.
Dagger Party Tricks Dagger Party Tricks: Deferred OkHttp Initialization Leveraging Dagger to defer OkHttp's initialization to a background thread and buy back precious startup time.
Moshi A Closer Look At Moshi 1.9 Moshi 1.9 is here! It's been in the oven for a year and excited to have it out there. This post takes a closer look at its changes.
Kotlin @JvmDefault: More Useful Than You Think @JvmDefault is an annotation + compiler flag in Kotlin to enable using Java 8 default interface methods. It does more than it leads on though! This post explores some other bytecode optimizations you can gain with it as well as some hidden behaviors you should be aware of.
Announcements New blog! Welcome to my new blog! I've been thinking about this awhile for a few reasons. * Medium's increasingly heavy-handed and frankly annoying monetization strategies. * Wanting something a bit more personable. Here I can have a speaking page with past talks, (eventually) projects, and link my GitHub. * Better markdown support + syntax highlighting
API Design API Design Case Studies: Intersection Types My team recently cleaned up an API in an internal storage library. While it’s a simple case, it covers a couple interesting language tools and tradeoffs. Let’s dig in! The starting pointIt’s a function called enumStoreKeys that returns a Set of StoreKey enums for a given classKey.
Renderscript Detecting Blurriness with Renderscript About three years ago, I worked on a project at Uber to try to detect when photos taken client-side were blurry. The goal was to be able to fail fast, ask the user to retake them if necessary, and save the cycle of waiting for something we could programmatically determine
AutoDispose Announcing AutoDispose 1.0 About two years ago, just after migrating my CatchUp [https://github.com/hzsweers/CatchUp] side project to RxJava 2, I started a branch called “boundObservers” to try out an idea I had for RxLifecycle-style automatic disposal of streams. I rewrote it from scratch a few times after, and a couple
RxJava RxAndroid's New Async API “RxAndroid meets VSYNC rubber” — Icon used with permission from Ray Wenderlich [https://www.raywenderlich.com/170233/reactive-programming-rxandroid-kotlin-introduction] RxAndroid 2.1.0 has a new API AndroidSchedulers#from(Looper looper, boolean async) This new async parameter affects Android APIs 16 and newer, and can significantly improve UI performance when set to