From 15baf7d0fb346dbe7f87107541eb5338aacd6e60 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 19 Jun 2024 16:15:41 +0530 Subject: [PATCH] [mob][photos] Update remote on remove feedback --- .../face_ml/feedback/cluster_feedback.dart | 4 +++ .../face_ml/person/person_service.dart | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) 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 7af371e243..8bce9fe0e6 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 @@ -187,6 +187,10 @@ class ClusterFeedbackService { await FaceMLDataDB.instance .bulkCaptureNotPersonFeedback(notClusterIdToPersonId); + // Update remote so new sync does not undo this change + await PersonService.instance + .removeFilesFromPerson(person: p, faceIDs: faceIDs.toSet()); + Bus.instance.fire(PeopleChangedEvent()); _logger.info('removeFilesFromPerson done'); return; diff --git a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart index 682deaff0c..34f8c6b34c 100644 --- a/mobile/lib/services/machine_learning/face_ml/person/person_service.dart +++ b/mobile/lib/services/machine_learning/face_ml/person/person_service.dart @@ -201,6 +201,38 @@ class PersonService { personData.logStats(); } + Future removeFilesFromPerson({ + required PersonEntity person, + required Set faceIDs, + }) async { + final personData = person.data; + final List emptiedClusters = []; + for (final cluster in personData.assigned!) { + cluster.faces.removeWhere((faceID) => faceIDs.contains(faceID)); + if (cluster.faces.isEmpty) { + emptiedClusters.add(cluster.id); + } + } + + // Safety check to make sure we haven't created an empty cluster now, if so delete it + for (final emptyClusterID in emptiedClusters) { + personData.assigned! + .removeWhere((element) => element.id != emptyClusterID); + await faceMLDataDB.removeClusterToPerson( + personID: person.remoteID, + clusterID: emptyClusterID, + ); + } + + + await entityService.addOrUpdate( + EntityType.person, + json.encode(personData.toJson()), + id: person.remoteID, + ); + personData.logStats(); + } + Future deletePerson(String personID, {bool onlyMapping = false}) async { if (onlyMapping) { final PersonEntity? entity = await getPerson(personID);