diff --git a/lib/main.dart b/lib/main.dart index 10531e961..92719fe22 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -34,7 +34,7 @@ import 'package:photos/services/memories_service.dart'; import 'package:photos/services/push_service.dart'; import 'package:photos/services/remote_sync_service.dart'; import 'package:photos/services/search_service.dart'; -import "package:photos/services/semantic_search_service.dart"; +import 'package:photos/services/semantic_search/semantic_search_service.dart'; import "package:photos/services/storage_bonus_service.dart"; import 'package:photos/services/sync_service.dart'; import 'package:photos/services/trash_sync_service.dart'; @@ -190,7 +190,7 @@ Future _init(bool isBackground, {String via = ''}) async { }); } FeatureFlagService.instance.init(); - SemanticSearchService.instance.init(); + SemanticSearchService.instance.init(preferences); // Can not including existing tf/ml binaries as they are not being built // from source. diff --git a/lib/services/search_service.dart b/lib/services/search_service.dart index 625239133..736b12a34 100644 --- a/lib/services/search_service.dart +++ b/lib/services/search_service.dart @@ -17,7 +17,7 @@ import 'package:photos/models/search/generic_search_result.dart'; import 'package:photos/models/search/search_result.dart'; import 'package:photos/services/collections_service.dart'; import "package:photos/services/location_service.dart"; -import "package:photos/services/semantic_search_service.dart"; +import 'package:photos/services/semantic_search/semantic_search_service.dart'; import "package:photos/states/location_screen_state.dart"; import "package:photos/ui/viewer/location/location_screen.dart"; import 'package:photos/utils/date_time_util.dart'; diff --git a/lib/services/semantic_search/embedding_store.dart b/lib/services/semantic_search/embedding_store.dart new file mode 100644 index 000000000..54c9dc4dc --- /dev/null +++ b/lib/services/semantic_search/embedding_store.dart @@ -0,0 +1,18 @@ +import "package:photos/services/semantic_search/remote_embedding.dart"; +import "package:shared_preferences/shared_preferences.dart"; + +class EmbeddingStore { + EmbeddingStore._privateConstructor(); + + static final EmbeddingStore instance = EmbeddingStore._privateConstructor(); + + late SharedPreferences _preferences; + + Future init(SharedPreferences preferences) async { + _preferences = preferences; + } + + Future> fetchEmbeddings() async { + return []; + } +} diff --git a/lib/services/semantic_search/remote_embedding.dart b/lib/services/semantic_search/remote_embedding.dart new file mode 100644 index 000000000..003b04ae7 --- /dev/null +++ b/lib/services/semantic_search/remote_embedding.dart @@ -0,0 +1,30 @@ +import "dart:convert"; + +class RemoteEmbedding { + final int fileID; + final String model; + final String encryptedEmbedding; + final String decryptionHeader; + final int updationTime; + + RemoteEmbedding({ + required this.fileID, + required this.model, + required this.encryptedEmbedding, + required this.decryptionHeader, + required this.updationTime, + }); + + factory RemoteEmbedding.fromMap(Map map) { + return RemoteEmbedding( + fileID: map['fileID']?.toInt() ?? 0, + model: map['model'] ?? '', + encryptedEmbedding: map['encryptedEmbedding'] ?? '', + decryptionHeader: map['decryptionHeader'] ?? '', + updationTime: map['updationTime']?.toInt() ?? 0, + ); + } + + factory RemoteEmbedding.fromJson(String source) => + RemoteEmbedding.fromMap(json.decode(source)); +} diff --git a/lib/services/semantic_search_service.dart b/lib/services/semantic_search/semantic_search_service.dart similarity index 93% rename from lib/services/semantic_search_service.dart rename to lib/services/semantic_search/semantic_search_service.dart index e96e82466..fde6f7f7a 100644 --- a/lib/services/semantic_search_service.dart +++ b/lib/services/semantic_search/semantic_search_service.dart @@ -6,10 +6,14 @@ import "package:computer/computer.dart"; import "package:flutter/services.dart"; import "package:logging/logging.dart"; import "package:path_provider/path_provider.dart"; +import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/events/sync_status_update_event.dart"; import "package:photos/models/embedding.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/services/semantic_search/embedding_store.dart"; import "package:photos/utils/thumbnail_util.dart"; +import "package:shared_preferences/shared_preferences.dart"; class SemanticSearchService { SemanticSearchService._privateConstructor(); @@ -25,8 +29,15 @@ class SemanticSearchService { Future>? _ongoingRequest; PendingQuery? _nextQuery; - Future init() async { + Future init(SharedPreferences preferences) async { await _loadModel(); + await EmbeddingStore.instance.init(preferences); + Bus.instance.on().listen((event) async { + if (event.status == SyncStatus.diffSynced) { + EmbeddingStore.instance.fetchEmbeddings(); + } + }); + _computeMissingEmbeddings(); }