diff --git a/app/lib/app_init.dart b/app/lib/app_init.dart index 1f72564d..11b6a521 100644 --- a/app/lib/app_init.dart +++ b/app/lib/app_init.dart @@ -22,6 +22,9 @@ import 'package:nc_photos/entity/nc_album/data_source.dart'; import 'package:nc_photos/entity/nc_album/repo.dart'; import 'package:nc_photos/entity/person.dart'; import 'package:nc_photos/entity/person/data_source.dart'; +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/entity/pref/provider/shared_preferences.dart'; +import 'package:nc_photos/entity/pref_util.dart' as pref_util; import 'package:nc_photos/entity/search.dart'; import 'package:nc_photos/entity/search/data_source.dart'; import 'package:nc_photos/entity/share.dart'; @@ -42,8 +45,6 @@ import 'package:nc_photos/mobile/platform.dart' import 'package:nc_photos/mobile/self_signed_cert_manager.dart'; import 'package:nc_photos/platform/features.dart' as features; import 'package:nc_photos/platform/k.dart' as platform_k; -import 'package:nc_photos/pref.dart'; -import 'package:nc_photos/pref_util.dart' as pref_util; import 'package:nc_photos/touch_manager.dart'; import 'package:visibility_detector/visibility_detector.dart'; diff --git a/app/lib/bloc/scan_account_dir.dart b/app/lib/bloc/scan_account_dir.dart index 370ec169..9029c7cc 100644 --- a/app/lib/bloc/scan_account_dir.dart +++ b/app/lib/bloc/scan_account_dir.dart @@ -12,11 +12,11 @@ import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/event/native_event.dart'; import 'package:nc_photos/exception.dart'; import 'package:nc_photos/platform/k.dart' as platform_k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/progress_util.dart'; import 'package:nc_photos/throttler.dart'; import 'package:nc_photos/use_case/ls.dart'; diff --git a/app/lib/controller/account_pref_controller.dart b/app/lib/controller/account_pref_controller.dart index edcdf24f..6ed8a009 100644 --- a/app/lib/controller/account_pref_controller.dart +++ b/app/lib/controller/account_pref_controller.dart @@ -1,6 +1,6 @@ import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; -import 'package:nc_photos/pref.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:np_codegen/np_codegen.dart'; import 'package:rxdart/rxdart.dart'; diff --git a/app/lib/controller/pref_controller.dart b/app/lib/controller/pref_controller.dart index 39d1646c..428e2fe3 100644 --- a/app/lib/controller/pref_controller.dart +++ b/app/lib/controller/pref_controller.dart @@ -1,5 +1,6 @@ import 'package:logging/logging.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/lazy.dart'; import 'package:np_codegen/np_codegen.dart'; diff --git a/app/lib/di_container.dart b/app/lib/di_container.dart index e2fcc408..cbb6b1e0 100644 --- a/app/lib/di_container.dart +++ b/app/lib/di_container.dart @@ -6,6 +6,7 @@ import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/local_file.dart'; import 'package:nc_photos/entity/nc_album/repo.dart'; import 'package:nc_photos/entity/person.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/search.dart'; import 'package:nc_photos/entity/share.dart'; import 'package:nc_photos/entity/sharee.dart'; @@ -13,7 +14,6 @@ import 'package:nc_photos/entity/sqlite/database.dart' as sql; import 'package:nc_photos/entity/tag.dart'; import 'package:nc_photos/entity/tagged_file.dart'; import 'package:nc_photos/or_null.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/touch_manager.dart'; enum DiType { diff --git a/app/lib/entity/collection/adapter/memory.dart b/app/lib/entity/collection/adapter/memory.dart index eea3948f..c43c1a3b 100644 --- a/app/lib/entity/collection/adapter/memory.dart +++ b/app/lib/entity/collection/adapter/memory.dart @@ -8,6 +8,7 @@ import 'package:nc_photos/entity/collection_item.dart'; import 'package:nc_photos/entity/collection_item/basic_item.dart'; import 'package:nc_photos/entity/file/data_source.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/use_case/list_location_file.dart'; class CollectionMemoryAdapter diff --git a/app/lib/entity/pref.dart b/app/lib/entity/pref.dart new file mode 100644 index 00000000..1f7f2fc7 --- /dev/null +++ b/app/lib/entity/pref.dart @@ -0,0 +1,301 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:collection/collection.dart'; +import 'package:event_bus/event_bus.dart'; +import 'package:kiwi/kiwi.dart'; +import 'package:logging/logging.dart'; +import 'package:nc_photos/account.dart'; +import 'package:nc_photos/entity/pref/provider/memory.dart'; +import 'package:nc_photos/event/event.dart'; +import 'package:np_codegen/np_codegen.dart'; + +part 'pref.g.dart'; +part 'pref/extension.dart'; + +@npLog +class Pref { + factory Pref() { + _inst ??= Pref.scoped(PrefMemoryProvider()); + return _inst!; + } + + Pref.scoped(this.provider); + + /// Set the global [Pref] instance returned by the default constructor + static void setGlobalInstance(Pref pref) { + assert(_inst == null); + _inst = pref; + } + + Future _set(PrefKey key, T value, + Future Function(PrefKey key, T value) setFn) async { + if (await setFn(key, value)) { + KiwiContainer().resolve().fire(PrefUpdatedEvent(key, value)); + return true; + } else { + return false; + } + } + + Future _remove(PrefKey key) => provider.remove(key); + + final PrefProvider provider; + + static Pref? _inst; +} + +class AccountPref { + AccountPref.scoped(this.provider); + + static AccountPref of(Account account) { + _insts.putIfAbsent( + account.id, () => AccountPref.scoped(PrefMemoryProvider())); + return _insts[account.id]!; + } + + /// Set the global [AccountPref] instance returned by the default constructor + static void setGlobalInstance(Account account, AccountPref? pref) { + if (pref != null) { + assert(!_insts.containsKey(account.id)); + _insts[account.id] = pref; + } else { + assert(_insts.containsKey(account.id)); + _insts.remove(account.id); + } + } + + bool? isEnableFaceRecognitionApp() => + provider.getBool(PrefKey.isEnableFaceRecognitionApp); + bool isEnableFaceRecognitionAppOr([bool def = true]) => + isEnableFaceRecognitionApp() ?? def; + Future setEnableFaceRecognitionApp(bool value) => _set( + PrefKey.isEnableFaceRecognitionApp, + value, + (key, value) => provider.setBool(key, value)); + + String? getShareFolder() => provider.getString(PrefKey.shareFolder); + String getShareFolderOr([String def = ""]) => getShareFolder() ?? def; + Future setShareFolder(String value) => _set(PrefKey.shareFolder, + value, (key, value) => provider.setString(key, value)); + + bool? hasNewSharedAlbum() => provider.getBool(PrefKey.hasNewSharedAlbum); + bool hasNewSharedAlbumOr([bool def = false]) => hasNewSharedAlbum() ?? def; + Future setNewSharedAlbum(bool value) => _set( + PrefKey.hasNewSharedAlbum, + value, + (key, value) => provider.setBool(key, value)); + + bool? isEnableMemoryAlbum() => provider.getBool(PrefKey.isEnableMemoryAlbum); + bool isEnableMemoryAlbumOr([bool def = false]) => + isEnableMemoryAlbum() ?? def; + Future setEnableMemoryAlbum(bool value) => _set( + PrefKey.isEnableMemoryAlbum, + value, + (key, value) => provider.setBool(key, value)); + + String? getTouchRootEtag() => provider.getString(PrefKey.touchRootEtag); + String getTouchRootEtagOr([String def = ""]) => getTouchRootEtag() ?? def; + Future setTouchRootEtag(String value) => _set( + PrefKey.touchRootEtag, + value, + (key, value) => provider.setString(key, value)); + Future removeTouchRootEtag() => _remove(PrefKey.touchRootEtag); + + String? getAccountLabel() => provider.getString(PrefKey.accountLabel); + String getAccountLabelOr([String def = ""]) => getAccountLabel() ?? def; + Future setAccountLabel(String? value) { + if (value == null) { + return _remove(PrefKey.accountLabel); + } else { + return _set(PrefKey.accountLabel, value, + (key, value) => provider.setString(key, value)); + } + } + + int? getLastNewCollectionType() => + provider.getInt(PrefKey.lastNewCollectionType); + int getLastNewCollectionTypeOr(int def) => getLastNewCollectionType() ?? def; + Future setLastNewCollectionType(int? value) { + if (value == null) { + return _remove(PrefKey.lastNewCollectionType); + } else { + return _set(PrefKey.lastNewCollectionType, value, + (key, value) => provider.setInt(key, value)); + } + } + + Future _set(PrefKey key, T value, + Future Function(PrefKey key, T value) setFn) async { + if (await setFn(key, value)) { + KiwiContainer() + .resolve() + .fire(AccountPrefUpdatedEvent(this, key, value)); + return true; + } else { + return false; + } + } + + Future _remove(PrefKey key) => provider.remove(key); + + final PrefProvider provider; + + static final _insts = {}; +} + +enum PrefKey { + accounts3, + currentAccountIndex, + homePhotosZoomLevel, + albumBrowserZoomLevel, + homeAlbumsSort, + enableExif, + viewerScreenBrightness, + viewerForceRotation, + setupProgress, + lastVersion, + darkTheme, + followSystemTheme, + useBlackInDarkTheme, + language, + labEnableSharedAlbum, + slideshowDuration, + isSlideshowShuffle, + isSlideshowRepeat, + isAlbumBrowserShowDate, + gpsMapProvider, + hasShownSharedAlbumInfo, + enhanceMaxWidth, + enhanceMaxHeight, + hasShownEnhanceInfo, + firstRunTime, + isPhotosTabSortByName, + shouldProcessExifWifiOnly, + doubleTapExit, + memoriesRange, + saveEditResultToServer, + hasShownSaveEditResultDialog, + isSlideshowReverse, + seedColor, + isVideoPlayerMute, + isVideoPlayerLoop, + + // account pref + isEnableFaceRecognitionApp, + shareFolder, + hasNewSharedAlbum, + isEnableMemoryAlbum, + touchRootEtag, + accountLabel, + lastNewCollectionType; + + String toStringKey() { + switch (this) { + case PrefKey.accounts3: + return "accounts3"; + case PrefKey.currentAccountIndex: + return "currentAccountIndex"; + case PrefKey.homePhotosZoomLevel: + return "homePhotosZoomLevel"; + case PrefKey.albumBrowserZoomLevel: + return "albumViewerZoomLevel"; + case PrefKey.homeAlbumsSort: + return "homeAlbumsSort"; + case PrefKey.enableExif: + return "isEnableExif"; + case PrefKey.viewerScreenBrightness: + return "viewerScreenBrightness"; + case PrefKey.viewerForceRotation: + return "viewerForceRotation"; + case PrefKey.setupProgress: + return "setupProgress"; + case PrefKey.lastVersion: + return "lastVersion"; + case PrefKey.darkTheme: + return "isDarkTheme"; + case PrefKey.followSystemTheme: + return "isFollowSystemTheme"; + case PrefKey.useBlackInDarkTheme: + return "isUseBlackInDarkTheme"; + case PrefKey.language: + return "language"; + case PrefKey.labEnableSharedAlbum: + return "isLabEnableSharedAlbum"; + case PrefKey.slideshowDuration: + return "slideshowDuration"; + case PrefKey.isSlideshowShuffle: + return "isSlideshowShuffle"; + case PrefKey.isSlideshowRepeat: + return "isSlideshowRepeat"; + case PrefKey.isAlbumBrowserShowDate: + return "isAlbumBrowserShowDate"; + case PrefKey.gpsMapProvider: + return "gpsMapProvider"; + case PrefKey.hasShownSharedAlbumInfo: + return "hasShownSharedAlbumInfo"; + case PrefKey.enhanceMaxWidth: + return "enhanceMaxWidth"; + case PrefKey.enhanceMaxHeight: + return "enhanceMaxHeight"; + case PrefKey.hasShownEnhanceInfo: + return "hasShownEnhanceInfo"; + case PrefKey.firstRunTime: + return "firstRunTime"; + case PrefKey.isPhotosTabSortByName: + return "isPhotosTabSortByName"; + case PrefKey.shouldProcessExifWifiOnly: + return "shouldProcessExifWifiOnly"; + case PrefKey.doubleTapExit: + return "doubleTapExit"; + case PrefKey.memoriesRange: + return "memoriesRange"; + case PrefKey.saveEditResultToServer: + return "saveEditResultToServer"; + case PrefKey.hasShownSaveEditResultDialog: + return "hasShownSaveEditResultDialog"; + case PrefKey.isSlideshowReverse: + return "isSlideshowReverse"; + case PrefKey.seedColor: + return "seedColor"; + case PrefKey.isVideoPlayerMute: + return "isVideoPlayerMute"; + case PrefKey.isVideoPlayerLoop: + return "isVideoPlayerLoop"; + + // account pref + case PrefKey.isEnableFaceRecognitionApp: + return "isEnableFaceRecognitionApp"; + case PrefKey.shareFolder: + return "shareFolder"; + case PrefKey.hasNewSharedAlbum: + return "hasNewSharedAlbum"; + case PrefKey.isEnableMemoryAlbum: + return "isEnableMemoryAlbum"; + case PrefKey.touchRootEtag: + return "touchRootEtag"; + case PrefKey.accountLabel: + return "accountLabel"; + case PrefKey.lastNewCollectionType: + return "lastNewCollectionType"; + } + } +} + +/// Provide the data for [Pref] +abstract class PrefProvider { + bool? getBool(PrefKey key); + Future setBool(PrefKey key, bool value); + + int? getInt(PrefKey key); + Future setInt(PrefKey key, int value); + + String? getString(PrefKey key); + Future setString(PrefKey key, String value); + + List? getStringList(PrefKey key); + Future setStringList(PrefKey key, List value); + + Future remove(PrefKey key); + Future clear(); +} diff --git a/app/lib/pref.g.dart b/app/lib/entity/pref.g.dart similarity index 100% rename from app/lib/pref.g.dart rename to app/lib/entity/pref.g.dart diff --git a/app/lib/entity/pref/extension.dart b/app/lib/entity/pref/extension.dart new file mode 100644 index 00000000..edb50979 --- /dev/null +++ b/app/lib/entity/pref/extension.dart @@ -0,0 +1,270 @@ +part of '../pref.dart'; + +extension PrefExtension on Pref { + Account? getCurrentAccount() { + try { + return getAccounts3()![getCurrentAccountIndex()!]; + } catch (_) { + return null; + } + } + + List? getAccounts3() { + final jsonObjs = provider.getStringList(PrefKey.accounts3); + return jsonObjs + ?.map((e) => Account.fromJson( + jsonDecode(e), + upgraderV1: const AccountUpgraderV1(), + )) + .where((e) { + if (e == null) { + _log.shout("[getAccounts3] Failed upgrading account"); + } + return true; + }) + .whereNotNull() + .toList(); + } + + List getAccounts3Or(List def) => getAccounts3() ?? def; + Future setAccounts3(List? value) { + if (value == null) { + return _remove(PrefKey.accounts3); + } else { + final jsons = value.map((e) => jsonEncode(e.toJson())).toList(); + return provider.setStringList(PrefKey.accounts3, jsons); + } + } + + int? getCurrentAccountIndex() => provider.getInt(PrefKey.currentAccountIndex); + int getCurrentAccountIndexOr(int def) => getCurrentAccountIndex() ?? def; + Future setCurrentAccountIndex(int? value) { + if (value == null) { + return _remove(PrefKey.currentAccountIndex); + } else { + return _set(PrefKey.currentAccountIndex, value, + (key, value) => provider.setInt(key, value)); + } + } + + int? getHomePhotosZoomLevel() => provider.getInt(PrefKey.homePhotosZoomLevel); + int getHomePhotosZoomLevelOr(int def) => getHomePhotosZoomLevel() ?? def; + Future setHomePhotosZoomLevel(int value) => _set( + PrefKey.homePhotosZoomLevel, + value, + (key, value) => provider.setInt(key, value)); + + int? getAlbumBrowserZoomLevel() => + provider.getInt(PrefKey.albumBrowserZoomLevel); + int getAlbumBrowserZoomLevelOr(int def) => getAlbumBrowserZoomLevel() ?? def; + Future setAlbumBrowserZoomLevel(int value) => _set( + PrefKey.albumBrowserZoomLevel, + value, + (key, value) => provider.setInt(key, value)); + + int? getHomeAlbumsSort() => provider.getInt(PrefKey.homeAlbumsSort); + int getHomeAlbumsSortOr(int def) => getHomeAlbumsSort() ?? def; + Future setHomeAlbumsSort(int value) => _set(PrefKey.homeAlbumsSort, + value, (key, value) => provider.setInt(key, value)); + + bool? isEnableExif() => provider.getBool(PrefKey.enableExif); + bool isEnableExifOr([bool def = true]) => isEnableExif() ?? def; + Future setEnableExif(bool value) => _set( + PrefKey.enableExif, value, (key, value) => provider.setBool(key, value)); + + int? getViewerScreenBrightness() => + provider.getInt(PrefKey.viewerScreenBrightness); + int getViewerScreenBrightnessOr([int def = -1]) => + getViewerScreenBrightness() ?? def; + Future setViewerScreenBrightness(int value) => _set( + PrefKey.viewerScreenBrightness, + value, + (key, value) => provider.setInt(key, value)); + + bool? isViewerForceRotation() => + provider.getBool(PrefKey.viewerForceRotation); + bool isViewerForceRotationOr([bool def = false]) => + isViewerForceRotation() ?? def; + Future setViewerForceRotation(bool value) => _set( + PrefKey.viewerForceRotation, + value, + (key, value) => provider.setBool(key, value)); + + int? getSetupProgress() => provider.getInt(PrefKey.setupProgress); + int getSetupProgressOr([int def = 0]) => getSetupProgress() ?? def; + Future setSetupProgress(int value) => _set(PrefKey.setupProgress, + value, (key, value) => provider.setInt(key, value)); + + /// Return the version number when the app last ran + int? getLastVersion() => provider.getInt(PrefKey.lastVersion); + int getLastVersionOr(int def) => getLastVersion() ?? def; + Future setLastVersion(int value) => _set( + PrefKey.lastVersion, value, (key, value) => provider.setInt(key, value)); + + bool? isDarkTheme() => provider.getBool(PrefKey.darkTheme); + bool isDarkThemeOr(bool def) => isDarkTheme() ?? def; + Future setDarkTheme(bool value) => _set( + PrefKey.darkTheme, value, (key, value) => provider.setBool(key, value)); + + bool? isFollowSystemTheme() => provider.getBool(PrefKey.followSystemTheme); + bool isFollowSystemThemeOr(bool def) => isFollowSystemTheme() ?? def; + Future setFollowSystemTheme(bool value) => _set( + PrefKey.followSystemTheme, + value, + (key, value) => provider.setBool(key, value)); + + bool? isUseBlackInDarkTheme() => + provider.getBool(PrefKey.useBlackInDarkTheme); + bool isUseBlackInDarkThemeOr(bool def) => isUseBlackInDarkTheme() ?? def; + Future setUseBlackInDarkTheme(bool value) => _set( + PrefKey.useBlackInDarkTheme, + value, + (key, value) => provider.setBool(key, value)); + + int? getLanguage() => provider.getInt(PrefKey.language); + int getLanguageOr(int def) => getLanguage() ?? def; + Future setLanguage(int value) => _set( + PrefKey.language, value, (key, value) => provider.setInt(key, value)); + + int? getSlideshowDuration() => provider.getInt(PrefKey.slideshowDuration); + int getSlideshowDurationOr(int def) => getSlideshowDuration() ?? def; + Future setSlideshowDuration(int value) => _set( + PrefKey.slideshowDuration, + value, + (key, value) => provider.setInt(key, value)); + + bool? isSlideshowShuffle() => provider.getBool(PrefKey.isSlideshowShuffle); + bool isSlideshowShuffleOr(bool def) => isSlideshowShuffle() ?? def; + Future setSlideshowShuffle(bool value) => _set( + PrefKey.isSlideshowShuffle, + value, + (key, value) => provider.setBool(key, value)); + + bool? isSlideshowRepeat() => provider.getBool(PrefKey.isSlideshowRepeat); + bool isSlideshowRepeatOr(bool def) => isSlideshowRepeat() ?? def; + Future setSlideshowRepeat(bool value) => _set( + PrefKey.isSlideshowRepeat, + value, + (key, value) => provider.setBool(key, value)); + + bool? isAlbumBrowserShowDate() => + provider.getBool(PrefKey.isAlbumBrowserShowDate); + bool isAlbumBrowserShowDateOr([bool def = false]) => + isAlbumBrowserShowDate() ?? def; + Future setAlbumBrowserShowDate(bool value) => _set( + PrefKey.isAlbumBrowserShowDate, + value, + (key, value) => provider.setBool(key, value)); + + int? getGpsMapProvider() => provider.getInt(PrefKey.gpsMapProvider); + int getGpsMapProviderOr(int def) => getGpsMapProvider() ?? def; + Future setGpsMapProvider(int value) => _set(PrefKey.gpsMapProvider, + value, (key, value) => provider.setInt(key, value)); + + bool? hasShownSharedAlbumInfo() => + provider.getBool(PrefKey.hasShownSharedAlbumInfo); + bool hasShownSharedAlbumInfoOr(bool def) => hasShownSharedAlbumInfo() ?? def; + Future setHasShownSharedAlbumInfo(bool value) => _set( + PrefKey.hasShownSharedAlbumInfo, + value, + (key, value) => provider.setBool(key, value)); + + int? getEnhanceMaxWidth() => provider.getInt(PrefKey.enhanceMaxWidth); + int getEnhanceMaxWidthOr([int def = 2048]) => getEnhanceMaxWidth() ?? def; + Future setEnhanceMaxWidth(int value) => _set( + PrefKey.enhanceMaxWidth, + value, + (key, value) => provider.setInt(key, value)); + + int? getEnhanceMaxHeight() => provider.getInt(PrefKey.enhanceMaxHeight); + int getEnhanceMaxHeightOr([int def = 1536]) => getEnhanceMaxHeight() ?? def; + Future setEnhanceMaxHeight(int value) => _set( + PrefKey.enhanceMaxHeight, + value, + (key, value) => provider.setInt(key, value)); + + bool? hasShownEnhanceInfo() => provider.getBool(PrefKey.hasShownEnhanceInfo); + bool hasShownEnhanceInfoOr([bool def = false]) => + hasShownEnhanceInfo() ?? def; + Future setHasShownEnhanceInfo(bool value) => _set( + PrefKey.hasShownEnhanceInfo, + value, + (key, value) => provider.setBool(key, value)); + + int? getFirstRunTime() => provider.getInt(PrefKey.firstRunTime); + int getFirstRunTimeOr(int def) => getFirstRunTime() ?? def; + Future setFirstRunTime(int value) => _set( + PrefKey.firstRunTime, value, (key, value) => provider.setInt(key, value)); + + bool? isPhotosTabSortByName() => + provider.getBool(PrefKey.isPhotosTabSortByName); + bool isPhotosTabSortByNameOr([bool def = false]) => + isPhotosTabSortByName() ?? def; + Future setPhotosTabSortByName(bool value) => _set( + PrefKey.isPhotosTabSortByName, + value, + (key, value) => provider.setBool(key, value)); + + bool? shouldProcessExifWifiOnly() => + provider.getBool(PrefKey.shouldProcessExifWifiOnly); + bool shouldProcessExifWifiOnlyOr([bool def = true]) => + shouldProcessExifWifiOnly() ?? def; + Future setProcessExifWifiOnly(bool value) => _set( + PrefKey.shouldProcessExifWifiOnly, + value, + (key, value) => provider.setBool(key, value)); + + bool? isDoubleTapExit() => provider.getBool(PrefKey.doubleTapExit); + bool isDoubleTapExitOr([bool def = false]) => isDoubleTapExit() ?? def; + Future setDoubleTapExit(bool value) => _set(PrefKey.doubleTapExit, + value, (key, value) => provider.setBool(key, value)); + + int? getMemoriesRange() => provider.getInt(PrefKey.memoriesRange); + int getMemoriesRangeOr([int def = 2]) => getMemoriesRange() ?? def; + Future setMemoriesRange(int value) => _set(PrefKey.memoriesRange, + value, (key, value) => provider.setInt(key, value)); + + bool? isSaveEditResultToServer() => + provider.getBool(PrefKey.saveEditResultToServer); + bool isSaveEditResultToServerOr([bool def = true]) => + isSaveEditResultToServer() ?? def; + Future setSaveEditResultToServer(bool value) => _set( + PrefKey.saveEditResultToServer, + value, + (key, value) => provider.setBool(key, value)); + + bool? hasShownSaveEditResultDialog() => + provider.getBool(PrefKey.hasShownSaveEditResultDialog); + bool hasShownSaveEditResultDialogOr([bool def = false]) => + hasShownSaveEditResultDialog() ?? def; + Future setHasShownSaveEditResultDialog(bool value) => _set( + PrefKey.hasShownSaveEditResultDialog, + value, + (key, value) => provider.setBool(key, value)); + + bool? isSlideshowReverse() => provider.getBool(PrefKey.isSlideshowReverse); + bool isSlideshowReverseOr(bool def) => isSlideshowReverse() ?? def; + Future setSlideshowReverse(bool value) => _set( + PrefKey.isSlideshowReverse, + value, + (key, value) => provider.setBool(key, value)); + + int? getSeedColor() => provider.getInt(PrefKey.seedColor); + int getSeedColorOr(int def) => getSeedColor() ?? def; + Future setSeedColor(int value) => _set( + PrefKey.seedColor, value, (key, value) => provider.setInt(key, value)); + + bool? isVideoPlayerMute() => provider.getBool(PrefKey.isVideoPlayerMute); + bool isVideoPlayerMuteOr([bool def = false]) => isVideoPlayerMute() ?? def; + Future setVideoPlayerMute(bool value) => _set( + PrefKey.isVideoPlayerMute, + value, + (key, value) => provider.setBool(key, value)); + + bool? isVideoPlayerLoop() => provider.getBool(PrefKey.isVideoPlayerLoop); + bool isVideoPlayerLoopOr([bool def = false]) => isVideoPlayerLoop() ?? def; + Future setVideoPlayerLoop(bool value) => _set( + PrefKey.isVideoPlayerLoop, + value, + (key, value) => provider.setBool(key, value)); +} diff --git a/app/lib/entity/pref/provider/memory.dart b/app/lib/entity/pref/provider/memory.dart new file mode 100644 index 00000000..41ceecdd --- /dev/null +++ b/app/lib/entity/pref/provider/memory.dart @@ -0,0 +1,50 @@ +import 'package:nc_photos/entity/pref.dart'; + +/// [Pref] stored in memory, useful in unit tests +class PrefMemoryProvider extends PrefProvider { + PrefMemoryProvider([ + Map initialData = const {}, + ]) : _data = Map.of(initialData); + + @override + bool? getBool(PrefKey key) => _get(key); + @override + Future setBool(PrefKey key, bool value) => _set(key, value); + + @override + int? getInt(PrefKey key) => _get(key); + @override + Future setInt(PrefKey key, int value) => _set(key, value); + + @override + String? getString(PrefKey key) => _get(key); + @override + Future setString(PrefKey key, String value) => _set(key, value); + + @override + List? getStringList(PrefKey key) => _get>(key); + @override + Future setStringList(PrefKey key, List value) => + _set(key, value); + + @override + Future remove(PrefKey key) async { + _data.remove(key); + return true; + } + + @override + Future clear() async { + _data.clear(); + return true; + } + + T? _get(PrefKey key) => _data[key.toStringKey()]; + + Future _set(PrefKey key, T value) async { + _data[key.toStringKey()] = value; + return true; + } + + final Map _data; +} diff --git a/app/lib/entity/pref/provider/shared_preferences.dart b/app/lib/entity/pref/provider/shared_preferences.dart new file mode 100644 index 00000000..dbd8ee21 --- /dev/null +++ b/app/lib/entity/pref/provider/shared_preferences.dart @@ -0,0 +1,58 @@ +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/mobile/platform.dart' + if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform; +import 'package:nc_photos/use_case/compat/v34.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +/// [Pref] stored with [SharedPreferences] lib +class PrefSharedPreferencesProvider extends PrefProvider { + Future init() async { + // Obsolete, CompatV34 is compatible with pre v32 versions + // if (await CompatV32.isPrefNeedMigration()) { + // await CompatV32.migratePref(); + // } + if (await CompatV34.isPrefNeedMigration()) { + await CompatV34.migratePref(platform.UniversalStorage()); + } + return SharedPreferences.getInstance().then((pref) { + _pref = pref; + }); + } + + @override + bool? getBool(PrefKey key) => _pref.getBool(key.toStringKey()); + + @override + Future setBool(PrefKey key, bool value) => + _pref.setBool(key.toStringKey(), value); + + @override + int? getInt(PrefKey key) => _pref.getInt(key.toStringKey()); + + @override + Future setInt(PrefKey key, int value) => + _pref.setInt(key.toStringKey(), value); + + @override + String? getString(PrefKey key) => _pref.getString(key.toStringKey()); + + @override + Future setString(PrefKey key, String value) => + _pref.setString(key.toStringKey(), value); + + @override + List? getStringList(PrefKey key) => + _pref.getStringList(key.toStringKey()); + + @override + Future setStringList(PrefKey key, List value) => + _pref.setStringList(key.toStringKey(), value); + + @override + Future remove(PrefKey key) => _pref.remove(key.toStringKey()); + + @override + Future clear() => _pref.clear(); + + late SharedPreferences _pref; +} diff --git a/app/lib/entity/pref/provider/universal_storage.dart b/app/lib/entity/pref/provider/universal_storage.dart new file mode 100644 index 00000000..3d7c43f1 --- /dev/null +++ b/app/lib/entity/pref/provider/universal_storage.dart @@ -0,0 +1,66 @@ +import 'dart:convert'; + +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/mobile/platform.dart' + if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform; + +/// [Pref] backed by [UniversalStorage] +class PrefUniversalStorageProvider extends PrefProvider { + PrefUniversalStorageProvider(this.name); + + Future init() async { + final prefStr = await platform.UniversalStorage().getString(name) ?? "{}"; + _data + ..clear() + ..addAll(jsonDecode(prefStr)); + } + + @override + bool? getBool(PrefKey key) => _get(key); + @override + Future setBool(PrefKey key, bool value) => _set(key, value); + + @override + int? getInt(PrefKey key) => _get(key); + @override + Future setInt(PrefKey key, int value) => _set(key, value); + + @override + String? getString(PrefKey key) => _get(key); + @override + Future setString(PrefKey key, String value) => _set(key, value); + + @override + List? getStringList(PrefKey key) => _get>(key); + @override + Future setStringList(PrefKey key, List value) => + _set(key, value); + + @override + Future remove(PrefKey key) async { + final newData = Map.of(_data)..remove(key.toStringKey()); + await platform.UniversalStorage().putString(name, jsonEncode(newData)); + _data.remove(key.toStringKey()); + return true; + } + + @override + Future clear() async { + await platform.UniversalStorage().remove(name); + _data.clear(); + return true; + } + + T? _get(PrefKey key) => _data[key.toStringKey()]; + + Future _set(PrefKey key, T value) async { + final newData = Map.of(_data) + ..addEntries([MapEntry(key.toStringKey(), value)]); + await platform.UniversalStorage().putString(name, jsonEncode(newData)); + _data[key.toStringKey()] = value; + return true; + } + + final String name; + final _data = {}; +} diff --git a/app/lib/pref_util.dart b/app/lib/entity/pref_util.dart similarity index 68% rename from app/lib/pref_util.dart rename to app/lib/entity/pref_util.dart index 156bf34a..9fb5fc2e 100644 --- a/app/lib/pref_util.dart +++ b/app/lib/entity/pref_util.dart @@ -1,5 +1,6 @@ import 'package:nc_photos/account.dart'; -import 'package:nc_photos/pref.dart'; +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/entity/pref/provider/universal_storage.dart'; Future loadAccountPref(Account account) async { final provider = PrefUniversalStorageProvider("accounts/${account.id}/pref"); diff --git a/app/lib/event/event.dart b/app/lib/event/event.dart index eb3abfa8..29b53c19 100644 --- a/app/lib/event/event.dart +++ b/app/lib/event/event.dart @@ -8,8 +8,8 @@ import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/local_file.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/share.dart'; -import 'package:nc_photos/pref.dart'; class AppEventListener { AppEventListener(this._listener); diff --git a/app/lib/language_util.dart b/app/lib/language_util.dart index b9638361..2b165444 100644 --- a/app/lib/language_util.dart +++ b/app/lib/language_util.dart @@ -1,6 +1,6 @@ import 'package:flutter/widgets.dart'; import 'package:nc_photos/app_localizations.dart'; -import 'package:nc_photos/pref.dart'; +import 'package:nc_photos/entity/pref.dart'; class AppLanguage { const AppLanguage(this.langId, this._nativeName, this.isoName, this.locale); diff --git a/app/lib/legacy/sign_in.dart b/app/lib/legacy/sign_in.dart index 4b3ba6df..4d81e50a 100644 --- a/app/lib/legacy/sign_in.dart +++ b/app/lib/legacy/sign_in.dart @@ -6,13 +6,13 @@ import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/entity/pref_util.dart' as pref_util; import 'package:nc_photos/entity/sqlite/database.dart' as sql; import 'package:nc_photos/help_utils.dart' as help_utils; import 'package:nc_photos/iterable_extension.dart'; import 'package:nc_photos/legacy/connect.dart'; import 'package:nc_photos/platform/k.dart' as platform_k; -import 'package:nc_photos/pref.dart'; -import 'package:nc_photos/pref_util.dart' as pref_util; import 'package:nc_photos/theme.dart'; import 'package:nc_photos/url_launcher_util.dart'; import 'package:nc_photos/widget/home.dart'; diff --git a/app/lib/metadata_task_manager.dart b/app/lib/metadata_task_manager.dart index a645fb27..a039531d 100644 --- a/app/lib/metadata_task_manager.dart +++ b/app/lib/metadata_task_manager.dart @@ -7,8 +7,8 @@ import 'package:nc_photos/account.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/event/event.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/reverse_geocoder.dart'; import 'package:nc_photos/use_case/update_missing_metadata.dart'; import 'package:np_codegen/np_codegen.dart'; diff --git a/app/lib/pref.dart b/app/lib/pref.dart deleted file mode 100644 index 1c8d0c0c..00000000 --- a/app/lib/pref.dart +++ /dev/null @@ -1,732 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:collection/collection.dart'; -import 'package:event_bus/event_bus.dart'; -import 'package:kiwi/kiwi.dart'; -import 'package:logging/logging.dart'; -import 'package:nc_photos/account.dart'; -import 'package:nc_photos/event/event.dart'; -import 'package:nc_photos/mobile/platform.dart' - if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform; -import 'package:nc_photos/use_case/compat/v34.dart'; -import 'package:np_codegen/np_codegen.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -part 'pref.g.dart'; - -@npLog -class Pref { - factory Pref() { - _inst ??= Pref.scoped(PrefMemoryProvider()); - return _inst!; - } - - Pref.scoped(this.provider); - - /// Set the global [Pref] instance returned by the default constructor - static void setGlobalInstance(Pref pref) { - assert(_inst == null); - _inst = pref; - } - - List? getAccounts3() { - final jsonObjs = provider.getStringList(PrefKey.accounts3); - return jsonObjs - ?.map((e) => Account.fromJson( - jsonDecode(e), - upgraderV1: const AccountUpgraderV1(), - )) - .where((e) { - if (e == null) { - _log.shout("[getAccounts3] Failed upgrading account"); - } - return true; - }) - .whereNotNull() - .toList(); - } - - List getAccounts3Or(List def) => getAccounts3() ?? def; - Future setAccounts3(List? value) { - if (value == null) { - return _remove(PrefKey.accounts3); - } else { - final jsons = value.map((e) => jsonEncode(e.toJson())).toList(); - return provider.setStringList(PrefKey.accounts3, jsons); - } - } - - int? getCurrentAccountIndex() => provider.getInt(PrefKey.currentAccountIndex); - int getCurrentAccountIndexOr(int def) => getCurrentAccountIndex() ?? def; - Future setCurrentAccountIndex(int? value) { - if (value == null) { - return _remove(PrefKey.currentAccountIndex); - } else { - return _set(PrefKey.currentAccountIndex, value, - (key, value) => provider.setInt(key, value)); - } - } - - int? getHomePhotosZoomLevel() => provider.getInt(PrefKey.homePhotosZoomLevel); - int getHomePhotosZoomLevelOr(int def) => getHomePhotosZoomLevel() ?? def; - Future setHomePhotosZoomLevel(int value) => _set( - PrefKey.homePhotosZoomLevel, - value, - (key, value) => provider.setInt(key, value)); - - int? getAlbumBrowserZoomLevel() => - provider.getInt(PrefKey.albumBrowserZoomLevel); - int getAlbumBrowserZoomLevelOr(int def) => getAlbumBrowserZoomLevel() ?? def; - Future setAlbumBrowserZoomLevel(int value) => _set( - PrefKey.albumBrowserZoomLevel, - value, - (key, value) => provider.setInt(key, value)); - - int? getHomeAlbumsSort() => provider.getInt(PrefKey.homeAlbumsSort); - int getHomeAlbumsSortOr(int def) => getHomeAlbumsSort() ?? def; - Future setHomeAlbumsSort(int value) => _set(PrefKey.homeAlbumsSort, - value, (key, value) => provider.setInt(key, value)); - - bool? isEnableExif() => provider.getBool(PrefKey.enableExif); - bool isEnableExifOr([bool def = true]) => isEnableExif() ?? def; - Future setEnableExif(bool value) => _set( - PrefKey.enableExif, value, (key, value) => provider.setBool(key, value)); - - int? getViewerScreenBrightness() => - provider.getInt(PrefKey.viewerScreenBrightness); - int getViewerScreenBrightnessOr([int def = -1]) => - getViewerScreenBrightness() ?? def; - Future setViewerScreenBrightness(int value) => _set( - PrefKey.viewerScreenBrightness, - value, - (key, value) => provider.setInt(key, value)); - - bool? isViewerForceRotation() => - provider.getBool(PrefKey.viewerForceRotation); - bool isViewerForceRotationOr([bool def = false]) => - isViewerForceRotation() ?? def; - Future setViewerForceRotation(bool value) => _set( - PrefKey.viewerForceRotation, - value, - (key, value) => provider.setBool(key, value)); - - int? getSetupProgress() => provider.getInt(PrefKey.setupProgress); - int getSetupProgressOr([int def = 0]) => getSetupProgress() ?? def; - Future setSetupProgress(int value) => _set(PrefKey.setupProgress, - value, (key, value) => provider.setInt(key, value)); - - /// Return the version number when the app last ran - int? getLastVersion() => provider.getInt(PrefKey.lastVersion); - int getLastVersionOr(int def) => getLastVersion() ?? def; - Future setLastVersion(int value) => _set( - PrefKey.lastVersion, value, (key, value) => provider.setInt(key, value)); - - bool? isDarkTheme() => provider.getBool(PrefKey.darkTheme); - bool isDarkThemeOr(bool def) => isDarkTheme() ?? def; - Future setDarkTheme(bool value) => _set( - PrefKey.darkTheme, value, (key, value) => provider.setBool(key, value)); - - bool? isFollowSystemTheme() => provider.getBool(PrefKey.followSystemTheme); - bool isFollowSystemThemeOr(bool def) => isFollowSystemTheme() ?? def; - Future setFollowSystemTheme(bool value) => _set( - PrefKey.followSystemTheme, - value, - (key, value) => provider.setBool(key, value)); - - bool? isUseBlackInDarkTheme() => - provider.getBool(PrefKey.useBlackInDarkTheme); - bool isUseBlackInDarkThemeOr(bool def) => isUseBlackInDarkTheme() ?? def; - Future setUseBlackInDarkTheme(bool value) => _set( - PrefKey.useBlackInDarkTheme, - value, - (key, value) => provider.setBool(key, value)); - - int? getLanguage() => provider.getInt(PrefKey.language); - int getLanguageOr(int def) => getLanguage() ?? def; - Future setLanguage(int value) => _set( - PrefKey.language, value, (key, value) => provider.setInt(key, value)); - - int? getSlideshowDuration() => provider.getInt(PrefKey.slideshowDuration); - int getSlideshowDurationOr(int def) => getSlideshowDuration() ?? def; - Future setSlideshowDuration(int value) => _set( - PrefKey.slideshowDuration, - value, - (key, value) => provider.setInt(key, value)); - - bool? isSlideshowShuffle() => provider.getBool(PrefKey.isSlideshowShuffle); - bool isSlideshowShuffleOr(bool def) => isSlideshowShuffle() ?? def; - Future setSlideshowShuffle(bool value) => _set( - PrefKey.isSlideshowShuffle, - value, - (key, value) => provider.setBool(key, value)); - - bool? isSlideshowRepeat() => provider.getBool(PrefKey.isSlideshowRepeat); - bool isSlideshowRepeatOr(bool def) => isSlideshowRepeat() ?? def; - Future setSlideshowRepeat(bool value) => _set( - PrefKey.isSlideshowRepeat, - value, - (key, value) => provider.setBool(key, value)); - - bool? isAlbumBrowserShowDate() => - provider.getBool(PrefKey.isAlbumBrowserShowDate); - bool isAlbumBrowserShowDateOr([bool def = false]) => - isAlbumBrowserShowDate() ?? def; - Future setAlbumBrowserShowDate(bool value) => _set( - PrefKey.isAlbumBrowserShowDate, - value, - (key, value) => provider.setBool(key, value)); - - int? getGpsMapProvider() => provider.getInt(PrefKey.gpsMapProvider); - int getGpsMapProviderOr(int def) => getGpsMapProvider() ?? def; - Future setGpsMapProvider(int value) => _set(PrefKey.gpsMapProvider, - value, (key, value) => provider.setInt(key, value)); - - bool? hasShownSharedAlbumInfo() => - provider.getBool(PrefKey.hasShownSharedAlbumInfo); - bool hasShownSharedAlbumInfoOr(bool def) => hasShownSharedAlbumInfo() ?? def; - Future setHasShownSharedAlbumInfo(bool value) => _set( - PrefKey.hasShownSharedAlbumInfo, - value, - (key, value) => provider.setBool(key, value)); - - int? getEnhanceMaxWidth() => provider.getInt(PrefKey.enhanceMaxWidth); - int getEnhanceMaxWidthOr([int def = 2048]) => getEnhanceMaxWidth() ?? def; - Future setEnhanceMaxWidth(int value) => _set( - PrefKey.enhanceMaxWidth, - value, - (key, value) => provider.setInt(key, value)); - - int? getEnhanceMaxHeight() => provider.getInt(PrefKey.enhanceMaxHeight); - int getEnhanceMaxHeightOr([int def = 1536]) => getEnhanceMaxHeight() ?? def; - Future setEnhanceMaxHeight(int value) => _set( - PrefKey.enhanceMaxHeight, - value, - (key, value) => provider.setInt(key, value)); - - bool? hasShownEnhanceInfo() => provider.getBool(PrefKey.hasShownEnhanceInfo); - bool hasShownEnhanceInfoOr([bool def = false]) => - hasShownEnhanceInfo() ?? def; - Future setHasShownEnhanceInfo(bool value) => _set( - PrefKey.hasShownEnhanceInfo, - value, - (key, value) => provider.setBool(key, value)); - - int? getFirstRunTime() => provider.getInt(PrefKey.firstRunTime); - int getFirstRunTimeOr(int def) => getFirstRunTime() ?? def; - Future setFirstRunTime(int value) => _set( - PrefKey.firstRunTime, value, (key, value) => provider.setInt(key, value)); - - bool? isPhotosTabSortByName() => - provider.getBool(PrefKey.isPhotosTabSortByName); - bool isPhotosTabSortByNameOr([bool def = false]) => - isPhotosTabSortByName() ?? def; - Future setPhotosTabSortByName(bool value) => _set( - PrefKey.isPhotosTabSortByName, - value, - (key, value) => provider.setBool(key, value)); - - bool? shouldProcessExifWifiOnly() => - provider.getBool(PrefKey.shouldProcessExifWifiOnly); - bool shouldProcessExifWifiOnlyOr([bool def = true]) => - shouldProcessExifWifiOnly() ?? def; - Future setProcessExifWifiOnly(bool value) => _set( - PrefKey.shouldProcessExifWifiOnly, - value, - (key, value) => provider.setBool(key, value)); - - bool? isDoubleTapExit() => provider.getBool(PrefKey.doubleTapExit); - bool isDoubleTapExitOr([bool def = false]) => isDoubleTapExit() ?? def; - Future setDoubleTapExit(bool value) => _set(PrefKey.doubleTapExit, - value, (key, value) => provider.setBool(key, value)); - - int? getMemoriesRange() => provider.getInt(PrefKey.memoriesRange); - int getMemoriesRangeOr([int def = 2]) => getMemoriesRange() ?? def; - Future setMemoriesRange(int value) => _set(PrefKey.memoriesRange, - value, (key, value) => provider.setInt(key, value)); - - bool? isSaveEditResultToServer() => - provider.getBool(PrefKey.saveEditResultToServer); - bool isSaveEditResultToServerOr([bool def = true]) => - isSaveEditResultToServer() ?? def; - Future setSaveEditResultToServer(bool value) => _set( - PrefKey.saveEditResultToServer, - value, - (key, value) => provider.setBool(key, value)); - - bool? hasShownSaveEditResultDialog() => - provider.getBool(PrefKey.hasShownSaveEditResultDialog); - bool hasShownSaveEditResultDialogOr([bool def = false]) => - hasShownSaveEditResultDialog() ?? def; - Future setHasShownSaveEditResultDialog(bool value) => _set( - PrefKey.hasShownSaveEditResultDialog, - value, - (key, value) => provider.setBool(key, value)); - - bool? isSlideshowReverse() => provider.getBool(PrefKey.isSlideshowReverse); - bool isSlideshowReverseOr(bool def) => isSlideshowReverse() ?? def; - Future setSlideshowReverse(bool value) => _set( - PrefKey.isSlideshowReverse, - value, - (key, value) => provider.setBool(key, value)); - - int? getSeedColor() => provider.getInt(PrefKey.seedColor); - int getSeedColorOr(int def) => getSeedColor() ?? def; - Future setSeedColor(int value) => _set( - PrefKey.seedColor, value, (key, value) => provider.setInt(key, value)); - - bool? isVideoPlayerMute() => provider.getBool(PrefKey.isVideoPlayerMute); - bool isVideoPlayerMuteOr([bool def = false]) => isVideoPlayerMute() ?? def; - Future setVideoPlayerMute(bool value) => _set( - PrefKey.isVideoPlayerMute, - value, - (key, value) => provider.setBool(key, value)); - - bool? isVideoPlayerLoop() => provider.getBool(PrefKey.isVideoPlayerLoop); - bool isVideoPlayerLoopOr([bool def = false]) => isVideoPlayerLoop() ?? def; - Future setVideoPlayerLoop(bool value) => _set( - PrefKey.isVideoPlayerLoop, - value, - (key, value) => provider.setBool(key, value)); - - Future _set(PrefKey key, T value, - Future Function(PrefKey key, T value) setFn) async { - if (await setFn(key, value)) { - KiwiContainer().resolve().fire(PrefUpdatedEvent(key, value)); - return true; - } else { - return false; - } - } - - Future _remove(PrefKey key) => provider.remove(key); - - final PrefProvider provider; - - static Pref? _inst; -} - -class AccountPref { - AccountPref.scoped(this.provider); - - static AccountPref of(Account account) { - _insts.putIfAbsent( - account.id, () => AccountPref.scoped(PrefMemoryProvider())); - return _insts[account.id]!; - } - - /// Set the global [AccountPref] instance returned by the default constructor - static void setGlobalInstance(Account account, AccountPref? pref) { - if (pref != null) { - assert(!_insts.containsKey(account.id)); - _insts[account.id] = pref; - } else { - assert(_insts.containsKey(account.id)); - _insts.remove(account.id); - } - } - - bool? isEnableFaceRecognitionApp() => - provider.getBool(PrefKey.isEnableFaceRecognitionApp); - bool isEnableFaceRecognitionAppOr([bool def = true]) => - isEnableFaceRecognitionApp() ?? def; - Future setEnableFaceRecognitionApp(bool value) => _set( - PrefKey.isEnableFaceRecognitionApp, - value, - (key, value) => provider.setBool(key, value)); - - String? getShareFolder() => provider.getString(PrefKey.shareFolder); - String getShareFolderOr([String def = ""]) => getShareFolder() ?? def; - Future setShareFolder(String value) => _set(PrefKey.shareFolder, - value, (key, value) => provider.setString(key, value)); - - bool? hasNewSharedAlbum() => provider.getBool(PrefKey.hasNewSharedAlbum); - bool hasNewSharedAlbumOr([bool def = false]) => hasNewSharedAlbum() ?? def; - Future setNewSharedAlbum(bool value) => _set( - PrefKey.hasNewSharedAlbum, - value, - (key, value) => provider.setBool(key, value)); - - bool? isEnableMemoryAlbum() => provider.getBool(PrefKey.isEnableMemoryAlbum); - bool isEnableMemoryAlbumOr([bool def = false]) => - isEnableMemoryAlbum() ?? def; - Future setEnableMemoryAlbum(bool value) => _set( - PrefKey.isEnableMemoryAlbum, - value, - (key, value) => provider.setBool(key, value)); - - String? getTouchRootEtag() => provider.getString(PrefKey.touchRootEtag); - String getTouchRootEtagOr([String def = ""]) => getTouchRootEtag() ?? def; - Future setTouchRootEtag(String value) => _set( - PrefKey.touchRootEtag, - value, - (key, value) => provider.setString(key, value)); - Future removeTouchRootEtag() => _remove(PrefKey.touchRootEtag); - - String? getAccountLabel() => provider.getString(PrefKey.accountLabel); - String getAccountLabelOr([String def = ""]) => getAccountLabel() ?? def; - Future setAccountLabel(String? value) { - if (value == null) { - return _remove(PrefKey.accountLabel); - } else { - return _set(PrefKey.accountLabel, value, - (key, value) => provider.setString(key, value)); - } - } - - int? getLastNewCollectionType() => - provider.getInt(PrefKey.lastNewCollectionType); - int getLastNewCollectionTypeOr(int def) => getLastNewCollectionType() ?? def; - Future setLastNewCollectionType(int? value) { - if (value == null) { - return _remove(PrefKey.lastNewCollectionType); - } else { - return _set(PrefKey.lastNewCollectionType, value, - (key, value) => provider.setInt(key, value)); - } - } - - Future _set(PrefKey key, T value, - Future Function(PrefKey key, T value) setFn) async { - if (await setFn(key, value)) { - KiwiContainer() - .resolve() - .fire(AccountPrefUpdatedEvent(this, key, value)); - return true; - } else { - return false; - } - } - - Future _remove(PrefKey key) => provider.remove(key); - - final PrefProvider provider; - - static final _insts = {}; -} - -/// Provide the data for [Pref] -abstract class PrefProvider { - bool? getBool(PrefKey key); - Future setBool(PrefKey key, bool value); - - int? getInt(PrefKey key); - Future setInt(PrefKey key, int value); - - String? getString(PrefKey key); - Future setString(PrefKey key, String value); - - List? getStringList(PrefKey key); - Future setStringList(PrefKey key, List value); - - Future remove(PrefKey key); - Future clear(); -} - -/// [Pref] stored with [SharedPreferences] lib -class PrefSharedPreferencesProvider extends PrefProvider { - Future init() async { - // Obsolete, CompatV34 is compatible with pre v32 versions - // if (await CompatV32.isPrefNeedMigration()) { - // await CompatV32.migratePref(); - // } - if (await CompatV34.isPrefNeedMigration()) { - await CompatV34.migratePref(platform.UniversalStorage()); - } - return SharedPreferences.getInstance().then((pref) { - _pref = pref; - }); - } - - @override - getBool(PrefKey key) => _pref.getBool(key.toStringKey()); - - @override - setBool(PrefKey key, bool value) => _pref.setBool(key.toStringKey(), value); - - @override - getInt(PrefKey key) => _pref.getInt(key.toStringKey()); - - @override - setInt(PrefKey key, int value) => _pref.setInt(key.toStringKey(), value); - - @override - getString(PrefKey key) => _pref.getString(key.toStringKey()); - - @override - setString(PrefKey key, String value) => - _pref.setString(key.toStringKey(), value); - - @override - getStringList(PrefKey key) => _pref.getStringList(key.toStringKey()); - - @override - setStringList(PrefKey key, List value) => - _pref.setStringList(key.toStringKey(), value); - - @override - remove(PrefKey key) => _pref.remove(key.toStringKey()); - - @override - clear() => _pref.clear(); - - late SharedPreferences _pref; -} - -/// [Pref] backed by [UniversalStorage] -class PrefUniversalStorageProvider extends PrefProvider { - PrefUniversalStorageProvider(this.name); - - Future init() async { - final prefStr = await platform.UniversalStorage().getString(name) ?? "{}"; - _data - ..clear() - ..addAll(jsonDecode(prefStr)); - } - - @override - getBool(PrefKey key) => _get(key); - @override - setBool(PrefKey key, bool value) => _set(key, value); - - @override - getInt(PrefKey key) => _get(key); - @override - setInt(PrefKey key, int value) => _set(key, value); - - @override - getString(PrefKey key) => _get(key); - @override - setString(PrefKey key, String value) => _set(key, value); - - @override - getStringList(PrefKey key) => _get>(key); - @override - setStringList(PrefKey key, List value) => _set(key, value); - - @override - remove(PrefKey key) async { - final newData = Map.of(_data)..remove(key.toStringKey()); - await platform.UniversalStorage().putString(name, jsonEncode(newData)); - _data.remove(key.toStringKey()); - return true; - } - - @override - clear() async { - await platform.UniversalStorage().remove(name); - _data.clear(); - return true; - } - - T? _get(PrefKey key) => _data[key.toStringKey()]; - - Future _set(PrefKey key, T value) async { - final newData = Map.of(_data) - ..addEntries([MapEntry(key.toStringKey(), value)]); - await platform.UniversalStorage().putString(name, jsonEncode(newData)); - _data[key.toStringKey()] = value; - return true; - } - - final String name; - final _data = {}; -} - -/// [Pref] stored in memory, useful in unit tests -class PrefMemoryProvider extends PrefProvider { - PrefMemoryProvider([ - Map initialData = const {}, - ]) : _data = Map.of(initialData); - - @override - getBool(PrefKey key) => _get(key); - @override - setBool(PrefKey key, bool value) => _set(key, value); - - @override - getInt(PrefKey key) => _get(key); - @override - setInt(PrefKey key, int value) => _set(key, value); - - @override - getString(PrefKey key) => _get(key); - @override - setString(PrefKey key, String value) => _set(key, value); - - @override - getStringList(PrefKey key) => _get>(key); - @override - setStringList(PrefKey key, List value) => _set(key, value); - - @override - remove(PrefKey key) async { - _data.remove(key); - return true; - } - - @override - clear() async { - _data.clear(); - return true; - } - - T? _get(PrefKey key) => _data[key.toStringKey()]; - - Future _set(PrefKey key, T value) async { - _data[key.toStringKey()] = value; - return true; - } - - final Map _data; -} - -enum PrefKey { - accounts3, - currentAccountIndex, - homePhotosZoomLevel, - albumBrowserZoomLevel, - homeAlbumsSort, - enableExif, - viewerScreenBrightness, - viewerForceRotation, - setupProgress, - lastVersion, - darkTheme, - followSystemTheme, - useBlackInDarkTheme, - language, - labEnableSharedAlbum, - slideshowDuration, - isSlideshowShuffle, - isSlideshowRepeat, - isAlbumBrowserShowDate, - gpsMapProvider, - hasShownSharedAlbumInfo, - enhanceMaxWidth, - enhanceMaxHeight, - hasShownEnhanceInfo, - firstRunTime, - isPhotosTabSortByName, - shouldProcessExifWifiOnly, - doubleTapExit, - memoriesRange, - saveEditResultToServer, - hasShownSaveEditResultDialog, - isSlideshowReverse, - seedColor, - isVideoPlayerMute, - isVideoPlayerLoop, - - // account pref - isEnableFaceRecognitionApp, - shareFolder, - hasNewSharedAlbum, - isEnableMemoryAlbum, - touchRootEtag, - accountLabel, - lastNewCollectionType, -} - -extension on PrefKey { - String toStringKey() { - switch (this) { - case PrefKey.accounts3: - return "accounts3"; - case PrefKey.currentAccountIndex: - return "currentAccountIndex"; - case PrefKey.homePhotosZoomLevel: - return "homePhotosZoomLevel"; - case PrefKey.albumBrowserZoomLevel: - return "albumViewerZoomLevel"; - case PrefKey.homeAlbumsSort: - return "homeAlbumsSort"; - case PrefKey.enableExif: - return "isEnableExif"; - case PrefKey.viewerScreenBrightness: - return "viewerScreenBrightness"; - case PrefKey.viewerForceRotation: - return "viewerForceRotation"; - case PrefKey.setupProgress: - return "setupProgress"; - case PrefKey.lastVersion: - return "lastVersion"; - case PrefKey.darkTheme: - return "isDarkTheme"; - case PrefKey.followSystemTheme: - return "isFollowSystemTheme"; - case PrefKey.useBlackInDarkTheme: - return "isUseBlackInDarkTheme"; - case PrefKey.language: - return "language"; - case PrefKey.labEnableSharedAlbum: - return "isLabEnableSharedAlbum"; - case PrefKey.slideshowDuration: - return "slideshowDuration"; - case PrefKey.isSlideshowShuffle: - return "isSlideshowShuffle"; - case PrefKey.isSlideshowRepeat: - return "isSlideshowRepeat"; - case PrefKey.isAlbumBrowserShowDate: - return "isAlbumBrowserShowDate"; - case PrefKey.gpsMapProvider: - return "gpsMapProvider"; - case PrefKey.hasShownSharedAlbumInfo: - return "hasShownSharedAlbumInfo"; - case PrefKey.enhanceMaxWidth: - return "enhanceMaxWidth"; - case PrefKey.enhanceMaxHeight: - return "enhanceMaxHeight"; - case PrefKey.hasShownEnhanceInfo: - return "hasShownEnhanceInfo"; - case PrefKey.firstRunTime: - return "firstRunTime"; - case PrefKey.isPhotosTabSortByName: - return "isPhotosTabSortByName"; - case PrefKey.shouldProcessExifWifiOnly: - return "shouldProcessExifWifiOnly"; - case PrefKey.doubleTapExit: - return "doubleTapExit"; - case PrefKey.memoriesRange: - return "memoriesRange"; - case PrefKey.saveEditResultToServer: - return "saveEditResultToServer"; - case PrefKey.hasShownSaveEditResultDialog: - return "hasShownSaveEditResultDialog"; - case PrefKey.isSlideshowReverse: - return "isSlideshowReverse"; - case PrefKey.seedColor: - return "seedColor"; - case PrefKey.isVideoPlayerMute: - return "isVideoPlayerMute"; - case PrefKey.isVideoPlayerLoop: - return "isVideoPlayerLoop"; - - // account pref - case PrefKey.isEnableFaceRecognitionApp: - return "isEnableFaceRecognitionApp"; - case PrefKey.shareFolder: - return "shareFolder"; - case PrefKey.hasNewSharedAlbum: - return "hasNewSharedAlbum"; - case PrefKey.isEnableMemoryAlbum: - return "isEnableMemoryAlbum"; - case PrefKey.touchRootEtag: - return "touchRootEtag"; - case PrefKey.accountLabel: - return "accountLabel"; - case PrefKey.lastNewCollectionType: - return "lastNewCollectionType"; - } - } -} - -extension PrefExtension on Pref { - Account? getCurrentAccount() { - try { - return Pref().getAccounts3()![Pref().getCurrentAccountIndex()!]; - } catch (_) { - return null; - } - } -} diff --git a/app/lib/service.dart b/app/lib/service.dart index a9eb5b28..5b73da8d 100644 --- a/app/lib/service.dart +++ b/app/lib/service.dart @@ -15,11 +15,11 @@ import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file/data_source.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/event/native_event.dart'; import 'package:nc_photos/future_extension.dart'; import 'package:nc_photos/language_util.dart' as language_util; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/reverse_geocoder.dart'; import 'package:nc_photos/use_case/update_missing_metadata.dart'; import 'package:nc_photos_plugin/nc_photos_plugin.dart'; diff --git a/app/lib/theme.dart b/app/lib/theme.dart index 8256930d..36280bd4 100644 --- a/app/lib/theme.dart +++ b/app/lib/theme.dart @@ -1,8 +1,8 @@ import 'dart:ui'; import 'package:flutter/material.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/material3.dart'; -import 'package:nc_photos/pref.dart'; extension ThemeExtension on ThemeData { double get widthLimitedContentMaxWidth => 550.0; diff --git a/app/lib/use_case/compat/v46.dart b/app/lib/use_case/compat/v46.dart index 31a28125..4b025c69 100644 --- a/app/lib/use_case/compat/v46.dart +++ b/app/lib/use_case/compat/v46.dart @@ -1,6 +1,6 @@ import 'package:logging/logging.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/sqlite/database.dart' as sql; -import 'package:nc_photos/pref.dart'; import 'package:np_codegen/np_codegen.dart'; part 'v46.g.dart'; diff --git a/app/lib/use_case/import_potential_shared_album.dart b/app/lib/use_case/import_potential_shared_album.dart index f6917973..d589850d 100644 --- a/app/lib/use_case/import_potential_shared_album.dart +++ b/app/lib/use_case/import_potential_shared_album.dart @@ -3,7 +3,7 @@ import 'package:nc_photos/account.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; -import 'package:nc_photos/pref.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/remote_storage_util.dart' as remote_storage_util; import 'package:nc_photos/use_case/list_potential_shared_album.dart'; import 'package:nc_photos/use_case/move.dart'; diff --git a/app/lib/use_case/list_potential_shared_album.dart b/app/lib/use_case/list_potential_shared_album.dart index 674ec53b..f730ffb5 100644 --- a/app/lib/use_case/list_potential_shared_album.dart +++ b/app/lib/use_case/list_potential_shared_album.dart @@ -4,7 +4,7 @@ import 'package:nc_photos/account.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; -import 'package:nc_photos/pref.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/use_case/ls.dart'; import 'package:np_codegen/np_codegen.dart'; diff --git a/app/lib/use_case/sync_favorite.dart b/app/lib/use_case/sync_favorite.dart index 6293cd12..d6af2650 100644 --- a/app/lib/use_case/sync_favorite.dart +++ b/app/lib/use_case/sync_favorite.dart @@ -3,7 +3,7 @@ import 'package:nc_photos/account.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; -import 'package:nc_photos/pref.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/use_case/cache_favorite.dart'; import 'package:np_codegen/np_codegen.dart'; diff --git a/app/lib/widget/account_picker_dialog.dart b/app/lib/widget/account_picker_dialog.dart index 907838bc..51dfb33b 100644 --- a/app/lib/widget/account_picker_dialog.dart +++ b/app/lib/widget/account_picker_dialog.dart @@ -16,6 +16,7 @@ import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/bloc_util.dart'; import 'package:nc_photos/controller/account_controller.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/server_status.dart'; import 'package:nc_photos/entity/sqlite/database.dart' as sql; import 'package:nc_photos/event/event.dart'; @@ -23,7 +24,6 @@ import 'package:nc_photos/exception_event.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/help_utils.dart' as help_util; import 'package:nc_photos/k.dart' as k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/theme.dart'; import 'package:nc_photos/toast.dart'; import 'package:nc_photos/url_launcher_util.dart'; diff --git a/app/lib/widget/archive_browser.dart b/app/lib/widget/archive_browser.dart index ff6f3284..e6881d65 100644 --- a/app/lib/widget/archive_browser.dart +++ b/app/lib/widget/archive_browser.dart @@ -12,11 +12,11 @@ import 'package:nc_photos/debug_util.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/object_extension.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/use_case/inflate_file_descriptor.dart'; import 'package:nc_photos/use_case/update_property.dart'; diff --git a/app/lib/widget/collection_browser.dart b/app/lib/widget/collection_browser.dart index 4b436001..aa723e45 100644 --- a/app/lib/widget/collection_browser.dart +++ b/app/lib/widget/collection_browser.dart @@ -32,6 +32,7 @@ import 'package:nc_photos/entity/collection_item/sorter.dart'; import 'package:nc_photos/entity/collection_item/util.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/exception_event.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/flutter_util.dart' as flutter_util; diff --git a/app/lib/widget/enhanced_photo_browser.dart b/app/lib/widget/enhanced_photo_browser.dart index f4a851b4..0eb64ee8 100644 --- a/app/lib/widget/enhanced_photo_browser.dart +++ b/app/lib/widget/enhanced_photo_browser.dart @@ -9,6 +9,7 @@ import 'package:nc_photos/compute_queue.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; import 'package:nc_photos/entity/local_file.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/iterable_extension.dart'; import 'package:nc_photos/k.dart' as k; @@ -16,7 +17,6 @@ import 'package:nc_photos/mobile/android/android_info.dart'; import 'package:nc_photos/mobile/android/permission_util.dart'; import 'package:nc_photos/object_extension.dart'; import 'package:nc_photos/platform/k.dart' as platform_k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/share_handler.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/widget/empty_list_indicator.dart'; diff --git a/app/lib/widget/gps_map.dart b/app/lib/widget/gps_map.dart index d84fa704..063d96f8 100644 --- a/app/lib/widget/gps_map.dart +++ b/app/lib/widget/gps_map.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; import 'package:nc_photos/app_init.dart' as app_init; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/mobile/platform.dart' if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform; import 'package:nc_photos/platform/k.dart' as platform_k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/url_launcher_util.dart'; import 'package:tuple/tuple.dart'; diff --git a/app/lib/widget/handler/double_tap_exit_handler.dart b/app/lib/widget/handler/double_tap_exit_handler.dart index 26d9a8cf..06d61785 100644 --- a/app/lib/widget/handler/double_tap_exit_handler.dart +++ b/app/lib/widget/handler/double_tap_exit_handler.dart @@ -1,8 +1,8 @@ import 'package:clock/clock.dart'; import 'package:flutter/material.dart'; import 'package:nc_photos/app_localizations.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/k.dart' as k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/snack_bar_manager.dart'; class DoubleTapExitHandler { diff --git a/app/lib/widget/home.dart b/app/lib/widget/home.dart index 8dfc3777..eb9186e6 100644 --- a/app/lib/widget/home.dart +++ b/app/lib/widget/home.dart @@ -13,9 +13,9 @@ import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album/data_source.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file/data_source.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/or_null.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/theme.dart'; import 'package:nc_photos/use_case/import_potential_shared_album.dart'; import 'package:nc_photos/widget/home_collections.dart'; diff --git a/app/lib/widget/home_collections.dart b/app/lib/widget/home_collections.dart index d1692355..19e7b2f1 100644 --- a/app/lib/widget/home_collections.dart +++ b/app/lib/widget/home_collections.dart @@ -19,12 +19,12 @@ import 'package:nc_photos/entity/collection.dart'; import 'package:nc_photos/entity/collection/content_provider/album.dart'; import 'package:nc_photos/entity/collection/content_provider/nc_album.dart'; import 'package:nc_photos/entity/collection/util.dart' as collection_util; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/exception_event.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/np_api_util.dart'; import 'package:nc_photos/platform/features.dart' as features; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/theme.dart'; import 'package:nc_photos/widget/album_importer.dart'; diff --git a/app/lib/widget/home_photos.dart b/app/lib/widget/home_photos.dart index 14cd0d65..2b520757 100644 --- a/app/lib/widget/home_photos.dart +++ b/app/lib/widget/home_photos.dart @@ -20,6 +20,7 @@ import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/download_handler.dart'; import 'package:nc_photos/entity/collection.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/sqlite/database.dart' as sql; import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/event/native_event.dart'; @@ -29,7 +30,6 @@ import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/metadata_task_manager.dart'; import 'package:nc_photos/object_extension.dart'; import 'package:nc_photos/platform/k.dart' as platform_k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/primitive.dart'; import 'package:nc_photos/service.dart' as service; import 'package:nc_photos/share_handler.dart'; diff --git a/app/lib/widget/home_search.dart b/app/lib/widget/home_search.dart index 7696dec1..cb2d9eaa 100644 --- a/app/lib/widget/home_search.dart +++ b/app/lib/widget/home_search.dart @@ -13,12 +13,12 @@ import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/download_handler.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/search.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/object_extension.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/share_handler.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/theme.dart'; diff --git a/app/lib/widget/image_editor.dart b/app/lib/widget/image_editor.dart index d58390e8..fbed72a6 100644 --- a/app/lib/widget/image_editor.dart +++ b/app/lib/widget/image_editor.dart @@ -9,6 +9,7 @@ import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/cache_manager_util.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/help_utils.dart' as help_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/material3.dart'; diff --git a/app/lib/widget/image_editor_persist_option_dialog.dart b/app/lib/widget/image_editor_persist_option_dialog.dart index eb68dd6d..2197a586 100644 --- a/app/lib/widget/image_editor_persist_option_dialog.dart +++ b/app/lib/widget/image_editor_persist_option_dialog.dart @@ -5,6 +5,7 @@ import 'package:kiwi/kiwi.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/help_utils.dart' as help_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/snack_bar_manager.dart'; diff --git a/app/lib/widget/image_enhancer.dart b/app/lib/widget/image_enhancer.dart index bbe1212e..a68b9b08 100644 --- a/app/lib/widget/image_enhancer.dart +++ b/app/lib/widget/image_enhancer.dart @@ -12,6 +12,7 @@ import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/help_utils.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/mobile/android/android_info.dart'; diff --git a/app/lib/widget/my_app.dart b/app/lib/widget/my_app.dart index 17f21325..4ded6b11 100644 --- a/app/lib/widget/my_app.dart +++ b/app/lib/widget/my_app.dart @@ -7,12 +7,12 @@ import 'package:logging/logging.dart'; import 'package:nc_photos/controller/account_controller.dart'; import 'package:nc_photos/controller/pref_controller.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/legacy/connect.dart' as legacy; import 'package:nc_photos/legacy/sign_in.dart' as legacy; import 'package:nc_photos/navigation_manager.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/stream_util.dart'; import 'package:nc_photos/theme.dart'; diff --git a/app/lib/widget/new_collection_dialog.dart b/app/lib/widget/new_collection_dialog.dart index 491b2ccb..2beeefc0 100644 --- a/app/lib/widget/new_collection_dialog.dart +++ b/app/lib/widget/new_collection_dialog.dart @@ -17,13 +17,13 @@ import 'package:nc_photos/entity/collection/content_provider/album.dart'; import 'package:nc_photos/entity/collection/content_provider/nc_album.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/nc_album.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/tag.dart'; import 'package:nc_photos/exception_event.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/help_utils.dart' as help_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/object_extension.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/toast.dart'; import 'package:nc_photos/url_launcher_util.dart'; import 'package:nc_photos/widget/album_dir_picker.dart'; diff --git a/app/lib/widget/result_viewer.dart b/app/lib/widget/result_viewer.dart index 2ec984c7..e3096041 100644 --- a/app/lib/widget/result_viewer.dart +++ b/app/lib/widget/result_viewer.dart @@ -5,9 +5,9 @@ import 'package:nc_photos/account.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/theme.dart'; import 'package:nc_photos/use_case/ls_single_file.dart'; diff --git a/app/lib/widget/settings.dart b/app/lib/widget/settings.dart index 968e47bb..aa9fe64d 100644 --- a/app/lib/widget/settings.dart +++ b/app/lib/widget/settings.dart @@ -7,6 +7,7 @@ import 'package:nc_photos/account.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/controller/pref_controller.dart'; import 'package:nc_photos/debug_util.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/language_util.dart' as language_util; @@ -15,7 +16,6 @@ import 'package:nc_photos/mobile/platform.dart' import 'package:nc_photos/platform/features.dart' as features; import 'package:nc_photos/platform/k.dart' as platform_k; import 'package:nc_photos/platform/notification.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/service.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/stream_util.dart'; diff --git a/app/lib/widget/settings/account_settings.dart b/app/lib/widget/settings/account_settings.dart index c3b8fe35..8143c425 100644 --- a/app/lib/widget/settings/account_settings.dart +++ b/app/lib/widget/settings/account_settings.dart @@ -10,6 +10,7 @@ import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/controller/account_controller.dart'; import 'package:nc_photos/controller/account_pref_controller.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/exception_event.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; diff --git a/app/lib/widget/settings/expert_settings.dart b/app/lib/widget/settings/expert_settings.dart index 5120f341..31f4ad29 100644 --- a/app/lib/widget/settings/expert_settings.dart +++ b/app/lib/widget/settings/expert_settings.dart @@ -7,6 +7,7 @@ import 'package:kiwi/kiwi.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/sqlite/database.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; diff --git a/app/lib/widget/settings/theme_settings.dart b/app/lib/widget/settings/theme_settings.dart index 013b763c..9cf13086 100644 --- a/app/lib/widget/settings/theme_settings.dart +++ b/app/lib/widget/settings/theme_settings.dart @@ -9,6 +9,7 @@ import 'package:kiwi/kiwi.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/event/event.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/mobile/android/android_info.dart'; diff --git a/app/lib/widget/setup.dart b/app/lib/widget/setup.dart index ef20e7ea..46bc7802 100644 --- a/app/lib/widget/setup.dart +++ b/app/lib/widget/setup.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:nc_photos/app_localizations.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/k.dart' as k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/widget/home.dart'; import 'package:nc_photos/widget/sign_in.dart'; import 'package:page_view_indicators/circle_page_indicator.dart'; diff --git a/app/lib/widget/shared_album_info_dialog.dart b/app/lib/widget/shared_album_info_dialog.dart index d0429471..40704be1 100644 --- a/app/lib/widget/shared_album_info_dialog.dart +++ b/app/lib/widget/shared_album_info_dialog.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:nc_photos/app_localizations.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/help_utils.dart' as help_utils; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/url_launcher_util.dart'; class SharedAlbumInfoDialog extends StatefulWidget { diff --git a/app/lib/widget/sharing_browser.dart b/app/lib/widget/sharing_browser.dart index 76c3dd51..fe7b80c2 100644 --- a/app/lib/widget/sharing_browser.dart +++ b/app/lib/widget/sharing_browser.dart @@ -13,12 +13,12 @@ import 'package:nc_photos/entity/album/data_source.dart'; import 'package:nc_photos/entity/collection/builder.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file/data_source.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/share.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/object_extension.dart'; import 'package:nc_photos/or_null.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/use_case/import_potential_shared_album.dart'; import 'package:nc_photos/widget/collection_browser.dart'; diff --git a/app/lib/widget/sign_in.dart b/app/lib/widget/sign_in.dart index e92beb0a..1c96f460 100644 --- a/app/lib/widget/sign_in.dart +++ b/app/lib/widget/sign_in.dart @@ -7,11 +7,11 @@ import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/entity/pref_util.dart' as pref_util; import 'package:nc_photos/entity/sqlite/database.dart' as sql; import 'package:nc_photos/iterable_extension.dart'; import 'package:nc_photos/legacy/sign_in.dart' as legacy; -import 'package:nc_photos/pref.dart'; -import 'package:nc_photos/pref_util.dart' as pref_util; import 'package:nc_photos/theme.dart'; import 'package:nc_photos/widget/connect.dart'; import 'package:nc_photos/widget/home.dart'; diff --git a/app/lib/widget/splash.dart b/app/lib/widget/splash.dart index 853f9354..48e20164 100644 --- a/app/lib/widget/splash.dart +++ b/app/lib/widget/splash.dart @@ -7,11 +7,11 @@ import 'package:kiwi/kiwi.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/sqlite/database.dart' as sql; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/mobile/android/activity.dart'; import 'package:nc_photos/platform/k.dart' as platform_k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/use_case/compat/v29.dart'; import 'package:nc_photos/use_case/compat/v46.dart'; import 'package:nc_photos/use_case/compat/v55.dart'; diff --git a/app/lib/widget/trashbin_browser.dart b/app/lib/widget/trashbin_browser.dart index ce3490d1..b48dd696 100644 --- a/app/lib/widget/trashbin_browser.dart +++ b/app/lib/widget/trashbin_browser.dart @@ -13,11 +13,11 @@ import 'package:nc_photos/debug_util.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/language_util.dart' as language_util; import 'package:nc_photos/object_extension.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/use_case/inflate_file_descriptor.dart'; import 'package:nc_photos/use_case/restore_trashbin.dart'; diff --git a/app/lib/widget/video_viewer.dart b/app/lib/widget/video_viewer.dart index f4532ec5..6735d0bc 100644 --- a/app/lib/widget/video_viewer.dart +++ b/app/lib/widget/video_viewer.dart @@ -8,6 +8,7 @@ import 'package:nc_photos/api/api_util.dart' as api_util; import 'package:nc_photos/app_localizations.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/exception_util.dart' as exception_util; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/np_api_util.dart'; diff --git a/app/lib/widget/viewer.dart b/app/lib/widget/viewer.dart index c857fe5e..31a2a661 100644 --- a/app/lib/widget/viewer.dart +++ b/app/lib/widget/viewer.dart @@ -19,12 +19,12 @@ import 'package:nc_photos/entity/collection/adapter.dart'; import 'package:nc_photos/entity/collection_item.dart'; import 'package:nc_photos/entity/file_descriptor.dart'; import 'package:nc_photos/entity/file_util.dart' as file_util; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/flutter_util.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/notified_action.dart'; import 'package:nc_photos/object_extension.dart'; import 'package:nc_photos/platform/features.dart' as features; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/share_handler.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/theme.dart'; diff --git a/app/lib/widget/viewer_mixin.dart b/app/lib/widget/viewer_mixin.dart index 77da545b..09ab5431 100644 --- a/app/lib/widget/viewer_mixin.dart +++ b/app/lib/widget/viewer_mixin.dart @@ -4,8 +4,8 @@ import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:logging/logging.dart'; import 'package:native_device_orientation/native_device_orientation.dart'; +import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/platform/k.dart' as platform_k; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/throttler.dart'; import 'package:nc_photos/widget/disposable.dart'; import 'package:np_codegen/np_codegen.dart'; diff --git a/app/test/use_case/add_file_to_album_test.dart b/app/test/use_case/add_file_to_album_test.dart index 60453206..eff1015d 100644 --- a/app/test/use_case/add_file_to_album_test.dart +++ b/app/test/use_case/add_file_to_album_test.dart @@ -8,8 +8,9 @@ import 'package:nc_photos/entity/album/item.dart'; import 'package:nc_photos/entity/album/provider.dart'; import 'package:nc_photos/entity/album/sort_provider.dart'; import 'package:nc_photos/entity/file.dart'; +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/entity/pref/provider/memory.dart'; import 'package:nc_photos/entity/sqlite/database.dart' as sql; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/use_case/album/add_file_to_album.dart'; import 'package:np_common/ci_string.dart'; import 'package:test/test.dart'; diff --git a/app/test/use_case/remove_album_test.dart b/app/test/use_case/remove_album_test.dart index f88a8af7..49fa83a5 100644 --- a/app/test/use_case/remove_album_test.dart +++ b/app/test/use_case/remove_album_test.dart @@ -1,8 +1,9 @@ import 'package:event_bus/event_bus.dart'; import 'package:kiwi/kiwi.dart'; import 'package:nc_photos/di_container.dart'; +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/entity/pref/provider/memory.dart'; import 'package:nc_photos/entity/sqlite/database.dart' as sql; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/use_case/album/remove_album.dart'; import 'package:test/test.dart'; diff --git a/app/test/use_case/remove_test.dart b/app/test/use_case/remove_test.dart index e82b08e1..0b333527 100644 --- a/app/test/use_case/remove_test.dart +++ b/app/test/use_case/remove_test.dart @@ -5,9 +5,10 @@ import 'package:nc_photos/entity/album.dart'; import 'package:nc_photos/entity/album/cover_provider.dart'; import 'package:nc_photos/entity/album/provider.dart'; import 'package:nc_photos/entity/album/sort_provider.dart'; +import 'package:nc_photos/entity/pref.dart'; +import 'package:nc_photos/entity/pref/provider/memory.dart'; import 'package:nc_photos/entity/sqlite/database.dart' as sql; import 'package:nc_photos/or_null.dart'; -import 'package:nc_photos/pref.dart'; import 'package:nc_photos/use_case/remove.dart'; import 'package:test/test.dart';