Refresh after receiving native exif event

This commit is contained in:
Ming Ming 2024-01-14 21:05:53 +08:00
parent 5c1ab48aae
commit 37a30e927c
4 changed files with 44 additions and 0 deletions

View file

@ -3,8 +3,11 @@ import 'dart:convert';
import 'package:logging/logging.dart';
import 'package:nc_photos/stream_extension.dart';
import 'package:np_codegen/np_codegen.dart';
import 'package:np_platform_message_relay/np_platform_message_relay.dart';
part 'native_event.g.dart';
class NativeEventListener<T> {
NativeEventListener(this.listener);
@ -43,6 +46,7 @@ class NativeEventListener<T> {
Logger("event.native_event.NativeEventListener<${T.runtimeType}>");
}
@npLog
class FileExifUpdatedEvent {
const FileExifUpdatedEvent(this.fileIds);

View file

@ -0,0 +1,14 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'native_event.dart';
// **************************************************************************
// NpLogGenerator
// **************************************************************************
extension _$FileExifUpdatedEventNpLog on FileExifUpdatedEvent {
// ignore: unused_element
Logger get _log => log;
static final log = Logger("event.native_event.FileExifUpdatedEvent");
}

View file

@ -57,6 +57,8 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
_subscriptions.add(prefController.isEnableExif.listen((event) {
add(_SetEnableExif(event));
}));
_nativeFileExifUpdatedListener?.begin();
}
@override
@ -64,6 +66,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
for (final s in _subscriptions) {
s.cancel();
}
_nativeFileExifUpdatedListener?.end();
return super.close();
}
@ -302,6 +305,14 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
emit(state.copyWith(error: ExceptionEvent(ev.error, ev.stackTrace)));
}
void _onNativeFileExifUpdated(FileExifUpdatedEvent ev) {
_log.info(ev);
_refreshThrottler.trigger(
maxResponceTime: const Duration(seconds: 3),
maxPendingCount: 10,
);
}
Future _transformItems(List<FileDescriptor> files) async {
_log.info("[_transformItems] Queue ${files.length} items");
_itemTransformerQueue.addJob(
@ -389,6 +400,18 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
final _subscriptions = <StreamSubscription>[];
var _isHandlingError = false;
var _isInitialLoad = true;
// Listen to updates from background isolates as the memories are not shared
late final _nativeFileExifUpdatedListener =
getRawPlatform() == NpPlatform.android
? NativeEventListener<FileExifUpdatedEvent>(_onNativeFileExifUpdated)
: null;
late final _refreshThrottler = Throttler(
onTriggered: (_) {
add(const _Reload());
},
logTag: _log.name,
);
}
_ItemTransformerResult _buildItem(_ItemTransformerArgument arg) {

View file

@ -27,6 +27,7 @@ import 'package:nc_photos/entity/collection.dart';
import 'package:nc_photos/entity/file_descriptor.dart';
import 'package:nc_photos/entity/file_util.dart' as file_util;
import 'package:nc_photos/event/event.dart';
import 'package:nc_photos/event/native_event.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;
@ -37,6 +38,7 @@ import 'package:nc_photos/service.dart' as service;
import 'package:nc_photos/snack_bar_manager.dart';
import 'package:nc_photos/theme.dart';
import 'package:nc_photos/theme/dimension.dart';
import 'package:nc_photos/throttler.dart';
import 'package:nc_photos/widget/collection_browser.dart';
import 'package:nc_photos/widget/collection_picker.dart';
import 'package:nc_photos/widget/file_sharer_dialog.dart';
@ -55,6 +57,7 @@ import 'package:np_codegen/np_codegen.dart';
import 'package:np_collection/np_collection.dart';
import 'package:np_common/object_util.dart';
import 'package:np_common/or_null.dart';
import 'package:np_platform_util/np_platform_util.dart';
import 'package:to_string/to_string.dart';
import 'package:visibility_detector/visibility_detector.dart';