Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
c6ab630
fix(audio): restore bit-perfect USB exclusive playback and prevent cr…
ajisth69 Oct 18, 2026
4b789f6
fix(audio): eliminate hardware volume channel imbalance and stuck cha…
ajisth69 Oct 18, 2026
f879138
fix(audio): prioritize playback feature unit over microphone to preve…
ajisth69 Oct 18, 2026
4de22e5
fix(audio): maintain hardware volume on UAC1 DACs and clear persisten…
ajisth69 Oct 18, 2026
f9ab7d0
fix(audio): eliminate startup NullPointerException from ExclusiveUsbO…
ajisth69 Oct 18, 2026
8b3ee5a
fix(playback): fix crossfade audio focus pause loop and redesign outp…
ajisth69 Oct 18, 2026
efa8022
feat(auth): add YouTube Music cookie login with Netscape, JSON, and r…
ajisth69 Oct 18, 2026
407614d
Merge branch 'main' into fix/usb-bitperfect-dac-crashes
ajisth69 Oct 18, 2026
1f15c1a
fix(ui): restore missing closing brace in SettingsScreen YouTube group
ajisth69 Oct 18, 2026
9664e19
fix(player): align header back and options buttons up using LiquidGla…
ajisth69 Oct 18, 2026
7f95ed2
fix(ytmusic): parse cookie JSON with pure Kotlin regex to prevent JVM…
ajisth69 Oct 18, 2026
9ffd89e
refactor(player): remove verification checklist and clarify USB hardw…
ajisth69 Oct 18, 2026
32e51ac
fix(feed,discover): filter listened tracks from discovery, enable rad…
ajisth69 Oct 18, 2026
69ecfcd
chore(release): bump version to 4.3.1 (versionCode 26)
ajisth69 Oct 18, 2026
19e632a
Merge remote-tracking branch 'origin/main' into fix/usb-bitperfect-da…
ajisth69 Oct 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ Built with **Material 3 Expressive**, LastWave combines effortless ad-free strea
## <img src="https://api.iconify.design/lucide:rocket.svg?color=%23C6F100" width="20" height="20" align="center" /> 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!

Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions builds/README.md
Original file line number Diff line number Diff line change
@@ -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
Loading