Wear OS, Google’s operating system, running on devices like the Google Pixel Watch and Samsung Galaxy Watch series, historically hasn’t attracted users quite like its main competitor, Apple’s Watch OS.
Released as Android Wear in 2014 with underwhelming capabilities and performance, the operating system was rebranded to Wear OS in 2018. Accompanying this rebrand was a new focus on devices from high-profile design-led watchmakers such as Fossil and Montblanc, and even (for a brief period) compatibility with iPhones. After this burst of energy, however, the OS felt largely neglected, falling further and further behind Apple’s efforts.
The reliance of manufacturers on underpowered and outdated SoCs from Qualcomm (chips far behind their Apple equivalents) didn’t help, contributing to the feeling that Android based devices were also-rans when it came to wearables. By the end of the 2010s, many Android OEMs (including Fossil) were pulling out of smartwatch manufacturing entirely.
This long period of stagnation came to an end with the release of Wear OS 3.0 and Samsung’s Galaxy Watch 4 range in August 2021. A UI overhaul, better energy efficiency, a 30% increase in performance and the inclusion of a variety of health and fitness tracking tools from the Google Fit suite and Fitbit led to a sudden uptick in market share for Wear OS, which went (largely due to Samsung’s adoption of the platform) from 4% in Q2 2021 to 17% in Q3 2021. With Apple taking 21.8% of the market at this point, the user base for Android based watch apps suddenly started looking a lot more significant.
With the recent rollout of Wear OS 4.0 (based on Android 13) promising longer battery life, increased app availability including Google Calendar and Gmail, improved text-to-speech functionality and more, the gap between Wear OS and Watch OS appeared to be closing.
At Rant, we decided it was time to dive into Wear OS to see how this update affects development, as well as seeing how transferable Android app techniques can be to Wear OS development, especially with newer tools like Jetpack Compose.
Making a Wear OS app
We created Moody, a simple mood tracker app enabling the user to log their current mood from a predefined list, see their mood for the past week in chart form, and view a list of all of their previous logs.
Android Studio provides a handy wizard for setting up new projects in a variety of formats including those for smartwatches (with the option to create an accompanying smartphone app if you wish). Using the latest stable Android Studio version, Giraffe, the project was built to include the Wear variant of several Compose libraries (so we didn’t make the mistake of using, for example, androidx.wear.compose:compose-material instead of androidx.compose.material:material) meaning we would avoid any strange behaviours which can come from mixing the Wear and Android versions. Beyond that, the project came with a very basic setup – a MainActivity and some theming, both of which Android developers will be familiar with.
As our most commonly used app architecture is MVVM (Model-View-ViewModel), we chose to try this out in the context of a smartwatch app. The app would have a basic MVVM structure consisting of a Data layer and a UI layer (containing the single Activity, composables and ViewModels). Dependency injection libraries (in our case, Koin) were also fully compatible with Wear OS development.
One of our key focuses was looking at the ability to use a declarative approach to developing screen layouts, and we were pleasantly surprised with the results. After reviewing various Android charting libraries and finding none which offered sufficient customisation to match the designs, we decided to create a stacked bar chart using Compose. Implementing the design and logic was straightforward in this way (we imagine it would be a lot more difficult using the older XML-based approach) and adding it to the watch screen was identical to the Android app approach. Notably, Android Studio now offers both Compose previews and smartwatch emulators, allowing us to quickly iterate over designs and test functionality across a range of smartwatch screen sizes and shapes. This is particularly useful when working with this form factor, and Previews in particular help with the intricacies of working with differently-shaped screens.
Wear Compose comes with some nice tweaks to the standard Compose libraries which improve development specific to smartwatch apps. Navigation between screens was quick to implement with Wear’s Compose Navigation library, which offers SwipeDismissableNavHost to offer back navigation via swiping gestures built into the NavHost.
UI elements also differ in places, with ScalingLazyColumn being offered as an alternative to LazyColumn. ScalingLazyColumn loads items in a vertical list lazily to improve performance just as a LazyColumn does, but also offers additional parameters to adjust the scale and alpha of items in a list based on their position. As a result, items centred on the smartwatch screen can be made more prominent while those at the edge of the screen tend to get smaller and fade as they leave the viewport. This was useful in creating both the mood selection screen (consisting of a vertical list of fullscreen mood “cards”) and when viewing previous logs, offering a more dynamic and appealing look when exploring the app.
Moody – Insight into emotional wellbeing
We’re proud of our Moody watch app – it’s available now in the Google Play store, and we had a lot of fun building it. The techniques, architectural patterns and libraries that make modern Android phone application development a great space to work in apply equally well to Wear OS – which makes developing robust, reliable watch apps that deliver a delightful user experience something we can’t wait to do more of.