Changelog
Features
- feat(spotify): paginate LikedSongs ViewModel via likedSongsPage — by @MuwMx
- feat(ui): add horizontal mini-player dismiss gesture with slider haptics — by @MuwMx
- feat(ui): exact 1:1 port of PixelPlayer mini-player horizontal dismiss gesture — by @MuwMx
- feat(haptics): introduce YumaHaptics single source of truth and provider — by @MuwMx
- feat(ui): add queue header automix button, haptics and dedicated queue action menu — by @MuwMx
- feat(ui): add consistent haptics to FullPlayer and Lyrics collapse/menu buttons — by @MuwMx
- feat(playback): play instant algorithmic radio (automix) on search song click — by @MuwMx
- feat(spotify): add persistent profile cache, Stale-While-Revalidate and direct recentlyPlayed endpoint — by @MuwMx
- feat(ui): implement YdsInsets with insets consumption, layout phase modifiers, and landscape cutouts — by @MuwMx
- feat(ui): tune player background blur to reveal soft artwork silhouette — by @MuwMx
- feat(lyrics): toggle for lyrics player controls panel — by @MuwMx
- feat(lyrics): implement position freezing during manual scrolling — by @MuwMx
- feat(spotify): adapt quick grid cells to YDS 2.1 dynamic palette — by @MuwMx
- feat(spotify): add background like sync with Spotify library — by @MuwMx
- feat(spotify): guard like sync with user preference toggle in account settings — by @MuwMx
- feat(player): mode-dependent overflow label close — by @MuwMx
Fixes
- fix(player): restore startRadioSeamlessly for radio to fix freeze (revert PlayerMenu) — by @MuwMx
- fix(radio): restore NextPage endpoint and MediaMetadata isMusicVideo from ArchiveTune — by @MuwMx
- fix(about): improve avatar quality from 128 to 512 to fix pixelation — by @MuwMx
- fix(about): remove software bitmap and fixed size to fix avatar aliasing — by @MuwMx
- fix(about): handle hardware bitmap getPixels crash — by @MuwMx
- fix(about): split hardware render and 32x32 software palette extraction to fix aliasing — by @MuwMx
- fix(fgs): guard MediaNotificationManager startForeground on Android 16 (ForegroundServiceStartNotAllowedException) — by @MuwMx
- fix: FGS IllegalStateException guard + TogetherOnlineHost safe unwrap (approveParticipant) — by @MuwMx
- fix: data saver toggle + queue V2 count/ListQueue + crossfade 10s guard — by @MuwMx
- fix(flac): smart cache key effectiveSource + volatile StateFlow + dynamic Qbdlx pool (no restart) — by @MuwMx
- fix(settings): add missing refreshDiscordNow import in DiscordSettings — by @MuwMx
- fix(spotify): add tokenMutex on refreshAccessToken body + likedSongsPage pagination — by @MuwMx
- fix(spotify): make Liked queue static full cache, hasNextPage false — by @MuwMx
- fix(ui): force dark buttons in queue/lyrics cards via darkColorScheme — by @MuwMx
- fix(ui): queue/lyrics dark content via LocalContentColor — by @MuwMx
- fix(ui): wrap yumaGlassCard inside dark provider — by @MuwMx
- fix(ui): 3dots sheets always dark theme — by @MuwMx
- fix(ui): replace GoogleSans hardcodes with LocalArchiveTuneFontFamily — by @MuwMx
- fix(ui): fix dismiss gesture cancel, float precision, teleport glitch and add continuous drag haptics — by @MuwMx
- fix(ui): refine mini-player dismiss haptics with M3 frequent ticks and delayed snap-reset — by @MuwMx
- fix(ui): remove dead bottom padding when miniplayer dismissed and remove collapse haptics — by @MuwMx
- fix(ui): resolve gesture conflicts, touch swallowing and unclickable controls across sheets — by @MuwMx
- fix(spotify): restore GraphQL recent items parsing with playlists, full album artists, and fix SWR UI flashing — by @MuwMx
- fix(ui): fix status bar insets in FullPlayer, floating bar immersive padding, and clean YdsInsets modifiers — by @MuwMx
- fix(library): force album list items to single segment position — by @MuwMx
- fix(queue): balance theme provider braces around LazyColumn — by @MuwMx
- fix(spotify): eliminate sync duplicates, double calls and optimize batch operations — by @MuwMx
- fix(player): isolate sheet background to matchParentSize, restore instant queue animation and fade — by @MuwMx
- fix(spotify): persist track matches on play and enable fallback search for like sync — by @MuwMx
- fix(sync): clean mutual exclusive routing between Spotify and YouTube like sync — by @MuwMx
- fix(ui): preserve full 544px thumbnail resolution for grids while keeping lightweight 200px for lists — by @MuwMx
- fix(queue): provider-inside-snapshotFlow restores first frame — by @MuwMx
- fix(sheets): unify normal top with immersive background — by @MuwMx
- fix(headers): keep lyrics queue close always visible — by @MuwMx
- fix(home): mount mood panel only with chips — by @MuwMx
- fix(ui): gate MarqueeText on local isVisible parameter — by @MuwMx
- fix(player): pin controls and title to always-white — by @MuwMx
Performance
- perf(ui): optimize isMiniPlayerVisible selector in MainActivity and clean queue close haptic — by @MuwMx
- perf(queue): eliminate per-item DataStore flow subscriptions and Subcomposition in thumbnails — by @MuwMx
- perf(queue): hoist itemWidthPx to screen level and optimize Coil thumbnail decode size — by @MuwMx
- perf(player-bg): careful single-pass background — by @MuwMx
- perf(seekbar): draw-phase progress via graphicsLayer — by @MuwMx
- perf(player-bg): unify player background to single blur source and shared gradient — by @MuwMx
- perf(home-bg): central visibility gate pauses animated styles — by @MuwMx
- perf(home-bg): propagate isVisible gate to all animated effects — by @MuwMx
- perf(lyrics-queue): suspend hidden loops via snapshotFlow — by @MuwMx
Refactors
- refactor(playback): clean up formatting in MusicService — by @MuwMx
- refactor(playback): extract MusicService integrations to extension — by @MuwMx
- refactor(playback): extract MusicService playback to extension — by @MuwMx
- refactor(playback): extract MusicService audio to extension — by @MuwMx
- refactor(playback): extract MusicService crossfade to extension — by @MuwMx
- refactor(playback): extract MusicService together to extension — by @MuwMx
- refactor(spotify): make LikedQueue stub-only with external total/hasMore — by @MuwMx
- refactor(haptics): remove FLAG_IGNORE_GLOBAL_SETTING and fix incorrect LongPress usages — by @MuwMx
- refactor(haptics): migrate all screens to LocalYumaHaptics and clean prop-drilling — by @MuwMx
- refactor(cleanup): remove 15 dead legacy files (~4.5k LOC) — by @MuwMx
- refactor(spotify): use typed __typename contract for recent section instead of string matching — by @MuwMx
- refactor(flac): make Qobuz sole lossless provider and remove Arcod/dead token fields — by @MuwMx
- refactor(library): update layout spacing and window insets for list containers — by @MuwMx
- refactor(player): remove unnecessary keys from nested scroll connection remember blocks — by @MuwMx
- refactor(ui): split monolithic Items.kt into focused SRP components — by @MuwMx
- refactor(ui): migrate news screen and top action buttons to unified YDS — by @MuwMx
Documentation
- docs(readme): update telegram community link to yumaplayer — by @MuwMx
- docs(readme): remove arcod references from documentation — by @MuwMx
- docs(yuma_rules): add separator to development guidelines — by @MuwMx
- docs(rules): remove trailing whitespace and empty lines from YUMA_RULES.md — by @MuwMx
- docs(spotify): document ADR-011 Spotify sync architecture and isolation — by @MuwMx
Other changes
- chore(templates,docs): rename ArchiveTune to YumaPlayer in templates and privacy policy — by @MuwMx
- refactor(ui,settings): simplify image processing and request logic in AboutScreen — by @MuwMx
- refactor(queue,settings): remove unused queue header component — by @MuwMx
- refactor(playback,network): implement metered connection check for flac streaming bypass — by @MuwMx
- feat(settings,spotify): add debug sp_dc input field to login sheet — by @MuwMx
- refactor(ui,player,home): optimize flow operators and remove unused quick picks header — by @MuwMx
- feat(player,haptics): implement custom continuous vibration feedback for dismiss gesture — by @MuwMx
- refactor(ui,haptics): replace native haptic feedback with custom yuma haptics implementation — by @MuwMx
- fix(player,ui): add fraction threshold check to drag state and simplify lyrics layer rendering — by @MuwMx
- refactor(player,ui): optimize overlay visibility state using derivedStateOf — by @MuwMx
- chore(lossless): remove dead fallback LosslessTokens (experimental hardcode, now user input only) — by @MuwMx
- feat(ui,library): add LibraryEmptyState component — by @MuwMx
- style(library,component): update library filter chip dimensions and grid padding — by @MuwMx
- refactor(ui,library): migrate LocalSongScanSheet to Surface components for consistent styling — by @MuwMx
- refactor(ui,library): update local song screen hero icon layout and styling — by @MuwMx
- feat(settings,spotify): expose manual sp_dc input field outside of debug builds — by @MuwMx
- refactor(ui,lyrics): move lyrics parsing to produceState and background thread — by @MuwMx
- refactor(ui,lyrics): consolidate lyrics parsing logic and handle empty states — by @MuwMx
- refactor(lyrics,queue): simplify state initialization and optimize reorderable graphics layer — by @MuwMx
- refactor(ui,lyrics): optimize romanization effect execution by preventing redundant re-parses — by @MuwMx
- fix(ui,lyrics): reset frozen position when manual scrolling ends — by @MuwMx
- fix(lyrics,ui): improve manual scrolling state logic and reset frozen position on seek — by @MuwMx
- refactor(ui,lyrics): consolidate manual scrolling logic in LyricsEnhanced — by @MuwMx
- SRP x4: black Spotify recents, stop-on-swipe toggle, sheet Back priority, sheet clipToBounds — by @MuwMx
- feat(player,ui): handle back navigation based on overlay and lyrics visibility — by @MuwMx
- refactor(mainactivity,playersheet): remove unused overlay state and improve back navigation logic — by @MuwMx
- feat(player,queue): implement symmetric UDF for queue and two-container border clipping — by @MuwMx
- feat(player,queue): add local BackHandler to QueueScreen — by @MuwMx
- perf(player,queue): eliminate composition key reset and GPU throttling on queue gesture — by @MuwMx
- perf(player,queue): align QueueScreen lifecycle and rendering 1-to-1 with LyricsColumn — by @MuwMx
- refactor(sync,youtube): optimize song liking with deduplication and concurrent batching — by @MuwMx
- style(syncutils): fix indentation for likeSongs function — by @MuwMx
- refactor(player,ui): simplify PlayerSeekBar progress update logic — by @MuwMx
- refactor(player,ui): optimize seekbar state management and reset logic — by @MuwMx
- refactor(player,ui): swap blur and clear image painter logic and update blur request size — by @MuwMx
- chore(bg): temporary pause verification logs — by @MuwMx
- chore(home,effects): add debug logging for screen background state — by @MuwMx
- chore(player): temporary sleep verification logs — by @MuwMx
- chore(logs): remove temporary pause verification logs — by @MuwMx
- refactor(player,ui): optimize background gradient color blending and structure — by @MuwMx
- feat(build,ui): update foundation layout dependency and adjust player background visuals — by @MuwMx
- refactor(player,viewmodel): improve cover image resolution and blank string handling — by @MuwMx
- style(player): adjust background layer gradient intensity and transition points — by @MuwMx
- chore(app,version): bump version to 1.1.0-Beta — by @MuwMx