Skip to content

Repository files navigation

Silent Timer

A lightweight Wear OS timer app designed for silent operation — vibrates without ringing.

Silent Timer Logo

📌 Features

Silent: Vibrates instead of ringing.
Halftime alert: Option to buzz briefly at halftime.
Ambient mode: Supports countdown in ambient mode.
Complication: Includes a watchface complication.
Minimalist UI: Designed for Wear OS with a simple interface.

🌌 Background

I developed this app for personal use because of features I missed in the default Pixel Watch timer app. The goal is to keep it simple and similar to the default timer. Features I wanted in my timer app:

  • Silent operation: Vibrate without ringing when the timer expires.
  • Halfway alert: Brief reminder when the timer is halfway (e.g. for cooking).
  • Ambient mode: See the countdown when the watch is in ambient mode.

🔧 Supported Versions

The app currently supports Wear OS 4.0 and above.

📸 Screenshots

Timer setup

Timer setup screenshot

Timer display

Timer display screenshot

Timer settings

Timer_settings screenshot

Timer display (ambient mode)

Timer display (ambient mode) screenshot

Timer complication and ongoing activity

Timer complication and ongoing activity screenshot

🚀 Installation

There are two ways to install the app on the device:

  1. Join the beta test to download it directly from the Google Play Store.
  2. Sideload it on the device.

Google Play Store beta test

Sideloading

The sideloading guide below is based on a Pixel Watch 2 running Wear OS 5.1 and a Windows PC.

Step 1: Download the app

  • Download the prebuild APK file from releases (or build it yourself)

Step 2: Prepare the watch

  • Open Settings
  • Tap System > About > Versions
  • Tap the Build number seven times to enable developer options
  • Go back to Settings
  • Tap Developer options
  • Enable "ADB debugging"

Step 3: Download ADB on your PC

Step 4: Connect the watch to PC

  • Connect the watch charger to a USB-C port from your PC (Pixel Watch 2 and up)
  • Put your watch on the charger and unlock it with PIN
  • A pop-up should appear "Allow Debugging". Select OK.
  • (If no Pop-Up appears disable and enable "ADB debugging" from Step 2 while connected to the PC)

Step 5: Transfer app to watch

  • Open a Terminal in the folder where you extracted the SDK Platform Tools in Step 3
  • Run the following command: .\adb install "Path\to\the\downloaded\silenttimer.apk"
  • Success🎉🎉
  • Disconnect the watch from PC

Clean-Up (if required)

  • Disable "ADB debugging" from step 2
  • Delete the .zip and the extracted folder from step 3

🚀 Development

📂 Project Structure

📦 silenttimer
┣ 📂 presentation
┃ ┣ 📂 receiver          # Broadcast receivers for timer events
┃ ┣ 📂 service           # Timer and complication services
┃ ┣ 📂 theme             # App-wide theming and styles
┃ ┣ 📂 ui                # UI Screens (Timer Setup, Timer Display)
┃ ┣ 📂 utils             # Utility functions (e.g. time formatting)
┃ ┣ 📂 viewmodel         # ViewModels for state management
┃ ┗ 📜 TimerApp.kt       # Application class for global setup
┣ 📜 Navigation.kt       # Handles app navigation

📝 Code Overview

🔹 TimerApp.kt

  • Ensures global setup before any component (like activities or services) is created.
  • Creates a notification channel for timer-related notifications used throughout the app.

🔹 MainActivity.kt

  • The entry point of the app.
  • Requests permissions and updates complications on launch.
  • Sets up the Wear OS Material Theme.

🔹 Navigation.kt

Handles screen navigation using SwipeDismissableNavHost. Automatically switches between:

  • TimerSetupScreen (when timer is inactive)
  • TimerDisplayScreen (when timer is running)

🔹 TimerSetupScreen.kt

  • Lets users select a countdown time.
  • Starts the TimerService when confirmed.

🔹 TimerDisplayScreen.kt

  • Shows the remaining time.
  • Allows stopping the timer.
  • Has a horizontal page to access the settings
  • Supports Wear OS Ambient Mode for low-power display.

🔹 TimerService.kt

  • Runs a foreground service to handle the countdown.
  • Manages wake locks to prevent sleep mode.
  • Handles vibration alerts when the timer reaches zero.
  • Updates watchface complications when timer state changes.

🔹 TimerComplicationDataSourceService.kt

  • Provides a Wear OS complication for the countdown timer.
  • Displays remaining time directly on supported watch faces.

🔹 TimerReceiver.kt

  • Receives broadcast intents for timer events (halftime and finish).
  • Starts the TimerService to handle the events.

🔹 TimerManager.kt

  • A singleton that manages the timer's lifecycle (start/stop).
  • Exposes the timer state via a StateFlow for reactive UI updates across the app and complications.

🔹 TimerState.kt

  • A data class representing a consistent snapshot of the timer (running status, duration, and end time).
  • Uses SystemClock.elapsedRealtime() to ensure accuracy and survival across device sleep/Doze states.

🔹 TimerSetupViewModel.kt

  • Stores the selected countdown time before starting the timer.

🔹 Utils.kt

  • Contains helper functions, including time formatting.

🔹 Settings.kt

  • Manages application-level settings using Jetpack DataStore.

🔹 Theme.kt

  • Defines the Wear OS Material Theme for consistent styling.

🔹 AndroidManifest.xml

  • Declares permissions, services and the app’s entry points.

📜 License

GNU General Public License v3.0

🤝 Contributing

Want to contribute? Pull requests and issues are welcome! 🎉

📚 Dependencies

Google Horologist: Used for the TimePicker and AmbientAware Composables.

About

A lightweight Wear OS timer app designed for silent operation — vibrates without ringing.

Topics

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages