fix: last track of queue keeps repeating #718

This commit is contained in:
Kingkor Roy Tirtho 2023-10-29 19:51:53 +06:00
parent 286ef83e8e
commit 58e569864d
5 changed files with 44 additions and 38 deletions

View File

@ -1,7 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:catcher_2/catcher_2.dart'; import 'package:catcher_2/catcher_2.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
@ -12,7 +11,6 @@ import 'package:metadata_god/metadata_god.dart';
import 'package:mime/mime.dart'; import 'package:mime/mime.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
@ -22,15 +20,12 @@ import 'package:spotube/components/shared/shimmers/shimmer_track_tile.dart';
import 'package:spotube/components/shared/sort_tracks_dropdown.dart'; import 'package:spotube/components/shared/sort_tracks_dropdown.dart';
import 'package:spotube/components/shared/track_table/track_tile.dart'; import 'package:spotube/components/shared/track_table/track_tile.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/hooks/use_async_effect.dart';
import 'package:spotube/models/local_track.dart'; import 'package:spotube/models/local_track.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences_provider.dart';
import 'package:spotube/utils/platform.dart';
import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/service_utils.dart';
import 'package:spotube/utils/type_conversion_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FfiException;
show FfiException;
const supportedAudioTypes = [ const supportedAudioTypes = [
"audio/webm", "audio/webm",
@ -162,40 +157,12 @@ class UserLocalTracks extends HookConsumerWidget {
final trackSnapshot = ref.watch(localTracksProvider); final trackSnapshot = ref.watch(localTracksProvider);
final isPlaylistPlaying = final isPlaylistPlaying =
playlist.containsTracks(trackSnapshot.value ?? []); playlist.containsTracks(trackSnapshot.value ?? []);
final isMounted = useIsMounted();
final searchController = useTextEditingController(); final searchController = useTextEditingController();
useValueListenable(searchController); useValueListenable(searchController);
final searchFocus = useFocusNode(); final searchFocus = useFocusNode();
final isFiltering = useState(false); final isFiltering = useState(false);
useAsyncEffect(
() async {
if (!kIsMobile) return;
final androidInfo = await DeviceInfoPlugin().androidInfo;
final hasNoStoragePerm = androidInfo.version.sdkInt < 33 &&
!await Permission.storage.isGranted &&
!await Permission.storage.isLimited;
final hasNoAudioPerm = androidInfo.version.sdkInt >= 33 &&
!await Permission.audio.isGranted &&
!await Permission.audio.isLimited;
if (hasNoStoragePerm) {
await Permission.storage.request();
if (isMounted()) ref.refresh(localTracksProvider);
}
if (hasNoAudioPerm) {
await Permission.audio.request();
if (isMounted()) ref.refresh(localTracksProvider);
}
},
null,
[],
);
return Column( return Column(
children: [ children: [
Padding( Padding(

View File

@ -91,7 +91,9 @@ class TrackTile extends HookConsumerWidget {
isLoading.value = true; isLoading.value = true;
await onTap?.call(); await onTap?.call();
} finally { } finally {
isLoading.value = false; if (context.mounted) {
isLoading.value = false;
}
} }
}, },
onLongPress: onLongPress, onLongPress: onLongPress,

View File

@ -0,0 +1,38 @@
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:spotube/components/library/user_local_tracks.dart';
import 'package:spotube/hooks/use_async_effect.dart';
void useGetStoragePermissions(WidgetRef ref) {
final isMounted = useIsMounted();
useAsyncEffect(
() async {
if (!DesktopTools.platform.isMobile) return;
final androidInfo = await DeviceInfoPlugin().androidInfo;
final hasNoStoragePerm = androidInfo.version.sdkInt < 33 &&
!await Permission.storage.isGranted &&
!await Permission.storage.isLimited;
final hasNoAudioPerm = androidInfo.version.sdkInt >= 33 &&
!await Permission.audio.isGranted &&
!await Permission.audio.isLimited;
if (hasNoStoragePerm) {
await Permission.storage.request();
if (isMounted()) ref.refresh(localTracksProvider);
}
if (hasNoAudioPerm) {
await Permission.audio.request();
if (isMounted()) ref.refresh(localTracksProvider);
}
},
null,
[],
);
}

View File

@ -15,6 +15,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:spotube/collections/routes.dart'; import 'package:spotube/collections/routes.dart';
import 'package:spotube/collections/intents.dart'; import 'package:spotube/collections/intents.dart';
import 'package:spotube/hooks/use_disable_battery_optimizations.dart'; import 'package:spotube/hooks/use_disable_battery_optimizations.dart';
import 'package:spotube/hooks/use_get_storage_perms.dart';
import 'package:spotube/l10n/l10n.dart'; import 'package:spotube/l10n/l10n.dart';
import 'package:spotube/models/logger.dart'; import 'package:spotube/models/logger.dart';
import 'package:spotube/models/matched_track.dart'; import 'package:spotube/models/matched_track.dart';
@ -181,6 +182,7 @@ class SpotubeState extends ConsumerState<Spotube> {
}, []); }, []);
useDisableBatteryOptimizations(); useDisableBatteryOptimizations();
useGetStoragePermissions(ref);
final lightTheme = useMemoized( final lightTheme = useMemoized(
() => theme(paletteColor ?? accentMaterialColor, Brightness.light, false), () => theme(paletteColor ?? accentMaterialColor, Brightness.light, false),

View File

@ -174,9 +174,6 @@ class MkPlayerWithState extends Player {
case PlaylistMode.none: case PlaylistMode.none:
// Fixes auto-repeating the last track // Fixes auto-repeating the last track
await super.stop(); await super.stop();
await Future.delayed(const Duration(seconds: 2), () {
super.open(_playlist!.medias[_playlist!.index], play: false);
});
break; break;
default: default:
} }