diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fbfff6a5..50ea8aff 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -71,7 +71,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.21" + go-version: "1.25" cache-dependency-path: go_backend/go.sum # Cache Gradle for faster builds @@ -174,7 +174,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: "1.21" + go-version: "1.25" cache-dependency-path: go_backend/go.sum # Cache CocoaPods diff --git a/CHANGELOG.md b/CHANGELOG.md index dfc269a5..4c4cd07a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [3.3.0] - 2026-01-31 +## [3.3.1] - 2026-01-31 ### Added diff --git a/android/.kotlin/sessions/kotlin-compiler-14855151662461671779.salive b/android/.kotlin/sessions/kotlin-compiler-14855151662461671779.salive new file mode 100644 index 00000000..e69de29b diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 63cfee8c..33baf889 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -5,6 +5,7 @@ -keep class io.flutter.view.** { *; } -keep class io.flutter.** { *; } -keep class io.flutter.plugins.** { *; } +-keep class io.flutter.embedding.** { *; } # Ignore missing Play Core classes (not used, but referenced by Flutter) -dontwarn com.google.android.play.core.splitcompat.** @@ -14,9 +15,15 @@ # Ignore missing javax.xml.stream (not used on Android) -dontwarn javax.xml.stream.** -# Go backend (gobackend.aar) +# Go backend (gobackend.aar) - CRITICAL for release builds -keep class gobackend.** { *; } -keep class go.** { *; } +-keep interface gobackend.** { *; } +-keepclassmembers class gobackend.** { *; } + +# Go mobile binding internals +-keep class org.golang.** { *; } +-dontwarn org.golang.** # FFmpeg Kit -keep class com.arthenica.ffmpegkit.** { *; } @@ -30,15 +37,77 @@ native ; } -# Kotlin coroutines +# Kotlin coroutines - expanded rules -keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} -keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} -keepclassmembers class kotlinx.coroutines.** { volatile ; } +-keepclassmembernames class kotlinx.** { + volatile ; +} +-dontwarn kotlinx.coroutines.** + +# Kotlin serialization +-keepattributes RuntimeVisibleAnnotations,AnnotationDefault +-dontwarn kotlin.** +-keep class kotlin.** { *; } +-keep class kotlin.Metadata { *; } + +# Keep MainActivity and related classes +-keep class com.zarz.spotiflac.** { *; } # Prevent R8 from removing metadata -keepattributes *Annotation* -keepattributes SourceFile,LineNumberTable -keepattributes Signature -keepattributes Exceptions +-keepattributes InnerClasses +-keepattributes EnclosingMethod + +# JSON parsing (used by Go backend responses) +-keep class org.json.** { *; } + +# Shared Preferences +-keep class androidx.datastore.** { *; } +-dontwarn androidx.datastore.** + +# Flutter Plugins - CRITICAL: Prevent R8 from removing plugin implementations +# Path Provider +-keep class io.flutter.plugins.pathprovider.** { *; } +-keep class dev.flutter.pigeon.** { *; } + +# Local Notifications +-keep class com.dexterous.** { *; } +-keep class com.dexterous.flutterlocalnotifications.** { *; } + +# Receive Sharing Intent +-keep class com.kasem.receive_sharing_intent.** { *; } + +# Permission Handler +-keep class com.baseflow.permissionhandler.** { *; } + +# File Picker +-keep class com.mr.flutter.plugin.filepicker.** { *; } + +# URL Launcher +-keep class io.flutter.plugins.urllauncher.** { *; } + +# Share Plus +-keep class dev.fluttercommunity.plus.share.** { *; } + +# Device Info Plus +-keep class dev.fluttercommunity.plus.device_info.** { *; } + +# Open File +-keep class com.crazecoder.openfile.** { *; } + +# Sqflite +-keep class com.tekartik.sqflite.** { *; } + +# Dynamic Color +-keep class io.material.** { *; } + +# Keep all Flutter plugin registrants +-keep class io.flutter.plugins.GeneratedPluginRegistrant { *; } +-keep class ** extends io.flutter.embedding.engine.plugins.FlutterPlugin { *; } diff --git a/go_backend/go.mod b/go_backend/go.mod index 1c1172fc..c52793f7 100644 --- a/go_backend/go.mod +++ b/go_backend/go.mod @@ -1,8 +1,8 @@ module github.com/zarz/spotiflac_android/go_backend -go 1.24.0 +go 1.25.0 -toolchain go1.24.5 +toolchain go1.25.6 require ( github.com/dop251/goja v0.0.0-20260106131823-651366fbe6e3 diff --git a/lib/constants/app_info.dart b/lib/constants/app_info.dart index 31128478..d82f0856 100644 --- a/lib/constants/app_info.dart +++ b/lib/constants/app_info.dart @@ -1,8 +1,8 @@ /// App version and info constants /// Update version here only - all other files will reference this class AppInfo { -static const String version = '3.3.0'; - static const String buildNumber = '67'; +static const String version = '3.3.1'; + static const String buildNumber = '68'; static const String fullVersion = '$version+$buildNumber'; diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index c797b701..336d24fc 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -2133,70 +2133,70 @@ class AppLocalizationsId extends AppLocalizations { } @override - String get discographyDownload => 'Unduh Diskografi'; + String get discographyDownload => 'Download Discography'; @override String get discographyDownloadAll => 'Unduh Semua'; @override String discographyDownloadAllSubtitle(int count, int albumCount) { - return '$count lagu dari $albumCount rilis'; + return '$count tracks from $albumCount releases'; } @override - String get discographyAlbumsOnly => 'Album Saja'; + String get discographyAlbumsOnly => 'Albums Only'; @override String discographyAlbumsOnlySubtitle(int count, int albumCount) { - return '$count lagu dari $albumCount album'; + return '$count tracks from $albumCount albums'; } @override - String get discographySinglesOnly => 'Single & EP Saja'; + String get discographySinglesOnly => 'Singles & EPs Only'; @override String discographySinglesOnlySubtitle(int count, int albumCount) { - return '$count lagu dari $albumCount single'; + return '$count tracks from $albumCount singles'; } @override - String get discographySelectAlbums => 'Pilih Album...'; + String get discographySelectAlbums => 'Select Albums...'; @override String get discographySelectAlbumsSubtitle => - 'Pilih album atau single tertentu'; + 'Choose specific albums or singles'; @override - String get discographyFetchingTracks => 'Mengambil lagu...'; + String get discographyFetchingTracks => 'Fetching tracks...'; @override String discographyFetchingAlbum(int current, int total) { - return 'Mengambil $current dari $total...'; + return 'Fetching $current of $total...'; } @override String discographySelectedCount(int count) { - return '$count dipilih'; + return '$count selected'; } @override - String get discographyDownloadSelected => 'Unduh yang Dipilih'; + String get discographyDownloadSelected => 'Download Selected'; @override String discographyAddedToQueue(int count) { - return 'Menambahkan $count lagu ke antrian'; + return 'Added $count tracks to queue'; } @override String discographySkippedDownloaded(int added, int skipped) { - return '$added ditambahkan, $skipped sudah diunduh'; + return '$added added, $skipped already downloaded'; } @override - String get discographyNoAlbums => 'Tidak ada album tersedia'; + String get discographyNoAlbums => 'No albums available'; @override - String get discographyFailedToFetch => 'Gagal mengambil beberapa album'; + String get discographyFailedToFetch => 'Failed to fetch some albums'; @override String get sectionStorageAccess => 'Storage Access'; diff --git a/pubspec.yaml b/pubspec.yaml index 10f22e21..c5b17031 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: spotiflac_android description: Download Spotify tracks in FLAC from Tidal, Qobuz & Amazon Music publish_to: "none" -version: 3.3.0+67 +version: 3.3.1+68 environment: sdk: ^3.10.0