This is a rich countdown timer app. It was designed specifically for public speakers, but has many uses.
This app requires iOS devices (iPhones, iPads and iPods), running iOS 10 or greater, or MacOS X, 10.15 (Catalina), or greater (for MacCatalyst version).
AmbiaMara is a proprietary-code application, and the code is not licensed for reuse. The code is provided as open-source, for purposes of auditing and demonstration of The Great Rift valley Software Company coding style.
This project was initially released in October, 2012, as “SpeakerBeeper,” and written in Objective-C.
In May, 2017, it was rewritten in Swift, and released as “An Excellent Countdown Timer.”
In April, 2019, it was again rewritten, and released as “AmbiaMara.”
So that means that the basic design is from 2012. It’s not the “swifiest” design on Earth, but it works pretty well.
NO WATCH APP
The app features a nascent (unused) Apple Watch app. It was determined that the communication between phone and Watch was too unreliable to qualify the companion app for release, but the app has been left in the codebase for possible future deployment.
We are hoping this changes.
This uses elements of the excellent SwipeableTabBarController, by Marcos Griselli to handle an animated swipeable tab transition, like Android gives you.
This app is NOT licensed for reuse. It is hoped that the open-source nature of the app will help folks to learn about what I can do, and give them some confidence in the app.
Localization was commissioned from the folks at Babble-on.
PROJECT DESIGN AND DESCRIPTION
AmbiaMara is a Tab-Based iOS App. That means that it has a tab bar along the bottom of the screen that selects “pages,” with specific functionality.
In the case of AmbiaMara, there is an initial page (Timer List), and each timer, as it is added, is appended to the end of the tab list. This means there is no upper limit on the number of tabs the app can have.
That said, you shouldn’t have more than five tabs (four timers) for iPhones, or seven tabs (six timers) for iPads, as more will cause the tab bar to go into “More” mode, in which an extension callout is added to the right side of the tab bar.
The app basically consists of six different screens; most, presented modally over the previous screen. There are UINavigationControllers, but these are more of an historical artifact, than anything else. The navBars give us somewhere to slap our buttons.
The main UITabBarController handles switching between the main contexts. Namely, the initial Timer List Screen, and the individual timer screens.
There is one screen that can be called modally from the main Timer List screen: The About/Info screen. That has some basic information about the app, and a link to the main app instruction page (linked above). Tapping anywhere in that page will dismiss it.
Each Timer screen can bring in a modal Timer Settings screen, which allows you to do things like choose warning/final threshold levels (for podium/dual mode), display digits color (for digital/dual mode), and has a button that will bring in another screen; the Alarm Settings screen, that allows you to set whether to play a sound, vibrate, or play a song when the alarm goes off.
The Timer screen can bring in a modal Running Timer screen, which takes over the entire screen, and presents a very simple countdown timer to the user.
This is generated in realtime, using UIBezierPaths, and includes such details as the hexagonal grid and the cathode wires.
The three “traffic lights,” (podium and dual mode) however, are simple images; displayed in place.
The application retains state using the basic UserDefaults Foundation utility.
It will manipulate screen brightness, but will return the original brightness upon switching out or stopping the running timer.
The app uses a trick to create custom “live” icons in the tab bar; representing the set time of the timer. For technical reasons, this does not work for tabs in the “More…” menu.
Great care was taken in localizing the app. Most of the localized text is actually never displayed, and is used for VoiceOver mode navigation.