Skip to content

feat(android): sound mode home screen, quick settings tile, auto connect fixes - #439

Draft
kennyfs wants to merge 5 commits into
Oppzippy:masterfrom
kennyfs:liberty5-home-screen-zh-tw
Draft

kennyfs wants to merge 5 commits into
Oppzippy:masterfrom
kennyfs:liberty5-home-screen-zh-tw

Conversation

@kennyfs

@kennyfs kennyfs commented Nov 10, 2026 •

Copy link
Copy Markdown

Motivation

On a Soundcore Liberty 5 (A3957), the controls people change all the time were two levels deep: ambient sound mode (noise canceling / transparency / normal), noise canceling level, transportation mode, transparency mode (e.g. vocal mode) and wind noise suppression. You had to open the Sound Modes category, then a dialog for each select or a slider for the noise canceling level. This PR puts them on the first screen after connecting and adds a Quick Settings tile. It also fixes a few auto connect issues, so the app works better in the background.

What changed

Device home screen

feat(android): device home screen with sound mode controls

  • The first screen after connecting shows battery levels for each earbud and the case, plus a "Sound mode" card. The card shows the ambient sound mode as large icon buttons, with the mode-specific settings below them.
  • The remaining categories are listed under "More Settings". Sound Modes is no longer listed separately.
  • Selects with a few short options use segmented buttons or chips instead of a dialog. Small integer ranges (e.g. noise canceling level 1–5) use buttons instead of a slider. The shared controls are in ui/utils/ChoiceControls.kt.
  • Settings of the inactive mode are dimmed but still usable. Picking e.g. "Car" while in transparency mode also sends the parent values (noise canceling, transportation), so the choice takes effect immediately instead of only changing a stored value. SoundModeChangesTest covers this.
  • The "Migrate Legacy Equalizer Profiles" entry only appears when there are profiles to migrate.

Quick Settings tile

feat(android): quick settings tile for the ambient sound mode

  • Shows the current ambient sound mode and its detail (noise canceling level, transportation mode or transparency mode).
  • Tapping it cycles through the ambient sound modes. When the device reports its own cycle settings, the tile follows them. Long pressing it opens the app.

Auto connect

fix(android): auto connect after app updates and to already connected devices, feat(android): open the connected device directly and keep auto connect alive

  • The auto connect service also starts on MY_PACKAGE_REPLACED, not only on boot, so updating the app no longer disables auto connect until the next reboot.
  • When the service starts, it connects to a paired device that is already connected over Bluetooth, since no further ACTION_ACL_CONNECTED will arrive for it. This resolves the TODO in AutoConnectService.
  • With auto connect enabled, closing the app no longer stops the device service, so the status notification keeps working in the background.
  • Opening the app while exactly one paired device is connected goes straight to that device instead of the device list.

Small fixes

fix(android): translatable notification channel name and earbuds icon for A39xx models

  • The notification channel name is now a string resource.
  • Models missing from the icon list fall back on their model number. A39xx earbuds such as the Liberty 5 (A3957) now show an earbuds icon rather than headphones.

Translations

Traditional Chinese (zh_Hant) translations are going through Codeberg Translate instead of this PR. The strings added here will be translated there once this is merged.

Testing

  • Android JVM unit tests: 13/13 passed
  • cargo test -p openscq30-lib --lib --features bundled-dependencies: 228/228 passed
  • Android instrumented tests on an Android 17 emulator (en-US locale): 20/20 passed, updated for the new layout. On current master the instrumented tests can't run at all, because the Hilt compiler isn't applied to androidTest. build(android): fix instrumented tests, shrink the native library, update rusqlite to 0.41 #438 fixes that, and these results are with it applied.
  • ktlint 1.8.0 (format-check-kotlin): clean
  • The Bluetooth and protocol code is unchanged. The new screen and the tile were only tested with demo devices, not with real hardware.

This branch doesn't depend on #438 (no shared files). The two merge cleanly in either order.

AI disclosure

These changes were developed with the help of Claude (AI, via Claude Code), and the commits carry Co-Authored-By trailers. The zh_Hant translations on Codeberg Translate were also prepared with Claude's help and reviewed before submission.

🤖 Generated with Claude Code

kennyfs and others added 5 commits November 10, 2026 18:15
… devices

- Start the auto connect service on MY_PACKAGE_REPLACED, not only on boot, so updating the app doesn't
  disable auto connect until the next reboot.
- When the service starts, connect to a paired device that is already connected over Bluetooth, since it
  won't send another ACTION_ACL_CONNECTED (resolves the TODO in AutoConnectService).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ExfGKqc1qgteZLvhaNzew
…ct alive

- When the app is opened while exactly one paired device is connected over Bluetooth, connect to it
  instead of showing the device list.
- Closing the app no longer stops the device service when auto connect is enabled, so the status
  notification keeps working in the background.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ExfGKqc1qgteZLvhaNzew
… for A39xx models

Models missing from the icon list fall back on their model number, so e.g. the Liberty 5 (A3957) shows an
earbuds icon rather than headphones.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ExfGKqc1qgteZLvhaNzew
The settings changed most often were two levels deep: the sound modes category, then a dialog per select
and a slider for the noise canceling level. The first screen after connecting now shows:

- battery levels of each earbud and the case
- a sound mode card with the ambient sound mode as large icon buttons and the mode specific settings below
- the remaining categories under "More Settings" (sound modes is no longer listed separately)

Selects with a few short options use segmented buttons or chips instead of a dialog, and small integer
ranges (e.g. noise canceling level 1-5) use buttons instead of a slider. Settings that aren't currently in
effect are dimmed but still usable: picking e.g. "Car" while in transparency mode also sends the parent
values (noise canceling, transportation), so the choice takes effect immediately instead of only changing a
stored value. The legacy equalizer profile migration entry is only listed when there are profiles to
migrate.

Instrumented tests are updated for the new layout and wait for settings that load asynchronously.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ExfGKqc1qgteZLvhaNzew
Shows the current mode and its detail (noise canceling level, transportation mode, transparency mode).
Tapping it cycles through the ambient sound modes, following the device's own cycle settings when
available; long pressing it opens the app.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ExfGKqc1qgteZLvhaNzew
@kennyfs
kennyfs force-pushed the liberty5-home-screen-zh-tw branch from e0936b1 to 6eee4d5 Compare November 10, 2026 11:59
@kennyfs kennyfs changed the title feat(android): sound mode home screen, quick settings tile, auto connect fixes, zh-TW translations feat(android): sound mode home screen, quick settings tile, auto connect fixes Nov 10, 2026
@kennyfs
kennyfs marked this pull request as draft November 11, 2026 05:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant