import 'dart:convert'; import 'package:encrypt/encrypt.dart'; import 'package:rhythm_box/services/wm_tools.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uuid/uuid.dart'; abstract class KVStoreService { static SharedPreferences? _sharedPreferences; static SharedPreferences get sharedPreferences => _sharedPreferences!; static Future initialize() async { _sharedPreferences = await SharedPreferences.getInstance(); } static bool get doneGettingStarted => sharedPreferences.getBool('doneGettingStarted') ?? false; static Future setDoneGettingStarted(bool value) async => await sharedPreferences.setBool('doneGettingStarted', value); static bool get askedForBatteryOptimization => sharedPreferences.getBool('askedForBatteryOptimization') ?? false; static Future setAskedForBatteryOptimization(bool value) async => await sharedPreferences.setBool('askedForBatteryOptimization', value); static List get recentSearches => sharedPreferences.getStringList('recentSearches') ?? []; static Future setRecentSearches(List value) async => await sharedPreferences.setStringList('recentSearches', value); static WindowSize? get windowSize { final raw = sharedPreferences.getString('windowSize'); if (raw == null) { return null; } return WindowSize.fromJson(jsonDecode(raw)); } static Future setWindowSize(WindowSize value) async => await sharedPreferences.setString( 'windowSize', jsonEncode( value.toJson(), ), ); static String get encryptionKey { final value = sharedPreferences.getString('encryption'); final key = const Uuid().v4(); if (value == null) { setEncryptionKey(key); return key; } return value; } static Future setEncryptionKey(String key) async { await sharedPreferences.setString('encryption', key); } static IV get ivKey { final iv = sharedPreferences.getString('iv'); final value = IV.fromSecureRandom(8); if (iv == null) { setIVKey(value); return value; } return IV.fromBase64(iv); } static Future setIVKey(IV iv) async { await sharedPreferences.setString('iv', iv.base64); } static double get volume => sharedPreferences.getDouble('volume') ?? 1.0; static Future setVolume(double value) async => await sharedPreferences.setDouble('volume', value); static bool get hasMigratedToDrift => sharedPreferences.getBool('hasMigratedToDrift') ?? false; static Future setHasMigratedToDrift(bool value) async => await sharedPreferences.setBool('hasMigratedToDrift', value); }