refactor(extensions): separate domain models from provider state

This commit is contained in:
zarzet committed 2026-10-06 21:59:53 +07:00
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;
+3 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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';