TL;DR: Make calls via your Garmin device without taking your phone out of your pocket.
If you're interested in joining the beta, please reach out to me or send a request to join the dedicated Google group - I'd really appreciate that.
For one reason or another, I often find myself wearing a Bluetooth headset connected to my Android phone (specifically, hearing aids in my case). The same phone is connected to my Garmin watch.
The watch (one of the best in the world, if you ask me) allows me to control Music, Podcasts and, among other things, answer and control incoming calls on the phone. What it does not allow me to do yet is initiate and control outgoing calls. Handsfree fills that gap.
- Call control
- Outgoing calls
- Incoming calls
- Customizable continuous vibration on incoming calls (Fenix 7 only)
- Recent contacts
- Missed calls
- In-call audio volume control, microphone muting
- Headset status
- Speakerphone control
- Seamless syncing
- Glance view
The solution has two components: the app running on the watch and the companion app running on an Android phone.
Acts like a (dumb) relay between the watch and the rest of the phone:
- Serves your requests from the watch, e.g. directing the phone to initiate or hangup a call
- Sends the updates to the watch so that you see calls in progress
- Sends the names/phone numbers from a preselected contact group (currently, starred contacts) to the watch so that you can select a number to dial
- Sends call history to the watch
- Sends headset/microphone status to the watch
- Shows the list of starred contacts provided by companion app
- Lets you start and control outgoing calls for selected contact numbers
- Lets you control calls in progress, even if they weren't initiated from the watch
- Shows Bluetooth headset connection status in the app/glance: # symbol in the title indicates that headset is not connected/will not be used if you make/accept a call (in that case speakerphone is used for outgoing calls, while earpeace is used for incoming calls).
- Garmin watch or bike computer (see Connect IQ app page for supported models)
- Android phone (currently limited to Android 10 or later) with Garmin Connect app installed and connected to the watch
- iPhones are not supported (I could not find a way to drive calls there without explicit user confirmation for each call).
There are two options, depending on your device model/firmware.
-
Handsfree app for recent devices (not older than 2022), that have support for glances in apps:
-
Handsfree widget for older generations of Garmin devices:
There two ways to obtain the Android companion app.
-
From Google Play:
-
If you prefer to not depend on Google Play, you can install the latest version of the app from the following page:
https://grigorye.github.io/handsfree/Installation
Alternatively, just grab .apk from releases.
- Install the Android app, open it, and toggle all features on (preferably) - you'll be prompted for the necessary permissions.
- Check/adjust list of favorite contacts on your phone.
- Check https://dontkillmyapp.com for your phone model (the link that should automatically show hints for your device is available in "About > Troubleshooting > Hints for running apps in background" in the Android app).
- Install the watch app and launch it. It should retrieve the list of contacts from your phone and you should be ready to go.
It's critical for the companion app to be allowed to run in background and receive the requests from the watch. To avoid issues, I highly recommend checking https://dontkillmyapp.com and following instructions for your specific phone model to ensure Handsfree and Garmin Connect can run in the background.
See also optimization for responsiveness.
If you want to build, experiment with, or modify the source, everything necessary (except the developer keys) is stored in the repo.
Regular development should be possible with Android Studio (companion app) and Visual Studio Code (watch app).
For watch app, use ./WatchApp as the VScode workspace. The default build produces a watch app. To build a widget (and thus get "glance" available for Instinct 2), edit .vscode/settings.json and replace "app.jungle" with "widget.jungle" in the monkeyC.jungleFiles setting.
Use AndroidApp/extras/Publishing/bin/bundle-and-reveal to build the Android app (requires GRADLE_EXTRA_ARGS to bind the developer key).
Use WatchApp/build-all to build the watch app (requires ../Handsfree-Publishing/keys/developer_key to hold the developer key).
I'm neither a Garmin nor an Android software developer (I'm an iOS/ex-macOS developer in my day life though). This is my first and only pet project that utilizes either of these platforms.