fixed Spotube doesn't remember theme setting (#54)

This commit is contained in:
Kingkor Roy Tirtho 2022-04-05 15:05:45 +06:00
parent d62f3ce6a1
commit 46efefe07c
4 changed files with 54 additions and 67 deletions

View File

@ -11,7 +11,6 @@ import 'package:spotube/components/Shared/PageWindowTitleBar.dart';
import 'package:spotube/models/LocalStorageKeys.dart'; import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/SpotifyMarkets.dart'; import 'package:spotube/models/SpotifyMarkets.dart';
import 'package:spotube/provider/Auth.dart'; import 'package:spotube/provider/Auth.dart';
import 'package:spotube/provider/ThemeProvider.dart';
import 'package:spotube/provider/UserPreferences.dart'; import 'package:spotube/provider/UserPreferences.dart';
class Settings extends HookConsumerWidget { class Settings extends HookConsumerWidget {
@ -20,7 +19,6 @@ class Settings extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
final UserPreferences preferences = ref.watch(userPreferencesProvider); final UserPreferences preferences = ref.watch(userPreferencesProvider);
final ThemeMode theme = ref.watch(themeProvider);
final Auth auth = ref.watch(authProvider); final Auth auth = ref.watch(authProvider);
var geniusAccessToken = useState<String?>(null); var geniusAccessToken = useState<String?>(null);
TextEditingController textEditingController = useTextEditingController(); TextEditingController textEditingController = useTextEditingController();
@ -115,7 +113,7 @@ class Settings extends HookConsumerWidget {
children: [ children: [
const Text("Theme"), const Text("Theme"),
DropdownButton<ThemeMode>( DropdownButton<ThemeMode>(
value: theme, value: preferences.themeMode,
items: const [ items: const [
DropdownMenuItem( DropdownMenuItem(
child: Text( child: Text(
@ -136,7 +134,7 @@ class Settings extends HookConsumerWidget {
], ],
onChanged: (value) { onChanged: (value) {
if (value != null) { if (value != null) {
ref.read(themeProvider.notifier).state = value; preferences.setThemeMode(value);
} }
}, },
) )

View File

@ -6,12 +6,10 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:hotkey_manager/hotkey_manager.dart'; import 'package:hotkey_manager/hotkey_manager.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:spotube/models/GoRouteDeclarations.dart'; import 'package:spotube/models/GoRouteDeclarations.dart';
import 'package:spotube/models/LocalStorageKeys.dart';
import 'package:spotube/models/Logger.dart'; import 'package:spotube/models/Logger.dart';
import 'package:spotube/provider/AudioPlayer.dart'; import 'package:spotube/provider/AudioPlayer.dart';
import 'package:spotube/provider/ThemeProvider.dart'; import 'package:spotube/provider/UserPreferences.dart';
import 'package:spotube/provider/YouTube.dart'; import 'package:spotube/provider/YouTube.dart';
import 'package:just_audio_background/just_audio_background.dart'; import 'package:just_audio_background/just_audio_background.dart';
@ -44,25 +42,11 @@ class MyApp extends HookConsumerWidget {
MyApp({Key? key}) : super(key: key); MyApp({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context, ref) { Widget build(BuildContext context, ref) {
var themeMode = ref.watch(themeProvider); var themeMode =
ref.watch(userPreferencesProvider.select((s) => s.themeMode));
var player = ref.watch(audioPlayerProvider); var player = ref.watch(audioPlayerProvider);
var youtube = ref.watch(youtubeProvider); var youtube = ref.watch(youtubeProvider);
useEffect(() { useEffect(() {
SharedPreferences.getInstance().then((localStorage) {
String? themeMode = localStorage.getString(LocalStorageKeys.themeMode);
var themeNotifier = ref.read(themeProvider.notifier);
switch (themeMode) {
case "light":
themeNotifier.state = ThemeMode.light;
break;
case "dark":
themeNotifier.state = ThemeMode.dark;
break;
default:
themeNotifier.state = ThemeMode.system;
}
});
return () { return () {
player.dispose(); player.dispose();
youtube.close(); youtube.close();

View File

@ -1,6 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
var themeProvider = StateProvider<ThemeMode>((ref) {
return ThemeMode.system;
});

View File

@ -1,6 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hotkey_manager/hotkey_manager.dart'; import 'package:hotkey_manager/hotkey_manager.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@ -10,15 +10,18 @@ import 'package:spotube/models/Logger.dart';
import 'package:spotube/models/generated_secrets.dart'; import 'package:spotube/models/generated_secrets.dart';
class UserPreferences extends ChangeNotifier { class UserPreferences extends ChangeNotifier {
ThemeMode themeMode;
String recommendationMarket; String recommendationMarket;
bool saveTrackLyrics; bool saveTrackLyrics;
String geniusAccessToken; String geniusAccessToken;
SharedPreferences? localStorage;
HotKey? nextTrackHotKey; HotKey? nextTrackHotKey;
HotKey? prevTrackHotKey; HotKey? prevTrackHotKey;
HotKey? playPauseHotKey; HotKey? playPauseHotKey;
UserPreferences({ UserPreferences({
required this.geniusAccessToken, required this.geniusAccessToken,
required this.recommendationMarket, required this.recommendationMarket,
required this.themeMode,
this.saveTrackLyrics = false, this.saveTrackLyrics = false,
this.nextTrackHotKey, this.nextTrackHotKey,
this.prevTrackHotKey, this.prevTrackHotKey,
@ -29,9 +32,8 @@ class UserPreferences extends ChangeNotifier {
final logger = getLogger(UserPreferences); final logger = getLogger(UserPreferences);
Future<HotKey?> _getHotKeyFromLocalStorage( Future<HotKey?> _getHotKeyFromLocalStorage(String key) async {
SharedPreferences preferences, String key) async { String? str = localStorage?.getString(key);
String? str = preferences.getString(key);
if (str != null) { if (str != null) {
Map<String, dynamic> json = await jsonDecode(str); Map<String, dynamic> json = await jsonDecode(str);
if (json.isEmpty) { if (json.isEmpty) {
@ -44,21 +46,33 @@ class UserPreferences extends ChangeNotifier {
Future<void> onInit() async { Future<void> onInit() async {
try { try {
SharedPreferences localStorage = await SharedPreferences.getInstance(); localStorage = await SharedPreferences.getInstance();
String? accessToken = String? accessToken =
localStorage.getString(LocalStorageKeys.geniusAccessToken); localStorage?.getString(LocalStorageKeys.geniusAccessToken);
saveTrackLyrics = saveTrackLyrics =
localStorage.getBool(LocalStorageKeys.saveTrackLyrics) ?? false; localStorage?.getBool(LocalStorageKeys.saveTrackLyrics) ?? false;
final themeModeRaw = localStorage?.getString(LocalStorageKeys.themeMode);
switch (themeModeRaw) {
case "light":
themeMode = ThemeMode.light;
break;
case "dark":
themeMode = ThemeMode.dark;
break;
default:
themeMode = ThemeMode.system;
}
recommendationMarket = recommendationMarket =
localStorage.getString(LocalStorageKeys.recommendationMarket) ?? 'US'; localStorage?.getString(LocalStorageKeys.recommendationMarket) ??
'US';
geniusAccessToken = accessToken != null && accessToken.isNotEmpty geniusAccessToken = accessToken != null && accessToken.isNotEmpty
? accessToken ? accessToken
: getRandomElement(lyricsSecrets); : getRandomElement(lyricsSecrets);
nextTrackHotKey ??= (await _getHotKeyFromLocalStorage( nextTrackHotKey ??= (await _getHotKeyFromLocalStorage(
localStorage,
LocalStorageKeys.nextTrackHotKey, LocalStorageKeys.nextTrackHotKey,
)) ?? )) ??
HotKey( HotKey(
@ -67,7 +81,6 @@ class UserPreferences extends ChangeNotifier {
); );
prevTrackHotKey ??= (await _getHotKeyFromLocalStorage( prevTrackHotKey ??= (await _getHotKeyFromLocalStorage(
localStorage,
LocalStorageKeys.prevTrackHotKey, LocalStorageKeys.prevTrackHotKey,
)) ?? )) ??
HotKey( HotKey(
@ -76,7 +89,6 @@ class UserPreferences extends ChangeNotifier {
); );
playPauseHotKey ??= (await _getHotKeyFromLocalStorage( playPauseHotKey ??= (await _getHotKeyFromLocalStorage(
localStorage,
LocalStorageKeys.playPauseHotKey, LocalStorageKeys.playPauseHotKey,
)) ?? )) ??
HotKey( HotKey(
@ -89,20 +101,21 @@ class UserPreferences extends ChangeNotifier {
} }
} }
void setThemeMode(ThemeMode mode) {
themeMode = mode;
localStorage?.setString(LocalStorageKeys.themeMode, mode.name);
notifyListeners();
}
void setSaveTrackLyrics(bool shouldSave) { void setSaveTrackLyrics(bool shouldSave) {
saveTrackLyrics = shouldSave; saveTrackLyrics = shouldSave;
SharedPreferences.getInstance().then((value) { localStorage?.setBool(LocalStorageKeys.saveTrackLyrics, shouldSave);
value.setBool(LocalStorageKeys.saveTrackLyrics, shouldSave); notifyListeners();
notifyListeners();
});
} }
void setRecommendationMarket(String country) { void setRecommendationMarket(String country) {
recommendationMarket = country; recommendationMarket = country;
SharedPreferences.getInstance().then((value) { localStorage?.setString(LocalStorageKeys.recommendationMarket, country);
value.setString(LocalStorageKeys.recommendationMarket, country);
notifyListeners();
});
} }
void setGeniusAccessToken(String token) { void setGeniusAccessToken(String token) {
@ -112,38 +125,36 @@ class UserPreferences extends ChangeNotifier {
void setNextTrackHotKey(HotKey? value) { void setNextTrackHotKey(HotKey? value) {
nextTrackHotKey = value; nextTrackHotKey = value;
SharedPreferences.getInstance().then((preferences) { localStorage?.setString(
preferences.setString( LocalStorageKeys.nextTrackHotKey,
LocalStorageKeys.nextTrackHotKey, jsonEncode(value?.toJson() ?? {}),
jsonEncode(value?.toJson() ?? {}), );
);
});
notifyListeners(); notifyListeners();
} }
void setPrevTrackHotKey(HotKey? value) { void setPrevTrackHotKey(HotKey? value) {
prevTrackHotKey = value; prevTrackHotKey = value;
SharedPreferences.getInstance().then((preferences) { localStorage?.setString(
preferences.setString( LocalStorageKeys.prevTrackHotKey,
LocalStorageKeys.prevTrackHotKey, jsonEncode(value?.toJson() ?? {}),
jsonEncode(value?.toJson() ?? {}), );
);
});
notifyListeners(); notifyListeners();
} }
void setPlayPauseHotKey(HotKey? value) { void setPlayPauseHotKey(HotKey? value) {
playPauseHotKey = value; playPauseHotKey = value;
SharedPreferences.getInstance().then((preferences) { localStorage?.setString(
preferences.setString( LocalStorageKeys.playPauseHotKey,
LocalStorageKeys.playPauseHotKey, jsonEncode(value?.toJson() ?? {}),
jsonEncode(value?.toJson() ?? {}), );
);
});
notifyListeners(); notifyListeners();
} }
} }
final userPreferencesProvider = ChangeNotifierProvider( final userPreferencesProvider = ChangeNotifierProvider(
(_) => UserPreferences(geniusAccessToken: "", recommendationMarket: 'US'), (_) => UserPreferences(
geniusAccessToken: "",
recommendationMarket: 'US',
themeMode: ThemeMode.system,
),
); );