
Mocking network requests with RetrofitMock
Hello! Some time ago I stumbled upon a library inside Square’s brilliant Retrofit repository called retrofit-mock that allows you to build dummy Retrofit clients for usage in tests without OkHttp’s MockWebServer or adding mocking library like Mockito or Mockk. Thing is, it’s not documented well, and it was a bit of a challenge to set it up and make it work, but the end result works quite well. So, I decided to write this article with some introduction for the retrofit-mock usage. I will shortly explain what it is, how to use it, and compare with the other solutions. ...

3D graphics guide for Android: OpenGL and related concepts
Hello! Some time ago I learned about demoscene in the BBS network in the early 90s. People have created amazing graphical images purely with Assembly code on a very limited hardware, and it was so great that even after all these years enthusiasts continue to create new demos and preserve old ones all over the world. I got inspired by the demoscene and decided to try something like this myself. I’m not familiar with Assembly (and, frankly, don’t want to touch it), so I chose to create some demos on Android using OpenGL. It might not be as impressive, but at least I can use programming language I am familiar with (Kotlin) to set up some scaffold code for the actual OpenGL graphic code. Unfortunately, the info around computer graphics and OpenGL is quite inconsistent and scattered across different places, so I decided to summarize my learning experience in one article for future reference, so other people could benefit from this too. It may seem scattered, but it’s how I understood stuff. ...
Privacy Policy for WearMMR app
Privacy Policy Andrei Mukamolau built the WearMMR app as an Open Source app. This SERVICE is provided by Andrei Mukamolau at no cost and is intended for use as is. This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. ...
Privacy Policy for Valiutchik app
General Valiutchik (“App”) is developed by one main developer. Privacy Policy (“Policy”) describes how information obtained from users is collected, used and disclosed. By using the App, you agree that your personal information will be handled as described in this Policy. This policy in Belarusian language can be found here | Палітыка канфідэнцыяльнасці на беларускай мове знаходзіцца тут. Information being collected App queries info about user’s approximate location, with your prior permission, in order to determine correct currency rates to display. Location data is not stored locally and may be sent to Mapbox Inc. third-party service for geocoding. Usage of the data by Mapbox Inc. is subject to their respective terms of service and privacy policy. You can enable or disable access to location at any time, through your device settings. ...

Migrate from Play Services Location to Android's LocationManager API
Hello! After the announcement from Microsoft about Android apps support in Windows 11, I was excited to try to publish my app to Amazon Appstore, so I can discover more form factors and attract more users. However, there was one caveat: Windows can only run apps without Google Play Services dependency, since it will not be present in Windows and in Amazon Appstore. So, I started looking for workarounds. My app was using only FusedLocationProviderClient API from Play Services, and only to load current location of the device, so I found a way how I can achieve similar results in more Kotlin-friendly way with help of existing Android SDK Location API. It turns out that there was not so much info about Location API in Android, since even official docs are advising to use Play Services. ...
Bookcrossing Mobile: postmortem
Hello! Recently I received copyright infringement notice about my favorite pet project, Bookcrossing Mobile app, and was asked to remove the app from Play Store. On this sad note, I decided to discontinue its development completely and keep its code open and untouched. In this article, I will describe my journey with development of this project, some cool tricks I’ve learned, as well as provide some description of the project for anyone who may be interested in it. Project will rot quickly and will become mostly unusable after a short period of time (but still may serve as a reference), but my experience working on it might be useful for those who are looking to start some mobile app project alone. ...

Understanding Gradle for Android developers
Hello! For a long time I wanted to migrate my Bookcrossing Mobile app to Gradle Kotlin DSL. But I’ve used remote Groovy function for loading API keys from .properties files. Here is a gist with that function. Despite it’s a simple function, I didn’t want to write this for each of my projects, and sharing code via gist was somehow a good idea. I wanted to share this code in more common way, via plugin, so I decided to create my own plugin. After I was done with it, I realized that it would never work in the way I wanted it to work because of how Gradle is designed. This situation made me think about how little I know and understand about Gradle. I’ve asked colleagues, and turned out that they prefer not to touch Gradle scripts much and only vaguely understand how it works. ...
Musings about quality: what I've learned after migrating my projects to AndroidX
Hello! Recently I decided to get back to my old project, Bookcrossing Mobile app, to update it to the recent SDK versions and try out new things and approaches in Android development. Luckily, it was fine now, migration went smoothly, much better than at first attempt year ago. However, there were some important points that I’ve discovered during migration, and I believe these point can simplify developer’s life in the future. Hope that they will be useful for you. ...
Notes from RSConf Mobile Day
Hello! Just wanted to share my quick notes from the RSConf Mobile day’s most important sessions. These notes are chaotic and quite short, but they contain some valuable insight shared by the brilliant speakers. Wake up, Neo Talk was about common problems in software development. Security is broken: more than 1 billion people are affected. And we don’t pay much attention. Our apps are broken or incredibly complex or unusable. Inclusivity is an ability of a group to include different people. ...

Remote logging for mobile apps
Hello! In this article, I’m going to review some of the existing services that provide you the possibility to perform logging in production in a safe way. No more struggle with attaching log files to feedback and spending hours on figuring out what went wrong without any clues. Generally, logging in production is considered harmful, because you can expose sensitive information from your application to hackers. It’s a serious security trait, but disabling logs in production may not be the best solution: you won’t be able to see the state of your app during investigation of the strange crashes or suspicious feedbacks coming from users. So, it’s needed to find healthy compromise between security and logging. ...