Back to Writings
Tether™ • Engineering

Silencing the Noise: Fixing Android Notifications in Tether

· 3 min read

Tether is an app designed to reduce digital noise. Its core thesis is simple: when you reach for your phone out of habit, we nudge you toward a meaningful connection instead. However, building an app about reducing noise meant we had to be incredibly precise about the noise we did create.

Recently, we tackled two critical UX challenges on our Android build: notification reliability and keyboard persistence.

The Notification Channel Conundrum

Android handles notifications fundamentally differently than iOS, relying heavily on Notification Channels. We noticed an issue where local notifications—the gentle nudges reminding you to reach out to a friend—were sometimes failing to trigger or were being delivered silently without waking the screen.

"An unheard nudge is just a wasted battery cycle."

The root cause lay in our notification service layer. We refactored our trigger mechanics to ensure that every notification was explicitly tied to a high-priority channel and utilized a robust time-interval trigger. By standardizing the channel association, we ensured that when Tether decides it's time to prompt a connection, the message actually reaches the user consistently.

Taming the Software Keyboard

The second issue was less about system architecture and more about pure tactile frustration. Across several input screens—like adding a new contact or logging a conversation—the Android software keyboard was misbehaving. It would obscure text inputs, or stubbornly refuse to dismiss when the user tapped away.

To fix this, we conducted a full audit of our React Native views:

  • KeyboardAvoidingView Consistency: We ensured that every screen with text inputs was wrapped properly, automatically padding the layout so the active input is always visible.
  • Tap Persistence: We configured `keyboardShouldPersistTaps` to allow users to interact with lists or buttons without the keyboard immediately retracting, unless explicitly desired.
  • Explicit Dismissal: We wired up global dismissal logic, ensuring that hitting "Done" on the keyboard or tapping outside the active area cleanly dismisses the input.

Sweating the Details

These might seem like minor technical plumbing issues, but in an app designed to promote mindfulness and calm, friction is the enemy. A keyboard that won't go away or a notification that fails to fire breaks the illusion of a helpful assistant and reminds the user they are fighting with software.

By sweating these Android-specific details, we're making sure that Tether stays out of your way until the exact moment you need it.