Rotation | Campaign

Rotation | Campaign

A technical tale sequence covering the initial phase of my best-selling app for Android.

The initial struggle depicting some technical aspects of my app Rotation, available for Android since 2014.

Preview

Rotation in 2016


ToC

Table of Contents

Transition

After the launch of Rotation, I was amazed by the results and had never thought that I would be working on this project for so long. It got featured on various websites, blogs and in several YouTube videos which gave me the motivation to keep working on it. It also got some paid users and some of them still use it every day. I will always be grateful to those initial supporters but still, there were various challenges to continue working on a full-time basis for them.

By Alexander Madani
Development takes many hours of concentration, and before you know it, you have spent all day!

Pricing

Rotation was launched as a 7-day trial app and even to this day, we don’t have a proper way to convey this message on Google Play. Although everything was mentioned in the app description, there was a lot of criticism from the users that it was mentioned as FREE but that’s not true. It has been a misunderstanding, as many such things go. In general, most users think in terms of their own perspectives of how something should work, rather than how it actually does. This often leads to false expectations, disappointment, and harsh criticism of hard-working developers.

Despite delivering many unique and advanced functionalities that have taken months of hard work, there were lots of negative ratings which were affecting the brand image and visibility of the product on the Play Store. Harsh consumer reactions in terms of negative reviews can not only be demoralizing for developers but are unfair to consumers who are looking to find the custom solutions they need on their devices. As it was my first year on Google Play as a developer, I naturally had to focus a lot of time on building a brand image, rather than initially being concerned about how to fund the development time. All independent developers find many such ongoing struggles as the Play Store is a dynamic and fast-moving environment, requiring tough decisions to adapt to changing circumstances all the time. For me personally (and other developers who report similar concerns), prioritizing the delivery of top features and functionalities over my equally pressing need to fund the time, was perhaps one of the toughest battles and decisions that is an ongoing challenge for the life of any valuable product that has taken a lot of effort in the first place. It was definitely not clear how I could survive such hardships, continuing endless amounts of time developing and giving away restricted functionalities for free, whilst dealing with funding my development time and livelihood as an Android Engineer.

Soon after the launch of Rotation, it was transitioned to become a freemium app with only three paid features. This critical and difficult decision was not initially very rewarding in terms of funding my time and the project operating costs, but it helped to build a strong and avid user base of loyal fans from around the world. Some of them eventually realized that they love and rely on it so much, that they ended up buying the paid version (Key). However, this has taken a lot of hard work and time, and still, Rotation has just a fraction of paid users as compared to the free ones!

Design

Unlike many early production apps, Rotation was fortunate in having an aesthetically modern and beautiful UI design from its inception. However, the availability of unlimited color selection was a feature that was not yet quite up to par with my standards. Although it did provide a way for users to select any color for their UI, there were lots of visibility challenges when displaying colors simultaneously. In other words, the design system was not generalized to be a universal solution that could tackle almost any color arrangements on top of any app background the user had configured. Hence, as Rotation has very much been a customizable product since its inception, there were still some things missing from my own standards. As Google technologies continued evolving in the years following the launch of Rotation, we finally had a full-fledged Material Design system introduced by them. It was at that point I began thinking of ways to extend that infrastructure even further in unique ways, that would enable proper theming and app customizations by the users of Rotation. These advanced endeavors were groundbreaking and very ambitious, requiring a lot of research and development time. Few independent developers invest that kind of passion and time, to achieve great value on behalf of their fans and customers.

I coined the phrase Dynamic in my code in 2016, as this term represents how my apps always try to put the user at the helm of customizability and dynamic control, rather than force a more static and non-configurable experience for them. I was already doing some of these things in terms of features and functionalities in my apps, but a Dynamic design infrastructure and system, was something that Android doesn’t natively offer (until Android 12/13), and this was the beginning of a big new challenging journey, that many Android users and independent developers admire greatly about my open-source work.


Conflict

Rotation was managing the orientation of almost all the apps present on user’s devices. Consequently, this created the illusion in the mind of users, that their software is somehow interacting with those other apps. Although this conclusion may seem reasonable to assume on the surface, actually it is not true because we can’t directly interact with other apps on Android due to system limitations and security restrictions in place. Also, my relative lack of experience as a new Android engineer at the time, combined with the aforementioned high ambitions, felt quite daunting during the early months of Rotation. This combined with a bit of unorganized code that was getting hard to manage day by day, made it seem I would never be able to achieve the great goals and feats I had set for the project.

Unsupported apps

Some apps are not meant to work in all the orientations or do not support runtime changes (e.g. camera apps). Hence, per-app settings were there to exclude those kinds of apps. Yet there are collections of other apps that don’t even bother to consider the landscape orientation in the first place, and hence miss the landscape layout(s) completely! Rotation would never be able to interact with those apps for fixing the layout issues directly, due to the mentioned system limitations and security restrictions. Although such realities are acceptable in the mind of developers, conveying such limitations and challenges to users is next to impossible, and gives us constant hardships and nightmares to try and explain.

Disclaimer

A related disclaimer was present in the Play Store description of Rotation, and even within the app itself, but there are only a small handful of people who actually bother to read those details to understand the realities.

The magic code

My ambitious visions came to an end when I realized that the code I had written months back, was not scalable and was working rather like a magic show! This was clearly a lack of experience in these new waters I was testing. I assumed things would work fine enough as long as Android would not change the operating system APIs in the future, but that hypothesis was proven wrong in a blink of an eye and great measures were taken to remedy such pain points.

Custom ROMs (UIs)

Android has a proud history of customizations, and every manufacturer (OEM) is doing such things to their device software in the form of custom UIs (also referred to as skins). Although it’s perfectly fine to have some kind of uniqueness for a device, things can quickly get very tricky and bitter for the end user experience when the OEM breaks some system functionalities or tries to customize in unorthodox ways. It is then us as Android developers who have to bear the brunt and burden of backlash by users and their negative reactions (which are based more on emotion than any technical understandings).

Hence, at no fault of its own, Rotation gets affected by such customization practices by OEMs, as some of them (for example) disable the reverse portrait orientation completely on their devices. This prevents Rotation from making proper use of the default Android implementation on these particular devices that were modified (all because it was altered by the OEM and has nothing to do with us developers). You could argue, “Well, what is the necessity of making the UI of certain apps be upside down?” From experience, I can inform you that many users of Rotation have already provided me with various feedback that indicates scenarios in which they need to use such features.

Nice, good working. My device’s screen has been broken and not working top right side. Besides, device system’s rotation unable to work over all function and it helps me. So, thanks very much.

This has been an indispensable app for me on my Huawei M5 tablet for 2+ years now. This tablet has the most ridiculous button positioning ever made. It makes sense only if I use it upside down, which I can thanks to your service forcing all the hard-coded orientation apps (Instagram, etc) to re-orient for my upside down tablet usage.

Thank you for all the hard work, Pranav! I just checked and realized I never bought the app. I’ve been free-loading this whole time so just purchased it on Play store. Hope that helps.

A lacking tutorial

Since Rotation is quite a technical product, the initial version of the software contained a 17-page long tutorial divided into 9 sections, to highlight all the features and technical aspects that make it work properly and showed users how to use it. However, there were very few users who read that knowledge base information, and I was facing a lot of support emails and spending a lot of time troubleshooting various devices of users. It was definitely a burden and a very time-consuming endeavor.

Tutorial

Original Tutorial for Rotation

The more I was gaining experience, the more I was finding ways to improve it further.


Amend

Rotation is a technical app and it uses various hidden or less documented APIs in the background. I was aware since the beginning that it would make the journey more challenging because no one can predict the future stability of such APIs, and they require regular maintenance and time.

Apps with usage access

Android 5.0 (Lollipop) released just a few months later was a major change and had impacted the per-app functionality of Rotation i.e; detecting the foreground app. It has introduced a new API called app usage stats which most of the apps are using to provide similar functionality. It took me some time to adapt to those changes without impacting the older API levels.

Runtime permissions

Android 6.0 (Marshmallow) was released in 2015, and within about a year, changed the whole ecosystem with the introduction of runtime permissions. So, requesting the Write System Settings and System Overlay permissions was again a major task and I was also doing a full-time job at that time. I couldn’t update the app due to some disorganized code in Rotation, and this was costing negative reviews on the Play Store. It was still working on Android M but users had to allow all the permissions manually and we know that each manufacturer has its own settings which made this manual approach quite impractical.

Background restrictions

Rotation’s core functionality resides in its service and it must be running in the background to function properly. Although the official restrictions were introduced in Android 8.0 (Oreo), there were several manufacturers aggressively killing the apps even before without notifying their users. Some of them have a setting to exclude selected apps but there was no guidance present within their custom UI (ROM).

Edited on 26 June 2022

Thanks to Google as at least now we have something to minimize these challenges.

Overlay restrictions

Rotation uses an overlay to control the system orientation but in 2017, Android 8.0 (Oreo) has restricted the third-party overlays on the lock screen and at some sensitive locations like device settings, etc. to avoid security issues. That change had affected the core functionality of Rotation and it was unable to rotate the device lock screen as the overlay got disabled by the system. I felt very bad about this change and it took away a lot of motivation to continue working on this project. The only workaround I had to put a notice inside the app that this functionality will not work due to system limitations.

When everything seems to be fallen, a new door opens to build it even better.


Rebase

Testing Rotation on each and every device is never possible, and I didn’t have enough experience nor time, to write a generalized code for such a complex app like Rotation, to have lots of if then else’s to support all devices. By that point I felt like I should abandon the project and move on with life, as I was doing fine in my other endeavors; until one day, a fateful email changed the future forever.

Email

Thank you for creating this app. I’m a disabled gamer and this has made many apps that only play in portrait mode very useful to me. Because I have to have the case hold my tablet because I do not have finger movement. So I play everything and do everything in landscape mode because that’s the way the case holds the tablet. There were so many apps that only play in portrait and I couldn’t go near them cuz everything was sideways and now you have fix that. God bless you. I have already paid for the fee if it was more I would have paid that so I thank you. I hope that more people pay because your fee is so modest and what you offer is a very nice thing.

Undoubtedly, I was very touched by this story, and I knew that if my work was helping improve even just the life of one person on earth, then I had a mission to accomplish and to stay resilient and motivated until greater support and success for years of my hard work on Rotation could become reality and help many more users of various backgrounds and situations.

Rotation was my first major app or project of any kind and it will always remain special to me. In early 2017, I decided to rebuild it from scratch with extensibility and scalability in mind which would tackle the continuous API changes in Android as well as support the older versions. During this reboot, I have developed various open-source projects which I will cover in the survival someday.


Note

This post was reviewed by Alexander Madani, the developer of the EZ Notes app which has its own incredible story of survival. I hope you will be able to experience EZ Notes, and help support that developer and his community as well.

Related Posts