Android functional testing made easy with Kotlin @ Hopper

Posted on

Yesterday our CEO Boris Strandjev took part as a lecturer in Hopper tech talk. Qualifast is partnering with Hopper in a strive of improving code architecture and structure of their Android app. The ultimate goal is improved maintainability and extensibility. As the plans are for significant code rewrite and reshuffle, the team will need to guard against regressions and, thus, automated test suite came in as mandatory.

In his talk, Boris told us about the tool of choice for achieving this task (UIAutomator). Additionally, he listed a great deal of extensions and customizations over the basic framework that improved the efficiency of writing tests. Hopper is incredibly successful application, with millions of users. Thus it is not surprising they are willing to invest in improving quality and in paving the way of further features and extensions. What came in as a pleasant surprise was the level of engagement and interest in the audience. It is very often that automated testing is neglected when mobile application is developed. However, as people get to know the basic stepping stones in building a test suite, we believe more will dare it. Hopefully, this will make more of us as successful as Hopper.

Colibra application is out!

Posted on

One of the most exciting applications we have worked on is released to the world! You can find the android version here and ios version here.

We love how the design makes the application extremely easy to use! With just couple of clicks you can add your upcoming flights. After that, you can use the application as boarding pass wallet, keeping all relevant information in a single place, being sure that the most recent info, e.g. gate changes, will be reflected. Further to that, if your flight has a delay, you receive instantaneous compensation. Alternative providers compensate on delays of 3h+, but Colibra compensates for 1h+! making money out of thin air has never been simpler!

This is the biggest investment of Eleven VC up to the current moment, which means that the investors also strongly believe in the success of the product. The initial reception this application received is incredible and we are sure that soon this will be a must-use for any flyer within Europe! At Qualifast we love being part of successful and useful startups.

Start to Flutter @ Flutter Live Sofia

Posted on

Flutter is a technology that has gained a lot of friction in the recent months. Now a big number of mobile developers and mobile-developer-wanna-bies develop their apps with it. Flutter has become so central for Google that they dedicated a whole event to it, broadcasting all around the globe.

Qualifast’s partnership with GDG Sofia has been long standing already, thus it is not surprising that our Mobile Development Lead Vassil Angelov opened GDG Sofia’s Flutter live stream with an introductory session. It seems Vassil himself is not big fan of the technology, bu, still, he decided to share with the public the basics of the technology, describing the initial steps one needs to make in order to start with Flutter.

Qualifast, as always, is delighted of the opportunity to share our knowledge with the community.

Presentation from Qualifast @ ISTA 2018

Posted on

Our CEO Boris Strandjev presented a session called “DevOps disrupted – mobile is the new master” during ISTA 2018 conference. He put the prism of the mobile development over the one of DevOps to show how those two combine for effectively done and successfully delivered mobile projects. It is a great honor that his submission was one of the few chosen for the main stage in a competition of many great speakers and topics.

“ISTA is a great conference, that started off as QA-only event, but gradually, in time, expanded to cover diverse topics across the IT industry. This year the attendees were more than 800, with many foreigners joining people from most big IT companies in Buglaria. One of the things that I particularly like about ISTA is that it is a joint venture between several companies from the very beginning, a proof that when we combine forces we are stronger than the separate parts.” Boris said after the event.

He also explicitly wanted to share his attitude to public speaking “I like speaking in front of public, sharing what I know with the community. You can ask anyone that gives lectures and he / she will tell you that you get to learn the topic a lot deeper when you present it to others. This occasion is yet another proof of that – after the session people taught me of tools and frameworks that I have not even heard of, but sound very promising!”

AngelsFX- your trade advisor app

Posted on

In the recent months we have worked with the team of AngelsFx to build their advisory application. Now we are ready and have launched the Android and web clients (iOS will follow soon ;).

AngelsFx is a team of traders that have gained great experience in operating on the ForEx market. They are making good deals, a promise of a significant profit. Now they want to share with everybody their transactions so that people can learn from the experts. If you are not into the currency markets, you can still make use of the app – one can just mimic the signals of AngelsFx and this should already lead to a good profit.

In Qualifast we are not expert traders, but we are excited to help yet another startup realize their product idea and certainly hope that the application will help many people achieve greater prosperity – both AngelsFx and their end clients.

PS: We want to explicitly thank Graphactory for the great design they made for all clients!

Top 5 Android targetVersion-driven regressions

Posted on

When building a new Android application, we are always aiming to support most of the OS versions currently in use in the Android’s fragmented ecosystem. This range of OS versions is defined by three numbers: minSdkVersion, targetSdkVersion and compileSdkVersion, and they greatly influence the way we develop. The minSdkVersion is the lowest version of the OS we prepare our application to run successfully for. The target version is the one the application was meant to run on. And lastly the compile version is what would be used to compile/build the application from source code. Usually compile and target versions are set to match.

All versions before the latest we support are going to lack newer APIs, and we can either restrict functionality based on the OS the application is running on or provide the so-called forward compatibility. The latter can be achieved by using the platform’s support libraries, which allows us to include newer features and concepts introduced in later OS versions for devices running older versions.

However, there is one more kind of compatibilty between versions we need to have in mind – the backward compatibility. This is how new versions of the platform impact code written for older versions. The Android platform’s evolution tends to consider this and tries to minimize the effects on older versions and so developers are encouraged to always set the tartgetSdkVersion to the latest available. When you have targetSdkVersion that is lower you are even presented with a warning:

target version warning

Warning on old target version in AndroidStudio

So one can be tempted to just increase this number as soon as possible, expecting the application to keep working as before. But there is a trick – this can actually make your app not behave as expected or even break it. Here is my list of the side effects that can be caused when increasing targetSdkVersion.

1. Runtime permissions – Android Marshmallow

This is probably the best known change. Before Android 6.0 (Marshmallow) applications requested permissions on installation. These permissions used to only be declared in the Manifest file. In 6.0 or later this behavior changed for some of the permissions – it does not suffice to just declare them and they have to be requested explicitly from the user at runtime. If you had an application using any of these permissions and targeting below 6.0 then your application runs the same as before even on Marshmallow devices. However, if you just go and change the target version to Marshmallow you get an application crash when the permission was needed for certain functionality. The implicit expectation is that if you target 6.0 you would know to change your approach to permissions.

runtime permissions

Runtime permissions

2. HTTP communication – Android P

Android P has just been announced and this change is still subject to interpretation and speculation, but it seems like starting from Android P applications will need to explicitly opt in to using unencrypted web communication protocol (pure HTTP). This has the potential to affect a huge portion of the Android applications.

3. File system permissions – Android Nougat

Applications targeting Nougat and above can not make files in the application’s private storage world-accessible (meaning accessible to other applications). This is security-driven restriction and sounds quite sensible. Yup, but actually by the time Nougat was released there were still many tutorials in the web advising towards sharing content between applications exactly via temporarily changing access permissions of the needed files. Thus, this change had significant impact for many.

4. Push notifications – Android Oreo

If you switch your targetVersion to 8.0 then you need to change the way you register to push notifications in order to receive them. You need to implement the newly introduced notification channels (read more here). This is done so users of Oreo+ devices can unsubscribe from particular notification channels of an app, but if you do not make any channel implementation, no notification will ever be delivered. If you do not know about this change it is very easy to overlook it and thus your Oreo users will never hear a single sound from you.

notification channels

Youtube notification channels settings

5. No implicit manifest broadcast receivers – Android Oreo

It used to be quite easy – just declare your broadcast receiver in the manifest – the broadcasts it subscribes to and the class that will handle them. With Android Oreo and above the application can not register to any implicit broadcasts. Of course, as a big fan of CommonsWare, I would recommend his article on the topic.


Android team has been listing the changes related to every platform update on dedicated pages e.g. Marshmallow, Nougat, Oreo. In Oreo they also provided a migration guide, which, I think, is a good idea. This, however, introduced two sources of truth which allows for mistakes (a mistake actually did happen, as notifications are not mentioned at all in the change list).

The above list is a selected extract of all the issues one might run into when updating targetVersion. There, of course, are even more and it might sound reasonable to not update the targetVersion at all. This, of course, is not the way to go either:

  • Using this approach one will not be able to make use of the new features introduced in Android.
  • Starting with Android P the market will not accept new applications or updates that are tergeting too old SDK versions (see initial announcement here).

The take away from all this is that progressively updating your targetVersion is a must, but it needs to be done cautiously and with awareness for possible regressions.

Liane application launched in Google Play

Posted on

Today we launched Liane in Google Play (see application page). Using this application you can request verified and trustworthy caregiver to escort your children or elderly relatives around the city. Currently the service is available only in Rome, but there are plans to expand in other Italian cities and other countries.

We developed this application for our clients from Liane S.r.l. using the design and UX prepared by 77 agency.

We can't wait to see the service get market friction and expand. Using Liane you can ensure that your loved ones will always be safely escorted to the different places in the city where they need to go, even when professional engagements do not allow you to be the one to do the escorting.

All images in the post are copyright of Liane S.r.l.