[mob][photos] Show magic filter recommendations for a gallery using magic cache used for the discovery section
This commit is contained in:
@@ -1,41 +1,48 @@
|
||||
import "package:flutter/widgets.dart";
|
||||
import "package:flutter/material.dart";
|
||||
import "package:photos/models/file/file.dart";
|
||||
import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart";
|
||||
|
||||
class MagicFilter extends HierarchicalSearchFilter {
|
||||
final String filterName;
|
||||
final int occurrence;
|
||||
|
||||
MagicFilter({
|
||||
required this.filterName,
|
||||
required this.occurrence,
|
||||
super.matchedUploadedIDs,
|
||||
});
|
||||
|
||||
@override
|
||||
Set<int> getMatchedUploadedIDs() {
|
||||
// TODO: implement getMatchedUploadedIDs
|
||||
throw UnimplementedError();
|
||||
return matchedUploadedIDs;
|
||||
}
|
||||
|
||||
@override
|
||||
IconData? icon() {
|
||||
// TODO: implement icon
|
||||
throw UnimplementedError();
|
||||
return Icons.auto_awesome;
|
||||
}
|
||||
|
||||
@override
|
||||
bool isMatch(EnteFile file) {
|
||||
// TODO: implement isMatch
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
bool isSameFilter(HierarchicalSearchFilter other) {
|
||||
// TODO: implement isSameFilter
|
||||
throw UnimplementedError();
|
||||
if (other is MagicFilter && other.name() == name()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@override
|
||||
String name() {
|
||||
// TODO: implement name
|
||||
throw UnimplementedError();
|
||||
return filterName;
|
||||
}
|
||||
|
||||
@override
|
||||
int relevance() {
|
||||
// TODO: implement relevance
|
||||
throw UnimplementedError();
|
||||
return occurrence;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import "package:photos/models/file/extensions/file_props.dart";
|
||||
import "package:photos/models/file/file.dart";
|
||||
import "package:photos/models/ml/discover/prompt.dart";
|
||||
import "package:photos/models/search/generic_search_result.dart";
|
||||
import "package:photos/models/search/hierarchical/hierarchical_search_filter.dart";
|
||||
import "package:photos/models/search/hierarchical/magic_filter.dart";
|
||||
import "package:photos/models/search/search_types.dart";
|
||||
import "package:photos/service_locator.dart";
|
||||
@@ -141,12 +142,18 @@ GenericSearchResult? toGenericSearchResult(
|
||||
ResultType.magic,
|
||||
title,
|
||||
enteFilesInMagicCache,
|
||||
hierarchicalSearchFilter: MagicFilter(),
|
||||
hierarchicalSearchFilter:
|
||||
//TODO: Check if matchedUploadedIDs should be passed
|
||||
MagicFilter(filterName: title, occurrence: kMostRelevantFilter),
|
||||
).heroTag(),
|
||||
),
|
||||
);
|
||||
},
|
||||
hierarchicalSearchFilter: MagicFilter(),
|
||||
//TODO: Check if matchedUploadedIDs should be passed
|
||||
hierarchicalSearchFilter: MagicFilter(
|
||||
filterName: title,
|
||||
occurrence: kMostRelevantFilter,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -269,7 +276,7 @@ class MagicCacheService {
|
||||
return _promptFuture!;
|
||||
}
|
||||
|
||||
Future<List<MagicCache>> _getMagicCache() async {
|
||||
Future<List<MagicCache>> getMagicCache() async {
|
||||
if (_magicCacheFuture != null) {
|
||||
return _magicCacheFuture!;
|
||||
}
|
||||
@@ -310,7 +317,7 @@ class MagicCacheService {
|
||||
final EnteWatch? w =
|
||||
kDebugMode ? EnteWatch("magicGenericSearchResult") : null;
|
||||
w?.start();
|
||||
final magicCaches = await _getMagicCache();
|
||||
final magicCaches = await getMagicCache();
|
||||
final List<Prompt> prompts = await getPrompts();
|
||||
if (magicCaches.isEmpty) {
|
||||
w?.log("No magic cache found");
|
||||
|
||||
@@ -1240,12 +1240,20 @@ class SearchService {
|
||||
ResultType.magic,
|
||||
query,
|
||||
files,
|
||||
hierarchicalSearchFilter: MagicFilter(),
|
||||
hierarchicalSearchFilter: MagicFilter(
|
||||
filterName: query,
|
||||
occurrence: kMostRelevantFilter,
|
||||
matchedUploadedIDs: filesToUploadedFileIDs(files),
|
||||
),
|
||||
).heroTag(),
|
||||
),
|
||||
);
|
||||
},
|
||||
hierarchicalSearchFilter: MagicFilter(),
|
||||
hierarchicalSearchFilter: MagicFilter(
|
||||
filterName: query,
|
||||
occurrence: kMostRelevantFilter,
|
||||
matchedUploadedIDs: filesToUploadedFileIDs(files),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -16,12 +16,15 @@ import "package:photos/models/search/hierarchical/face_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/models/search/hierarchical/magic_filter.dart";
|
||||
import "package:photos/services/collections_service.dart";
|
||||
import "package:photos/services/location_service.dart";
|
||||
import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart";
|
||||
import "package:photos/services/machine_learning/face_ml/person/person_service.dart";
|
||||
import "package:photos/services/magic_cache_service.dart";
|
||||
import "package:photos/services/search_service.dart";
|
||||
import "package:photos/ui/viewer/gallery/state/search_filter_data_provider.dart";
|
||||
import "package:photos/utils/file_util.dart";
|
||||
|
||||
Future<List<EnteFile>> getFilteredFiles(
|
||||
List<HierarchicalSearchFilter> filters,
|
||||
@@ -118,9 +121,11 @@ void curateFilters(
|
||||
);
|
||||
final contactsFilters = _curateContactsFilter(files);
|
||||
final faceFilters = await curateFaceFilters(files);
|
||||
final magicFilters = await curateMagicFilters(files);
|
||||
|
||||
searchFilterDataProvider.clearAndAddRecommendations(
|
||||
[
|
||||
...magicFilters,
|
||||
...faceFilters,
|
||||
...fileTypeFilters,
|
||||
...contactsFilters,
|
||||
@@ -358,3 +363,25 @@ Future<List<FaceFilter>> curateFaceFilters(
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<MagicFilter>> curateMagicFilters(List<EnteFile> files) async {
|
||||
final magicFilters = <MagicFilter>[];
|
||||
|
||||
final magicCaches = await MagicCacheService.instance.getMagicCache();
|
||||
final filesUploadedFileIDs = filesToUploadedFileIDs(files);
|
||||
for (MagicCache magicCache in magicCaches) {
|
||||
final uploadedIDs = magicCache.fileUploadedIDs.toSet();
|
||||
final intersection = uploadedIDs.intersection(filesUploadedFileIDs);
|
||||
|
||||
if (intersection.length > 3) {
|
||||
magicFilters.add(
|
||||
MagicFilter(
|
||||
filterName: magicCache.title,
|
||||
occurrence: intersection.length,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return magicFilters;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user