From b54f082cb6d8f637863bc5b3249154137cb4308e Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Tue, 14 Nov 2023 13:26:54 +0530 Subject: [PATCH] Move from SQLite to ObjectBox for storing embeddings --- lib/core/configuration.dart | 2 + lib/db/files_db.dart | 142 +---- lib/db/object_box.dart | 27 + lib/main.dart | 2 + lib/models/embedding.dart | 12 +- lib/objectbox-model.json | 47 ++ lib/objectbox.g.dart | 171 ++++++ .../semantic_search/embedding_store.dart | 21 +- .../semantic_search_service.dart | 21 +- pubspec.lock | 490 ++++++++++-------- pubspec.yaml | 3 + 11 files changed, 570 insertions(+), 368 deletions(-) create mode 100644 lib/db/object_box.dart create mode 100644 lib/objectbox-model.json create mode 100644 lib/objectbox.g.dart diff --git a/lib/core/configuration.dart b/lib/core/configuration.dart index e00549930..d24943c20 100644 --- a/lib/core/configuration.dart +++ b/lib/core/configuration.dart @@ -12,6 +12,7 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/db/collections_db.dart'; import 'package:photos/db/files_db.dart'; import 'package:photos/db/memories_db.dart'; +import "package:photos/db/object_box.dart"; import 'package:photos/db/public_keys_db.dart'; import 'package:photos/db/trash_db.dart'; import 'package:photos/db/upload_locks_db.dart'; @@ -156,6 +157,7 @@ class Configuration { _cachedToken = null; _secretKey = null; await FilesDB.instance.clearTable(); + await ObjectBox.instance.clearTable(); await CollectionsDB.instance.clearTable(); await MemoriesDB.instance.clearTable(); await PublicKeysDB.instance.clearTable(); diff --git a/lib/db/files_db.dart b/lib/db/files_db.dart index c318bcf26..dfc27e11f 100644 --- a/lib/db/files_db.dart +++ b/lib/db/files_db.dart @@ -6,7 +6,6 @@ import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import "package:photos/extensions/stop_watch.dart"; import 'package:photos/models/backup_status.dart'; -import "package:photos/models/embedding.dart"; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file/file_type.dart'; import 'package:photos/models/file_load_result.dart'; @@ -31,7 +30,6 @@ class FilesDB { static const filesTable = 'files'; static const tempTable = 'temp_files'; - static const embeddingsTable = 'clip_embeddings'; static const columnGeneratedID = '_id'; static const columnUploadedFileID = 'uploaded_file_id'; @@ -59,8 +57,6 @@ class FilesDB { static const columnThumbnailDecryptionHeader = 'thumbnail_decryption_header'; static const columnMetadataDecryptionHeader = 'metadata_decryption_header'; static const columnFileSize = 'file_size'; - static const columnEmbedding = 'embedding'; - static const columnModel = 'model'; // MMD -> Magic Metadata static const columnMMdEncodedJson = 'mmd_encoded_json'; @@ -90,7 +86,6 @@ class FilesDB { ...updateIndexes(), ...createEntityDataTable(), ...addAddedTime(), - ...createEmbeddingsTable(), ]; final dbConfig = MigrationConfig( @@ -387,26 +382,12 @@ class FilesDB { ]; } - static List createEmbeddingsTable() { - return [ - ''' - CREATE TABLE IF NOT EXISTS $embeddingsTable ( - $columnUploadedFileID INTEGER PRIMARY KEY, - $columnModel TEXT NOT NULL, - $columnEmbedding TEXT NOT NULL, - $columnUpdationTime INTEGER - ); - ''' - ]; - } - Future clearTable() async { final db = await instance.database; await db.delete(filesTable); await db.delete("device_files"); await db.delete("device_collections"); await db.delete("entities"); - await db.delete(embeddingsTable); } Future deleteDB() async { @@ -1557,89 +1538,38 @@ class FilesDB { return FileLoadResult(filteredFiles, files.length == limit); } - Future upsertEmbedding(Embedding embedding) async { - final db = await instance.database; - await db.insert( - embeddingsTable, - _getRowForEmbedding(embedding), - conflictAlgorithm: ConflictAlgorithm.replace, - ); - } - - Future insertEmbeddings(List embeddings) async { - final db = await database; - var batch = db.batch(); - int batchCounter = 0; - for (final embedding in embeddings) { - if (batchCounter == 400) { - await batch.commit(noResult: true); - batch = db.batch(); - batchCounter = 0; - } - batch.insert( - embeddingsTable, - _getRowForEmbedding(embedding), - conflictAlgorithm: ConflictAlgorithm.replace, - ); - batchCounter++; - } - await batch.commit(noResult: true); - } - - Future> getAllEmbeddings() async { + Future> getOwnedFileIDs(int ownerID) async { final db = await instance.database; final results = await db.query( - embeddingsTable, + filesTable, + columns: [columnUploadedFileID], + where: + '($columnOwnerID = $ownerID AND $columnUploadedFileID IS NOT NULL AND $columnUploadedFileID IS NOT -1)', + distinct: true, ); - return _convertToEmbeddings(results); - } - - Future> getAllEmbeddingsV2() async { - final db = await instance.database; - final List allEmbeddings = []; - - int offset = 0; - while (true) { - final results = await db.query( - embeddingsTable, - orderBy: '$columnUploadedFileID ASC', - limit: 5000, - offset: offset, - ); - - if (results.isEmpty) { - break; // No more results left to fetch - } - - allEmbeddings.addAll(_convertToEmbeddings(results)); - - offset += 5000; // Increment offset for the next batch + final ids = []; + for (final result in results) { + ids.add(result[columnUploadedFileID] as int); } - - return allEmbeddings; + return ids; } - Future> getUnSyncedEmbeddings() async { + Future> getUploadedFiles(List uploadedIDs) async { final db = await instance.database; + String inParam = ""; + for (final id in uploadedIDs) { + inParam += "'" + id.toString() + "',"; + } + inParam = inParam.substring(0, inParam.length - 1); final results = await db.query( - embeddingsTable, - where: '$columnUpdationTime IS NULL', + filesTable, + where: '$columnUploadedFileID IN ($inParam)', + groupBy: columnUploadedFileID, ); - return _convertToEmbeddings(results); - } - - Future> getFilesWithoutEmbeddings() async { - final db = await instance.database; - final result = await db.rawQuery(''' - SELECT $filesTable.* - FROM $filesTable - LEFT JOIN $embeddingsTable ON $filesTable.$columnUploadedFileID = $embeddingsTable.$columnUploadedFileID - WHERE $filesTable.$columnUploadedFileID IS NOT NULL - AND $filesTable.$columnUploadedFileID != -1 - AND $embeddingsTable.$columnUploadedFileID IS NULL - GROUP BY $filesTable.$columnUploadedFileID; - '''); - return convertToFiles(result); + if (results.isEmpty) { + return []; + } + return convertToFiles(results); } Map _getRowForFile(EnteFile file) { @@ -1779,30 +1709,4 @@ class FilesDB { file.pubMmdEncodedJson = row[columnPubMMdEncodedJson] ?? '{}'; return file; } - - Map _getRowForEmbedding(Embedding embedding) { - final row = {}; - row[columnUploadedFileID] = embedding.fileID; - row[columnModel] = embedding.model; - row[columnEmbedding] = Embedding.encodeEmbedding(embedding.embedding); - row[columnUpdationTime] = embedding.updationTime; - return row; - } - - Embedding _getEmbeddingFromRow(Map row) { - return Embedding( - row[columnUploadedFileID], - row[columnModel], - Embedding.decodeEmbedding(row[columnEmbedding]), - updationTime: row[columnUpdationTime], - ); - } - - List _convertToEmbeddings(List> results) { - final List embeddings = []; - for (final result in results) { - embeddings.add(_getEmbeddingFromRow(result)); - } - return embeddings; - } } diff --git a/lib/db/object_box.dart b/lib/db/object_box.dart new file mode 100644 index 000000000..f7b8fb550 --- /dev/null +++ b/lib/db/object_box.dart @@ -0,0 +1,27 @@ +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; +import "package:photos/models/embedding.dart"; +import "package:photos/objectbox.g.dart"; // created by `flutter pub run build_runner build` + +class ObjectBox { + /// The Store of this app. + late final Store store; + + ObjectBox._privateConstructor(); + + static final ObjectBox instance = ObjectBox._privateConstructor(); + + Future init() async { + final docsDir = await getApplicationDocumentsDirectory(); + // Future openStore() {...} is defined in the generated objectbox.g.dart + store = await openStore(directory: p.join(docsDir.path, "obx-example")); + } + + Future clearTable() async { + getEmbeddingBox().removeAll(); + } + + Box getEmbeddingBox() { + return store.box(); + } +} diff --git a/lib/main.dart b/lib/main.dart index 38fb0f3f9..f9caa32bd 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,6 +18,7 @@ import 'package:photos/core/constants.dart'; import 'package:photos/core/error-reporting/super_logging.dart'; import 'package:photos/core/errors.dart'; import 'package:photos/core/network/network.dart'; +import "package:photos/db/object_box.dart"; import 'package:photos/db/upload_locks_db.dart'; import 'package:photos/ente_theme_data.dart'; import "package:photos/l10n/l10n.dart"; @@ -161,6 +162,7 @@ Future _init(bool isBackground, {String via = ''}) async { // Start workers asynchronously. No need to wait for them to start Computer.shared().turnOn(workersCount: 4); CryptoUtil.init(); + await ObjectBox.instance.init(); await NetworkClient.instance.init(); await Configuration.instance.init(); await UserService.instance.init(); diff --git a/lib/models/embedding.dart b/lib/models/embedding.dart index 8a2b79dd7..4e35bce99 100644 --- a/lib/models/embedding.dart +++ b/lib/models/embedding.dart @@ -1,15 +1,19 @@ import "dart:convert"; +import "package:objectbox/objectbox.dart"; + +@Entity() class Embedding { + @Id(assignable: true) final int fileID; final String model; final List embedding; int? updationTime; - Embedding( - this.fileID, - this.model, - this.embedding, { + Embedding({ + required this.fileID, + required this.model, + required this.embedding, this.updationTime, }); diff --git a/lib/objectbox-model.json b/lib/objectbox-model.json new file mode 100644 index 000000000..72d32c621 --- /dev/null +++ b/lib/objectbox-model.json @@ -0,0 +1,47 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:4067035246682038114", + "lastPropertyId": "4:7974898435327252398", + "name": "Embedding", + "properties": [ + { + "id": "1:2902120230153008095", + "name": "fileID", + "type": 6, + "flags": 129 + }, + { + "id": "2:5644004076892986076", + "name": "model", + "type": 9 + }, + { + "id": "3:4818114203635230783", + "name": "embedding", + "type": 29 + }, + { + "id": "4:7974898435327252398", + "name": "updationTime", + "type": 6 + } + ], + "relations": [] + } + ], + "lastEntityId": "1:4067035246682038114", + "lastIndexId": "0:0", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/lib/objectbox.g.dart b/lib/objectbox.g.dart new file mode 100644 index 000000000..9b0fc67c8 --- /dev/null +++ b/lib/objectbox.g.dart @@ -0,0 +1,171 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// This code was generated by ObjectBox. To update it run the generator again: +// With a Flutter package, run `flutter pub run build_runner build`. +// With a Dart package, run `dart run build_runner build`. +// See also https://docs.objectbox.io/getting-started#generate-objectbox-code + +// ignore_for_file: camel_case_types, depend_on_referenced_packages +// coverage:ignore-file + +import 'dart:typed_data'; + +import 'package:flat_buffers/flat_buffers.dart' as fb; +import 'package:objectbox/internal.dart'; // generated code can access "internal" functionality +import 'package:objectbox/objectbox.dart'; +import 'package:objectbox_flutter_libs/objectbox_flutter_libs.dart'; + +import 'package:photos/models/embedding.dart'; + +export 'package:objectbox/objectbox.dart'; // so that callers only have to import this file + +final _entities = [ + ModelEntity( + id: const IdUid(1, 4067035246682038114), + name: 'Embedding', + lastPropertyId: const IdUid(4, 7974898435327252398), + flags: 0, + properties: [ + ModelProperty( + id: const IdUid(1, 2902120230153008095), + name: 'fileID', + type: 6, + flags: 129, + ), + ModelProperty( + id: const IdUid(2, 5644004076892986076), + name: 'model', + type: 9, + flags: 0, + ), + ModelProperty( + id: const IdUid(3, 4818114203635230783), + name: 'embedding', + type: 29, + flags: 0, + ), + ModelProperty( + id: const IdUid(4, 7974898435327252398), + name: 'updationTime', + type: 6, + flags: 0, + ), + ], + relations: [], + backlinks: [], + ), +]; + +/// Shortcut for [Store.new] that passes [getObjectBoxModel] and for Flutter +/// apps by default a [directory] using `defaultStoreDirectory()` from the +/// ObjectBox Flutter library. +/// +/// Note: for desktop apps it is recommended to specify a unique [directory]. +/// +/// See [Store.new] for an explanation of all parameters. +Future openStore({ + String? directory, + int? maxDBSizeInKB, + int? fileMode, + int? maxReaders, + bool queriesCaseSensitiveDefault = true, + String? macosApplicationGroup, +}) async => + Store( + getObjectBoxModel(), + directory: directory ?? (await defaultStoreDirectory()).path, + maxDBSizeInKB: maxDBSizeInKB, + fileMode: fileMode, + maxReaders: maxReaders, + queriesCaseSensitiveDefault: queriesCaseSensitiveDefault, + macosApplicationGroup: macosApplicationGroup, + ); + +/// Returns the ObjectBox model definition for this project for use with +/// [Store.new]. +ModelDefinition getObjectBoxModel() { + final model = ModelInfo( + entities: _entities, + lastEntityId: const IdUid(1, 4067035246682038114), + lastIndexId: const IdUid(0, 0), + lastRelationId: const IdUid(0, 0), + lastSequenceId: const IdUid(0, 0), + retiredEntityUids: const [], + retiredIndexUids: const [], + retiredPropertyUids: const [], + retiredRelationUids: const [], + modelVersion: 5, + modelVersionParserMinimum: 5, + version: 1, + ); + + final bindings = { + Embedding: EntityDefinition( + model: _entities[0], + toOneRelations: (Embedding object) => [], + toManyRelations: (Embedding object) => {}, + getId: (Embedding object) => object.fileID, + setId: (Embedding object, int id) { + if (object.fileID != id) { + throw ArgumentError('Field Embedding.fileID is read-only ' + '(final or getter-only) and it was declared to be self-assigned. ' + 'However, the currently inserted object (.fileID=${object.fileID}) ' + "doesn't match the inserted ID (ID $id). " + 'You must assign an ID before calling [box.put()].'); + } + }, + objectToFB: (Embedding object, fb.Builder fbb) { + final modelOffset = fbb.writeString(object.model); + final embeddingOffset = fbb.writeListFloat64(object.embedding); + fbb.startTable(5); + fbb.addInt64(0, object.fileID); + fbb.addOffset(1, modelOffset); + fbb.addOffset(2, embeddingOffset); + fbb.addInt64(3, object.updationTime); + fbb.finish(fbb.endTable()); + return object.fileID; + }, + objectFromFB: (Store store, ByteData fbData) { + final buffer = fb.BufferContext(fbData); + final rootOffset = buffer.derefObject(0); + final fileIDParam = + const fb.Int64Reader().vTableGet(buffer, rootOffset, 4, 0); + final modelParam = const fb.StringReader(asciiOptimization: true) + .vTableGet(buffer, rootOffset, 6, ''); + final embeddingParam = + const fb.ListReader(fb.Float64Reader(), lazy: false) + .vTableGet(buffer, rootOffset, 8, []); + final updationTimeParam = + const fb.Int64Reader().vTableGetNullable(buffer, rootOffset, 10); + final object = Embedding( + fileID: fileIDParam, + model: modelParam, + embedding: embeddingParam, + updationTime: updationTimeParam, + ); + + return object; + }, + ), + }; + + return ModelDefinition(model, bindings); +} + +/// [Embedding] entity fields to define ObjectBox queries. +class Embedding_ { + /// see [Embedding.fileID] + static final fileID = + QueryIntegerProperty(_entities[0].properties[0]); + + /// see [Embedding.model] + static final model = + QueryStringProperty(_entities[0].properties[1]); + + /// see [Embedding.embedding] + static final embedding = + QueryDoubleVectorProperty(_entities[0].properties[2]); + + /// see [Embedding.updationTime] + static final updationTime = + QueryIntegerProperty(_entities[0].properties[3]); +} diff --git a/lib/services/semantic_search/embedding_store.dart b/lib/services/semantic_search/embedding_store.dart index 1434b9ea5..573a0444b 100644 --- a/lib/services/semantic_search/embedding_store.dart +++ b/lib/services/semantic_search/embedding_store.dart @@ -4,8 +4,10 @@ import "dart:typed_data"; import "package:logging/logging.dart"; import "package:photos/core/network/network.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/db/object_box.dart"; import "package:photos/models/embedding.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/objectbox.g.dart"; import "package:photos/services/semantic_search/remote_embedding.dart"; import "package:photos/utils/crypto_util.dart"; import "package:photos/utils/file_download_util.dart"; @@ -44,7 +46,12 @@ class EmbeddingStore { } Future pushEmbeddings() async { - final pendingItems = await FilesDB.instance.getUnSyncedEmbeddings(); + final query = (ObjectBox.instance + .getEmbeddingBox() + .query(Embedding_.updationTime.isNull())) + .build(); + final pendingItems = query.find(); + query.close(); for (final item in pendingItems) { final file = await FilesDB.instance.getAnyUploadedFile(item.fileID); await _pushEmbedding(file!, item); @@ -52,7 +59,7 @@ class EmbeddingStore { } Future storeEmbedding(EnteFile file, Embedding embedding) async { - await FilesDB.instance.upsertEmbedding(embedding); + ObjectBox.instance.getEmbeddingBox().put(embedding); _pushEmbedding(file, embedding); } @@ -78,7 +85,7 @@ class EmbeddingStore { ); final updationTime = response.data["updationTime"]; embedding.updationTime = updationTime; - await FilesDB.instance.upsertEmbedding(embedding); + ObjectBox.instance.getEmbeddingBox().put(embedding); } catch (e, s) { _logger.severe(e, s); } @@ -140,14 +147,14 @@ class EmbeddingStore { embeddings.add( Embedding( - embedding.fileID, - embedding.model, - decodedEmbedding, + fileID: embedding.fileID, + model: embedding.model, + embedding: decodedEmbedding, updationTime: embedding.updatedAt, ), ); } - await FilesDB.instance.insertEmbeddings(embeddings); + await ObjectBox.instance.getEmbeddingBox().putManyAsync(embeddings); _logger.info("${embeddings.length} embeddings stored"); await _preferences.setInt( kEmbeddingsSyncTimeKey, diff --git a/lib/services/semantic_search/semantic_search_service.dart b/lib/services/semantic_search/semantic_search_service.dart index 096a55e99..bf4c4a172 100644 --- a/lib/services/semantic_search/semantic_search_service.dart +++ b/lib/services/semantic_search/semantic_search_service.dart @@ -8,6 +8,7 @@ import "package:logging/logging.dart"; import "package:photos/core/configuration.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/files_db.dart"; +import "package:photos/db/object_box.dart"; import "package:photos/events/file_indexed_event.dart"; import "package:photos/events/file_uploaded_event.dart"; import "package:photos/events/sync_status_update_event.dart"; @@ -65,7 +66,7 @@ class SemanticSearchService { } Future> search(String query) async { - if (Platform.isIOS || !LocalSettings.instance.hasEnabledMagicSearch()) { + if (Platform.isIOS) { return []; } if (_ongoingRequest == null) { @@ -160,7 +161,7 @@ class SemanticSearchService { } Future getIndexStatus() async { - final embeddings = await FilesDB.instance.getAllEmbeddingsV2(); + final embeddings = ObjectBox.instance.getEmbeddingBox().getAll(); return IndexStatus(embeddings.length, _queue.length); } @@ -174,9 +175,11 @@ class SemanticSearchService { if (!LocalSettings.instance.hasEnabledMagicSearch()) { return; } - final files = await FilesDB.instance.getFilesWithoutEmbeddings(); - final ownerID = Configuration.instance.getUserID(); - files.removeWhere((f) => f.ownerID != ownerID); + final uploadedFileIDs = await FilesDB.instance + .getOwnedFileIDs(Configuration.instance.getUserID()!); + final embeddedFileIDs = _cachedEmbeddings.map((e) => e.fileID).toSet(); + uploadedFileIDs.removeWhere((id) => embeddedFileIDs.contains(id)); + final files = await FilesDB.instance.getUploadedFiles(uploadedFileIDs); _logger.info(files.length.toString() + " pending to be embedded"); _queue.addAll(files); _pollQueue(); @@ -223,9 +226,9 @@ class SemanticSearchService { return; } final embedding = Embedding( - file.uploadedFileID!, - kModelName, - result, + fileID: file.uploadedFileID!, + model: kModelName, + embedding: result, ); await EmbeddingStore.instance.storeEmbedding( file, @@ -241,7 +244,7 @@ class SemanticSearchService { Future _cacheEmbeddings() async { final startTime = DateTime.now(); - final embeddings = await FilesDB.instance.getAllEmbeddingsV2(); + final embeddings = ObjectBox.instance.store.box().getAll(); _cachedEmbeddings.clear(); _cachedEmbeddings.addAll(embeddings); final endTime = DateTime.now(); diff --git a/pubspec.lock b/pubspec.lock index 11388bd1f..f54bf5532 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,18 +13,18 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "9ebe81588e666f7e2b21309f2b5653bd9642d7f27fd0a6894278d2ff40cb9481" + sha256: "8942974ee5dc932427704ede5e0db8b5f2b8f22172964544b56e6bd37f6c3634" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.12" adaptive_theme: dependency: "direct main" description: name: adaptive_theme - sha256: "3568bb526d4823c7bb35f9ce3604af15e04cc0e9cc4f257da3604fe6b48d74ae" + sha256: "38b433c0761d9f15017a15c9ff3e15e8905d3e9bad54a489c7939da6bdf782dd" url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.4.1" analyzer: dependency: transitive description: @@ -61,10 +61,10 @@ packages: dependency: "direct main" description: name: archive - sha256: "80e5141fafcb3361653ce308776cfd7d45e6e9fbb429e14eec571382c0c5fecb" + sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" url: "https://pub.dev" source: hosted - version: "3.3.2" + version: "3.4.9" args: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: "direct main" description: name: background_fetch - sha256: "50ca2971ba35bb29c2533bb3ea9ad88058008d458075558a3786e8a628e23b48" + sha256: f70b28a0f7a3156195e9742229696f004ea3bf10f74039b7bf4c78a74fbda8a4 url: "https://pub.dev" source: hosted - version: "1.1.6" + version: "1.2.1" bip39: dependency: "direct main" description: @@ -109,10 +109,10 @@ packages: dependency: transitive description: name: build - sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.1" build_config: dependency: transitive description: @@ -125,18 +125,18 @@ packages: dependency: transitive description: name: build_daemon - sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 + sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.4.1" build_runner: dependency: "direct dev" description: @@ -149,10 +149,10 @@ packages: dependency: transitive description: name: build_runner_core - sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e" + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 url: "https://pub.dev" source: hosted - version: "7.2.7+1" + version: "7.2.11" built_collection: dependency: transitive description: @@ -165,34 +165,34 @@ packages: dependency: transitive description: name: built_value - sha256: "598a2a682e2a7a90f08ba39c0aaa9374c5112340f0a2e275f61b59389543d166" + sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" url: "https://pub.dev" source: hosted - version: "8.6.1" + version: "8.7.0" cached_network_image: dependency: "direct main" description: name: cached_network_image - sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 + sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.3.0" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 + sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 + sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" characters: dependency: transitive description: @@ -214,10 +214,10 @@ packages: description: path: "." ref: forked_video_player_plus - resolved-ref: "643b887f6f89aaae12646b0c79991f4f81faaa98" + resolved-ref: "2d8908efe9d7533ec76abe2e59444547c4031f28" url: "https://github.com/ente-io/chewie.git" source: git - version: "1.7.0" + version: "1.7.1" cli_util: dependency: transitive description: @@ -245,10 +245,10 @@ packages: dependency: transitive description: name: code_builder - sha256: "4ad01d6e56db961d29661561effde45e519939fdaeb46c351275b182eac70189" + sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" url: "https://pub.dev" source: hosted - version: "4.5.0" + version: "4.7.0" collection: dependency: "direct main" description: @@ -303,42 +303,50 @@ packages: dependency: "direct main" description: name: cross_file - sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9" + sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c" url: "https://pub.dev" source: hosted - version: "0.3.3+4" + version: "0.3.3+6" crypto: dependency: "direct main" description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" + cryptography: + dependency: transitive + description: + name: cryptography + sha256: d146b76d33d94548cf035233fbc2f4338c1242fa119013bead807d033fc4ae05 + url: "https://pub.dev" + source: hosted + version: "2.7.0" csslib: dependency: transitive description: name: csslib - sha256: "831883fb353c8bdc1d71979e5b342c7d88acfbc643113c14ae51e2442ea0f20f" + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" url: "https://pub.dev" source: hosted - version: "0.17.3" + version: "1.0.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.6" dart_style: dependency: transitive description: name: dart_style - sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad + sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" dbus: dependency: transitive description: @@ -359,10 +367,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: "86add5ef97215562d2e090535b0a16f197902b10c369c558a100e74ea06e8659" + sha256: "7035152271ff67b072a211152846e9f1259cf1be41e34cd3e0b5463d2d6b8419" url: "https://pub.dev" source: hosted - version: "9.0.3" + version: "9.1.0" device_info_plus_platform_interface: dependency: transitive description: @@ -391,18 +399,18 @@ packages: dependency: "direct main" description: name: dotted_border - sha256: "07a5c5e8d4e6e992279e190e0352be8faa5b8f96d81c77a78b2d42f060279840" + sha256: "108837e11848ca776c53b30bc870086f84b62ed6e01c503ed976e8f8c7df9c04" url: "https://pub.dev" source: hosted - version: "2.0.0+3" + version: "2.1.0" dropdown_button2: dependency: "direct main" description: name: dropdown_button2 - sha256: "374f2390161bf782b4896f0b1b24cbb2b5daaa1cfb11047c3307461dcdf44e07" + sha256: b0fe8d49a030315e9eef6c7ac84ca964250155a6224d491c1365061bc974a9e1 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.3.9" email_validator: dependency: "direct main" description: @@ -431,10 +439,10 @@ packages: dependency: "direct main" description: name: exif - sha256: c154e074234eb6ac4a09831072b4783b55f5f9e84c4b344a472a6d6aa83a9982 + sha256: a7980fdb3b7ffcd0b035e5b8a5e1eef7cadfe90ea6a4e85ebb62f87b96c7a172 url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.3.0" expandable: dependency: "direct main" description: @@ -511,50 +519,50 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: e9b36b391690cf329c6fb1de220045e97c13784c303820cd33962319580a56c6 + sha256: "45f3f9babfc6f56fb94c3cd11584cf3c9672868228373b699b94427010e01dc3" url: "https://pub.dev" source: hosted - version: "2.13.1" + version: "2.22.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: b63e3be6c96ef5c33bdec1aab23c91eb00696f6452f0519401d640938c94cba2 + sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "5.0.0" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "8c0f4c87d20e2d001a5915df238c1f9c88704231f591324205f5a5d2a7740a45" + sha256: "0631a2ec971dbc540275e2fa00c3a8a2676f0a7adbc3c197d6fba569db689d97" url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.8.1" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: a01d7b9eb43a4bad54a411edb2b4124089d88eab029191893e83c39e18ab19f7 + sha256: "9922476db960b4044a6e65152f2695d9d6eaa6658db9aa9915c47bf38b572359" url: "https://pub.dev" source: hosted - version: "14.6.2" + version: "14.7.4" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: c2fef3e30fbfa3a71d74477df102d1c2f5aad860bb68bb4086b0af3b12abedf3 + sha256: "4d18606a988337911c2572afe1b946b5c7ad5a3444864b4468ed686ca9f5cd5a" url: "https://pub.dev" source: hosted - version: "4.5.2" + version: "4.5.13" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "8d280f0110ca4946b9863e578b9879874066ac486ffa596a609aab329fb6fa7e" + sha256: "22a16175e204439156ba5f6396cd9ca4b74799744d7dbc8faa1d27efbaec7f1c" url: "https://pub.dev" source: hosted - version: "3.5.2" + version: "3.5.13" fixnum: dependency: transitive description: @@ -571,6 +579,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + flat_buffers: + dependency: transitive + description: + name: flat_buffers + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" + url: "https://pub.dev" + source: hosted + version: "2.0.5" flutter: dependency: "direct main" description: flutter @@ -580,18 +596,10 @@ packages: dependency: "direct main" description: name: flutter_animate - sha256: f611a67082d4c5ff9b8b7737ec7e675a22af70a94c8c3c22109f14b078d4d2bf + sha256: "62f346340a96192070e31e3f2a1bd30a28530f1fe8be978821e06cd56b74d6d2" url: "https://pub.dev" source: hosted - version: "4.1.1+1" - flutter_blurhash: - dependency: transitive - description: - name: flutter_blurhash - sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" - url: "https://pub.dev" - source: hosted - version: "0.7.0" + version: "4.2.0+1" flutter_cache_manager: dependency: "direct main" description: @@ -649,10 +657,10 @@ packages: dependency: "direct main" description: name: flutter_inappwebview - sha256: f73505c792cf083d5566e1a94002311be497d984b5607f25be36d685cf6361cf + sha256: d198297060d116b94048301ee6749cd2e7d03c1f2689783f52d210a6b7aba350 url: "https://pub.dev" source: hosted - version: "5.7.2+3" + version: "5.8.0" flutter_launcher_icons: dependency: "direct main" description: @@ -665,10 +673,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" flutter_local_notifications: dependency: "direct main" description: @@ -681,10 +689,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_linux - sha256: "6af440e3962eeab8459602c309d7d4ab9e62f05d5cfe58195a28f846a0b5d523" + sha256: "3c6d6db334f609a92be0c0915f40871ec56f5d2adf01e77ae364162c587c0ca8" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "2.0.0" flutter_local_notifications_platform_interface: dependency: transitive description: @@ -726,10 +734,10 @@ packages: dependency: "direct main" description: name: flutter_native_splash - sha256: af665ef80a213a9ed502845a3d7a61b9acca4100ee7e9f067a7440bc3acd6730 + sha256: d93394f22f73e810bda59e11ebe83329c5511d6460b6b7509c4e1f3c92d6d625 url: "https://pub.dev" source: hosted - version: "2.2.19" + version: "2.3.5" flutter_password_strength: dependency: "direct main" description: @@ -742,58 +750,58 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" + sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.0.17" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5" + sha256: "22dbf16f23a4bcf9d35e51be1c84ad5bb6f627750565edd70dab70f3ff5fff8f" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "8.1.0" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3" + sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.2.0" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50" + sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b + sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe" + sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee + sha256: "38f9501c7cb6f38961ef0e1eacacee2b2d4715c63cc83fe56449c4d3d0b47255" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.1" flutter_sodium: dependency: "direct main" description: @@ -832,26 +840,26 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c" + sha256: dfdde255317af381bfc1c486ed968d5a43a2ded9c931e87cbecd88767d6a71c1 url: "https://pub.dev" source: hosted - version: "8.2.2" + version: "8.2.4" freezed: dependency: "direct dev" description: name: freezed - sha256: a9520490532087cf38bf3f7de478ab6ebeb5f68bb1eb2641546d92719b224445 + sha256: "21bf2825311de65501d22e563e3d7605dff57fb5e6da982db785ae5372ff018a" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.4.5" freezed_annotation: dependency: "direct main" description: name: freezed_annotation - sha256: aeac15850ef1b38ee368d4c53ba9a847e900bb2c53a4db3f6881cbb3cb684338 + sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.4.1" frontend_server_client: dependency: transitive description: @@ -901,10 +909,10 @@ packages: dependency: transitive description: name: html - sha256: "58e3491f7bf0b6a4ea5110c0c688877460d1a6366731155c4a4580e7ded773e8" + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" url: "https://pub.dev" source: hosted - version: "0.15.3" + version: "0.15.4" http: dependency: "direct main" description: @@ -941,10 +949,10 @@ packages: dependency: "direct main" description: name: image - sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.0.17" + version: "4.1.3" image_editor: dependency: "direct main" description: @@ -973,34 +981,34 @@ packages: dependency: "direct main" description: name: in_app_purchase - sha256: "3e03b982358936b8978cdeb263c984d2959a7713b6b58cdc49993d90f84f5824" + sha256: bdda02b5b11b56d5e29c7f0c57c433db3452b0c8ce1c37cbfcf1de52946efd9f url: "https://pub.dev" source: hosted - version: "3.1.7" + version: "3.1.11" in_app_purchase_android: dependency: transitive description: name: in_app_purchase_android - sha256: "8caffed71ea381e8b2cecda8a945019a46fe6f6e24ea079def17a68a74778f37" + sha256: c4b84caa4e2c7ffebda444c5033fd8423cc3a45a6e1066929bbbcd4daf665db5 url: "https://pub.dev" source: hosted - version: "0.3.0+4" + version: "0.3.0+15" in_app_purchase_platform_interface: dependency: transitive description: name: in_app_purchase_platform_interface - sha256: "356a855d5a1f92b0d06a739e702fd732b56ee1914e6ba0f2ba08a2cb8e2cc3f8" + sha256: "5168afbc54f406f741252b66d41872c1193a0066a6edcb587176290b92e2d537" url: "https://pub.dev" source: hosted - version: "1.3.4" + version: "1.3.6" in_app_purchase_storekit: dependency: transitive description: name: in_app_purchase_storekit - sha256: f598169999604d9c40c28bb6f47b58e03c8c498e344cdc015f937a1f528982ab + sha256: "88afd256c7605d431f0ce29d0161f9554851f90ecb92ceb9e18196c4e7858d52" url: "https://pub.dev" source: hosted - version: "0.3.6+4" + version: "0.3.6+7" integration_test: dependency: "direct dev" description: flutter @@ -1042,10 +1050,10 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: "43793352f90efa5d8b251893a63d767b2f7c833120e3cc02adad55eefec04dc7" + sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 url: "https://pub.dev" source: hosted - version: "6.6.2" + version: "6.7.1" latlong2: dependency: "direct main" description: @@ -1066,10 +1074,10 @@ packages: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" lists: dependency: transitive description: @@ -1090,42 +1098,42 @@ packages: dependency: "direct main" description: name: local_auth - sha256: "0cf238be2bfa51a6c9e7e9cfc11c05ea39f2a3a4d3e5bb255d0ebc917da24401" + sha256: "7e6c63082e399b61e4af71266b012e767a5d4525dd6e9ba41e174fd42d76e115" url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.1.7" local_auth_android: dependency: "direct main" description: name: local_auth_android - sha256: "523dd636ce061ddb296cbc3db410cb8f21efb7d8798f7b9532c8038ce2f8bad5" + sha256: df4ccb3193525b8a60c78a5ca7bf188a47705bcf77bcc837a6b2cf6da64ae0e2 url: "https://pub.dev" source: hosted - version: "1.0.31" + version: "1.0.35" local_auth_ios: dependency: "direct main" description: name: local_auth_ios - sha256: edc2977c5145492f3451db9507a2f2f284ee4f408950b3e16670838726761940 + sha256: "8293faf72ef0ac4710f209edd03916c2d4c1eeab0483bdcf9b2e659c2f7d737b" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.1.5" local_auth_platform_interface: dependency: transitive description: name: local_auth_platform_interface - sha256: "9e160d59ef0743e35f1b50f4fb84dc64f55676b1b8071e319ef35e7f3bc13367" + sha256: fc5bd537970a324260fda506cfb61b33ad7426f37a8ea5c461cf612161ebba54 url: "https://pub.dev" source: hosted - version: "1.0.7" + version: "1.0.8" local_auth_windows: dependency: transitive description: name: local_auth_windows - sha256: "19323b75ab781d5362dbb15dcb7e0916d2431c7a6dbdda016ec9708689877f73" + sha256: "505ba3367ca781efb1c50d3132e44a2446bccc4163427bc203b9b4d8994d97ea" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.0.10" logging: dependency: "direct main" description: @@ -1170,18 +1178,18 @@ packages: dependency: "direct main" description: name: media_kit - sha256: "3dffc6d0c19117d51fbc42a7f89612e0595665800a596289ab7a80bdd93e0ad1" + sha256: "3289062540e3b8b9746e5c50d95bd78a9289826b7227e253dff806d002b9e67a" url: "https://pub.dev" source: hosted - version: "1.1.9" + version: "1.1.10+1" media_kit_libs_android_video: dependency: transitive description: name: media_kit_libs_android_video - sha256: a7ef60926ac528e2fabe9ee7084e648e385422a881ba914c978a7a81e6595dee + sha256: "9dd8012572e4aff47516e55f2597998f0a378e3d588d0fad0ca1f11a53ae090c" url: "https://pub.dev" source: hosted - version: "1.3.5" + version: "1.3.6" media_kit_libs_ios_video: dependency: transitive description: @@ -1210,10 +1218,10 @@ packages: dependency: "direct main" description: name: media_kit_libs_video - sha256: f130964bd4c0907d0af645ba03c8080a914776bfd2e23761a5e22ac3c0c0906a + sha256: "3688e0c31482074578652bf038ce6301a5d21e1eda6b54fc3117ffeb4bdba067" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" media_kit_libs_windows_video: dependency: transitive description: @@ -1234,10 +1242,10 @@ packages: dependency: "direct main" description: name: media_kit_video - sha256: b1a427f0540c5f052dfab73e4b76a5eb8efa7ebb5d83179cb23fc3932afc315a + sha256: c048d11a19e379aebbe810647636e3fc6d18374637e2ae12def4ff8a4b99a882 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.4" meta: dependency: transitive description: @@ -1320,14 +1328,38 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + objectbox: + dependency: "direct main" + description: + name: objectbox + sha256: "4b645c71771b87188442143a50c55ab238a8e60fe367b6a0968c0842292ffb30" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + objectbox_flutter_libs: + dependency: "direct main" + description: + name: objectbox_flutter_libs + sha256: e9a3d8e3ce0d47d6fc942921ef0444a238cd4258e8fcefe13b994cf984a8bf61 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + objectbox_generator: + dependency: "direct dev" + description: + name: objectbox_generator + sha256: aaffef7eb51b4d911bb00a7c52b19b55fe3e5a69de8ec56552cf35550a1e9beb + url: "https://pub.dev" + source: hosted + version: "2.3.1" octo_image: dependency: transitive description: name: octo_image - sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" + sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "2.0.0" open_mail_app: dependency: "direct main" description: @@ -1348,10 +1380,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a" + sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.2.0" package_info_plus_platform_interface: dependency: transitive description: @@ -1364,10 +1396,10 @@ packages: dependency: "direct main" description: name: page_transition - sha256: a7694bc120b7064a7f57c336914bb8885acf4f70bb3772c30c2fcfe6a85e43ff + sha256: dee976b1f23de9bbef5cd512fe567e9f6278caee11f5eaca9a2115c19dc49ef6 url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.1.0" password_strength: dependency: "direct main" description: @@ -1404,50 +1436,50 @@ packages: dependency: "direct main" description: name: path_provider - sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" + sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.1.1" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" + sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72 url: "https://pub.dev" source: hosted - version: "2.0.27" + version: "2.2.1" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3" + sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57 + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 url: "https://pub.dev" source: hosted - version: "2.1.11" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.1.1" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96" + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.2.1" pedantic: dependency: "direct main" description: @@ -1460,18 +1492,18 @@ packages: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.4.0" photo_manager: dependency: "direct main" description: name: photo_manager - sha256: bdc4ab1fa9fb064d8ccfea6ab44119f55b220293d7ce2e19eb5a5f998db86c88 + sha256: "2d698826421ebd045ecc0df60422e9dd24bd22b178310b68444385f783735b55" url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.8.1" photo_view: dependency: "direct main" description: @@ -1500,10 +1532,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.6" pointycastle: dependency: "direct main" description: @@ -1548,10 +1580,10 @@ packages: dependency: "direct main" description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.1" pub_semver: dependency: transitive description: @@ -1660,18 +1692,18 @@ packages: dependency: "direct main" description: name: sentry - sha256: "39c23342fc96105da449914f7774139a17a0ca8a4e70d9ad5200171f7e47d6ba" + sha256: "9cfd325611ab54b57d5e26957466823f05bea9d6cfcc8d48f11817b8bcedf0d1" url: "https://pub.dev" source: hosted - version: "7.9.0" + version: "7.12.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: ff68ab31918690da004a42e20204242a3ad9ad57da7e2712da8487060ac9767f + sha256: "0cd7d622cb63c94fd1b2f87ab508e158b950bd281e2a80f327ebf73bb217eaf3" url: "https://pub.dev" source: hosted - version: "7.9.0" + version: "7.12.0" share_plus: dependency: "direct main" description: @@ -1700,10 +1732,10 @@ packages: dependency: transitive description: name: share_plus_platform_interface - sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981" + sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.3.1" share_plus_web: dependency: transitive description: @@ -1724,58 +1756,58 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "16d3fb6b3692ad244a695c0183fca18cf81fd4b821664394a781de42386bf022" + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "6478c6bbbecfe9aced34c483171e90d7c078f5883558b30ec3163cf18402c749" + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.1" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: e014107bb79d6d3297196f4f2d0db54b5d1f85b8ea8ff63b8e8b391a02700feb + sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.4" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa" + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5" + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.1" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173" + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" shelf: dependency: transitive description: @@ -1817,18 +1849,18 @@ packages: dependency: transitive description: name: source_gen - sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" + sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" source_helper: dependency: transitive description: name: source_helper - sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" url: "https://pub.dev" source: hosted - version: "1.3.3" + version: "1.3.4" source_map_stack_trace: dependency: transitive description: @@ -1873,10 +1905,10 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "1b92f368f44b0dee2425bb861cfa17b6f6cf3961f762ff6f941d20b33355660a" + sha256: "8ed044102f3135add97be8653662052838859f5400075ef227f8ad72ae320803" url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.5.0+1" sqflite_migration: dependency: "direct main" description: @@ -2001,10 +2033,10 @@ packages: dependency: "direct main" description: name: tflite_flutter - sha256: "79e3271acd223e36c724fa6708e356191851011dbcddc2149f0e644a4879e055" + sha256: "88b203c6efd7f4269aa137ef31e760d53e6639e60cd17bb86602462f72d4176b" url: "https://pub.dev" source: hosted - version: "0.9.1" + version: "0.9.5" timezone: dependency: transitive description: @@ -2025,18 +2057,18 @@ packages: dependency: "direct main" description: name: tuple - sha256: "0ea99cd2f9352b2586583ab2ce6489d1f95a5f6de6fb9492faaf97ae2060f0aa" + sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" uni_links: dependency: "direct main" description: @@ -2097,66 +2129,66 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 + sha256: b1c9e98774adf8820c96fbc7ae3601231d324a7d5ebd8babe27b6dfac91357ba url: "https://pub.dev" source: hosted - version: "6.1.11" + version: "6.2.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: eed4e6a1164aa9794409325c3b707ff424d4d1c2a785e7db67f8bbda00e36e51 + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" url: "https://pub.dev" source: hosted - version: "6.0.35" + version: "6.2.0" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" + sha256: "4ac97281cf60e2e8c5cc703b2b28528f9b50c8f7cebc71df6bdf0845f647268a" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "6.2.0" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" + sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.1.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.1.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.2.0" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "6bb1e5d7fe53daf02a8fee85352432a40b1f868a81880e99ec7440113d5cfcab" + sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2" url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.2.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771" + sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.1.0" uuid: dependency: "direct main" description: @@ -2186,34 +2218,34 @@ packages: dependency: transitive description: name: video_player_android - sha256: f338a5a396c845f4632959511cad3542cdf3167e1b2a1a948ef07f7123c03608 + sha256: "3fe89ab07fdbce786e7eb25b58532d6eaf189ceddc091cb66cba712f8d9e8e55" url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.4.10" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: f5f5b7fe8c865be8a57fe80c2dca130772e1db775b7af4e5c5aa1905069cfc6c + sha256: fe73d636f82286a3739f5e644f95f09442cacdc436ebbe5436521dc915f3ecac url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.5.1" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: "1ca9acd7a0fb15fb1a990cb554e6f004465c6f37c99d2285766f08a4b2802988" + sha256: be72301bf2c0150ab35a8c34d66e5a99de525f6de1e8d27c0672b836fe48f73a url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.2.1" video_player_web: dependency: transitive description: name: video_player_web - sha256: "44ce41424d104dfb7cf6982cc6b84af2b007a24d126406025bf40de5d481c74c" + sha256: ab7a462b07d9ca80bed579e30fb3bce372468f1b78642e0911b10600f2c5cb5b url: "https://pub.dev" source: hosted - version: "2.0.16" + version: "2.1.2" video_thumbnail: dependency: "direct main" description: @@ -2250,10 +2282,10 @@ packages: dependency: "direct main" description: name: wakelock_plus - sha256: aac3f3258f01781ec9212df94eecef1eb9ba9350e106728def405baa096ba413 + sha256: f45a6c03aa3f8322e0a9d7f4a0482721c8789cb41d555407367650b8f9c26018 url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.3" wakelock_plus_platform_interface: dependency: transitive description: @@ -2274,10 +2306,10 @@ packages: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" web: dependency: transitive description: @@ -2306,18 +2338,18 @@ packages: dependency: transitive description: name: webkit_inspection_protocol - sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" wechat_assets_picker: dependency: "direct main" description: name: wechat_assets_picker - sha256: "18a9ac99281ed033fc3bfd2cf7d39f2ef4b76a7601eafcf4c9de09392c65c713" + sha256: "00c93a04421013040b555cdcccdb8e90f142a171d6c0d968c2b5042a76013601" url: "https://pub.dev" source: hosted - version: "8.6.3" + version: "8.7.1" widgets_to_image: dependency: "direct main" description: @@ -2330,18 +2362,18 @@ packages: dependency: transitive description: name: win32 - sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c" + sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" url: "https://pub.dev" source: hosted - version: "4.1.4" + version: "5.0.9" win32_registry: dependency: transitive description: name: win32_registry - sha256: "1c52f994bdccb77103a6231ad4ea331a244dbcef5d1f37d8462f713143b0bfae" + sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.2" wkt_parser: dependency: transitive description: @@ -2362,18 +2394,18 @@ packages: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.3.0" xmlstream: dependency: transitive description: name: xmlstream - sha256: "2d10c69a9d5fc46f71798b80ee6db15bc0d5bf560fdbdd264776cbeee0c83631" + sha256: cfc14e3f256997897df9481ae630d94c2d85ada5187ebeb868bb1aabc2c977b4 url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.1" yaml: dependency: transitive description: @@ -2383,5 +2415,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" + dart: ">=3.1.0 <4.0.0" flutter: ">=3.13.0" diff --git a/pubspec.yaml b/pubspec.yaml index a8119e9fa..57fd0e1d7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -111,6 +111,8 @@ dependencies: move_to_background: ^1.0.2 # open_file: ^3.2.1 + objectbox: ^2.3.1 + objectbox_flutter_libs: any open_mail_app: ^0.4.5 package_info_plus: ^4.1.0 page_transition: ^2.0.2 @@ -184,6 +186,7 @@ dev_dependencies: integration_test: sdk: flutter json_serializable: ^6.6.1 + objectbox_generator: any test: ^1.22.0 flutter_icons: