fix: reset settings when extension is disabled

- Reset metadata source to Deezer when search provider extension is disabled
- Reset default service to Tidal when download provider extension is disabled
- Check extension enabled state in Options page (Primary Provider)
- Check extension enabled state in Download Settings (Service selector)
- Show extension download providers in service selector when enabled
This commit is contained in:
zarzet
2026-01-12 02:26:18 +07:00
parent 2b9357cb6d
commit bcd718b178
3 changed files with 95 additions and 34 deletions
+19 -7
View File
@@ -520,22 +520,34 @@ class ExtensionNotifier extends Notifier<ExtensionState> {
await PlatformBridge.setExtensionEnabled(extensionId, enabled); await PlatformBridge.setExtensionEnabled(extensionId, enabled);
_log.d('Set extension $extensionId enabled: $enabled'); _log.d('Set extension $extensionId enabled: $enabled');
// Get extension info before updating state
final ext = state.extensions.where((e) => e.id == extensionId).firstOrNull;
// Update local state // Update local state
final extensions = state.extensions.map((ext) { final extensions = state.extensions.map((e) {
if (ext.id == extensionId) { if (e.id == extensionId) {
return ext.copyWith(enabled: enabled); return e.copyWith(enabled: enabled);
} }
return ext; return e;
}).toList(); }).toList();
state = state.copyWith(extensions: extensions); state = state.copyWith(extensions: extensions);
// If disabling an extension that is the current search provider, clear it // If disabling an extension, reset related settings
if (!enabled) { if (!enabled && ext != null) {
final settings = ref.read(settingsProvider); final settings = ref.read(settingsProvider);
// If this extension was the search provider, clear it and reset to Deezer
if (settings.searchProvider == extensionId) { if (settings.searchProvider == extensionId) {
ref.read(settingsProvider.notifier).setSearchProvider(null); ref.read(settingsProvider.notifier).setSearchProvider(null);
_log.d('Cleared search provider because extension $extensionId was disabled'); ref.read(settingsProvider.notifier).setMetadataSource('deezer');
_log.d('Cleared search provider and reset to Deezer because extension $extensionId was disabled');
}
// If this extension was the default download service, reset to Tidal
if (ext.hasDownloadProvider && settings.defaultService == extensionId) {
ref.read(settingsProvider.notifier).setDefaultService('tidal');
_log.d('Reset default service to Tidal because extension $extensionId was disabled');
} }
} }
} catch (e) { } catch (e) {
@@ -4,6 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:spotiflac_android/providers/settings_provider.dart'; import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/providers/extension_provider.dart';
import 'package:spotiflac_android/widgets/settings_group.dart'; import 'package:spotiflac_android/widgets/settings_group.dart';
class DownloadSettingsPage extends ConsumerWidget { class DownloadSettingsPage extends ConsumerWidget {
@@ -596,7 +597,7 @@ class DownloadSettingsPage extends ConsumerWidget {
} }
} }
class _ServiceSelector extends StatelessWidget { class _ServiceSelector extends ConsumerWidget {
final String currentService; final String currentService;
final ValueChanged<String> onChanged; final ValueChanged<String> onChanged;
const _ServiceSelector({ const _ServiceSelector({
@@ -605,31 +606,75 @@ class _ServiceSelector extends StatelessWidget {
}); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context, WidgetRef ref) {
final extState = ref.watch(extensionProvider);
// Get enabled extension download providers
final extensionProviders = extState.extensions
.where((e) => e.enabled && e.hasDownloadProvider)
.toList();
// Check if current service is an extension that's now disabled
final isExtensionService = !['tidal', 'qobuz', 'amazon'].contains(currentService);
final isCurrentExtensionEnabled = isExtensionService
? extensionProviders.any((e) => e.id == currentService)
: true;
// If current extension is disabled, show it as not selected
final effectiveService = isCurrentExtensionEnabled ? currentService : '';
return Padding( return Padding(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Row( child: Column(
children: [ children: [
_ServiceChip( Row(
icon: Icons.music_note, children: [
label: 'Tidal', _ServiceChip(
isSelected: currentService == 'tidal', icon: Icons.music_note,
onTap: () => onChanged('tidal'), label: 'Tidal',
), isSelected: effectiveService == 'tidal',
const SizedBox(width: 8), onTap: () => onChanged('tidal'),
_ServiceChip( ),
icon: Icons.album, const SizedBox(width: 8),
label: 'Qobuz', _ServiceChip(
isSelected: currentService == 'qobuz', icon: Icons.album,
onTap: () => onChanged('qobuz'), label: 'Qobuz',
), isSelected: effectiveService == 'qobuz',
const SizedBox(width: 8), onTap: () => onChanged('qobuz'),
_ServiceChip( ),
icon: Icons.shopping_bag, const SizedBox(width: 8),
label: 'Amazon', _ServiceChip(
isSelected: currentService == 'amazon', icon: Icons.shopping_bag,
onTap: () => onChanged('amazon'), label: 'Amazon',
isSelected: effectiveService == 'amazon',
onTap: () => onChanged('amazon'),
),
],
), ),
// Show extension download providers if any
if (extensionProviders.isNotEmpty) ...[
const SizedBox(height: 8),
Row(
children: [
for (int i = 0; i < extensionProviders.length; i++) ...[
if (i > 0) const SizedBox(width: 8),
Expanded(
child: _ServiceChip(
icon: Icons.extension,
label: extensionProviders[i].displayName,
isSelected: effectiveService == extensionProviders[i].id,
onTap: () => onChanged(extensionProviders[i].id),
),
),
],
// Fill remaining space if less than 3 extensions
for (int i = extensionProviders.length; i < 3; i++) ...[
const SizedBox(width: 8),
const Expanded(child: SizedBox()),
],
],
),
],
], ],
), ),
); );
@@ -794,14 +794,18 @@ class _MetadataSourceSelector extends ConsumerWidget {
final settings = ref.watch(settingsProvider); final settings = ref.watch(settingsProvider);
final extState = ref.watch(extensionProvider); final extState = ref.watch(extensionProvider);
// Check if extension search provider is active // Check if extension search provider is active AND enabled
final hasExtensionSearch = settings.searchProvider != null && Extension? activeExtension;
settings.searchProvider!.isNotEmpty; if (settings.searchProvider != null && settings.searchProvider!.isNotEmpty) {
activeExtension = extState.extensions
.where((e) => e.id == settings.searchProvider && e.enabled)
.firstOrNull;
}
final hasExtensionSearch = activeExtension != null;
String? extensionName; String? extensionName;
if (hasExtensionSearch) { if (hasExtensionSearch) {
final ext = extState.extensions.where((e) => e.id == settings.searchProvider).firstOrNull; extensionName = activeExtension.displayName;
extensionName = ext?.displayName ?? settings.searchProvider;
} }
return Padding( return Padding(