Commit graph

9 commits

Author SHA1 Message Date
avi
80b0300141 feat(discover): browse sub-genres Wavlake doesn't index via radio-tag station search
Wavlake rankings 400 on sub-genres (Trance, Classic Rock, Metal...). Discover
chips now include 15 sub-genres; tapping one routes through refreshRankings ->
browseRadioGenre, filling a new browseStations StateFlow from radio-browser
tag search (most-listened first) rendered by RadioGenreList. Wavlake-indexed
genres keep the rankings path.

Genre matching is now space-insensitive (user types 'oldschool' for 'Old
School Hip Hop'). radio-browser tag match is case-SENSITIVE against lowercase
stored tags — byTag() lowercases or every sub-genre browse returns zero hits.
2026-10-01 18:11:59 -05:00
avi
4c63421400 chore(release): v0.1.2 (versionCode 3) — crash-fix build sideloaded to phone 2026-10-01 10:33:23 -05:00
avi
838809ec0c chore(release): v0.1.1 (versionCode 2) — first Forgejo release; enables in-app self-update path 2026-09-30 12:28:02 -05:00
avi
b18f2df1f4 feat(update): in-app self-update — check Forgejo latest release, download APK with progress, launch installer via FileProvider; REQUEST_INSTALL_PACKAGES + unknown-sources redirect; version-compare unit tests 2026-09-30 12:10:22 -05:00
avi
36f61ddb40 Checkpoint all work; ignore build artifacts and gradle caches 2026-09-23 18:58:21 -05:00
avi
b000544d15 perf(app): fluid navigation + genre search
Directory search now merges name and tag(genre) hits so genre queries
find tagged stations. Tabs jump instantly (adjacent glide, swipe kept);
startup pre-builds disk-backed singletons off main thread; equalizer
animation runs only on the playing indicator; row placement animations;
missing list key. Debug-only StrictMode guard for main-thread I/O.
Release signed with debug key for direct installs.
2026-09-10 06:48:55 -05:00
avi
5ff5318db4 feat(nostr): decentralized layer Phase A — identity, relays, zaps, NWC wallet
Additive Wavlake-inspired layer; zero existing features touched.

Crypto/protocol (pure-Kotlin core, fr.acinq secp256k1-kmp 0.17.3):
- Bech32 + NIP-19 (npub/nsec/nprofile/nevent/naddr)
- NIP-01 events: canonical serialization, BIP-340 schnorr sign/verify
- NIP-04 ECDH AES-CBC (raw x-coord via pubKeyTweakMul)
- Wavlake music NIP kinds 30440-30443 (Track/Album/Artist/Playlist)
- 4 conformance unit tests vs official spec vectors (all pass)

NostrService: multi-relay OkHttp websocket client, publish/subscribe/
query/getProfile/publishProfile/publishReaction/publishTrack/publishRaw,
best-effort failure posture (relays down = silent, app unaffected).

Identity: NostrKeys — AndroidKeyStore-encrypted private key at rest,
npub-only display. Verified on-device: create → npub chip → survives
force-stop + relaunch.

Payments (PaymentService abstraction, NWC provider):
- NIP-47 Nostr Wallet Connect over the pairing relay, pairing string
  keystore-encrypted, 15s timeout, never hangs playback
- LUD-06/LUD-16 lightning-address invoice resolution
- NIP-57 zaps: ephemeral-key zap request → callback nostr= → pay
- payment history records (no secrets)

UI (design-system tokens, progressive disclosure):
- ⚡ bolt on mini-player → TipSheet (21/100/500/1000/custom, recent
  addresses)
- Appearance → ⚡ Decentralized sheet: identity create/import, NWC
  connect, advanced relays/profile
2026-09-08 11:49:09 -05:00
dev
c0aea3eabc fix: folder import — treat picked tree URIs via fromTreeUri (was misread as file -> Invalid URI) 2026-09-07 11:21:27 -05:00
dev
72e55ba319 baseline before import-songs feature 2026-09-07 11:04:09 -05:00