[mob] Add support for syncing multile clusters for a person

This commit is contained in:
Neeraj Gupta 2024-04-09 14:48:05 +05:30
parent 24f7b191b4
commit d43ed15cdf
4 changed files with 28 additions and 4 deletions

View file

@ -14,6 +14,7 @@ import "package:photos/models/file/file.dart";
import 'package:photos/services/machine_learning/face_ml/face_clustering/cosine_distance.dart';
import "package:photos/services/machine_learning/face_ml/face_clustering/linear_clustering_service.dart";
import "package:photos/services/machine_learning/face_ml/face_ml_result.dart";
import "package:photos/services/machine_learning/face_ml/person/person_service.dart";
import "package:photos/services/search_service.dart";
class ClusterSuggestion {
@ -393,7 +394,7 @@ class ClusterFeedbackService {
for (final suggestionsPerCluster in suggestions.values) {
for (final suggestion in suggestionsPerCluster) {
final clusterID = suggestion.$1;
await faceMlDb.assignClusterToPerson(
await PersonService.instance.assignClusterToPerson(
personID: p.remoteID,
clusterID: clusterID,
);

View file

@ -86,6 +86,29 @@ class PersonService {
return PersonEntity(result.id, data);
}
Future<void> assignClusterToPerson({
required String personID,
required int clusterID,
}) async {
final person = (await getPerson(personID))!;
final personData = person.data;
final faceIds = await faceMLDataDB.getFaceIDsForCluster(clusterID);
final clusterInfo = ClusterInfo(
id: clusterID,
faces: faceIds.toSet(),
);
personData.assigned!.add(clusterInfo);
await entityService.addOrUpdate(
EntityType.person,
json.encode(personData.toJson()),
id: personID,
);
await faceMLDataDB.assignClusterToPerson(
personID: personID,
clusterID: clusterID,
);
}
Future<void> deletePerson(String personID, {bool onlyMapping = true}) async {
if (onlyMapping) {
final PersonEntity? entity = await getPerson(personID);

View file

@ -7,7 +7,6 @@ import "package:logging/logging.dart";
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
import "package:photos/core/event_bus.dart";
import "package:photos/events/people_changed_event.dart";
import "package:photos/face/db.dart";
import "package:photos/face/model/person.dart";
import "package:photos/generated/l10n.dart";
import 'package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart';
@ -225,7 +224,7 @@ class _PersonActionSheetState extends State<PersonActionSheet> {
return PersonRowItem(
person: person,
onTap: () async {
await FaceMLDataDB.instance.assignClusterToPerson(
await PersonService.instance.assignClusterToPerson(
personID: person.remoteID,
clusterID: widget.cluserID,
);

View file

@ -8,6 +8,7 @@ import "package:photos/face/db.dart";
import "package:photos/face/model/person.dart";
import "package:photos/models/file/file.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/theme/ente_theme.dart";
import "package:photos/ui/components/buttons/button_widget.dart";
import "package:photos/ui/components/models/button_type.dart";
@ -110,7 +111,7 @@ class _PersonClustersState extends State<PersonReviewClusterSuggestion> {
) async {
// Perform the action based on clusterID, e.g., assignClusterToPerson or captureNotPersonFeedback
if (yesOrNo) {
await FaceMLDataDB.instance.assignClusterToPerson(
await PersonService.instance.assignClusterToPerson(
personID: widget.person.remoteID,
clusterID: clusterID,
);