A while ago I saw this animation on /r/internetisbeautiful. I highly recommend you go check it out for yourself on your browser. It sure looks better in 60 fps and also way smoother in 120+ fps. Although there is nothing fancy going on, small details in the animation makes it quiet nice to watch. Naturally, I’ve decided to implement it using Jetpack Compose. I thought there would be fun challenges behind a simple animation like this when I dive into the implementation details. Initially my assumption was

Lifecycle Coroutine Extensions were introduced some time ago to ease the usage of coroutines in Android world. You can learn more about them here.

In this post, I’m going to assume the reader already has experimented with lifecycleCoroutineScope in either at least one activity or fragment. Although the documentation gives quite good information about how to use these extension scopes, I find it’s a little mystical about how these extensions are actually implemented.

In this post, we are going to read the source code together and make sense of some coroutine concepts with cross-references to some other documentation that we…

Disclaimer: This article is written by a developer who have not yet migrated their fragments to Jetpack Navigation Component, therefore lack crucial experience in it. Although the author have researched the use-cases of Fragment Result within Navigation Component, some of the things that are discussed below may not hold in some unforeseen situations.

Fragment Result API was introduced in Fragment artifact of AndroidX with the version 1.3.0-alpha04 . Since then, it hasn’t received many changes to either its API or implementation detail. Its main goal was noted in the release notes:

Added support for passing results between two Fragments via…

It is not uncommon that once you run into an issue with Intrumentation Testing in Android, you’d feel like the loneliest person in the world. This might be an unforeseen effect of abundance of Android knowledge that exists on the Internet. Whatever you search for, there is always a StackOverflow answer or a Medium article that exactly describes what you need to do. However, this doesn’t hold for testing. My assumption is that this trend would hold in many other areas of Software Engineering. …

Controls overlay with a simple Play/Pause button

Part 1 ; Part 2

So far in this series we’ve achieved to play a video in a Composable. Through component dependencies, the video player also supported changing the source. Finally, the video player also returned media controls interface which allowed us to implement our own control buttons outside the player view. We are going to focus on adding a more sophisticated control unit in this article. Initially the plan was to also go over implementation of gestures in this article but it had changed to keep the article short and concise.

Basic Control Buttons

First of all, we want to include a…

BetterVideoPlayer Preview, one of my earlier projects

This post has been edited after Beta release of Jetpack Compose.

Deciding on a Player

Before we start with how to play a video in a composable view, we need to decide on a player class. It would be rather a huge undertaking to develop a player from scratch. In this project, we are only interested in UI side of things. That relieves us from individual frame rendering, remote data fetching, and state management of a classic media player.

Android’s own MediaPlayer SDK is alright for a simple Video Player project. I’ve even used it in one of my older open source projects called…

This write-up is divided into 5 cohesive parts for better delivery. This post is about getting into Jetpack Compose for the first time and figuring out little details before moving onto more concrete implementations with clear goals. The link for next posts can be found at the bottom.

What is Jetpack Compose?

Jetpack Compose is a modern toolkit for building native Android UI. It’s based on the declarative programming model, so you can simply describe what your UI should look like, and Compose takes care of the rest — as app state changes, your UI automatically updates.

Declarative UI frameworks took the web by…

Incidents are the times where fast and reliable communication becomes the highest priority in a team. When not just minutes but seconds matter, an easy way to reach to responders may resolve an incident in a shorter time which potentially saves a company millions of dollars. That’s why Opsgenie had introduced a feature called Incident Command Center(ICC) back in January of 2018. This feature can be grossly summarized as a VoIP application with video support. Opsgenie has committed to improve and expand ICC beyond being just a quirk since its inception. …

DataBinding — Less Boilerplate

We probably all remember the old(like 4 years ago?) days of Android development when the presentation layer was merged into Activity code. We had to include code snippets like below everytime a view manipulation was needed.

TextView mNameTextView = (TextView) findViewById(

These type of lines that are enforced by the framework are called boilerplate and often their number is inversely correlated with readability of the code. Good news is that this problem has been addressed for a long time. ButterKnife might be considered the most successful 3rd party implementation of View Binding concept using annotations. …

Halil Ozercan

Opsgenie@Atlassian / Android Engineer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store