diff --git a/drift_schemas/twonly_database/drift_schema_v9.json b/drift_schemas/twonly_database/drift_schema_v9.json new file mode 100644 index 0000000..98ecfc6 --- /dev/null +++ b/drift_schemas/twonly_database/drift_schema_v9.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"contacts","was_declared_in_moor":false,"columns":[{"name":"user_id","getter_name":"userId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"username","getter_name":"username","moor_type":"string","nullable":false,"customConstraints":null,"defaultConstraints":"UNIQUE","dialectAwareDefaultConstraints":{"sqlite":"UNIQUE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unique"]},{"name":"display_name","getter_name":"displayName","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"nick_name","getter_name":"nickName","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"avatar_svg","getter_name":"avatarSvg","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"my_avatar_counter","getter_name":"myAvatarCounter","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"accepted","getter_name":"accepted","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"accepted\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"accepted\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"requested","getter_name":"requested","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"requested\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"requested\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"blocked","getter_name":"blocked","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"blocked\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"blocked\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"verified","getter_name":"verified","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"verified\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"verified\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"archived","getter_name":"archived","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"archived\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"archived\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"pinned","getter_name":"pinned","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"pinned\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"pinned\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"also_best_friend","getter_name":"alsoBestFriend","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"also_best_friend\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"also_best_friend\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"delete_messages_after_x_minutes","getter_name":"deleteMessagesAfterXMinutes","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('1440')","default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')","default_client_dart":null,"dsl_features":[]},{"name":"total_media_counter","getter_name":"totalMediaCounter","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"last_message_send","getter_name":"lastMessageSend","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_message_received","getter_name":"lastMessageReceived","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_flame_counter_change","getter_name":"lastFlameCounterChange","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_flame_sync","getter_name":"lastFlameSync","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"last_message_exchange","getter_name":"lastMessageExchange","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')","default_client_dart":null,"dsl_features":[]},{"name":"flame_counter","getter_name":"flameCounter","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["user_id"]}},{"id":1,"references":[0],"type":"table","data":{"name":"messages","was_declared_in_moor":false,"columns":[{"name":"contact_id","getter_name":"contactId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES contacts (user_id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES contacts (user_id)"},"default_dart":null,"default_client_dart":null,"dsl_features":[{"foreign_key":{"to":{"table":"contacts","column":"user_id"},"initially_deferred":false,"on_update":null,"on_delete":null}}]},{"name":"message_id","getter_name":"messageId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"message_other_id","getter_name":"messageOtherId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"media_upload_id","getter_name":"mediaUploadId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"media_download_id","getter_name":"mediaDownloadId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"response_to_message_id","getter_name":"responseToMessageId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"response_to_other_message_id","getter_name":"responseToOtherMessageId","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"acknowledge_by_user","getter_name":"acknowledgeByUser","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"acknowledge_by_user\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"acknowledge_by_user\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"media_stored","getter_name":"mediaStored","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"media_stored\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"media_stored\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"download_state","getter_name":"downloadState","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('2')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumIndexConverter(DownloadState.values)","dart_type_name":"DownloadState"}},{"name":"acknowledge_by_server","getter_name":"acknowledgeByServer","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"acknowledge_by_server\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"acknowledge_by_server\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"error_while_sending","getter_name":"errorWhileSending","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"error_while_sending\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"error_while_sending\" IN (0, 1))"},"default_dart":"const CustomExpression('0')","default_client_dart":null,"dsl_features":[]},{"name":"kind","getter_name":"kind","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(MessageKind.values)","dart_type_name":"MessageKind"}},{"name":"content_json","getter_name":"contentJson","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"opened_at","getter_name":"openedAt","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"send_at","getter_name":"sendAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')","default_client_dart":null,"dsl_features":[]},{"name":"updated_at","getter_name":"updatedAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[],"type":"table","data":{"name":"media_uploads","was_declared_in_moor":false,"columns":[{"name":"media_upload_id","getter_name":"mediaUploadId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"state","getter_name":"state","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'pending\\'')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(UploadState.values)","dart_type_name":"UploadState"}},{"name":"metadata","getter_name":"metadata","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"MediaUploadMetadataConverter()","dart_type_name":"MediaUploadMetadata"}},{"name":"message_ids","getter_name":"messageIds","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"IntListTypeConverter()","dart_type_name":"List"}},{"name":"encryption_data","getter_name":"encryptionData","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"MediaEncryptionDataConverter()","dart_type_name":"MediaEncryptionData"}},{"name":"upload_tokens","getter_name":"uploadTokens","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"MediaUploadTokensConverter()","dart_type_name":"MediaUploadTokens"}},{"name":"already_notified","getter_name":"alreadyNotified","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('\\'[]\\'')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"IntListTypeConverter()","dart_type_name":"List"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"media_downloads","was_declared_in_moor":false,"columns":[{"name":"message_id","getter_name":"messageId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"download_token","getter_name":"downloadToken","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"IntListTypeConverter()","dart_type_name":"List"}}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[],"type":"table","data":{"name":"signal_identity_key_stores","was_declared_in_moor":false,"columns":[{"name":"device_id","getter_name":"deviceId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"identity_key","getter_name":"identityKey","moor_type":"blob","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["device_id","name"]}},{"id":5,"references":[],"type":"table","data":{"name":"signal_pre_key_stores","was_declared_in_moor":false,"columns":[{"name":"pre_key_id","getter_name":"preKeyId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"pre_key","getter_name":"preKey","moor_type":"blob","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["pre_key_id"]}},{"id":6,"references":[],"type":"table","data":{"name":"signal_sender_key_stores","was_declared_in_moor":false,"columns":[{"name":"sender_key_name","getter_name":"senderKeyName","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"sender_key","getter_name":"senderKey","moor_type":"blob","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["sender_key_name"]}},{"id":7,"references":[],"type":"table","data":{"name":"signal_session_stores","was_declared_in_moor":false,"columns":[{"name":"device_id","getter_name":"deviceId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"name","getter_name":"name","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"session_record","getter_name":"sessionRecord","moor_type":"blob","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"const CustomExpression('CAST(strftime(\\'%s\\', CURRENT_TIMESTAMP) AS INTEGER)')","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[],"explicit_pk":["device_id","name"]}}]} \ No newline at end of file diff --git a/lib/app.dart b/lib/app.dart index 1f4d9c9..d09b45b 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -129,8 +129,8 @@ class _AppState extends State with WidgetsBindingObserver { themeMode: context.watch().themeMode, initialRoute: '/', routes: { - "/": (context) => AppMainWidget(initialPage: 0), - "/chats": (context) => AppMainWidget(initialPage: 1) + "/": (context) => AppMainWidget(initialPage: 1), + "/chats": (context) => AppMainWidget(initialPage: 0) }, ); }, diff --git a/lib/src/database/tables/media_uploads_table.dart b/lib/src/database/tables/media_uploads_table.dart index 5d4a9dd..4492d63 100644 --- a/lib/src/database/tables/media_uploads_table.dart +++ b/lib/src/database/tables/media_uploads_table.dart @@ -2,16 +2,18 @@ import 'dart:convert'; import 'package:drift/drift.dart'; enum UploadState { - pending, + // legacy addedToMessagesDb, - // added .compressed to filename isCompressed, - // added .encypted to filename isEncrypted, hasUploadToken, isUploaded, + // ^^ legacy ^^ + + pending, + readyToUpload, receiverNotified, - // after all users notified all media files that are not storeable by the other person will be deleted + // after all users notified all media files that are not storable by the other person will be deleted } @DataClassName('MediaUpload') @@ -20,7 +22,8 @@ class MediaUploads extends Table { TextColumn get state => textEnum().withDefault(Constant(UploadState.pending.name))(); - TextColumn get metadata => text().map(MediaUploadMetadataConverter())(); + TextColumn get metadata => + text().map(MediaUploadMetadataConverter()).nullable()(); /// exists in UploadState.addedToMessagesDb TextColumn get messageIds => text().map(IntListTypeConverter()).nullable()(); diff --git a/lib/src/database/twonly_database.dart b/lib/src/database/twonly_database.dart index 15679e7..90667d6 100644 --- a/lib/src/database/twonly_database.dart +++ b/lib/src/database/twonly_database.dart @@ -43,7 +43,7 @@ class TwonlyDatabase extends _$TwonlyDatabase { TwonlyDatabase.forTesting(DatabaseConnection super.connection); @override - int get schemaVersion => 8; + int get schemaVersion => 9; static QueryExecutor _openConnection() { return driftDatabase( @@ -57,34 +57,34 @@ class TwonlyDatabase extends _$TwonlyDatabase { @override MigrationStrategy get migration { return MigrationStrategy( - onUpgrade: stepByStep( - from1To2: (m, schema) async { - m.addColumn(schema.messages, schema.messages.errorWhileSending); - }, - from2To3: (m, schema) async { - m.addColumn(schema.contacts, schema.contacts.archived); - m.addColumn( - schema.contacts, schema.contacts.deleteMessagesAfterXMinutes); - }, - from3To4: (m, schema) async { - m.createTable(mediaUploads); - }, - from4To5: (m, schema) async { - m.createTable(mediaDownloads); - m.addColumn(schema.messages, schema.messages.mediaDownloadId); - m.addColumn(schema.messages, schema.messages.mediaUploadId); - }, - from5To6: (m, schema) async { - m.addColumn(schema.messages, schema.messages.mediaStored); - }, - from6To7: (m, schema) async { - m.addColumn(schema.contacts, schema.contacts.pinned); - }, - from7To8: (m, schema) async { - m.addColumn(schema.contacts, schema.contacts.alsoBestFriend); - m.addColumn(schema.contacts, schema.contacts.lastFlameSync); - }, - ), + onUpgrade: stepByStep(from1To2: (m, schema) async { + m.addColumn(schema.messages, schema.messages.errorWhileSending); + }, from2To3: (m, schema) async { + m.addColumn(schema.contacts, schema.contacts.archived); + m.addColumn( + schema.contacts, schema.contacts.deleteMessagesAfterXMinutes); + }, from3To4: (m, schema) async { + m.createTable(mediaUploads); + }, from4To5: (m, schema) async { + m.createTable(mediaDownloads); + m.addColumn(schema.messages, schema.messages.mediaDownloadId); + m.addColumn(schema.messages, schema.messages.mediaUploadId); + }, from5To6: (m, schema) async { + m.addColumn(schema.messages, schema.messages.mediaStored); + }, from6To7: (m, schema) async { + m.addColumn(schema.contacts, schema.contacts.pinned); + }, from7To8: (m, schema) async { + m.addColumn(schema.contacts, schema.contacts.alsoBestFriend); + m.addColumn(schema.contacts, schema.contacts.lastFlameSync); + }, from8To9: (m, schema) async { + await m.alterTable(TableMigration( + schema.mediaUploads, + columnTransformer: { + schema.mediaUploads.metadata: + schema.mediaUploads.metadata.cast(), + }, + )); + }), ); } diff --git a/lib/src/database/twonly_database.g.dart b/lib/src/database/twonly_database.g.dart index 6c12cdd..6803c12 100644 --- a/lib/src/database/twonly_database.g.dart +++ b/lib/src/database/twonly_database.g.dart @@ -1934,11 +1934,11 @@ class $MediaUploadsTable extends MediaUploads defaultValue: Constant(UploadState.pending.name)) .withConverter($MediaUploadsTable.$converterstate); @override - late final GeneratedColumnWithTypeConverter - metadata = GeneratedColumn('metadata', aliasedName, false, - type: DriftSqlType.string, requiredDuringInsert: true) - .withConverter( - $MediaUploadsTable.$convertermetadata); + late final GeneratedColumnWithTypeConverter + metadata = GeneratedColumn('metadata', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false) + .withConverter( + $MediaUploadsTable.$convertermetadatan); @override late final GeneratedColumnWithTypeConverter?, String> messageIds = GeneratedColumn('message_ids', aliasedName, true, @@ -2006,9 +2006,9 @@ class $MediaUploadsTable extends MediaUploads state: $MediaUploadsTable.$converterstate.fromSql(attachedDatabase .typeMapping .read(DriftSqlType.string, data['${effectivePrefix}state'])!), - metadata: $MediaUploadsTable.$convertermetadata.fromSql(attachedDatabase + metadata: $MediaUploadsTable.$convertermetadatan.fromSql(attachedDatabase .typeMapping - .read(DriftSqlType.string, data['${effectivePrefix}metadata'])!), + .read(DriftSqlType.string, data['${effectivePrefix}metadata'])), messageIds: $MediaUploadsTable.$convertermessageIdsn.fromSql( attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}message_ids'])), @@ -2033,6 +2033,9 @@ class $MediaUploadsTable extends MediaUploads const EnumNameConverter(UploadState.values); static JsonTypeConverter2> $convertermetadata = MediaUploadMetadataConverter(); + static JsonTypeConverter2?> $convertermetadatan = + JsonTypeConverter2.asNullable($convertermetadata); static TypeConverter, String> $convertermessageIds = IntListTypeConverter(); static TypeConverter?, String?> $convertermessageIdsn = @@ -2054,7 +2057,7 @@ class $MediaUploadsTable extends MediaUploads class MediaUpload extends DataClass implements Insertable { final int mediaUploadId; final UploadState state; - final MediaUploadMetadata metadata; + final MediaUploadMetadata? metadata; /// exists in UploadState.addedToMessagesDb final List? messageIds; @@ -2070,7 +2073,7 @@ class MediaUpload extends DataClass implements Insertable { const MediaUpload( {required this.mediaUploadId, required this.state, - required this.metadata, + this.metadata, this.messageIds, this.encryptionData, this.uploadTokens, @@ -2083,9 +2086,9 @@ class MediaUpload extends DataClass implements Insertable { map['state'] = Variable($MediaUploadsTable.$converterstate.toSql(state)); } - { + if (!nullToAbsent || metadata != null) { map['metadata'] = Variable( - $MediaUploadsTable.$convertermetadata.toSql(metadata)); + $MediaUploadsTable.$convertermetadatan.toSql(metadata)); } if (!nullToAbsent || messageIds != null) { map['message_ids'] = Variable( @@ -2110,7 +2113,9 @@ class MediaUpload extends DataClass implements Insertable { return MediaUploadsCompanion( mediaUploadId: Value(mediaUploadId), state: Value(state), - metadata: Value(metadata), + metadata: metadata == null && nullToAbsent + ? const Value.absent() + : Value(metadata), messageIds: messageIds == null && nullToAbsent ? const Value.absent() : Value(messageIds), @@ -2131,8 +2136,8 @@ class MediaUpload extends DataClass implements Insertable { mediaUploadId: serializer.fromJson(json['mediaUploadId']), state: $MediaUploadsTable.$converterstate .fromJson(serializer.fromJson(json['state'])), - metadata: $MediaUploadsTable.$convertermetadata.fromJson( - serializer.fromJson>(json['metadata'])), + metadata: $MediaUploadsTable.$convertermetadatan.fromJson( + serializer.fromJson?>(json['metadata'])), messageIds: serializer.fromJson?>(json['messageIds']), encryptionData: $MediaUploadsTable.$converterencryptionDatan.fromJson( serializer.fromJson?>(json['encryptionData'])), @@ -2148,8 +2153,8 @@ class MediaUpload extends DataClass implements Insertable { 'mediaUploadId': serializer.toJson(mediaUploadId), 'state': serializer .toJson($MediaUploadsTable.$converterstate.toJson(state)), - 'metadata': serializer.toJson>( - $MediaUploadsTable.$convertermetadata.toJson(metadata)), + 'metadata': serializer.toJson?>( + $MediaUploadsTable.$convertermetadatan.toJson(metadata)), 'messageIds': serializer.toJson?>(messageIds), 'encryptionData': serializer.toJson?>( $MediaUploadsTable.$converterencryptionDatan.toJson(encryptionData)), @@ -2162,7 +2167,7 @@ class MediaUpload extends DataClass implements Insertable { MediaUpload copyWith( {int? mediaUploadId, UploadState? state, - MediaUploadMetadata? metadata, + Value metadata = const Value.absent(), Value?> messageIds = const Value.absent(), Value encryptionData = const Value.absent(), Value uploadTokens = const Value.absent(), @@ -2170,7 +2175,7 @@ class MediaUpload extends DataClass implements Insertable { MediaUpload( mediaUploadId: mediaUploadId ?? this.mediaUploadId, state: state ?? this.state, - metadata: metadata ?? this.metadata, + metadata: metadata.present ? metadata.value : this.metadata, messageIds: messageIds.present ? messageIds.value : this.messageIds, encryptionData: encryptionData.present ? encryptionData.value : this.encryptionData, @@ -2232,7 +2237,7 @@ class MediaUpload extends DataClass implements Insertable { class MediaUploadsCompanion extends UpdateCompanion { final Value mediaUploadId; final Value state; - final Value metadata; + final Value metadata; final Value?> messageIds; final Value encryptionData; final Value uploadTokens; @@ -2249,12 +2254,12 @@ class MediaUploadsCompanion extends UpdateCompanion { MediaUploadsCompanion.insert({ this.mediaUploadId = const Value.absent(), this.state = const Value.absent(), - required MediaUploadMetadata metadata, + this.metadata = const Value.absent(), this.messageIds = const Value.absent(), this.encryptionData = const Value.absent(), this.uploadTokens = const Value.absent(), this.alreadyNotified = const Value.absent(), - }) : metadata = Value(metadata); + }); static Insertable custom({ Expression? mediaUploadId, Expression? state, @@ -2278,7 +2283,7 @@ class MediaUploadsCompanion extends UpdateCompanion { MediaUploadsCompanion copyWith( {Value? mediaUploadId, Value? state, - Value? metadata, + Value? metadata, Value?>? messageIds, Value? encryptionData, Value? uploadTokens, @@ -2306,7 +2311,7 @@ class MediaUploadsCompanion extends UpdateCompanion { } if (metadata.present) { map['metadata'] = Variable( - $MediaUploadsTable.$convertermetadata.toSql(metadata.value)); + $MediaUploadsTable.$convertermetadatan.toSql(metadata.value)); } if (messageIds.present) { map['message_ids'] = Variable( @@ -4549,7 +4554,7 @@ typedef $$MediaUploadsTableCreateCompanionBuilder = MediaUploadsCompanion Function({ Value mediaUploadId, Value state, - required MediaUploadMetadata metadata, + Value metadata, Value?> messageIds, Value encryptionData, Value uploadTokens, @@ -4559,7 +4564,7 @@ typedef $$MediaUploadsTableUpdateCompanionBuilder = MediaUploadsCompanion Function({ Value mediaUploadId, Value state, - Value metadata, + Value metadata, Value?> messageIds, Value encryptionData, Value uploadTokens, @@ -4583,7 +4588,7 @@ class $$MediaUploadsTableFilterComposer column: $table.state, builder: (column) => ColumnWithTypeConverterFilters(column)); - ColumnWithTypeConverterFilters get metadata => $composableBuilder( column: $table.metadata, @@ -4661,7 +4666,7 @@ class $$MediaUploadsTableAnnotationComposer GeneratedColumnWithTypeConverter get state => $composableBuilder(column: $table.state, builder: (column) => column); - GeneratedColumnWithTypeConverter get metadata => + GeneratedColumnWithTypeConverter get metadata => $composableBuilder(column: $table.metadata, builder: (column) => column); GeneratedColumnWithTypeConverter?, String> get messageIds => @@ -4709,7 +4714,7 @@ class $$MediaUploadsTableTableManager extends RootTableManager< updateCompanionCallback: ({ Value mediaUploadId = const Value.absent(), Value state = const Value.absent(), - Value metadata = const Value.absent(), + Value metadata = const Value.absent(), Value?> messageIds = const Value.absent(), Value encryptionData = const Value.absent(), Value uploadTokens = const Value.absent(), @@ -4727,7 +4732,7 @@ class $$MediaUploadsTableTableManager extends RootTableManager< createCompanionCallback: ({ Value mediaUploadId = const Value.absent(), Value state = const Value.absent(), - required MediaUploadMetadata metadata, + Value metadata = const Value.absent(), Value?> messageIds = const Value.absent(), Value encryptionData = const Value.absent(), Value uploadTokens = const Value.absent(), diff --git a/lib/src/database/twonly_database.steps.dart b/lib/src/database/twonly_database.steps.dart index 31d352e..2e1cb98 100644 --- a/lib/src/database/twonly_database.steps.dart +++ b/lib/src/database/twonly_database.steps.dart @@ -1701,6 +1701,184 @@ i1.GeneratedColumn _column_54(String aliasedName) => i1.GeneratedColumn _column_55(String aliasedName) => i1.GeneratedColumn('last_flame_sync', aliasedName, true, type: i1.DriftSqlType.dateTime); + +final class Schema9 extends i0.VersionedSchema { + Schema9({required super.database}) : super(version: 9); + @override + late final List entities = [ + contacts, + messages, + mediaUploads, + mediaDownloads, + signalIdentityKeyStores, + signalPreKeyStores, + signalSenderKeyStores, + signalSessionStores, + ]; + late final Shape12 contacts = Shape12( + source: i0.VersionedTable( + entityName: 'contacts', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(user_id)', + ], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + _column_6, + _column_7, + _column_8, + _column_9, + _column_39, + _column_53, + _column_54, + _column_40, + _column_10, + _column_11, + _column_12, + _column_13, + _column_14, + _column_55, + _column_15, + _column_16, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape10 messages = Shape10( + source: i0.VersionedTable( + entityName: 'messages', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_17, + _column_18, + _column_19, + _column_48, + _column_49, + _column_20, + _column_21, + _column_22, + _column_52, + _column_23, + _column_24, + _column_25, + _column_26, + _column_27, + _column_28, + _column_29, + _column_30, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape7 mediaUploads = Shape7( + source: i0.VersionedTable( + entityName: 'media_uploads', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_41, + _column_42, + _column_56, + _column_44, + _column_45, + _column_46, + _column_47, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape9 mediaDownloads = Shape9( + source: i0.VersionedTable( + entityName: 'media_downloads', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_50, + _column_51, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape2 signalIdentityKeyStores = Shape2( + source: i0.VersionedTable( + entityName: 'signal_identity_key_stores', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(device_id, name)', + ], + columns: [ + _column_31, + _column_32, + _column_33, + _column_10, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape3 signalPreKeyStores = Shape3( + source: i0.VersionedTable( + entityName: 'signal_pre_key_stores', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(pre_key_id)', + ], + columns: [ + _column_34, + _column_35, + _column_10, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape4 signalSenderKeyStores = Shape4( + source: i0.VersionedTable( + entityName: 'signal_sender_key_stores', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(sender_key_name)', + ], + columns: [ + _column_36, + _column_37, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape5 signalSessionStores = Shape5( + source: i0.VersionedTable( + entityName: 'signal_session_stores', + withoutRowId: false, + isStrict: false, + tableConstraints: [ + 'PRIMARY KEY(device_id, name)', + ], + columns: [ + _column_31, + _column_32, + _column_38, + _column_10, + ], + attachedDatabase: database, + ), + alias: null); +} + +i1.GeneratedColumn _column_56(String aliasedName) => + i1.GeneratedColumn('metadata', aliasedName, true, + type: i1.DriftSqlType.string); i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, @@ -1709,6 +1887,7 @@ i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema6 schema) from5To6, required Future Function(i1.Migrator m, Schema7 schema) from6To7, required Future Function(i1.Migrator m, Schema8 schema) from7To8, + required Future Function(i1.Migrator m, Schema9 schema) from8To9, }) { return (currentVersion, database) async { switch (currentVersion) { @@ -1747,6 +1926,11 @@ i0.MigrationStepWithVersion migrationSteps({ final migrator = i1.Migrator(database, schema); await from7To8(migrator, schema); return 8; + case 8: + final schema = Schema9(database: database); + final migrator = i1.Migrator(database, schema); + await from8To9(migrator, schema); + return 9; default: throw ArgumentError.value('Unknown migration from $currentVersion'); } @@ -1761,6 +1945,7 @@ i1.OnUpgrade stepByStep({ required Future Function(i1.Migrator m, Schema6 schema) from5To6, required Future Function(i1.Migrator m, Schema7 schema) from6To7, required Future Function(i1.Migrator m, Schema8 schema) from7To8, + required Future Function(i1.Migrator m, Schema9 schema) from8To9, }) => i0.VersionedSchema.stepByStepHelper( step: migrationSteps( @@ -1771,4 +1956,5 @@ i1.OnUpgrade stepByStep({ from5To6: from5To6, from6To7: from6To7, from7To8: from7To8, + from8To9: from8To9, )); diff --git a/lib/src/model/protobuf/api/client_to_server.pb.dart b/lib/src/model/protobuf/api/client_to_server.pb.dart index 30950c3..441d73f 100644 --- a/lib/src/model/protobuf/api/client_to_server.pb.dart +++ b/lib/src/model/protobuf/api/client_to_server.pb.dart @@ -1545,6 +1545,70 @@ class ApplicationData_UploadData extends $pb.GeneratedMessage { void clearChecksum() => clearField(4); } +class ApplicationData_UploadDone extends $pb.GeneratedMessage { + factory ApplicationData_UploadDone({ + $core.List<$core.int>? uploadToken, + $core.int? recipientsCount, + }) { + final $result = create(); + if (uploadToken != null) { + $result.uploadToken = uploadToken; + } + if (recipientsCount != null) { + $result.recipientsCount = recipientsCount; + } + return $result; + } + ApplicationData_UploadDone._() : super(); + factory ApplicationData_UploadDone.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ApplicationData_UploadDone.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData.UploadDone', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'uploadToken', $pb.PbFieldType.OY) + ..a<$core.int>(2, _omitFieldNames ? '' : 'recipientsCount', $pb.PbFieldType.OU3) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ApplicationData_UploadDone clone() => ApplicationData_UploadDone()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ApplicationData_UploadDone copyWith(void Function(ApplicationData_UploadDone) updates) => super.copyWith((message) => updates(message as ApplicationData_UploadDone)) as ApplicationData_UploadDone; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ApplicationData_UploadDone create() => ApplicationData_UploadDone._(); + ApplicationData_UploadDone createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ApplicationData_UploadDone getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ApplicationData_UploadDone? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get uploadToken => $_getN(0); + @$pb.TagNumber(1) + set uploadToken($core.List<$core.int> v) { $_setBytes(0, v); } + @$pb.TagNumber(1) + $core.bool hasUploadToken() => $_has(0); + @$pb.TagNumber(1) + void clearUploadToken() => clearField(1); + + @$pb.TagNumber(2) + $core.int get recipientsCount => $_getIZ(1); + @$pb.TagNumber(2) + set recipientsCount($core.int v) { $_setUnsignedInt32(1, v); } + @$pb.TagNumber(2) + $core.bool hasRecipientsCount() => $_has(1); + @$pb.TagNumber(2) + void clearRecipientsCount() => clearField(2); +} + class ApplicationData_DownloadData extends $pb.GeneratedMessage { factory ApplicationData_DownloadData({ $core.List<$core.int>? downloadToken, @@ -1609,6 +1673,56 @@ class ApplicationData_DownloadData extends $pb.GeneratedMessage { void clearOffset() => clearField(2); } +class ApplicationData_DownloadDone extends $pb.GeneratedMessage { + factory ApplicationData_DownloadDone({ + $core.List<$core.int>? downloadToken, + }) { + final $result = create(); + if (downloadToken != null) { + $result.downloadToken = downloadToken; + } + return $result; + } + ApplicationData_DownloadDone._() : super(); + factory ApplicationData_DownloadDone.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ApplicationData_DownloadDone.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData.DownloadDone', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create) + ..a<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'downloadToken', $pb.PbFieldType.OY) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + ApplicationData_DownloadDone clone() => ApplicationData_DownloadDone()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ApplicationData_DownloadDone copyWith(void Function(ApplicationData_DownloadDone) updates) => super.copyWith((message) => updates(message as ApplicationData_DownloadDone)) as ApplicationData_DownloadDone; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ApplicationData_DownloadDone create() => ApplicationData_DownloadDone._(); + ApplicationData_DownloadDone createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static ApplicationData_DownloadDone getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ApplicationData_DownloadDone? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.int> get downloadToken => $_getN(0); + @$pb.TagNumber(1) + set downloadToken($core.List<$core.int> v) { $_setBytes(0, v); } + @$pb.TagNumber(1) + $core.bool hasDownloadToken() => $_has(0); + @$pb.TagNumber(1) + void clearDownloadToken() => clearField(1); +} + enum ApplicationData_ApplicationData { textmessage, getuserbyusername, @@ -1629,6 +1743,8 @@ enum ApplicationData_ApplicationData { redeemadditionalcode, removeadditionaluser, updateplanoptions, + downloaddone, + uploaddone, notSet } @@ -1653,6 +1769,8 @@ class ApplicationData extends $pb.GeneratedMessage { ApplicationData_RedeemAdditionalCode? redeemadditionalcode, ApplicationData_RemoveAdditionalUser? removeadditionaluser, ApplicationData_UpdatePlanOptions? updateplanoptions, + ApplicationData_DownloadDone? downloaddone, + ApplicationData_UploadDone? uploaddone, }) { final $result = create(); if (textmessage != null) { @@ -1712,6 +1830,12 @@ class ApplicationData extends $pb.GeneratedMessage { if (updateplanoptions != null) { $result.updateplanoptions = updateplanoptions; } + if (downloaddone != null) { + $result.downloaddone = downloaddone; + } + if (uploaddone != null) { + $result.uploaddone = uploaddone; + } return $result; } ApplicationData._() : super(); @@ -1738,10 +1862,12 @@ class ApplicationData extends $pb.GeneratedMessage { 17 : ApplicationData_ApplicationData.redeemadditionalcode, 18 : ApplicationData_ApplicationData.removeadditionaluser, 19 : ApplicationData_ApplicationData.updateplanoptions, + 20 : ApplicationData_ApplicationData.downloaddone, + 21 : ApplicationData_ApplicationData.uploaddone, 0 : ApplicationData_ApplicationData.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ApplicationData', package: const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), createEmptyInstance: create) - ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]) ..aOM(1, _omitFieldNames ? '' : 'textmessage', subBuilder: ApplicationData_TextMessage.create) ..aOM(2, _omitFieldNames ? '' : 'getuserbyusername', subBuilder: ApplicationData_GetUserByUsername.create) ..aOM(3, _omitFieldNames ? '' : 'getprekeysbyuserid', subBuilder: ApplicationData_GetPrekeysByUserId.create) @@ -1761,6 +1887,8 @@ class ApplicationData extends $pb.GeneratedMessage { ..aOM(17, _omitFieldNames ? '' : 'redeemadditionalcode', subBuilder: ApplicationData_RedeemAdditionalCode.create) ..aOM(18, _omitFieldNames ? '' : 'removeadditionaluser', subBuilder: ApplicationData_RemoveAdditionalUser.create) ..aOM(19, _omitFieldNames ? '' : 'updateplanoptions', subBuilder: ApplicationData_UpdatePlanOptions.create) + ..aOM(20, _omitFieldNames ? '' : 'downloaddone', subBuilder: ApplicationData_DownloadDone.create) + ..aOM(21, _omitFieldNames ? '' : 'uploaddone', subBuilder: ApplicationData_UploadDone.create) ..hasRequiredFields = false ; @@ -1996,6 +2124,28 @@ class ApplicationData extends $pb.GeneratedMessage { void clearUpdateplanoptions() => clearField(19); @$pb.TagNumber(19) ApplicationData_UpdatePlanOptions ensureUpdateplanoptions() => $_ensure(18); + + @$pb.TagNumber(20) + ApplicationData_DownloadDone get downloaddone => $_getN(19); + @$pb.TagNumber(20) + set downloaddone(ApplicationData_DownloadDone v) { setField(20, v); } + @$pb.TagNumber(20) + $core.bool hasDownloaddone() => $_has(19); + @$pb.TagNumber(20) + void clearDownloaddone() => clearField(20); + @$pb.TagNumber(20) + ApplicationData_DownloadDone ensureDownloaddone() => $_ensure(19); + + @$pb.TagNumber(21) + ApplicationData_UploadDone get uploaddone => $_getN(20); + @$pb.TagNumber(21) + set uploaddone(ApplicationData_UploadDone v) { setField(21, v); } + @$pb.TagNumber(21) + $core.bool hasUploaddone() => $_has(20); + @$pb.TagNumber(21) + void clearUploaddone() => clearField(21); + @$pb.TagNumber(21) + ApplicationData_UploadDone ensureUploaddone() => $_ensure(20); } class Response_PreKey extends $pb.GeneratedMessage { diff --git a/lib/src/model/protobuf/api/client_to_server.pbjson.dart b/lib/src/model/protobuf/api/client_to_server.pbjson.dart index 9df599e..8c4a5d0 100644 --- a/lib/src/model/protobuf/api/client_to_server.pbjson.dart +++ b/lib/src/model/protobuf/api/client_to_server.pbjson.dart @@ -155,8 +155,10 @@ const ApplicationData$json = { {'1': 'redeemadditionalcode', '3': 17, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.RedeemAdditionalCode', '9': 0, '10': 'redeemadditionalcode'}, {'1': 'removeadditionaluser', '3': 18, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.RemoveAdditionalUser', '9': 0, '10': 'removeadditionaluser'}, {'1': 'updateplanoptions', '3': 19, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UpdatePlanOptions', '9': 0, '10': 'updateplanoptions'}, + {'1': 'downloaddone', '3': 20, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.DownloadDone', '9': 0, '10': 'downloaddone'}, + {'1': 'uploaddone', '3': 21, '4': 1, '5': 11, '6': '.client_to_server.ApplicationData.UploadDone', '9': 0, '10': 'uploaddone'}, ], - '3': [ApplicationData_TextMessage$json, ApplicationData_GetUserByUsername$json, ApplicationData_UpdateGoogleFcmToken$json, ApplicationData_GetUserById$json, ApplicationData_RedeemVoucher$json, ApplicationData_SwitchToPayedPlan$json, ApplicationData_UpdatePlanOptions$json, ApplicationData_CreateVoucher$json, ApplicationData_GetLocation$json, ApplicationData_GetVouchers$json, ApplicationData_GetAvailablePlans$json, ApplicationData_GetAddAccountsInvites$json, ApplicationData_GetCurrentPlanInfos$json, ApplicationData_RedeemAdditionalCode$json, ApplicationData_RemoveAdditionalUser$json, ApplicationData_GetPrekeysByUserId$json, ApplicationData_GetUploadToken$json, ApplicationData_UploadData$json, ApplicationData_DownloadData$json], + '3': [ApplicationData_TextMessage$json, ApplicationData_GetUserByUsername$json, ApplicationData_UpdateGoogleFcmToken$json, ApplicationData_GetUserById$json, ApplicationData_RedeemVoucher$json, ApplicationData_SwitchToPayedPlan$json, ApplicationData_UpdatePlanOptions$json, ApplicationData_CreateVoucher$json, ApplicationData_GetLocation$json, ApplicationData_GetVouchers$json, ApplicationData_GetAvailablePlans$json, ApplicationData_GetAddAccountsInvites$json, ApplicationData_GetCurrentPlanInfos$json, ApplicationData_RedeemAdditionalCode$json, ApplicationData_RemoveAdditionalUser$json, ApplicationData_GetPrekeysByUserId$json, ApplicationData_GetUploadToken$json, ApplicationData_UploadData$json, ApplicationData_UploadDone$json, ApplicationData_DownloadData$json, ApplicationData_DownloadDone$json], '8': [ {'1': 'ApplicationData'}, ], @@ -304,6 +306,15 @@ const ApplicationData_UploadData$json = { ], }; +@$core.Deprecated('Use applicationDataDescriptor instead') +const ApplicationData_UploadDone$json = { + '1': 'UploadDone', + '2': [ + {'1': 'upload_token', '3': 1, '4': 1, '5': 12, '10': 'uploadToken'}, + {'1': 'recipients_count', '3': 2, '4': 1, '5': 13, '10': 'recipientsCount'}, + ], +}; + @$core.Deprecated('Use applicationDataDescriptor instead') const ApplicationData_DownloadData$json = { '1': 'DownloadData', @@ -313,6 +324,14 @@ const ApplicationData_DownloadData$json = { ], }; +@$core.Deprecated('Use applicationDataDescriptor instead') +const ApplicationData_DownloadDone$json = { + '1': 'DownloadDone', + '2': [ + {'1': 'download_token', '3': 1, '4': 1, '5': 12, '10': 'downloadToken'}, + ], +}; + /// Descriptor for `ApplicationData`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode( 'Cg9BcHBsaWNhdGlvbkRhdGESUQoLdGV4dG1lc3NhZ2UYASABKAsyLS5jbGllbnRfdG9fc2Vydm' @@ -348,26 +367,32 @@ final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode( 'Y2xpZW50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuUmVtb3ZlQWRkaXRpb25hbFVzZXJIAF' 'IUcmVtb3ZlYWRkaXRpb25hbHVzZXISYwoRdXBkYXRlcGxhbm9wdGlvbnMYEyABKAsyMy5jbGll' 'bnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5VcGRhdGVQbGFuT3B0aW9uc0gAUhF1cGRhdG' - 'VwbGFub3B0aW9ucxpqCgtUZXh0TWVzc2FnZRIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQSEgoE' - 'Ym9keRgDIAEoDFIEYm9keRIgCglwdXNoX2RhdGEYBCABKAxIAFIIcHVzaERhdGGIAQFCDAoKX3' - 'B1c2hfZGF0YRovChFHZXRVc2VyQnlVc2VybmFtZRIaCgh1c2VybmFtZRgBIAEoCVIIdXNlcm5h' - 'bWUaNQoUVXBkYXRlR29vZ2xlRmNtVG9rZW4SHQoKZ29vZ2xlX2ZjbRgBIAEoCVIJZ29vZ2xlRm' - 'NtGiYKC0dldFVzZXJCeUlkEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBopCg1SZWRlZW1Wb3Vj' - 'aGVyEhgKB3ZvdWNoZXIYASABKAlSB3ZvdWNoZXIacAoRU3dpdGNoVG9QYXllZFBsYW4SFwoHcG' - 'xhbl9pZBgBIAEoCVIGcGxhbklkEh8KC3BheV9tb250aGx5GAIgASgIUgpwYXlNb250aGx5EiEK' - 'DGF1dG9fcmVuZXdhbBgDIAEoCFILYXV0b1JlbmV3YWwaNgoRVXBkYXRlUGxhbk9wdGlvbnMSIQ' - 'oMYXV0b19yZW5ld2FsGAEgASgIUgthdXRvUmVuZXdhbBowCg1DcmVhdGVWb3VjaGVyEh8KC3Zh' - 'bHVlX2NlbnRzGAEgASgNUgp2YWx1ZUNlbnRzGg0KC0dldExvY2F0aW9uGg0KC0dldFZvdWNoZX' - 'JzGhMKEUdldEF2YWlsYWJsZVBsYW5zGhcKFUdldEFkZEFjY291bnRzSW52aXRlcxoVChNHZXRD' - 'dXJyZW50UGxhbkluZm9zGjcKFFJlZGVlbUFkZGl0aW9uYWxDb2RlEh8KC2ludml0ZV9jb2RlGA' - 'IgASgJUgppbnZpdGVDb2RlGi8KFFJlbW92ZUFkZGl0aW9uYWxVc2VyEhcKB3VzZXJfaWQYASAB' - 'KANSBnVzZXJJZBotChJHZXRQcmVrZXlzQnlVc2VySWQSFwoHdXNlcl9pZBgBIAEoA1IGdXNlck' - 'lkGjsKDkdldFVwbG9hZFRva2VuEikKEHJlY2lwaWVudHNfY291bnQYASABKA1SD3JlY2lwaWVu' - 'dHNDb3VudBqJAQoKVXBsb2FkRGF0YRIhCgx1cGxvYWRfdG9rZW4YASABKAxSC3VwbG9hZFRva2' - 'VuEhYKBm9mZnNldBgCIAEoDVIGb2Zmc2V0EhIKBGRhdGEYAyABKAxSBGRhdGESHwoIY2hlY2tz' - 'dW0YBCABKAxIAFIIY2hlY2tzdW2IAQFCCwoJX2NoZWNrc3VtGk0KDERvd25sb2FkRGF0YRIlCg' - '5kb3dubG9hZF90b2tlbhgBIAEoDFINZG93bmxvYWRUb2tlbhIWCgZvZmZzZXQYAiABKA1SBm9m' - 'ZnNldEIRCg9BcHBsaWNhdGlvbkRhdGE='); + 'VwbGFub3B0aW9ucxJUCgxkb3dubG9hZGRvbmUYFCABKAsyLi5jbGllbnRfdG9fc2VydmVyLkFw' + 'cGxpY2F0aW9uRGF0YS5Eb3dubG9hZERvbmVIAFIMZG93bmxvYWRkb25lEk4KCnVwbG9hZGRvbm' + 'UYFSABKAsyLC5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5VcGxvYWREb25lSABS' + 'CnVwbG9hZGRvbmUaagoLVGV4dE1lc3NhZ2USFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkEhIKBG' + 'JvZHkYAyABKAxSBGJvZHkSIAoJcHVzaF9kYXRhGAQgASgMSABSCHB1c2hEYXRhiAEBQgwKCl9w' + 'dXNoX2RhdGEaLwoRR2V0VXNlckJ5VXNlcm5hbWUSGgoIdXNlcm5hbWUYASABKAlSCHVzZXJuYW' + '1lGjUKFFVwZGF0ZUdvb2dsZUZjbVRva2VuEh0KCmdvb2dsZV9mY20YASABKAlSCWdvb2dsZUZj' + 'bRomCgtHZXRVc2VyQnlJZBIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQaKQoNUmVkZWVtVm91Y2' + 'hlchIYCgd2b3VjaGVyGAEgASgJUgd2b3VjaGVyGnAKEVN3aXRjaFRvUGF5ZWRQbGFuEhcKB3Bs' + 'YW5faWQYASABKAlSBnBsYW5JZBIfCgtwYXlfbW9udGhseRgCIAEoCFIKcGF5TW9udGhseRIhCg' + 'xhdXRvX3JlbmV3YWwYAyABKAhSC2F1dG9SZW5ld2FsGjYKEVVwZGF0ZVBsYW5PcHRpb25zEiEK' + 'DGF1dG9fcmVuZXdhbBgBIAEoCFILYXV0b1JlbmV3YWwaMAoNQ3JlYXRlVm91Y2hlchIfCgt2YW' + 'x1ZV9jZW50cxgBIAEoDVIKdmFsdWVDZW50cxoNCgtHZXRMb2NhdGlvbhoNCgtHZXRWb3VjaGVy' + 'cxoTChFHZXRBdmFpbGFibGVQbGFucxoXChVHZXRBZGRBY2NvdW50c0ludml0ZXMaFQoTR2V0Q3' + 'VycmVudFBsYW5JbmZvcxo3ChRSZWRlZW1BZGRpdGlvbmFsQ29kZRIfCgtpbnZpdGVfY29kZRgC' + 'IAEoCVIKaW52aXRlQ29kZRovChRSZW1vdmVBZGRpdGlvbmFsVXNlchIXCgd1c2VyX2lkGAEgAS' + 'gDUgZ1c2VySWQaLQoSR2V0UHJla2V5c0J5VXNlcklkEhcKB3VzZXJfaWQYASABKANSBnVzZXJJ' + 'ZBo7Cg5HZXRVcGxvYWRUb2tlbhIpChByZWNpcGllbnRzX2NvdW50GAEgASgNUg9yZWNpcGllbn' + 'RzQ291bnQaiQEKClVwbG9hZERhdGESIQoMdXBsb2FkX3Rva2VuGAEgASgMUgt1cGxvYWRUb2tl' + 'bhIWCgZvZmZzZXQYAiABKA1SBm9mZnNldBISCgRkYXRhGAMgASgMUgRkYXRhEh8KCGNoZWNrc3' + 'VtGAQgASgMSABSCGNoZWNrc3VtiAEBQgsKCV9jaGVja3N1bRpaCgpVcGxvYWREb25lEiEKDHVw' + 'bG9hZF90b2tlbhgBIAEoDFILdXBsb2FkVG9rZW4SKQoQcmVjaXBpZW50c19jb3VudBgCIAEoDV' + 'IPcmVjaXBpZW50c0NvdW50Gk0KDERvd25sb2FkRGF0YRIlCg5kb3dubG9hZF90b2tlbhgBIAEo' + 'DFINZG93bmxvYWRUb2tlbhIWCgZvZmZzZXQYAiABKA1SBm9mZnNldBo1CgxEb3dubG9hZERvbm' + 'USJQoOZG93bmxvYWRfdG9rZW4YASABKAxSDWRvd25sb2FkVG9rZW5CEQoPQXBwbGljYXRpb25E' + 'YXRh'); @$core.Deprecated('Use responseDescriptor instead') const Response$json = { diff --git a/lib/src/model/protobuf/api/server_to_client.pb.dart b/lib/src/model/protobuf/api/server_to_client.pb.dart index 539959c..6443955 100644 --- a/lib/src/model/protobuf/api/server_to_client.pb.dart +++ b/lib/src/model/protobuf/api/server_to_client.pb.dart @@ -1524,6 +1524,50 @@ class Response_UploadToken extends $pb.GeneratedMessage { $core.List<$core.List<$core.int>> get downloadTokens => $_getList(1); } +class Response_DownloadTokens extends $pb.GeneratedMessage { + factory Response_DownloadTokens({ + $core.Iterable<$core.List<$core.int>>? downloadTokens, + }) { + final $result = create(); + if (downloadTokens != null) { + $result.downloadTokens.addAll(downloadTokens); + } + return $result; + } + Response_DownloadTokens._() : super(); + factory Response_DownloadTokens.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Response_DownloadTokens.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response.DownloadTokens', package: const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'), createEmptyInstance: create) + ..p<$core.List<$core.int>>(1, _omitFieldNames ? '' : 'downloadTokens', $pb.PbFieldType.PY) + ..hasRequiredFields = false + ; + + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + Response_DownloadTokens clone() => Response_DownloadTokens()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Response_DownloadTokens copyWith(void Function(Response_DownloadTokens) updates) => super.copyWith((message) => updates(message as Response_DownloadTokens)) as Response_DownloadTokens; + + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Response_DownloadTokens create() => Response_DownloadTokens._(); + Response_DownloadTokens createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static Response_DownloadTokens getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Response_DownloadTokens? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$core.List<$core.int>> get downloadTokens => $_getList(0); +} + enum Response_Ok_Ok { none, userid, @@ -1537,6 +1581,7 @@ enum Response_Ok_Ok { planballance, vouchers, addaccountsinvites, + downloadtokens, notSet } @@ -1554,6 +1599,7 @@ class Response_Ok extends $pb.GeneratedMessage { Response_PlanBallance? planballance, Response_Vouchers? vouchers, Response_AddAccountsInvites? addaccountsinvites, + Response_DownloadTokens? downloadtokens, }) { final $result = create(); if (none != null) { @@ -1592,6 +1638,9 @@ class Response_Ok extends $pb.GeneratedMessage { if (addaccountsinvites != null) { $result.addaccountsinvites = addaccountsinvites; } + if (downloadtokens != null) { + $result.downloadtokens = downloadtokens; + } return $result; } Response_Ok._() : super(); @@ -1611,10 +1660,11 @@ class Response_Ok extends $pb.GeneratedMessage { 10 : Response_Ok_Ok.planballance, 11 : Response_Ok_Ok.vouchers, 12 : Response_Ok_Ok.addaccountsinvites, + 13 : Response_Ok_Ok.downloadtokens, 0 : Response_Ok_Ok.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Response.Ok', package: const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'), createEmptyInstance: create) - ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]) ..aOB(1, _omitFieldNames ? '' : 'None', protoName: 'None') ..aInt64(2, _omitFieldNames ? '' : 'userid') ..a<$core.List<$core.int>>(3, _omitFieldNames ? '' : 'authchallenge', $pb.PbFieldType.OY) @@ -1627,6 +1677,7 @@ class Response_Ok extends $pb.GeneratedMessage { ..aOM(10, _omitFieldNames ? '' : 'planballance', subBuilder: Response_PlanBallance.create) ..aOM(11, _omitFieldNames ? '' : 'vouchers', subBuilder: Response_Vouchers.create) ..aOM(12, _omitFieldNames ? '' : 'addaccountsinvites', subBuilder: Response_AddAccountsInvites.create) + ..aOM(13, _omitFieldNames ? '' : 'downloadtokens', subBuilder: Response_DownloadTokens.create) ..hasRequiredFields = false ; @@ -1777,6 +1828,17 @@ class Response_Ok extends $pb.GeneratedMessage { void clearAddaccountsinvites() => clearField(12); @$pb.TagNumber(12) Response_AddAccountsInvites ensureAddaccountsinvites() => $_ensure(11); + + @$pb.TagNumber(13) + Response_DownloadTokens get downloadtokens => $_getN(12); + @$pb.TagNumber(13) + set downloadtokens(Response_DownloadTokens v) { setField(13, v); } + @$pb.TagNumber(13) + $core.bool hasDownloadtokens() => $_has(12); + @$pb.TagNumber(13) + void clearDownloadtokens() => clearField(13); + @$pb.TagNumber(13) + Response_DownloadTokens ensureDownloadtokens() => $_ensure(12); } enum Response_Response { diff --git a/lib/src/model/protobuf/api/server_to_client.pbjson.dart b/lib/src/model/protobuf/api/server_to_client.pbjson.dart index 7fa696a..bd7ae35 100644 --- a/lib/src/model/protobuf/api/server_to_client.pbjson.dart +++ b/lib/src/model/protobuf/api/server_to_client.pbjson.dart @@ -92,7 +92,7 @@ const Response$json = { {'1': 'ok', '3': 1, '4': 1, '5': 11, '6': '.server_to_client.Response.Ok', '9': 0, '10': 'ok'}, {'1': 'error', '3': 2, '4': 1, '5': 14, '6': '.error.ErrorCode', '9': 0, '10': 'error'}, ], - '3': [Response_Authenticated$json, Response_Plan$json, Response_Plans$json, Response_AddAccountsInvite$json, Response_AddAccountsInvites$json, Response_Transaction$json, Response_AdditionalAccount$json, Response_Voucher$json, Response_Vouchers$json, Response_PlanBallance$json, Response_Location$json, Response_PreKey$json, Response_UserData$json, Response_UploadToken$json, Response_Ok$json], + '3': [Response_Authenticated$json, Response_Plan$json, Response_Plans$json, Response_AddAccountsInvite$json, Response_AddAccountsInvites$json, Response_Transaction$json, Response_AdditionalAccount$json, Response_Voucher$json, Response_Vouchers$json, Response_PlanBallance$json, Response_Location$json, Response_PreKey$json, Response_UserData$json, Response_UploadToken$json, Response_DownloadTokens$json, Response_Ok$json], '4': [Response_TransactionTypes$json], '8': [ {'1': 'Response'}, @@ -258,6 +258,14 @@ const Response_UploadToken$json = { ], }; +@$core.Deprecated('Use responseDescriptor instead') +const Response_DownloadTokens$json = { + '1': 'DownloadTokens', + '2': [ + {'1': 'download_tokens', '3': 1, '4': 3, '5': 12, '10': 'downloadTokens'}, + ], +}; + @$core.Deprecated('Use responseDescriptor instead') const Response_Ok$json = { '1': 'Ok', @@ -274,6 +282,7 @@ const Response_Ok$json = { {'1': 'planballance', '3': 10, '4': 1, '5': 11, '6': '.server_to_client.Response.PlanBallance', '9': 0, '10': 'planballance'}, {'1': 'vouchers', '3': 11, '4': 1, '5': 11, '6': '.server_to_client.Response.Vouchers', '9': 0, '10': 'vouchers'}, {'1': 'addaccountsinvites', '3': 12, '4': 1, '5': 11, '6': '.server_to_client.Response.AddAccountsInvites', '9': 0, '10': 'addaccountsinvites'}, + {'1': 'downloadtokens', '3': 13, '4': 1, '5': 11, '6': '.server_to_client.Response.DownloadTokens', '9': 0, '10': 'downloadtokens'}, ], '8': [ {'1': 'Ok'}, @@ -347,21 +356,23 @@ final $typed_data.Uint8List responseDescriptor = $convert.base64Decode( '9wdWJsaWNfaWRlbnRpdHlfa2V5QhAKDl9zaWduZWRfcHJla2V5QhoKGF9zaWduZWRfcHJla2V5' 'X3NpZ25hdHVyZUITChFfc2lnbmVkX3ByZWtleV9pZBpZCgtVcGxvYWRUb2tlbhIhCgx1cGxvYW' 'RfdG9rZW4YASABKAxSC3VwbG9hZFRva2VuEicKD2Rvd25sb2FkX3Rva2VucxgCIAMoDFIOZG93' - 'bmxvYWRUb2tlbnMa0wUKAk9rEhQKBE5vbmUYASABKAhIAFIETm9uZRIYCgZ1c2VyaWQYAiABKA' - 'NIAFIGdXNlcmlkEiYKDWF1dGhjaGFsbGVuZ2UYAyABKAxIAFINYXV0aGNoYWxsZW5nZRJKCgt1' - 'cGxvYWR0b2tlbhgEIAEoCzImLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuVXBsb2FkVG9rZW' - '5IAFILdXBsb2FkdG9rZW4SQQoIdXNlcmRhdGEYBSABKAsyIy5zZXJ2ZXJfdG9fY2xpZW50LlJl' - 'c3BvbnNlLlVzZXJEYXRhSABSCHVzZXJkYXRhEh4KCWF1dGh0b2tlbhgGIAEoDEgAUglhdXRodG' - '9rZW4SQQoIbG9jYXRpb24YByABKAsyIy5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLkxvY2F0' - 'aW9uSABSCGxvY2F0aW9uElAKDWF1dGhlbnRpY2F0ZWQYCCABKAsyKC5zZXJ2ZXJfdG9fY2xpZW' - '50LlJlc3BvbnNlLkF1dGhlbnRpY2F0ZWRIAFINYXV0aGVudGljYXRlZBI4CgVwbGFucxgJIAEo' - 'CzIgLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuUGxhbnNIAFIFcGxhbnMSTQoMcGxhbmJhbG' - 'xhbmNlGAogASgLMicuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5QbGFuQmFsbGFuY2VIAFIM' - 'cGxhbmJhbGxhbmNlEkEKCHZvdWNoZXJzGAsgASgLMiMuc2VydmVyX3RvX2NsaWVudC5SZXNwb2' - '5zZS5Wb3VjaGVyc0gAUgh2b3VjaGVycxJfChJhZGRhY2NvdW50c2ludml0ZXMYDCABKAsyLS5z' - 'ZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLkFkZEFjY291bnRzSW52aXRlc0gAUhJhZGRhY2NvdW' - '50c2ludml0ZXNCBAoCT2silgEKEFRyYW5zYWN0aW9uVHlwZXMSCgoGUmVmdW5kEAASEwoPVm91' - 'Y2hlclJlZGVlbWVkEAESEgoOVm91Y2hlckNyZWF0ZWQQAhIICgRDYXNoEAMSDwoLUGxhblVwZ3' - 'JhZGUQBBILCgdVbmtub3duEAUSFAoQVGhhbmtzRm9yVGVzdGluZxAGEg8KC0F1dG9SZW5ld2Fs' - 'EAdCCgoIUmVzcG9uc2U='); + 'bmxvYWRUb2tlbnMaOQoORG93bmxvYWRUb2tlbnMSJwoPZG93bmxvYWRfdG9rZW5zGAEgAygMUg' + '5kb3dubG9hZFRva2VucxqoBgoCT2sSFAoETm9uZRgBIAEoCEgAUgROb25lEhgKBnVzZXJpZBgC' + 'IAEoA0gAUgZ1c2VyaWQSJgoNYXV0aGNoYWxsZW5nZRgDIAEoDEgAUg1hdXRoY2hhbGxlbmdlEk' + 'oKC3VwbG9hZHRva2VuGAQgASgLMiYuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5VcGxvYWRU' + 'b2tlbkgAUgt1cGxvYWR0b2tlbhJBCgh1c2VyZGF0YRgFIAEoCzIjLnNlcnZlcl90b19jbGllbn' + 'QuUmVzcG9uc2UuVXNlckRhdGFIAFIIdXNlcmRhdGESHgoJYXV0aHRva2VuGAYgASgMSABSCWF1' + 'dGh0b2tlbhJBCghsb2NhdGlvbhgHIAEoCzIjLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuTG' + '9jYXRpb25IAFIIbG9jYXRpb24SUAoNYXV0aGVudGljYXRlZBgIIAEoCzIoLnNlcnZlcl90b19j' + 'bGllbnQuUmVzcG9uc2UuQXV0aGVudGljYXRlZEgAUg1hdXRoZW50aWNhdGVkEjgKBXBsYW5zGA' + 'kgASgLMiAuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5QbGFuc0gAUgVwbGFucxJNCgxwbGFu' + 'YmFsbGFuY2UYCiABKAsyJy5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLlBsYW5CYWxsYW5jZU' + 'gAUgxwbGFuYmFsbGFuY2USQQoIdm91Y2hlcnMYCyABKAsyIy5zZXJ2ZXJfdG9fY2xpZW50LlJl' + 'c3BvbnNlLlZvdWNoZXJzSABSCHZvdWNoZXJzEl8KEmFkZGFjY291bnRzaW52aXRlcxgMIAEoCz' + 'ItLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuQWRkQWNjb3VudHNJbnZpdGVzSABSEmFkZGFj' + 'Y291bnRzaW52aXRlcxJTCg5kb3dubG9hZHRva2VucxgNIAEoCzIpLnNlcnZlcl90b19jbGllbn' + 'QuUmVzcG9uc2UuRG93bmxvYWRUb2tlbnNIAFIOZG93bmxvYWR0b2tlbnNCBAoCT2silgEKEFRy' + 'YW5zYWN0aW9uVHlwZXMSCgoGUmVmdW5kEAASEwoPVm91Y2hlclJlZGVlbWVkEAESEgoOVm91Y2' + 'hlckNyZWF0ZWQQAhIICgRDYXNoEAMSDwoLUGxhblVwZ3JhZGUQBBILCgdVbmtub3duEAUSFAoQ' + 'VGhhbmtzRm9yVGVzdGluZxAGEg8KC0F1dG9SZW5ld2FsEAdCCgoIUmVzcG9uc2U='); diff --git a/lib/src/providers/api/media_send.dart b/lib/src/providers/api/media_send.dart index 42f6687..b590cca 100644 --- a/lib/src/providers/api/media_send.dart +++ b/lib/src/providers/api/media_send.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:http/http.dart' as http; import 'dart:io'; import 'dart:typed_data'; @@ -18,6 +19,7 @@ import 'package:twonly/src/model/json/message.dart'; import 'package:twonly/src/model/protobuf/api/error.pb.dart'; import 'package:twonly/src/model/protobuf/api/server_to_client.pb.dart'; import 'package:twonly/src/providers/api/api.dart'; +import 'package:twonly/src/providers/api/api_utils.dart'; import 'package:twonly/src/providers/api/media_received.dart'; import 'package:twonly/src/services/notification_service.dart'; import 'package:twonly/src/utils/misc.dart'; @@ -49,48 +51,17 @@ Future isAllowedToSend() async { return null; } -/// Process the image up to the point more user informations are required -/// Returns the media upload id -Future preSendMediaFile(Uint8List imageBytes, File? videoFilePath) async { - return 0; -} +/// States: +/// when user recorded an video +/// 1. Compress video +/// when user clicked the send button (direct send) or share with +/// 2. Encrypt media files +/// 3. Upload media files +/// click send button +/// 4. Finalize upload by websocket -> get download tokens +/// 5. Send all users the message -Future cancelSendMediaFile(int mediaUploadId) async {} - -Future finalizeSendMediaFile(int mediaUploadId, List userIds, - bool isRealTwonly, bool isVideo, bool mirrorVideo, int maxShowTime) async {} - -Future sendMediaFile( - List userIds, - Uint8List imageBytes, - bool isRealTwonly, - int maxShowTime, - File? videoFilePath, - bool mirrorVideo, -) async { - MediaUploadMetadata metadata = MediaUploadMetadata(); - metadata.contactIds = userIds; - metadata.isRealTwonly = isRealTwonly; - metadata.messageSendAt = DateTime.now(); - metadata.isVideo = videoFilePath != null; - metadata.maxShowTime = maxShowTime; - metadata.mirrorVideo = mirrorVideo; - - int? mediaUploadId = await twonlyDatabase.mediaUploadsDao.insertMediaUpload( - MediaUploadsCompanion( - metadata: Value(metadata), - ), - ); - - if (mediaUploadId != null) { - if (videoFilePath != null) { - String basePath = await getMediaFilePath(mediaUploadId, "send"); - await videoFilePath.rename("$basePath.orginal.mp4"); - } - await writeMediaFile(mediaUploadId, "orginal.png", imageBytes); - await handleSingleMediaFile(mediaUploadId, imageBytes); - } -} +/// Create a new entry in the database final lockingHandleMediaFile = Mutex(); Future retryMediaUpload({int maxRetries = 3}) async { @@ -99,7 +70,22 @@ Future retryMediaUpload({int maxRetries = 3}) async { await twonlyDatabase.mediaUploadsDao.getMediaUploadsForRetry(); if (mediaFiles.isEmpty) return; for (final mediaFile in mediaFiles) { - await handleSingleMediaFile(mediaFile.mediaUploadId, null); + if (mediaFile.messageIds == null || mediaFile.metadata == null) { + // the media upload was canceled, + if (mediaFile.uploadTokens != null) { + /// the file was already uploaded. + /// notify the server to remove the upload + } + Logger("media_send.dart").shout( + "upload can be removed, the finalized function was never called..."); + continue; + } + + if (mediaFile.state == UploadState.readyToUpload) { + await handleNextMediaUploadSteps(mediaFile.mediaUploadId); + } else { + await handlePreProcessingState(mediaFile); + } } }); if (maxRetries == 0) return; @@ -109,131 +95,19 @@ Future retryMediaUpload({int maxRetries = 3}) async { }); } -Future handleSingleMediaFile( - int mediaUploadId, Uint8List? tmpCurrentImageBytes) async { - MediaUpload? media = await twonlyDatabase.mediaUploadsDao - .getMediaUploadById(mediaUploadId) - .getSingleOrNull(); - if (media == null) return; - - try { - switch (media.state) { - case UploadState.pending: - await handleAddToMessageDb(media); - break; - case UploadState.addedToMessagesDb: - tmpCurrentImageBytes = - await handleCompressionState(media, tmpCurrentImageBytes); - break; - case UploadState.isCompressed: - tmpCurrentImageBytes = - await handleEncryptionState(media, tmpCurrentImageBytes); - break; - case UploadState.isEncrypted: - if (!await handleGetUploadToken(media)) { - return; // recoverable error. try again when connected again to the server... - } - break; - case UploadState.hasUploadToken: - if (!await handleUploadHttp(media, tmpCurrentImageBytes)) { - return; - } - // if (!await handleUpload(media, tmpCurrentImageBytes)) { - // return; // recoverable error. try again when connected again to the server... - // } - break; - case UploadState.isUploaded: - if (!await handleNotifyReceiver(media)) { - return; // recoverable error. try again when connected again to the server... - } - try { - // delete non compressed media files - await deleteMediaFile(media.mediaUploadId, "orginal.png"); - await deleteMediaFile(media.mediaUploadId, "orginal.mp4"); - await deleteMediaFile(media.mediaUploadId, "encrypted"); - } catch (e) { - Logger("media_send.dart").shout("$e"); - } - break; - case UploadState.receiverNotified: - return; - } - } catch (e) { - // if the messageIds are already there notify the user about this error... - if (media.messageIds != null) { - for (int messageId in media.messageIds!) { - await twonlyDatabase.messagesDao.updateMessageByMessageId( - messageId, - MessagesCompanion( - errorWhileSending: Value(true), - ), - ); - } - } - await twonlyDatabase.mediaUploadsDao.deleteMediaUpload(mediaUploadId); - Logger("media_send.dart") - .shout("Non recoverable error while sending media file: $e"); - return; - } - // this will be called until there is an recoverable error OR - // the upload is ready - await handleSingleMediaFile(mediaUploadId, tmpCurrentImageBytes); +Future initMediaUpload() async { + return await twonlyDatabase.mediaUploadsDao + .insertMediaUpload(MediaUploadsCompanion()); } -Future handleAddToMessageDb(MediaUpload media) async { - List messageIds = []; - - for (final contactId in media.metadata.contactIds) { - int? messageId = await twonlyDatabase.messagesDao.insertMessage( - MessagesCompanion( - contactId: Value(contactId), - kind: Value(MessageKind.media), - sendAt: Value(media.metadata.messageSendAt), - downloadState: Value(DownloadState.pending), - mediaUploadId: Value(media.mediaUploadId), - contentJson: Value( - jsonEncode( - MediaMessageContent( - maxShowTime: media.metadata.maxShowTime, - isRealTwonly: media.metadata.isRealTwonly, - isVideo: media.metadata.isVideo, - mirrorVideo: media.metadata.mirrorVideo, - ).toJson(), - ), - ), - ), - ); // dearchive contact when sending a new message - await twonlyDatabase.contactsDao.updateContact( - contactId, - ContactsCompanion( - archived: Value(false), - ), - ); - if (messageId != null) { - messageIds.add(messageId); - } else { - Logger("media_send.dart") - .shout("Error inserting media upload message in database."); - } - } - - await twonlyDatabase.mediaUploadsDao.updateMediaUpload( - media.mediaUploadId, - MediaUploadsCompanion( - state: Value(UploadState.addedToMessagesDb), - messageIds: Value(messageIds), - ), - ); +Future addVideoToUpload(int mediaUploadId, File videoFilePath) async { + String basePath = await getMediaFilePath(mediaUploadId, "send"); + await videoFilePath.rename("$basePath.original.mp4"); + return await compressVideoIfExists(mediaUploadId); } -Future handleCompressionState( - MediaUpload media, - Uint8List? tmpCurrentImageBytes, -) async { - Uint8List imageBytes = (tmpCurrentImageBytes != null) - ? tmpCurrentImageBytes - : await readMediaFile(media, "orginal.png"); - +Future addOrModifyImageToUpload( + int mediaUploadId, Uint8List imageBytes) async { Uint8List imageBytesCompressed; try { imageBytesCompressed = await FlutterImageCompress.compressWithList( @@ -242,84 +116,62 @@ Future handleCompressionState( quality: 90, ); - if (imageBytesCompressed.length >= 1 * 1000 * 1000) { - // if the media file is over 1MB compress it with 60% + if (imageBytesCompressed.length >= 2 * 1000 * 1000) { + // if the media file is over 2MB compress it with 60% imageBytesCompressed = await FlutterImageCompress.compressWithList( format: CompressFormat.png, imageBytes, quality: 60, ); } - await writeMediaFile(media.mediaUploadId, "png", imageBytesCompressed); + await writeMediaFile(mediaUploadId, "png", imageBytesCompressed); } catch (e) { Logger("media_send.dart").shout("$e"); - // as a fall back use the orginal image - await writeMediaFile(media.mediaUploadId, "png", imageBytes); + // as a fall back use the original image + await writeMediaFile(mediaUploadId, "png", imageBytes); imageBytesCompressed = imageBytes; } - if (media.metadata.isVideo) { - String basePath = await getMediaFilePath(media.mediaUploadId, "send"); - File videoOriginalFile = File("$basePath.orginal.mp4"); - File videoCompressedFile = File("$basePath.mp4"); - - MediaInfo? mediaInfo; - - try { - mediaInfo = await VideoCompress.compressVideo( - videoOriginalFile.path, - quality: VideoQuality.Res1280x720Quality, - deleteOrigin: false, - includeAudio: - true, // https://github.com/jonataslaw/VideoCompress/issues/184 - ); - - if (mediaInfo!.filesize! >= 30 * 1000 * 1000) { - // if the media file is over 20MB compress it with low quality - mediaInfo = await VideoCompress.compressVideo( - videoOriginalFile.path, - quality: VideoQuality.Res960x540Quality, - deleteOrigin: false, - includeAudio: true, - ); - } - } catch (e) { - Logger("media_send.dart").shout("Video compression: $e"); - } - - if (mediaInfo == null) { - Logger("media_send.dart").shout("Error compressing video."); - // as a fall back use the non compressed version - await videoOriginalFile.copy(videoCompressedFile.path); - await videoOriginalFile.delete(); - } else { - await mediaInfo.file!.copy(videoCompressedFile.path); - await mediaInfo.file!.delete(); - } - } - + /// in case the media file was already encrypted of even uploaded + /// remove the data so it will be done again. + /// TODO: when the uploadTokens are already set notify the server... await twonlyDatabase.mediaUploadsDao.updateMediaUpload( - media.mediaUploadId, + mediaUploadId, MediaUploadsCompanion( - state: Value(UploadState.isCompressed), + encryptionData: Value(null), + uploadTokens: Value(null), ), ); - return imageBytesCompressed; } -Future handleEncryptionState( - MediaUpload media, Uint8List? tmpCurrentImageBytes) async { - var state = MediaEncryptionData(); - - Uint8List dataToEncrypt = (tmpCurrentImageBytes != null) - ? tmpCurrentImageBytes - : await readMediaFile(media, "png"); - - if (media.metadata.isVideo) { - Uint8List compressedVideo = await readMediaFile(media, "mp4"); - dataToEncrypt = combineUint8Lists(dataToEncrypt, compressedVideo); +Future handlePreProcessingState(MediaUpload media) async { + try { + final imageHandler = readMediaFile(media.mediaUploadId, "png"); + final videoHandler = compressVideoIfExists(media.mediaUploadId); + await encryptAndPreUploadMediaFiles( + media.mediaUploadId, + imageHandler, + videoHandler, + ); + } catch (e) { + await handleUploadError(media); } +} + +Future encryptAndPreUploadMediaFiles( + int mediaUploadId, Future imageHandler, Future? videoHandler) async { + Uint8List dataToEncrypt = await imageHandler; + + /// if there is a video wait until it is finished with compression + if (videoHandler != null) { + if (await videoHandler) { + Uint8List compressedVideo = await readMediaFile(mediaUploadId, "mp4"); + dataToEncrypt = combineUint8Lists(dataToEncrypt, compressedVideo); + } + } + + var state = MediaEncryptionData(); final xchacha20 = Xchacha20.poly1305Aead(); SecretKeyData secretKey = await (await xchacha20.newSecretKey()).extract(); @@ -340,26 +192,161 @@ Future handleEncryptionState( final encryptedBytes = Uint8List.fromList(secretBox.cipherText); await writeMediaFile( - media.mediaUploadId, + mediaUploadId, "encrypted", encryptedBytes, ); await twonlyDatabase.mediaUploadsDao.updateMediaUpload( - media.mediaUploadId, + mediaUploadId, MediaUploadsCompanion( - state: Value(UploadState.isEncrypted), + state: Value(UploadState.readyToUpload), encryptionData: Value(state), ), ); - return encryptedBytes; + await handleNextMediaUploadSteps(mediaUploadId); } -Future handleGetUploadToken(MediaUpload media) async { - final res = - await apiProvider.getUploadToken(media.metadata.contactIds.length); +Future cancelSendMediaFile(int mediaUploadId) async { + await twonlyDatabase.mediaUploadsDao.deleteMediaUpload(mediaUploadId); - if (res.isError || !res.value.hasUploadtoken()) { + /// server should purge the uploads... when it did not receive a +} + +Future finalizeUpload(int mediaUploadId, List contactIds, + bool isRealTwonly, bool isVideo, bool mirrorVideo, int maxShowTime) async { + MediaUploadMetadata metadata = MediaUploadMetadata(); + metadata.contactIds = contactIds; + metadata.isRealTwonly = isRealTwonly; + metadata.messageSendAt = DateTime.now(); + metadata.isVideo = isVideo; + metadata.maxShowTime = maxShowTime; + metadata.mirrorVideo = mirrorVideo; + + List messageIds = []; + + for (final contactId in contactIds) { + int? messageId = await twonlyDatabase.messagesDao.insertMessage( + MessagesCompanion( + contactId: Value(contactId), + kind: Value(MessageKind.media), + sendAt: Value(metadata.messageSendAt), + downloadState: Value(DownloadState.pending), + mediaUploadId: Value(mediaUploadId), + contentJson: Value( + jsonEncode( + MediaMessageContent( + maxShowTime: maxShowTime, + isRealTwonly: isRealTwonly, + isVideo: isVideo, + mirrorVideo: mirrorVideo, + ).toJson(), + ), + ), + ), + ); + // de-archive contact when sending a new message + await twonlyDatabase.contactsDao.updateContact( + contactId, + ContactsCompanion( + archived: Value(false), + ), + ); + if (messageId != null) { + messageIds.add(messageId); + } else { + Logger("media_send.dart") + .shout("Error inserting media upload message in database."); + } + } + + await twonlyDatabase.mediaUploadsDao.updateMediaUpload( + mediaUploadId, + MediaUploadsCompanion( + messageIds: Value(messageIds), + metadata: Value(metadata), + ), + ); +} + +final lockingHandleNextMediaUploadStep = Mutex(); +Future handleNextMediaUploadSteps(int mediaUploadId) async { + bool rerun = await lockingHandleNextMediaUploadStep.protect(() async { + var mediaUpload = await twonlyDatabase.mediaUploadsDao + .getMediaUploadById(mediaUploadId) + .getSingleOrNull(); + + if (mediaUpload == null) return false; + if (mediaUpload.state == UploadState.receiverNotified) { + /// Upload done and all users are notified :) + return false; + } + try { + /// Stage 1: media files are not yet encrypted... + if (mediaUpload.encryptionData == null) { + // when set this function will be called again by encryptAndPreUploadMediaFiles... + return false; + } + + if (mediaUpload.uploadTokens == null) { + /// the files are not yet uploaded, handle upload... + /// if the upload succeed the uploadTokens was updated and this function + /// can be called again to processed the upload done + return await handleMediaUpload(mediaUploadId); + } + + if (mediaUpload.messageIds == null || mediaUpload.metadata == null) { + /// the finalize function was not called yet... + return false; + } + + // at this point the media file is uploaded and the receiver are known. + final downloadTokens = mediaUpload.uploadTokens!.downloadTokens; + if (downloadTokens.isEmpty) { + /// there are no download tokens yet, request them... + return await handleUploadDone(mediaUpload); + } + + // download tokens are known so send the media file to the receivers + await handleNotifyReceiver(mediaUpload); + } catch (e) { + Logger("media_send.dart") + .shout("Non recoverable error while sending media file: $e"); + await handleUploadError(mediaUpload); + } + return false; + }); + if (rerun) { + handleNextMediaUploadSteps(mediaUploadId); + } +} + +/// +/// -- private functions -- +/// +/// +/// +Future handleUploadError(MediaUpload mediaUpload) async { + // if the messageIds are already there notify the user about this error... + if (mediaUpload.messageIds != null) { + for (int messageId in mediaUpload.messageIds!) { + await twonlyDatabase.messagesDao.updateMessageByMessageId( + messageId, + MessagesCompanion( + errorWhileSending: Value(true), + ), + ); + } + } + await twonlyDatabase.mediaUploadsDao + .deleteMediaUpload(mediaUpload.mediaUploadId); +} + +Future handleUploadDone(MediaUpload media) async { + Result res = await apiProvider.getDownloadTokens( + media.uploadTokens!.uploadToken, media.messageIds!.length); + + if (res.isError || !res.value.hasDownloadtokens()) { if (res.isError) { if (res.error == ErrorCode.PlanNotAllowed) { throw Exception("PlanNotAllowed"); @@ -369,36 +356,33 @@ Future handleGetUploadToken(MediaUpload media) async { } } Logger("media_send.dart") - .shout("Will be tried again when reconnected to server!"); + .info("Upload done will be tried again when reconnected to server!"); return false; } - Response_UploadToken tokens = res.value.uploadtoken; - + Response_DownloadTokens tokens = res.value.downloadtokens; var token = MediaUploadTokens(); - token.uploadToken = tokens.uploadToken; + token.uploadToken = media.uploadTokens!.uploadToken; token.downloadTokens = tokens.downloadTokens; await twonlyDatabase.mediaUploadsDao.updateMediaUpload( media.mediaUploadId, MediaUploadsCompanion( - state: Value(UploadState.hasUploadToken), uploadTokens: Value(token), ), ); - return true; } -String uint8ListToHex(List bytes) { - return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(); -} +Future handleMediaUpload(int mediaUploadId) async { + Uint8List bytesToUpload = await readMediaFile(mediaUploadId, "encrypted"); -Future handleUploadHttp( - MediaUpload media, Uint8List? tmpCurrentImageBytes) async { - Uint8List bytesToUpload = (tmpCurrentImageBytes != null) - ? tmpCurrentImageBytes - : await readMediaFile(media, "encrypted"); + final storage = FlutterSecureStorage(); + String? apiAuthToken = await storage.read(key: "api_auth_token"); + if (apiAuthToken == null) { + Logger("media_send.dart").shout("api auth token not defined."); + return false; + } String apiUrl = "http${apiProvider.apiSecure}://${apiProvider.apiHost}/api/upload"; @@ -407,33 +391,45 @@ Future handleUploadHttp( "POST", Uri.parse(apiUrl), ); + requestMultipart.headers['x-twonly-auth-token'] = + uint8ListToHex(base64Decode(apiAuthToken)); requestMultipart.files.add(http.MultipartFile.fromBytes( "file", bytesToUpload, - filename: uint8ListToHex(media.uploadTokens!.uploadToken), + filename: "upload", )); try { var streamedResponse = await requestMultipart.send(); - await streamedResponse.stream.drain(); - Logger("media_send.dart").info("Uploaded: ${streamedResponse.statusCode}"); + final response = await http.Response.fromStream(streamedResponse); + + if (response.statusCode == 200) { + Logger("media_send.dart").info("Uploaded: $response"); + if (response.body.length != 64) { + Logger("media_send.dart").info("Got invalid upload token."); + return false; + } + + final uploadToken = hexToUint8List(response.body); + + var token = MediaUploadTokens(); + token.uploadToken = uploadToken; + token.downloadTokens = []; - if (streamedResponse.statusCode == 200) { await twonlyDatabase.mediaUploadsDao.updateMediaUpload( - media.mediaUploadId, + mediaUploadId, MediaUploadsCompanion( - state: Value(UploadState.isUploaded), + uploadTokens: Value(token), ), ); return true; } - return false; } catch (e) { Logger("media_send.dart").shout("Exception during upload: $e"); - return false; } + return false; } Future handleNotifyReceiver(MediaUpload media) async { @@ -466,19 +462,19 @@ Future handleNotifyReceiver(MediaUpload media) async { messageId: messageId, content: MediaMessageContent( downloadToken: media.uploadTokens!.downloadTokens[i], - maxShowTime: media.metadata.maxShowTime, - isRealTwonly: media.metadata.isRealTwonly, - isVideo: media.metadata.isVideo, - mirrorVideo: media.metadata.mirrorVideo, + maxShowTime: media.metadata!.maxShowTime, + isRealTwonly: media.metadata!.isRealTwonly, + isVideo: media.metadata!.isVideo, + mirrorVideo: media.metadata!.mirrorVideo, encryptionKey: media.encryptionData!.encryptionKey, encryptionMac: media.encryptionData!.encryptionMac, encryptionNonce: media.encryptionData!.encryptionNonce, ), - timestamp: media.metadata.messageSendAt, + timestamp: media.metadata!.messageSendAt, ), - pushKind: (media.metadata.isRealTwonly) + pushKind: (media.metadata!.isRealTwonly) ? PushKind.twonly - : (media.metadata.isVideo) + : (media.metadata!.isVideo) ? PushKind.video : PushKind.image, ); @@ -501,10 +497,61 @@ Future handleNotifyReceiver(MediaUpload media) async { return true; } +Future compressVideoIfExists(int mediaUploadId) async { + String basePath = await getMediaFilePath(mediaUploadId, "send"); + File videoOriginalFile = File("$basePath.orginal.mp4"); + File videoCompressedFile = File("$basePath.mp4"); + + if (videoCompressedFile.existsSync()) { + // file is already compressed and exists + return true; + } + + if (!videoOriginalFile.existsSync()) { + // media upload does not have a video + return false; + } + + MediaInfo? mediaInfo; + + try { + mediaInfo = await VideoCompress.compressVideo( + videoOriginalFile.path, + quality: VideoQuality.Res1280x720Quality, + deleteOrigin: false, + includeAudio: + true, // https://github.com/jonataslaw/VideoCompress/issues/184 + ); + + if (mediaInfo!.filesize! >= 30 * 1000 * 1000) { + // if the media file is over 20MB compress it with low quality + mediaInfo = await VideoCompress.compressVideo( + videoOriginalFile.path, + quality: VideoQuality.Res960x540Quality, + deleteOrigin: false, + includeAudio: true, + ); + } + } catch (e) { + Logger("media_send.dart").shout("Video compression: $e"); + } + + if (mediaInfo == null) { + Logger("media_send.dart").shout("Error compressing video."); + // as a fall back use the non compressed version + await videoOriginalFile.copy(videoCompressedFile.path); + await videoOriginalFile.delete(); + } else { + await mediaInfo.file!.copy(videoCompressedFile.path); + await mediaInfo.file!.delete(); + } + return true; +} + /// --- helper functions --- -Future readMediaFile(MediaUpload media, String type) async { - String basePath = await getMediaFilePath(media.mediaUploadId, "send"); +Future readMediaFile(int mediaUploadId, String type) async { + String basePath = await getMediaFilePath(mediaUploadId, "send"); File file = File("$basePath.$type"); if (!await file.exists()) { throw Exception("$file not found"); @@ -562,3 +609,11 @@ Future purgeSendMediaFiles() async { final directory = Directory(join(basedir.path, 'media', "send")); await purgeMediaFiles(directory); } + +String uint8ListToHex(List bytes) { + return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(); +} + +Uint8List hexToUint8List(String hex) => Uint8List.fromList(List.generate( + hex.length ~/ 2, + (i) => int.parse(hex.substring(i * 2, i * 2 + 2), radix: 16))); diff --git a/lib/src/providers/api_provider.dart b/lib/src/providers/api_provider.dart index 3bba48d..a19d3f1 100644 --- a/lib/src/providers/api_provider.dart +++ b/lib/src/providers/api_provider.dart @@ -362,6 +362,16 @@ class ApiProvider { return await sendRequestSync(req); } + Future getDownloadTokens( + List uploadToken, int recipientsCount) async { + var get = ApplicationData_UploadDone() + ..uploadToken = uploadToken + ..recipientsCount = recipientsCount; + var appData = ApplicationData()..uploaddone = get; + var req = createClientToServerFromApplicationData(appData); + return await sendRequestSync(req); + } + Future getCurrentLocation() async { var get = ApplicationData_GetLocation(); var appData = ApplicationData()..getlocation = get; diff --git a/lib/src/views/camera/camera_preview_view.dart b/lib/src/views/camera/camera_preview_view.dart index 14c58d2..b37fad4 100644 --- a/lib/src/views/camera/camera_preview_view.dart +++ b/lib/src/views/camera/camera_preview_view.dart @@ -267,7 +267,7 @@ class _CameraPreviewViewState extends State { if (shoudReturn != null && shoudReturn) { // ignore: use_build_context_synchronously if (widget.sendTo == null) { - globalUpdateOfHomeViewPageIndex(1); + globalUpdateOfHomeViewPageIndex(0); } else { Navigator.pop(context); } diff --git a/lib/src/views/camera/share_image_editor_view.dart b/lib/src/views/camera/share_image_editor_view.dart index ef972d9..169e8a0 100644 --- a/lib/src/views/camera/share_image_editor_view.dart +++ b/lib/src/views/camera/share_image_editor_view.dart @@ -52,23 +52,26 @@ class ShareImageEditorView extends StatefulWidget { class _ShareImageEditorView extends State { bool _isRealTwonly = false; - bool videoWithAudio = true; int maxShowTime = gMediaShowInfinite; String? sendNextMediaToUserName; - double tabDownPostion = 0; + double tabDownPosition = 0; bool sendingOrLoadingImage = true; bool isDisposed = false; HashSet selectedUserIds = HashSet(); double widthRatio = 1, heightRatio = 1, pixelRatio = 1; VideoPlayerController? videoController; - ImageItem currentImage = ImageItem(); ScreenshotController screenshotController = ScreenshotController(); + /// Media upload variables + int? mediaUploadId; + Future? videoUploadHandler; + @override void initState() { super.initState(); initAsync(); + initMediaFileUpload(); if (widget.imageBytes != null) { loadImage(widget.imageBytes!); } else if (widget.videoFilePath != null) { @@ -97,6 +100,19 @@ class _ShareImageEditorView extends State { } } + Future initMediaFileUpload() async { + // media init was already called... + if (mediaUploadId != null) return; + + mediaUploadId = await initMediaUpload(); + + if (widget.videoFilePath != null && mediaUploadId != null) { + // start with the video compression... + videoUploadHandler = + addVideoToUpload(mediaUploadId!, widget.videoFilePath!); + } + } + @override void dispose() { isDisposed = true; @@ -221,19 +237,6 @@ class _ShareImageEditorView extends State { }, ), ), - // https://github.com/jonataslaw/VideoCompress/issues/184 - // if (widget.videoFilePath != null) const SizedBox(height: 8), - // if (widget.videoFilePath != null) - // ActionButton( - // (videoWithAudio) ? Icons.volume_up_rounded : Icons.volume_off_rounded, - // tooltipText: context.lang.protectAsARealTwonly, - // color: Colors.white, - // onPressed: () async { - // setState(() { - // videoWithAudio = !videoWithAudio; - // }); - // }, - // ), const SizedBox(height: 8), ActionButton( FontAwesomeIcons.shieldHeart, @@ -312,8 +315,13 @@ class _ShareImageEditorView extends State { } Future pushShareImageView() async { + if (mediaUploadId == null) { + await initMediaFileUpload(); + if (mediaUploadId == null) return; + } Future imageBytes = getMergedImage(); videoController?.pause(); + if (isDisposed || !context.mounted) return; bool? wasSend = await Navigator.push( context, MaterialPageRoute( @@ -323,7 +331,8 @@ class _ShareImageEditorView extends State { maxShowTime: maxShowTime, selectedUserIds: selectedUserIds, updateStatus: updateStatus, - videoFilePath: widget.videoFilePath, + videoUploadHandler: videoUploadHandler, + mediaUploadId: mediaUploadId!, mirrorVideo: widget.mirrorVideo, ), ), @@ -402,14 +411,26 @@ class _ShareImageEditorView extends State { ); })); } else { - sendMediaFile( + Future imageHandler = + addOrModifyImageToUpload(mediaUploadId!, imageBytes); + + // first finalize the upload + await finalizeUpload( + mediaUploadId!, [widget.sendTo!.userId], - imageBytes, _isRealTwonly, - maxShowTime, - widget.videoFilePath, + widget.videoFilePath != null, widget.mirrorVideo, + maxShowTime, ); + + /// then call the upload process in the background + encryptAndPreUploadMediaFiles( + mediaUploadId!, + imageHandler, + videoUploadHandler, + ); + if (context.mounted) { // ignore: use_build_context_synchronously Navigator.pop(context, true); @@ -434,9 +455,9 @@ class _ShareImageEditorView extends State { GestureDetector( onTapDown: (details) { if (details.globalPosition.dy > 60) { - tabDownPostion = details.globalPosition.dy - 60; + tabDownPosition = details.globalPosition.dy - 60; } else { - tabDownPostion = details.globalPosition.dy; + tabDownPosition = details.globalPosition.dy; } }, onTap: () { @@ -446,7 +467,7 @@ class _ShareImageEditorView extends State { undoLayers.clear(); removedLayers.clear(); layers.add(TextLayerData( - offset: Offset(0, tabDownPostion), + offset: Offset(0, tabDownPosition), textLayersBefore: layers.whereType().length, )); setState(() {}); diff --git a/lib/src/views/camera/share_image_view.dart b/lib/src/views/camera/share_image_view.dart index 0c9c9cb..e099ecc 100644 --- a/lib/src/views/camera/share_image_view.dart +++ b/lib/src/views/camera/share_image_view.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'dart:collection'; -import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -26,16 +25,18 @@ class ShareImageView extends StatefulWidget { required this.maxShowTime, required this.selectedUserIds, required this.updateStatus, - required this.videoFilePath, + required this.videoUploadHandler, + required this.mediaUploadId, this.enableVideoAudio}); final Future imageBytesFuture; final bool isRealTwonly; final bool mirrorVideo; final int maxShowTime; - final File? videoFilePath; final HashSet selectedUserIds; final bool? enableVideoAudio; + final int mediaUploadId; final Function(int, bool) updateStatus; + final Future? videoUploadHandler; @override State createState() => _ShareImageView(); @@ -73,6 +74,13 @@ class _ShareImageView extends State { Future initAsync() async { imageBytes = await widget.imageBytesFuture; + if (imageBytes != null) { + final imageHandler = + addOrModifyImageToUpload(widget.mediaUploadId, imageBytes!); + // start with the pre upload of the media file... + encryptAndPreUploadMediaFiles( + widget.mediaUploadId, imageHandler, widget.videoUploadHandler); + } setState(() {}); } @@ -287,14 +295,18 @@ class _ShareImageView extends State { sendingImage = true; }); - sendMediaFile( + await finalizeUpload( + widget.mediaUploadId, widget.selectedUserIds.toList(), - imageBytes!, widget.isRealTwonly, - widget.maxShowTime, - widget.videoFilePath, + widget.videoUploadHandler != null, widget.mirrorVideo, + widget.maxShowTime, ); + + /// trigger the upload of the media file. + handleNextMediaUploadSteps(widget.mediaUploadId); + if (context.mounted) { Navigator.pop(context, true); // if (widget.preselectedUser != null) { diff --git a/lib/src/views/home_view.dart b/lib/src/views/home_view.dart index 3e168ec..f8d9038 100644 --- a/lib/src/views/home_view.dart +++ b/lib/src/views/home_view.dart @@ -39,7 +39,7 @@ class HomeViewState extends State { selectNotificationStream.stream .listen((NotificationResponse? response) async { - globalUpdateOfHomeViewPageIndex(1); + globalUpdateOfHomeViewPageIndex(0); }); initAsync(); } @@ -50,7 +50,7 @@ class HomeViewState extends State { if (notificationAppLaunchDetails != null) { if (notificationAppLaunchDetails.didNotificationLaunchApp) { - globalUpdateOfHomeViewPageIndex(1); + globalUpdateOfHomeViewPageIndex(0); } } } diff --git a/test/drift/twonly_database/generated/schema.dart b/test/drift/twonly_database/generated/schema.dart index 746206e..413b440 100644 --- a/test/drift/twonly_database/generated/schema.dart +++ b/test/drift/twonly_database/generated/schema.dart @@ -11,6 +11,7 @@ import 'schema_v5.dart' as v5; import 'schema_v6.dart' as v6; import 'schema_v7.dart' as v7; import 'schema_v8.dart' as v8; +import 'schema_v9.dart' as v9; class GeneratedHelper implements SchemaInstantiationHelper { @override @@ -32,10 +33,12 @@ class GeneratedHelper implements SchemaInstantiationHelper { return v7.DatabaseAtV7(db); case 8: return v8.DatabaseAtV8(db); + case 9: + return v9.DatabaseAtV9(db); default: throw MissingSchemaException(version, versions); } } - static const versions = const [1, 2, 3, 4, 5, 6, 7, 8]; + static const versions = const [1, 2, 3, 4, 5, 6, 7, 8, 9]; } diff --git a/test/drift/twonly_database/generated/schema_v9.dart b/test/drift/twonly_database/generated/schema_v9.dart new file mode 100644 index 0000000..e427b32 --- /dev/null +++ b/test/drift/twonly_database/generated/schema_v9.dart @@ -0,0 +1,2963 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Contacts extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Contacts(this.attachedDatabase, [this._alias]); + late final GeneratedColumn userId = GeneratedColumn( + 'user_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn username = GeneratedColumn( + 'username', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways('UNIQUE')); + late final GeneratedColumn displayName = GeneratedColumn( + 'display_name', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn nickName = GeneratedColumn( + 'nick_name', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn avatarSvg = GeneratedColumn( + 'avatar_svg', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn myAvatarCounter = GeneratedColumn( + 'my_avatar_counter', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0')); + late final GeneratedColumn accepted = GeneratedColumn( + 'accepted', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("accepted" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn requested = GeneratedColumn( + 'requested', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("requested" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn blocked = GeneratedColumn( + 'blocked', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("blocked" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn verified = GeneratedColumn( + 'verified', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("verified" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn archived = GeneratedColumn( + 'archived', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("archived" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn pinned = GeneratedColumn( + 'pinned', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn alsoBestFriend = GeneratedColumn( + 'also_best_friend', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("also_best_friend" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn deleteMessagesAfterXMinutes = + GeneratedColumn( + 'delete_messages_after_x_minutes', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const CustomExpression('1440')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression( + 'CAST(strftime(\'%s\', CURRENT_TIMESTAMP) AS INTEGER)')); + late final GeneratedColumn totalMediaCounter = GeneratedColumn( + 'total_media_counter', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0')); + late final GeneratedColumn lastMessageSend = + GeneratedColumn('last_message_send', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastMessageReceived = + GeneratedColumn('last_message_received', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastFlameCounterChange = + GeneratedColumn('last_flame_counter_change', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastFlameSync = + GeneratedColumn('last_flame_sync', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn lastMessageExchange = + GeneratedColumn('last_message_exchange', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression( + 'CAST(strftime(\'%s\', CURRENT_TIMESTAMP) AS INTEGER)')); + late final GeneratedColumn flameCounter = GeneratedColumn( + 'flame_counter', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const CustomExpression('0')); + @override + List get $columns => [ + userId, + username, + displayName, + nickName, + avatarSvg, + myAvatarCounter, + accepted, + requested, + blocked, + verified, + archived, + pinned, + alsoBestFriend, + deleteMessagesAfterXMinutes, + createdAt, + totalMediaCounter, + lastMessageSend, + lastMessageReceived, + lastFlameCounterChange, + lastFlameSync, + lastMessageExchange, + flameCounter + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'contacts'; + @override + Set get $primaryKey => {userId}; + @override + ContactsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ContactsData( + userId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}user_id'])!, + username: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}username'])!, + displayName: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}display_name']), + nickName: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}nick_name']), + avatarSvg: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}avatar_svg']), + myAvatarCounter: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}my_avatar_counter'])!, + accepted: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}accepted'])!, + requested: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}requested'])!, + blocked: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}blocked'])!, + verified: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}verified'])!, + archived: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}archived'])!, + pinned: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}pinned'])!, + alsoBestFriend: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}also_best_friend'])!, + deleteMessagesAfterXMinutes: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}delete_messages_after_x_minutes'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + totalMediaCounter: attachedDatabase.typeMapping.read( + DriftSqlType.int, data['${effectivePrefix}total_media_counter'])!, + lastMessageSend: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_message_send']), + lastMessageReceived: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_message_received']), + lastFlameCounterChange: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_flame_counter_change']), + lastFlameSync: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, data['${effectivePrefix}last_flame_sync']), + lastMessageExchange: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_message_exchange'])!, + flameCounter: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}flame_counter'])!, + ); + } + + @override + Contacts createAlias(String alias) { + return Contacts(attachedDatabase, alias); + } +} + +class ContactsData extends DataClass implements Insertable { + final int userId; + final String username; + final String? displayName; + final String? nickName; + final String? avatarSvg; + final int myAvatarCounter; + final bool accepted; + final bool requested; + final bool blocked; + final bool verified; + final bool archived; + final bool pinned; + final bool alsoBestFriend; + final int deleteMessagesAfterXMinutes; + final DateTime createdAt; + final int totalMediaCounter; + final DateTime? lastMessageSend; + final DateTime? lastMessageReceived; + final DateTime? lastFlameCounterChange; + final DateTime? lastFlameSync; + final DateTime lastMessageExchange; + final int flameCounter; + const ContactsData( + {required this.userId, + required this.username, + this.displayName, + this.nickName, + this.avatarSvg, + required this.myAvatarCounter, + required this.accepted, + required this.requested, + required this.blocked, + required this.verified, + required this.archived, + required this.pinned, + required this.alsoBestFriend, + required this.deleteMessagesAfterXMinutes, + required this.createdAt, + required this.totalMediaCounter, + this.lastMessageSend, + this.lastMessageReceived, + this.lastFlameCounterChange, + this.lastFlameSync, + required this.lastMessageExchange, + required this.flameCounter}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['user_id'] = Variable(userId); + map['username'] = Variable(username); + if (!nullToAbsent || displayName != null) { + map['display_name'] = Variable(displayName); + } + if (!nullToAbsent || nickName != null) { + map['nick_name'] = Variable(nickName); + } + if (!nullToAbsent || avatarSvg != null) { + map['avatar_svg'] = Variable(avatarSvg); + } + map['my_avatar_counter'] = Variable(myAvatarCounter); + map['accepted'] = Variable(accepted); + map['requested'] = Variable(requested); + map['blocked'] = Variable(blocked); + map['verified'] = Variable(verified); + map['archived'] = Variable(archived); + map['pinned'] = Variable(pinned); + map['also_best_friend'] = Variable(alsoBestFriend); + map['delete_messages_after_x_minutes'] = + Variable(deleteMessagesAfterXMinutes); + map['created_at'] = Variable(createdAt); + map['total_media_counter'] = Variable(totalMediaCounter); + if (!nullToAbsent || lastMessageSend != null) { + map['last_message_send'] = Variable(lastMessageSend); + } + if (!nullToAbsent || lastMessageReceived != null) { + map['last_message_received'] = Variable(lastMessageReceived); + } + if (!nullToAbsent || lastFlameCounterChange != null) { + map['last_flame_counter_change'] = + Variable(lastFlameCounterChange); + } + if (!nullToAbsent || lastFlameSync != null) { + map['last_flame_sync'] = Variable(lastFlameSync); + } + map['last_message_exchange'] = Variable(lastMessageExchange); + map['flame_counter'] = Variable(flameCounter); + return map; + } + + ContactsCompanion toCompanion(bool nullToAbsent) { + return ContactsCompanion( + userId: Value(userId), + username: Value(username), + displayName: displayName == null && nullToAbsent + ? const Value.absent() + : Value(displayName), + nickName: nickName == null && nullToAbsent + ? const Value.absent() + : Value(nickName), + avatarSvg: avatarSvg == null && nullToAbsent + ? const Value.absent() + : Value(avatarSvg), + myAvatarCounter: Value(myAvatarCounter), + accepted: Value(accepted), + requested: Value(requested), + blocked: Value(blocked), + verified: Value(verified), + archived: Value(archived), + pinned: Value(pinned), + alsoBestFriend: Value(alsoBestFriend), + deleteMessagesAfterXMinutes: Value(deleteMessagesAfterXMinutes), + createdAt: Value(createdAt), + totalMediaCounter: Value(totalMediaCounter), + lastMessageSend: lastMessageSend == null && nullToAbsent + ? const Value.absent() + : Value(lastMessageSend), + lastMessageReceived: lastMessageReceived == null && nullToAbsent + ? const Value.absent() + : Value(lastMessageReceived), + lastFlameCounterChange: lastFlameCounterChange == null && nullToAbsent + ? const Value.absent() + : Value(lastFlameCounterChange), + lastFlameSync: lastFlameSync == null && nullToAbsent + ? const Value.absent() + : Value(lastFlameSync), + lastMessageExchange: Value(lastMessageExchange), + flameCounter: Value(flameCounter), + ); + } + + factory ContactsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ContactsData( + userId: serializer.fromJson(json['userId']), + username: serializer.fromJson(json['username']), + displayName: serializer.fromJson(json['displayName']), + nickName: serializer.fromJson(json['nickName']), + avatarSvg: serializer.fromJson(json['avatarSvg']), + myAvatarCounter: serializer.fromJson(json['myAvatarCounter']), + accepted: serializer.fromJson(json['accepted']), + requested: serializer.fromJson(json['requested']), + blocked: serializer.fromJson(json['blocked']), + verified: serializer.fromJson(json['verified']), + archived: serializer.fromJson(json['archived']), + pinned: serializer.fromJson(json['pinned']), + alsoBestFriend: serializer.fromJson(json['alsoBestFriend']), + deleteMessagesAfterXMinutes: + serializer.fromJson(json['deleteMessagesAfterXMinutes']), + createdAt: serializer.fromJson(json['createdAt']), + totalMediaCounter: serializer.fromJson(json['totalMediaCounter']), + lastMessageSend: serializer.fromJson(json['lastMessageSend']), + lastMessageReceived: + serializer.fromJson(json['lastMessageReceived']), + lastFlameCounterChange: + serializer.fromJson(json['lastFlameCounterChange']), + lastFlameSync: serializer.fromJson(json['lastFlameSync']), + lastMessageExchange: + serializer.fromJson(json['lastMessageExchange']), + flameCounter: serializer.fromJson(json['flameCounter']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'userId': serializer.toJson(userId), + 'username': serializer.toJson(username), + 'displayName': serializer.toJson(displayName), + 'nickName': serializer.toJson(nickName), + 'avatarSvg': serializer.toJson(avatarSvg), + 'myAvatarCounter': serializer.toJson(myAvatarCounter), + 'accepted': serializer.toJson(accepted), + 'requested': serializer.toJson(requested), + 'blocked': serializer.toJson(blocked), + 'verified': serializer.toJson(verified), + 'archived': serializer.toJson(archived), + 'pinned': serializer.toJson(pinned), + 'alsoBestFriend': serializer.toJson(alsoBestFriend), + 'deleteMessagesAfterXMinutes': + serializer.toJson(deleteMessagesAfterXMinutes), + 'createdAt': serializer.toJson(createdAt), + 'totalMediaCounter': serializer.toJson(totalMediaCounter), + 'lastMessageSend': serializer.toJson(lastMessageSend), + 'lastMessageReceived': serializer.toJson(lastMessageReceived), + 'lastFlameCounterChange': + serializer.toJson(lastFlameCounterChange), + 'lastFlameSync': serializer.toJson(lastFlameSync), + 'lastMessageExchange': serializer.toJson(lastMessageExchange), + 'flameCounter': serializer.toJson(flameCounter), + }; + } + + ContactsData copyWith( + {int? userId, + String? username, + Value displayName = const Value.absent(), + Value nickName = const Value.absent(), + Value avatarSvg = const Value.absent(), + int? myAvatarCounter, + bool? accepted, + bool? requested, + bool? blocked, + bool? verified, + bool? archived, + bool? pinned, + bool? alsoBestFriend, + int? deleteMessagesAfterXMinutes, + DateTime? createdAt, + int? totalMediaCounter, + Value lastMessageSend = const Value.absent(), + Value lastMessageReceived = const Value.absent(), + Value lastFlameCounterChange = const Value.absent(), + Value lastFlameSync = const Value.absent(), + DateTime? lastMessageExchange, + int? flameCounter}) => + ContactsData( + userId: userId ?? this.userId, + username: username ?? this.username, + displayName: displayName.present ? displayName.value : this.displayName, + nickName: nickName.present ? nickName.value : this.nickName, + avatarSvg: avatarSvg.present ? avatarSvg.value : this.avatarSvg, + myAvatarCounter: myAvatarCounter ?? this.myAvatarCounter, + accepted: accepted ?? this.accepted, + requested: requested ?? this.requested, + blocked: blocked ?? this.blocked, + verified: verified ?? this.verified, + archived: archived ?? this.archived, + pinned: pinned ?? this.pinned, + alsoBestFriend: alsoBestFriend ?? this.alsoBestFriend, + deleteMessagesAfterXMinutes: + deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes, + createdAt: createdAt ?? this.createdAt, + totalMediaCounter: totalMediaCounter ?? this.totalMediaCounter, + lastMessageSend: lastMessageSend.present + ? lastMessageSend.value + : this.lastMessageSend, + lastMessageReceived: lastMessageReceived.present + ? lastMessageReceived.value + : this.lastMessageReceived, + lastFlameCounterChange: lastFlameCounterChange.present + ? lastFlameCounterChange.value + : this.lastFlameCounterChange, + lastFlameSync: + lastFlameSync.present ? lastFlameSync.value : this.lastFlameSync, + lastMessageExchange: lastMessageExchange ?? this.lastMessageExchange, + flameCounter: flameCounter ?? this.flameCounter, + ); + ContactsData copyWithCompanion(ContactsCompanion data) { + return ContactsData( + userId: data.userId.present ? data.userId.value : this.userId, + username: data.username.present ? data.username.value : this.username, + displayName: + data.displayName.present ? data.displayName.value : this.displayName, + nickName: data.nickName.present ? data.nickName.value : this.nickName, + avatarSvg: data.avatarSvg.present ? data.avatarSvg.value : this.avatarSvg, + myAvatarCounter: data.myAvatarCounter.present + ? data.myAvatarCounter.value + : this.myAvatarCounter, + accepted: data.accepted.present ? data.accepted.value : this.accepted, + requested: data.requested.present ? data.requested.value : this.requested, + blocked: data.blocked.present ? data.blocked.value : this.blocked, + verified: data.verified.present ? data.verified.value : this.verified, + archived: data.archived.present ? data.archived.value : this.archived, + pinned: data.pinned.present ? data.pinned.value : this.pinned, + alsoBestFriend: data.alsoBestFriend.present + ? data.alsoBestFriend.value + : this.alsoBestFriend, + deleteMessagesAfterXMinutes: data.deleteMessagesAfterXMinutes.present + ? data.deleteMessagesAfterXMinutes.value + : this.deleteMessagesAfterXMinutes, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + totalMediaCounter: data.totalMediaCounter.present + ? data.totalMediaCounter.value + : this.totalMediaCounter, + lastMessageSend: data.lastMessageSend.present + ? data.lastMessageSend.value + : this.lastMessageSend, + lastMessageReceived: data.lastMessageReceived.present + ? data.lastMessageReceived.value + : this.lastMessageReceived, + lastFlameCounterChange: data.lastFlameCounterChange.present + ? data.lastFlameCounterChange.value + : this.lastFlameCounterChange, + lastFlameSync: data.lastFlameSync.present + ? data.lastFlameSync.value + : this.lastFlameSync, + lastMessageExchange: data.lastMessageExchange.present + ? data.lastMessageExchange.value + : this.lastMessageExchange, + flameCounter: data.flameCounter.present + ? data.flameCounter.value + : this.flameCounter, + ); + } + + @override + String toString() { + return (StringBuffer('ContactsData(') + ..write('userId: $userId, ') + ..write('username: $username, ') + ..write('displayName: $displayName, ') + ..write('nickName: $nickName, ') + ..write('avatarSvg: $avatarSvg, ') + ..write('myAvatarCounter: $myAvatarCounter, ') + ..write('accepted: $accepted, ') + ..write('requested: $requested, ') + ..write('blocked: $blocked, ') + ..write('verified: $verified, ') + ..write('archived: $archived, ') + ..write('pinned: $pinned, ') + ..write('alsoBestFriend: $alsoBestFriend, ') + ..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ') + ..write('createdAt: $createdAt, ') + ..write('totalMediaCounter: $totalMediaCounter, ') + ..write('lastMessageSend: $lastMessageSend, ') + ..write('lastMessageReceived: $lastMessageReceived, ') + ..write('lastFlameCounterChange: $lastFlameCounterChange, ') + ..write('lastFlameSync: $lastFlameSync, ') + ..write('lastMessageExchange: $lastMessageExchange, ') + ..write('flameCounter: $flameCounter') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + userId, + username, + displayName, + nickName, + avatarSvg, + myAvatarCounter, + accepted, + requested, + blocked, + verified, + archived, + pinned, + alsoBestFriend, + deleteMessagesAfterXMinutes, + createdAt, + totalMediaCounter, + lastMessageSend, + lastMessageReceived, + lastFlameCounterChange, + lastFlameSync, + lastMessageExchange, + flameCounter + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ContactsData && + other.userId == this.userId && + other.username == this.username && + other.displayName == this.displayName && + other.nickName == this.nickName && + other.avatarSvg == this.avatarSvg && + other.myAvatarCounter == this.myAvatarCounter && + other.accepted == this.accepted && + other.requested == this.requested && + other.blocked == this.blocked && + other.verified == this.verified && + other.archived == this.archived && + other.pinned == this.pinned && + other.alsoBestFriend == this.alsoBestFriend && + other.deleteMessagesAfterXMinutes == + this.deleteMessagesAfterXMinutes && + other.createdAt == this.createdAt && + other.totalMediaCounter == this.totalMediaCounter && + other.lastMessageSend == this.lastMessageSend && + other.lastMessageReceived == this.lastMessageReceived && + other.lastFlameCounterChange == this.lastFlameCounterChange && + other.lastFlameSync == this.lastFlameSync && + other.lastMessageExchange == this.lastMessageExchange && + other.flameCounter == this.flameCounter); +} + +class ContactsCompanion extends UpdateCompanion { + final Value userId; + final Value username; + final Value displayName; + final Value nickName; + final Value avatarSvg; + final Value myAvatarCounter; + final Value accepted; + final Value requested; + final Value blocked; + final Value verified; + final Value archived; + final Value pinned; + final Value alsoBestFriend; + final Value deleteMessagesAfterXMinutes; + final Value createdAt; + final Value totalMediaCounter; + final Value lastMessageSend; + final Value lastMessageReceived; + final Value lastFlameCounterChange; + final Value lastFlameSync; + final Value lastMessageExchange; + final Value flameCounter; + const ContactsCompanion({ + this.userId = const Value.absent(), + this.username = const Value.absent(), + this.displayName = const Value.absent(), + this.nickName = const Value.absent(), + this.avatarSvg = const Value.absent(), + this.myAvatarCounter = const Value.absent(), + this.accepted = const Value.absent(), + this.requested = const Value.absent(), + this.blocked = const Value.absent(), + this.verified = const Value.absent(), + this.archived = const Value.absent(), + this.pinned = const Value.absent(), + this.alsoBestFriend = const Value.absent(), + this.deleteMessagesAfterXMinutes = const Value.absent(), + this.createdAt = const Value.absent(), + this.totalMediaCounter = const Value.absent(), + this.lastMessageSend = const Value.absent(), + this.lastMessageReceived = const Value.absent(), + this.lastFlameCounterChange = const Value.absent(), + this.lastFlameSync = const Value.absent(), + this.lastMessageExchange = const Value.absent(), + this.flameCounter = const Value.absent(), + }); + ContactsCompanion.insert({ + this.userId = const Value.absent(), + required String username, + this.displayName = const Value.absent(), + this.nickName = const Value.absent(), + this.avatarSvg = const Value.absent(), + this.myAvatarCounter = const Value.absent(), + this.accepted = const Value.absent(), + this.requested = const Value.absent(), + this.blocked = const Value.absent(), + this.verified = const Value.absent(), + this.archived = const Value.absent(), + this.pinned = const Value.absent(), + this.alsoBestFriend = const Value.absent(), + this.deleteMessagesAfterXMinutes = const Value.absent(), + this.createdAt = const Value.absent(), + this.totalMediaCounter = const Value.absent(), + this.lastMessageSend = const Value.absent(), + this.lastMessageReceived = const Value.absent(), + this.lastFlameCounterChange = const Value.absent(), + this.lastFlameSync = const Value.absent(), + this.lastMessageExchange = const Value.absent(), + this.flameCounter = const Value.absent(), + }) : username = Value(username); + static Insertable custom({ + Expression? userId, + Expression? username, + Expression? displayName, + Expression? nickName, + Expression? avatarSvg, + Expression? myAvatarCounter, + Expression? accepted, + Expression? requested, + Expression? blocked, + Expression? verified, + Expression? archived, + Expression? pinned, + Expression? alsoBestFriend, + Expression? deleteMessagesAfterXMinutes, + Expression? createdAt, + Expression? totalMediaCounter, + Expression? lastMessageSend, + Expression? lastMessageReceived, + Expression? lastFlameCounterChange, + Expression? lastFlameSync, + Expression? lastMessageExchange, + Expression? flameCounter, + }) { + return RawValuesInsertable({ + if (userId != null) 'user_id': userId, + if (username != null) 'username': username, + if (displayName != null) 'display_name': displayName, + if (nickName != null) 'nick_name': nickName, + if (avatarSvg != null) 'avatar_svg': avatarSvg, + if (myAvatarCounter != null) 'my_avatar_counter': myAvatarCounter, + if (accepted != null) 'accepted': accepted, + if (requested != null) 'requested': requested, + if (blocked != null) 'blocked': blocked, + if (verified != null) 'verified': verified, + if (archived != null) 'archived': archived, + if (pinned != null) 'pinned': pinned, + if (alsoBestFriend != null) 'also_best_friend': alsoBestFriend, + if (deleteMessagesAfterXMinutes != null) + 'delete_messages_after_x_minutes': deleteMessagesAfterXMinutes, + if (createdAt != null) 'created_at': createdAt, + if (totalMediaCounter != null) 'total_media_counter': totalMediaCounter, + if (lastMessageSend != null) 'last_message_send': lastMessageSend, + if (lastMessageReceived != null) + 'last_message_received': lastMessageReceived, + if (lastFlameCounterChange != null) + 'last_flame_counter_change': lastFlameCounterChange, + if (lastFlameSync != null) 'last_flame_sync': lastFlameSync, + if (lastMessageExchange != null) + 'last_message_exchange': lastMessageExchange, + if (flameCounter != null) 'flame_counter': flameCounter, + }); + } + + ContactsCompanion copyWith( + {Value? userId, + Value? username, + Value? displayName, + Value? nickName, + Value? avatarSvg, + Value? myAvatarCounter, + Value? accepted, + Value? requested, + Value? blocked, + Value? verified, + Value? archived, + Value? pinned, + Value? alsoBestFriend, + Value? deleteMessagesAfterXMinutes, + Value? createdAt, + Value? totalMediaCounter, + Value? lastMessageSend, + Value? lastMessageReceived, + Value? lastFlameCounterChange, + Value? lastFlameSync, + Value? lastMessageExchange, + Value? flameCounter}) { + return ContactsCompanion( + userId: userId ?? this.userId, + username: username ?? this.username, + displayName: displayName ?? this.displayName, + nickName: nickName ?? this.nickName, + avatarSvg: avatarSvg ?? this.avatarSvg, + myAvatarCounter: myAvatarCounter ?? this.myAvatarCounter, + accepted: accepted ?? this.accepted, + requested: requested ?? this.requested, + blocked: blocked ?? this.blocked, + verified: verified ?? this.verified, + archived: archived ?? this.archived, + pinned: pinned ?? this.pinned, + alsoBestFriend: alsoBestFriend ?? this.alsoBestFriend, + deleteMessagesAfterXMinutes: + deleteMessagesAfterXMinutes ?? this.deleteMessagesAfterXMinutes, + createdAt: createdAt ?? this.createdAt, + totalMediaCounter: totalMediaCounter ?? this.totalMediaCounter, + lastMessageSend: lastMessageSend ?? this.lastMessageSend, + lastMessageReceived: lastMessageReceived ?? this.lastMessageReceived, + lastFlameCounterChange: + lastFlameCounterChange ?? this.lastFlameCounterChange, + lastFlameSync: lastFlameSync ?? this.lastFlameSync, + lastMessageExchange: lastMessageExchange ?? this.lastMessageExchange, + flameCounter: flameCounter ?? this.flameCounter, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (userId.present) { + map['user_id'] = Variable(userId.value); + } + if (username.present) { + map['username'] = Variable(username.value); + } + if (displayName.present) { + map['display_name'] = Variable(displayName.value); + } + if (nickName.present) { + map['nick_name'] = Variable(nickName.value); + } + if (avatarSvg.present) { + map['avatar_svg'] = Variable(avatarSvg.value); + } + if (myAvatarCounter.present) { + map['my_avatar_counter'] = Variable(myAvatarCounter.value); + } + if (accepted.present) { + map['accepted'] = Variable(accepted.value); + } + if (requested.present) { + map['requested'] = Variable(requested.value); + } + if (blocked.present) { + map['blocked'] = Variable(blocked.value); + } + if (verified.present) { + map['verified'] = Variable(verified.value); + } + if (archived.present) { + map['archived'] = Variable(archived.value); + } + if (pinned.present) { + map['pinned'] = Variable(pinned.value); + } + if (alsoBestFriend.present) { + map['also_best_friend'] = Variable(alsoBestFriend.value); + } + if (deleteMessagesAfterXMinutes.present) { + map['delete_messages_after_x_minutes'] = + Variable(deleteMessagesAfterXMinutes.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (totalMediaCounter.present) { + map['total_media_counter'] = Variable(totalMediaCounter.value); + } + if (lastMessageSend.present) { + map['last_message_send'] = Variable(lastMessageSend.value); + } + if (lastMessageReceived.present) { + map['last_message_received'] = + Variable(lastMessageReceived.value); + } + if (lastFlameCounterChange.present) { + map['last_flame_counter_change'] = + Variable(lastFlameCounterChange.value); + } + if (lastFlameSync.present) { + map['last_flame_sync'] = Variable(lastFlameSync.value); + } + if (lastMessageExchange.present) { + map['last_message_exchange'] = + Variable(lastMessageExchange.value); + } + if (flameCounter.present) { + map['flame_counter'] = Variable(flameCounter.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ContactsCompanion(') + ..write('userId: $userId, ') + ..write('username: $username, ') + ..write('displayName: $displayName, ') + ..write('nickName: $nickName, ') + ..write('avatarSvg: $avatarSvg, ') + ..write('myAvatarCounter: $myAvatarCounter, ') + ..write('accepted: $accepted, ') + ..write('requested: $requested, ') + ..write('blocked: $blocked, ') + ..write('verified: $verified, ') + ..write('archived: $archived, ') + ..write('pinned: $pinned, ') + ..write('alsoBestFriend: $alsoBestFriend, ') + ..write('deleteMessagesAfterXMinutes: $deleteMessagesAfterXMinutes, ') + ..write('createdAt: $createdAt, ') + ..write('totalMediaCounter: $totalMediaCounter, ') + ..write('lastMessageSend: $lastMessageSend, ') + ..write('lastMessageReceived: $lastMessageReceived, ') + ..write('lastFlameCounterChange: $lastFlameCounterChange, ') + ..write('lastFlameSync: $lastFlameSync, ') + ..write('lastMessageExchange: $lastMessageExchange, ') + ..write('flameCounter: $flameCounter') + ..write(')')) + .toString(); + } +} + +class Messages extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Messages(this.attachedDatabase, [this._alias]); + late final GeneratedColumn contactId = GeneratedColumn( + 'contact_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES contacts (user_id)')); + late final GeneratedColumn messageId = GeneratedColumn( + 'message_id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn messageOtherId = GeneratedColumn( + 'message_other_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn mediaUploadId = GeneratedColumn( + 'media_upload_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn mediaDownloadId = GeneratedColumn( + 'media_download_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn responseToMessageId = GeneratedColumn( + 'response_to_message_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn responseToOtherMessageId = + GeneratedColumn('response_to_other_message_id', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn acknowledgeByUser = GeneratedColumn( + 'acknowledge_by_user', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("acknowledge_by_user" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn mediaStored = GeneratedColumn( + 'media_stored', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("media_stored" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn downloadState = GeneratedColumn( + 'download_state', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const CustomExpression('2')); + late final GeneratedColumn acknowledgeByServer = GeneratedColumn( + 'acknowledge_by_server', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("acknowledge_by_server" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn errorWhileSending = GeneratedColumn( + 'error_while_sending', aliasedName, false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("error_while_sending" IN (0, 1))'), + defaultValue: const CustomExpression('0')); + late final GeneratedColumn kind = GeneratedColumn( + 'kind', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn contentJson = GeneratedColumn( + 'content_json', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn openedAt = GeneratedColumn( + 'opened_at', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn sendAt = GeneratedColumn( + 'send_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression( + 'CAST(strftime(\'%s\', CURRENT_TIMESTAMP) AS INTEGER)')); + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression( + 'CAST(strftime(\'%s\', CURRENT_TIMESTAMP) AS INTEGER)')); + @override + List get $columns => [ + contactId, + messageId, + messageOtherId, + mediaUploadId, + mediaDownloadId, + responseToMessageId, + responseToOtherMessageId, + acknowledgeByUser, + mediaStored, + downloadState, + acknowledgeByServer, + errorWhileSending, + kind, + contentJson, + openedAt, + sendAt, + updatedAt + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'messages'; + @override + Set get $primaryKey => {messageId}; + @override + MessagesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MessagesData( + contactId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}contact_id'])!, + messageId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}message_id'])!, + messageOtherId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}message_other_id']), + mediaUploadId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}media_upload_id']), + mediaDownloadId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}media_download_id']), + responseToMessageId: attachedDatabase.typeMapping.read( + DriftSqlType.int, data['${effectivePrefix}response_to_message_id']), + responseToOtherMessageId: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}response_to_other_message_id']), + acknowledgeByUser: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}acknowledge_by_user'])!, + mediaStored: attachedDatabase.typeMapping + .read(DriftSqlType.bool, data['${effectivePrefix}media_stored'])!, + downloadState: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}download_state'])!, + acknowledgeByServer: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}acknowledge_by_server'])!, + errorWhileSending: attachedDatabase.typeMapping.read( + DriftSqlType.bool, data['${effectivePrefix}error_while_sending'])!, + kind: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}kind'])!, + contentJson: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}content_json']), + openedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}opened_at']), + sendAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}send_at'])!, + updatedAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + ); + } + + @override + Messages createAlias(String alias) { + return Messages(attachedDatabase, alias); + } +} + +class MessagesData extends DataClass implements Insertable { + final int contactId; + final int messageId; + final int? messageOtherId; + final int? mediaUploadId; + final int? mediaDownloadId; + final int? responseToMessageId; + final int? responseToOtherMessageId; + final bool acknowledgeByUser; + final bool mediaStored; + final int downloadState; + final bool acknowledgeByServer; + final bool errorWhileSending; + final String kind; + final String? contentJson; + final DateTime? openedAt; + final DateTime sendAt; + final DateTime updatedAt; + const MessagesData( + {required this.contactId, + required this.messageId, + this.messageOtherId, + this.mediaUploadId, + this.mediaDownloadId, + this.responseToMessageId, + this.responseToOtherMessageId, + required this.acknowledgeByUser, + required this.mediaStored, + required this.downloadState, + required this.acknowledgeByServer, + required this.errorWhileSending, + required this.kind, + this.contentJson, + this.openedAt, + required this.sendAt, + required this.updatedAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['contact_id'] = Variable(contactId); + map['message_id'] = Variable(messageId); + if (!nullToAbsent || messageOtherId != null) { + map['message_other_id'] = Variable(messageOtherId); + } + if (!nullToAbsent || mediaUploadId != null) { + map['media_upload_id'] = Variable(mediaUploadId); + } + if (!nullToAbsent || mediaDownloadId != null) { + map['media_download_id'] = Variable(mediaDownloadId); + } + if (!nullToAbsent || responseToMessageId != null) { + map['response_to_message_id'] = Variable(responseToMessageId); + } + if (!nullToAbsent || responseToOtherMessageId != null) { + map['response_to_other_message_id'] = + Variable(responseToOtherMessageId); + } + map['acknowledge_by_user'] = Variable(acknowledgeByUser); + map['media_stored'] = Variable(mediaStored); + map['download_state'] = Variable(downloadState); + map['acknowledge_by_server'] = Variable(acknowledgeByServer); + map['error_while_sending'] = Variable(errorWhileSending); + map['kind'] = Variable(kind); + if (!nullToAbsent || contentJson != null) { + map['content_json'] = Variable(contentJson); + } + if (!nullToAbsent || openedAt != null) { + map['opened_at'] = Variable(openedAt); + } + map['send_at'] = Variable(sendAt); + map['updated_at'] = Variable(updatedAt); + return map; + } + + MessagesCompanion toCompanion(bool nullToAbsent) { + return MessagesCompanion( + contactId: Value(contactId), + messageId: Value(messageId), + messageOtherId: messageOtherId == null && nullToAbsent + ? const Value.absent() + : Value(messageOtherId), + mediaUploadId: mediaUploadId == null && nullToAbsent + ? const Value.absent() + : Value(mediaUploadId), + mediaDownloadId: mediaDownloadId == null && nullToAbsent + ? const Value.absent() + : Value(mediaDownloadId), + responseToMessageId: responseToMessageId == null && nullToAbsent + ? const Value.absent() + : Value(responseToMessageId), + responseToOtherMessageId: responseToOtherMessageId == null && nullToAbsent + ? const Value.absent() + : Value(responseToOtherMessageId), + acknowledgeByUser: Value(acknowledgeByUser), + mediaStored: Value(mediaStored), + downloadState: Value(downloadState), + acknowledgeByServer: Value(acknowledgeByServer), + errorWhileSending: Value(errorWhileSending), + kind: Value(kind), + contentJson: contentJson == null && nullToAbsent + ? const Value.absent() + : Value(contentJson), + openedAt: openedAt == null && nullToAbsent + ? const Value.absent() + : Value(openedAt), + sendAt: Value(sendAt), + updatedAt: Value(updatedAt), + ); + } + + factory MessagesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MessagesData( + contactId: serializer.fromJson(json['contactId']), + messageId: serializer.fromJson(json['messageId']), + messageOtherId: serializer.fromJson(json['messageOtherId']), + mediaUploadId: serializer.fromJson(json['mediaUploadId']), + mediaDownloadId: serializer.fromJson(json['mediaDownloadId']), + responseToMessageId: + serializer.fromJson(json['responseToMessageId']), + responseToOtherMessageId: + serializer.fromJson(json['responseToOtherMessageId']), + acknowledgeByUser: serializer.fromJson(json['acknowledgeByUser']), + mediaStored: serializer.fromJson(json['mediaStored']), + downloadState: serializer.fromJson(json['downloadState']), + acknowledgeByServer: + serializer.fromJson(json['acknowledgeByServer']), + errorWhileSending: serializer.fromJson(json['errorWhileSending']), + kind: serializer.fromJson(json['kind']), + contentJson: serializer.fromJson(json['contentJson']), + openedAt: serializer.fromJson(json['openedAt']), + sendAt: serializer.fromJson(json['sendAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'contactId': serializer.toJson(contactId), + 'messageId': serializer.toJson(messageId), + 'messageOtherId': serializer.toJson(messageOtherId), + 'mediaUploadId': serializer.toJson(mediaUploadId), + 'mediaDownloadId': serializer.toJson(mediaDownloadId), + 'responseToMessageId': serializer.toJson(responseToMessageId), + 'responseToOtherMessageId': + serializer.toJson(responseToOtherMessageId), + 'acknowledgeByUser': serializer.toJson(acknowledgeByUser), + 'mediaStored': serializer.toJson(mediaStored), + 'downloadState': serializer.toJson(downloadState), + 'acknowledgeByServer': serializer.toJson(acknowledgeByServer), + 'errorWhileSending': serializer.toJson(errorWhileSending), + 'kind': serializer.toJson(kind), + 'contentJson': serializer.toJson(contentJson), + 'openedAt': serializer.toJson(openedAt), + 'sendAt': serializer.toJson(sendAt), + 'updatedAt': serializer.toJson(updatedAt), + }; + } + + MessagesData copyWith( + {int? contactId, + int? messageId, + Value messageOtherId = const Value.absent(), + Value mediaUploadId = const Value.absent(), + Value mediaDownloadId = const Value.absent(), + Value responseToMessageId = const Value.absent(), + Value responseToOtherMessageId = const Value.absent(), + bool? acknowledgeByUser, + bool? mediaStored, + int? downloadState, + bool? acknowledgeByServer, + bool? errorWhileSending, + String? kind, + Value contentJson = const Value.absent(), + Value openedAt = const Value.absent(), + DateTime? sendAt, + DateTime? updatedAt}) => + MessagesData( + contactId: contactId ?? this.contactId, + messageId: messageId ?? this.messageId, + messageOtherId: + messageOtherId.present ? messageOtherId.value : this.messageOtherId, + mediaUploadId: + mediaUploadId.present ? mediaUploadId.value : this.mediaUploadId, + mediaDownloadId: mediaDownloadId.present + ? mediaDownloadId.value + : this.mediaDownloadId, + responseToMessageId: responseToMessageId.present + ? responseToMessageId.value + : this.responseToMessageId, + responseToOtherMessageId: responseToOtherMessageId.present + ? responseToOtherMessageId.value + : this.responseToOtherMessageId, + acknowledgeByUser: acknowledgeByUser ?? this.acknowledgeByUser, + mediaStored: mediaStored ?? this.mediaStored, + downloadState: downloadState ?? this.downloadState, + acknowledgeByServer: acknowledgeByServer ?? this.acknowledgeByServer, + errorWhileSending: errorWhileSending ?? this.errorWhileSending, + kind: kind ?? this.kind, + contentJson: contentJson.present ? contentJson.value : this.contentJson, + openedAt: openedAt.present ? openedAt.value : this.openedAt, + sendAt: sendAt ?? this.sendAt, + updatedAt: updatedAt ?? this.updatedAt, + ); + MessagesData copyWithCompanion(MessagesCompanion data) { + return MessagesData( + contactId: data.contactId.present ? data.contactId.value : this.contactId, + messageId: data.messageId.present ? data.messageId.value : this.messageId, + messageOtherId: data.messageOtherId.present + ? data.messageOtherId.value + : this.messageOtherId, + mediaUploadId: data.mediaUploadId.present + ? data.mediaUploadId.value + : this.mediaUploadId, + mediaDownloadId: data.mediaDownloadId.present + ? data.mediaDownloadId.value + : this.mediaDownloadId, + responseToMessageId: data.responseToMessageId.present + ? data.responseToMessageId.value + : this.responseToMessageId, + responseToOtherMessageId: data.responseToOtherMessageId.present + ? data.responseToOtherMessageId.value + : this.responseToOtherMessageId, + acknowledgeByUser: data.acknowledgeByUser.present + ? data.acknowledgeByUser.value + : this.acknowledgeByUser, + mediaStored: + data.mediaStored.present ? data.mediaStored.value : this.mediaStored, + downloadState: data.downloadState.present + ? data.downloadState.value + : this.downloadState, + acknowledgeByServer: data.acknowledgeByServer.present + ? data.acknowledgeByServer.value + : this.acknowledgeByServer, + errorWhileSending: data.errorWhileSending.present + ? data.errorWhileSending.value + : this.errorWhileSending, + kind: data.kind.present ? data.kind.value : this.kind, + contentJson: + data.contentJson.present ? data.contentJson.value : this.contentJson, + openedAt: data.openedAt.present ? data.openedAt.value : this.openedAt, + sendAt: data.sendAt.present ? data.sendAt.value : this.sendAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + ); + } + + @override + String toString() { + return (StringBuffer('MessagesData(') + ..write('contactId: $contactId, ') + ..write('messageId: $messageId, ') + ..write('messageOtherId: $messageOtherId, ') + ..write('mediaUploadId: $mediaUploadId, ') + ..write('mediaDownloadId: $mediaDownloadId, ') + ..write('responseToMessageId: $responseToMessageId, ') + ..write('responseToOtherMessageId: $responseToOtherMessageId, ') + ..write('acknowledgeByUser: $acknowledgeByUser, ') + ..write('mediaStored: $mediaStored, ') + ..write('downloadState: $downloadState, ') + ..write('acknowledgeByServer: $acknowledgeByServer, ') + ..write('errorWhileSending: $errorWhileSending, ') + ..write('kind: $kind, ') + ..write('contentJson: $contentJson, ') + ..write('openedAt: $openedAt, ') + ..write('sendAt: $sendAt, ') + ..write('updatedAt: $updatedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + contactId, + messageId, + messageOtherId, + mediaUploadId, + mediaDownloadId, + responseToMessageId, + responseToOtherMessageId, + acknowledgeByUser, + mediaStored, + downloadState, + acknowledgeByServer, + errorWhileSending, + kind, + contentJson, + openedAt, + sendAt, + updatedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MessagesData && + other.contactId == this.contactId && + other.messageId == this.messageId && + other.messageOtherId == this.messageOtherId && + other.mediaUploadId == this.mediaUploadId && + other.mediaDownloadId == this.mediaDownloadId && + other.responseToMessageId == this.responseToMessageId && + other.responseToOtherMessageId == this.responseToOtherMessageId && + other.acknowledgeByUser == this.acknowledgeByUser && + other.mediaStored == this.mediaStored && + other.downloadState == this.downloadState && + other.acknowledgeByServer == this.acknowledgeByServer && + other.errorWhileSending == this.errorWhileSending && + other.kind == this.kind && + other.contentJson == this.contentJson && + other.openedAt == this.openedAt && + other.sendAt == this.sendAt && + other.updatedAt == this.updatedAt); +} + +class MessagesCompanion extends UpdateCompanion { + final Value contactId; + final Value messageId; + final Value messageOtherId; + final Value mediaUploadId; + final Value mediaDownloadId; + final Value responseToMessageId; + final Value responseToOtherMessageId; + final Value acknowledgeByUser; + final Value mediaStored; + final Value downloadState; + final Value acknowledgeByServer; + final Value errorWhileSending; + final Value kind; + final Value contentJson; + final Value openedAt; + final Value sendAt; + final Value updatedAt; + const MessagesCompanion({ + this.contactId = const Value.absent(), + this.messageId = const Value.absent(), + this.messageOtherId = const Value.absent(), + this.mediaUploadId = const Value.absent(), + this.mediaDownloadId = const Value.absent(), + this.responseToMessageId = const Value.absent(), + this.responseToOtherMessageId = const Value.absent(), + this.acknowledgeByUser = const Value.absent(), + this.mediaStored = const Value.absent(), + this.downloadState = const Value.absent(), + this.acknowledgeByServer = const Value.absent(), + this.errorWhileSending = const Value.absent(), + this.kind = const Value.absent(), + this.contentJson = const Value.absent(), + this.openedAt = const Value.absent(), + this.sendAt = const Value.absent(), + this.updatedAt = const Value.absent(), + }); + MessagesCompanion.insert({ + required int contactId, + this.messageId = const Value.absent(), + this.messageOtherId = const Value.absent(), + this.mediaUploadId = const Value.absent(), + this.mediaDownloadId = const Value.absent(), + this.responseToMessageId = const Value.absent(), + this.responseToOtherMessageId = const Value.absent(), + this.acknowledgeByUser = const Value.absent(), + this.mediaStored = const Value.absent(), + this.downloadState = const Value.absent(), + this.acknowledgeByServer = const Value.absent(), + this.errorWhileSending = const Value.absent(), + required String kind, + this.contentJson = const Value.absent(), + this.openedAt = const Value.absent(), + this.sendAt = const Value.absent(), + this.updatedAt = const Value.absent(), + }) : contactId = Value(contactId), + kind = Value(kind); + static Insertable custom({ + Expression? contactId, + Expression? messageId, + Expression? messageOtherId, + Expression? mediaUploadId, + Expression? mediaDownloadId, + Expression? responseToMessageId, + Expression? responseToOtherMessageId, + Expression? acknowledgeByUser, + Expression? mediaStored, + Expression? downloadState, + Expression? acknowledgeByServer, + Expression? errorWhileSending, + Expression? kind, + Expression? contentJson, + Expression? openedAt, + Expression? sendAt, + Expression? updatedAt, + }) { + return RawValuesInsertable({ + if (contactId != null) 'contact_id': contactId, + if (messageId != null) 'message_id': messageId, + if (messageOtherId != null) 'message_other_id': messageOtherId, + if (mediaUploadId != null) 'media_upload_id': mediaUploadId, + if (mediaDownloadId != null) 'media_download_id': mediaDownloadId, + if (responseToMessageId != null) + 'response_to_message_id': responseToMessageId, + if (responseToOtherMessageId != null) + 'response_to_other_message_id': responseToOtherMessageId, + if (acknowledgeByUser != null) 'acknowledge_by_user': acknowledgeByUser, + if (mediaStored != null) 'media_stored': mediaStored, + if (downloadState != null) 'download_state': downloadState, + if (acknowledgeByServer != null) + 'acknowledge_by_server': acknowledgeByServer, + if (errorWhileSending != null) 'error_while_sending': errorWhileSending, + if (kind != null) 'kind': kind, + if (contentJson != null) 'content_json': contentJson, + if (openedAt != null) 'opened_at': openedAt, + if (sendAt != null) 'send_at': sendAt, + if (updatedAt != null) 'updated_at': updatedAt, + }); + } + + MessagesCompanion copyWith( + {Value? contactId, + Value? messageId, + Value? messageOtherId, + Value? mediaUploadId, + Value? mediaDownloadId, + Value? responseToMessageId, + Value? responseToOtherMessageId, + Value? acknowledgeByUser, + Value? mediaStored, + Value? downloadState, + Value? acknowledgeByServer, + Value? errorWhileSending, + Value? kind, + Value? contentJson, + Value? openedAt, + Value? sendAt, + Value? updatedAt}) { + return MessagesCompanion( + contactId: contactId ?? this.contactId, + messageId: messageId ?? this.messageId, + messageOtherId: messageOtherId ?? this.messageOtherId, + mediaUploadId: mediaUploadId ?? this.mediaUploadId, + mediaDownloadId: mediaDownloadId ?? this.mediaDownloadId, + responseToMessageId: responseToMessageId ?? this.responseToMessageId, + responseToOtherMessageId: + responseToOtherMessageId ?? this.responseToOtherMessageId, + acknowledgeByUser: acknowledgeByUser ?? this.acknowledgeByUser, + mediaStored: mediaStored ?? this.mediaStored, + downloadState: downloadState ?? this.downloadState, + acknowledgeByServer: acknowledgeByServer ?? this.acknowledgeByServer, + errorWhileSending: errorWhileSending ?? this.errorWhileSending, + kind: kind ?? this.kind, + contentJson: contentJson ?? this.contentJson, + openedAt: openedAt ?? this.openedAt, + sendAt: sendAt ?? this.sendAt, + updatedAt: updatedAt ?? this.updatedAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (contactId.present) { + map['contact_id'] = Variable(contactId.value); + } + if (messageId.present) { + map['message_id'] = Variable(messageId.value); + } + if (messageOtherId.present) { + map['message_other_id'] = Variable(messageOtherId.value); + } + if (mediaUploadId.present) { + map['media_upload_id'] = Variable(mediaUploadId.value); + } + if (mediaDownloadId.present) { + map['media_download_id'] = Variable(mediaDownloadId.value); + } + if (responseToMessageId.present) { + map['response_to_message_id'] = Variable(responseToMessageId.value); + } + if (responseToOtherMessageId.present) { + map['response_to_other_message_id'] = + Variable(responseToOtherMessageId.value); + } + if (acknowledgeByUser.present) { + map['acknowledge_by_user'] = Variable(acknowledgeByUser.value); + } + if (mediaStored.present) { + map['media_stored'] = Variable(mediaStored.value); + } + if (downloadState.present) { + map['download_state'] = Variable(downloadState.value); + } + if (acknowledgeByServer.present) { + map['acknowledge_by_server'] = Variable(acknowledgeByServer.value); + } + if (errorWhileSending.present) { + map['error_while_sending'] = Variable(errorWhileSending.value); + } + if (kind.present) { + map['kind'] = Variable(kind.value); + } + if (contentJson.present) { + map['content_json'] = Variable(contentJson.value); + } + if (openedAt.present) { + map['opened_at'] = Variable(openedAt.value); + } + if (sendAt.present) { + map['send_at'] = Variable(sendAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MessagesCompanion(') + ..write('contactId: $contactId, ') + ..write('messageId: $messageId, ') + ..write('messageOtherId: $messageOtherId, ') + ..write('mediaUploadId: $mediaUploadId, ') + ..write('mediaDownloadId: $mediaDownloadId, ') + ..write('responseToMessageId: $responseToMessageId, ') + ..write('responseToOtherMessageId: $responseToOtherMessageId, ') + ..write('acknowledgeByUser: $acknowledgeByUser, ') + ..write('mediaStored: $mediaStored, ') + ..write('downloadState: $downloadState, ') + ..write('acknowledgeByServer: $acknowledgeByServer, ') + ..write('errorWhileSending: $errorWhileSending, ') + ..write('kind: $kind, ') + ..write('contentJson: $contentJson, ') + ..write('openedAt: $openedAt, ') + ..write('sendAt: $sendAt, ') + ..write('updatedAt: $updatedAt') + ..write(')')) + .toString(); + } +} + +class MediaUploads extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + MediaUploads(this.attachedDatabase, [this._alias]); + late final GeneratedColumn mediaUploadId = GeneratedColumn( + 'media_upload_id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn state = GeneratedColumn( + 'state', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'pending\'')); + late final GeneratedColumn metadata = GeneratedColumn( + 'metadata', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn messageIds = GeneratedColumn( + 'message_ids', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn encryptionData = GeneratedColumn( + 'encryption_data', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn uploadTokens = GeneratedColumn( + 'upload_tokens', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn alreadyNotified = GeneratedColumn( + 'already_notified', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const CustomExpression('\'[]\'')); + @override + List get $columns => [ + mediaUploadId, + state, + metadata, + messageIds, + encryptionData, + uploadTokens, + alreadyNotified + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'media_uploads'; + @override + Set get $primaryKey => {mediaUploadId}; + @override + MediaUploadsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MediaUploadsData( + mediaUploadId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}media_upload_id'])!, + state: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}state'])!, + metadata: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}metadata']), + messageIds: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}message_ids']), + encryptionData: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}encryption_data']), + uploadTokens: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}upload_tokens']), + alreadyNotified: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}already_notified'])!, + ); + } + + @override + MediaUploads createAlias(String alias) { + return MediaUploads(attachedDatabase, alias); + } +} + +class MediaUploadsData extends DataClass + implements Insertable { + final int mediaUploadId; + final String state; + final String? metadata; + final String? messageIds; + final String? encryptionData; + final String? uploadTokens; + final String alreadyNotified; + const MediaUploadsData( + {required this.mediaUploadId, + required this.state, + this.metadata, + this.messageIds, + this.encryptionData, + this.uploadTokens, + required this.alreadyNotified}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['media_upload_id'] = Variable(mediaUploadId); + map['state'] = Variable(state); + if (!nullToAbsent || metadata != null) { + map['metadata'] = Variable(metadata); + } + if (!nullToAbsent || messageIds != null) { + map['message_ids'] = Variable(messageIds); + } + if (!nullToAbsent || encryptionData != null) { + map['encryption_data'] = Variable(encryptionData); + } + if (!nullToAbsent || uploadTokens != null) { + map['upload_tokens'] = Variable(uploadTokens); + } + map['already_notified'] = Variable(alreadyNotified); + return map; + } + + MediaUploadsCompanion toCompanion(bool nullToAbsent) { + return MediaUploadsCompanion( + mediaUploadId: Value(mediaUploadId), + state: Value(state), + metadata: metadata == null && nullToAbsent + ? const Value.absent() + : Value(metadata), + messageIds: messageIds == null && nullToAbsent + ? const Value.absent() + : Value(messageIds), + encryptionData: encryptionData == null && nullToAbsent + ? const Value.absent() + : Value(encryptionData), + uploadTokens: uploadTokens == null && nullToAbsent + ? const Value.absent() + : Value(uploadTokens), + alreadyNotified: Value(alreadyNotified), + ); + } + + factory MediaUploadsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MediaUploadsData( + mediaUploadId: serializer.fromJson(json['mediaUploadId']), + state: serializer.fromJson(json['state']), + metadata: serializer.fromJson(json['metadata']), + messageIds: serializer.fromJson(json['messageIds']), + encryptionData: serializer.fromJson(json['encryptionData']), + uploadTokens: serializer.fromJson(json['uploadTokens']), + alreadyNotified: serializer.fromJson(json['alreadyNotified']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'mediaUploadId': serializer.toJson(mediaUploadId), + 'state': serializer.toJson(state), + 'metadata': serializer.toJson(metadata), + 'messageIds': serializer.toJson(messageIds), + 'encryptionData': serializer.toJson(encryptionData), + 'uploadTokens': serializer.toJson(uploadTokens), + 'alreadyNotified': serializer.toJson(alreadyNotified), + }; + } + + MediaUploadsData copyWith( + {int? mediaUploadId, + String? state, + Value metadata = const Value.absent(), + Value messageIds = const Value.absent(), + Value encryptionData = const Value.absent(), + Value uploadTokens = const Value.absent(), + String? alreadyNotified}) => + MediaUploadsData( + mediaUploadId: mediaUploadId ?? this.mediaUploadId, + state: state ?? this.state, + metadata: metadata.present ? metadata.value : this.metadata, + messageIds: messageIds.present ? messageIds.value : this.messageIds, + encryptionData: + encryptionData.present ? encryptionData.value : this.encryptionData, + uploadTokens: + uploadTokens.present ? uploadTokens.value : this.uploadTokens, + alreadyNotified: alreadyNotified ?? this.alreadyNotified, + ); + MediaUploadsData copyWithCompanion(MediaUploadsCompanion data) { + return MediaUploadsData( + mediaUploadId: data.mediaUploadId.present + ? data.mediaUploadId.value + : this.mediaUploadId, + state: data.state.present ? data.state.value : this.state, + metadata: data.metadata.present ? data.metadata.value : this.metadata, + messageIds: + data.messageIds.present ? data.messageIds.value : this.messageIds, + encryptionData: data.encryptionData.present + ? data.encryptionData.value + : this.encryptionData, + uploadTokens: data.uploadTokens.present + ? data.uploadTokens.value + : this.uploadTokens, + alreadyNotified: data.alreadyNotified.present + ? data.alreadyNotified.value + : this.alreadyNotified, + ); + } + + @override + String toString() { + return (StringBuffer('MediaUploadsData(') + ..write('mediaUploadId: $mediaUploadId, ') + ..write('state: $state, ') + ..write('metadata: $metadata, ') + ..write('messageIds: $messageIds, ') + ..write('encryptionData: $encryptionData, ') + ..write('uploadTokens: $uploadTokens, ') + ..write('alreadyNotified: $alreadyNotified') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(mediaUploadId, state, metadata, messageIds, + encryptionData, uploadTokens, alreadyNotified); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MediaUploadsData && + other.mediaUploadId == this.mediaUploadId && + other.state == this.state && + other.metadata == this.metadata && + other.messageIds == this.messageIds && + other.encryptionData == this.encryptionData && + other.uploadTokens == this.uploadTokens && + other.alreadyNotified == this.alreadyNotified); +} + +class MediaUploadsCompanion extends UpdateCompanion { + final Value mediaUploadId; + final Value state; + final Value metadata; + final Value messageIds; + final Value encryptionData; + final Value uploadTokens; + final Value alreadyNotified; + const MediaUploadsCompanion({ + this.mediaUploadId = const Value.absent(), + this.state = const Value.absent(), + this.metadata = const Value.absent(), + this.messageIds = const Value.absent(), + this.encryptionData = const Value.absent(), + this.uploadTokens = const Value.absent(), + this.alreadyNotified = const Value.absent(), + }); + MediaUploadsCompanion.insert({ + this.mediaUploadId = const Value.absent(), + this.state = const Value.absent(), + this.metadata = const Value.absent(), + this.messageIds = const Value.absent(), + this.encryptionData = const Value.absent(), + this.uploadTokens = const Value.absent(), + this.alreadyNotified = const Value.absent(), + }); + static Insertable custom({ + Expression? mediaUploadId, + Expression? state, + Expression? metadata, + Expression? messageIds, + Expression? encryptionData, + Expression? uploadTokens, + Expression? alreadyNotified, + }) { + return RawValuesInsertable({ + if (mediaUploadId != null) 'media_upload_id': mediaUploadId, + if (state != null) 'state': state, + if (metadata != null) 'metadata': metadata, + if (messageIds != null) 'message_ids': messageIds, + if (encryptionData != null) 'encryption_data': encryptionData, + if (uploadTokens != null) 'upload_tokens': uploadTokens, + if (alreadyNotified != null) 'already_notified': alreadyNotified, + }); + } + + MediaUploadsCompanion copyWith( + {Value? mediaUploadId, + Value? state, + Value? metadata, + Value? messageIds, + Value? encryptionData, + Value? uploadTokens, + Value? alreadyNotified}) { + return MediaUploadsCompanion( + mediaUploadId: mediaUploadId ?? this.mediaUploadId, + state: state ?? this.state, + metadata: metadata ?? this.metadata, + messageIds: messageIds ?? this.messageIds, + encryptionData: encryptionData ?? this.encryptionData, + uploadTokens: uploadTokens ?? this.uploadTokens, + alreadyNotified: alreadyNotified ?? this.alreadyNotified, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (mediaUploadId.present) { + map['media_upload_id'] = Variable(mediaUploadId.value); + } + if (state.present) { + map['state'] = Variable(state.value); + } + if (metadata.present) { + map['metadata'] = Variable(metadata.value); + } + if (messageIds.present) { + map['message_ids'] = Variable(messageIds.value); + } + if (encryptionData.present) { + map['encryption_data'] = Variable(encryptionData.value); + } + if (uploadTokens.present) { + map['upload_tokens'] = Variable(uploadTokens.value); + } + if (alreadyNotified.present) { + map['already_notified'] = Variable(alreadyNotified.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MediaUploadsCompanion(') + ..write('mediaUploadId: $mediaUploadId, ') + ..write('state: $state, ') + ..write('metadata: $metadata, ') + ..write('messageIds: $messageIds, ') + ..write('encryptionData: $encryptionData, ') + ..write('uploadTokens: $uploadTokens, ') + ..write('alreadyNotified: $alreadyNotified') + ..write(')')) + .toString(); + } +} + +class MediaDownloads extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + MediaDownloads(this.attachedDatabase, [this._alias]); + late final GeneratedColumn messageId = GeneratedColumn( + 'message_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn downloadToken = GeneratedColumn( + 'download_token', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + @override + List get $columns => [messageId, downloadToken]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'media_downloads'; + @override + Set get $primaryKey => const {}; + @override + MediaDownloadsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MediaDownloadsData( + messageId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}message_id'])!, + downloadToken: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}download_token'])!, + ); + } + + @override + MediaDownloads createAlias(String alias) { + return MediaDownloads(attachedDatabase, alias); + } +} + +class MediaDownloadsData extends DataClass + implements Insertable { + final int messageId; + final String downloadToken; + const MediaDownloadsData( + {required this.messageId, required this.downloadToken}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['message_id'] = Variable(messageId); + map['download_token'] = Variable(downloadToken); + return map; + } + + MediaDownloadsCompanion toCompanion(bool nullToAbsent) { + return MediaDownloadsCompanion( + messageId: Value(messageId), + downloadToken: Value(downloadToken), + ); + } + + factory MediaDownloadsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MediaDownloadsData( + messageId: serializer.fromJson(json['messageId']), + downloadToken: serializer.fromJson(json['downloadToken']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'messageId': serializer.toJson(messageId), + 'downloadToken': serializer.toJson(downloadToken), + }; + } + + MediaDownloadsData copyWith({int? messageId, String? downloadToken}) => + MediaDownloadsData( + messageId: messageId ?? this.messageId, + downloadToken: downloadToken ?? this.downloadToken, + ); + MediaDownloadsData copyWithCompanion(MediaDownloadsCompanion data) { + return MediaDownloadsData( + messageId: data.messageId.present ? data.messageId.value : this.messageId, + downloadToken: data.downloadToken.present + ? data.downloadToken.value + : this.downloadToken, + ); + } + + @override + String toString() { + return (StringBuffer('MediaDownloadsData(') + ..write('messageId: $messageId, ') + ..write('downloadToken: $downloadToken') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(messageId, downloadToken); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MediaDownloadsData && + other.messageId == this.messageId && + other.downloadToken == this.downloadToken); +} + +class MediaDownloadsCompanion extends UpdateCompanion { + final Value messageId; + final Value downloadToken; + final Value rowid; + const MediaDownloadsCompanion({ + this.messageId = const Value.absent(), + this.downloadToken = const Value.absent(), + this.rowid = const Value.absent(), + }); + MediaDownloadsCompanion.insert({ + required int messageId, + required String downloadToken, + this.rowid = const Value.absent(), + }) : messageId = Value(messageId), + downloadToken = Value(downloadToken); + static Insertable custom({ + Expression? messageId, + Expression? downloadToken, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (messageId != null) 'message_id': messageId, + if (downloadToken != null) 'download_token': downloadToken, + if (rowid != null) 'rowid': rowid, + }); + } + + MediaDownloadsCompanion copyWith( + {Value? messageId, + Value? downloadToken, + Value? rowid}) { + return MediaDownloadsCompanion( + messageId: messageId ?? this.messageId, + downloadToken: downloadToken ?? this.downloadToken, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (messageId.present) { + map['message_id'] = Variable(messageId.value); + } + if (downloadToken.present) { + map['download_token'] = Variable(downloadToken.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MediaDownloadsCompanion(') + ..write('messageId: $messageId, ') + ..write('downloadToken: $downloadToken, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class SignalIdentityKeyStores extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SignalIdentityKeyStores(this.attachedDatabase, [this._alias]); + late final GeneratedColumn deviceId = GeneratedColumn( + 'device_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn identityKey = + GeneratedColumn('identity_key', aliasedName, false, + type: DriftSqlType.blob, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression( + 'CAST(strftime(\'%s\', CURRENT_TIMESTAMP) AS INTEGER)')); + @override + List get $columns => + [deviceId, name, identityKey, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'signal_identity_key_stores'; + @override + Set get $primaryKey => {deviceId, name}; + @override + SignalIdentityKeyStoresData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SignalIdentityKeyStoresData( + deviceId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}device_id'])!, + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + identityKey: attachedDatabase.typeMapping + .read(DriftSqlType.blob, data['${effectivePrefix}identity_key'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SignalIdentityKeyStores createAlias(String alias) { + return SignalIdentityKeyStores(attachedDatabase, alias); + } +} + +class SignalIdentityKeyStoresData extends DataClass + implements Insertable { + final int deviceId; + final String name; + final Uint8List identityKey; + final DateTime createdAt; + const SignalIdentityKeyStoresData( + {required this.deviceId, + required this.name, + required this.identityKey, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['device_id'] = Variable(deviceId); + map['name'] = Variable(name); + map['identity_key'] = Variable(identityKey); + map['created_at'] = Variable(createdAt); + return map; + } + + SignalIdentityKeyStoresCompanion toCompanion(bool nullToAbsent) { + return SignalIdentityKeyStoresCompanion( + deviceId: Value(deviceId), + name: Value(name), + identityKey: Value(identityKey), + createdAt: Value(createdAt), + ); + } + + factory SignalIdentityKeyStoresData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SignalIdentityKeyStoresData( + deviceId: serializer.fromJson(json['deviceId']), + name: serializer.fromJson(json['name']), + identityKey: serializer.fromJson(json['identityKey']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'deviceId': serializer.toJson(deviceId), + 'name': serializer.toJson(name), + 'identityKey': serializer.toJson(identityKey), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SignalIdentityKeyStoresData copyWith( + {int? deviceId, + String? name, + Uint8List? identityKey, + DateTime? createdAt}) => + SignalIdentityKeyStoresData( + deviceId: deviceId ?? this.deviceId, + name: name ?? this.name, + identityKey: identityKey ?? this.identityKey, + createdAt: createdAt ?? this.createdAt, + ); + SignalIdentityKeyStoresData copyWithCompanion( + SignalIdentityKeyStoresCompanion data) { + return SignalIdentityKeyStoresData( + deviceId: data.deviceId.present ? data.deviceId.value : this.deviceId, + name: data.name.present ? data.name.value : this.name, + identityKey: + data.identityKey.present ? data.identityKey.value : this.identityKey, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SignalIdentityKeyStoresData(') + ..write('deviceId: $deviceId, ') + ..write('name: $name, ') + ..write('identityKey: $identityKey, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + deviceId, name, $driftBlobEquality.hash(identityKey), createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SignalIdentityKeyStoresData && + other.deviceId == this.deviceId && + other.name == this.name && + $driftBlobEquality.equals(other.identityKey, this.identityKey) && + other.createdAt == this.createdAt); +} + +class SignalIdentityKeyStoresCompanion + extends UpdateCompanion { + final Value deviceId; + final Value name; + final Value identityKey; + final Value createdAt; + final Value rowid; + const SignalIdentityKeyStoresCompanion({ + this.deviceId = const Value.absent(), + this.name = const Value.absent(), + this.identityKey = const Value.absent(), + this.createdAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + SignalIdentityKeyStoresCompanion.insert({ + required int deviceId, + required String name, + required Uint8List identityKey, + this.createdAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : deviceId = Value(deviceId), + name = Value(name), + identityKey = Value(identityKey); + static Insertable custom({ + Expression? deviceId, + Expression? name, + Expression? identityKey, + Expression? createdAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (deviceId != null) 'device_id': deviceId, + if (name != null) 'name': name, + if (identityKey != null) 'identity_key': identityKey, + if (createdAt != null) 'created_at': createdAt, + if (rowid != null) 'rowid': rowid, + }); + } + + SignalIdentityKeyStoresCompanion copyWith( + {Value? deviceId, + Value? name, + Value? identityKey, + Value? createdAt, + Value? rowid}) { + return SignalIdentityKeyStoresCompanion( + deviceId: deviceId ?? this.deviceId, + name: name ?? this.name, + identityKey: identityKey ?? this.identityKey, + createdAt: createdAt ?? this.createdAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (deviceId.present) { + map['device_id'] = Variable(deviceId.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (identityKey.present) { + map['identity_key'] = Variable(identityKey.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SignalIdentityKeyStoresCompanion(') + ..write('deviceId: $deviceId, ') + ..write('name: $name, ') + ..write('identityKey: $identityKey, ') + ..write('createdAt: $createdAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class SignalPreKeyStores extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SignalPreKeyStores(this.attachedDatabase, [this._alias]); + late final GeneratedColumn preKeyId = GeneratedColumn( + 'pre_key_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: false); + late final GeneratedColumn preKey = GeneratedColumn( + 'pre_key', aliasedName, false, + type: DriftSqlType.blob, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression( + 'CAST(strftime(\'%s\', CURRENT_TIMESTAMP) AS INTEGER)')); + @override + List get $columns => [preKeyId, preKey, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'signal_pre_key_stores'; + @override + Set get $primaryKey => {preKeyId}; + @override + SignalPreKeyStoresData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SignalPreKeyStoresData( + preKeyId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}pre_key_id'])!, + preKey: attachedDatabase.typeMapping + .read(DriftSqlType.blob, data['${effectivePrefix}pre_key'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SignalPreKeyStores createAlias(String alias) { + return SignalPreKeyStores(attachedDatabase, alias); + } +} + +class SignalPreKeyStoresData extends DataClass + implements Insertable { + final int preKeyId; + final Uint8List preKey; + final DateTime createdAt; + const SignalPreKeyStoresData( + {required this.preKeyId, required this.preKey, required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['pre_key_id'] = Variable(preKeyId); + map['pre_key'] = Variable(preKey); + map['created_at'] = Variable(createdAt); + return map; + } + + SignalPreKeyStoresCompanion toCompanion(bool nullToAbsent) { + return SignalPreKeyStoresCompanion( + preKeyId: Value(preKeyId), + preKey: Value(preKey), + createdAt: Value(createdAt), + ); + } + + factory SignalPreKeyStoresData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SignalPreKeyStoresData( + preKeyId: serializer.fromJson(json['preKeyId']), + preKey: serializer.fromJson(json['preKey']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'preKeyId': serializer.toJson(preKeyId), + 'preKey': serializer.toJson(preKey), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SignalPreKeyStoresData copyWith( + {int? preKeyId, Uint8List? preKey, DateTime? createdAt}) => + SignalPreKeyStoresData( + preKeyId: preKeyId ?? this.preKeyId, + preKey: preKey ?? this.preKey, + createdAt: createdAt ?? this.createdAt, + ); + SignalPreKeyStoresData copyWithCompanion(SignalPreKeyStoresCompanion data) { + return SignalPreKeyStoresData( + preKeyId: data.preKeyId.present ? data.preKeyId.value : this.preKeyId, + preKey: data.preKey.present ? data.preKey.value : this.preKey, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SignalPreKeyStoresData(') + ..write('preKeyId: $preKeyId, ') + ..write('preKey: $preKey, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(preKeyId, $driftBlobEquality.hash(preKey), createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SignalPreKeyStoresData && + other.preKeyId == this.preKeyId && + $driftBlobEquality.equals(other.preKey, this.preKey) && + other.createdAt == this.createdAt); +} + +class SignalPreKeyStoresCompanion + extends UpdateCompanion { + final Value preKeyId; + final Value preKey; + final Value createdAt; + const SignalPreKeyStoresCompanion({ + this.preKeyId = const Value.absent(), + this.preKey = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SignalPreKeyStoresCompanion.insert({ + this.preKeyId = const Value.absent(), + required Uint8List preKey, + this.createdAt = const Value.absent(), + }) : preKey = Value(preKey); + static Insertable custom({ + Expression? preKeyId, + Expression? preKey, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (preKeyId != null) 'pre_key_id': preKeyId, + if (preKey != null) 'pre_key': preKey, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SignalPreKeyStoresCompanion copyWith( + {Value? preKeyId, + Value? preKey, + Value? createdAt}) { + return SignalPreKeyStoresCompanion( + preKeyId: preKeyId ?? this.preKeyId, + preKey: preKey ?? this.preKey, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (preKeyId.present) { + map['pre_key_id'] = Variable(preKeyId.value); + } + if (preKey.present) { + map['pre_key'] = Variable(preKey.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SignalPreKeyStoresCompanion(') + ..write('preKeyId: $preKeyId, ') + ..write('preKey: $preKey, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class SignalSenderKeyStores extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SignalSenderKeyStores(this.attachedDatabase, [this._alias]); + late final GeneratedColumn senderKeyName = GeneratedColumn( + 'sender_key_name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn senderKey = GeneratedColumn( + 'sender_key', aliasedName, false, + type: DriftSqlType.blob, requiredDuringInsert: true); + @override + List get $columns => [senderKeyName, senderKey]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'signal_sender_key_stores'; + @override + Set get $primaryKey => {senderKeyName}; + @override + SignalSenderKeyStoresData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SignalSenderKeyStoresData( + senderKeyName: attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}sender_key_name'])!, + senderKey: attachedDatabase.typeMapping + .read(DriftSqlType.blob, data['${effectivePrefix}sender_key'])!, + ); + } + + @override + SignalSenderKeyStores createAlias(String alias) { + return SignalSenderKeyStores(attachedDatabase, alias); + } +} + +class SignalSenderKeyStoresData extends DataClass + implements Insertable { + final String senderKeyName; + final Uint8List senderKey; + const SignalSenderKeyStoresData( + {required this.senderKeyName, required this.senderKey}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['sender_key_name'] = Variable(senderKeyName); + map['sender_key'] = Variable(senderKey); + return map; + } + + SignalSenderKeyStoresCompanion toCompanion(bool nullToAbsent) { + return SignalSenderKeyStoresCompanion( + senderKeyName: Value(senderKeyName), + senderKey: Value(senderKey), + ); + } + + factory SignalSenderKeyStoresData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SignalSenderKeyStoresData( + senderKeyName: serializer.fromJson(json['senderKeyName']), + senderKey: serializer.fromJson(json['senderKey']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'senderKeyName': serializer.toJson(senderKeyName), + 'senderKey': serializer.toJson(senderKey), + }; + } + + SignalSenderKeyStoresData copyWith( + {String? senderKeyName, Uint8List? senderKey}) => + SignalSenderKeyStoresData( + senderKeyName: senderKeyName ?? this.senderKeyName, + senderKey: senderKey ?? this.senderKey, + ); + SignalSenderKeyStoresData copyWithCompanion( + SignalSenderKeyStoresCompanion data) { + return SignalSenderKeyStoresData( + senderKeyName: data.senderKeyName.present + ? data.senderKeyName.value + : this.senderKeyName, + senderKey: data.senderKey.present ? data.senderKey.value : this.senderKey, + ); + } + + @override + String toString() { + return (StringBuffer('SignalSenderKeyStoresData(') + ..write('senderKeyName: $senderKeyName, ') + ..write('senderKey: $senderKey') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(senderKeyName, $driftBlobEquality.hash(senderKey)); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SignalSenderKeyStoresData && + other.senderKeyName == this.senderKeyName && + $driftBlobEquality.equals(other.senderKey, this.senderKey)); +} + +class SignalSenderKeyStoresCompanion + extends UpdateCompanion { + final Value senderKeyName; + final Value senderKey; + final Value rowid; + const SignalSenderKeyStoresCompanion({ + this.senderKeyName = const Value.absent(), + this.senderKey = const Value.absent(), + this.rowid = const Value.absent(), + }); + SignalSenderKeyStoresCompanion.insert({ + required String senderKeyName, + required Uint8List senderKey, + this.rowid = const Value.absent(), + }) : senderKeyName = Value(senderKeyName), + senderKey = Value(senderKey); + static Insertable custom({ + Expression? senderKeyName, + Expression? senderKey, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (senderKeyName != null) 'sender_key_name': senderKeyName, + if (senderKey != null) 'sender_key': senderKey, + if (rowid != null) 'rowid': rowid, + }); + } + + SignalSenderKeyStoresCompanion copyWith( + {Value? senderKeyName, + Value? senderKey, + Value? rowid}) { + return SignalSenderKeyStoresCompanion( + senderKeyName: senderKeyName ?? this.senderKeyName, + senderKey: senderKey ?? this.senderKey, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (senderKeyName.present) { + map['sender_key_name'] = Variable(senderKeyName.value); + } + if (senderKey.present) { + map['sender_key'] = Variable(senderKey.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SignalSenderKeyStoresCompanion(') + ..write('senderKeyName: $senderKeyName, ') + ..write('senderKey: $senderKey, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class SignalSessionStores extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SignalSessionStores(this.attachedDatabase, [this._alias]); + late final GeneratedColumn deviceId = GeneratedColumn( + 'device_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn name = GeneratedColumn( + 'name', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn sessionRecord = + GeneratedColumn('session_record', aliasedName, false, + type: DriftSqlType.blob, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: const CustomExpression( + 'CAST(strftime(\'%s\', CURRENT_TIMESTAMP) AS INTEGER)')); + @override + List get $columns => + [deviceId, name, sessionRecord, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'signal_session_stores'; + @override + Set get $primaryKey => {deviceId, name}; + @override + SignalSessionStoresData map(Map data, + {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SignalSessionStoresData( + deviceId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}device_id'])!, + name: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}name'])!, + sessionRecord: attachedDatabase.typeMapping + .read(DriftSqlType.blob, data['${effectivePrefix}session_record'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SignalSessionStores createAlias(String alias) { + return SignalSessionStores(attachedDatabase, alias); + } +} + +class SignalSessionStoresData extends DataClass + implements Insertable { + final int deviceId; + final String name; + final Uint8List sessionRecord; + final DateTime createdAt; + const SignalSessionStoresData( + {required this.deviceId, + required this.name, + required this.sessionRecord, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['device_id'] = Variable(deviceId); + map['name'] = Variable(name); + map['session_record'] = Variable(sessionRecord); + map['created_at'] = Variable(createdAt); + return map; + } + + SignalSessionStoresCompanion toCompanion(bool nullToAbsent) { + return SignalSessionStoresCompanion( + deviceId: Value(deviceId), + name: Value(name), + sessionRecord: Value(sessionRecord), + createdAt: Value(createdAt), + ); + } + + factory SignalSessionStoresData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SignalSessionStoresData( + deviceId: serializer.fromJson(json['deviceId']), + name: serializer.fromJson(json['name']), + sessionRecord: serializer.fromJson(json['sessionRecord']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'deviceId': serializer.toJson(deviceId), + 'name': serializer.toJson(name), + 'sessionRecord': serializer.toJson(sessionRecord), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SignalSessionStoresData copyWith( + {int? deviceId, + String? name, + Uint8List? sessionRecord, + DateTime? createdAt}) => + SignalSessionStoresData( + deviceId: deviceId ?? this.deviceId, + name: name ?? this.name, + sessionRecord: sessionRecord ?? this.sessionRecord, + createdAt: createdAt ?? this.createdAt, + ); + SignalSessionStoresData copyWithCompanion(SignalSessionStoresCompanion data) { + return SignalSessionStoresData( + deviceId: data.deviceId.present ? data.deviceId.value : this.deviceId, + name: data.name.present ? data.name.value : this.name, + sessionRecord: data.sessionRecord.present + ? data.sessionRecord.value + : this.sessionRecord, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SignalSessionStoresData(') + ..write('deviceId: $deviceId, ') + ..write('name: $name, ') + ..write('sessionRecord: $sessionRecord, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + deviceId, name, $driftBlobEquality.hash(sessionRecord), createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SignalSessionStoresData && + other.deviceId == this.deviceId && + other.name == this.name && + $driftBlobEquality.equals(other.sessionRecord, this.sessionRecord) && + other.createdAt == this.createdAt); +} + +class SignalSessionStoresCompanion + extends UpdateCompanion { + final Value deviceId; + final Value name; + final Value sessionRecord; + final Value createdAt; + final Value rowid; + const SignalSessionStoresCompanion({ + this.deviceId = const Value.absent(), + this.name = const Value.absent(), + this.sessionRecord = const Value.absent(), + this.createdAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + SignalSessionStoresCompanion.insert({ + required int deviceId, + required String name, + required Uint8List sessionRecord, + this.createdAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : deviceId = Value(deviceId), + name = Value(name), + sessionRecord = Value(sessionRecord); + static Insertable custom({ + Expression? deviceId, + Expression? name, + Expression? sessionRecord, + Expression? createdAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (deviceId != null) 'device_id': deviceId, + if (name != null) 'name': name, + if (sessionRecord != null) 'session_record': sessionRecord, + if (createdAt != null) 'created_at': createdAt, + if (rowid != null) 'rowid': rowid, + }); + } + + SignalSessionStoresCompanion copyWith( + {Value? deviceId, + Value? name, + Value? sessionRecord, + Value? createdAt, + Value? rowid}) { + return SignalSessionStoresCompanion( + deviceId: deviceId ?? this.deviceId, + name: name ?? this.name, + sessionRecord: sessionRecord ?? this.sessionRecord, + createdAt: createdAt ?? this.createdAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (deviceId.present) { + map['device_id'] = Variable(deviceId.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (sessionRecord.present) { + map['session_record'] = Variable(sessionRecord.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SignalSessionStoresCompanion(') + ..write('deviceId: $deviceId, ') + ..write('name: $name, ') + ..write('sessionRecord: $sessionRecord, ') + ..write('createdAt: $createdAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV9 extends GeneratedDatabase { + DatabaseAtV9(QueryExecutor e) : super(e); + late final Contacts contacts = Contacts(this); + late final Messages messages = Messages(this); + late final MediaUploads mediaUploads = MediaUploads(this); + late final MediaDownloads mediaDownloads = MediaDownloads(this); + late final SignalIdentityKeyStores signalIdentityKeyStores = + SignalIdentityKeyStores(this); + late final SignalPreKeyStores signalPreKeyStores = SignalPreKeyStores(this); + late final SignalSenderKeyStores signalSenderKeyStores = + SignalSenderKeyStores(this); + late final SignalSessionStores signalSessionStores = + SignalSessionStores(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + contacts, + messages, + mediaUploads, + mediaDownloads, + signalIdentityKeyStores, + signalPreKeyStores, + signalSenderKeyStores, + signalSessionStores + ]; + @override + int get schemaVersion => 9; +}