I’ve created a call-blocking app called exPhone. The name is a nod to people who’ve teased me over the years for using alternative operating systems on mobile phones (not just Ubuntu Touch). These systems are often more sensitive to codebase changes, sometimes resulting in missed calls or lost SMS messages—issues not unlike those experienced by the first iPhone. exPhone also humorously suggests blocking calls from your “ex-.”

Let me take you behind the scenes of its development.

The Idea

A discussion about call-blocking apps on the Ubuntu Touch community forum caught my attention some time ago. I pointed out that libwatchfish provides a suitable API for this functionality, but another app already existed. That app, F-Call Pro, was paid and its license was tied to the phone’s IMEI. It was also only available for Xenial (an earlier Ubuntu Touch version).

I casually remarked that implementing such an app would take just one afternoon. Eventually, I decided to put that claim to the test. Surprisingly, building the app’s core functionality did only take one afternoon. However, making it production-ready required significantly more effort. In fact, I don’t even need the app for my own use.

The Development Journey

During development, I had to solve several challenges, fitting the pieces of a larger puzzle together:

  • Migrating to CMake
    I used this opportunity to migrate libwatchfish to CMake as a first step toward migrating Amazfish to CMake.
  • Universal Components
    The app is built using the same universal components as Amazfish. I had to tweak these for exPhone, which means it should work on SailfishOS too—though I haven’t tested that yet. However, one reviewer pointed out, “UI needs some love.”

  • Learning and Improving
    Developing exPhone also taught me:
    • How to work with SQLite. Check out this fascinating article: Collection of insane and fun facts about SQLite.
    • Storing application configurations in a simple, universal format that accommodates different variable types while providing shortcuts for efficient access
    • Using Transifex for translations.
    • Implementing a system service for background tasks. Building a settings UI for user interaction.
  • AI for Design
    I am not a graphic designer, so I relied on AI tools to create the app logo.

Lessons Learned

When creating a great app, it’s best to start small, with no big ambitions, and improve in small iterations. Once users discovered exPhone, they began requesting new features. For me, the project has been more of a mental exercise, and I’m not planning to continue its development actively.

However, you might change my mind with donations! Otherwise, remember the GPL v3 license and its disclaimer about warranty.

Future Ideas

There are exciting possibilities, such as blocking phone number ranges or integrating third-party online services for call-blocking decisions. If you’re interested in contributing, I’d love to hear from you!

Alternatively, it might be easier to port an existing SailfishOS app and replace its UI with a native Ubuntu Touch interface.

Feedback from Users

Although I hadn’t initially planned to continue developing the app, the feedback I received proved valuable. Some users suggested improving the UX, so I made adjustments to the universal components, such as removing the unnecessary back button. While this change was an improvement, the feedback left me wondering—wasn’t that enough?

One user also asked for the ability to block anonymous numbers. At first, it wasn’t clear whether they meant blocking contacts not saved in the address book or blocking calls from hidden or anonymous numbers (Calling Line Identification Restriction – CLIR). I added two switches: one for blocking unknown contacts and another for blocking anonymous numbers.

I didn’t want to block anyone without notifying the user, so I started exploring the Notifications API. I realized the freedesktop notification API only triggers notifications, but I needed to use the push notification API to ensure notifications about blocked calls would appear alongside others (like missed calls) and remain persistent.

Finally, I ran into an issue with SQLite and QDateTime. Since SQLite doesn’t handle time zones and expects all dates and times to be stored in UTC, I recently fixed a bug related to this.

One of the most rewarding things has been the contributions from the community. Someone actually created a Dutch translation, which is already included in the released version.

Loading

By Jozef Mlích

Software Developer at GreyCortex, NemoMobile contributor, Micro light aircraft pilot, OpenAlt Conference organizer

Leave a Reply

Your email address will not be published. Required fields are marked *