From ce10aa1fe2c95d4738835687f613930cf7829f3a Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sun, 30 Apr 2023 15:18:16 +0600 Subject: [PATCH] fix: navigation to settings not working --- lib/collections/side_bar_tiles.dart | 28 +++++++++++++------ .../root/spotube_navigation_bar.dart | 4 +-- lib/provider/playlist_queue_provider.dart | 13 ++++----- lib/services/audio_player.dart | 24 +++++++++++++++- .../audio_services/audio_services.dart | 27 +++++++++--------- pubspec.lock | 28 +++++++++---------- pubspec.yaml | 2 +- 7 files changed, 78 insertions(+), 48 deletions(-) diff --git a/lib/collections/side_bar_tiles.dart b/lib/collections/side_bar_tiles.dart index 09aa9136..551d70d7 100644 --- a/lib/collections/side_bar_tiles.dart +++ b/lib/collections/side_bar_tiles.dart @@ -5,19 +5,29 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; class SideBarTiles { final IconData icon; final String title; - SideBarTiles({required this.icon, required this.title}); + final String id; + SideBarTiles({required this.icon, required this.title, required this.id}); } List getSidebarTileList(AppLocalizations l10n) => [ - SideBarTiles(icon: SpotubeIcons.home, title: l10n.browse), - SideBarTiles(icon: SpotubeIcons.search, title: l10n.search), - SideBarTiles(icon: SpotubeIcons.library, title: l10n.library), - SideBarTiles(icon: SpotubeIcons.music, title: l10n.lyrics), + SideBarTiles(id: "browse", icon: SpotubeIcons.home, title: l10n.browse), + SideBarTiles(id: "search", icon: SpotubeIcons.search, title: l10n.search), + SideBarTiles( + id: "library", icon: SpotubeIcons.library, title: l10n.library), + SideBarTiles(id: "lyrics", icon: SpotubeIcons.music, title: l10n.lyrics), ]; List getNavbarTileList(AppLocalizations l10n) => [ - SideBarTiles(icon: SpotubeIcons.home, title: l10n.browse), - SideBarTiles(icon: SpotubeIcons.search, title: l10n.search), - SideBarTiles(icon: SpotubeIcons.library, title: l10n.library), - SideBarTiles(icon: SpotubeIcons.settings, title: l10n.settings) + SideBarTiles(id: "browse", icon: SpotubeIcons.home, title: l10n.browse), + SideBarTiles(id: "search", icon: SpotubeIcons.search, title: l10n.search), + SideBarTiles( + id: "library", + icon: SpotubeIcons.library, + title: l10n.library, + ), + SideBarTiles( + id: "settings", + icon: SpotubeIcons.settings, + title: l10n.settings, + ) ]; diff --git a/lib/components/root/spotube_navigation_bar.dart b/lib/components/root/spotube_navigation_bar.dart index f7d6d64d..f58d24c0 100644 --- a/lib/components/root/spotube_navigation_bar.dart +++ b/lib/components/root/spotube_navigation_bar.dart @@ -70,7 +70,7 @@ class SpotubeNavigationBar extends HookConsumerWidget { return MouseRegion( cursor: SystemMouseCursors.click, child: Badge( - isLabelVisible: e.title == "Library" && downloadCount > 0, + isLabelVisible: e.id == "library" && downloadCount > 0, label: Text(downloadCount.toString()), child: Icon( e.icon, @@ -84,7 +84,7 @@ class SpotubeNavigationBar extends HookConsumerWidget { index: insideSelectedIndex.value, onTap: (i) { insideSelectedIndex.value = i; - if (navbarTileList[i].title == "Settings") { + if (navbarTileList[i].id == "settings") { Sidebar.goToSettings(context); return; } diff --git a/lib/provider/playlist_queue_provider.dart b/lib/provider/playlist_queue_provider.dart index 934eb09e..566efeed 100644 --- a/lib/provider/playlist_queue_provider.dart +++ b/lib/provider/playlist_queue_provider.dart @@ -136,7 +136,7 @@ class PlaylistQueue { class PlaylistQueueNotifier extends PersistedStateNotifier { final Ref ref; - AudioServices? audioServices; + late AudioServices audioServices; static final provider = StateNotifierProvider( @@ -150,7 +150,7 @@ class PlaylistQueueNotifier extends PersistedStateNotifier { } void configure() async { - audioServices = await AudioServices.create(ref, this); + audioServices = AudioServices(ref, this); audioPlayer.onPlayerComplete.listen((event) async { if (!isLoaded) return; @@ -337,8 +337,7 @@ class PlaylistQueueNotifier extends PersistedStateNotifier { Future play() async { if (!isLoaded) return; await pause(); - audioServices?.activateSession(); - await audioServices?.addTrack(state!.activeTrack); + await audioServices.addTrack(state!.activeTrack); if (state!.activeTrack is LocalTrack) { await audioPlayer.play( DeviceFileSource((state!.activeTrack as LocalTrack).path), @@ -363,7 +362,7 @@ class PlaylistQueueNotifier extends PersistedStateNotifier { ); } - audioServices?.addTrack(state!.activeTrack); + audioServices.addTrack(state!.activeTrack); final cached = await DefaultCacheManager().getFileFromCache(state!.activeTrack.id!); @@ -415,7 +414,7 @@ class PlaylistQueueNotifier extends PersistedStateNotifier { } Future stop() async { - audioServices?.deactivateSession(); + audioServices.deactivateSession(); state = null; return audioPlayer.stop(); @@ -528,7 +527,7 @@ class PlaylistQueueNotifier extends PersistedStateNotifier { @override void dispose() { - audioServices?.dispose(); + audioServices.dispose(); super.dispose(); } } diff --git a/lib/services/audio_player.dart b/lib/services/audio_player.dart index 01e33a64..2f8f7890 100644 --- a/lib/services/audio_player.dart +++ b/lib/services/audio_player.dart @@ -1,3 +1,25 @@ import 'package:audioplayers/audioplayers.dart'; -final audioPlayer = AudioPlayer(); +final audioPlayer = (() { + AudioPlayer.global.setAudioContext( + const AudioContext( + android: AudioContextAndroid( + audioFocus: AndroidAudioFocus.gain, + audioMode: AndroidAudioMode.inCall, + contentType: AndroidContentType.music, + stayAwake: true, + usageType: AndroidUsageType.media, + ), + iOS: AudioContextIOS( + category: AVAudioSessionCategory.playback, + options: [ + AVAudioSessionOptions.allowBluetooth, + AVAudioSessionOptions.allowBluetoothA2DP, + AVAudioSessionOptions.defaultToSpeaker, + AVAudioSessionOptions.mixWithOthers, + ], + ), + ), + ); + return AudioPlayer(); +})(); diff --git a/lib/services/audio_services/audio_services.dart b/lib/services/audio_services/audio_services.dart index 10ff68e3..3293f02a 100644 --- a/lib/services/audio_services/audio_services.dart +++ b/lib/services/audio_services/audio_services.dart @@ -14,25 +14,24 @@ class AudioServices { final WindowsAudioService? smtc; final LinuxAudioService? mpris; - AudioServices(this.mobile, this.smtc, this.mpris); + AudioServices._(this.mobile, this.smtc, this.mpris); - static Future create( - Ref ref, PlaylistQueueNotifier playlistQueueNotifier) async { + factory AudioServices(Ref ref, PlaylistQueueNotifier playlistQueueNotifier) { final mobile = - !DesktopTools.platform.isMobile && !!DesktopTools.platform.isMacOS - ? null - : MobileAudioService( + DesktopTools.platform.isMobile || DesktopTools.platform.isMacOS + ? MobileAudioService( playlistQueueNotifier, ref.read(VolumeProvider.provider.notifier), - ); - final smtc = !DesktopTools.platform.isWindows - ? null - : WindowsAudioService(ref, playlistQueueNotifier); - final mpris = !DesktopTools.platform.isLinux - ? null - : LinuxAudioService(ref, playlistQueueNotifier); + ) + : null; + final smtc = DesktopTools.platform.isWindows + ? WindowsAudioService(ref, playlistQueueNotifier) + : null; + final mpris = DesktopTools.platform.isLinux + ? LinuxAudioService(ref, playlistQueueNotifier) + : null; - return AudioServices(mobile, smtc, mpris); + return AudioServices._(mobile, smtc, mpris); } Future addTrack(Track track) async { diff --git a/pubspec.lock b/pubspec.lock index 597f5017..48df1c5a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -141,58 +141,58 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "16451eab798b23ad9307aef6f9ca62bb8fb06542af8810eead0d236d3fd40a42" + sha256: "6063c05f987596ba7a3dad9bb9a5d8adfa5e7c07b9bae5301b27c11d0b3a239f" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "4.0.1" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: b2c833e6f718b6b030454e329931229afafe9327fdb002874dd544dc8bf2484d + sha256: fb6bca878ad175d8f6ddc0e0a2d4226d81fa7c10747c12db420e96c7a096b2cc url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.1" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: e7a3c8759bf11ecfe4b20df338bf9f3d37c7719a5761c46a3833aba0ceeaacff + sha256: c4a56c49347b2e85ac4e1efea218948ca0fba87f04d2a3d3de07ce2410037038 url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "4.0.1" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: e95b65e1f4d4764601dac5e65f8d8186fc29401043ab020f1dacec483d708707 + sha256: "897e24f190232a3fbb88134b062aa83a9240f55789b5e8d17c114283284ef56b" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.0.1" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: "178581a44cb685fd798d2108111d2e98cca3400e30b9c3a05546f124fb37f600" + sha256: "3a90a46198d375fc7d47bc1d3070c8fd8863b6469b7d87ca80f953efb090f976" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.0.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: "859ba09be2a57e57a787273f18c8cf0d9b61383870c5ee4b5632fe9adbc37edf" + sha256: "4f5dcbfec0bf98ea09e243d5f5b64ea43a4e6710a2f292724bed16cdba3c691e" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "3.0.1" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "622e01c4c357c2aaf1b956c3a0f89d97c3cb40315c03f16e3b6c2a31ff9c38bc" + sha256: "010f575653c01ccbe9756050b18df83d89426740e04b684f6438aa26c775a965" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "2.0.1" auto_size_text: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 8db89e59..79af4100 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: async: ^2.9.0 audio_service: ^0.18.9 audio_session: ^0.1.13 - audioplayers: ^3.0.1 + audioplayers: ^4.0.1 auto_size_text: ^3.0.0 badges: ^2.0.3 buttons_tabbar: ^1.3.6