From bcd718b17844df29351a402a1ef2dcdb55104147 Mon Sep 17 00:00:00 2001 From: zarzet Date: Mon, 12 Jan 2026 02:19:05 +0700 Subject: [PATCH] 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 --- lib/providers/extension_provider.dart | 26 ++++-- .../settings/download_settings_page.dart | 89 ++++++++++++++----- .../settings/options_settings_page.dart | 14 +-- 3 files changed, 95 insertions(+), 34 deletions(-) diff --git a/lib/providers/extension_provider.dart b/lib/providers/extension_provider.dart index b6aa8a7..b7366dd 100644 --- a/lib/providers/extension_provider.dart +++ b/lib/providers/extension_provider.dart @@ -520,22 +520,34 @@ class ExtensionNotifier extends Notifier { await PlatformBridge.setExtensionEnabled(extensionId, 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 - final extensions = state.extensions.map((ext) { - if (ext.id == extensionId) { - return ext.copyWith(enabled: enabled); + final extensions = state.extensions.map((e) { + if (e.id == extensionId) { + return e.copyWith(enabled: enabled); } - return ext; + return e; }).toList(); state = state.copyWith(extensions: extensions); - // If disabling an extension that is the current search provider, clear it - if (!enabled) { + // If disabling an extension, reset related settings + if (!enabled && ext != null) { final settings = ref.read(settingsProvider); + + // If this extension was the search provider, clear it and reset to Deezer if (settings.searchProvider == extensionId) { 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) { diff --git a/lib/screens/settings/download_settings_page.dart b/lib/screens/settings/download_settings_page.dart index e1db966..35ddc8a 100644 --- a/lib/screens/settings/download_settings_page.dart +++ b/lib/screens/settings/download_settings_page.dart @@ -4,6 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:file_picker/file_picker.dart'; import 'package:path_provider/path_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'; class DownloadSettingsPage extends ConsumerWidget { @@ -596,7 +597,7 @@ class DownloadSettingsPage extends ConsumerWidget { } } -class _ServiceSelector extends StatelessWidget { +class _ServiceSelector extends ConsumerWidget { final String currentService; final ValueChanged onChanged; const _ServiceSelector({ @@ -605,31 +606,75 @@ class _ServiceSelector extends StatelessWidget { }); @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( padding: const EdgeInsets.all(12), - child: Row( + child: Column( children: [ - _ServiceChip( - icon: Icons.music_note, - label: 'Tidal', - isSelected: currentService == 'tidal', - onTap: () => onChanged('tidal'), - ), - const SizedBox(width: 8), - _ServiceChip( - icon: Icons.album, - label: 'Qobuz', - isSelected: currentService == 'qobuz', - onTap: () => onChanged('qobuz'), - ), - const SizedBox(width: 8), - _ServiceChip( - icon: Icons.shopping_bag, - label: 'Amazon', - isSelected: currentService == 'amazon', - onTap: () => onChanged('amazon'), + Row( + children: [ + _ServiceChip( + icon: Icons.music_note, + label: 'Tidal', + isSelected: effectiveService == 'tidal', + onTap: () => onChanged('tidal'), + ), + const SizedBox(width: 8), + _ServiceChip( + icon: Icons.album, + label: 'Qobuz', + isSelected: effectiveService == 'qobuz', + onTap: () => onChanged('qobuz'), + ), + const SizedBox(width: 8), + _ServiceChip( + icon: Icons.shopping_bag, + 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()), + ], + ], + ), + ], ], ), ); diff --git a/lib/screens/settings/options_settings_page.dart b/lib/screens/settings/options_settings_page.dart index cbd0ebe..512e612 100644 --- a/lib/screens/settings/options_settings_page.dart +++ b/lib/screens/settings/options_settings_page.dart @@ -794,14 +794,18 @@ class _MetadataSourceSelector extends ConsumerWidget { final settings = ref.watch(settingsProvider); final extState = ref.watch(extensionProvider); - // Check if extension search provider is active - final hasExtensionSearch = settings.searchProvider != null && - settings.searchProvider!.isNotEmpty; + // Check if extension search provider is active AND enabled + Extension? activeExtension; + 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; if (hasExtensionSearch) { - final ext = extState.extensions.where((e) => e.id == settings.searchProvider).firstOrNull; - extensionName = ext?.displayName ?? settings.searchProvider; + extensionName = activeExtension.displayName; } return Padding(