The challenges of server-driven UI on Android

Server-driven UI is not a new concept. Neither for Android, iOS, or the web. It is quite popular in recent years, especially with the introduction of component-driven architectures such as Flux / Redux and others. Now three projects ahead with server-driven architecture in place, I want to share with you some of the challenges that we faced, and the different approaches to solving them. And I will be really happy if you share your experience too.

Continue reading “The challenges of server-driven UI on Android”

Local KtLint configuration for Android

KtLint & Detekt are tools that help us keep our code formatted in the same way and sometimes even help us spot errors before they are actually merged to master or develop.

Most of the CI integrations already include a detekt step before the unit tests are run. To avoid waiting for the CI, you can easily integrate ktlint as part of Git hooks. So every time when you decide to commit, Git hooks run and ktlint analyzes the committed files and prevents you from pushing until you fix your errors.

Continue reading “Local KtLint configuration for Android”

RecyclerView loses focus when scrolling fast … or how to use it on Android TV

We had a project where we were aiming to reuse the same codebase across mobile and TV. You have this care very often and there is this consideration of:

Should we use the Leanback Fragments?

The experienced Android TV developer

that is always ignored. We give the project a quick go and check how it works on the Android TV emulator and decide it is not worth the effort to work on TV specific codebase that may require additional devs to support it. And this is where hell breaks loose.

Continue reading “RecyclerView loses focus when scrolling fast … or how to use it on Android TV”

Taming websockets with Coroutines, Clean Architecture and a library

Websocket integration is one of the biggest issues I had in my whole experience with Android. Why is it such a huge pain? There are several reasons behind that:

  1. Connection should remain stable no matter what – and we know how complex the Android lifecycle can be.
  2. Sending data can be a one-way operation without giving any result – did you succeed in sending it or did you fail? Only Server knows.
  3. Retrying connection or network requests can be tricky to implement – from pushing logic to interactors to having an internal logic inside a repository, be sure – nothing will work at 100%. Not even at 90% either.
  4. To get it right you need both frontend and backend collaboration. Nothing can be done if both sides do it separated from each other.
Continue reading “Taming websockets with Coroutines, Clean Architecture and a library”

Don’t forget about the difference between android:windowActionBar vs windowActionBar in your theme

What is the difference between this piece of code:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="windowActionBar">false</item>

and this one:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:windowActionBar">false</item>
Continue reading “Don’t forget about the difference between android:windowActionBar vs windowActionBar in your theme”

Are you a product developer or a project developer?

I am so sad to see really good developers leaving because we are not doing products but projects

an unknown CTO

Believe it or not, I heard the above on a lunch with the whole Android team and with the CTO of the whole company that I was working for. What does it mean to build a project vs building a product? Is there such a huge difference when you are developing a software solution? Let’s dig deeper into this.

Continue reading “Are you a product developer or a project developer?”

Enable bluetooth headset microphone on Ubuntu 20.04

After months and months dealing with this freaking issue that has become a pain in the ass, for real, there is this article:

That made things working again. I just cannot believe how much effort is needed to make a simple bluetooth headset work on Ubuntu. It still doesn’t work great, but it is fine.

Continue reading “Enable bluetooth headset microphone on Ubuntu 20.04”

How to make DatePicker stretch when CalendarView does not fit the screen?

In Android we have to deal with both big screen and small screens, tablets, watches, TVs and many other devices. In our case, we had a device with a 3.2″ display and other one with 5″ display. And on both of them we show a DatePicker dialog to choose a date. And guess what? Especially for the current month of October, there was a small difference. Can you guess it in the screenshot below?

One day is missing
Continue reading “How to make DatePicker stretch when CalendarView does not fit the screen?”