[mob][photos] Curate location filters in isolate

This commit is contained in:
ashilkn
2024-10-04 15:30:45 +05:30
parent 3427f1778e
commit e2897b7d18
3 changed files with 78 additions and 4 deletions

View File

@@ -42,6 +42,20 @@ class LocationService {
);
}
Future<Map<LocationTag, int>> getLocationTagsToOccurance(
List<EnteFile> files,
) async {
final locationTagEntities =
await LocationService.instance.getLocationTags();
final locationTagToOccurrence = await _computer.compute(
_getLocationTagsToOccurenceForIsolate,
param: {"files": files, "locationTagEntities": locationTagEntities},
);
return locationTagToOccurrence;
}
Future<Map<City, List<EnteFile>>> getFilesInCity(
List<EnteFile> allFiles,
String query,
@@ -230,6 +244,39 @@ class LocationService {
}
}
Map<LocationTag, int> _getLocationTagsToOccurenceForIsolate(
Map args,
) {
final List<EnteFile> files = args["files"];
final locationTagToOccurence = <LocationTag, int>{};
final locationTagEntities =
args["locationTagEntities"] as Iterable<LocalEntity<LocationTag>>;
for (EnteFile file in files) {
if (file.uploadedFileID == null ||
file.uploadedFileID == -1 ||
!file.hasLocation) continue;
for (LocalEntity<LocationTag> locationTagEntity in locationTagEntities) {
final locationTag = locationTagEntity.item;
final fileCoordinates = file.location!;
if (isFileInsideLocationTag(
locationTag.centerPoint,
fileCoordinates,
locationTag.radius,
)) {
locationTagToOccurence.update(
locationTag,
(value) => value + 1,
ifAbsent: () => 1,
);
}
}
}
return locationTagToOccurence;
}
Future<List<City>> parseCities(Map args) async {
final file = File(args["filePath"]);
final citiesJson = json.decode(await file.readAsString());

View File

@@ -104,7 +104,6 @@ class _LocationTagsWidgetState extends State<LocationTagsWidget> {
}
Future<List<Widget>> _getLocationTags() async {
// await Future.delayed(const Duration(seconds: 1));
final locationTags = await LocationService.instance
.enclosingLocationTags(widget.file.location!);
if (locationTags.isEmpty) {

View File

@@ -2,10 +2,13 @@ import "package:logging/logging.dart";
import "package:photos/db/files_db.dart";
import "package:photos/models/file/file.dart";
import "package:photos/models/file/file_type.dart";
import "package:photos/models/location_tag/location_tag.dart";
import "package:photos/models/search/hierarchical/album_filter.dart";
import "package:photos/models/search/hierarchical/file_type_filter.dart";
import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart";
import "package:photos/models/search/hierarchical/location_filter.dart";
import "package:photos/services/collections_service.dart";
import "package:photos/services/location_service.dart";
import "package:photos/services/search_service.dart";
import "package:photos/ui/viewer/gallery/state/search_filter_data_provider.dart";
@@ -59,11 +62,16 @@ void curateFilters(
await _curateAlbumFilters(searchFilterDataProvider, files);
final fileTypeFilters =
_curateFileTypeFilters(searchFilterDataProvider, files);
final locationFilters = await _curateLocationFilters(
searchFilterDataProvider,
files,
);
searchFilterDataProvider
.clearAndAddRecommendations([...albumFilters, ...fileTypeFilters]);
searchFilterDataProvider.clearAndAddRecommendations(
[...albumFilters, ...locationFilters, ...fileTypeFilters],
);
} catch (e) {
Logger("HierarchicalSearchUtil").severe("Failed to curate filters: $e");
Logger("HierarchicalSearchUtil").severe("Failed to curate filters", e);
}
}
@@ -152,3 +160,23 @@ List<FileTypeFilter> _curateFileTypeFilters(
return fileTypeFilters;
}
Future<List<LocationFilter>> _curateLocationFilters(
SearchFilterDataProvider searchFilterDataProvider,
List<EnteFile> files,
) async {
final locationFilters = <LocationFilter>[];
final locationTagToOccurrence =
await LocationService.instance.getLocationTagsToOccurance(files);
for (LocationTag locationTag in locationTagToOccurrence.keys) {
locationFilters.add(
LocationFilter(
locationTag: locationTag,
occurrence: locationTagToOccurrence[locationTag]!,
),
);
}
return locationFilters;
}