diff --git a/mobile/lib/events/people_changed_event.dart b/mobile/lib/events/people_changed_event.dart index e2d135866..51f4eaeef 100644 --- a/mobile/lib/events/people_changed_event.dart +++ b/mobile/lib/events/people_changed_event.dart @@ -1,3 +1,22 @@ import "package:photos/events/event.dart"; +import "package:photos/models/file/file.dart"; -class PeopleChangedEvent extends Event {} +class PeopleChangedEvent extends Event { + final List? relevantFiles; + final PeopleEventType type; + final String source; + + PeopleChangedEvent({ + this.relevantFiles, + this.type = PeopleEventType.defaultType, + this.source = "", + }); + + @override + String get reason => '$runtimeType{type: ${type.name}, "via": $source}'; +} + +enum PeopleEventType { + defaultType, + removedFilesFromCluster, +} \ No newline at end of file diff --git a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart index ee098c46f..4cb9dce6c 100644 --- a/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart +++ b/mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart @@ -5,8 +5,8 @@ import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; -import "package:photos/events/files_updated_event.dart"; -import "package:photos/events/local_photos_updated_event.dart"; +// import "package:photos/events/files_updated_event.dart"; +// import "package:photos/events/local_photos_updated_event.dart"; import "package:photos/events/people_changed_event.dart"; import "package:photos/extensions/stop_watch.dart"; import "package:photos/face/db.dart"; @@ -195,14 +195,20 @@ class ClusterFeedbackService { // Update the deleted faces await FaceMLDataDB.instance.forceUpdateClusterIds(newFaceIdToClusterID); - Bus.instance.fire(PeopleChangedEvent()); Bus.instance.fire( - LocalPhotosUpdatedEvent( - files, - type: EventType.peopleClusterChanged, + PeopleChangedEvent( + relevantFiles: files, + type: PeopleEventType.removedFilesFromCluster, source: "$clusterID", ), ); + // Bus.instance.fire( + // LocalPhotosUpdatedEvent( + // files, + // type: EventType.peopleClusterChanged, + // source: "$clusterID", + // ), + // ); return; } catch (e, s) { _logger.severe("Error in removeFilesFromCluster", e, s); diff --git a/mobile/lib/ui/viewer/people/cluster_page.dart b/mobile/lib/ui/viewer/people/cluster_page.dart index 47bfef535..12b830932 100644 --- a/mobile/lib/ui/viewer/people/cluster_page.dart +++ b/mobile/lib/ui/viewer/people/cluster_page.dart @@ -6,6 +6,7 @@ import "package:flutter_animate/flutter_animate.dart"; import 'package:photos/core/event_bus.dart'; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; +import "package:photos/events/people_changed_event.dart"; import "package:photos/face/model/person.dart"; import "package:photos/generated/l10n.dart"; import 'package:photos/models/file/file.dart'; @@ -52,6 +53,7 @@ class _ClusterPageState extends State { final _selectedFiles = SelectedFiles(); late final List files; late final StreamSubscription _filesUpdatedEvent; + late final StreamSubscription _peopleChangedEvent; @override void initState() { @@ -69,9 +71,11 @@ class _ClusterPageState extends State { } setState(() {}); } - if (event.type == EventType.peopleClusterChanged && + }); + _peopleChangedEvent = Bus.instance.on().listen((event) { + if (event.type == PeopleEventType.removedFilesFromCluster && (event.source == widget.clusterID.toString())) { - for (var updatedFile in event.updatedFiles) { + for (var updatedFile in event.relevantFiles!) { files.remove(updatedFile); } setState(() {}); @@ -88,6 +92,7 @@ class _ClusterPageState extends State { @override void dispose() { _filesUpdatedEvent.cancel(); + _peopleChangedEvent.cancel(); super.dispose(); } @@ -110,6 +115,7 @@ class _ClusterPageState extends State { ); }, reloadEvent: Bus.instance.on(), + forceReloadEvents: [Bus.instance.on()], removalEventTypes: const { EventType.deletedFromRemote, EventType.deletedFromEverywhere,