Articles

A collection of articles and blogposts I wrote on various topics, mostly on Android and Flutter development, but not only.

Kotlin Coroutines: Fundamentals - Video Tutorial

Video tutorial for beginner Android developers who want to learn about threading, what coroutines are, and how to launch a coroutine in Android. Covered concepts: Blocking & Non-Blocking calls Synchronous vs. Asynchronous code Threads Main or UI Thread Posting data to the UI Kotlin Coroutines Coroutine Builders Dispatchers Jobs Suspending functions Coroutine contexts Coroutine scopes Nested coroutines
February 14, 2024

How to Provide Accessibility in your Android App | Part 3: Semantic Properties and Screen Orientation

Learn about various semantic properties and supporting many screen orientations. Check out how to create TalkBack-friendly composables.
February 7, 2024

10 Best AI Coding Assistant Tools – Guide for Developers

Explore 10 top-notch AI-powered tools for developers that can increase your productivity, improve accuracy in coding, and much more.
January 19, 2024

Flutter vs. Kotlin: Choose the Best Fit for Your Project – Developers’ Guide

Choosing between Kotlin and Flutter? Every project requires a unique approach. Dive into our guide to learn about the strengths and weaknesses of each, and gain insight into when to choose Kotlin, Flutter, or Kotlin Multiplatform for your development needs.
December 21, 2023

Flutter Networking Tutorial: Getting Started

In today’s world, smartphones are the primary hub for many activities: entertainment, banking, photography and videography and shopping, among others. To do many of the things their users request, the apps on your smartphone need internet access.
November 21, 2023

8 Key IoT Security Challenges and Proven Solutions from the Field

Stay ahead of cyber risks – prevent mistakes that could ruin your budget and reputation. Discover key vulnerabilities in IoT app development and learn strategies for safeguarding your app and user data.
November 3, 2023

How to Provide Accessibility in Your Native Android App with Jetpack Compose | Part 2

Learn how to manage text size, scaling, focus order, labeling, and content descriptions to ensure your Android app is perfectly accessible.
August 24, 2023

How to Provide Accessibility in Your Native Android App with Jetpack Compose | Part 1

In this article, you’ll learn how to create accessible mobile apps for Android OS. It’s quite important nowadays. There are more and more users for who accessibility matters. Additionally, more and more laws require app owners to support accessibility.
July 15, 2023

SSL Certificate Pinning in Flutter

By default, the server identity checking bases on the chain of trust. The system or browser has a list of trusted root CAs (Certificate Authorities). Those CAs, in turn trust the intermediate CAs, which finally trust the owner of the domain. The clients accept every trusted certificate. Including those issued in the future. Yet, we can configure the application to trust only given certificates. The latter is a certificate pinning.
March 23, 2023

State Restoration of Flutter App

Android and iOS can interrupt app processes to optimize resource usage. The system can kill apps in the background to gain more memory and CPU for the foreground. A killed app will start from scratch when a user brings it back. However, the user expects to see the same app state as when they left it instead of starting over again. In this tutorial, you’ll see how to preserve the state of Flutter apps when the system decides to kill them.
March 15, 2023

Flutter for Windows Desktop: Getting Started

Developers often use Flutter to develop mobile apps. Starting from version 2.10, it supports Windows as a target platform. Let’s check how to develop the production-level Windows apps with Flutter. In this tutorial, you’ll learn how to set up a development environment and create a simple calculator app. We’ll focus on key concepts and basic business logic operations.
August 12, 2022

Edge Cases in App & Backend Development. Part 4 – Dates & Time

You may think that dealing with dates and time is easy. We have a minute that lasts 60 seconds, an hour with 60 minutes, a day with 24 hours, a week with 7 days, a month with 28 to 31 days, and so on. Surely no rocket science is required here… Well, nothing could be further from the truth! We will show the traps and pitfalls related to date and time that you may encounter during application and backend development.
April 26, 2021

How to Submit an App on Google Play? Guide & Checklist for Non-Developers

Publishing your Android app on Google Play is not only exciting but also a crucial element of your application development process that influences its final success. Will your app be submitted, will it be popular, and will people download and install it? All this and more depends on how fruitful your release will be.
January 22, 2021

Internationalizing and Localizing a Flutter App | How to Develop an App with Flutter – Part 7

Are you interested in internationalizing and localizing your Flutter app? If yes, you’re in the right place. In this article, we will make our Smoge app multilingual. More precisely, we will explain how to easily localize and internationalize your Flutter app, making it accessible to users in different locales.
December 16, 2020

GIF App Development – How to Develop GIF Encoding

In this article, we’ll briefly list libraries that can help you with GIF file encoding which is an important part of GIF-maker app development process. Note that projects are constantly evolving, some get deprecated, other new ones appear.
September 2, 2020

GIF App Development – Challenges & Tips

In this article, we’ll discuss animated GIFs creation on Android platform. If you want to develop an app like Giphy Cam or GIF Maker & GIF Editor & Video Maker, it’s worth knowing what challenges you can expect during a GIF maker app development, and how to face them.
July 6, 2020

How to Generate Proguard/R8 rules for Navigation Component Arguments

Android Jetpack’s Navigation component is the modern solution for navigating between screens in Android apps. It supports both activities and fragments (including dialogs). What is more, it allows to pass data to destinations. Unfortunately, the Navigation component does not generate Proguard/R8 rules for arguments. This means that if you use Proguard or R8, you have to write these rules manually. This is a tedious and error-prone task. Fortunately, there is a way to generate these rules automatically.
March 5, 2020

Flutter Project Setup | How to Develop an App with Flutter – Part 2

Whether you want to work at Flutter development company or be a freelancer, this knowledge will help you to become a Flutter developer. Before we start writing the code of our app, we have to set up the environment.
February 18, 2020

How to Distribute Android Libraries

Even the best library is barely usable if potential users cannot get it easily. That’s why every library should be distributed. In this article, I show you how and where you can publish your libraries in the most efficient way.
April 12, 2019

How to Add Chuck Norris Jokes to Bitrise Build Logs

You may think that CI (Continuous Integration) consists only of technical tasks like unit testing, code compilation or static code analysis. However, sometimes you may want to put a little bit of fun to boring build logs 🙂 If you are familiar with Jenkins you may have heard of Chuck Norris plugin which among others adds funny facts/jokes about Chuck Norris to the builds.
October 19, 2018

How to Create Bitrise Step in Go – Flutter Example

In this article, we will show you how to create & publish your own Bitrise step, using the example of Flutter. We will focus on programming in Go, which is the main language used by Bitrise.
May 7, 2018

Android Strings XML Tips & Tricks

This article shows a few tricks which can help you when developing string resources for Android applications.
January 17, 2018

Edge Cases to Keep in Mind. Part 3 – Time of Check to Time of Use Race Conditions in Android UI

If you are a developer you’ve probably heard about race conditions. They are often associated with concurrent background operations performed in the fractions of seconds. However, certain race conditions may also appear in UI and last for the infinite time. In this article, we’ll show how race conditions affect Android runtime permission system.
December 14, 2017

Edge Cases to Keep in Mind. Part 3 – Time of Check to Time of Use Race Conditions in Android UI

In this article, you will find 12 useful GDPR Use Cases for App Owners, Product Owners and everyone who wants to develop a mobile app. You will also read about the basics of GDPR – What it is, Who it’s directed to, How high penalties are and – the most important question – What does it mean for App Owners? Let’s check if your app is GDPR-compliant!
December 14, 2017

How to Debug HTTP(S) Traffic for Android Apps with Burp Proxy

If you have ever developed apps using HTTP(S) APIs you probably encountered situations when the server answered with errors like 400 Bad Request error or your app failed to parse responses throwing exceptions with enigmatic messages like Unterminated string at line 1 column 57345 and you have no idea what is going on. Everything seems to match specifications but the app does not work. This article will explain one of the ways to debug such cases – Burp Proxy – while your Android mobile app development.
December 6, 2017

Testing Android Apps with Pseudolocalization

The length of translated text is likely to be different from the original. Depending on the source and destination language, it may vary significantly. Moreover, the same text translated to some languages may use acronyms, while in others there may be fully expanded phrases. Let’s check how to test such cases without the need to know all the languages in the world.
October 20, 2017

Edge Cases to Keep in Mind. Part 2 – Files

Did you know, that there may be a File which exists and doesn’t exist at the same time? Are you aware, that you can delete a file and still use it? Discover these & other files edge cases in software development.
September 27, 2017

Edge Cases to Keep in Mind. Part 1 – Text

No matter if you are a software developer, a copywriter or you’re just writing an e-mail, text has many traps you need to be aware of. Some may cause numerous issues, from bugs in your app through visual artefacts to even victims! Let’s take a look at how we can avoid them.
July 29, 2017

How to Connect Physical Devices to Bitrise.io

There are several options for connecting devices to bitrise.io. One of the easiest and effortless ones is to use a cloud-hosted device farm. Such farms are offered by Google (Firebase Test Lab), Amazon (AWS Device Farm) or Bitbar (public cloud). However, it may not necessarily be the cheapest solution, especially if you already have physical devices. Let’s check how they can be used on bitrise.io!
July 18, 2017

How to Create a Gradle Plugin in Kotlin

There are many tutorials about writing custom Gradle plugins on the Internet. For example this official one. However, most of them use Groovy and plugins consisting of “Hello world” only. In this post, we will solve a real problem with a custom Gradle plugin written in Kotlin!
April 12, 2017

How to make generated Java test sources recognizable by IDE

Starting from Android Gradle plugin 2.2 built-in configuration for annotation processors is available. Previously that functionality has been provided by 3rd party project android-apt. There is a little issue with new configuration. Namely, files placed in test source sets are not added to Java model thus they are not recognized by IDE (Android Studio) and marked red however they are normally compilable. This article describes how to fix that issue.
February 20, 2017

Setting animation scale for Android UI tests

Before testing with Espresso, it is highly recommended to disable animations. Tests may be flaky otherwise. This article describes how to do it automatically with Gradle.
December 12, 2016

/dev/full on OS X

How to test program behaviour when there is no disk space left? On Linux, there is a special device /dev/full. This article describes how to make something similar on macOS.
July 29, 2016

Unit tests with custom JUnit rules, annotations and resources

Many, if not most Android apps act as API clients thus require conversion between data-interchange format (usually JSON) and POJO (data model classes). There is no need to implement conversion engine in our code since it can done by external libraries like GSON or moshi. It may be useful to test parsing (JSON to POJO) and generating (POJO to JSON) logic related to model classes.
April 13, 2016

How to integrate Gerrit with HipChat

One of the useful features for Gerrit users is to receive notifications about events related to their changes. Gerrit contains built-in support for email notifications. You can just configure SMTP settings and voilà, bunch categories of emails will be sent. So far so good, but the reality is often quite different. Let’s check how to that better.
January 12, 2016

Android Gradle configurations

There are several ways to declare dependencies in Gradle. What is the difference between them? Which one should you use? Check out this article to find out!
September 1, 2015

Differences Between minSdkVersion, maxSdkVersion, compileSdkVersion and targetSdkVersion

There are 4 places in build.gradle where Android SDK version can be defined. This article describes their meanings and purposes. All of them are connected with the concept of API level.
September 1, 2015

How to Create PagerTitleStrip with Current Page Indicator Only

Original PagerTitleStrip displays indicators of the current, next, and previous pages of the ViewPager, but sometimes only current is needed. Check out how to implement that.
September 1, 2015

How to Generate Java Sources Using buildSrc Gradle Project and Codemodel

I’ll show how to embed external data in your Android app, such as a list of Internet top-level domains, by parsing it before app compilation and generating Java code for efficient and up-to-date access at runtime, similar to the fresh R class generated by Android build tools.
September 1, 2015

Using Processes to Avoid OutOfMemoryErrors

Quick (and dirty) tip for increasing available memory (heap) size.
November 26, 2012

Combined Bayesian Classifiers Applied to Spam Filtering Problem

This paper explores the design of effective spam filters using combined Näive Bayes classifiers. We discuss various tokenization methods for extracting valuable features from emails, creating diverse training sets for individual Bayesian classifiers. Through computer experiments on our spam dataset, we compare different fusion methods based on class labels and supports to determine the best approach for ensemble evaluation and establish our final proposition.
July 6, 2012
Nifty tech tag lists from Wouter Beeftink