refactor(preferences): use Drift sql db for preferences

This commit is contained in:
Kingkor Roy Tirtho 2024-06-14 00:29:09 +06:00
parent a35eece00c
commit 3fb003ea60
48 changed files with 2187 additions and 1400 deletions

View File

@ -8,11 +8,11 @@ import 'package:spotube/components/dialogs/playlist_add_track_dialog.dart';
import 'package:spotube/components/tracks_view/track_view_props.dart'; import 'package:spotube/components/tracks_view/track_view_props.dart';
import 'package:spotube/components/tracks_view/track_view_provider.dart'; import 'package:spotube/components/tracks_view/track_view_provider.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/provider/download_manager_provider.dart'; import 'package:spotube/provider/download_manager_provider.dart';
import 'package:spotube/provider/history/history.dart'; import 'package:spotube/provider/history/history.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
class TrackViewBodyOptions extends HookConsumerWidget { class TrackViewBodyOptions extends HookConsumerWidget {
const TrackViewBodyOptions({super.key}); const TrackViewBodyOptions({super.key});

View File

@ -2,8 +2,9 @@ import 'dart:io';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/hooks/configurators/use_window_listener.dart'; import 'package:spotube/hooks/configurators/use_window_listener.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:local_notifier/local_notifier.dart'; import 'package:local_notifier/local_notifier.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';

View File

@ -0,0 +1,54 @@
library database;
import 'dart:convert';
import 'dart:io';
import 'package:drift/drift.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/services/sourced_track/enums.dart';
import 'package:flutter/material.dart' hide Table;
import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart';
import 'package:drift/native.dart';
import 'package:sqlite3/sqlite3.dart';
import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart';
part 'database.g.dart';
part 'tables/preferences.dart';
part 'typeconverters/color.dart';
part 'typeconverters/locale.dart';
part 'typeconverters/string_list.dart';
@DriftDatabase(tables: [PreferencesTable])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
}
LazyDatabase _openConnection() {
// the LazyDatabase util lets us find the right location for the file async.
return LazyDatabase(() async {
// put the database file, called db.sqlite here, into the documents folder
// for your app.
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(join(dbFolder.path, 'db.sqlite'));
// Also work around limitations on old Android versions
if (Platform.isAndroid) {
await applyWorkaroundToOpenSqlite3OnOldAndroidVersions();
}
// Make sqlite3 pick a more suitable location for temporary files - the
// one from the system may be inaccessible due to sandboxing.
final cacheBase = (await getTemporaryDirectory()).path;
// We can't access /tmp on Android, which sqlite3 would try by default.
// Explicitly tell it about the correct temporary directory.
sqlite3.tempDirectory = cacheBase;
return NativeDatabase.createInBackground(file);
});
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,125 @@
part of '../database.dart';
enum LayoutMode {
compact,
extended,
adaptive,
}
enum CloseBehavior {
minimizeToTray,
close,
}
enum AudioSource {
youtube,
piped,
jiosaavn;
String get label => name[0].toUpperCase() + name.substring(1);
}
enum MusicCodec {
m4a._("M4a (Best for downloaded music)"),
weba._("WebA (Best for streamed music)\nDoesn't support audio metadata");
final String label;
const MusicCodec._(this.label);
}
enum SearchMode {
youtube._("YouTube"),
youtubeMusic._("YouTube Music");
final String label;
const SearchMode._(this.label);
factory SearchMode.fromString(String key) {
return SearchMode.values.firstWhere((e) => e.name == key);
}
}
class PreferencesTable extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get audioQuality => textEnum<SourceQualities>()
.withDefault(Constant(SourceQualities.high.name))();
BoolColumn get albumColorSync =>
boolean().withDefault(const Constant(true))();
BoolColumn get amoledDarkTheme =>
boolean().withDefault(const Constant(false))();
BoolColumn get checkUpdate => boolean().withDefault(const Constant(true))();
BoolColumn get normalizeAudio =>
boolean().withDefault(const Constant(false))();
BoolColumn get showSystemTrayIcon =>
boolean().withDefault(const Constant(false))();
BoolColumn get systemTitleBar =>
boolean().withDefault(const Constant(false))();
BoolColumn get skipNonMusic => boolean().withDefault(const Constant(false))();
TextColumn get closeBehavior => textEnum<CloseBehavior>()
.withDefault(Constant(CloseBehavior.close.name))();
TextColumn get accentColorScheme => text()
.withDefault(const Constant("Blue:0xFF2196F3"))
.map(const SpotubeColorConverter())();
TextColumn get layoutMode =>
textEnum<LayoutMode>().withDefault(Constant(LayoutMode.adaptive.name))();
TextColumn get locale => text()
.withDefault(
const Constant('{"languageCode":"system","countryCode":"system"}'),
)
.map(const LocaleConverter())();
TextColumn get market =>
textEnum<Market>().withDefault(Constant(Market.US.name))();
TextColumn get searchMode =>
textEnum<SearchMode>().withDefault(Constant(SearchMode.youtube.name))();
TextColumn get downloadLocation => text().withDefault(const Constant(""))();
TextColumn get localLibraryLocation =>
text().withDefault(const Constant("")).map(const StringListConverter())();
TextColumn get pipedInstance =>
text().withDefault(const Constant("https://pipedapi.kavin.rocks"))();
TextColumn get themeMode =>
textEnum<ThemeMode>().withDefault(Constant(ThemeMode.system.name))();
TextColumn get audioSource =>
textEnum<AudioSource>().withDefault(Constant(AudioSource.youtube.name))();
TextColumn get streamMusicCodec =>
textEnum<SourceCodecs>().withDefault(Constant(SourceCodecs.weba.name))();
TextColumn get downloadMusicCodec =>
textEnum<SourceCodecs>().withDefault(Constant(SourceCodecs.m4a.name))();
BoolColumn get discordPresence =>
boolean().withDefault(const Constant(true))();
BoolColumn get endlessPlayback =>
boolean().withDefault(const Constant(true))();
BoolColumn get enableConnect =>
boolean().withDefault(const Constant(false))();
// Default values as PreferencesTableData
static PreferencesTableData defaults() {
return PreferencesTableData(
id: 0,
audioQuality: SourceQualities.high,
albumColorSync: true,
amoledDarkTheme: false,
checkUpdate: true,
normalizeAudio: false,
showSystemTrayIcon: false,
systemTitleBar: false,
skipNonMusic: false,
closeBehavior: CloseBehavior.close,
accentColorScheme: SpotubeColor(Colors.blue.value, name: "Blue"),
layoutMode: LayoutMode.adaptive,
locale: const Locale("system", "system"),
market: Market.US,
searchMode: SearchMode.youtube,
downloadLocation: "",
localLibraryLocation: [],
pipedInstance: "https://pipedapi.kavin.rocks",
themeMode: ThemeMode.system,
audioSource: AudioSource.youtube,
streamMusicCodec: SourceCodecs.weba,
downloadMusicCodec: SourceCodecs.m4a,
discordPresence: true,
endlessPlayback: true,
enableConnect: false,
);
}
}

View File

@ -0,0 +1,29 @@
part of '../database.dart';
class ColorConverter extends TypeConverter<Color, int> {
const ColorConverter();
@override
Color fromSql(int fromDb) {
return Color(fromDb);
}
@override
int toSql(Color value) {
return value.value;
}
}
class SpotubeColorConverter extends TypeConverter<SpotubeColor, String> {
const SpotubeColorConverter();
@override
SpotubeColor fromSql(String fromDb) {
return SpotubeColor.fromString(fromDb);
}
@override
String toSql(SpotubeColor value) {
return value.toString();
}
}

View File

@ -0,0 +1,19 @@
part of '../database.dart';
class LocaleConverter extends TypeConverter<Locale, String> {
const LocaleConverter();
@override
Locale fromSql(String fromDb) {
final rawMap = jsonDecode(fromDb) as Map<String, dynamic>;
return Locale(rawMap["languageCode"], rawMap["countryCode"]);
}
@override
String toSql(Locale value) {
return jsonEncode({
"languageCode": value.languageCode,
"countryCode": value.countryCode,
});
}
}

View File

@ -0,0 +1,15 @@
part of '../database.dart';
class StringListConverter extends TypeConverter<List<String>, String> {
const StringListConverter();
@override
List<String> fromSql(String fromDb) {
return fromDb.split(",");
}
@override
String toSql(List<String> value) {
return value.join(",");
}
}

View File

@ -14,10 +14,11 @@ import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/duration.dart'; import 'package:spotube/extensions/duration.dart';
import 'package:spotube/hooks/utils/use_debounce.dart'; import 'package:spotube/hooks/utils/use_debounce.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/server/active_sourced_track.dart'; import 'package:spotube/provider/server/active_sourced_track.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/services/sourced_track/models/source_info.dart'; import 'package:spotube/services/sourced_track/models/source_info.dart';
import 'package:spotube/services/sourced_track/models/video_info.dart'; import 'package:spotube/services/sourced_track/models/video_info.dart';
import 'package:spotube/services/sourced_track/sourced_track.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart';

View File

@ -6,6 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/assets.gen.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/modules/player/player_actions.dart'; import 'package:spotube/modules/player/player_actions.dart';
import 'package:spotube/modules/player/player_overlay.dart'; import 'package:spotube/modules/player/player_overlay.dart';
import 'package:spotube/modules/player/player_track_details.dart'; import 'package:spotube/modules/player/player_track_details.dart';
@ -20,7 +21,7 @@ import 'package:flutter/material.dart';
import 'package:spotube/provider/authentication_provider.dart'; import 'package:spotube/provider/authentication_provider.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/provider/volume_provider.dart'; import 'package:spotube/provider/volume_provider.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';

View File

@ -9,6 +9,7 @@ import 'package:sidebarx/sidebarx.dart';
import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/assets.gen.dart';
import 'package:spotube/collections/side_bar_tiles.dart'; import 'package:spotube/collections/side_bar_tiles.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/modules/connect/connect_device.dart'; import 'package:spotube/modules/connect/connect_device.dart';
import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/image/universal_image.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
@ -23,7 +24,7 @@ import 'package:spotube/provider/authentication_provider.dart';
import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/provider/spotify/spotify.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/service_utils.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';

View File

@ -10,9 +10,10 @@ import 'package:spotube/collections/side_bar_tiles.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/hooks/utils/use_brightness_value.dart'; import 'package:spotube/hooks/utils/use_brightness_value.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/provider/download_manager_provider.dart'; import 'package:spotube/provider/download_manager_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/service_utils.dart';
final navigationPanelHeight = StateProvider<double>((ref) => 50); final navigationPanelHeight = StateProvider<double>((ref) => 50);

View File

@ -4,11 +4,11 @@ import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/assets.gen.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/modules/getting_started/blur_card.dart'; import 'package:spotube/modules/getting_started/blur_card.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/string.dart'; import 'package:spotube/extensions/string.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
final audioSourceToIconMap = { final audioSourceToIconMap = {
AudioSource.youtube: const Icon( AudioSource.youtube: const Icon(

View File

@ -55,14 +55,14 @@ class GettingStartedPageLanguageRegionSection extends HookConsumerWidget {
), ),
const Gap(16), const Gap(16),
DropdownMenu( DropdownMenu(
initialSelection: preferences.recommendationMarket, initialSelection: preferences.market,
onSelected: (value) { onSelected: (value) {
if (value == null) return; if (value == null) return;
ref ref
.read(userPreferencesProvider.notifier) .read(userPreferencesProvider.notifier)
.setRecommendationMarket(value); .setRecommendationMarket(value);
}, },
hintText: preferences.recommendationMarket.name, hintText: preferences.market.name,
label: Text(context.l10n.market_place_region), label: Text(context.l10n.market_place_region),
inputDecorationTheme: inputDecorationTheme:
const InputDecorationTheme(isDense: true), const InputDecorationTheme(isDense: true),

View File

@ -39,7 +39,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
final genresCollection = ref.watch(categoryGenresProvider); final genresCollection = ref.watch(categoryGenresProvider);
final limit = useValueNotifier<int>(10); final limit = useValueNotifier<int>(10);
final market = useValueNotifier<Market>(preferences.recommendationMarket); final market = useValueNotifier<Market>(preferences.market);
final genres = useState<List<String>>([]); final genres = useState<List<String>>([]);
final artists = useState<List<Artist>>([]); final artists = useState<List<Artist>>([]);

View File

@ -3,12 +3,12 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart'; import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart';
import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/modules/settings/section_card_with_heading.dart';
import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; import 'package:spotube/components/adaptive/adaptive_select_tile.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
class SettingsAppearanceSection extends HookConsumerWidget { class SettingsAppearanceSection extends HookConsumerWidget {
final bool isGettingStarted; final bool isGettingStarted;

View File

@ -2,11 +2,12 @@ import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/modules/settings/section_card_with_heading.dart';
import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; import 'package:spotube/components/adaptive/adaptive_select_tile.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
class SettingsDesktopSection extends HookConsumerWidget { class SettingsDesktopSection extends HookConsumerWidget {

View File

@ -57,7 +57,7 @@ class SettingsLanguageRegionSection extends HookConsumerWidget {
secondary: const Icon(SpotubeIcons.shoppingBag), secondary: const Icon(SpotubeIcons.shoppingBag),
title: Text(context.l10n.market_place_region), title: Text(context.l10n.market_place_region),
subtitle: Text(context.l10n.recommendation_country), subtitle: Text(context.l10n.recommendation_country),
value: preferences.recommendationMarket, value: preferences.market,
onChanged: (value) { onChanged: (value) {
if (value == null) return; if (value == null) return;
preferencesNotifier.setRecommendationMarket(value); preferencesNotifier.setRecommendationMarket(value);

View File

@ -6,12 +6,13 @@ import 'package:google_fonts/google_fonts.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:piped_client/piped_client.dart'; import 'package:piped_client/piped_client.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/modules/settings/section_card_with_heading.dart';
import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; import 'package:spotube/components/adaptive/adaptive_select_tile.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/provider/piped_instances_provider.dart'; import 'package:spotube/provider/piped_instances_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/enums.dart';
class SettingsPlaybackSection extends HookConsumerWidget { class SettingsPlaybackSection extends HookConsumerWidget {

View File

@ -0,0 +1,4 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/models/database/database.dart';
final databaseProvider = Provider((ref) => AppDatabase());

View File

@ -14,7 +14,7 @@ import 'package:spotube/provider/proxy_playlist/proxy_playlist.dart';
import 'package:spotube/provider/scrobbler_provider.dart'; import 'package:spotube/provider/scrobbler_provider.dart';
import 'package:spotube/provider/server/sourced_track.dart'; import 'package:spotube/provider/server/sourced_track.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/services/audio_services/audio_services.dart'; import 'package:spotube/services/audio_services/audio_services.dart';
import 'package:spotube/provider/discord_provider.dart'; import 'package:spotube/provider/discord_provider.dart';

View File

@ -1,10 +1,11 @@
import 'package:spotube/models/database/database.dart';
import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/logger/logger.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/models/skip_segment.dart'; import 'package:spotube/models/skip_segment.dart';
import 'package:spotube/provider/server/active_sourced_track.dart'; import 'package:spotube/provider/server/active_sourced_track.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/services/dio/dio.dart'; import 'package:spotube/services/dio/dio.dart';
class SourcedSegments { class SourcedSegments {

View File

@ -7,7 +7,6 @@ import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/server/active_sourced_track.dart'; import 'package:spotube/provider/server/active_sourced_track.dart';
import 'package:spotube/provider/server/sourced_track.dart'; import 'package:spotube/provider/server/sourced_track.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/logger/logger.dart';
class ServerPlaybackRoutes { class ServerPlaybackRoutes {

View File

@ -30,7 +30,7 @@ class AlbumReleasesNotifier
@override @override
fetch(int offset, int limit) async { fetch(int offset, int limit) async {
final market = ref.read(userPreferencesProvider).recommendationMarket; final market = ref.read(userPreferencesProvider).market;
final albums = await spotify.browse final albums = await spotify.browse
.newReleases(country: market) .newReleases(country: market)
@ -43,7 +43,7 @@ class AlbumReleasesNotifier
build() async { build() async {
ref.watch(spotifyProvider); ref.watch(spotifyProvider);
ref.watch( ref.watch(
userPreferencesProvider.select((s) => s.recommendationMarket), userPreferencesProvider.select((s) => s.market),
); );
ref.watch(allFollowedArtistsProvider); ref.watch(allFollowedArtistsProvider);

View File

@ -30,7 +30,7 @@ class ArtistAlbumsNotifier extends AutoDisposeFamilyPaginatedAsyncNotifier<
@override @override
fetch(arg, offset, limit) async { fetch(arg, offset, limit) async {
final market = ref.read(userPreferencesProvider).recommendationMarket; final market = ref.read(userPreferencesProvider).market;
final albums = await spotify.artists final albums = await spotify.artists
.albums(arg, country: market) .albums(arg, country: market)
.getPage(limit, offset); .getPage(limit, offset);
@ -44,7 +44,7 @@ class ArtistAlbumsNotifier extends AutoDisposeFamilyPaginatedAsyncNotifier<
ref.watch(spotifyProvider); ref.watch(spotifyProvider);
ref.watch( ref.watch(
userPreferencesProvider.select((s) => s.recommendationMarket), userPreferencesProvider.select((s) => s.market),
); );
final albums = await fetch(arg, 0, 20); final albums = await fetch(arg, 0, 20);
return ArtistAlbumsState( return ArtistAlbumsState(

View File

@ -6,8 +6,7 @@ final artistTopTracksProvider =
ref.cacheFor(); ref.cacheFor();
final spotify = ref.watch(spotifyProvider); final spotify = ref.watch(spotifyProvider);
final market = ref final market = ref.watch(userPreferencesProvider.select((s) => s.market));
.watch(userPreferencesProvider.select((s) => s.recommendationMarket));
final tracks = await spotify.artists.topTracks(artistId, market); final tracks = await spotify.artists.topTracks(artistId, market);
return tracks.toList(); return tracks.toList();

View File

@ -3,8 +3,7 @@ part of '../spotify.dart';
final categoriesProvider = FutureProvider( final categoriesProvider = FutureProvider(
(ref) async { (ref) async {
final spotify = ref.watch(spotifyProvider); final spotify = ref.watch(spotifyProvider);
final market = ref final market = ref.watch(userPreferencesProvider.select((s) => s.market));
.watch(userPreferencesProvider.select((s) => s.recommendationMarket));
final locale = ref.watch(userPreferencesProvider.select((s) => s.locale)); final locale = ref.watch(userPreferencesProvider.select((s) => s.locale));
final categories = await spotify.categories final categories = await spotify.categories
.list( .list(

View File

@ -33,7 +33,7 @@ class CategoryPlaylistsNotifier extends AutoDisposeFamilyPaginatedAsyncNotifier<
final preferences = ref.read(userPreferencesProvider); final preferences = ref.read(userPreferencesProvider);
final playlists = await Pages<PlaylistSimple?>( final playlists = await Pages<PlaylistSimple?>(
spotify, spotify,
"v1/browse/categories/$arg/playlists?country=${preferences.recommendationMarket.name}&locale=${preferences.locale}", "v1/browse/categories/$arg/playlists?country=${preferences.market.name}&locale=${preferences.locale}",
(json) => json == null ? null : PlaylistSimple.fromJson(json), (json) => json == null ? null : PlaylistSimple.fromJson(json),
'playlists', 'playlists',
(json) => PlaylistsFeatured.fromJson(json), (json) => PlaylistsFeatured.fromJson(json),
@ -48,7 +48,7 @@ class CategoryPlaylistsNotifier extends AutoDisposeFamilyPaginatedAsyncNotifier<
ref.watch(spotifyProvider); ref.watch(spotifyProvider);
ref.watch(userPreferencesProvider.select((s) => s.locale)); ref.watch(userPreferencesProvider.select((s) => s.locale));
ref.watch(userPreferencesProvider.select((s) => s.recommendationMarket)); ref.watch(userPreferencesProvider.select((s) => s.market));
final playlists = await fetch(arg, 0, 8); final playlists = await fetch(arg, 0, 8);

View File

@ -5,7 +5,7 @@ final generatePlaylistProvider = FutureProvider.autoDispose
(ref, input) async { (ref, input) async {
final spotify = ref.watch(spotifyProvider); final spotify = ref.watch(spotifyProvider);
final market = ref.watch( final market = ref.watch(
userPreferencesProvider.select((s) => s.recommendationMarket), userPreferencesProvider.select((s) => s.market),
); );
final recommendation = await spotify.recommendations final recommendation = await spotify.recommendations

View File

@ -42,7 +42,7 @@ class SearchNotifier<Y> extends AutoDisposeFamilyPaginatedAsyncNotifier<Y,
.get( .get(
ref.read(searchTermStateProvider), ref.read(searchTermStateProvider),
types: [arg], types: [arg],
market: ref.read(userPreferencesProvider).recommendationMarket, market: ref.read(userPreferencesProvider).market,
) )
.getPage(limit, offset); .getPage(limit, offset);
@ -56,7 +56,7 @@ class SearchNotifier<Y> extends AutoDisposeFamilyPaginatedAsyncNotifier<Y,
ref.watch(searchTermStateProvider); ref.watch(searchTermStateProvider);
ref.watch(spotifyProvider); ref.watch(spotifyProvider);
ref.watch( ref.watch(
userPreferencesProvider.select((value) => value.recommendationMarket), userPreferencesProvider.select((value) => value.market),
); );
final results = await fetch(arg, 0, 10); final results = await fetch(arg, 0, 10);

View File

@ -5,7 +5,7 @@ import 'package:spotube/provider/user_preferences/user_preferences_provider.dart
final homeViewProvider = FutureProvider((ref) async { final homeViewProvider = FutureProvider((ref) async {
final country = ref.watch( final country = ref.watch(
userPreferencesProvider.select((s) => s.recommendationMarket), userPreferencesProvider.select((s) => s.market),
); );
final spTCookie = ref.watch( final spTCookie = ref.watch(
authenticationProvider.select((s) => s?.getCookie("sp_t")), authenticationProvider.select((s) => s?.getCookie("sp_t")),

View File

@ -8,7 +8,7 @@ final homeSectionViewProvider =
FutureProvider.family<SpotifyHomeFeedSection?, String>( FutureProvider.family<SpotifyHomeFeedSection?, String>(
(ref, sectionUri) async { (ref, sectionUri) async {
final country = ref.watch( final country = ref.watch(
userPreferencesProvider.select((s) => s.recommendationMarket), userPreferencesProvider.select((s) => s.market),
); );
final spTCookie = ref.watch( final spTCookie = ref.watch(
authenticationProvider.select((s) => s?.getCookie("sp_t")), authenticationProvider.select((s) => s?.getCookie("sp_t")),

View File

@ -4,7 +4,7 @@ final viewProvider = FutureProvider.family<Map<String, dynamic>, String>(
(ref, viewName) async { (ref, viewName) async {
final customSpotify = ref.watch(customSpotifyEndpointProvider); final customSpotify = ref.watch(customSpotifyEndpointProvider);
final market = ref.watch( final market = ref.watch(
userPreferencesProvider.select((s) => s.recommendationMarket), userPreferencesProvider.select((s) => s.market),
); );
final locale = ref.watch( final locale = ref.watch(
userPreferencesProvider.select((s) => s.locale), userPreferencesProvider.select((s) => s.locale),

View File

@ -1,54 +1,116 @@
import 'dart:async'; import 'package:drift/drift.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart'; import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart';
import 'package:spotube/provider/database/database.dart';
import 'package:spotube/provider/palette_provider.dart'; import 'package:spotube/provider/palette_provider.dart';
import 'package:spotube/provider/proxy_playlist/player_listeners.dart'; import 'package:spotube/provider/proxy_playlist/player_listeners.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/enums.dart';
import 'package:spotube/utils/persisted_state_notifier.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
import 'package:path/path.dart' as path;
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
class UserPreferencesNotifier extends PersistedStateNotifier<UserPreferences> { typedef UserPreferences = PreferencesTableData;
final Ref ref;
UserPreferencesNotifier(this.ref) class UserPreferencesNotifier extends Notifier<PreferencesTableData> {
: super(UserPreferences.withDefaults(), "preferences"); @override
build() {
final db = ref.watch(databaseProvider);
void reset() { (db.select(db.preferencesTable)..where((tbl) => tbl.id.equals(0)))
state = UserPreferences.withDefaults(); .getSingleOrNull()
.then((result) async {
if (result == null) {
await db.into(db.preferencesTable).insert(
PreferencesTableCompanion.insert(
id: const Value(0),
downloadLocation: Value(await _getDefaultDownloadDirectory()),
),
);
}
state = await (db.select(db.preferencesTable)
..where((tbl) => tbl.id.equals(0)))
.getSingle();
final subscription = (db.select(db.preferencesTable)
..where((tbl) => tbl.id.equals(0)))
.watchSingle()
.listen((event) async {
state = event;
if (kIsDesktop) {
await windowManager.setTitleBarStyle(
state.systemTitleBar ? TitleBarStyle.normal : TitleBarStyle.hidden,
);
}
await audioPlayer.setAudioNormalization(state.normalizeAudio);
});
ref.onDispose(() {
subscription.cancel();
});
});
return PreferencesTable.defaults();
}
Future<String> _getDefaultDownloadDirectory() async {
if (kIsAndroid) return "/storage/emulated/0/Download/Spotube";
if (kIsMacOS) {
return join((await getLibraryDirectory()).path, "Caches");
}
return getDownloadsDirectory().then((dir) {
return join(dir!.path, "Spotube");
});
}
Future<void> setData(PreferencesTableCompanion data) async {
final db = ref.read(databaseProvider);
final query = db.update(db.preferencesTable)..where((t) => t.id.equals(0));
await query.write(data);
}
Future<void> reset() async {
final db = ref.read(databaseProvider);
final query = db.update(db.preferencesTable)..where((t) => t.id.equals(0));
await query.replace(PreferencesTableCompanion.insert());
} }
void setStreamMusicCodec(SourceCodecs codec) { void setStreamMusicCodec(SourceCodecs codec) {
state = state.copyWith(streamMusicCodec: codec); setData(PreferencesTableCompanion(streamMusicCodec: Value(codec)));
} }
void setDownloadMusicCodec(SourceCodecs codec) { void setDownloadMusicCodec(SourceCodecs codec) {
state = state.copyWith(downloadMusicCodec: codec); setData(PreferencesTableCompanion(downloadMusicCodec: Value(codec)));
} }
void setThemeMode(ThemeMode mode) { void setThemeMode(ThemeMode mode) {
state = state.copyWith(themeMode: mode); setData(PreferencesTableCompanion(themeMode: Value(mode)));
} }
void setRecommendationMarket(Market country) { void setRecommendationMarket(Market country) {
state = state.copyWith(recommendationMarket: country); setData(PreferencesTableCompanion(market: Value(country)));
} }
void setAccentColorScheme(SpotubeColor color) { void setAccentColorScheme(SpotubeColor color) {
state = state.copyWith(accentColorScheme: color); setData(PreferencesTableCompanion(accentColorScheme: Value(color)));
} }
void setAlbumColorSync(bool sync) { void setAlbumColorSync(bool sync) {
state = state.copyWith(albumColorSync: sync); setData(PreferencesTableCompanion(albumColorSync: Value(sync)));
if (!sync) { if (!sync) {
ref.read(paletteProvider.notifier).state = null; ref.read(paletteProvider.notifier).state = null;
@ -58,126 +120,87 @@ class UserPreferencesNotifier extends PersistedStateNotifier<UserPreferences> {
} }
void setCheckUpdate(bool check) { void setCheckUpdate(bool check) {
state = state.copyWith(checkUpdate: check); setData(PreferencesTableCompanion(checkUpdate: Value(check)));
} }
void setAudioQuality(SourceQualities quality) { void setAudioQuality(SourceQualities quality) {
state = state.copyWith(audioQuality: quality); setData(PreferencesTableCompanion(audioQuality: Value(quality)));
} }
void setDownloadLocation(String downloadDir) { void setDownloadLocation(String downloadDir) {
if (downloadDir.isEmpty) return; if (downloadDir.isEmpty) return;
state = state.copyWith(downloadLocation: downloadDir); setData(PreferencesTableCompanion(downloadLocation: Value(downloadDir)));
} }
void setLocalLibraryLocation(List<String> localLibraryDirs) { void setLocalLibraryLocation(List<String> localLibraryDirs) {
//if (localLibraryDir.isEmpty) return; //if (localLibraryDir.isEmpty) return;
state = state.copyWith(localLibraryLocation: localLibraryDirs); setData(PreferencesTableCompanion(
localLibraryLocation: Value(localLibraryDirs)));
} }
void setLayoutMode(LayoutMode mode) { void setLayoutMode(LayoutMode mode) {
state = state.copyWith(layoutMode: mode); setData(PreferencesTableCompanion(layoutMode: Value(mode)));
} }
void setCloseBehavior(CloseBehavior behavior) { void setCloseBehavior(CloseBehavior behavior) {
state = state.copyWith(closeBehavior: behavior); setData(PreferencesTableCompanion(closeBehavior: Value(behavior)));
} }
void setShowSystemTrayIcon(bool show) { void setShowSystemTrayIcon(bool show) {
state = state.copyWith(showSystemTrayIcon: show); setData(PreferencesTableCompanion(showSystemTrayIcon: Value(show)));
} }
void setLocale(Locale locale) { void setLocale(Locale locale) {
state = state.copyWith(locale: locale); setData(PreferencesTableCompanion(locale: Value(locale)));
} }
void setPipedInstance(String instance) { void setPipedInstance(String instance) {
state = state.copyWith(pipedInstance: instance); setData(PreferencesTableCompanion(pipedInstance: Value(instance)));
} }
void setSearchMode(SearchMode mode) { void setSearchMode(SearchMode mode) {
state = state.copyWith(searchMode: mode); setData(PreferencesTableCompanion(searchMode: Value(mode)));
} }
void setSkipNonMusic(bool skip) { void setSkipNonMusic(bool skip) {
state = state.copyWith(skipNonMusic: skip); setData(PreferencesTableCompanion(skipNonMusic: Value(skip)));
} }
void setAudioSource(AudioSource type) { void setAudioSource(AudioSource type) {
state = state.copyWith(audioSource: type); setData(PreferencesTableCompanion(audioSource: Value(type)));
} }
void setSystemTitleBar(bool isSystemTitleBar) { void setSystemTitleBar(bool isSystemTitleBar) {
state = state.copyWith(systemTitleBar: isSystemTitleBar); setData(
if (kIsDesktop) { PreferencesTableCompanion(
windowManager.setTitleBarStyle( systemTitleBar: Value(isSystemTitleBar),
isSystemTitleBar ? TitleBarStyle.normal : TitleBarStyle.hidden, ),
); );
} }
}
void setDiscordPresence(bool discordPresence) { void setDiscordPresence(bool discordPresence) {
state = state.copyWith(discordPresence: discordPresence); setData(PreferencesTableCompanion(discordPresence: Value(discordPresence)));
} }
void setAmoledDarkTheme(bool isAmoled) { void setAmoledDarkTheme(bool isAmoled) {
state = state.copyWith(amoledDarkTheme: isAmoled); setData(PreferencesTableCompanion(amoledDarkTheme: Value(isAmoled)));
} }
void setNormalizeAudio(bool normalize) { void setNormalizeAudio(bool normalize) {
state = state.copyWith(normalizeAudio: normalize); setData(PreferencesTableCompanion(normalizeAudio: Value(normalize)));
audioPlayer.setAudioNormalization(normalize); audioPlayer.setAudioNormalization(normalize);
} }
void setEndlessPlayback(bool endless) { void setEndlessPlayback(bool endless) {
state = state.copyWith(endlessPlayback: endless); setData(PreferencesTableCompanion(endlessPlayback: Value(endless)));
} }
void setEnableConnect(bool enable) { void setEnableConnect(bool enable) {
state = state.copyWith(enableConnect: enable); setData(PreferencesTableCompanion(enableConnect: Value(enable)));
}
Future<String> _getDefaultDownloadDirectory() async {
if (kIsAndroid) return "/storage/emulated/0/Download/Spotube";
if (kIsMacOS) {
return path.join((await getLibraryDirectory()).path, "Caches");
}
return getDownloadsDirectory().then((dir) {
return path.join(dir!.path, "Spotube");
});
}
@override
FutureOr<void> onInit() async {
if (state.downloadLocation.isEmpty) {
state = state.copyWith(
downloadLocation: await _getDefaultDownloadDirectory(),
);
}
if (kIsDesktop) {
await windowManager.setTitleBarStyle(
state.systemTitleBar ? TitleBarStyle.normal : TitleBarStyle.hidden,
);
}
await audioPlayer.setAudioNormalization(state.normalizeAudio);
}
@override
FutureOr<UserPreferences> fromJson(Map<String, dynamic> json) {
return UserPreferences.fromJson(json);
}
@override
Map<String, dynamic> toJson() {
return state.toJson();
} }
} }
final userPreferencesProvider = final userPreferencesProvider =
StateNotifierProvider<UserPreferencesNotifier, UserPreferences>( NotifierProvider<UserPreferencesNotifier, PreferencesTableData>(
(ref) => UserPreferencesNotifier(ref), () => UserPreferencesNotifier(),
); );

View File

@ -1,142 +0,0 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart';
import 'package:spotube/services/sourced_track/enums.dart';
part 'user_preferences_state.g.dart';
part 'user_preferences_state.freezed.dart';
@JsonEnum()
enum LayoutMode {
compact,
extended,
adaptive,
}
@JsonEnum()
enum CloseBehavior {
minimizeToTray,
close,
}
@JsonEnum()
enum AudioSource {
youtube,
piped,
jiosaavn;
String get label => name[0].toUpperCase() + name.substring(1);
}
@JsonEnum()
enum MusicCodec {
m4a._("M4a (Best for downloaded music)"),
weba._("WebA (Best for streamed music)\nDoesn't support audio metadata");
final String label;
const MusicCodec._(this.label);
}
@JsonEnum()
enum SearchMode {
youtube._("YouTube"),
youtubeMusic._("YouTube Music");
final String label;
const SearchMode._(this.label);
factory SearchMode.fromString(String key) {
return SearchMode.values.firstWhere((e) => e.name == key);
}
}
@freezed
class UserPreferences with _$UserPreferences {
const factory UserPreferences({
@Default(SourceQualities.high) SourceQualities audioQuality,
@Default(true) bool albumColorSync,
@Default(false) bool amoledDarkTheme,
@Default(true) bool checkUpdate,
@Default(false) bool normalizeAudio,
@Default(false) bool showSystemTrayIcon,
@Default(false) bool skipNonMusic,
@Default(false) bool systemTitleBar,
@Default(CloseBehavior.close) CloseBehavior closeBehavior,
@Default(SpotubeColor(0xFF2196F3, name: "Blue"))
@JsonKey(
fromJson: UserPreferences._accentColorSchemeFromJson,
toJson: UserPreferences._accentColorSchemeToJson,
readValue: UserPreferences._accentColorSchemeReadValue,
)
SpotubeColor accentColorScheme,
@Default(LayoutMode.adaptive) LayoutMode layoutMode,
@Default(Locale("system", "system"))
@JsonKey(
fromJson: UserPreferences._localeFromJson,
toJson: UserPreferences._localeToJson,
readValue: UserPreferences._localeReadValue,
)
Locale locale,
@Default(Market.US) Market recommendationMarket,
@Default(SearchMode.youtube) SearchMode searchMode,
@Default("") String downloadLocation,
@Default([]) List<String> localLibraryLocation,
@Default("https://pipedapi.kavin.rocks") String pipedInstance,
@Default(ThemeMode.system) ThemeMode themeMode,
@Default(AudioSource.youtube) AudioSource audioSource,
@Default(SourceCodecs.weba) SourceCodecs streamMusicCodec,
@Default(SourceCodecs.m4a) SourceCodecs downloadMusicCodec,
@Default(true) bool discordPresence,
@Default(true) bool endlessPlayback,
@Default(false) bool enableConnect,
}) = _UserPreferences;
factory UserPreferences.fromJson(Map<String, dynamic> json) =>
_$UserPreferencesFromJson(json);
factory UserPreferences.withDefaults() => UserPreferences.fromJson({});
static SpotubeColor _accentColorSchemeFromJson(Map<String, dynamic> json) {
return SpotubeColor.fromString(json["color"]);
}
static Map<String, dynamic>? _accentColorSchemeReadValue(
Map<dynamic, dynamic> json, String key) {
if (json[key] is String) {
return {"color": json[key]};
}
return json[key] as Map<String, dynamic>?;
}
static Map<String, dynamic> _accentColorSchemeToJson(SpotubeColor color) {
return {"color": color.toString()};
}
static Locale _localeFromJson(Map<String, dynamic> json) {
return Locale(json["languageCode"], json["countryCode"]);
}
static Map<String, dynamic> _localeToJson(Locale locale) {
return {
"languageCode": locale.languageCode,
"countryCode": locale.countryCode,
};
}
static Map<String, dynamic>? _localeReadValue(
Map<dynamic, dynamic> json, String key) {
if (json[key] is String) {
final map = jsonDecode(json[key]);
return {
"languageCode": map["lc"],
"countryCode": map["cc"],
};
}
return json[key] as Map<String, dynamic>?;
}
}

View File

@ -1,751 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'user_preferences_state.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
UserPreferences _$UserPreferencesFromJson(Map<String, dynamic> json) {
return _UserPreferences.fromJson(json);
}
/// @nodoc
mixin _$UserPreferences {
SourceQualities get audioQuality => throw _privateConstructorUsedError;
bool get albumColorSync => throw _privateConstructorUsedError;
bool get amoledDarkTheme => throw _privateConstructorUsedError;
bool get checkUpdate => throw _privateConstructorUsedError;
bool get normalizeAudio => throw _privateConstructorUsedError;
bool get showSystemTrayIcon => throw _privateConstructorUsedError;
bool get skipNonMusic => throw _privateConstructorUsedError;
bool get systemTitleBar => throw _privateConstructorUsedError;
CloseBehavior get closeBehavior => throw _privateConstructorUsedError;
@JsonKey(
fromJson: UserPreferences._accentColorSchemeFromJson,
toJson: UserPreferences._accentColorSchemeToJson,
readValue: UserPreferences._accentColorSchemeReadValue)
SpotubeColor get accentColorScheme => throw _privateConstructorUsedError;
LayoutMode get layoutMode => throw _privateConstructorUsedError;
@JsonKey(
fromJson: UserPreferences._localeFromJson,
toJson: UserPreferences._localeToJson,
readValue: UserPreferences._localeReadValue)
Locale get locale => throw _privateConstructorUsedError;
Market get recommendationMarket => throw _privateConstructorUsedError;
SearchMode get searchMode => throw _privateConstructorUsedError;
String get downloadLocation => throw _privateConstructorUsedError;
List<String> get localLibraryLocation => throw _privateConstructorUsedError;
String get pipedInstance => throw _privateConstructorUsedError;
ThemeMode get themeMode => throw _privateConstructorUsedError;
AudioSource get audioSource => throw _privateConstructorUsedError;
SourceCodecs get streamMusicCodec => throw _privateConstructorUsedError;
SourceCodecs get downloadMusicCodec => throw _privateConstructorUsedError;
bool get discordPresence => throw _privateConstructorUsedError;
bool get endlessPlayback => throw _privateConstructorUsedError;
bool get enableConnect => throw _privateConstructorUsedError;
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$UserPreferencesCopyWith<UserPreferences> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $UserPreferencesCopyWith<$Res> {
factory $UserPreferencesCopyWith(
UserPreferences value, $Res Function(UserPreferences) then) =
_$UserPreferencesCopyWithImpl<$Res, UserPreferences>;
@useResult
$Res call(
{SourceQualities audioQuality,
bool albumColorSync,
bool amoledDarkTheme,
bool checkUpdate,
bool normalizeAudio,
bool showSystemTrayIcon,
bool skipNonMusic,
bool systemTitleBar,
CloseBehavior closeBehavior,
@JsonKey(
fromJson: UserPreferences._accentColorSchemeFromJson,
toJson: UserPreferences._accentColorSchemeToJson,
readValue: UserPreferences._accentColorSchemeReadValue)
SpotubeColor accentColorScheme,
LayoutMode layoutMode,
@JsonKey(
fromJson: UserPreferences._localeFromJson,
toJson: UserPreferences._localeToJson,
readValue: UserPreferences._localeReadValue)
Locale locale,
Market recommendationMarket,
SearchMode searchMode,
String downloadLocation,
List<String> localLibraryLocation,
String pipedInstance,
ThemeMode themeMode,
AudioSource audioSource,
SourceCodecs streamMusicCodec,
SourceCodecs downloadMusicCodec,
bool discordPresence,
bool endlessPlayback,
bool enableConnect});
}
/// @nodoc
class _$UserPreferencesCopyWithImpl<$Res, $Val extends UserPreferences>
implements $UserPreferencesCopyWith<$Res> {
_$UserPreferencesCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
@pragma('vm:prefer-inline')
@override
$Res call({
Object? audioQuality = null,
Object? albumColorSync = null,
Object? amoledDarkTheme = null,
Object? checkUpdate = null,
Object? normalizeAudio = null,
Object? showSystemTrayIcon = null,
Object? skipNonMusic = null,
Object? systemTitleBar = null,
Object? closeBehavior = null,
Object? accentColorScheme = null,
Object? layoutMode = null,
Object? locale = null,
Object? recommendationMarket = null,
Object? searchMode = null,
Object? downloadLocation = null,
Object? localLibraryLocation = null,
Object? pipedInstance = null,
Object? themeMode = null,
Object? audioSource = null,
Object? streamMusicCodec = null,
Object? downloadMusicCodec = null,
Object? discordPresence = null,
Object? endlessPlayback = null,
Object? enableConnect = null,
}) {
return _then(_value.copyWith(
audioQuality: null == audioQuality
? _value.audioQuality
: audioQuality // ignore: cast_nullable_to_non_nullable
as SourceQualities,
albumColorSync: null == albumColorSync
? _value.albumColorSync
: albumColorSync // ignore: cast_nullable_to_non_nullable
as bool,
amoledDarkTheme: null == amoledDarkTheme
? _value.amoledDarkTheme
: amoledDarkTheme // ignore: cast_nullable_to_non_nullable
as bool,
checkUpdate: null == checkUpdate
? _value.checkUpdate
: checkUpdate // ignore: cast_nullable_to_non_nullable
as bool,
normalizeAudio: null == normalizeAudio
? _value.normalizeAudio
: normalizeAudio // ignore: cast_nullable_to_non_nullable
as bool,
showSystemTrayIcon: null == showSystemTrayIcon
? _value.showSystemTrayIcon
: showSystemTrayIcon // ignore: cast_nullable_to_non_nullable
as bool,
skipNonMusic: null == skipNonMusic
? _value.skipNonMusic
: skipNonMusic // ignore: cast_nullable_to_non_nullable
as bool,
systemTitleBar: null == systemTitleBar
? _value.systemTitleBar
: systemTitleBar // ignore: cast_nullable_to_non_nullable
as bool,
closeBehavior: null == closeBehavior
? _value.closeBehavior
: closeBehavior // ignore: cast_nullable_to_non_nullable
as CloseBehavior,
accentColorScheme: null == accentColorScheme
? _value.accentColorScheme
: accentColorScheme // ignore: cast_nullable_to_non_nullable
as SpotubeColor,
layoutMode: null == layoutMode
? _value.layoutMode
: layoutMode // ignore: cast_nullable_to_non_nullable
as LayoutMode,
locale: null == locale
? _value.locale
: locale // ignore: cast_nullable_to_non_nullable
as Locale,
recommendationMarket: null == recommendationMarket
? _value.recommendationMarket
: recommendationMarket // ignore: cast_nullable_to_non_nullable
as Market,
searchMode: null == searchMode
? _value.searchMode
: searchMode // ignore: cast_nullable_to_non_nullable
as SearchMode,
downloadLocation: null == downloadLocation
? _value.downloadLocation
: downloadLocation // ignore: cast_nullable_to_non_nullable
as String,
localLibraryLocation: null == localLibraryLocation
? _value.localLibraryLocation
: localLibraryLocation // ignore: cast_nullable_to_non_nullable
as List<String>,
pipedInstance: null == pipedInstance
? _value.pipedInstance
: pipedInstance // ignore: cast_nullable_to_non_nullable
as String,
themeMode: null == themeMode
? _value.themeMode
: themeMode // ignore: cast_nullable_to_non_nullable
as ThemeMode,
audioSource: null == audioSource
? _value.audioSource
: audioSource // ignore: cast_nullable_to_non_nullable
as AudioSource,
streamMusicCodec: null == streamMusicCodec
? _value.streamMusicCodec
: streamMusicCodec // ignore: cast_nullable_to_non_nullable
as SourceCodecs,
downloadMusicCodec: null == downloadMusicCodec
? _value.downloadMusicCodec
: downloadMusicCodec // ignore: cast_nullable_to_non_nullable
as SourceCodecs,
discordPresence: null == discordPresence
? _value.discordPresence
: discordPresence // ignore: cast_nullable_to_non_nullable
as bool,
endlessPlayback: null == endlessPlayback
? _value.endlessPlayback
: endlessPlayback // ignore: cast_nullable_to_non_nullable
as bool,
enableConnect: null == enableConnect
? _value.enableConnect
: enableConnect // ignore: cast_nullable_to_non_nullable
as bool,
) as $Val);
}
}
/// @nodoc
abstract class _$$UserPreferencesImplCopyWith<$Res>
implements $UserPreferencesCopyWith<$Res> {
factory _$$UserPreferencesImplCopyWith(_$UserPreferencesImpl value,
$Res Function(_$UserPreferencesImpl) then) =
__$$UserPreferencesImplCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{SourceQualities audioQuality,
bool albumColorSync,
bool amoledDarkTheme,
bool checkUpdate,
bool normalizeAudio,
bool showSystemTrayIcon,
bool skipNonMusic,
bool systemTitleBar,
CloseBehavior closeBehavior,
@JsonKey(
fromJson: UserPreferences._accentColorSchemeFromJson,
toJson: UserPreferences._accentColorSchemeToJson,
readValue: UserPreferences._accentColorSchemeReadValue)
SpotubeColor accentColorScheme,
LayoutMode layoutMode,
@JsonKey(
fromJson: UserPreferences._localeFromJson,
toJson: UserPreferences._localeToJson,
readValue: UserPreferences._localeReadValue)
Locale locale,
Market recommendationMarket,
SearchMode searchMode,
String downloadLocation,
List<String> localLibraryLocation,
String pipedInstance,
ThemeMode themeMode,
AudioSource audioSource,
SourceCodecs streamMusicCodec,
SourceCodecs downloadMusicCodec,
bool discordPresence,
bool endlessPlayback,
bool enableConnect});
}
/// @nodoc
class __$$UserPreferencesImplCopyWithImpl<$Res>
extends _$UserPreferencesCopyWithImpl<$Res, _$UserPreferencesImpl>
implements _$$UserPreferencesImplCopyWith<$Res> {
__$$UserPreferencesImplCopyWithImpl(
_$UserPreferencesImpl _value, $Res Function(_$UserPreferencesImpl) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? audioQuality = null,
Object? albumColorSync = null,
Object? amoledDarkTheme = null,
Object? checkUpdate = null,
Object? normalizeAudio = null,
Object? showSystemTrayIcon = null,
Object? skipNonMusic = null,
Object? systemTitleBar = null,
Object? closeBehavior = null,
Object? accentColorScheme = null,
Object? layoutMode = null,
Object? locale = null,
Object? recommendationMarket = null,
Object? searchMode = null,
Object? downloadLocation = null,
Object? localLibraryLocation = null,
Object? pipedInstance = null,
Object? themeMode = null,
Object? audioSource = null,
Object? streamMusicCodec = null,
Object? downloadMusicCodec = null,
Object? discordPresence = null,
Object? endlessPlayback = null,
Object? enableConnect = null,
}) {
return _then(_$UserPreferencesImpl(
audioQuality: null == audioQuality
? _value.audioQuality
: audioQuality // ignore: cast_nullable_to_non_nullable
as SourceQualities,
albumColorSync: null == albumColorSync
? _value.albumColorSync
: albumColorSync // ignore: cast_nullable_to_non_nullable
as bool,
amoledDarkTheme: null == amoledDarkTheme
? _value.amoledDarkTheme
: amoledDarkTheme // ignore: cast_nullable_to_non_nullable
as bool,
checkUpdate: null == checkUpdate
? _value.checkUpdate
: checkUpdate // ignore: cast_nullable_to_non_nullable
as bool,
normalizeAudio: null == normalizeAudio
? _value.normalizeAudio
: normalizeAudio // ignore: cast_nullable_to_non_nullable
as bool,
showSystemTrayIcon: null == showSystemTrayIcon
? _value.showSystemTrayIcon
: showSystemTrayIcon // ignore: cast_nullable_to_non_nullable
as bool,
skipNonMusic: null == skipNonMusic
? _value.skipNonMusic
: skipNonMusic // ignore: cast_nullable_to_non_nullable
as bool,
systemTitleBar: null == systemTitleBar
? _value.systemTitleBar
: systemTitleBar // ignore: cast_nullable_to_non_nullable
as bool,
closeBehavior: null == closeBehavior
? _value.closeBehavior
: closeBehavior // ignore: cast_nullable_to_non_nullable
as CloseBehavior,
accentColorScheme: null == accentColorScheme
? _value.accentColorScheme
: accentColorScheme // ignore: cast_nullable_to_non_nullable
as SpotubeColor,
layoutMode: null == layoutMode
? _value.layoutMode
: layoutMode // ignore: cast_nullable_to_non_nullable
as LayoutMode,
locale: null == locale
? _value.locale
: locale // ignore: cast_nullable_to_non_nullable
as Locale,
recommendationMarket: null == recommendationMarket
? _value.recommendationMarket
: recommendationMarket // ignore: cast_nullable_to_non_nullable
as Market,
searchMode: null == searchMode
? _value.searchMode
: searchMode // ignore: cast_nullable_to_non_nullable
as SearchMode,
downloadLocation: null == downloadLocation
? _value.downloadLocation
: downloadLocation // ignore: cast_nullable_to_non_nullable
as String,
localLibraryLocation: null == localLibraryLocation
? _value._localLibraryLocation
: localLibraryLocation // ignore: cast_nullable_to_non_nullable
as List<String>,
pipedInstance: null == pipedInstance
? _value.pipedInstance
: pipedInstance // ignore: cast_nullable_to_non_nullable
as String,
themeMode: null == themeMode
? _value.themeMode
: themeMode // ignore: cast_nullable_to_non_nullable
as ThemeMode,
audioSource: null == audioSource
? _value.audioSource
: audioSource // ignore: cast_nullable_to_non_nullable
as AudioSource,
streamMusicCodec: null == streamMusicCodec
? _value.streamMusicCodec
: streamMusicCodec // ignore: cast_nullable_to_non_nullable
as SourceCodecs,
downloadMusicCodec: null == downloadMusicCodec
? _value.downloadMusicCodec
: downloadMusicCodec // ignore: cast_nullable_to_non_nullable
as SourceCodecs,
discordPresence: null == discordPresence
? _value.discordPresence
: discordPresence // ignore: cast_nullable_to_non_nullable
as bool,
endlessPlayback: null == endlessPlayback
? _value.endlessPlayback
: endlessPlayback // ignore: cast_nullable_to_non_nullable
as bool,
enableConnect: null == enableConnect
? _value.enableConnect
: enableConnect // ignore: cast_nullable_to_non_nullable
as bool,
));
}
}
/// @nodoc
@JsonSerializable()
class _$UserPreferencesImpl implements _UserPreferences {
const _$UserPreferencesImpl(
{this.audioQuality = SourceQualities.high,
this.albumColorSync = true,
this.amoledDarkTheme = false,
this.checkUpdate = true,
this.normalizeAudio = false,
this.showSystemTrayIcon = false,
this.skipNonMusic = false,
this.systemTitleBar = false,
this.closeBehavior = CloseBehavior.close,
@JsonKey(
fromJson: UserPreferences._accentColorSchemeFromJson,
toJson: UserPreferences._accentColorSchemeToJson,
readValue: UserPreferences._accentColorSchemeReadValue)
this.accentColorScheme = const SpotubeColor(0xFF2196F3, name: "Blue"),
this.layoutMode = LayoutMode.adaptive,
@JsonKey(
fromJson: UserPreferences._localeFromJson,
toJson: UserPreferences._localeToJson,
readValue: UserPreferences._localeReadValue)
this.locale = const Locale("system", "system"),
this.recommendationMarket = Market.US,
this.searchMode = SearchMode.youtube,
this.downloadLocation = "",
final List<String> localLibraryLocation = const [],
this.pipedInstance = "https://pipedapi.kavin.rocks",
this.themeMode = ThemeMode.system,
this.audioSource = AudioSource.youtube,
this.streamMusicCodec = SourceCodecs.weba,
this.downloadMusicCodec = SourceCodecs.m4a,
this.discordPresence = true,
this.endlessPlayback = true,
this.enableConnect = false})
: _localLibraryLocation = localLibraryLocation;
factory _$UserPreferencesImpl.fromJson(Map<String, dynamic> json) =>
_$$UserPreferencesImplFromJson(json);
@override
@JsonKey()
final SourceQualities audioQuality;
@override
@JsonKey()
final bool albumColorSync;
@override
@JsonKey()
final bool amoledDarkTheme;
@override
@JsonKey()
final bool checkUpdate;
@override
@JsonKey()
final bool normalizeAudio;
@override
@JsonKey()
final bool showSystemTrayIcon;
@override
@JsonKey()
final bool skipNonMusic;
@override
@JsonKey()
final bool systemTitleBar;
@override
@JsonKey()
final CloseBehavior closeBehavior;
@override
@JsonKey(
fromJson: UserPreferences._accentColorSchemeFromJson,
toJson: UserPreferences._accentColorSchemeToJson,
readValue: UserPreferences._accentColorSchemeReadValue)
final SpotubeColor accentColorScheme;
@override
@JsonKey()
final LayoutMode layoutMode;
@override
@JsonKey(
fromJson: UserPreferences._localeFromJson,
toJson: UserPreferences._localeToJson,
readValue: UserPreferences._localeReadValue)
final Locale locale;
@override
@JsonKey()
final Market recommendationMarket;
@override
@JsonKey()
final SearchMode searchMode;
@override
@JsonKey()
final String downloadLocation;
final List<String> _localLibraryLocation;
@override
@JsonKey()
List<String> get localLibraryLocation {
if (_localLibraryLocation is EqualUnmodifiableListView)
return _localLibraryLocation;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_localLibraryLocation);
}
@override
@JsonKey()
final String pipedInstance;
@override
@JsonKey()
final ThemeMode themeMode;
@override
@JsonKey()
final AudioSource audioSource;
@override
@JsonKey()
final SourceCodecs streamMusicCodec;
@override
@JsonKey()
final SourceCodecs downloadMusicCodec;
@override
@JsonKey()
final bool discordPresence;
@override
@JsonKey()
final bool endlessPlayback;
@override
@JsonKey()
final bool enableConnect;
@override
String toString() {
return 'UserPreferences(audioQuality: $audioQuality, albumColorSync: $albumColorSync, amoledDarkTheme: $amoledDarkTheme, checkUpdate: $checkUpdate, normalizeAudio: $normalizeAudio, showSystemTrayIcon: $showSystemTrayIcon, skipNonMusic: $skipNonMusic, systemTitleBar: $systemTitleBar, closeBehavior: $closeBehavior, accentColorScheme: $accentColorScheme, layoutMode: $layoutMode, locale: $locale, recommendationMarket: $recommendationMarket, searchMode: $searchMode, downloadLocation: $downloadLocation, localLibraryLocation: $localLibraryLocation, pipedInstance: $pipedInstance, themeMode: $themeMode, audioSource: $audioSource, streamMusicCodec: $streamMusicCodec, downloadMusicCodec: $downloadMusicCodec, discordPresence: $discordPresence, endlessPlayback: $endlessPlayback, enableConnect: $enableConnect)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$UserPreferencesImpl &&
(identical(other.audioQuality, audioQuality) ||
other.audioQuality == audioQuality) &&
(identical(other.albumColorSync, albumColorSync) ||
other.albumColorSync == albumColorSync) &&
(identical(other.amoledDarkTheme, amoledDarkTheme) ||
other.amoledDarkTheme == amoledDarkTheme) &&
(identical(other.checkUpdate, checkUpdate) ||
other.checkUpdate == checkUpdate) &&
(identical(other.normalizeAudio, normalizeAudio) ||
other.normalizeAudio == normalizeAudio) &&
(identical(other.showSystemTrayIcon, showSystemTrayIcon) ||
other.showSystemTrayIcon == showSystemTrayIcon) &&
(identical(other.skipNonMusic, skipNonMusic) ||
other.skipNonMusic == skipNonMusic) &&
(identical(other.systemTitleBar, systemTitleBar) ||
other.systemTitleBar == systemTitleBar) &&
(identical(other.closeBehavior, closeBehavior) ||
other.closeBehavior == closeBehavior) &&
(identical(other.accentColorScheme, accentColorScheme) ||
other.accentColorScheme == accentColorScheme) &&
(identical(other.layoutMode, layoutMode) ||
other.layoutMode == layoutMode) &&
(identical(other.locale, locale) || other.locale == locale) &&
(identical(other.recommendationMarket, recommendationMarket) ||
other.recommendationMarket == recommendationMarket) &&
(identical(other.searchMode, searchMode) ||
other.searchMode == searchMode) &&
(identical(other.downloadLocation, downloadLocation) ||
other.downloadLocation == downloadLocation) &&
const DeepCollectionEquality()
.equals(other._localLibraryLocation, _localLibraryLocation) &&
(identical(other.pipedInstance, pipedInstance) ||
other.pipedInstance == pipedInstance) &&
(identical(other.themeMode, themeMode) ||
other.themeMode == themeMode) &&
(identical(other.audioSource, audioSource) ||
other.audioSource == audioSource) &&
(identical(other.streamMusicCodec, streamMusicCodec) ||
other.streamMusicCodec == streamMusicCodec) &&
(identical(other.downloadMusicCodec, downloadMusicCodec) ||
other.downloadMusicCodec == downloadMusicCodec) &&
(identical(other.discordPresence, discordPresence) ||
other.discordPresence == discordPresence) &&
(identical(other.endlessPlayback, endlessPlayback) ||
other.endlessPlayback == endlessPlayback) &&
(identical(other.enableConnect, enableConnect) ||
other.enableConnect == enableConnect));
}
@JsonKey(ignore: true)
@override
int get hashCode => Object.hashAll([
runtimeType,
audioQuality,
albumColorSync,
amoledDarkTheme,
checkUpdate,
normalizeAudio,
showSystemTrayIcon,
skipNonMusic,
systemTitleBar,
closeBehavior,
accentColorScheme,
layoutMode,
locale,
recommendationMarket,
searchMode,
downloadLocation,
const DeepCollectionEquality().hash(_localLibraryLocation),
pipedInstance,
themeMode,
audioSource,
streamMusicCodec,
downloadMusicCodec,
discordPresence,
endlessPlayback,
enableConnect
]);
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$UserPreferencesImplCopyWith<_$UserPreferencesImpl> get copyWith =>
__$$UserPreferencesImplCopyWithImpl<_$UserPreferencesImpl>(
this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$UserPreferencesImplToJson(
this,
);
}
}
abstract class _UserPreferences implements UserPreferences {
const factory _UserPreferences(
{final SourceQualities audioQuality,
final bool albumColorSync,
final bool amoledDarkTheme,
final bool checkUpdate,
final bool normalizeAudio,
final bool showSystemTrayIcon,
final bool skipNonMusic,
final bool systemTitleBar,
final CloseBehavior closeBehavior,
@JsonKey(
fromJson: UserPreferences._accentColorSchemeFromJson,
toJson: UserPreferences._accentColorSchemeToJson,
readValue: UserPreferences._accentColorSchemeReadValue)
final SpotubeColor accentColorScheme,
final LayoutMode layoutMode,
@JsonKey(
fromJson: UserPreferences._localeFromJson,
toJson: UserPreferences._localeToJson,
readValue: UserPreferences._localeReadValue)
final Locale locale,
final Market recommendationMarket,
final SearchMode searchMode,
final String downloadLocation,
final List<String> localLibraryLocation,
final String pipedInstance,
final ThemeMode themeMode,
final AudioSource audioSource,
final SourceCodecs streamMusicCodec,
final SourceCodecs downloadMusicCodec,
final bool discordPresence,
final bool endlessPlayback,
final bool enableConnect}) = _$UserPreferencesImpl;
factory _UserPreferences.fromJson(Map<String, dynamic> json) =
_$UserPreferencesImpl.fromJson;
@override
SourceQualities get audioQuality;
@override
bool get albumColorSync;
@override
bool get amoledDarkTheme;
@override
bool get checkUpdate;
@override
bool get normalizeAudio;
@override
bool get showSystemTrayIcon;
@override
bool get skipNonMusic;
@override
bool get systemTitleBar;
@override
CloseBehavior get closeBehavior;
@override
@JsonKey(
fromJson: UserPreferences._accentColorSchemeFromJson,
toJson: UserPreferences._accentColorSchemeToJson,
readValue: UserPreferences._accentColorSchemeReadValue)
SpotubeColor get accentColorScheme;
@override
LayoutMode get layoutMode;
@override
@JsonKey(
fromJson: UserPreferences._localeFromJson,
toJson: UserPreferences._localeToJson,
readValue: UserPreferences._localeReadValue)
Locale get locale;
@override
Market get recommendationMarket;
@override
SearchMode get searchMode;
@override
String get downloadLocation;
@override
List<String> get localLibraryLocation;
@override
String get pipedInstance;
@override
ThemeMode get themeMode;
@override
AudioSource get audioSource;
@override
SourceCodecs get streamMusicCodec;
@override
SourceCodecs get downloadMusicCodec;
@override
bool get discordPresence;
@override
bool get endlessPlayback;
@override
bool get enableConnect;
@override
@JsonKey(ignore: true)
_$$UserPreferencesImplCopyWith<_$UserPreferencesImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@ -1,388 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'user_preferences_state.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$UserPreferencesImpl _$$UserPreferencesImplFromJson(Map json) =>
_$UserPreferencesImpl(
audioQuality:
$enumDecodeNullable(_$SourceQualitiesEnumMap, json['audioQuality']) ??
SourceQualities.high,
albumColorSync: json['albumColorSync'] as bool? ?? true,
amoledDarkTheme: json['amoledDarkTheme'] as bool? ?? false,
checkUpdate: json['checkUpdate'] as bool? ?? true,
normalizeAudio: json['normalizeAudio'] as bool? ?? false,
showSystemTrayIcon: json['showSystemTrayIcon'] as bool? ?? false,
skipNonMusic: json['skipNonMusic'] as bool? ?? false,
systemTitleBar: json['systemTitleBar'] as bool? ?? false,
closeBehavior:
$enumDecodeNullable(_$CloseBehaviorEnumMap, json['closeBehavior']) ??
CloseBehavior.close,
accentColorScheme: UserPreferences._accentColorSchemeReadValue(
json, 'accentColorScheme') ==
null
? const SpotubeColor(0xFF2196F3, name: "Blue")
: UserPreferences._accentColorSchemeFromJson(
UserPreferences._accentColorSchemeReadValue(
json, 'accentColorScheme') as Map<String, dynamic>),
layoutMode:
$enumDecodeNullable(_$LayoutModeEnumMap, json['layoutMode']) ??
LayoutMode.adaptive,
locale: UserPreferences._localeReadValue(json, 'locale') == null
? const Locale("system", "system")
: UserPreferences._localeFromJson(
UserPreferences._localeReadValue(json, 'locale')
as Map<String, dynamic>),
recommendationMarket:
$enumDecodeNullable(_$MarketEnumMap, json['recommendationMarket']) ??
Market.US,
searchMode:
$enumDecodeNullable(_$SearchModeEnumMap, json['searchMode']) ??
SearchMode.youtube,
downloadLocation: json['downloadLocation'] as String? ?? "",
localLibraryLocation: (json['localLibraryLocation'] as List<dynamic>?)
?.map((e) => e as String)
.toList() ??
const [],
pipedInstance:
json['pipedInstance'] as String? ?? "https://pipedapi.kavin.rocks",
themeMode: $enumDecodeNullable(_$ThemeModeEnumMap, json['themeMode']) ??
ThemeMode.system,
audioSource:
$enumDecodeNullable(_$AudioSourceEnumMap, json['audioSource']) ??
AudioSource.youtube,
streamMusicCodec: $enumDecodeNullable(
_$SourceCodecsEnumMap, json['streamMusicCodec']) ??
SourceCodecs.weba,
downloadMusicCodec: $enumDecodeNullable(
_$SourceCodecsEnumMap, json['downloadMusicCodec']) ??
SourceCodecs.m4a,
discordPresence: json['discordPresence'] as bool? ?? true,
endlessPlayback: json['endlessPlayback'] as bool? ?? true,
enableConnect: json['enableConnect'] as bool? ?? false,
);
Map<String, dynamic> _$$UserPreferencesImplToJson(
_$UserPreferencesImpl instance) =>
<String, dynamic>{
'audioQuality': _$SourceQualitiesEnumMap[instance.audioQuality]!,
'albumColorSync': instance.albumColorSync,
'amoledDarkTheme': instance.amoledDarkTheme,
'checkUpdate': instance.checkUpdate,
'normalizeAudio': instance.normalizeAudio,
'showSystemTrayIcon': instance.showSystemTrayIcon,
'skipNonMusic': instance.skipNonMusic,
'systemTitleBar': instance.systemTitleBar,
'closeBehavior': _$CloseBehaviorEnumMap[instance.closeBehavior]!,
'accentColorScheme':
UserPreferences._accentColorSchemeToJson(instance.accentColorScheme),
'layoutMode': _$LayoutModeEnumMap[instance.layoutMode]!,
'locale': UserPreferences._localeToJson(instance.locale),
'recommendationMarket': _$MarketEnumMap[instance.recommendationMarket]!,
'searchMode': _$SearchModeEnumMap[instance.searchMode]!,
'downloadLocation': instance.downloadLocation,
'localLibraryLocation': instance.localLibraryLocation,
'pipedInstance': instance.pipedInstance,
'themeMode': _$ThemeModeEnumMap[instance.themeMode]!,
'audioSource': _$AudioSourceEnumMap[instance.audioSource]!,
'streamMusicCodec': _$SourceCodecsEnumMap[instance.streamMusicCodec]!,
'downloadMusicCodec': _$SourceCodecsEnumMap[instance.downloadMusicCodec]!,
'discordPresence': instance.discordPresence,
'endlessPlayback': instance.endlessPlayback,
'enableConnect': instance.enableConnect,
};
const _$SourceQualitiesEnumMap = {
SourceQualities.high: 'high',
SourceQualities.medium: 'medium',
SourceQualities.low: 'low',
};
const _$CloseBehaviorEnumMap = {
CloseBehavior.minimizeToTray: 'minimizeToTray',
CloseBehavior.close: 'close',
};
const _$LayoutModeEnumMap = {
LayoutMode.compact: 'compact',
LayoutMode.extended: 'extended',
LayoutMode.adaptive: 'adaptive',
};
const _$MarketEnumMap = {
Market.AD: 'AD',
Market.AE: 'AE',
Market.AF: 'AF',
Market.AG: 'AG',
Market.AI: 'AI',
Market.AL: 'AL',
Market.AM: 'AM',
Market.AO: 'AO',
Market.AQ: 'AQ',
Market.AR: 'AR',
Market.AS: 'AS',
Market.AT: 'AT',
Market.AU: 'AU',
Market.AW: 'AW',
Market.AX: 'AX',
Market.AZ: 'AZ',
Market.BA: 'BA',
Market.BB: 'BB',
Market.BD: 'BD',
Market.BE: 'BE',
Market.BF: 'BF',
Market.BG: 'BG',
Market.BH: 'BH',
Market.BI: 'BI',
Market.BJ: 'BJ',
Market.BL: 'BL',
Market.BM: 'BM',
Market.BN: 'BN',
Market.BO: 'BO',
Market.BQ: 'BQ',
Market.BR: 'BR',
Market.BS: 'BS',
Market.BT: 'BT',
Market.BV: 'BV',
Market.BW: 'BW',
Market.BY: 'BY',
Market.BZ: 'BZ',
Market.CA: 'CA',
Market.CC: 'CC',
Market.CD: 'CD',
Market.CF: 'CF',
Market.CG: 'CG',
Market.CH: 'CH',
Market.CI: 'CI',
Market.CK: 'CK',
Market.CL: 'CL',
Market.CM: 'CM',
Market.CN: 'CN',
Market.CO: 'CO',
Market.CR: 'CR',
Market.CU: 'CU',
Market.CV: 'CV',
Market.CW: 'CW',
Market.CX: 'CX',
Market.CY: 'CY',
Market.CZ: 'CZ',
Market.DE: 'DE',
Market.DJ: 'DJ',
Market.DK: 'DK',
Market.DM: 'DM',
Market.DO: 'DO',
Market.DZ: 'DZ',
Market.EC: 'EC',
Market.EE: 'EE',
Market.EG: 'EG',
Market.EH: 'EH',
Market.ER: 'ER',
Market.ES: 'ES',
Market.ET: 'ET',
Market.FI: 'FI',
Market.FJ: 'FJ',
Market.FK: 'FK',
Market.FM: 'FM',
Market.FO: 'FO',
Market.FR: 'FR',
Market.GA: 'GA',
Market.GB: 'GB',
Market.GD: 'GD',
Market.GE: 'GE',
Market.GF: 'GF',
Market.GG: 'GG',
Market.GH: 'GH',
Market.GI: 'GI',
Market.GL: 'GL',
Market.GM: 'GM',
Market.GN: 'GN',
Market.GP: 'GP',
Market.GQ: 'GQ',
Market.GR: 'GR',
Market.GS: 'GS',
Market.GT: 'GT',
Market.GU: 'GU',
Market.GW: 'GW',
Market.GY: 'GY',
Market.HK: 'HK',
Market.HM: 'HM',
Market.HN: 'HN',
Market.HR: 'HR',
Market.HT: 'HT',
Market.HU: 'HU',
Market.ID: 'ID',
Market.IE: 'IE',
Market.IL: 'IL',
Market.IM: 'IM',
Market.IN: 'IN',
Market.IO: 'IO',
Market.IQ: 'IQ',
Market.IR: 'IR',
Market.IS: 'IS',
Market.IT: 'IT',
Market.JE: 'JE',
Market.JM: 'JM',
Market.JO: 'JO',
Market.JP: 'JP',
Market.KE: 'KE',
Market.KG: 'KG',
Market.KH: 'KH',
Market.KI: 'KI',
Market.KM: 'KM',
Market.KN: 'KN',
Market.KP: 'KP',
Market.KR: 'KR',
Market.KW: 'KW',
Market.KY: 'KY',
Market.KZ: 'KZ',
Market.LA: 'LA',
Market.LB: 'LB',
Market.LC: 'LC',
Market.LI: 'LI',
Market.LK: 'LK',
Market.LR: 'LR',
Market.LS: 'LS',
Market.LT: 'LT',
Market.LU: 'LU',
Market.LV: 'LV',
Market.LY: 'LY',
Market.MA: 'MA',
Market.MC: 'MC',
Market.MD: 'MD',
Market.ME: 'ME',
Market.MF: 'MF',
Market.MG: 'MG',
Market.MH: 'MH',
Market.MK: 'MK',
Market.ML: 'ML',
Market.MM: 'MM',
Market.MN: 'MN',
Market.MO: 'MO',
Market.MP: 'MP',
Market.MQ: 'MQ',
Market.MR: 'MR',
Market.MS: 'MS',
Market.MT: 'MT',
Market.MU: 'MU',
Market.MV: 'MV',
Market.MW: 'MW',
Market.MX: 'MX',
Market.MY: 'MY',
Market.MZ: 'MZ',
Market.NA: 'NA',
Market.NC: 'NC',
Market.NE: 'NE',
Market.NF: 'NF',
Market.NG: 'NG',
Market.NI: 'NI',
Market.NL: 'NL',
Market.NO: 'NO',
Market.NP: 'NP',
Market.NR: 'NR',
Market.NU: 'NU',
Market.NZ: 'NZ',
Market.OM: 'OM',
Market.PA: 'PA',
Market.PE: 'PE',
Market.PF: 'PF',
Market.PG: 'PG',
Market.PH: 'PH',
Market.PK: 'PK',
Market.PL: 'PL',
Market.PM: 'PM',
Market.PN: 'PN',
Market.PR: 'PR',
Market.PS: 'PS',
Market.PT: 'PT',
Market.PW: 'PW',
Market.PY: 'PY',
Market.QA: 'QA',
Market.RE: 'RE',
Market.RO: 'RO',
Market.RS: 'RS',
Market.RU: 'RU',
Market.RW: 'RW',
Market.SA: 'SA',
Market.SB: 'SB',
Market.SC: 'SC',
Market.SD: 'SD',
Market.SE: 'SE',
Market.SG: 'SG',
Market.SH: 'SH',
Market.SI: 'SI',
Market.SJ: 'SJ',
Market.SK: 'SK',
Market.SL: 'SL',
Market.SM: 'SM',
Market.SN: 'SN',
Market.SO: 'SO',
Market.SR: 'SR',
Market.SS: 'SS',
Market.ST: 'ST',
Market.SV: 'SV',
Market.SX: 'SX',
Market.SY: 'SY',
Market.SZ: 'SZ',
Market.TC: 'TC',
Market.TD: 'TD',
Market.TF: 'TF',
Market.TG: 'TG',
Market.TH: 'TH',
Market.TJ: 'TJ',
Market.TK: 'TK',
Market.TL: 'TL',
Market.TM: 'TM',
Market.TN: 'TN',
Market.TO: 'TO',
Market.TR: 'TR',
Market.TT: 'TT',
Market.TV: 'TV',
Market.TW: 'TW',
Market.TZ: 'TZ',
Market.UA: 'UA',
Market.UG: 'UG',
Market.UM: 'UM',
Market.US: 'US',
Market.UY: 'UY',
Market.UZ: 'UZ',
Market.VA: 'VA',
Market.VC: 'VC',
Market.VE: 'VE',
Market.VG: 'VG',
Market.VI: 'VI',
Market.VN: 'VN',
Market.VU: 'VU',
Market.WF: 'WF',
Market.WS: 'WS',
Market.XK: 'XK',
Market.YE: 'YE',
Market.YT: 'YT',
Market.ZA: 'ZA',
Market.ZM: 'ZM',
Market.ZW: 'ZW',
};
const _$SearchModeEnumMap = {
SearchMode.youtube: 'youtube',
SearchMode.youtubeMusic: 'youtubeMusic',
};
const _$ThemeModeEnumMap = {
ThemeMode.system: 'system',
ThemeMode.light: 'light',
ThemeMode.dark: 'dark',
};
const _$AudioSourceEnumMap = {
AudioSource.youtube: 'youtube',
AudioSource.piped: 'piped',
AudioSource.jiosaavn: 'jiosaavn',
};
const _$SourceCodecsEnumMap = {
SourceCodecs.m4a: 'm4a',
SourceCodecs.weba: 'weba',
};

View File

@ -1,5 +1,6 @@
import 'package:piped_client/piped_client.dart'; import 'package:piped_client/piped_client.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart'; import 'package:spotube/models/database/database.dart';
import 'package:youtube_explode_dart/youtube_explode_dart.dart'; import 'package:youtube_explode_dart/youtube_explode_dart.dart';
class YoutubeVideoInfo { class YoutubeVideoInfo {

View File

@ -5,8 +5,9 @@ import 'package:collection/collection.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/enums.dart';
import 'package:spotube/services/sourced_track/exceptions.dart'; import 'package:spotube/services/sourced_track/exceptions.dart';
import 'package:spotube/services/sourced_track/models/source_info.dart'; import 'package:spotube/services/sourced_track/models/source_info.dart';

View File

@ -2,9 +2,10 @@ import 'package:collection/collection.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:piped_client/piped_client.dart'; import 'package:piped_client/piped_client.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/models/source_match.dart'; import 'package:spotube/models/source_match.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/enums.dart';
import 'package:spotube/services/sourced_track/exceptions.dart'; import 'package:spotube/services/sourced_track/exceptions.dart';
import 'package:spotube/services/sourced_track/models/source_info.dart'; import 'package:spotube/services/sourced_track/models/source_info.dart';

View File

@ -13,6 +13,7 @@
#include <local_notifier/local_notifier_plugin.h> #include <local_notifier/local_notifier_plugin.h>
#include <media_kit_libs_linux/media_kit_libs_linux_plugin.h> #include <media_kit_libs_linux/media_kit_libs_linux_plugin.h>
#include <screen_retriever/screen_retriever_plugin.h> #include <screen_retriever/screen_retriever_plugin.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
#include <system_theme/system_theme_plugin.h> #include <system_theme/system_theme_plugin.h>
#include <system_tray/system_tray_plugin.h> #include <system_tray/system_tray_plugin.h>
#include <tray_manager/tray_manager_plugin.h> #include <tray_manager/tray_manager_plugin.h>
@ -41,6 +42,9 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) screen_retriever_registrar = g_autoptr(FlPluginRegistrar) screen_retriever_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin");
screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); screen_retriever_plugin_register_with_registrar(screen_retriever_registrar);
g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin");
sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar);
g_autoptr(FlPluginRegistrar) system_theme_registrar = g_autoptr(FlPluginRegistrar) system_theme_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "SystemThemePlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "SystemThemePlugin");
system_theme_plugin_register_with_registrar(system_theme_registrar); system_theme_plugin_register_with_registrar(system_theme_registrar);

View File

@ -10,6 +10,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
local_notifier local_notifier
media_kit_libs_linux media_kit_libs_linux
screen_retriever screen_retriever
sqlite3_flutter_libs
system_theme system_theme
system_tray system_tray
tray_manager tray_manager

View File

@ -20,6 +20,7 @@ import path_provider_foundation
import screen_retriever import screen_retriever
import shared_preferences_foundation import shared_preferences_foundation
import sqflite import sqflite
import sqlite3_flutter_libs
import system_theme import system_theme
import system_tray import system_tray
import tray_manager import tray_manager
@ -42,6 +43,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin"))
SystemThemePlugin.register(with: registry.registrar(forPlugin: "SystemThemePlugin")) SystemThemePlugin.register(with: registry.registrar(forPlugin: "SystemThemePlugin"))
SystemTrayPlugin.register(with: registry.registrar(forPlugin: "SystemTrayPlugin")) SystemTrayPlugin.register(with: registry.registrar(forPlugin: "SystemTrayPlugin"))
TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin")) TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin"))

View File

@ -39,6 +39,21 @@ PODS:
- sqflite (0.0.3): - sqflite (0.0.3):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- sqlite3 (3.46.0):
- sqlite3/common (= 3.46.0)
- sqlite3/common (3.46.0)
- sqlite3/fts5 (3.46.0):
- sqlite3/common
- sqlite3/perf-threadsafe (3.46.0):
- sqlite3/common
- sqlite3/rtree (3.46.0):
- sqlite3/common
- sqlite3_flutter_libs (0.0.1):
- FlutterMacOS
- sqlite3 (~> 3.46.0)
- sqlite3/fts5
- sqlite3/perf-threadsafe
- sqlite3/rtree
- system_theme (0.0.1): - system_theme (0.0.1):
- FlutterMacOS - FlutterMacOS
- system_tray (0.0.1): - system_tray (0.0.1):
@ -69,6 +84,7 @@ DEPENDENCIES:
- screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`) - screen_retriever (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever/macos`)
- shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`) - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`)
- sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`)
- system_theme (from `Flutter/ephemeral/.symlinks/plugins/system_theme/macos`) - system_theme (from `Flutter/ephemeral/.symlinks/plugins/system_theme/macos`)
- system_tray (from `Flutter/ephemeral/.symlinks/plugins/system_tray/macos`) - system_tray (from `Flutter/ephemeral/.symlinks/plugins/system_tray/macos`)
- tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`) - tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`)
@ -78,6 +94,7 @@ DEPENDENCIES:
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- OrderedSet - OrderedSet
- sqlite3
EXTERNAL SOURCES: EXTERNAL SOURCES:
app_links: app_links:
@ -116,6 +133,8 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
sqflite: sqflite:
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin :path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin
sqlite3_flutter_libs:
:path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos
system_theme: system_theme:
:path: Flutter/ephemeral/.symlinks/plugins/system_theme/macos :path: Flutter/ephemeral/.symlinks/plugins/system_theme/macos
system_tray: system_tray:
@ -147,6 +166,8 @@ SPEC CHECKSUMS:
screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38 screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38
shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
sqlite3: 154b084339ede06960a5b3c8160066adc9176b7d
sqlite3_flutter_libs: 1be4459672f8168ded2d8667599b8e3ca5e72b83
system_theme: c7b9f6659a5caa26c9bc2284da096781e9a6fcbc system_theme: c7b9f6659a5caa26c9bc2284da096781e9a6fcbc
system_tray: e53c972838c69589ff2e77d6d3abfd71332f9e5d system_tray: e53c972838c69589ff2e77d6d3abfd71332f9e5d
tray_manager: 9064e219c56d75c476e46b9a21182087930baf90 tray_manager: 9064e219c56d75c476e46b9a21182087930baf90

View File

@ -289,6 +289,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
charcode:
dependency: transitive
description:
name: charcode
sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306
url: "https://pub.dev"
source: hosted
version: "1.3.1"
checked_yaml: checked_yaml:
dependency: transitive dependency: transitive
description: description:
@ -507,6 +515,22 @@ packages:
url: "https://github.com/thielepaul/flutter-draggable-scrollbar.git" url: "https://github.com/thielepaul/flutter-draggable-scrollbar.git"
source: git source: git
version: "0.1.0" version: "0.1.0"
drift:
dependency: "direct main"
description:
name: drift
sha256: "6acedc562ffeed308049f78fb1906abad3d65714580b6745441ee6d50ec564cd"
url: "https://pub.dev"
source: hosted
version: "2.18.0"
drift_dev:
dependency: "direct dev"
description:
name: drift_dev
sha256: d9b020736ea85fff1568699ce18b89fabb3f0f042e8a7a05e84a3ec20d39acde
url: "https://pub.dev"
source: hosted
version: "2.18.0"
duration: duration:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1997,6 +2021,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.4" version: "2.5.4"
sqlite3:
dependency: "direct main"
description:
name: sqlite3
sha256: b384f598b813b347c5a7e5ffad82cbaff1bec3d1561af267041e66f6f0899295
url: "https://pub.dev"
source: hosted
version: "2.4.3"
sqlite3_flutter_libs:
dependency: "direct main"
description:
name: sqlite3_flutter_libs
sha256: "9f89a7e7dc36eac2035808427eba1c3fbd79e59c3a22093d8dace6d36b1fe89e"
url: "https://pub.dev"
source: hosted
version: "0.5.23"
sqlparser:
dependency: transitive
description:
name: sqlparser
sha256: ade9a67fd70d0369329ed3373208de7ebd8662470e8c396fc8d0d60f9acdfc9f
url: "https://pub.dev"
source: hosted
version: "0.36.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:

View File

@ -121,6 +121,9 @@ dependencies:
tray_manager: ^0.2.2 tray_manager: ^0.2.2
http: ^1.2.1 http: ^1.2.1
riverpod: ^2.5.1 riverpod: ^2.5.1
drift: ^2.18.0
sqlite3_flutter_libs: ^0.5.23
sqlite3: ^2.4.3
dev_dependencies: dev_dependencies:
build_runner: ^2.4.11 build_runner: ^2.4.11
@ -143,6 +146,7 @@ dev_dependencies:
pub_api_client: ^2.4.0 pub_api_client: ^2.4.0
xml: ^6.5.0 xml: ^6.5.0
io: ^1.0.4 io: ^1.0.4
drift_dev: ^2.18.0
dependency_overrides: dependency_overrides:
uuid: ^4.4.0 uuid: ^4.4.0

View File

@ -15,6 +15,7 @@
#include <media_kit_libs_windows_audio/media_kit_libs_windows_audio_plugin_c_api.h> #include <media_kit_libs_windows_audio/media_kit_libs_windows_audio_plugin_c_api.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h> #include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <screen_retriever/screen_retriever_plugin.h> #include <screen_retriever/screen_retriever_plugin.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>
#include <system_theme/system_theme_plugin.h> #include <system_theme/system_theme_plugin.h>
#include <system_tray/system_tray_plugin.h> #include <system_tray/system_tray_plugin.h>
#include <tray_manager/tray_manager_plugin.h> #include <tray_manager/tray_manager_plugin.h>
@ -40,6 +41,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
ScreenRetrieverPluginRegisterWithRegistrar( ScreenRetrieverPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); registry->GetRegistrarForPlugin("ScreenRetrieverPlugin"));
Sqlite3FlutterLibsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin"));
SystemThemePluginRegisterWithRegistrar( SystemThemePluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SystemThemePlugin")); registry->GetRegistrarForPlugin("SystemThemePlugin"));
SystemTrayPluginRegisterWithRegistrar( SystemTrayPluginRegisterWithRegistrar(

View File

@ -12,6 +12,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
media_kit_libs_windows_audio media_kit_libs_windows_audio
permission_handler_windows permission_handler_windows
screen_retriever screen_retriever
sqlite3_flutter_libs
system_theme system_theme
system_tray system_tray
tray_manager tray_manager