Tanakh Read Along

Android App

For the Android Project, I decided to use:

Jetpack Compose

For the animation syncing text and audio in a karaoke-life effect.

Since the Android version was built after the iOS App, I can say that the concept behind Compose is quite similar to SwiftUI. Specially when I basically learned both in the process of making these apps.

So much so that some of my notes on SwiftUI are equally valid for Compose:

  • It doesn't happen in a structured, line-after-line instruction execution as I expected. I had the impression that the interface was constantly "scanned" and the reconstruction of components happened continually as well. Android documentation does mention that the composables are not rendered in order but a recomposition occurs when a value that the composable object reads changes.

  • There was a FlowRow development done by AndroidX for composable objects, but alas I found this dreadful comment on the source code:

// TODO(soboleva): rtl support

which was just what I needed for Hebrew. In the end I was able to patch it to work in RTL.

Modular Multirepo Architecture

This concept is exactly as in Swift-iOS, just the technology changes. The goal is to keep component responsibilities as independent as possible. In this case, the task of retrieving data (JSON and WAV) from the cloud was delegated to a separate project, which was then consumed by the main app via Gradle as a Module (named TanakhResources).

TanakhResources is currently getting all the media and text files from Firebase Google Storage; if it becomes necessary in the future to switch to another content provider, such as Amazon S3, Linode, or others, the impact on the main app should be minimal; ideally, a change in gradle dependency name should suffice.

TanakhResources now have the following basic functionalities:

  • List Locally
  • List from cloud
  • Download Text and Audio From Firebase Storage
  • Delete local data
  • Check for existing local data.

The module can be consumed by the main App by simply pointing to the location of the locally cloned repository, as I did in my case.