diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 116bc22f..ee867c13 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -1 +1,8 @@ --keep class androidx.lifecycle.DefaultLifecycleObserver \ No newline at end of file +-keep class androidx.lifecycle.DefaultLifecycleObserver + +-keepnames class kotlinx.serialization.** { *; } +-keepnames class oss.krtirtho.spotube.glance.models.** { *; } +-keep @kotlinx.serialization.Serializable class * +-keepclassmembers class ** { + @kotlinx.serialization.* ; +} diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidget.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidget.kt index 2493fab2..fbd6ee8a 100644 --- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidget.kt +++ b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidget.kt @@ -82,10 +82,13 @@ class HomePlayerWidget : GlanceAppWidget() { val isPlaying = prefs.getBoolean("isPlaying", false) val playbackServerAddress = prefs.getString("playbackServerAddress", null) ?: "" + + Log.e("HomePlayerWidget", "Active track String: $activeTrackStr") var activeTrack: Track? = null if (activeTrackStr != null) { activeTrack = gson.fromJson(activeTrackStr, Track::class.java) } + Log.e("HomePlayerWidget", "Active track: $activeTrack") val playIcon = Icon.createWithResource(context, android.R.drawable.ic_media_play); diff --git a/lib/provider/glance/glance.dart b/lib/provider/glance/glance.dart index 4f0c6333..d3daad75 100644 --- a/lib/provider/glance/glance.dart +++ b/lib/provider/glance/glance.dart @@ -5,6 +5,7 @@ import 'package:home_widget/home_widget.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:http/http.dart'; import 'package:logger/logger.dart'; +import 'package:spotify/spotify.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/server/server.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; @@ -70,8 +71,38 @@ Future _updateWidget() async { } } +Future _sendActiveTrack(Track? track) async { + if (track == null) { + await _saveWidgetData("activeTrack", null); + await _updateWidget(); + return; + } + + final jsonTrack = track.toJson(); + + final image = track.album?.images?.first; + final cachedImage = await DefaultCacheManager().getSingleFile(image!.url!); + final data = { + ...jsonTrack, + "album": { + ...jsonTrack["album"], + "images": [ + { + ...image.toJson(), + "path": cachedImage.path, + } + ] + } + }; + + await _saveWidgetData("activeTrack", jsonEncode(data)); + + await _updateWidget(); +} + final glanceProvider = Provider((ref) { final server = ref.read(serverProvider); + final activeTrack = ref.read(audioPlayerProvider).activeTrack; server.whenData( (value) async { @@ -85,6 +116,8 @@ final glanceProvider = Provider((ref) { }, ); + _sendActiveTrack(activeTrack); + ref.listen(serverProvider, (prev, next) async { next.whenData( (value) async { @@ -105,27 +138,7 @@ final glanceProvider = Provider((ref) { try { if (previous?.activeTrack != next.activeTrack && next.activeTrack != null) { - final jsonTrack = next.activeTrack!.toJson(); - - final image = next.activeTrack!.album?.images?.first; - final cachedImage = - await DefaultCacheManager().getSingleFile(image!.url!); - final data = { - ...jsonTrack, - "album": { - ...jsonTrack["album"], - "images": [ - { - ...image.toJson(), - "path": cachedImage.path, - } - ] - } - }; - - await _saveWidgetData("activeTrack", jsonEncode(data)); - - await _updateWidget(); + await _sendActiveTrack(next.activeTrack); } } catch (e, stack) { AppLogger.reportError(e, stack);