Building A Sailing App For Samsung Watch

I haven’t written anything on here in a long time; I’ve been busy doing something a bit different – I developed and distributed an app for Samsung watches so I thought I’d document some of the things I learnt in the process. We won’t be delving deep into detail on the code, but more into the whole process.

The concept

The motivation was simple; due to a lack of research on my part I didn’t realise that there would be no real options for sailing apps on the Samsung Galaxy Watch that I had just bought and not being one to accept this, I decided I’d make one for myself. Regatta Racer is a simple sailing start timer for the start sequence for regattas and other yacht and dinghy races, it also has speed reading and heading to help navigate the course. The original intentions were more complex, I wanted to offer the idea of being able to program in the course for the race and have it navigate you around however I ran into some issues regarding this; more details to come on that.

In the past, I have never done any UI design, so I chose to do a web app rather than designing it in the native C code, I’ve had marginally more experience with HTML and felt the online resources would be more readily available, plus figured that it would be a more rapid development timeline given the tedious nature of C. I found I was correct for the most part, but after discovering some of the limitations with regards to web apps on the watch’s operating system it may have been just as easy to choose the alternate route.

The development

The most frustrating limitations were around the fact there is only one way to keep the app running constantly while the watch is in a resting position, and that is to constantly send a message to keep the screen on; an acceptable solution during the 5-minute countdown but not acceptable for the entire race, the battery life would be woeful. Then when you find one workaround by keeping the screen on, you face the issue with inevitable screen or button presses during this time, so I had to devise a rudimentary override for all of this during the countdown by redirecting any signal while the lock was active – not the most intuitive experience for the user but better than the alternative.

Other limitations were a bit more frustrating. Coming from a Python background I was used to having various libraries that I could employ to do a lot of the rudimentary work so I had to learn a bit of geography mathematics and program all of the functions regarding navigation and timing myself. The fact that there is only True North available for the watch also means I’m going to have to periodically update the app with the position of Magnetic North because the easiest way I could discover to show Magnetic North was to essentially navigate to it. For timing, there was nothing super accurate in Javascript so the workaround ended up being to set an accurate end time, then run a cycle 10 times a second checking the time variance to the end time, this way if there were any delays in executing the code, it would still stay on time. A similar process had to be implemented when I wanted to update the clock with local time. Thankfully speed and heading are relatively easy, simply ask it to update the display every time a position change has been detected, convert the speed to knots and correct the heading to magnetic north as mentioned above. The unfortunate limitation is that it becomes inactive every time the screen is sleeping.

Lastly, any form of user input outside of a couple of buttons or the wheel on the watch face was going to be highly frustrating. I thought I’d be able to find a way around that but ultimately there was no clean way, this was the main reason for taking more complex navigation options out of the feature list. I hope to maybe one day develop a companion app on the phone to allow for this.

Other than this, I found the development process entirely engrossing. This is the first full stack development process I’ve gone through, so there were so many things to learn and to see the app take shape was exciting. I was sailing almost every weekend and I found myself constantly testing new things. New display options to find the easiest to read in intense race conditions, different sound options to see which I could hear while on the water, different navigation options through the screens, and constantly observing what I found frustrating.

The distribution

In some ways, this is one process I wish I had looked into earlier. From the get-go, it was frustrating. Even my name was being rejected with very little explanation apart from non-existent discrepancies with my ID! After weeks of applications to just get an account, I finally managed to get an app uploaded. As it was my first app there were inevitably a few things the QA team asked to be amended which was fine. What was extremely frustrating was the fact that every time you have to upload a new file, you have to untick every watch/phone pair that isn’t supported by your app with no way of filtering by OS version, this meant unticking 500+ devices in no apparent logical order.

The end product

After so much trial, months of coding and many headaches, I finally had a product I felt I could distribute. Regatta Racer was finally going to be distributed to the world. It wasn’t perfect but I felt like if I waited until then it may never get distributed, plus I felt like getting customer feedback would help improve things quicker. The nervousness when I finally distributed the app to the public was palpable, it’s the first time any of my code has been in the public space, much less as a paid product. Then came the excitement when the first sale came through! It may only be a few dollars but the thought that something that started as simply some code on a screen was now a product that someone saw enough value to pay hard-earned money for. Then the first piece of feedback! Someone was finding the app useful enough to put in a feature request! I ecstatically started writing an update to satisfy this request which will hopefully be integrated any day now.

The next steps

It didn’t take long for me to set my sights on the next idea. While sitting in the airport to head up for family Christmas I started work on a directory of nautical flags and their meanings. This was mostly an exercise to see with the knowledge I’d gained developing the sailing timer, how quickly I could develop a simple app. As it turns out, about 90% of the app was developed on the trip up to see the family and the return trip home. Unfortunately, only one person has seen the need for it but I enjoyed the process regardless.

The other unfortunate thing is I ended up losing my Galaxy watch while doing bow duty on a J24 so it is now resting on the floor of the Port Phillip Bay. So I’ll be unlikely to be developing another app for that watch. Truth be told, I was disappointed by some of the features so I will be looking elsewhere for its replacement.

I’ve now set my sights on a phone app, returning to Python for the development process. There are more native ways of developing but I’m hoping to be able to distribute the same app via both Android and iPhone under the same name ‘Regatta Racer‘.


Comments

Leave a Reply

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