Procházet zdrojové kódy

[mob][wip] remove from cluster feedback

laurenspriem před 1 rokem
rodič
revize
768fa3d1ce

+ 21 - 1
mobile/lib/face/db.dart

@@ -695,7 +695,7 @@ class FaceMLDataDB {
     await db.execute(createNotPersonFeedbackTable);
   }
 
-  Future<void> removePersonFromFiles(List<EnteFile> files, Person p) async {
+  Future<void> removeFilesFromPerson(List<EnteFile> files, Person p) async {
     final db = await instance.database;
     final result = await db.rawQuery(
       'SELECT $faceIDColumn FROM $facesTable LEFT JOIN $clustersTable '
@@ -715,4 +715,24 @@ class FaceMLDataDB {
     }
     await forceUpdateClusterIds(faceIDToClusterID);
   }
+
+  Future<void> removeFilesFromCluster(
+    List<EnteFile> files,
+    int clusterID,
+  ) async {
+    final db = await instance.database;
+    final result = await db.rawQuery(
+      'SELECT $faceIDColumn FROM $facesTable '
+      'WHERE $facesTable.$faceClusterId = ? AND $facesTable.$fileIDColumn IN (${files.map((e) => e.uploadedFileID).join(",")})',
+      [clusterID],
+    );
+    final Map<String, int> faceIDToClusterID = {};
+    int maxClusterID = DateTime.now().millisecondsSinceEpoch;
+    for (final faceRow in result) {
+      maxClusterID += 1;
+      final faceID = faceRow[faceIDColumn] as String;
+      faceIDToClusterID[faceID] = maxClusterID;
+    }
+    await forceUpdateClusterIds(faceIDToClusterID);
+  }
 }

+ 6 - 2
mobile/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart

@@ -305,8 +305,12 @@ class ClusterFeedbackService {
     }
   }
 
-  Future<void> removePersonFromFiles(List<EnteFile> files, Person p) {
-    return FaceMLDataDB.instance.removePersonFromFiles(files, p);
+  Future<void> removeFilesFromPerson(List<EnteFile> files, Person p) {
+    return FaceMLDataDB.instance.removeFilesFromPerson(files, p);
+  }
+
+  Future<void> removeFilesFromCluster(List<EnteFile> files, int clusterID) {
+    return FaceMLDataDB.instance.removeFilesFromCluster(files, clusterID);
   }
 
   Future<bool> checkAndDoAutomaticMerges(Person p) async {

+ 46 - 2
mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart

@@ -401,12 +401,13 @@ class _FileSelectionActionsWidgetState
       ),
     );
 
+    // if (widget.type == GalleryType.cluster && widget.clusterID != null) {
     if (widget.type == GalleryType.cluster) {
       items.add(
         SelectionActionButton(
           labelText: 'Remove',
           icon: CupertinoIcons.minus,
-          onTap: () => showToast(context, 'yet to implement'),
+          onTap: anyUploadedFiles ? _onRemoveFromClusterClicked : null,
         ),
       );
     }
@@ -690,7 +691,7 @@ class _FileSelectionActionsWidgetState
     );
     if (actionResult?.action != null) {
       if (actionResult!.action == ButtonAction.first) {
-        await ClusterFeedbackService.instance.removePersonFromFiles(
+        await ClusterFeedbackService.instance.removeFilesFromPerson(
           widget.selectedFiles.files.toList(),
           widget.person!,
         );
@@ -703,6 +704,49 @@ class _FileSelectionActionsWidgetState
     }
   }
 
+  Future<void> _onRemoveFromClusterClicked() async {
+    if (widget.clusterID == null) {
+      showShortToast(context, 'Cluster ID is null. Cannot remove files.');
+      return;
+    }
+    final actionResult = await showActionSheet(
+      context: context,
+      buttons: [
+        ButtonWidget(
+          labelText: S.of(context).yesRemove,
+          buttonType: ButtonType.neutral,
+          buttonSize: ButtonSize.large,
+          shouldStickToDarkTheme: true,
+          buttonAction: ButtonAction.first,
+          isInAlert: true,
+        ),
+        ButtonWidget(
+          labelText: S.of(context).cancel,
+          buttonType: ButtonType.secondary,
+          buttonSize: ButtonSize.large,
+          buttonAction: ButtonAction.second,
+          shouldStickToDarkTheme: true,
+          isInAlert: true,
+        ),
+      ],
+      title: "Remove these photos?",
+      actionSheetType: ActionSheetType.defaultActionSheet,
+    );
+    if (actionResult?.action != null) {
+      if (actionResult!.action == ButtonAction.first) {
+        await ClusterFeedbackService.instance.removeFilesFromCluster(
+          widget.selectedFiles.files.toList(),
+          widget.clusterID!,
+        );
+      }
+      Bus.instance.fire(PeopleChangedEvent());
+    }
+    widget.selectedFiles.clearAll();
+    if (mounted) {
+      setState(() => {});
+    }
+  }
+
   Future<void> _copyLink() async {
     if (_cachedCollectionForSharedLink != null) {
       final String collectionKey = Base58Encode(