diff --git a/app/lib/controller/pref_controller.dart b/app/lib/controller/pref_controller.dart index 7d95e4dd..62f2ae49 100644 --- a/app/lib/controller/pref_controller.dart +++ b/app/lib/controller/pref_controller.dart @@ -5,7 +5,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; -import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/collection/util.dart'; import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/json_util.dart'; @@ -24,7 +23,7 @@ part 'pref_controller/util.dart'; @npSubjectAccessor class PrefController { - PrefController(this._c); + PrefController(this.pref); Future setAccounts(List value) => _set>( controller: _accountsController, @@ -32,7 +31,7 @@ class PrefController { value: value, ); - Future setCurrentAccountIndex(int value) => _setOrRemove( + Future setCurrentAccountIndex(int? value) => _setOrRemove( controller: _currentAccountIndexController, setter: (pref, value) => pref.setCurrentAccountIndex(value), remover: (pref) => pref.setCurrentAccountIndex(null), @@ -203,7 +202,7 @@ class PrefController { required T value, }) => _doSet( - pref: _c.pref, + pref: pref, controller: controller, setter: setter, value: value, @@ -217,7 +216,7 @@ class PrefController { T? defaultValue, }) => _doSetOrRemove( - pref: _c.pref, + pref: pref, controller: controller, setter: setter, remover: remover, @@ -233,90 +232,91 @@ class PrefController { } } - final DiContainer _c; + final Pref pref; + @npSubjectAccessor late final _accountsController = - BehaviorSubject.seeded(_c.pref.getAccounts3() ?? []); + BehaviorSubject.seeded(pref.getAccounts3() ?? []); @npSubjectAccessor late final _currentAccountIndexController = - BehaviorSubject.seeded(_c.pref.getCurrentAccountIndex()); + BehaviorSubject.seeded(pref.getCurrentAccountIndex()); @npSubjectAccessor late final _languageController = - BehaviorSubject.seeded(_langIdToAppLanguage(_c.pref.getLanguageOr(0))); + BehaviorSubject.seeded(_langIdToAppLanguage(pref.getLanguageOr(0))); @npSubjectAccessor late final _homePhotosZoomLevelController = - BehaviorSubject.seeded(_c.pref.getHomePhotosZoomLevelOr(0)); + BehaviorSubject.seeded(pref.getHomePhotosZoomLevelOr(0)); @npSubjectAccessor late final _albumBrowserZoomLevelController = - BehaviorSubject.seeded(_c.pref.getAlbumBrowserZoomLevelOr(0)); + BehaviorSubject.seeded(pref.getAlbumBrowserZoomLevelOr(0)); @npSubjectAccessor late final _homeAlbumsSortController = BehaviorSubject.seeded( - CollectionSort.values[_c.pref.getHomeAlbumsSortOr(0)]); + CollectionSort.values[pref.getHomeAlbumsSortOr(0)]); @npSubjectAccessor late final _isEnableExifController = - BehaviorSubject.seeded(_c.pref.isEnableExifOr(true)); + BehaviorSubject.seeded(pref.isEnableExifOr(true)); @npSubjectAccessor late final _shouldProcessExifWifiOnlyController = - BehaviorSubject.seeded(_c.pref.shouldProcessExifWifiOnlyOr(true)); + BehaviorSubject.seeded(pref.shouldProcessExifWifiOnlyOr(true)); @npSubjectAccessor late final _memoriesRangeController = - BehaviorSubject.seeded(_c.pref.getMemoriesRangeOr(2)); + BehaviorSubject.seeded(pref.getMemoriesRangeOr(2)); @npSubjectAccessor late final _viewerScreenBrightnessController = - BehaviorSubject.seeded(_c.pref.getViewerScreenBrightnessOr(-1)); + BehaviorSubject.seeded(pref.getViewerScreenBrightnessOr(-1)); @npSubjectAccessor late final _isViewerForceRotationController = - BehaviorSubject.seeded(_c.pref.isViewerForceRotationOr(false)); + BehaviorSubject.seeded(pref.isViewerForceRotationOr(false)); @npSubjectAccessor late final _gpsMapProviderController = BehaviorSubject.seeded( - GpsMapProvider.values[_c.pref.getGpsMapProviderOr(0)]); + GpsMapProvider.values[pref.getGpsMapProviderOr(0)]); @npSubjectAccessor late final _isAlbumBrowserShowDateController = - BehaviorSubject.seeded(_c.pref.isAlbumBrowserShowDateOr(false)); + BehaviorSubject.seeded(pref.isAlbumBrowserShowDateOr(false)); @npSubjectAccessor late final _isDoubleTapExitController = - BehaviorSubject.seeded(_c.pref.isDoubleTapExitOr(false)); + BehaviorSubject.seeded(pref.isDoubleTapExitOr(false)); @npSubjectAccessor late final _isSaveEditResultToServerController = - BehaviorSubject.seeded(_c.pref.isSaveEditResultToServerOr(true)); + BehaviorSubject.seeded(pref.isSaveEditResultToServerOr(true)); @npSubjectAccessor late final _enhanceMaxSizeController = BehaviorSubject.seeded( - SizeInt(_c.pref.getEnhanceMaxWidthOr(), _c.pref.getEnhanceMaxHeightOr())); + SizeInt(pref.getEnhanceMaxWidthOr(), pref.getEnhanceMaxHeightOr())); @npSubjectAccessor late final _isDarkThemeController = - BehaviorSubject.seeded(_c.pref.isDarkThemeOr(false)); + BehaviorSubject.seeded(pref.isDarkThemeOr(false)); @npSubjectAccessor late final _isFollowSystemThemeController = - BehaviorSubject.seeded(_c.pref.isFollowSystemThemeOr(false)); + BehaviorSubject.seeded(pref.isFollowSystemThemeOr(false)); @npSubjectAccessor late final _isUseBlackInDarkThemeController = - BehaviorSubject.seeded(_c.pref.isUseBlackInDarkThemeOr(false)); + BehaviorSubject.seeded(pref.isUseBlackInDarkThemeOr(false)); @NpSubjectAccessor(type: "Color?") late final _seedColorController = - BehaviorSubject.seeded(_c.pref.getSeedColor()?.let(Color.new)); + BehaviorSubject.seeded(pref.getSeedColor()?.let(Color.new)); @NpSubjectAccessor(type: "Color?") late final _secondarySeedColorController = BehaviorSubject.seeded( - _c.pref.getSecondarySeedColor()?.let(Color.new)); + pref.getSecondarySeedColor()?.let(Color.new)); @npSubjectAccessor late final _isDontShowVideoPreviewHintController = - BehaviorSubject.seeded(_c.pref.isDontShowVideoPreviewHintOr(false)); + BehaviorSubject.seeded(pref.isDontShowVideoPreviewHintOr(false)); @npSubjectAccessor - late final _mapBrowserPrevPositionController = BehaviorSubject.seeded(_c.pref + late final _mapBrowserPrevPositionController = BehaviorSubject.seeded(pref .getMapBrowserPrevPosition() ?.let(tryJsonDecode) ?.let(_tryMapCoordFromJson)); @npSubjectAccessor late final _isNewHttpEngineController = - BehaviorSubject.seeded(_c.pref.isNewHttpEngine() ?? false); + BehaviorSubject.seeded(pref.isNewHttpEngine() ?? false); @npSubjectAccessor - late final _firstRunTimeController = BehaviorSubject.seeded(_c.pref + late final _firstRunTimeController = BehaviorSubject.seeded(pref .getFirstRunTime() ?.let((v) => DateTime.fromMillisecondsSinceEpoch(v).toUtc())); @npSubjectAccessor late final _lastVersionController = - BehaviorSubject.seeded(_c.pref.getLastVersion() ?? + BehaviorSubject.seeded(pref.getLastVersion() ?? // v6 is the last version without saving the version number in pref - (_c.pref.getSetupProgress() == null ? k.version : 6)); + (pref.getSetupProgress() == null ? k.version : 6)); } extension PrefControllerExtension on PrefController { @@ -331,7 +331,7 @@ extension PrefControllerExtension on PrefController { @npSubjectAccessor class SecurePrefController { - SecurePrefController(this._c); + SecurePrefController(this.securePref); Future setProtectedPageAuthType(ProtectedPageAuthType? value) => _setOrRemove( @@ -366,7 +366,7 @@ class SecurePrefController { required T value, }) => _doSet( - pref: _c.securePref, + pref: securePref, controller: controller, setter: setter, value: value, @@ -381,7 +381,7 @@ class SecurePrefController { T? defaultValue, }) => _doSetOrRemove( - pref: _c.securePref, + pref: securePref, controller: controller, setter: setter, remover: remover, @@ -389,18 +389,19 @@ class SecurePrefController { defaultValue: defaultValue, ); - final DiContainer _c; + final Pref securePref; + @npSubjectAccessor - late final _protectedPageAuthTypeController = BehaviorSubject.seeded(_c - .securePref - .getProtectedPageAuthType() - ?.let((e) => ProtectedPageAuthType.values[e])); + late final _protectedPageAuthTypeController = BehaviorSubject.seeded( + securePref + .getProtectedPageAuthType() + ?.let((e) => ProtectedPageAuthType.values[e])); @npSubjectAccessor late final _protectedPageAuthPinController = - BehaviorSubject.seeded(_c.securePref.getProtectedPageAuthPin()?.toCi()); + BehaviorSubject.seeded(securePref.getProtectedPageAuthPin()?.toCi()); @npSubjectAccessor - late final _protectedPageAuthPasswordController = BehaviorSubject.seeded( - _c.securePref.getProtectedPageAuthPassword()?.toCi()); + late final _protectedPageAuthPasswordController = + BehaviorSubject.seeded(securePref.getProtectedPageAuthPassword()?.toCi()); } Future _doSet({ diff --git a/app/lib/controller/pref_controller/util.dart b/app/lib/controller/pref_controller/util.dart index 7398d0e5..91889fde 100644 --- a/app/lib/controller/pref_controller/util.dart +++ b/app/lib/controller/pref_controller/util.dart @@ -110,6 +110,15 @@ extension on Pref { return provider.setInt(PrefKey.firstRunTime, value); } } + + int? getCurrentAccountIndex() => provider.getInt(PrefKey.currentAccountIndex); + Future setCurrentAccountIndex(int? value) { + if (value == null) { + return provider.remove(PrefKey.currentAccountIndex); + } else { + return provider.setInt(PrefKey.currentAccountIndex, value); + } + } } MapCoord? _tryMapCoordFromJson(dynamic json) { diff --git a/app/lib/entity/pref/extension.dart b/app/lib/entity/pref/extension.dart index 58628546..af3bbefa 100644 --- a/app/lib/entity/pref/extension.dart +++ b/app/lib/entity/pref/extension.dart @@ -1,14 +1,6 @@ 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 @@ -36,17 +28,6 @@ extension PrefExtension on Pref { } } - 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( diff --git a/app/lib/legacy/sign_in.dart b/app/lib/legacy/sign_in.dart index 9af8d365..6ced4749 100644 --- a/app/lib/legacy/sign_in.dart +++ b/app/lib/legacy/sign_in.dart @@ -5,6 +5,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:logging/logging.dart'; 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/db/entity_converter.dart'; import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/pref_util.dart' as pref_util; @@ -315,8 +316,9 @@ class _SignInState extends State { _log.shout("[_connect] Failed reading pref for account: $account", e, stackTrace); } + final prefController = context.read(); unawaited(Pref().setAccounts3(accounts)); - unawaited(Pref().setCurrentAccountIndex(accounts.indexOf(account))); + unawaited(prefController.setCurrentAccountIndex(accounts.indexOf(account))); } final _formKey = GlobalKey(); diff --git a/app/lib/service.dart b/app/lib/service.dart index 5f7e6ee4..d19c03a1 100644 --- a/app/lib/service.dart +++ b/app/lib/service.dart @@ -10,6 +10,7 @@ import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; import 'package:nc_photos/app_init.dart' as app_init; import 'package:nc_photos/app_localizations.dart'; +import 'package:nc_photos/controller/pref_controller.dart'; import 'package:nc_photos/di_container.dart'; import 'package:nc_photos/entity/file.dart'; import 'package:nc_photos/entity/file/data_source.dart'; @@ -104,7 +105,8 @@ class _Service { } Future _doWork() async { - final account = Pref().getCurrentAccount(); + final prefController = PrefController(Pref()); + final account = prefController.currentAccountValue; if (account == null) { _log.shout("[_doWork] account == null"); return; diff --git a/app/lib/widget/account_picker_dialog/bloc.dart b/app/lib/widget/account_picker_dialog/bloc.dart index ee70d969..96887b4a 100644 --- a/app/lib/widget/account_picker_dialog/bloc.dart +++ b/app/lib/widget/account_picker_dialog/bloc.dart @@ -47,7 +47,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger { if (index == -1) { throw StateError("Account not found"); } - await _c.pref.setCurrentAccountIndex(index); + await prefController.setCurrentAccountIndex(index); emit(state.copyWith(newSelectAccount: ev.account)); }); } @@ -60,7 +60,8 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger { try { await _prefLock.protect(() async { final accounts = _c.pref.getAccounts3()!; - final currentAccount = accounts[_c.pref.getCurrentAccountIndex()!]; + final currentAccount = + accounts[prefController.currentAccountIndexValue!]; accounts.remove(ev.account); final newAccountIndex = accounts.indexOf(currentAccount); if (newAccountIndex == -1) { @@ -74,7 +75,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger { stackTrace); } await Pref().setAccounts3(accounts); - await Pref().setCurrentAccountIndex(newAccountIndex); + await prefController.setCurrentAccountIndex(newAccountIndex); // check if the same account (server + userId) still exists in known // accounts diff --git a/app/lib/widget/my_app.dart b/app/lib/widget/my_app.dart index 9055fb33..4e263ef7 100644 --- a/app/lib/widget/my_app.dart +++ b/app/lib/widget/my_app.dart @@ -78,10 +78,10 @@ class MyApp extends StatelessWidget { return MultiRepositoryProvider( providers: [ RepositoryProvider( - create: (_) => PrefController(_c), + create: (_) => PrefController(_c.pref), ), RepositoryProvider( - create: (_) => SecurePrefController(_c), + create: (_) => SecurePrefController(_c.securePref), ), RepositoryProvider( create: (context) => AccountController( diff --git a/app/lib/widget/result_viewer.dart b/app/lib/widget/result_viewer.dart index 1f92f5ca..c06c5923 100644 --- a/app/lib/widget/result_viewer.dart +++ b/app/lib/widget/result_viewer.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:kiwi/kiwi.dart'; import 'package:logging/logging.dart'; 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/di_container.dart'; import 'package:nc_photos/entity/file.dart'; -import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/theme.dart'; @@ -84,7 +85,7 @@ class _ResultViewerState extends State { Future _doWork() async { _log.info("[_doWork] URL: ${widget.resultUrl}"); - _account = _c.pref.getCurrentAccount(); + _account = context.read().currentAccountValue; if (_account == null) { SnackBarManager().showSnackBar(SnackBar( content: Text(L10n.global().errorUnauthenticated), diff --git a/app/lib/widget/setup.dart b/app/lib/widget/setup.dart index f9fe5909..4580731a 100644 --- a/app/lib/widget/setup.dart +++ b/app/lib/widget/setup.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:nc_photos/app_localizations.dart'; +import 'package:nc_photos/controller/pref_controller.dart'; import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/widget/home.dart'; @@ -97,7 +99,7 @@ class _SetupState extends State { void _onDonePressed() { Pref().setSetupProgress(_PageId.all); - final account = Pref().getCurrentAccount(); + final account = context.read().currentAccountValue; if (account == null) { Navigator.pushReplacementNamed(context, SignIn.routeName); } else { diff --git a/app/lib/widget/sign_in.dart b/app/lib/widget/sign_in.dart index 6191cd18..ef3b7b66 100644 --- a/app/lib/widget/sign_in.dart +++ b/app/lib/widget/sign_in.dart @@ -6,6 +6,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:logging/logging.dart'; 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/db/entity_converter.dart'; import 'package:nc_photos/entity/pref.dart'; import 'package:nc_photos/entity/pref_util.dart' as pref_util; @@ -183,8 +184,9 @@ class _SignInState extends State { _log.shout("[_connect] Failed reading pref for account: $account", e, stackTrace); } + final prefController = context.read(); unawaited(Pref().setAccounts3(accounts)); - unawaited(Pref().setCurrentAccountIndex(accounts.indexOf(account))); + unawaited(prefController.setCurrentAccountIndex(accounts.indexOf(account))); } final _formKey = GlobalKey(); diff --git a/app/lib/widget/splash/bloc.dart b/app/lib/widget/splash/bloc.dart index 9349ee43..d094e103 100644 --- a/app/lib/widget/splash/bloc.dart +++ b/app/lib/widget/splash/bloc.dart @@ -118,7 +118,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger { } catch (e, stackTrace) { _log.shout("[_upgrade46] Failed while clearDefaultCache", e, stackTrace); unawaited(Pref().setAccounts3(null)); - unawaited(Pref().setCurrentAccountIndex(null)); + unawaited(prefController.setCurrentAccountIndex(null)); } }