Move more pref to controller

This commit is contained in:
Ming Ming 2024-08-18 18:07:56 +08:00
parent 3ab0829ba2
commit 0feb6aa59b
11 changed files with 76 additions and 75 deletions

View file

@ -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<bool> setAccounts(List<Account> value) => _set<List<Account>>(
controller: _accountsController,
@ -32,7 +31,7 @@ class PrefController {
value: value,
);
Future<bool> setCurrentAccountIndex(int value) => _setOrRemove<int>(
Future<bool> setCurrentAccountIndex(int? value) => _setOrRemove<int>(
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<Color?>.seeded(_c.pref.getSeedColor()?.let(Color.new));
BehaviorSubject<Color?>.seeded(pref.getSeedColor()?.let(Color.new));
@NpSubjectAccessor(type: "Color?")
late final _secondarySeedColorController = BehaviorSubject<Color?>.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<bool> setProtectedPageAuthType(ProtectedPageAuthType? value) =>
_setOrRemove<ProtectedPageAuthType>(
@ -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<bool> _doSet<T>({

View file

@ -110,6 +110,15 @@ extension on Pref {
return provider.setInt(PrefKey.firstRunTime, value);
}
}
int? getCurrentAccountIndex() => provider.getInt(PrefKey.currentAccountIndex);
Future<bool> setCurrentAccountIndex(int? value) {
if (value == null) {
return provider.remove(PrefKey.currentAccountIndex);
} else {
return provider.setInt(PrefKey.currentAccountIndex, value);
}
}
}
MapCoord? _tryMapCoordFromJson(dynamic json) {

View file

@ -1,14 +1,6 @@
part of '../pref.dart';
extension PrefExtension on Pref {
Account? getCurrentAccount() {
try {
return getAccounts3()![getCurrentAccountIndex()!];
} catch (_) {
return null;
}
}
List<Account>? 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<bool> setCurrentAccountIndex(int? value) {
if (value == null) {
return _remove(PrefKey.currentAccountIndex);
} else {
return _set<int>(PrefKey.currentAccountIndex, value,
(key, value) => provider.setInt(key, value));
}
}
int? getHomePhotosZoomLevel() => provider.getInt(PrefKey.homePhotosZoomLevel);
int getHomePhotosZoomLevelOr(int def) => getHomePhotosZoomLevel() ?? def;
Future<bool> setHomePhotosZoomLevel(int value) => _set<int>(

View file

@ -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<SignIn> {
_log.shout("[_connect] Failed reading pref for account: $account", e,
stackTrace);
}
final prefController = context.read<PrefController>();
unawaited(Pref().setAccounts3(accounts));
unawaited(Pref().setCurrentAccountIndex(accounts.indexOf(account)));
unawaited(prefController.setCurrentAccountIndex(accounts.indexOf(account)));
}
final _formKey = GlobalKey<FormState>();

View file

@ -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<void> _doWork() async {
final account = Pref().getCurrentAccount();
final prefController = PrefController(Pref());
final account = prefController.currentAccountValue;
if (account == null) {
_log.shout("[_doWork] account == null");
return;

View file

@ -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

View file

@ -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(

View file

@ -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<ResultViewer> {
Future<void> _doWork() async {
_log.info("[_doWork] URL: ${widget.resultUrl}");
_account = _c.pref.getCurrentAccount();
_account = context.read<PrefController>().currentAccountValue;
if (_account == null) {
SnackBarManager().showSnackBar(SnackBar(
content: Text(L10n.global().errorUnauthenticated),

View file

@ -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<Setup> {
void _onDonePressed() {
Pref().setSetupProgress(_PageId.all);
final account = Pref().getCurrentAccount();
final account = context.read<PrefController>().currentAccountValue;
if (account == null) {
Navigator.pushReplacementNamed(context, SignIn.routeName);
} else {

View file

@ -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<SignIn> {
_log.shout("[_connect] Failed reading pref for account: $account", e,
stackTrace);
}
final prefController = context.read<PrefController>();
unawaited(Pref().setAccounts3(accounts));
unawaited(Pref().setCurrentAccountIndex(accounts.indexOf(account)));
unawaited(prefController.setCurrentAccountIndex(accounts.indexOf(account)));
}
final _formKey = GlobalKey<FormState>();

View file

@ -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));
}
}