fix: get effective selected people code

This commit is contained in:
Prateek Sunal
2025-05-21 03:27:38 +05:30
parent cde6ebfa39
commit ace375b7f6
3 changed files with 61 additions and 23 deletions

View File

@@ -227,21 +227,21 @@ extension SectionTypeExtensions on SectionType {
}
Future<List<SearchResult>> getData(
BuildContext context, {
BuildContext? context, {
int? limit,
}) {
switch (this) {
case SectionType.face:
return SearchService.instance.getAllFace(limit);
case SectionType.magic:
return SearchService.instance.getMagicSectionResults(context);
return SearchService.instance.getMagicSectionResults(context!);
case SectionType.moment:
if (flagService.internalUser) {
// TODO: lau: remove this whole smart memories and moment altogether
return SearchService.instance.smartMemories(context, limit);
return SearchService.instance.smartMemories(context!, limit);
}
return SearchService.instance.getRandomMomentsSearchResults(context);
return SearchService.instance.getRandomMomentsSearchResults(context!);
case SectionType.location:
return SearchService.instance.getAllLocationTags(limit);
@@ -254,7 +254,7 @@ extension SectionTypeExtensions on SectionType {
case SectionType.fileTypesAndExtension:
return SearchService.instance
.getAllFileTypesAndExtensionsResults(context, limit);
.getAllFileTypesAndExtensionsResults(context!, limit);
}
}

View File

@@ -3,6 +3,9 @@ import 'package:fluttertoast/fluttertoast.dart';
import 'package:logging/logging.dart';
import 'package:photos/db/files_db.dart';
import 'package:photos/models/file/file.dart';
import "package:photos/models/search/generic_search_result.dart";
import "package:photos/models/search/hierarchical/face_filter.dart";
import "package:photos/models/search/search_types.dart";
import 'package:photos/service_locator.dart';
import 'package:photos/services/home_widget_service.dart';
import 'package:photos/services/machine_learning/face_ml/person/person_service.dart';
@@ -189,9 +192,9 @@ class PeopleHomeWidgetService {
}
// Check if selected people exist
final peopleIds = getSelectedPeople();
final peopleIds = await _getEffectiveSelectedPeopleIds();
try {
for (final id in peopleIds ?? []) {
for (final id in peopleIds) {
final person = await PersonService.instance.getPerson(id);
if (person == null) {
_logger.warning("Person not found for id: $id");
@@ -228,11 +231,37 @@ class PeopleHomeWidgetService {
return peopleChanged ?? true;
}
Future<List<String>> _getEffectiveSelectedPeopleIds() async {
var peopleIds = getSelectedPeople();
if (peopleIds == null || peopleIds.isEmpty) {
// Search Filter with face and pick top two faces
final searchFilter = await SectionType.face.getData(null).then(
(value) => List<GenericSearchResult>.from(value).where(
(element) =>
(element.hierarchicalSearchFilter as FaceFilter).personId !=
null,
),
);
if (searchFilter.isNotEmpty) {
peopleIds = searchFilter
.take(2)
.map((e) => (e.hierarchicalSearchFilter as FaceFilter).personId!)
.toList();
} else {
_logger.warning("No selected people found");
}
}
return peopleIds ?? [];
}
Future<Map<String, (String, Iterable<EnteFile>)>> _getPeople() async {
final peopleIds = getSelectedPeople();
final peopleIds = await _getEffectiveSelectedPeopleIds();
final Map<String, (String, Iterable<EnteFile>)> peopleFiles = {};
for (final id in peopleIds ?? []) {
for (final id in peopleIds) {
final person = await PersonService.instance.getPerson(id);
if (person == null) {
_logger.warning("Person not found for id: $id");

View File

@@ -50,24 +50,41 @@ class _PeopleSectionAllWidgetState extends State<PeopleSectionAllWidget> {
@override
void initState() {
super.initState();
sectionData = SectionType.face.getData(context).then(
(value) => List.from(value),
);
sectionData = getResults();
final streamsToListenTo = SectionType.face.viewAllUpdateEvents();
for (Stream<Event> stream in streamsToListenTo) {
streamSubscriptions.add(
stream.listen((event) async {
setState(() {
sectionData = SectionType.face.getData(context).then(
(value) => List.from(value),
);
sectionData = getResults();
});
}),
);
}
}
Future<List<GenericSearchResult>> getResults() async {
final results =
List<GenericSearchResult>.from(await SectionType.face.getData(context));
if (widget.namedOnly) {
results.removeWhere(
(element) =>
(element.hierarchicalSearchFilter as FaceFilter).personId == null,
);
if (widget.selectedPeople?.personIds.isEmpty ?? false) {
widget.selectedPeople!.select(
results
.take(2)
.map((e) => (e.hierarchicalSearchFilter as FaceFilter).personId!)
.toSet(),
);
}
}
return results;
}
@override
void dispose() {
for (var subscriptions in streamSubscriptions) {
@@ -95,14 +112,6 @@ class _PeopleSectionAllWidgetState extends State<PeopleSectionAllWidget> {
return Center(child: Text(S.of(context).noResultsFound + '.'));
} else {
final results = snapshot.data!;
if (widget.namedOnly) {
results.removeWhere(
(element) =>
(element.hierarchicalSearchFilter as FaceFilter).personId ==
null,
);
}
final screenWidth = MediaQuery.of(context).size.width;
final crossAxisCount = (screenWidth / 100).floor();