# Posts on Adam Bennett

Recent content in Posts on Adam Bennett

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

## Using feature flags in GraphQL

DevFeed: [Using feature flags in GraphQL](<https://devfeed.tech/articles/using-feature-flags-in-graphql-25672.md>)

Original publisher: [Read original article](<https://adambennett.dev/2024/09/using-feature-flags-in-graphql/>)

Published: 2024-09-10T19:42:33Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [GraphQL](<https://devfeed.tech/topics/graphql.md>), [feature flags](<https://devfeed.tech/topics/feature-flags.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [apollo](<https://devfeed.tech/tags/apollo.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [feature-flags](<https://devfeed.tech/tags/feature-flags.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This tutorial explains how GraphQL directives can conditionally include fields in queries. It shows how passing a feature flag to a directive, including with Apollo, can prevent risky new fields from triggering backend requests and causing an entire query to fail.

### Source excerpt

I've been using GraphQL in some form or another for a couple of years now, and I have... opinions about it. Opinions notwithstanding, it's a supremely flexible and powerful tool, and I just want to highlight something here that it seems quite a few people don't know about. That something is Directives, which is a way of optionally including fields. But why is this useful?

## Avoid Reading Feature Flags Inside Functions

DevFeed: [Avoid Reading Feature Flags Inside Functions](<https://devfeed.tech/articles/a-feature-flag-psa-25671.md>)

Original publisher: [Read original article](<https://adambennett.dev/2023/09/a-feature-flag-psa/>)

Published: 2023-09-29T22:45:18Z

Content type: opinion

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [feature flags](<https://devfeed.tech/topics/feature-flags.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [advice](<https://devfeed.tech/tags/advice.md>), [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [feature-flags](<https://devfeed.tech/tags/feature-flags.md>), [finance](<https://devfeed.tech/tags/finance.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [performance](<https://devfeed.tech/tags/performance.md>), [remote-config](<https://devfeed.tech/tags/remote-config.md>), [server](<https://devfeed.tech/tags/server.md>), [software](<https://devfeed.tech/tags/software.md>), [startup](<https://devfeed.tech/tags/startup.md>), [startups](<https://devfeed.tech/tags/startups.md>), [state](<https://devfeed.tech/tags/state.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This article argues that feature flags should be read once and passed into functions or constructors rather than looked up repeatedly. It cites performance costs in hot code paths and unpredictable behavior when flag values change during synchronization with a server.

### Source excerpt

I Threaded - made a thread? Posted? Tweeted (can we use that again now)? Whatever - about this earlier but I thought I'd elaborate a little. You do use feature flags, right? You should. If you work with trunk-based development, like everyone does now, you must use feature flags to hide upcoming features. Side note: this is why release notes are so boring now, because features aren't really tied to releases.

## Migrating Your Design System to Jetpack Compose Part 4: Stakeholder Retro

DevFeed: [Migrating Your Design System to Jetpack Compose Part 4: Stakeholder Retro](<https://devfeed.tech/articles/migrating-your-design-system-to-jetpack-compose-part-4-stakeholder-retro-25670.md>)

Original publisher: [Read original article](<https://adambennett.dev/2023/04/migrating-your-design-system-to-jetpack-compose-part-4-stakeholder-retro/>)

Published: 2023-04-03T11:19:56Z

Content type: opinion

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Design system](<https://devfeed.tech/topics/design-system.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Development](<https://devfeed.tech/topics/development.md>), [Logging](<https://devfeed.tech/topics/logging.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [logging](<https://devfeed.tech/tags/logging.md>), [metrics](<https://devfeed.tech/tags/metrics.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [technical](<https://devfeed.tech/tags/technical.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A retrospective on migrating a design system from Views to Jetpack Compose, focusing on stakeholder communication, measuring internal developer-facing metrics, and presenting progress during a risky refactoring project.

### Source excerpt

Featured in jetc.dev. What, praytell, has caused me, nearly two years after I said I would, to finish this blog series? Could the single day of sunlight we had yesterday have triggered something in my Canadian winter-addled brain? Perhaps. A second theory: I've done a lot of interviewing recently, and I've had to talk a lot about projects - what went well, what went not so well, and talk a lot about some of my strengths and failings as a technical lead. And I spoke about this project a lot.

## Things you can do in Android Studio

DevFeed: [Things you can do in Android Studio](<https://devfeed.tech/articles/things-you-can-do-in-android-studio-25669.md>)

Original publisher: [Read original article](<https://adambennett.dev/2022/06/things-you-can-do-in-android-studio/>)

Published: 2022-06-18T08:38:44Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [IntelliJ IDEA](<https://devfeed.tech/topics/intellij-idea.md>), [Dagger](<https://devfeed.tech/topics/dagger.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [copy](<https://devfeed.tech/tags/copy.md>), [dagger](<https://devfeed.tech/tags/dagger.md>), [dependency](<https://devfeed.tech/tags/dependency.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [function](<https://devfeed.tech/tags/function.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [intellij](<https://devfeed.tech/tags/intellij.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [productivity](<https://devfeed.tech/tags/productivity.md>), [scopes](<https://devfeed.tech/tags/scopes.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [tooling](<https://devfeed.tech/tags/tooling.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A practical list of Android Studio and IntelliJ productivity features, including excluding generated files with Scopes, using scratch files to test ideas, editing multiple lines simultaneously, and accessing clipboard history.

### Source excerpt

Based on a recent discussion on Twitter: a list of things that you can do in Android Studio which can make your life much easier. Hide files you don't care about If you work in a project with lots of generated code (e.g.: you use Dagger), you can exclude generated files from searches using Scopes:

## How to Prepare for Data Structures and Algorithms Job Interviews

DevFeed: [How to Prepare for Data Structures and Algorithms Job Interviews](<https://devfeed.tech/articles/on-interviewing-25668.md>)

Original publisher: [Read original article](<https://adambennett.dev/2021/11/on-interviewing/>)

Published: 2021-11-24T11:00:29Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Programming](<https://devfeed.tech/topics/programming.md>), [Algorithms, Complexity](<https://devfeed.tech/topics/algorithms-complexity.md>), [Data structures](<https://devfeed.tech/topics/data-structures.md>), [Computer science](<https://devfeed.tech/topics/computer-science.md>), [LeetCode](<https://devfeed.tech/topics/leetcode.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>)

Tags: [advice](<https://devfeed.tech/tags/advice.md>), [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [data-structures](<https://devfeed.tech/tags/data-structures.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [interviewing](<https://devfeed.tech/tags/interviewing.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jobs](<https://devfeed.tech/tags/jobs.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [money](<https://devfeed.tech/tags/money.md>), [notes](<https://devfeed.tech/tags/notes.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [remote](<https://devfeed.tech/tags/remote.md>), [retention](<https://devfeed.tech/tags/retention.md>), [shortage](<https://devfeed.tech/tags/shortage.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This article shares practical advice for preparing for software engineering interviews, especially Data Structures & Algorithms interviews. It recommends actively studying computer science fundamentals, algorithms, data structures and related strategies instead of solving random LeetCode questions without a structured study method.

### Source excerpt

In case you weren't already aware, the market right now for software engineers is super hot - it's crazy out there. A combination of the entire world moving online, people burning out of their jobs and a chronic shortage of experienced software engineers means there's never been a better time to see what's on offer. If you want fully remote, better pay and a title change, there are many companies out there willing to give it to you.

## MockWebServer + HTTPS

DevFeed: [MockWebServer + HTTPS](<https://devfeed.tech/articles/mockwebserver-https-25667.md>)

Original publisher: [Read original article](<https://adambennett.dev/2021/09/mockwebserver--https/>)

Published: 2021-09-11T07:06:08Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [configuration](<https://devfeed.tech/topics/configuration.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Instrumentation](<https://devfeed.tech/topics/instrumentation.md>), [JSON](<https://devfeed.tech/topics/json.md>), [Network](<https://devfeed.tech/topics/network.md>), [Firebase](<https://devfeed.tech/topics/firebase.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [harness](<https://devfeed.tech/tags/harness.md>), [instrumentation](<https://devfeed.tech/tags/instrumentation.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [json](<https://devfeed.tech/tags/json.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [network](<https://devfeed.tech/tags/network.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [security](<https://devfeed.tech/tags/security.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [test-lab](<https://devfeed.tech/tags/test-lab.md>), [testing](<https://devfeed.tech/tags/testing.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This article describes configuring MockWebServer to serve HTTPS responses for instrumentation tests. It explains the testing context, including acceptance and regression testing, legacy-code verification, network interception, Firebase Test Lab, and JSON responses for edge cases.

### Source excerpt

Recently I ran into a fairly niche configuration problem with MockWebServer, where I needed to be able to connect to the server via https. What follows is some notes on the problem and the solution we used - hopefully somebody else finds this information useful and I'm sure there are other solutions which would have worked just as well.

## How a Clean Android Merged Manifest Still Led to Production Push Notifications

DevFeed: [How a Clean Android Merged Manifest Still Led to Production Push Notifications](<https://devfeed.tech/articles/a-cautionary-tale-25666.md>)

Original publisher: [Read original article](<https://adambennett.dev/2021/06/a-cautionary-tale/>)

Published: 2021-06-05T05:55:42Z

Content type: opinion

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Firebase](<https://devfeed.tech/topics/firebase.md>), [SDK](<https://devfeed.tech/topics/sdk.md>), [toolchain](<https://devfeed.tech/topics/toolchain.md>), [XML](<https://devfeed.tech/topics/xml.md>), [Google Play](<https://devfeed.tech/topics/google-play.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [fuckups](<https://devfeed.tech/tags/fuckups.md>), [functional](<https://devfeed.tech/tags/functional.md>), [google-play](<https://devfeed.tech/tags/google-play.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [post-mortem](<https://devfeed.tech/tags/post-mortem.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [toolchain](<https://devfeed.tech/tags/toolchain.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>), [xml](<https://devfeed.tech/tags/xml.md>)

### AI overview

This post mortem describes how the author accidentally sent a push notification to every Android customer in production. It explains that Firebase Cloud Messaging integrations may come from SDKs and that checking the merged Android manifest can reveal capabilities and unexpected permissions, although the supplied text ends before the full incident is explained.

### Source excerpt

Some of you may have seen that on Thursday, I had a bad day. In the grand scheme of things it wasn't that bad a day; it actually turned out pretty well. But what follows is a post mortem on how I accidentally pinged every Android customer in production, and a little bit of advice so that it doesn't happen to you.

## IntoSet: Dagger Multibindings and Architecture

DevFeed: [IntoSet: Dagger Multibindings and Architecture](<https://devfeed.tech/articles/intoset-dagger-multibindings-and-architecture-25665.md>)

Original publisher: [Read original article](<https://adambennett.dev/2021/03/intoset-dagger-multibindings-and-architecture/>)

Published: 2021-03-05T09:30:09Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Dagger](<https://devfeed.tech/topics/dagger.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [components](<https://devfeed.tech/tags/components.md>), [compose](<https://devfeed.tech/tags/compose.md>), [dagger](<https://devfeed.tech/tags/dagger.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [growth](<https://devfeed.tech/tags/growth.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This tutorial explains how Dagger multibindings with sets can inject collections and register components across Gradle modules. It presents uses including decoupling runtime initialization, isolating third-party SDKs behind facades, reducing dependencies, and registering Moshi adapters.

### Source excerpt

Featured in Kotlin Weekly #240 Dagger is typically my DI framework of choice for large projects (insert controversy here) and while most people are familiar with the basic concepts, some aspects immediately cause internal panic when mentioned. Multibindings is one of them, which is a shame because it's a highly useful pattern which can solve real problems.

## Migrating Your Design System to Jetpack Compose Part 3: Interop & Testing

DevFeed: [Migrating Your Design System to Jetpack Compose Part 3: Interop & Testing](<https://devfeed.tech/articles/migrating-your-design-system-to-jetpack-compose-part-3-interop-testing-25664.md>)

Original publisher: [Read original article](<https://adambennett.dev/2021/01/migrating-your-design-system-to-jetpack-compose-part-3-interop-testing/>)

Published: 2021-01-25T16:32:43Z

Content type: article

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Design system](<https://devfeed.tech/topics/design-system.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Development](<https://devfeed.tech/topics/development.md>), [legacy](<https://devfeed.tech/topics/legacy.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [design](<https://devfeed.tech/tags/design.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [interop](<https://devfeed.tech/tags/interop.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [legacy](<https://devfeed.tech/tags/legacy.md>), [library](<https://devfeed.tech/tags/library.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [testing](<https://devfeed.tech/tags/testing.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

The third article in a series about migrating design systems to Jetpack Compose explains how to integrate Compose into an existing Android app using Compose interop and how to test Composable components. It describes incrementally replacing legacy Views with Compose components.

### Source excerpt

Featured in jetc.dev. Welcome back to the third article in my series about migrating design systems to Jetpack Compose, where I talk about our experiences at Cuvva and how you can apply what we learnt to your team. In part one, I talked about planning ahead, modularisation and getting your team onboard.

## Migrating Your Design System to Jetpack Compose: Part 2

DevFeed: [Migrating Your Design System to Jetpack Compose: Part 2](<https://devfeed.tech/articles/migrating-your-design-system-to-jetpack-compose-part-2-25663.md>)

Original publisher: [Read original article](<https://adambennett.dev/2020/12/migrating-your-design-system-to-jetpack-compose-part-2/>)

Published: 2020-12-07T07:38:38Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Design system](<https://devfeed.tech/topics/design-system.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Library](<https://devfeed.tech/topics/library.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [api](<https://devfeed.tech/tags/api.md>), [api-design](<https://devfeed.tech/tags/api-design.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [component](<https://devfeed.tech/tags/component.md>), [compose](<https://devfeed.tech/tags/compose.md>), [design](<https://devfeed.tech/tags/design.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [legacy](<https://devfeed.tech/tags/legacy.md>), [library](<https://devfeed.tech/tags/library.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [techniques](<https://devfeed.tech/tags/techniques.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>), [typography](<https://devfeed.tech/tags/typography.md>)

### AI overview

Part two of a series on migrating a design system to Jetpack Compose, covering custom theming, integration with existing APIs, risks from a rapidly changing library, and API design considerations.

### Source excerpt

Welcome back to the second article in my series about migrating design systems to Jetpack Compose, where I talk about our experiences at Cuvva and how you can apply what we learnt to your team. In part one, I talked about planning ahead, modularisation and getting your team onboard. In part two, I'll talk about custom theming, about building ontop of existing APIs, how to minimise risk from relying on a rapidly changing library and pose a question about API design.

## Migrating Your Design System to Jetpack Compose: Part 1

DevFeed: [Migrating Your Design System to Jetpack Compose: Part 1](<https://devfeed.tech/articles/migrating-your-design-system-to-jetpack-compose-part-1-25662.md>)

Original publisher: [Read original article](<https://adambennett.dev/2020/12/migrating-your-design-system-to-jetpack-compose-part-1/>)

Published: 2020-12-05T07:59:06Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Design system](<https://devfeed.tech/topics/design-system.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [migration](<https://devfeed.tech/tags/migration.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [testing](<https://devfeed.tech/tags/testing.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

Part one of a series about Cuvva's migration of its design system to Jetpack Compose. It outlines the existing design system, the problems Compose was expected to solve, a test platform for mitigating migration risk, and ways to involve the team. The series also covers migration planning, practical and team-related steps, roadblocks, and lessons learned.

### Source excerpt

Featured in jetc.dev. A few weeks ago, I gave a talk at the Mobile Notts meetup where I spoke about how we at Cuvva are migrating our design system to Jetpack Compose, what we learnt and how you can do the same. It was a fun talk which touched on a lot of content, and I've had quite a few people ask about a video. Sadly there isn't one (although I may give the talk again), but there's so much to cover that I decided to make a series of posts about it with more detail and examples.

## Server-driven theming in Jetpack Compose

DevFeed: [Server-driven theming in Jetpack Compose](<https://devfeed.tech/articles/server-driven-theming-in-jetpack-compose-25661.md>)

Original publisher: [Read original article](<https://adambennett.dev/2020/11/server-driven-theming-in-jetpack-compose/>)

Published: 2020-11-12T09:17:16Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Design system](<https://devfeed.tech/topics/design-system.md>), [Ktor](<https://devfeed.tech/topics/ktor.md>), [API](<https://devfeed.tech/topics/api.md>), [Server](<https://devfeed.tech/topics/server.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [api](<https://devfeed.tech/tags/api.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [design](<https://devfeed.tech/tags/design.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [ktor](<https://devfeed.tech/tags/ktor.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [server](<https://devfeed.tech/tags/server.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A proof of concept shows how to implement server-driven theming in a Jetpack Compose Android app. A Ktor server provides theme colors through an API, and the app consumes them so color changes propagate through the Compose UI.

### Source excerpt

Featured in jetc.dev. At Cuvva, we've been playing with Jetpack Compose for a few months and we've just recently started porting across our design system. This has lead us to think a lot about design systems in general - how can we streamline the process? How can we ensure that it's always up to date?

## Disabling Jetifier

DevFeed: [Disabling Jetifier](<https://devfeed.tech/articles/disabling-jetifier-25660.md>)

Original publisher: [Read original article](<https://adambennett.dev/2020/08/disabling-jetifier/>)

Published: 2020-08-14T16:56:57Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [migration](<https://devfeed.tech/topics/migration.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [build performance](<https://devfeed.tech/topics/build-performance.md>), [ide](<https://devfeed.tech/topics/ide.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [blog](<https://devfeed.tech/tags/blog.md>), [build-performance](<https://devfeed.tech/tags/build-performance.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [gradle](<https://devfeed.tech/tags/gradle.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [migration](<https://devfeed.tech/tags/migration.md>), [money](<https://devfeed.tech/tags/money.md>), [multi-module-project](<https://devfeed.tech/tags/multi-module-project.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This article explains how Jetifier converts legacy Android support-library references in third-party binaries to AndroidX equivalents. It describes the build and Gradle configuration-time costs of Jetifier and recommends using the Can I Drop Jetifier Gradle plugin to identify dependencies that must be updated or removed before disabling it.

### Source excerpt

Way back in the early-ish days of Android we used the support libraries, android.support, to backport certain features to different API levels. These days those libraries have been replaced by the AndroidX packages, announced at I/O 2018 - but their legacy lives on and many of the dependencies that your app consume may still depend on these android.support packages.

## The Result Monad

DevFeed: [The Result Monad](<https://devfeed.tech/articles/the-result-monad-25659.md>)

Original publisher: [Read original article](<https://adambennett.dev/2020/05/the-result-monad/>)

Published: 2020-05-15T17:31:46Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Library](<https://devfeed.tech/topics/library.md>), [Error Handling](<https://devfeed.tech/topics/error-handling.md>), [Exception](<https://devfeed.tech/topics/exception.md>), [Android](<https://devfeed.tech/topics/android.md>), [Programming](<https://devfeed.tech/topics/programming.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [error-handling](<https://devfeed.tech/tags/error-handling.md>), [exception](<https://devfeed.tech/tags/exception.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [library](<https://devfeed.tech/tags/library.md>), [monad](<https://devfeed.tech/tags/monad.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [programming](<https://devfeed.tech/tags/programming.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [the-result](<https://devfeed.tech/tags/the-result.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This tutorial explains why the Cuvva Android team adopted the kotlin-result library, how Result-based error handling works, and what problems it addresses. It introduces the monad concept and discusses Kotlin's unchecked exceptions in comparison with Java's checked exceptions.

### Source excerpt

Recently I've come to really appreciate the kotlin-result library as we've integrated it more and more deeply into the Cuvva Android stack. In this post, I'll explain why we needed it, how it works and what problems it solves, and show some examples of how we use it at the end. A great many people have tried and failed to explain what a monad is, and this is my attempt at being added to the list.

## Adventures in Compose - The Doom fire effect

DevFeed: [Adventures in Compose - The Doom fire effect](<https://devfeed.tech/articles/adventures-in-compose-the-doom-fire-effect-25658.md>)

Original publisher: [Read original article](<https://adambennett.dev/2020/04/adventures-in-compose-the-doom-fire-effect/>)

Published: 2020-04-09T18:07:48Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Development](<https://devfeed.tech/topics/development.md>), [Game engine](<https://devfeed.tech/topics/game-engine.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [doom](<https://devfeed.tech/tags/doom.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [examples](<https://devfeed.tech/tags/examples.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [games](<https://devfeed.tech/tags/games.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [programming](<https://devfeed.tech/tags/programming.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A tutorial exploring how to recreate the Doom fire effect with Jetpack Compose. It discusses drawing on the screen, updating state in a loop, recomposition, and the limitations encountered with stochastic rendering and memoization.

### Source excerpt

Featured in Fragmented and jetc.dev. One of the best books I've bought in the last few years is the Game Engine Black Book: Doom by Fabien Sanglard. As someone who grew up on games but has never really thought about how they're made, it's been a fascinating book to dip in and out of, and there's some great bits of innovation detailed inside. There's an axiom about the greatest innovations spawning from constraints, and the original DOOM team had some pretty serious constraints around memory and processing power - things that we generally take for granted these days. Reading about how they solved problems in this environment is fascinating, and I highly recommend the book.

## Introducing the Activity Result APIs

DevFeed: [Introducing the Activity Result APIs](<https://devfeed.tech/articles/introducing-the-activity-result-apis-25656.md>)

Original publisher: [Read original article](<https://adambennett.dev/2020/03/introducing-the-activity-result-apis/>)

Published: 2020-03-22T09:11:18Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [API](<https://devfeed.tech/topics/api.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [abstraction](<https://devfeed.tech/tags/abstraction.md>), [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [apis](<https://devfeed.tech/tags/apis.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [blog](<https://devfeed.tech/tags/blog.md>), [callback](<https://devfeed.tech/tags/callback.md>), [camera](<https://devfeed.tech/tags/camera.md>), [career](<https://devfeed.tech/tags/career.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [data-type](<https://devfeed.tech/tags/data-type.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [permission](<https://devfeed.tech/tags/permission.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>), [type-parameters](<https://devfeed.tech/tags/type-parameters.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial introduces Google's Activity Result APIs as a reusable abstraction for handling activity callbacks. It explains the basic workflow, custom contracts, registration, invocation, and built-in contracts for permissions, phone calls, and taking pictures.

### Source excerpt

Google has finally released the new Activity Result APIs, which are something I've been looking forward to for a very long time. In this post I'll run through the basics, how you can create your own contracts, and how this allows us to abstract away even more responsibilities from your UI.

## Scripting file templates for Android Studio

DevFeed: [Scripting file templates for Android Studio](<https://devfeed.tech/articles/scripting-file-templates-for-android-studio-25657.md>)

Original publisher: [Read original article](<https://adambennett.dev/2020/03/scripting-file-templates-for-android-studio/>)

Published: 2020-03-10T09:31:04Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [Boilerplate](<https://devfeed.tech/topics/boilerplate.md>), [Scripting, bash](<https://devfeed.tech/topics/scripting-bash.md>), [Bash](<https://devfeed.tech/topics/bash.md>), [jetbrains-toolbox](<https://devfeed.tech/topics/jetbrains-toolbox.md>), [GitHub](<https://devfeed.tech/topics/github.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [automated](<https://devfeed.tech/tags/automated.md>), [bash](<https://devfeed.tech/tags/bash.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [developers](<https://devfeed.tech/tags/developers.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [files](<https://devfeed.tech/tags/files.md>), [finance](<https://devfeed.tech/tags/finance.md>), [formatting](<https://devfeed.tech/tags/formatting.md>), [functional](<https://devfeed.tech/tags/functional.md>), [github](<https://devfeed.tech/tags/github.md>), [growth](<https://devfeed.tech/tags/growth.md>), [install](<https://devfeed.tech/tags/install.md>), [java](<https://devfeed.tech/tags/java.md>), [jetbrains-toolbox](<https://devfeed.tech/tags/jetbrains-toolbox.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [onboarding](<https://devfeed.tech/tags/onboarding.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [productivity](<https://devfeed.tech/tags/productivity.md>), [script](<https://devfeed.tech/tags/script.md>), [scripting](<https://devfeed.tech/tags/scripting.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [team](<https://devfeed.tech/tags/team.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This tutorial explains how Cuvva automated installing Android Studio file templates for team members across standard and JetBrains Toolbox installations. It also describes combining the setup with scripts that configure ktlint formatting, code style, and pre-commit hooks to streamline developer onboarding.

### Source excerpt

As we've started locking down our architecture at Cuvva we reached a point where every new feature required very similar boilerplate, and building all of this by hand was getting tedious. The obvious solution here was to create file templates using Android Studio. I won't go into much detail as to how these are made (there's some good resources available for this already), but I wanted to quickly share how we automated setting these up for team members.

## Jetpack Compose - now on Maven

DevFeed: [Jetpack Compose - now on Maven](<https://devfeed.tech/articles/jetpack-compose-now-on-maven-25655.md>)

Original publisher: [Read original article](<https://adambennett.dev/2019/10/jetpack-compose-now-on-maven/>)

Published: 2019-10-14T07:56:37Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Maven](<https://devfeed.tech/topics/maven.md>), [Android](<https://devfeed.tech/topics/android.md>), [aosp](<https://devfeed.tech/topics/aosp.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [aosp](<https://devfeed.tech/tags/aosp.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [demo](<https://devfeed.tech/tags/demo.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [maven](<https://devfeed.tech/tags/maven.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A historical demo shows how Jetpack Compose libraries could be fetched from Google's Maven repository and used in an Android app. The author notes that the approach is deprecated and that the example compiles but has subtle runtime and behavioral problems.

### Source excerpt

This article is also now deprecated, but I'm keeping it up for posterity. This article was a quick demo and explore of the Jetpack Compose library, with the binaries being fetched from the then-newly discovered Maven links. Whilst it technically compiles and renders the Views, it's broken in subtle ways (such as observing @Models, which is half the point of Compose).

## The Android Skeleton Project

DevFeed: [The Android Skeleton Project](<https://devfeed.tech/articles/the-android-skeleton-project-25654.md>)

Original publisher: [Read original article](<https://adambennett.dev/2019/09/the-android-skeleton-project/>)

Published: 2019-09-25T08:42:43Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [Template](<https://devfeed.tech/topics/template.md>), [Android](<https://devfeed.tech/topics/android.md>), [Boilerplate](<https://devfeed.tech/topics/boilerplate.md>), [Gradle](<https://devfeed.tech/topics/gradle.md>), [Dagger](<https://devfeed.tech/topics/dagger.md>), [ci](<https://devfeed.tech/topics/ci.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [blog](<https://devfeed.tech/tags/blog.md>), [build](<https://devfeed.tech/tags/build.md>), [career](<https://devfeed.tech/tags/career.md>), [ci](<https://devfeed.tech/tags/ci.md>), [compose](<https://devfeed.tech/tags/compose.md>), [dagger](<https://devfeed.tech/tags/dagger.md>), [dependencies](<https://devfeed.tech/tags/dependencies.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [libraries](<https://devfeed.tech/tags/libraries.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [projects](<https://devfeed.tech/tags/projects.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This tutorial recommends maintaining an Android skeleton project as a reusable starting point for new apps and coding challenges. It explains how a maintained template can preserve dependencies, extension functions, Dagger setup, and other boilerplate, with CI used to verify that the project still builds.

### Source excerpt

How often has this happened to you? Some new library comes out and you want to try it, you have some kind of brilliant idea to solve a particular problem, or you've needed to build an example app for a new job you're applying for. So you boot up Android Studio, hit New project, skip through the steps and then you're presented with a new playground to work in. Amazing!

## MVI - The Good, the Bad, and the Ugly

DevFeed: [MVI - The Good, the Bad, and the Ugly](<https://devfeed.tech/articles/mvi-the-good-the-bad-and-the-ugly-25653.md>)

Original publisher: [Read original article](<https://adambennett.dev/2019/07/mvi-the-good-the-bad-and-the-ugly/>)

Published: 2019-07-24T18:52:57Z

Content type: opinion

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Redux](<https://devfeed.tech/topics/redux.md>), [Android](<https://devfeed.tech/topics/android.md>), [Development](<https://devfeed.tech/topics/development.md>), [reactive](<https://devfeed.tech/topics/reactive.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [article](<https://devfeed.tech/tags/article.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [flow](<https://devfeed.tech/tags/flow.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [mvi](<https://devfeed.tech/tags/mvi.md>), [opinion](<https://devfeed.tech/tags/opinion.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [patterns](<https://devfeed.tech/tags/patterns.md>), [reactive](<https://devfeed.tech/tags/reactive.md>), [reactive-programming](<https://devfeed.tech/tags/reactive-programming.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [testing](<https://devfeed.tech/tags/testing.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

An opinionated introduction to MVI, also known as Redux, for Android development. The article explains its unidirectional data flow, event and result modeling, reducers, sealed classes, and integration with functional reactive programming, while considering its benefits and downsides.

### Source excerpt

For those keeping track of the latest trends in view architecture patterns, MVI, aka Redux, has seemingly become the latest and greatest for Android Development. There's tonnes of things to love about MVI - but what are the downsides, and what should you know going into it? For the sake of this article, I'm basing my thoughts on an adaptation of MVI which I've used for a while now for both personal projects and at work. You can find the important classes here for a deeper dive, but I'll run through the basics here too.

## Easy Augmentation with Decorators in Kotlin

DevFeed: [Easy Augmentation with Decorators in Kotlin](<https://devfeed.tech/articles/easy-augmentation-with-decorators-in-kotlin-25652.md>)

Original publisher: [Read original article](<https://adambennett.dev/2019/06/easy-augmentation-with-decorators-in-kotlin/>)

Published: 2019-06-01T07:40:53Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Logging](<https://devfeed.tech/topics/logging.md>), [Architecture & Design](<https://devfeed.tech/topics/architecture-design.md>), [Software Engineering](<https://devfeed.tech/topics/software-engineering.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blockchain](<https://devfeed.tech/tags/blockchain.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [design-patterns](<https://devfeed.tech/tags/design-patterns.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [intellij](<https://devfeed.tech/tags/intellij.md>), [interfaces](<https://devfeed.tech/tags/interfaces.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [logging](<https://devfeed.tech/tags/logging.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [software-design](<https://devfeed.tech/tags/software-design.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

A Kotlin tutorial demonstrates how to augment an existing class with logging without modifying the original implementation. It uses an interface, a wrapper class, and Kotlin class delegation to forward most methods while overriding selected behavior.

### Source excerpt

Often in software design you may wish that a particular class had more functionality than it currently offers, or that you could tweak its behaviour slightly. In this contrived example, we're going to add some logging to an existing class, but we've decided not to do it in the target class directly. There can be a few reasons for this:

## Hugo, Firebase Hosting and CircleCI

DevFeed: [Hugo, Firebase Hosting and CircleCI](<https://devfeed.tech/articles/hugo-firebase-hosting-and-circleci-25651.md>)

Original publisher: [Read original article](<https://adambennett.dev/2019/04/hugo-firebase-hosting-and-circleci/>)

Published: 2019-04-28T09:34:57Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Hugo](<https://devfeed.tech/topics/hugo.md>), [Firebase](<https://devfeed.tech/topics/firebase.md>), [hosting](<https://devfeed.tech/topics/hosting.md>), [CircleCI](<https://devfeed.tech/topics/circleci.md>), [Google](<https://devfeed.tech/topics/google.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [circleci](<https://devfeed.tech/tags/circleci.md>), [compose](<https://devfeed.tech/tags/compose.md>), [continuous-deployment](<https://devfeed.tech/tags/continuous-deployment.md>), [continuous-integration](<https://devfeed.tech/tags/continuous-integration.md>), [development](<https://devfeed.tech/tags/development.md>), [domain](<https://devfeed.tech/tags/domain.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [functional](<https://devfeed.tech/tags/functional.md>), [google](<https://devfeed.tech/tags/google.md>), [growth](<https://devfeed.tech/tags/growth.md>), [guides](<https://devfeed.tech/tags/guides.md>), [hosting](<https://devfeed.tech/tags/hosting.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [hugo](<https://devfeed.tech/tags/hugo.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>), [web](<https://devfeed.tech/tags/web.md>)

### AI overview

A practical guide to setting up a Hugo blog with Firebase Hosting and CircleCI, including domain configuration and DNS verification through Google Domains.

### Source excerpt

Domain setup First thing's first - go buy your domain on domains.google.com. They're only GBP 10 a year, but if I remember correctly there's a GBP 120 initial fee. Your mileage may vary depending on the popularity of your domain name. The process is pretty user friendly, even for a web noob like myself.

## Migrating to Downloadable Fonts on Android

DevFeed: [Migrating to Downloadable Fonts on Android](<https://devfeed.tech/articles/migrating-to-downloadable-fonts-on-android-25650.md>)

Original publisher: [Read original article](<https://adambennett.dev/2018/06/migrating-to-downloadable-fonts-on-android/>)

Published: 2018-06-28T13:16:14Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Font](<https://devfeed.tech/topics/font.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>), [SVG](<https://devfeed.tech/topics/svg.md>)

Tags: [accessibility](<https://devfeed.tech/tags/accessibility.md>), [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [fonts](<https://devfeed.tech/tags/fonts.md>), [functional](<https://devfeed.tech/tags/functional.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [proguard](<https://devfeed.tech/tags/proguard.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This article explains how Blockchain migrated its Android app from bundled fonts and the Calligraphy library to Android's downloadable fonts. It describes runtime font loading through a font provider, support down to API 14 through Support Library 26.0.0, and Android Studio's generated manifest and XML configuration. It also notes that the interface exposed only regular and bold Montserrat variants.

### Source excerpt

This is a rehost of the article I wrote for the Blockchain Engineering blog. You can find the original article here. At Blockchain, we have many mobile users in bandwidth constrained environments such as developing countries. As such keeping the app small and lightweight is a priority for the Android team. Smaller app sizes increase both installs and conversion rates - important metrics for any mobile-focused company. We've used various techniques over the last year to prevent bloat to the app including shrinking what few PNGs we have, using VectorDrawables at every possible opportunity, and aggressively leveraging ProGuard.

## A Closer look at Slices on Android

DevFeed: [A Closer look at Slices on Android](<https://devfeed.tech/articles/a-closer-look-at-slices-on-android-25649.md>)

Original publisher: [Read original article](<https://adambennett.dev/2018/05/a-closer-look-at-slices-on-android/>)

Published: 2018-05-31T13:11:02Z

Content type: tutorial

Language: en

Sources: [Posts on Adam Bennett](<https://devfeed.tech/sources/posts-on-adam-bennett.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [SDK](<https://devfeed.tech/topics/sdk.md>), [Google](<https://devfeed.tech/topics/google.md>), [App](<https://devfeed.tech/topics/app.md>), [Framework](<https://devfeed.tech/topics/framework.md>)

Tags: [algorithms](<https://devfeed.tech/tags/algorithms.md>), [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [blog](<https://devfeed.tech/tags/blog.md>), [career](<https://devfeed.tech/tags/career.md>), [compose](<https://devfeed.tech/tags/compose.md>), [developer-preview](<https://devfeed.tech/tags/developer-preview.md>), [development](<https://devfeed.tech/tags/development.md>), [engineering](<https://devfeed.tech/tags/engineering.md>), [finance](<https://devfeed.tech/tags/finance.md>), [functional](<https://devfeed.tech/tags/functional.md>), [google](<https://devfeed.tech/tags/google.md>), [google-assistant](<https://devfeed.tech/tags/google-assistant.md>), [google-io](<https://devfeed.tech/tags/google-io.md>), [growth](<https://devfeed.tech/tags/growth.md>), [java](<https://devfeed.tech/tags/java.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [money](<https://devfeed.tech/tags/money.md>), [opinions](<https://devfeed.tech/tags/opinions.md>), [play-store](<https://devfeed.tech/tags/play-store.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [search](<https://devfeed.tech/tags/search.md>), [slices](<https://devfeed.tech/tags/slices.md>), [software](<https://devfeed.tech/tags/software.md>), [startups](<https://devfeed.tech/tags/startups.md>), [thoughts](<https://devfeed.tech/tags/thoughts.md>), [training](<https://devfeed.tech/tags/training.md>), [tutorial](<https://devfeed.tech/tags/tutorial.md>)

### AI overview

This article examines Android Slices introduced around the Android P Alpha release and explains their relationship to App Actions. It describes how App Actions can connect apps with Google Assistant, Search, and the Play Store, using recognized user intents and app deep links to support queries such as cryptocurrency price requests.

### Source excerpt

In the lead-up to Google IO 2018 and after peering into the Android P Alpha release, some people noticed a mysterious new "Slices" class within the P SDK docs. There was a lot of speculation as to what Slices actually did, and Sebastiano Poggi at Novoda did a great deep-dive into what was known at the time.

[Next page](<https://devfeed.tech/sources/posts-on-adam-bennett.md?cursor=WyIyMDE4LTA1LTMxVDEzOjExOjAyKzAwOjAwIiwgIjQ2ZmI2MjQzLWQzOGQtNDM2Yi05NTdmLWYxMWZhNzBiNzJiMSJd>)