mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-10-19 14:07:26 +02:00
refactor(extensions): separate domain models from provider state
This commit is contained in:
1 parent
90165d471c
commit
1ad2b7a51d
7 files changed
+40
-40
No files matched your search
@@ -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<String> a, List<String> 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<String>? _tryDecodeStringListPreference(String rawJson, String key) {
|
||||
try {
|
||||
final decoded = jsonDecode(rawJson);
|
||||
if (decoded is! List) {
|
||||
throw const FormatException('expected a JSON list');
|
||||
}
|
||||
|
||||
final values = <String>[];
|
||||
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;
|
||||
@@ -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');
|
||||
|
||||
@@ -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<String> a, List<String> 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<String>? _tryDecodeStringListPreference(String rawJson, String key) {
|
||||
try {
|
||||
final decoded = jsonDecode(rawJson);
|
||||
if (decoded is! List) {
|
||||
throw const FormatException('expected a JSON list');
|
||||
}
|
||||
|
||||
final values = <String>[];
|
||||
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 {
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
Reference in new issue
Block a user