mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-16 08:00:23 +02:00
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:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user