diff --git a/lib/src/database/daos/groups.dao.dart b/lib/src/database/daos/groups.dao.dart index b5c741d..4f76cc7 100644 --- a/lib/src/database/daos/groups.dao.dart +++ b/lib/src/database/daos/groups.dao.dart @@ -162,6 +162,8 @@ class GroupsDao extends DatabaseAccessor with _$GroupsDaoMixin { final totalMediaCounter = group.totalMediaCounter + 1; var flameCounter = group.flameCounter; + var maxFlameCounter = group.maxFlameCounter; + var maxFlameCounterFrom = group.maxFlameCounterFrom; if (group.lastMessageReceived != null && group.lastMessageSend != null) { final now = DateTime.now(); @@ -198,6 +200,10 @@ class GroupsDao extends DatabaseAccessor with _$GroupsDaoMixin { if (updateFlame) { flameCounter += 1; lastFlameCounterChange = Value(timestamp); + if (flameCounter > maxFlameCounter) { + maxFlameCounter = flameCounter; + maxFlameCounterFrom = DateTime.now(); + } } } } else { @@ -218,6 +224,8 @@ class GroupsDao extends DatabaseAccessor with _$GroupsDaoMixin { lastMessageReceived: lastMessageReceived, lastMessageSend: lastMessageSend, flameCounter: Value(flameCounter), + maxFlameCounter: Value(maxFlameCounter), + maxFlameCounterFrom: Value(maxFlameCounterFrom), ), ); } diff --git a/lib/src/database/tables/groups.table.dart b/lib/src/database/tables/groups.table.dart index 9bbac87..708622c 100644 --- a/lib/src/database/tables/groups.table.dart +++ b/lib/src/database/tables/groups.table.dart @@ -29,6 +29,9 @@ class Groups extends Table { IntColumn get flameCounter => integer().withDefault(const Constant(0))(); + IntColumn get maxFlameCounter => integer().withDefault(const Constant(0))(); + DateTimeColumn get maxFlameCounterFrom => dateTime().nullable()(); + DateTimeColumn get lastMessageExchange => dateTime().withDefault(currentDateAndTime)(); diff --git a/lib/src/database/twonly.db.g.dart b/lib/src/database/twonly.db.g.dart index cfe85e9..57b9870 100644 --- a/lib/src/database/twonly.db.g.dart +++ b/lib/src/database/twonly.db.g.dart @@ -775,6 +775,20 @@ class $GroupsTable extends Groups with TableInfo<$GroupsTable, Group> { type: DriftSqlType.int, requiredDuringInsert: false, defaultValue: const Constant(0)); + static const VerificationMeta _maxFlameCounterMeta = + const VerificationMeta('maxFlameCounter'); + @override + late final GeneratedColumn maxFlameCounter = GeneratedColumn( + 'max_flame_counter', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(0)); + static const VerificationMeta _maxFlameCounterFromMeta = + const VerificationMeta('maxFlameCounterFrom'); + @override + late final GeneratedColumn maxFlameCounterFrom = + GeneratedColumn('max_flame_counter_from', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); static const VerificationMeta _lastMessageExchangeMeta = const VerificationMeta('lastMessageExchange'); @override @@ -800,6 +814,8 @@ class $GroupsTable extends Groups with TableInfo<$GroupsTable, Group> { lastFlameCounterChange, lastFlameSync, flameCounter, + maxFlameCounter, + maxFlameCounterFrom, lastMessageExchange ]; @override @@ -901,6 +917,18 @@ class $GroupsTable extends Groups with TableInfo<$GroupsTable, Group> { flameCounter.isAcceptableOrUnknown( data['flame_counter']!, _flameCounterMeta)); } + if (data.containsKey('max_flame_counter')) { + context.handle( + _maxFlameCounterMeta, + maxFlameCounter.isAcceptableOrUnknown( + data['max_flame_counter']!, _maxFlameCounterMeta)); + } + if (data.containsKey('max_flame_counter_from')) { + context.handle( + _maxFlameCounterFromMeta, + maxFlameCounterFrom.isAcceptableOrUnknown( + data['max_flame_counter_from']!, _maxFlameCounterFromMeta)); + } if (data.containsKey('last_message_exchange')) { context.handle( _lastMessageExchangeMeta, @@ -949,6 +977,11 @@ class $GroupsTable extends Groups with TableInfo<$GroupsTable, Group> { DriftSqlType.dateTime, data['${effectivePrefix}last_flame_sync']), flameCounter: attachedDatabase.typeMapping .read(DriftSqlType.int, data['${effectivePrefix}flame_counter'])!, + maxFlameCounter: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}max_flame_counter'])!, + maxFlameCounterFrom: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}max_flame_counter_from']), lastMessageExchange: attachedDatabase.typeMapping.read( DriftSqlType.dateTime, data['${effectivePrefix}last_message_exchange'])!, @@ -977,6 +1010,8 @@ class Group extends DataClass implements Insertable { final DateTime? lastFlameCounterChange; final DateTime? lastFlameSync; final int flameCounter; + final int maxFlameCounter; + final DateTime? maxFlameCounterFrom; final DateTime lastMessageExchange; const Group( {required this.groupId, @@ -994,6 +1029,8 @@ class Group extends DataClass implements Insertable { this.lastFlameCounterChange, this.lastFlameSync, required this.flameCounter, + required this.maxFlameCounter, + this.maxFlameCounterFrom, required this.lastMessageExchange}); @override Map toColumns(bool nullToAbsent) { @@ -1023,6 +1060,10 @@ class Group extends DataClass implements Insertable { map['last_flame_sync'] = Variable(lastFlameSync); } map['flame_counter'] = Variable(flameCounter); + map['max_flame_counter'] = Variable(maxFlameCounter); + if (!nullToAbsent || maxFlameCounterFrom != null) { + map['max_flame_counter_from'] = Variable(maxFlameCounterFrom); + } map['last_message_exchange'] = Variable(lastMessageExchange); return map; } @@ -1052,6 +1093,10 @@ class Group extends DataClass implements Insertable { ? const Value.absent() : Value(lastFlameSync), flameCounter: Value(flameCounter), + maxFlameCounter: Value(maxFlameCounter), + maxFlameCounterFrom: maxFlameCounterFrom == null && nullToAbsent + ? const Value.absent() + : Value(maxFlameCounterFrom), lastMessageExchange: Value(lastMessageExchange), ); } @@ -1078,6 +1123,9 @@ class Group extends DataClass implements Insertable { serializer.fromJson(json['lastFlameCounterChange']), lastFlameSync: serializer.fromJson(json['lastFlameSync']), flameCounter: serializer.fromJson(json['flameCounter']), + maxFlameCounter: serializer.fromJson(json['maxFlameCounter']), + maxFlameCounterFrom: + serializer.fromJson(json['maxFlameCounterFrom']), lastMessageExchange: serializer.fromJson(json['lastMessageExchange']), ); @@ -1103,6 +1151,8 @@ class Group extends DataClass implements Insertable { serializer.toJson(lastFlameCounterChange), 'lastFlameSync': serializer.toJson(lastFlameSync), 'flameCounter': serializer.toJson(flameCounter), + 'maxFlameCounter': serializer.toJson(maxFlameCounter), + 'maxFlameCounterFrom': serializer.toJson(maxFlameCounterFrom), 'lastMessageExchange': serializer.toJson(lastMessageExchange), }; } @@ -1123,6 +1173,8 @@ class Group extends DataClass implements Insertable { Value lastFlameCounterChange = const Value.absent(), Value lastFlameSync = const Value.absent(), int? flameCounter, + int? maxFlameCounter, + Value maxFlameCounterFrom = const Value.absent(), DateTime? lastMessageExchange}) => Group( groupId: groupId ?? this.groupId, @@ -1148,6 +1200,10 @@ class Group extends DataClass implements Insertable { lastFlameSync: lastFlameSync.present ? lastFlameSync.value : this.lastFlameSync, flameCounter: flameCounter ?? this.flameCounter, + maxFlameCounter: maxFlameCounter ?? this.maxFlameCounter, + maxFlameCounterFrom: maxFlameCounterFrom.present + ? maxFlameCounterFrom.value + : this.maxFlameCounterFrom, lastMessageExchange: lastMessageExchange ?? this.lastMessageExchange, ); Group copyWithCompanion(GroupsCompanion data) { @@ -1188,6 +1244,12 @@ class Group extends DataClass implements Insertable { flameCounter: data.flameCounter.present ? data.flameCounter.value : this.flameCounter, + maxFlameCounter: data.maxFlameCounter.present + ? data.maxFlameCounter.value + : this.maxFlameCounter, + maxFlameCounterFrom: data.maxFlameCounterFrom.present + ? data.maxFlameCounterFrom.value + : this.maxFlameCounterFrom, lastMessageExchange: data.lastMessageExchange.present ? data.lastMessageExchange.value : this.lastMessageExchange, @@ -1213,6 +1275,8 @@ class Group extends DataClass implements Insertable { ..write('lastFlameCounterChange: $lastFlameCounterChange, ') ..write('lastFlameSync: $lastFlameSync, ') ..write('flameCounter: $flameCounter, ') + ..write('maxFlameCounter: $maxFlameCounter, ') + ..write('maxFlameCounterFrom: $maxFlameCounterFrom, ') ..write('lastMessageExchange: $lastMessageExchange') ..write(')')) .toString(); @@ -1235,6 +1299,8 @@ class Group extends DataClass implements Insertable { lastFlameCounterChange, lastFlameSync, flameCounter, + maxFlameCounter, + maxFlameCounterFrom, lastMessageExchange); @override bool operator ==(Object other) => @@ -1256,6 +1322,8 @@ class Group extends DataClass implements Insertable { other.lastFlameCounterChange == this.lastFlameCounterChange && other.lastFlameSync == this.lastFlameSync && other.flameCounter == this.flameCounter && + other.maxFlameCounter == this.maxFlameCounter && + other.maxFlameCounterFrom == this.maxFlameCounterFrom && other.lastMessageExchange == this.lastMessageExchange); } @@ -1275,6 +1343,8 @@ class GroupsCompanion extends UpdateCompanion { final Value lastFlameCounterChange; final Value lastFlameSync; final Value flameCounter; + final Value maxFlameCounter; + final Value maxFlameCounterFrom; final Value lastMessageExchange; final Value rowid; const GroupsCompanion({ @@ -1293,6 +1363,8 @@ class GroupsCompanion extends UpdateCompanion { this.lastFlameCounterChange = const Value.absent(), this.lastFlameSync = const Value.absent(), this.flameCounter = const Value.absent(), + this.maxFlameCounter = const Value.absent(), + this.maxFlameCounterFrom = const Value.absent(), this.lastMessageExchange = const Value.absent(), this.rowid = const Value.absent(), }); @@ -1312,6 +1384,8 @@ class GroupsCompanion extends UpdateCompanion { this.lastFlameCounterChange = const Value.absent(), this.lastFlameSync = const Value.absent(), this.flameCounter = const Value.absent(), + this.maxFlameCounter = const Value.absent(), + this.maxFlameCounterFrom = const Value.absent(), this.lastMessageExchange = const Value.absent(), this.rowid = const Value.absent(), }) : groupId = Value(groupId), @@ -1334,6 +1408,8 @@ class GroupsCompanion extends UpdateCompanion { Expression? lastFlameCounterChange, Expression? lastFlameSync, Expression? flameCounter, + Expression? maxFlameCounter, + Expression? maxFlameCounterFrom, Expression? lastMessageExchange, Expression? rowid, }) { @@ -1356,6 +1432,9 @@ class GroupsCompanion extends UpdateCompanion { 'last_flame_counter_change': lastFlameCounterChange, if (lastFlameSync != null) 'last_flame_sync': lastFlameSync, if (flameCounter != null) 'flame_counter': flameCounter, + if (maxFlameCounter != null) 'max_flame_counter': maxFlameCounter, + if (maxFlameCounterFrom != null) + 'max_flame_counter_from': maxFlameCounterFrom, if (lastMessageExchange != null) 'last_message_exchange': lastMessageExchange, if (rowid != null) 'rowid': rowid, @@ -1378,6 +1457,8 @@ class GroupsCompanion extends UpdateCompanion { Value? lastFlameCounterChange, Value? lastFlameSync, Value? flameCounter, + Value? maxFlameCounter, + Value? maxFlameCounterFrom, Value? lastMessageExchange, Value? rowid}) { return GroupsCompanion( @@ -1398,6 +1479,8 @@ class GroupsCompanion extends UpdateCompanion { lastFlameCounterChange ?? this.lastFlameCounterChange, lastFlameSync: lastFlameSync ?? this.lastFlameSync, flameCounter: flameCounter ?? this.flameCounter, + maxFlameCounter: maxFlameCounter ?? this.maxFlameCounter, + maxFlameCounterFrom: maxFlameCounterFrom ?? this.maxFlameCounterFrom, lastMessageExchange: lastMessageExchange ?? this.lastMessageExchange, rowid: rowid ?? this.rowid, ); @@ -1454,6 +1537,13 @@ class GroupsCompanion extends UpdateCompanion { if (flameCounter.present) { map['flame_counter'] = Variable(flameCounter.value); } + if (maxFlameCounter.present) { + map['max_flame_counter'] = Variable(maxFlameCounter.value); + } + if (maxFlameCounterFrom.present) { + map['max_flame_counter_from'] = + Variable(maxFlameCounterFrom.value); + } if (lastMessageExchange.present) { map['last_message_exchange'] = Variable(lastMessageExchange.value); @@ -1483,6 +1573,8 @@ class GroupsCompanion extends UpdateCompanion { ..write('lastFlameCounterChange: $lastFlameCounterChange, ') ..write('lastFlameSync: $lastFlameSync, ') ..write('flameCounter: $flameCounter, ') + ..write('maxFlameCounter: $maxFlameCounter, ') + ..write('maxFlameCounterFrom: $maxFlameCounterFrom, ') ..write('lastMessageExchange: $lastMessageExchange, ') ..write('rowid: $rowid') ..write(')')) @@ -7414,6 +7506,8 @@ typedef $$GroupsTableCreateCompanionBuilder = GroupsCompanion Function({ Value lastFlameCounterChange, Value lastFlameSync, Value flameCounter, + Value maxFlameCounter, + Value maxFlameCounterFrom, Value lastMessageExchange, Value rowid, }); @@ -7433,6 +7527,8 @@ typedef $$GroupsTableUpdateCompanionBuilder = GroupsCompanion Function({ Value lastFlameCounterChange, Value lastFlameSync, Value flameCounter, + Value maxFlameCounter, + Value maxFlameCounterFrom, Value lastMessageExchange, Value rowid, }); @@ -7516,6 +7612,14 @@ class $$GroupsTableFilterComposer extends Composer<_$TwonlyDB, $GroupsTable> { ColumnFilters get flameCounter => $composableBuilder( column: $table.flameCounter, builder: (column) => ColumnFilters(column)); + ColumnFilters get maxFlameCounter => $composableBuilder( + column: $table.maxFlameCounter, + builder: (column) => ColumnFilters(column)); + + ColumnFilters get maxFlameCounterFrom => $composableBuilder( + column: $table.maxFlameCounterFrom, + builder: (column) => ColumnFilters(column)); + ColumnFilters get lastMessageExchange => $composableBuilder( column: $table.lastMessageExchange, builder: (column) => ColumnFilters(column)); @@ -7606,6 +7710,14 @@ class $$GroupsTableOrderingComposer extends Composer<_$TwonlyDB, $GroupsTable> { column: $table.flameCounter, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get maxFlameCounter => $composableBuilder( + column: $table.maxFlameCounter, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get maxFlameCounterFrom => $composableBuilder( + column: $table.maxFlameCounterFrom, + builder: (column) => ColumnOrderings(column)); + ColumnOrderings get lastMessageExchange => $composableBuilder( column: $table.lastMessageExchange, builder: (column) => ColumnOrderings(column)); @@ -7667,6 +7779,12 @@ class $$GroupsTableAnnotationComposer GeneratedColumn get flameCounter => $composableBuilder( column: $table.flameCounter, builder: (column) => column); + GeneratedColumn get maxFlameCounter => $composableBuilder( + column: $table.maxFlameCounter, builder: (column) => column); + + GeneratedColumn get maxFlameCounterFrom => $composableBuilder( + column: $table.maxFlameCounterFrom, builder: (column) => column); + GeneratedColumn get lastMessageExchange => $composableBuilder( column: $table.lastMessageExchange, builder: (column) => column); @@ -7730,6 +7848,8 @@ class $$GroupsTableTableManager extends RootTableManager< Value lastFlameCounterChange = const Value.absent(), Value lastFlameSync = const Value.absent(), Value flameCounter = const Value.absent(), + Value maxFlameCounter = const Value.absent(), + Value maxFlameCounterFrom = const Value.absent(), Value lastMessageExchange = const Value.absent(), Value rowid = const Value.absent(), }) => @@ -7749,6 +7869,8 @@ class $$GroupsTableTableManager extends RootTableManager< lastFlameCounterChange: lastFlameCounterChange, lastFlameSync: lastFlameSync, flameCounter: flameCounter, + maxFlameCounter: maxFlameCounter, + maxFlameCounterFrom: maxFlameCounterFrom, lastMessageExchange: lastMessageExchange, rowid: rowid, ), @@ -7768,6 +7890,8 @@ class $$GroupsTableTableManager extends RootTableManager< Value lastFlameCounterChange = const Value.absent(), Value lastFlameSync = const Value.absent(), Value flameCounter = const Value.absent(), + Value maxFlameCounter = const Value.absent(), + Value maxFlameCounterFrom = const Value.absent(), Value lastMessageExchange = const Value.absent(), Value rowid = const Value.absent(), }) => @@ -7787,6 +7911,8 @@ class $$GroupsTableTableManager extends RootTableManager< lastFlameCounterChange: lastFlameCounterChange, lastFlameSync: lastFlameSync, flameCounter: flameCounter, + maxFlameCounter: maxFlameCounter, + maxFlameCounterFrom: maxFlameCounterFrom, lastMessageExchange: lastMessageExchange, rowid: rowid, ), diff --git a/lib/src/model/protobuf/client/messages.proto b/lib/src/model/protobuf/client/messages.proto index 57760f5..29dc4e1 100644 --- a/lib/src/model/protobuf/client/messages.proto +++ b/lib/src/model/protobuf/client/messages.proto @@ -68,6 +68,7 @@ message EncryptedContent { optional int64 removedUser = 2; optional int64 groupName = 3; optional int64 deleteMessagesAfterMilliseconds = 4; + bytes stateKey = 5; } message TextMessage { diff --git a/lib/src/services/fcm.service.dart b/lib/src/services/fcm.service.dart index 899936f..33ffaa8 100644 --- a/lib/src/services/fcm.service.dart +++ b/lib/src/services/fcm.service.dart @@ -81,10 +81,18 @@ Future handleRemoteMessage(RemoteMessage message) async { if (!Platform.isAndroid) { Log.error('Got message in Dart while on iOS'); } + if (message.notification != null && globalIsAppInBackground) { + Log.error( + 'Got notification but app is in background, so the SDK already have shown the message.', + ); + return; + } - if (message.notification != null) { - final title = message.notification!.title ?? ''; - final body = message.notification!.body ?? ''; + if (message.notification != null || message.data['title'] != null) { + final title = + message.notification?.title ?? message.data['title'] as String? ?? ''; + final body = + message.notification?.body ?? message.data['body'] as String? ?? ''; await customLocalPushNotification(title, body); } else if (message.data['push_data'] != null) { await handlePushData(message.data['push_data'] as String); diff --git a/lib/src/services/notifications/background.notifications.dart b/lib/src/services/notifications/background.notifications.dart index 360a375..be510f0 100644 --- a/lib/src/services/notifications/background.notifications.dart +++ b/lib/src/services/notifications/background.notifications.dart @@ -16,16 +16,17 @@ final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); Future customLocalPushNotification(String title, String msg) async { - const androidNotificationDetails = AndroidNotificationDetails( + final androidNotificationDetails = AndroidNotificationDetails( '1', 'System', channelDescription: 'System messages.', importance: Importance.max, priority: Priority.max, + styleInformation: BigTextStyleInformation(msg), ); const darwinNotificationDetails = DarwinNotificationDetails(); - const notificationDetails = NotificationDetails( + final notificationDetails = NotificationDetails( android: androidNotificationDetails, iOS: darwinNotificationDetails, );