<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>fobo66</title><link>https://fobo66.dev/</link><description>Recent content on fobo66</description><generator>Hugo -- 0.151.0</generator><language>en</language><lastBuildDate>Fri, 09 Feb 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://fobo66.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Mocking network requests with RetrofitMock</title><link>https://fobo66.dev/post/retrofit-mock/</link><pubDate>Fri, 09 Feb 2024 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/retrofit-mock/</guid><description>&lt;p&gt;Hello! Some time ago I stumbled upon a library inside Square&amp;rsquo;s brilliant &lt;a href="https://github.com/square/retrofit"&gt;Retrofit&lt;/a&gt; repository called &lt;a href="https://github.com/square/retrofit/tree/master/retrofit-mock"&gt;&lt;code&gt;retrofit-mock&lt;/code&gt;&lt;/a&gt; that allows you to build dummy Retrofit clients for usage in tests without OkHttp&amp;rsquo;s &lt;a href="https://github.com/square/okhttp/tree/master/mockwebserver"&gt;&lt;code&gt;MockWebServer&lt;/code&gt;&lt;/a&gt; or adding mocking library like &lt;a href="https://site.mockito.org/"&gt;Mockito&lt;/a&gt; or &lt;a href="https://mockk.io/"&gt;Mockk&lt;/a&gt;. Thing is, it&amp;rsquo;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 &lt;code&gt;retrofit-mock&lt;/code&gt; usage. I will shortly explain what it is, how to use it, and compare with the other solutions.&lt;/p&gt;</description></item><item><title>3D graphics guide for Android: OpenGL and related concepts</title><link>https://fobo66.dev/post/opengl-graphics-guide/</link><pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/opengl-graphics-guide/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;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&amp;rsquo;m not familiar with Assembly (and, frankly, don&amp;rsquo;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&amp;rsquo;s how I understood stuff.&lt;/p&gt;</description></item><item><title>Privacy Policy for WearMMR app</title><link>https://fobo66.dev/post/wearmmr-privacy-policy/</link><pubDate>Tue, 12 Jul 2022 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/wearmmr-privacy-policy/</guid><description>&lt;h2 id="privacy-policy"&gt;Privacy Policy&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description></item><item><title>Privacy Policy for Valiutchik app</title><link>https://fobo66.dev/post/valiutchik-privacy-policy/</link><pubDate>Wed, 29 Jun 2022 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/valiutchik-privacy-policy/</guid><description>&lt;h2 id="general"&gt;General&lt;/h2&gt;
&lt;p&gt;Valiutchik (&amp;ldquo;App&amp;rdquo;) is developed by one main developer.&lt;/p&gt;
&lt;p&gt;Privacy Policy (&amp;ldquo;Policy&amp;rdquo;) describes how information obtained from users is collected, used and disclosed.&lt;/p&gt;
&lt;p&gt;By using the App, you agree that your personal information will be handled as described in this Policy.&lt;/p&gt;
&lt;p&gt;This policy in Belarusian language can be found &lt;a href="https://fobo66.dev/be/post/valiutchik-privacy-policy/"&gt;here&lt;/a&gt; | Палітыка канфідэнцыяльнасці на беларускай мове знаходзіцца &lt;a href="https://fobo66.dev/be/post/valiutchik-privacy-policy/"&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="information-being-collected"&gt;Information being collected&lt;/h2&gt;
&lt;p&gt;App queries info about user&amp;rsquo;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 &lt;a href="https://www.mapbox.com/legal/tos"&gt;terms of service&lt;/a&gt; and &lt;a href="https://www.mapbox.com/legal/privacy"&gt;privacy policy&lt;/a&gt;. You can enable or disable access to location at any time, through your device settings.&lt;/p&gt;</description></item><item><title>Migrate from Play Services Location to Android's LocationManager API</title><link>https://fobo66.dev/post/play-services-location-migration/</link><pubDate>Wed, 08 Jun 2022 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/play-services-location-migration/</guid><description>&lt;p&gt;Hello! After the announcement from &lt;a href="https://blogs.windows.com/windows-insider/2021/10/20/introducing-android-apps-on-windows-11-to-windows-insiders/"&gt;Microsoft about Android apps support in Windows 11&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;My app was using only &lt;code&gt;FusedLocationProviderClient&lt;/code&gt; 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 &lt;a href="https://developer.android.com/guide/topics/location/migration"&gt;official docs&lt;/a&gt; are advising to use Play Services.&lt;/p&gt;</description></item><item><title>Bookcrossing Mobile: postmortem</title><link>https://fobo66.dev/post/bookcrossing-mobile-postmortem/</link><pubDate>Fri, 28 Aug 2020 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/bookcrossing-mobile-postmortem/</guid><description>&lt;p&gt;Hello! Recently I received copyright infringement notice about my favorite pet project, &lt;a href="https://github.com/fobo66/BookcrossingMobile"&gt;Bookcrossing Mobile&lt;/a&gt; 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&amp;rsquo;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.&lt;/p&gt;</description></item><item><title>Understanding Gradle for Android developers</title><link>https://fobo66.dev/post/understanding-gradle/</link><pubDate>Thu, 16 Jul 2020 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/understanding-gradle/</guid><description>&lt;p&gt;Hello! For a long time I wanted to migrate my &lt;a href="https://github.com/fobo66/BookcrossingMobile"&gt;Bookcrossing Mobile&lt;/a&gt; app to Gradle Kotlin DSL. But I&amp;rsquo;ve used remote Groovy function for loading API keys from &lt;code&gt;.properties&lt;/code&gt; files. Here is a &lt;a href="https://gist.github.com/fobo66/17d5116b5c7bccf5f28036f401f3c09d"&gt;gist&lt;/a&gt; with that function. Despite it&amp;rsquo;s a simple function, I didn&amp;rsquo;t want to write this for each of my projects, and sharing code via gist was somehow a good idea.&lt;/p&gt;
&lt;p&gt;I wanted to share this code in more common way, via plugin, so I decided to create my own &lt;a href="https://github.com/fobo66/propertiesLoader"&gt;plugin&lt;/a&gt;. 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&amp;rsquo;ve asked colleagues, and turned out that they prefer not to touch Gradle scripts much and only vaguely understand how it works.&lt;/p&gt;</description></item><item><title>Musings about quality: what I've learned after migrating my projects to AndroidX</title><link>https://fobo66.dev/post/migration-to-androidx-problems/</link><pubDate>Thu, 28 Nov 2019 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/migration-to-androidx-problems/</guid><description>&lt;p&gt;Hello! Recently I decided to get back to my old project, &lt;a href="https://github.com/fobo66/BookcrossingMobile"&gt;Bookcrossing Mobile&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;However, there were some important points that I&amp;rsquo;ve discovered during migration, and I believe these point can simplify developer&amp;rsquo;s life in the future. Hope that they will be useful for you.&lt;/p&gt;</description></item><item><title>Notes from RSConf Mobile Day</title><link>https://fobo66.dev/post/rsconf-notes/</link><pubDate>Fri, 09 Aug 2019 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/rsconf-notes/</guid><description>&lt;p&gt;Hello! Just wanted to share my quick notes from the &lt;a href="https://rsconf.by"&gt;RSConf Mobile day&lt;/a&gt;&amp;rsquo;s most important sessions. These notes are chaotic and quite short, but they contain some valuable insight shared by the brilliant speakers.&lt;/p&gt;
&lt;h2 id="wake-up-neo"&gt;Wake up, Neo&lt;/h2&gt;
&lt;p&gt;Talk was about common problems in software development.&lt;/p&gt;
&lt;p&gt;Security is broken: more than 1 billion people are affected. And we don&amp;rsquo;t pay much attention.&lt;/p&gt;
&lt;p&gt;Our apps are broken or incredibly complex or unusable.&lt;/p&gt;
&lt;p&gt;Inclusivity is an ability of a group to include different people.&lt;/p&gt;</description></item><item><title>Remote logging for mobile apps</title><link>https://fobo66.dev/post/remote-logging/</link><pubDate>Thu, 04 Apr 2019 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/remote-logging/</guid><description>&lt;p&gt;Hello! In this article, I&amp;rsquo;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.&lt;/p&gt;
&lt;p&gt;Generally, logging in production is considered harmful, because you can expose sensitive information from your application to hackers. It&amp;rsquo;s a serious security trait, but disabling logs in production may not be the best solution: you won&amp;rsquo;t be able to see the state of your app during investigation of the strange crashes or suspicious feedbacks coming from users. So, it&amp;rsquo;s needed to find healthy compromise between security and logging.&lt;/p&gt;</description></item><item><title>Android SQLite savepoints: nested transactions and workaround</title><link>https://fobo66.dev/post/sqlite-savepoints/</link><pubDate>Sun, 30 Sep 2018 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/sqlite-savepoints/</guid><description>&lt;p&gt;Hello! In this article I’ll show one small trick with SQLite savepoints and my story how I’ve found this trick.&lt;/p&gt;
&lt;p&gt;Google &lt;a href="https://developer.android.com/reference/android/database/sqlite/package-summary"&gt;claims&lt;/a&gt; that Android fully supports SQLite database engine. But the code that framework provides to us sometimes isn’t implemented well, so we cannot use some SQLite features and forced to search for workarounds.&lt;/p&gt;
&lt;p&gt;One of the features that doesn’t work as expected is &lt;a href="https://sqlite.org/lang_savepoint.html"&gt;savepoint&lt;/a&gt;. In short, it’s a tag in SQLite’s operations journal that can mark some important point in operations history to fall back to it if something was wrong. It’s similar to transaction, but savepoints have one big advantage over transactions: you can have as much savepoints as you need. You can have only one transaction at the time, but when you need to undo only particular changes inside huge transaction, savepoint can be used. Actually, savepoints are transactions, but with names and with possibility to nest multiple transactions inside one.&lt;/p&gt;</description></item><item><title>Working with XML using Retrofit2</title><link>https://fobo66.dev/post/working-with-xml-using-retrofit2/</link><pubDate>Mon, 27 Mar 2017 00:00:00 +0000</pubDate><guid>https://fobo66.dev/post/working-with-xml-using-retrofit2/</guid><description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;Sometimes you need to work with some API that was created years ago, or contains more semantics that JSON allows. That APIs mostly created with XML. It’s pretty ugly format, hard to read by humans, but it’s still relevant, and sadly we need to know how to work with it. It’s not so obvious in Java as it appears to be. I’ve spent two days struggling figuring out why it’s not working. Internet has not so much relevant information about it, so I decided to write it myself. I’ve used it in Android project, but since Retrofit2 is a general Java library, you can use it in Java projects as well.&lt;/p&gt;</description></item><item><title>About</title><link>https://fobo66.dev/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fobo66.dev/about/</guid><description>&lt;p&gt;Hi! My name is Andrei, I&amp;rsquo;m an Android Developer by craft. I write code since 2010, touched various tech stacks during this time, but stayed on Android. I participate in open source projects, and maintain some of them myself.&lt;/p&gt;
&lt;p&gt;In this blog, I will focus on technical articles about stuff I encountered in my works. Hope it will be useful to people.&lt;/p&gt;</description></item></channel></rss>