diff --git a/CHANGELOG.md b/CHANGELOG.md index f6ffd85a1..840dd9135 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [4.3.1] - 2026-10-18 + +### Added & Improved +- **YouTube Music Cookie Login:** Support for raw `Cookie` headers, Netscape `cookies.txt`, and browser extension JSON exports with clipboard paste helpers and real-time validation (matching Desktop). +- **Poweramp-Style Signal Path Redesign:** Reorganized the Output Detector dialog into Poweramp's 5-stage pipeline flow (Source $\to$ DSP $\to$ Volume Control $\to$ Output $\to$ Output Device) with status cards. +- **Smart Feed Queues & Continuation:** Tapping any track in feed shelves now starts context-aware radio (`startRadio = true`) for dynamic playback, while "Play All" and "Shuffle" continuously auto-extend queues. +- **Discovery Recommendation Quality:** Added strict deduplication against listening history and saved playlists, capped artists to 1 per batch, and removed raw history feed injection. +- **Faster Feed Loading:** Eliminated blocking artist page network fetches, added in-memory artist caching, and bounded discovery graph queries with timeouts for near-instant rendering. + +### Changed & Fixed +- **Crossfade Audio Focus:** Fixed pause loop in standby player handoff by preventing ExoPlayer focus manager collisions. +- **USB DAC Bit-Perfect Alignment:** Aligned bit-perfect detection with Poweramp definitions and protected against read-only direct buffer crashes. +- **Version Bump:** Bumped version to 4.3.1 (versionCode 26). + ## [4.3.0] - 2026-10-17 ### Added & Improved diff --git a/README.md b/README.md index a5382f059..362f9c742 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Built with **Material 3 Expressive**, LastWave combines effortless ad-free strea ## Getting Started 1. Download the latest APK from the **[Releases](https://github.com/Clash-Projects/LastWave-native/releases)** or **[Actions](https://github.com/Clash-Projects/LastWave-native/actions)** tab. -2. Install `LastWave-v4.3.0-release.apk` on your Android device (Android 7.0+). +2. Install `LastWave-v4.3.1-release.apk` on your Android device (Android 7.0+). 3. Connect your Last.fm account in **Settings → Integrations** to unlock the scrobbler, taste mixes, and personalized discovery radar. 4. Enjoy ad-free streaming and smart playlist generation! diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 34b678d54..ab4db3d56 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -60,8 +60,8 @@ android { applicationId = "com.lastwave.app" minSdk = (project.findProperty("minSdk") as? String)?.toIntOrNull() ?: 29 targetSdk = 35 - versionCode = 25 - versionName = "4.3.0" + versionCode = 26 + versionName = "4.3.1" val lastWaveLyricsToken = resolveSecret("LASTWAVE_LYRICS_TOKEN") val lastWaveLyricsUrl = resolveSecret("LASTWAVE_LYRICS_URL") diff --git a/app/src/main/java/com/lastwave/app/data/download/ModuleFlacTranscoder.kt b/app/src/main/java/com/lastwave/app/data/download/ModuleFlacTranscoder.kt index ed93170de..fee55cff3 100644 --- a/app/src/main/java/com/lastwave/app/data/download/ModuleFlacTranscoder.kt +++ b/app/src/main/java/com/lastwave/app/data/download/ModuleFlacTranscoder.kt @@ -108,7 +108,7 @@ class ModuleFlacTranscoder @Inject constructor( .apply { val headers = descriptor.headers.toMutableMap() if (headers.keys.none { it.equals("User-Agent", ignoreCase = true) }) { - headers["User-Agent"] = "LastWave/4.3.0" + headers["User-Agent"] = "LastWave/4.3.1" } setLicenseRequestHeaders(headers) } diff --git a/app/src/main/java/com/lastwave/app/data/plugin/SegmentedDashBridge.kt b/app/src/main/java/com/lastwave/app/data/plugin/SegmentedDashBridge.kt index fc53660e1..ae7fcb76f 100644 --- a/app/src/main/java/com/lastwave/app/data/plugin/SegmentedDashBridge.kt +++ b/app/src/main/java/com/lastwave/app/data/plugin/SegmentedDashBridge.kt @@ -86,7 +86,7 @@ class SegmentedDashBridge @Inject constructor( val headers = descriptor.headers.toMutableMap() // ExoPlayer still needs a UA on the license POST. if (headers.keys.none { it.equals("User-Agent", ignoreCase = true) }) { - headers["User-Agent"] = "LastWave/4.3.0" + headers["User-Agent"] = "LastWave/4.3.1" } setLicenseRequestHeaders(headers) } diff --git a/app/src/main/java/com/lastwave/app/data/update/AppUpdateManager.kt b/app/src/main/java/com/lastwave/app/data/update/AppUpdateManager.kt index b127d8479..76e38f2d8 100644 --- a/app/src/main/java/com/lastwave/app/data/update/AppUpdateManager.kt +++ b/app/src/main/java/com/lastwave/app/data/update/AppUpdateManager.kt @@ -87,9 +87,9 @@ class AppUpdateManager @Inject constructor( } fun getCurrentVersion(): String = try { - context.packageManager.getPackageInfo(context.packageName, 0).versionName ?: "4.3.0" + context.packageManager.getPackageInfo(context.packageName, 0).versionName ?: "4.3.1" } catch (_: Exception) { - "4.3.0" + "4.3.1" } fun checkForUpdate(isSilent: Boolean = false) { diff --git a/app/src/main/java/com/lastwave/app/ui/settings/SettingsScreen.kt b/app/src/main/java/com/lastwave/app/ui/settings/SettingsScreen.kt index d004c79f5..64edbedcd 100644 --- a/app/src/main/java/com/lastwave/app/ui/settings/SettingsScreen.kt +++ b/app/src/main/java/com/lastwave/app/ui/settings/SettingsScreen.kt @@ -2699,11 +2699,11 @@ fun SettingsScreen( } private fun appVersionName(context: android.content.Context): String = try { - context.packageManager.getPackageInfo(context.packageName, 0).versionName ?: "4.3.0" + context.packageManager.getPackageInfo(context.packageName, 0).versionName ?: "4.3.1" } catch (error: Exception) { - "4.3.0" + "4.3.1" } catch (error: LinkageError) { - "4.3.0" + "4.3.1" } /** Small tap-scale used across the row-style cards on this screen for a diff --git a/builds/README.md b/builds/README.md index 7d9d63123..24f1228c7 100644 --- a/builds/README.md +++ b/builds/README.md @@ -1,11 +1,11 @@ # Builds -- **Release Artifact:** `LastWave-v4.3.0-release.apk` (**22.7 MB**) +- **Release Artifact:** `LastWave-v4.3.1-release.apk` - Variant: `release` (`:app:assembleRelease`) - Optimizations: R8 code shrinking, dead-code elimination, resource shrinking (`isMinifyEnabled = true`, `isShrinkResources = true`) -- **Debug Artifact:** `LastWave-v4.3.0-debug.apk` (**120.4 MB**) +- **Debug Artifact:** `LastWave-v4.3.1-debug.apk` - Variant: `debug` (`:app:assembleDebug`) - Uncompressed full DEX with all debug symbols, no R8 shrinking -- **Version:** `4.3.0` (versionCode `25`) +- **Version:** `4.3.1` (versionCode `26`) - **Feature:** Full Screen Cover Art implementation (static & animated canvas full-bleed hero with dynamic bottom fade and scrim protection) - **Toolchain:** Gradle 9.3.1, OpenJDK 17, Android compileSdk 37, targetSdk 35, minSdk 29