[mob][photos] Consistent face thumbnails in hierarchical

This commit is contained in:
laurenspriem
2024-11-23 11:26:27 +05:30
parent 47ad0337bc
commit 733fd45d6f
4 changed files with 44 additions and 7 deletions

View File

@@ -175,6 +175,7 @@ class _HierarchicalSearchGalleryState extends State<HierarchicalSearchGallery> {
clusterID:
_firstUnnamedAppliedFaceFilter!.clusterId,
thumbnailFallback: false,
cannotTrustFile: true,
),
actionIcon: Icons.add_outlined,
text: S.of(context).savePerson,

View File

@@ -77,6 +77,7 @@ class _FaceFilterChipState extends State<FaceFilterChip> {
clusterID: widget.clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
),

View File

@@ -92,6 +92,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters.first.clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
);
@@ -108,6 +109,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters.first.clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
const SizedBox(width: 1),
@@ -120,6 +122,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters.last.clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
],
@@ -139,6 +142,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters[0].clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
const SizedBox(width: 1),
@@ -158,6 +162,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters[1].clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
),
@@ -175,6 +180,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters[2].clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
),
@@ -204,6 +210,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters[0].clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
),
@@ -221,6 +228,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters[1].clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
),
@@ -243,6 +251,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters[2].clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
),
@@ -260,6 +269,7 @@ class _OnlyThemFilterThumbnail extends StatelessWidget {
clusterID: faceFilters[3].clusterId,
thumbnailFallback: false,
useFullFile: false,
cannotTrustFile: true,
),
),
),

View File

@@ -8,6 +8,7 @@ import 'package:photos/models/file/file.dart';
import "package:photos/models/ml/face/face.dart";
import "package:photos/models/ml/face/person.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/common/loading_widget.dart";
import "package:photos/ui/viewer/file/thumbnail_widget.dart";
@@ -19,6 +20,7 @@ class PersonFaceWidget extends StatelessWidget {
final String? clusterID;
final bool useFullFile;
final bool thumbnailFallback;
final bool cannotTrustFile;
final Uint8List? faceCrop;
// PersonFaceWidget constructor checks that both personId and clusterID are not null
@@ -29,6 +31,7 @@ class PersonFaceWidget extends StatelessWidget {
this.clusterID,
this.useFullFile = true,
this.thumbnailFallback = true,
this.cannotTrustFile = false,
this.faceCrop,
super.key,
}) : assert(
@@ -79,16 +82,42 @@ class PersonFaceWidget extends StatelessWidget {
Future<Uint8List?> _getFaceCrop() async {
try {
EnteFile? fileForFaceCrop = file;
String? personAvatarFaceID;
if (personId != null) {
final PersonEntity? personEntity =
await PersonService.instance.getPerson(personId!);
if (personEntity != null) {
personAvatarFaceID = personEntity.data.avatarFaceID;
if (personAvatarFaceID == null && cannotTrustFile) {
final allFaces =
await MLDataDB.instance.getFaceIDsForPerson(personId!);
final allFileIDs = allFaces.map((e) => getFileIdFromFaceId(e));
final fileIDToCreationTime =
await FilesDB.instance.getFileIDToCreationTime();
// Get the file with the most recent creation time
final recentFileID = allFileIDs.reduce((a, b) {
final aTime = fileIDToCreationTime[a];
final bTime = fileIDToCreationTime[b];
if (aTime == null) {
return b;
}
if (bTime == null) {
return a;
}
return (aTime >= bTime) ? a : b;
});
if (fileForFaceCrop.uploadedFileID != recentFileID) {
fileForFaceCrop =
await FilesDB.instance.getAnyUploadedFile(recentFileID);
if (fileForFaceCrop == null) return null;
}
}
}
}
final Face? face = await MLDataDB.instance.getCoverFaceForPerson(
recentFileID: file.uploadedFileID!,
recentFileID: fileForFaceCrop.uploadedFileID!,
avatarFaceId: personAvatarFaceID,
personID: personId,
clusterID: clusterID,
@@ -99,13 +128,10 @@ class PersonFaceWidget extends StatelessWidget {
);
return null;
}
EnteFile? fileForFaceCrop = file;
if (face.fileID != file.uploadedFileID!) {
if (face.fileID != fileForFaceCrop.uploadedFileID!) {
fileForFaceCrop =
await FilesDB.instance.getAnyUploadedFile(face.fileID);
}
if (fileForFaceCrop == null) {
return null;
if (fileForFaceCrop == null) return null;
}
final cropMap = await getCachedFaceCrops(
fileForFaceCrop,
@@ -122,5 +148,4 @@ class PersonFaceWidget extends StatelessWidget {
return null;
}
}
}