diff --git a/app/lib/controller/account_controller.dart b/app/lib/controller/account_controller.dart index 5b7c9d4f..6707182b 100644 --- a/app/lib/controller/account_controller.dart +++ b/app/lib/controller/account_controller.dart @@ -4,6 +4,7 @@ import 'package:nc_photos/controller/account_pref_controller.dart'; import 'package:nc_photos/controller/collections_controller.dart'; import 'package:nc_photos/controller/persons_controller.dart'; import 'package:nc_photos/controller/server_controller.dart'; +import 'package:nc_photos/controller/session_controller.dart'; import 'package:nc_photos/controller/sync_controller.dart'; import 'package:nc_photos/di_container.dart'; @@ -20,6 +21,8 @@ class AccountController { _personsController = null; _syncController?.dispose(); _syncController = null; + _sessionController?.dispose(); + _sessionController = null; } Account get account => _account!; @@ -52,10 +55,14 @@ class AccountController { account: _account!, ); + SessionController get sessionController => + _sessionController ??= SessionController(); + Account? _account; CollectionsController? _collectionsController; ServerController? _serverController; AccountPrefController? _accountPrefController; PersonsController? _personsController; SyncController? _syncController; + SessionController? _sessionController; } diff --git a/app/lib/controller/session_controller.dart b/app/lib/controller/session_controller.dart new file mode 100644 index 00000000..836d956b --- /dev/null +++ b/app/lib/controller/session_controller.dart @@ -0,0 +1,22 @@ +import 'package:np_codegen/np_codegen.dart'; +import 'package:rxdart/rxdart.dart'; + +/// Manage volatile global variables bonded to an account session, when the +/// session ends (i.e., sign out), the variables are cleared +@npLog +class SessionController { + SessionController(); + + void dispose() { + _hasFiredMetadataTaskController.close(); + } + + ValueStream get hasFiredMetadataTask => + _hasFiredMetadataTaskController.stream; + + void setFiredMetadataTask(bool value) { + _hasFiredMetadataTaskController.add(value); + } + + final _hasFiredMetadataTaskController = BehaviorSubject.seeded(false); +} diff --git a/app/lib/primitive.dart b/app/lib/primitive.dart deleted file mode 100644 index 8189c1ca..00000000 --- a/app/lib/primitive.dart +++ /dev/null @@ -1,5 +0,0 @@ -class Primitive { - Primitive(this.value); - - T value; -} diff --git a/app/lib/widget/home_photos.dart b/app/lib/widget/home_photos.dart index f153a80b..93d8d494 100644 --- a/app/lib/widget/home_photos.dart +++ b/app/lib/widget/home_photos.dart @@ -12,7 +12,6 @@ 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/bloc/bloc_util.dart' as bloc_util; import 'package:nc_photos/bloc/progress.dart'; import 'package:nc_photos/bloc/scan_account_dir.dart'; import 'package:nc_photos/compute_queue.dart'; @@ -31,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/primitive.dart'; import 'package:nc_photos/service.dart' as service; import 'package:nc_photos/share_handler.dart'; import 'package:nc_photos/snack_bar_manager.dart'; @@ -183,7 +181,7 @@ class _HomePhotosState extends State ScrollConfiguration.of(context).copyWith(scrollbars: false), child: RefreshIndicator( onRefresh: () async { - _onRefreshSelected(); + _onRefreshSelected(context); await _waitRefresh(); }, child: CustomScrollView( @@ -381,8 +379,11 @@ class _HomePhotosState extends State } } - void _onRefreshSelected() { - _hasFiredMetadataTask.value = false; + void _onRefreshSelected(BuildContext context) { + context + .read() + .sessionController + .setFiredMetadataTask(false); _reqRefresh(); } @@ -484,7 +485,7 @@ class _HomePhotosState extends State void _onPrefUpdated(PrefUpdatedEvent ev) { if (ev.key == PrefKey.enableExif) { if (ev.value == true) { - _tryStartMetadataTask(ignoreFired: true); + _tryStartMetadataTask(context, ignoreFired: true); } else { _stopMetadataTask(); } @@ -505,19 +506,28 @@ class _HomePhotosState extends State ImageProcessorUploadSuccessEvent ev) { _log.info( "[_onImageProcessorUploadSuccessEvent] Scheduling metadata task after next refresh"); - _hasFiredMetadataTask.value = false; + context + .read() + .sessionController + .setFiredMetadataTask(false); } void _onBackToTop(HomePhotosBackToTopEvent ev) { _scrollController.jumpTo(0); } - Future _tryStartMetadataTask({ + Future _tryStartMetadataTask( + BuildContext context, { bool ignoreFired = false, }) async { if (_bloc.state is ScanAccountDirBlocSuccess && Pref().isEnableExifOr() && - (!_hasFiredMetadataTask.value || ignoreFired)) { + (ignoreFired || + !context + .read() + .sessionController + .hasFiredMetadataTask + .value)) { try { final c = KiwiContainer().resolve(); final missingMetadataCount = await c.sqliteDb.use((db) async { @@ -536,7 +546,10 @@ class _HomePhotosState extends State } } - _hasFiredMetadataTask.value = true; + context + .read() + .sessionController + .setFiredMetadataTask(true); } catch (e, stackTrace) { _log.shout("[_tryStartMetadataTask] Failed starting metadata task", e, stackTrace); @@ -592,7 +605,7 @@ class _HomePhotosState extends State _isScrollbarVisible = true; context.read().syncController.requestSync( widget.account, _accountPrefController.personProvider.value); - _tryStartMetadataTask(); + _tryStartMetadataTask(context); } }); } @@ -683,21 +696,6 @@ class _HomePhotosState extends State double _calcAppBarExtent(BuildContext context) => MediaQuery.of(context).padding.top + kToolbarHeight; - Primitive get _hasFiredMetadataTask { - final name = bloc_util.getInstNameForRootAwareAccount( - "HomePhotosState.hasFiredMetadataTask", widget.account); - try { - _log.fine("[_hasFiredMetadataTask] Resolving for '$name'"); - return KiwiContainer().resolve>(name); - } catch (_) { - _log.info( - "[_hasFiredMetadataTask] New instance for account: ${widget.account}"); - final obj = Primitive(false); - KiwiContainer().registerInstance>(obj, name: name); - return obj; - } - } - late final _bloc = ScanAccountDirBloc.of(widget.account); late final _queryProgressBloc = ProgressBloc(); late final _accountPrefController =