|
| 1 | +# Changelog |
| 2 | + |
| 3 | +This file records notable project changes. It follows the |
| 4 | +[Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format and uses |
| 5 | +[Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 6 | + |
| 7 | +## [1.8.0] - 2026-06-17 |
| 8 | + |
| 9 | +### Added |
| 10 | + |
| 11 | +- Added encrypted SharedPreferences storage for authentication tokens, including |
| 12 | + migration of existing access-token, refresh-token, and refresh-token-expiry |
| 13 | + values out of the regular settings file. |
| 14 | +- Added refresh-token expiry persistence so refreshed authentication state can |
| 15 | + be saved alongside rotated access and refresh tokens. |
| 16 | +- Added an OkHttp `Authenticator`-based token refresh flow that retries 401 |
| 17 | + responses with a refreshed access token and distinguishes invalid credentials |
| 18 | + from transient network or server failures. |
| 19 | +- Added a separate unauthenticated Retrofit/OkHttp client for refresh-token |
| 20 | + requests to avoid recursive authorization handling. |
| 21 | +- Added service-side playlist and search queue APIs so bound UI ViewModels can |
| 22 | + hand queues directly to `MusicService` without large Parcelable intent |
| 23 | + payloads. |
| 24 | +- Added playlist page-size tracking, in-flight next-page fetch reuse, and |
| 25 | + proactive page prefetching when playback nears the end of the current queue. |
| 26 | +- Added MediaBrowser caller validation for the exported Android Auto media |
| 27 | + service before exposing browse content. |
| 28 | +- Added debug-symbol keep rules for native libraries used by AndroidX graphics, |
| 29 | + benchmark, DataStore, and tracing dependencies. |
| 30 | +- Added focused authentication persistence tests for omitted refresh-token |
| 31 | + responses, refresh-token expiry retention, transient refresh failures, invalid |
| 32 | + refresh failures, and Android Auto service-side authentication restoration. |
| 33 | +- Added OpenAPI v1 contract tests covering authentication, refresh-token |
| 34 | + requests, playlist and favorite route placeholders, scrobble payloads and |
| 35 | + error responses, nullable refresh-token fields, and artist genre arrays. |
| 36 | +- Added repository instructions for coding agents requiring changelog updates |
| 37 | + for notable code, behavior, dependency, security, and documentation changes. |
| 38 | +- Added project-specific coding-agent guidance for nested Gradle usage, |
| 39 | + validation, authentication, API contracts, Android Auto, playback, and |
| 40 | + documentation expectations. |
| 41 | + |
| 42 | +### Changed |
| 43 | + |
| 44 | +- Updated the Android project version from `1.7.3` to `1.8.0`. |
| 45 | +- Raised the Android platform requirements from min SDK 21 / target SDK 35 to |
| 46 | + min SDK 23 / target SDK 36. |
| 47 | +- Updated the build toolchain to Gradle 9.5.1, Android Gradle Plugin 9.2.1, and |
| 48 | + JDK 21 in CI. |
| 49 | +- Updated Kotlin plugin usage for Kotlin 2.3.21 and Compose compiler plugin |
| 50 | + integration. |
| 51 | +- Updated major Android and Kotlin dependencies, including Compose BOM |
| 52 | + 2026.05.01, Media3 1.10.1, Retrofit 3.0.0, OkHttp 5.3.2, Coroutines 1.11.0, |
| 53 | + Lifecycle 2.10.0, AndroidX media 1.8.0, Firebase BOM 34.13.0, and current |
| 54 | + test libraries. |
| 55 | +- Reduced HTTP logging in app and image-loading clients, redacted authorization |
| 56 | + headers, and disabled verbose request logging for non-debuggable builds. |
| 57 | +- Changed authentication failure handling so only non-recoverable refresh |
| 58 | + failures clear stored credentials, while transient refresh failures leave |
| 59 | + credentials available for later retries. |
| 60 | +- Changed single-song, playlist, search-result, and album playback setup to use |
| 61 | + service methods when the playback service is already bound. |
| 62 | +- Changed playlist playback intents to send playlist references and start |
| 63 | + metadata instead of serializing full song lists through intent extras. |
| 64 | +- Aligned the Retrofit v1 API contract with the current OpenAPI spec, including |
| 65 | + refresh-token authentication, playlist pagination query names, album-song |
| 66 | + browsing, scrobble requests, and v1 error payload parsing. |
| 67 | +- Updated README, documentation, review notes, and prompt artifacts for the |
| 68 | + SDK 36, JDK 21, Gradle 9.5.1, and dependency-version changes. |
| 69 | +- Updated the benchmark module to compile and target SDK 36 with the same JDK |
| 70 | + 21 toolchain configuration as the app module. |
| 71 | +- Updated `HomeViewModel` and `PlaylistViewModel` to collect playback state, |
| 72 | + current song, playback context, duration, and position from service-backed |
| 73 | + flows instead of running UI-owned polling loops. |
| 74 | +- Updated `MusicService` and `MusicPlaybackManager` to expose and maintain |
| 75 | + flow-backed playback progress for bound UI consumers. |
| 76 | +- Updated the README to document current setup, API v1 authentication behavior, |
| 77 | + Android Auto behavior, testing commands, and repository layout. |
| 78 | +- Cleaned Android Studio commit-inspection warnings in playback, playlist, |
| 79 | + home, service, and model serialization code by removing dead helpers, |
| 80 | + simplifying redundant conditions, and keeping only intentional Android |
| 81 | + lifecycle suppressions. |
| 82 | +- Updated Android CI to explicitly install Android SDK 36 and run app-qualified |
| 83 | + unit-test and JaCoCo tasks from the nested Gradle project. |
| 84 | + |
| 85 | +### Fixed |
| 86 | + |
| 87 | +- Fixed token value leakage in logs by logging token presence instead of token |
| 88 | + prefixes. |
| 89 | +- Fixed refresh-token rotation persistence by saving new refresh tokens and |
| 90 | + refresh-token expiry values from network refresh callbacks. |
| 91 | +- Fixed Android Auto playlist continuation to avoid starting duplicate next-page |
| 92 | + fetches when playback reaches a queue boundary during an active prefetch. |
| 93 | +- Fixed queue navigation state updates by separating next/previous queue |
| 94 | + movement from immediate playback commands in the consolidated playback |
| 95 | + manager. |
| 96 | +- Fixed logout flow to route through `AuthenticationManager` when available so |
| 97 | + stored settings, network authentication state, and UI authentication state stay |
| 98 | + synchronized. |
| 99 | +- Fixed nullable refresh-token response handling so login and token refresh |
| 100 | + persistence tolerate v1 responses that omit rotated refresh-token values. |
| 101 | +- Fixed the JaCoCo report task so CI coverage uses debug unit-test execution |
| 102 | + data and non-instrumented app classes instead of requiring connected Android |
| 103 | + coverage. |
| 104 | + |
| 105 | +### Security |
| 106 | + |
| 107 | +- Moved sensitive authentication tokens from regular SharedPreferences to |
| 108 | + encrypted SharedPreferences when the platform keystore-backed implementation |
| 109 | + is available. |
| 110 | +- Reduced sensitive network logging by redacting authorization headers and |
| 111 | + disabling OkHttp body logging. |
| 112 | +- Kept the media browser service exported for Android Auto discovery while |
| 113 | + adding caller checks before returning a browser root. |
| 114 | +- Tightened Android Auto media browser caller classification by replacing |
| 115 | + package-name substring trust with exact trusted package matching. |
0 commit comments