Phase 2: Spotify/SoundCloud-style theme, nav shell, and component library

Redirects Deepwave from a vanilla Subsonic client toward the Spotify/
SoundCloud-style product the user wants, per the Phase 2+ roadmap.

- Dark-first Material3 theme with a fixed aqua accent (no Material You
  dynamic color), full type scale, rounded-corner shape system
- Typed (@Serializable) navigation routes; new bottom-tab shell
  (Home/Search/Library) with a settings entry point and mini-player
  placeholder bar, replacing the single placeholder Home screen
- Logout moved out of Home into a dedicated Settings screen
- Reusable component library (TrackRow, AlbumCard, ArtistCard,
  ArtworkPlaceholder, BottomNavBar, MiniPlayerBar) for Phase 3 to wire
  real data into
- Strings externalized to strings.xml
- Security fix: exclude the Tink keyset and encrypted credentials
  DataStore from Android auto-backup (backup_rules.xml /
  data_extraction_rules.xml), previously unexcluded despite
  allowBackup=true
- Fix: Home screen's content column was missing verticalScroll,
  making it unscrollable once content exceeds the viewport; also
  added breathing room between each row's header and its cards
- Split Login/Settings into stateless content composables + thin
  ViewModel-wired wrappers, and added @Preview coverage (including
  interactive previews for MainScreen and BottomNavBar) across every
  screen and component so the UI can be reviewed in Android Studio's
  preview pane without running on a device

Added material-icons-extended as a pragmatic deviation from the
Phase 2 plan (no new deps) since later phases all need icons outside
Compose's small default set (play/pause/skip/download/playlist).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
christopher
2026-09-17 03:37:58 -04:00
co-authored by Claude Sonnet 5
parent 1971d02e2b
commit a07868b688
35 changed files with 1025 additions and 122 deletions
+28 -1
View File
@@ -1,3 +1,30 @@
<resources>
<string name="app_name">Deepwave</string>
</resources>
<string name="login_title">Deepwave</string>
<string name="login_subtitle">Connect to your Navidrome server</string>
<string name="login_server_url_label">Server URL</string>
<string name="login_server_url_placeholder">https://navidrome.example.com</string>
<string name="login_username_label">Username</string>
<string name="login_password_label">Password</string>
<string name="login_button">Log in</string>
<string name="nav_home">Home</string>
<string name="nav_search">Search</string>
<string name="nav_library">Library</string>
<string name="action_settings">Settings</string>
<string name="action_back">Back</string>
<string name="settings_title">Settings</string>
<string name="settings_log_out">Log out</string>
<string name="search_placeholder">Search coming soon</string>
<string name="library_placeholder">Your library coming soon</string>
<string name="player_nothing_playing">Nothing playing</string>
<string name="player_play">Play</string>
<string name="home_row_recently_added">Recently Added</string>
<string name="home_row_recently_played">Recently Played</string>
<string name="home_row_made_for_you">Made For You</string>
</resources>
+2 -4
View File
@@ -6,8 +6,6 @@
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
<exclude domain="sharedpref" path="deepwave_master_keyset_prefs.xml"/>
<exclude domain="file" path="datastore/deepwave_credentials.preferences_pb"/>
</full-backup-content>
@@ -5,15 +5,11 @@
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
<exclude domain="sharedpref" path="deepwave_master_keyset_prefs.xml"/>
<exclude domain="file" path="datastore/deepwave_credentials.preferences_pb"/>
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
<exclude domain="sharedpref" path="deepwave_master_keyset_prefs.xml"/>
<exclude domain="file" path="datastore/deepwave_credentials.preferences_pb"/>
</device-transfer>
-->
</data-extraction-rules>