[mob][photos] Show magic filter recommendations for a gallery using magic cache used for the discovery section

This commit is contained in:
ashilkn
2024-10-19 19:26:43 +05:30
parent 0fc63396b7
commit f66e49313d
4 changed files with 67 additions and 18 deletions

View File

@@ -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;
}
}

View File

@@ -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");

View File

@@ -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),
),
),
);
}

View File

@@ -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;
}