[mob][photos] Curate location filters in isolate
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user