From c14021f2a7df9f503ecf92ba0e70e04747f61be9 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 23 Jun 2025 15:02:29 +0530 Subject: [PATCH] Improve state update when removing face --- mobile/lib/events/people_changed_event.dart | 2 ++ .../face_ml/feedback/cluster_feedback.dart | 7 ++++++- mobile/lib/ui/viewer/people/cluster_page.dart | 19 ++++++++++++++----- mobile/lib/ui/viewer/people/people_page.dart | 12 ++++++++++++ .../people/person_cluster_suggestion.dart | 19 ++++++++++++++----- 5 files changed, 48 insertions(+), 11 deletions(-) diff --git a/mobile/lib/events/people_changed_event.dart b/mobile/lib/events/people_changed_event.dart index 9c8eec4520..bb23f010cf 100644 --- a/mobile/lib/events/people_changed_event.dart +++ b/mobile/lib/events/people_changed_event.dart @@ -4,12 +4,14 @@ import "package:photos/models/ml/face/person.dart"; class PeopleChangedEvent extends Event { final List? relevantFiles; + final List? relevantFaceIDs; final PeopleEventType type; final String source; final PersonEntity? person; PeopleChangedEvent({ this.relevantFiles, + this.relevantFaceIDs, this.type = PeopleEventType.defaultType, this.source = "", this.person, 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 9135aa96f9..63f25afb8d 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 @@ -218,7 +218,11 @@ class ClusterFeedbackService { .removeFacesFromPerson(person: person, faceIDs: {faceID}); Bus.instance.fire( - PeopleChangedEvent(type: PeopleEventType.removedFaceFromCluster), + PeopleChangedEvent( + type: PeopleEventType.removedFaceFromCluster, + relevantFaceIDs: [faceID], + source: person.remoteID, + ), ); _logger.info('removeFaceFromPerson done'); return updatedClusterID; @@ -299,6 +303,7 @@ class ClusterFeedbackService { Bus.instance.fire( PeopleChangedEvent( type: PeopleEventType.removedFaceFromCluster, + relevantFaceIDs: [faceID], source: clusterID ?? "", ), ); diff --git a/mobile/lib/ui/viewer/people/cluster_page.dart b/mobile/lib/ui/viewer/people/cluster_page.dart index 2541892d0f..5e8362d468 100644 --- a/mobile/lib/ui/viewer/people/cluster_page.dart +++ b/mobile/lib/ui/viewer/people/cluster_page.dart @@ -13,6 +13,7 @@ import 'package:photos/models/gallery_type.dart'; import "package:photos/models/ml/face/person.dart"; import 'package:photos/models/selected_files.dart'; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/ui/notification/toast.dart"; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; import 'package:photos/ui/viewer/gallery/gallery.dart'; @@ -76,12 +77,20 @@ class _ClusterPageState extends State { } }); _peopleChangedEvent = Bus.instance.on().listen((event) { - if (event.type == PeopleEventType.removedFilesFromCluster && - (event.source == widget.clusterID.toString())) { - for (var updatedFile in event.relevantFiles!) { - files.remove(updatedFile); + if (event.source == widget.clusterID.toString()) { + if (event.type == PeopleEventType.removedFilesFromCluster) { + for (var updatedFile in event.relevantFiles!) { + files.remove(updatedFile); + } + setState(() {}); + } + if (event.type == PeopleEventType.removedFaceFromCluster) { + for (final String removedFaceID in event.relevantFaceIDs!) { + final int fileID = getFileIdFromFaceId(removedFaceID); + files.removeWhere((file) => file.uploadedFileID == fileID); + } + setState(() {}); } - setState(() {}); } }); kDebugMode diff --git a/mobile/lib/ui/viewer/people/people_page.dart b/mobile/lib/ui/viewer/people/people_page.dart index 7fd8696de6..6876075c4a 100644 --- a/mobile/lib/ui/viewer/people/people_page.dart +++ b/mobile/lib/ui/viewer/people/people_page.dart @@ -15,6 +15,7 @@ import "package:photos/models/search/search_result.dart"; import 'package:photos/models/selected_files.dart'; import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart"; import "package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/services/search_service.dart"; import "package:photos/ui/components/end_to_end_banner.dart"; import 'package:photos/ui/viewer/actions/file_selection_overlay_bar.dart'; @@ -85,6 +86,17 @@ class _PeoplePageState extends State { }); } } + if (event.source == widget.person.remoteID) { + if (event.type == PeopleEventType.removedFaceFromCluster) { + final filesBefore = files?.length ?? 0; + for (final String removedFaceID in event.relevantFaceIDs!) { + final int fileID = getFileIdFromFaceId(removedFaceID); + files?.removeWhere((file) => file.uploadedFileID == fileID); + } + final filesAfter = files?.length ?? 0; + if (filesBefore != filesAfter) setState(() {}); + } + } }); filesFuture = loadPersonFiles(); diff --git a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart index 220da7d01e..e16d54d274 100644 --- a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart +++ b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart @@ -14,6 +14,7 @@ import "package:photos/models/file/file.dart"; import "package:photos/models/ml/face/person.dart"; import 'package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart'; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; +import "package:photos/services/machine_learning/ml_result.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; @@ -123,12 +124,20 @@ class _PersonClustersState extends State { _peopleChangedEvent = Bus.instance.on().listen((event) { - if (event.type == PeopleEventType.removedFilesFromCluster && - (event.source == clusterID.toString())) { - for (var updatedFile in event.relevantFiles!) { - files.remove(updatedFile); + if (event.source == clusterID.toString()) { + if (event.type == PeopleEventType.removedFilesFromCluster) { + for (var updatedFile in event.relevantFiles!) { + files.remove(updatedFile); + } + setState(() {}); + } + if (event.type == PeopleEventType.removedFaceFromCluster) { + for (final String removedFaceID in event.relevantFaceIDs!) { + final int fileID = getFileIdFromFaceId(removedFaceID); + files.removeWhere((file) => file.uploadedFileID == fileID); + } + setState(() {}); } - setState(() {}); } });