Skip to content

Code review part 2 — 12 additional improvements (permissions, UX, privacy, platform) #3

Description

@JSvandijk

Follow-up to #2 with more findings after a deeper look. Same format — pick what's useful!


🐛 Bugs / Edge Cases

  • Mic permission revoked while app is running — If a user revokes microphone permission mid-session (via Android settings or quick settings), does AudioRecorder crash or handle it gracefully? The app should detect the missing permission and show a clear re-permission prompt instead of crashing.

  • No request timeout or cancel option — If the Groq API takes >30 seconds to respond (slow connection, server overload), the user is stuck with an orange mic button and no way to abort. There should be a configurable timeout (e.g. 15s) and tapping the mic again during processing should cancel the request.

  • Custom dictionary size limit not enforced — The Whisper API accepts a prompt for word hints. If a user adds thousands of words to their custom dictionary, the prompt could exceed Whisper's token limit, causing silent failures or degraded accuracy. Add a word count limit with a warning.

  • Floating bubble conflicts with other overlays — Facebook Messenger chat heads, picture-in-picture video, banking app overlays, etc. can overlap with the GroqAndroid bubble. No collision detection or smart positioning is mentioned. The bubble could end up hidden behind another overlay.


✨ Enhancements

  • Dark mode / Material You theming — The keyboard likely has a static light theme. On devices with dark mode enabled, it will look jarring and out of place. Support isSystemInDarkTheme() or Material You dynamic colors to match the user's system theme.

  • Haptic feedback on mic tap — Most keyboards vibrate briefly on key press. The mic button should do the same — a short haptic pulse on start and a different one on stop. This gives tactile confirmation, especially useful when not looking at the screen.

  • Undo last transcription — If Whisper returns garbage (hallucination, wrong language, background noise interpreted as speech), there's no quick way to undo. A simple "undo" button that removes the last inserted text would save a lot of frustration.

  • First-run onboarding flow — Currently the setup requires: read README → open app → paste API key → go to Android settings → enable keyboard → switch to keyboard. That's a lot of steps. A guided setup wizard (step 1: API key, step 2: auto-open keyboard settings, step 3: test recording) would reduce drop-off.

  • Android Auto / Wear OS support — Speech-to-text is arguably most useful in hands-free contexts. Even basic Android Auto integration (voice input while driving) or a Wear OS tile would significantly expand the app's usefulness.


🔒 Security / Privacy

  • Verify HTTPS enforcement for API calls — The README doesn't explicitly mention TLS. While the Groq API endpoint is presumably HTTPS, it's worth verifying that OkHttp is configured to reject plaintext HTTP and that no HTTP fallback exists. Raw voice audio over unencrypted HTTP would be a serious privacy issue.

  • EncryptedSharedPreferences on work profiles / MDM — On managed devices (corporate MDM, work profiles), the Android Keystore can behave differently. EncryptedSharedPreferences might fail silently or throw exceptions. The app should catch these failures and offer a fallback or clear error message.


🏗️ Platform Compatibility

  • Android 12+ restricted settings behavior — The README documents workarounds for Xiaomi/MIUI and Samsung, but Android 12+ introduced stricter rules for accessibility services and sideloaded apps across all manufacturers. The "Allow restricted settings" flow differs per Android version (12, 13, 14, 15) and should be documented or detected programmatically with version-specific guidance.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions