diff --git a/lib/providers/extension_models.dart b/lib/models/extension.dart similarity index 96% rename from lib/providers/extension_models.dart rename to lib/models/extension.dart index b993b1d8..a0f0c96c 100644 --- a/lib/providers/extension_models.dart +++ b/lib/models/extension.dart @@ -1,5 +1,3 @@ -part of 'extension_provider.dart'; - // Manifest-backed models: extension metadata, capabilities, health, and // install results. @@ -17,39 +15,6 @@ class ExtensionRestoreResult { }); } -bool _stringListEquals(List a, List b) { - if (identical(a, b)) return true; - if (a.length != b.length) return false; - for (var i = 0; i < a.length; i++) { - if (a[i] != b[i]) return false; - } - return true; -} - -List? _tryDecodeStringListPreference(String rawJson, String key) { - try { - final decoded = jsonDecode(rawJson); - if (decoded is! List) { - throw const FormatException('expected a JSON list'); - } - - final values = []; - for (final item in decoded) { - if (item is! String) { - throw const FormatException('expected string entries'); - } - final trimmed = item.trim(); - if (trimmed.isNotEmpty) { - values.add(trimmed); - } - } - return values; - } catch (e) { - _log.w('Ignoring invalid $key preference: $e'); - return null; - } -} - class ExtensionDownloadTransferPolicy { final int maxAttempts; final String resumePolicy; diff --git a/lib/providers/extension_provider.dart b/lib/providers/extension_provider.dart index c1a2e22d..b893260a 100644 --- a/lib/providers/extension_provider.dart +++ b/lib/providers/extension_provider.dart @@ -5,13 +5,15 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:spotiflac_android/models/extension.dart'; import 'package:spotiflac_android/models/settings.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/services/extension_storage_service.dart'; import 'package:spotiflac_android/utils/logger.dart'; import 'package:spotiflac_android/providers/settings_provider.dart'; -part 'extension_models.dart'; +export 'package:spotiflac_android/models/extension.dart'; + part 'extension_provider_priority.dart'; final _log = AppLogger('ExtensionProvider'); diff --git a/lib/providers/extension_provider_priority.dart b/lib/providers/extension_provider_priority.dart index 9bc03303..abb6a125 100644 --- a/lib/providers/extension_provider_priority.dart +++ b/lib/providers/extension_provider_priority.dart @@ -1,6 +1,39 @@ // ignore_for_file: invalid_use_of_protected_member, invalid_use_of_visible_for_testing_member part of 'extension_provider.dart'; +bool _stringListEquals(List a, List b) { + if (identical(a, b)) return true; + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) { + if (a[i] != b[i]) return false; + } + return true; +} + +List? _tryDecodeStringListPreference(String rawJson, String key) { + try { + final decoded = jsonDecode(rawJson); + if (decoded is! List) { + throw const FormatException('expected a JSON list'); + } + + final values = []; + for (final item in decoded) { + if (item is! String) { + throw const FormatException('expected string entries'); + } + final trimmed = item.trim(); + if (trimmed.isNotEmpty) { + values.add(trimmed); + } + } + return values; + } catch (e) { + _log.w('Ignoring invalid $key preference: $e'); + return null; + } +} + /// Download/metadata/search provider priority: persistence, sanitizing, and /// reconciliation when extensions are installed, removed, or toggled. extension ExtensionNotifierProviderPriority on ExtensionNotifier { diff --git a/lib/services/download_metadata_embedding.dart b/lib/services/download_metadata_embedding.dart index 93b3fbce..e9ee13e1 100644 --- a/lib/services/download_metadata_embedding.dart +++ b/lib/services/download_metadata_embedding.dart @@ -4,7 +4,7 @@ import 'dart:math'; import 'package:path_provider/path_provider.dart'; import 'package:spotiflac_android/models/settings.dart'; import 'package:spotiflac_android/models/track.dart'; -import 'package:spotiflac_android/providers/extension_provider.dart'; +import 'package:spotiflac_android/models/extension.dart'; import 'package:spotiflac_android/services/download_metadata_resolver.dart'; import 'package:spotiflac_android/services/ffmpeg_service.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; diff --git a/lib/services/download_metadata_resolver.dart b/lib/services/download_metadata_resolver.dart index 17116c77..97b7c5d5 100644 --- a/lib/services/download_metadata_resolver.dart +++ b/lib/services/download_metadata_resolver.dart @@ -1,6 +1,6 @@ import 'package:spotiflac_android/models/settings.dart'; import 'package:spotiflac_android/models/track.dart'; -import 'package:spotiflac_android/providers/extension_provider.dart'; +import 'package:spotiflac_android/models/extension.dart'; import 'package:spotiflac_android/services/download_album_metadata.dart'; import 'package:spotiflac_android/services/download_track_metadata.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; diff --git a/lib/services/local_track_redownload_service.dart b/lib/services/local_track_redownload_service.dart index 329311a7..7bc0a8b0 100644 --- a/lib/services/local_track_redownload_service.dart +++ b/lib/services/local_track_redownload_service.dart @@ -1,6 +1,6 @@ import 'package:spotiflac_android/models/settings.dart'; import 'package:spotiflac_android/models/track.dart'; -import 'package:spotiflac_android/providers/extension_provider.dart'; +import 'package:spotiflac_android/models/extension.dart'; import 'package:spotiflac_android/services/library_database.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; diff --git a/lib/services/metadata_autofill_service.dart b/lib/services/metadata_autofill_service.dart index ab37c589..cd19572e 100644 --- a/lib/services/metadata_autofill_service.dart +++ b/lib/services/metadata_autofill_service.dart @@ -1,4 +1,4 @@ -import 'package:spotiflac_android/providers/extension_provider.dart'; +import 'package:spotiflac_android/models/extension.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/utils/logger.dart';