refactor(ui): share legacy provider-id resource helpers

legacyProviderIdFromResourceId and stripPrefixedResourceId were
copy-pasted in the album, artist, and playlist screens with slightly
different null semantics; the shared nullable variant plus explicit
?? 'spotify' fallbacks makes the difference visible at the call sites.
This commit is contained in:
zarzet
2026-07-09 20:10:36 +07:00
parent 70cba44164
commit 2e7e2b1964
4 changed files with 29 additions and 49 deletions
+3 -16
View File
@@ -14,6 +14,7 @@ import 'package:spotiflac_android/services/platform_bridge.dart';
import 'package:spotiflac_android/utils/image_cache_utils.dart';
import 'package:spotiflac_android/utils/string_utils.dart';
import 'package:spotiflac_android/utils/nav_bar_inset.dart';
import 'package:spotiflac_android/utils/provider_resource_ids.dart';
import 'package:spotiflac_android/widgets/download_service_picker.dart';
import 'package:spotiflac_android/widgets/animation_utils.dart';
import 'package:spotiflac_android/providers/library_collections_provider.dart';
@@ -92,31 +93,17 @@ class _AlbumScreenState extends ConsumerState<AlbumScreen> {
bool _tallHeader = false;
final ScrollController _scrollController = ScrollController();
String _legacyProviderIdFromResourceId(String value) {
if (value.startsWith('deezer:')) return 'deezer';
if (value.startsWith('qobuz:')) return 'qobuz';
if (value.startsWith('tidal:')) return 'tidal';
if (value.startsWith('spotify:')) return 'spotify';
return 'spotify';
}
String _effectiveMetadataProviderIdFromAlbumId() {
if (widget.extensionId != null && widget.extensionId!.isNotEmpty) {
return widget.extensionId!;
}
return resolveEffectiveMetadataProvider(
_legacyProviderIdFromResourceId(widget.albumId),
legacyProviderIdFromResourceId(widget.albumId) ?? 'spotify',
ref.read(extensionProvider),
);
}
String _stripPrefixedResourceId(String value) {
final colonIndex = value.indexOf(':');
if (colonIndex <= 0 || colonIndex == value.length - 1) {
return value;
}
return value.substring(colonIndex + 1);
}
@override
void initState() {
@@ -336,7 +323,7 @@ class _AlbumScreenState extends ConsumerState<AlbumScreen> {
}
String _metadataResourceId(String providerId) {
return _stripPrefixedResourceId(widget.albumId);
return stripPrefixedResourceId(widget.albumId);
}
double _albumTitleFontSize() {
+4 -17
View File
@@ -14,6 +14,7 @@ import 'package:spotiflac_android/providers/local_library_provider.dart';
import 'package:spotiflac_android/services/platform_bridge.dart';
import 'package:spotiflac_android/utils/string_utils.dart';
import 'package:spotiflac_android/utils/nav_bar_inset.dart';
import 'package:spotiflac_android/utils/provider_resource_ids.dart';
import 'package:spotiflac_android/screens/album_screen.dart';
import 'package:spotiflac_android/screens/home_tab.dart'
show ExtensionAlbumScreen;
@@ -168,31 +169,17 @@ class _ArtistScreenState extends ConsumerState<ArtistScreen> {
return _directMetadataProviderId();
}
String _legacyProviderIdFromResourceId(String value) {
if (value.startsWith('deezer:')) return 'deezer';
if (value.startsWith('qobuz:')) return 'qobuz';
if (value.startsWith('tidal:')) return 'tidal';
if (value.startsWith('spotify:')) return 'spotify';
return 'spotify';
}
String _effectiveMetadataProviderIdFromArtistId() {
if (widget.extensionId != null && widget.extensionId!.isNotEmpty) {
return widget.extensionId!;
}
return resolveEffectiveMetadataProvider(
_legacyProviderIdFromResourceId(widget.artistId),
legacyProviderIdFromResourceId(widget.artistId) ?? 'spotify',
ref.read(extensionProvider),
);
}
String _stripPrefixedResourceId(String value) {
final colonIndex = value.indexOf(':');
if (colonIndex <= 0 || colonIndex == value.length - 1) {
return value;
}
return value.substring(colonIndex + 1);
}
String? _directMetadataProviderId() {
final providerId = _effectiveMetadataProviderIdFromArtistId();
@@ -200,7 +187,7 @@ class _ArtistScreenState extends ConsumerState<ArtistScreen> {
}
String _metadataResourceId(String providerId) {
return _stripPrefixedResourceId(widget.artistId);
return stripPrefixedResourceId(widget.artistId);
}
@override
@@ -1104,7 +1091,7 @@ class _ArtistScreenState extends ConsumerState<ArtistScreen> {
Future<List<Track>> _fetchAlbumTracks(ArtistAlbum album) async {
final providerId = album.providerId;
if (providerId != null && providerId.isNotEmpty) {
final resourceId = _stripPrefixedResourceId(album.id);
final resourceId = stripPrefixedResourceId(album.id);
final metadata = await PlatformBridge.getProviderMetadata(
providerId,
'album',
+4 -16
View File
@@ -10,6 +10,7 @@ import 'package:spotiflac_android/providers/library_collections_provider.dart';
import 'package:spotiflac_android/utils/image_cache_utils.dart';
import 'package:spotiflac_android/utils/string_utils.dart';
import 'package:spotiflac_android/utils/nav_bar_inset.dart';
import 'package:spotiflac_android/utils/provider_resource_ids.dart';
import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/providers/local_library_provider.dart';
import 'package:spotiflac_android/widgets/download_service_picker.dart';
@@ -57,23 +58,10 @@ class _PlaylistScreenState extends ConsumerState<PlaylistScreen> {
String? get _headerVideoUrl =>
_resolvedHeaderVideoUrl ?? widget.headerVideoUrl;
String? _legacyProviderIdFromResourceId(String value) {
if (value.startsWith('deezer:')) return 'deezer';
if (value.startsWith('qobuz:')) return 'qobuz';
if (value.startsWith('tidal:')) return 'tidal';
return null;
}
String _stripPrefixedResourceId(String value) {
final colonIndex = value.indexOf(':');
if (colonIndex <= 0 || colonIndex == value.length - 1) {
return value;
}
return value.substring(colonIndex + 1);
}
String? _metadataProviderId(String playlistId) {
final providerId = _legacyProviderIdFromResourceId(playlistId);
final providerId = legacyProviderIdFromResourceId(playlistId);
if (providerId == null) return null;
final effective = resolveEffectiveMetadataProvider(
providerId,
@@ -83,7 +71,7 @@ class _PlaylistScreenState extends ConsumerState<PlaylistScreen> {
}
String _metadataResourceId(String providerId, String playlistId) {
return _stripPrefixedResourceId(playlistId);
return stripPrefixedResourceId(playlistId);
}
String? _recommendedDownloadService() {
@@ -109,7 +97,7 @@ class _PlaylistScreenState extends ConsumerState<PlaylistScreen> {
}
final trackId = _tracks.firstOrNull?.id ?? '';
final trackProviderId = _legacyProviderIdFromResourceId(trackId);
final trackProviderId = legacyProviderIdFromResourceId(trackId);
if (trackProviderId != null) {
return resolveEffectiveDownloadService(
trackProviderId,
+18
View File
@@ -0,0 +1,18 @@
/// Maps a legacy prefixed resource id (e.g. "deezer:123") to its provider id,
/// or null when the value carries no known provider prefix.
String? legacyProviderIdFromResourceId(String value) {
if (value.startsWith('deezer:')) return 'deezer';
if (value.startsWith('qobuz:')) return 'qobuz';
if (value.startsWith('tidal:')) return 'tidal';
if (value.startsWith('spotify:')) return 'spotify';
return null;
}
/// Strips a leading "provider:" prefix from a resource id, if present.
String stripPrefixedResourceId(String value) {
final colonIndex = value.indexOf(':');
if (colonIndex <= 0 || colonIndex == value.length - 1) {
return value;
}
return value.substring(colonIndex + 1);
}