diff --git a/lib/src/database/contacts_db.dart b/lib/src/database/contacts_db.dart index 1899212..9418555 100644 --- a/lib/src/database/contacts_db.dart +++ b/lib/src/database/contacts_db.dart @@ -44,9 +44,9 @@ int getFlameCounterFromContact(Contact contact) { final now = DateTime.now(); final startOfToday = DateTime(now.year, now.month, now.day); final twoDaysAgo = startOfToday.subtract(Duration(days: 2)); - if (contact.lastMessageSend!.isBefore(twoDaysAgo) && - contact.lastMessageReceived!.isBefore(twoDaysAgo)) { - return contact.flameCounter; + if (contact.lastMessageSend!.isAfter(twoDaysAgo) && + contact.lastMessageReceived!.isAfter(twoDaysAgo)) { + return contact.flameCounter + 1; } else { return 0; } diff --git a/lib/src/database/database.dart b/lib/src/database/database.dart index f8c23fe..6e86ca6 100644 --- a/lib/src/database/database.dart +++ b/lib/src/database/database.dart @@ -135,17 +135,79 @@ class TwonlyDatabase extends _$TwonlyDatabase { } } - Future incTotalMediaCounter(int contactId) async { - return (update(contacts)..where((t) => t.userId.equals(contactId))) - .write(ContactsCompanion( - totalMediaCounter: Value( - (await (select(contacts)..where((t) => t.userId.equals(contactId))) - .get()) - .first - .totalMediaCounter + - 1, + Future incFlameCounter( + int contactId, bool received, DateTime timestamp) async { + Contact contact = (await (select(contacts) + ..where((t) => t.userId.equals(contactId))) + .get()) + .first; + + int totalMediaCounter = contact.totalMediaCounter + 1; + int flameCounter = contact.flameCounter; + + if (contact.lastMessageReceived != null && + contact.lastMessageSend != null) { + final now = DateTime.now(); + final startOfToday = DateTime(now.year, now.month, now.day); + final twoDaysAgo = startOfToday.subtract(Duration(days: 2)); + if (contact.lastMessageSend!.isBefore(twoDaysAgo) || + contact.lastMessageReceived!.isBefore(twoDaysAgo)) { + flameCounter = 0; + } + } + + Value lastMessageSend = Value.absent(); + Value lastMessageReceived = Value.absent(); + Value lastMessage = Value.absent(); + + if (contact.lastMessage != null) { + final now = DateTime.now(); + final startOfToday = DateTime(now.year, now.month, now.day); + + if (contact.lastMessage!.isBefore(startOfToday)) { + // last flame update was yesterday. check if it can be updated. + bool updateFlame = false; + if (received) { + if (contact.lastMessageSend!.isAfter(startOfToday)) { + // today a message was already send -> update flame + updateFlame = true; + } + } else if (contact.lastMessageReceived!.isAfter(startOfToday)) { + // today a message was already received -> update flame + updateFlame = true; + } + if (updateFlame) { + flameCounter += 1; + lastMessage = Value(timestamp); + } + } + } else { + // There where no message until no... + lastMessage = Value(timestamp); + } + + if (received) { + lastMessageReceived = Value(timestamp); + } else { + lastMessageSend = Value(timestamp); + } + + return (update(contacts)..where((t) => t.userId.equals(contactId))).write( + ContactsCompanion( + totalMediaCounter: Value(totalMediaCounter), + lastMessage: lastMessage, + lastMessageReceived: lastMessageReceived, + lastMessageSend: lastMessageSend, + flameCounter: Value(flameCounter), ), - )); + ); + + // twonlyDatabase.updateContact( + // fromUserId, + // ContactsCompanion( + // lastMessageReceived: Value(message.timestamp), + // ), + // ); } SingleOrNullSelectable getContactByUserId(int userId) { @@ -183,7 +245,7 @@ class TwonlyDatabase extends _$TwonlyDatabase { Stream> watchContactsForChatList() { return (select(contacts) ..where((t) => t.accepted.equals(true) & t.blocked.equals(false)) - ..orderBy([(t) => OrderingTerm.asc(t.lastMessage)])) + ..orderBy([(t) => OrderingTerm.desc(t.lastMessage)])) .watch(); } diff --git a/lib/src/providers/api/media.dart b/lib/src/providers/api/media.dart index 50e2602..eaded7a 100644 --- a/lib/src/providers/api/media.dart +++ b/lib/src/providers/api/media.dart @@ -163,12 +163,10 @@ class ImageUploader { final downloadToken = uploadState.downloadTokens.removeLast(); - twonlyDatabase.incTotalMediaCounter(targetUserId); - twonlyDatabase.updateContact( + twonlyDatabase.incFlameCounter( targetUserId, - ContactsCompanion( - lastMessageReceived: Value(metadata.messageSendAt), - ), + false, + metadata.messageSendAt, ); // Ensures the retransmit of the message diff --git a/lib/src/providers/api/server_messages.dart b/lib/src/providers/api/server_messages.dart index 7d1f068..6fefbf2 100644 --- a/lib/src/providers/api/server_messages.dart +++ b/lib/src/providers/api/server_messages.dart @@ -223,7 +223,7 @@ Future handleNewMessage(int fromUserId, Uint8List body) async { downloadState: Value(message.kind == MessageKind.media ? DownloadState.pending : DownloadState.downloaded), - sendAt: Value(message.timestamp.toUtc()), + sendAt: Value(message.timestamp), ); final messageId = await twonlyDatabase.insertMessage( @@ -246,15 +246,12 @@ Future handleNewMessage(int fromUserId, Uint8List body) async { ); if (message.kind == MessageKind.media) { - twonlyDatabase.updateContact( + twonlyDatabase.incFlameCounter( fromUserId, - ContactsCompanion( - lastMessageReceived: Value(message.timestamp), - ), + true, + message.timestamp, ); - twonlyDatabase.incTotalMediaCounter(fromUserId); - if (!globalIsAppInBackground) { final content = message.content; if (content is MediaMessageContent) { diff --git a/lib/src/utils/misc.dart b/lib/src/utils/misc.dart index 269bb8b..2528d66 100644 --- a/lib/src/utils/misc.dart +++ b/lib/src/utils/misc.dart @@ -162,62 +162,6 @@ Future getCompressedImage(Uint8List imageBytes) async { return result; } -// int getFlameCounter(List dates) { -// if (dates.isEmpty) return 0; - -// int flamesCount = 0; -// DateTime lastFlameCount = DateTime.now(); - -// if (calculateTimeDifference(dates[0], lastFlameCount).inDays == 0) { -// flamesCount = 1; -// lastFlameCount = dates[0]; -// } - -// // print(dates[0]); -// for (int i = 1; i < dates.length; i++) { -// // print( -// // "${dates[i]} ${dates[i].difference(dates[i - 1]).inDays} ${dates[i].difference(lastFlameCount).inDays}"); -// if (calculateTimeDifference(dates[i], dates[i - 1]).inDays == 0) { -// if (lastFlameCount.difference(dates[i]).inDays == 1) { -// flamesCount++; -// lastFlameCount = dates[i]; -// } -// } else { -// break; // Stop counting if there's a break in the sequence -// } -// } -// return flamesCount; -// } - -// Future getFlamesForOtherUser(int otherUserId) async { -// List<(DateTime, int?)> dates = await DbMessages.getMessageDates(otherUserId); -// // print("Dates ${dates.length}"); -// if (dates.isEmpty) return 0; - -// List received = -// dates.where((x) => x.$2 != null).map((x) => x.$1).toList(); -// List send = -// dates.where((x) => x.$2 == null).map((x) => x.$1).toList(); - -// int a = getFlameCounter(received); -// int b = getFlameCounter(send); -// // print("Received $a and send $b"); -// return min(a, b); -// } - -Duration calculateTimeDifference(DateTime now, DateTime startTime) { - // Get the timezone offsets - Duration nowOffset = now.timeZoneOffset; - Duration startTimeOffset = startTime.timeZoneOffset; - - // Convert both DateTime objects to UTC - DateTime nowInUTC = now.subtract(nowOffset); - DateTime startTimeInUTC = startTime.subtract(startTimeOffset); - - // Calculate the difference - return nowInUTC.difference(startTimeInUTC); -} - Future authenticateUser(String localizedReason, {bool force = true}) async { try { diff --git a/lib/src/views/chats/chat_item_details_view.dart b/lib/src/views/chats/chat_item_details_view.dart index 6e35203..1a334c5 100644 --- a/lib/src/views/chats/chat_item_details_view.dart +++ b/lib/src/views/chats/chat_item_details_view.dart @@ -248,14 +248,6 @@ class _ChatItemDetailsViewState extends State { (messages[i - 1].messageOtherId != null && messages[i].messageOtherId != null); } - // if (messages[i].openedAt != null) { - // if (calculateTimeDifference( - // DateTime.now(), messages[i].openedAt!) - // .inHours >= - // 24) { - // return Container(); - // } - // } return ChatListEntry( messages[i], widget.userid, diff --git a/lib/src/views/chats/chat_list_view.dart b/lib/src/views/chats/chat_list_view.dart index 08895fc..827aceb 100644 --- a/lib/src/views/chats/chat_list_view.dart +++ b/lib/src/views/chats/chat_list_view.dart @@ -34,8 +34,6 @@ class ChatListView extends StatefulWidget { class _ChatListViewState extends State { @override Widget build(BuildContext context) { - Stream> contacts = twonlyDatabase.watchContactsForChatList(); - return Scaffold( appBar: AppBar( title: GestureDetector( @@ -88,7 +86,7 @@ class _ChatListViewState extends State { ], ), body: StreamBuilder( - stream: contacts, + stream: twonlyDatabase.watchContactsForChatList(), builder: (context, snapshot) { if (!snapshot.hasData || snapshot.data == null) { return Container(); @@ -168,8 +166,10 @@ class _UserListItem extends State { setState(() { if (currentMessage != null) { lastMessageInSeconds = - calculateTimeDifference(DateTime.now(), currentMessage!.sendAt) - .inSeconds; + (DateTime.now().difference(currentMessage!.sendAt)).inSeconds; + if (lastMessageInSeconds < 0) { + lastMessageInSeconds = 0; + } } }); }); @@ -260,7 +260,9 @@ class _UserListItem extends State { return; } Message msg = currentMessage!; - if (msg.kind == MessageKind.media && msg.messageOtherId != null) { + if (msg.kind == MessageKind.media && + msg.messageOtherId != null && + msg.openedAt == null) { switch (msg.downloadState) { case DownloadState.pending: MediaMessageContent content = diff --git a/test/time_difference_test.dart b/test/time_difference_test.dart deleted file mode 100644 index 82a7182..0000000 --- a/test/time_difference_test.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Function to calculate time difference -import 'package:flutter_test/flutter_test.dart'; -import 'package:twonly/src/utils/misc.dart'; - -void main() { - test('Time difference calculation between different time zones', () { - // Test case 1: Current time is in UTC and start time is in UTC+2 - DateTime now = DateTime.parse('2023-10-01T10:00:00Z'); // 10:00 UTC - DateTime startTime = - DateTime.parse('2023-10-01T12:00:00+02:00'); // 12:00 UTC+2 - - Duration difference = calculateTimeDifference(now, startTime); - expect(difference.inHours, equals(0)); // 10:00 UTC - 12:00 UTC+2 = 0 hours - - // Test case 2: Current time is in UTC-1 and start time is in UTC+1 - now = DateTime.parse('2023-10-01T09:00:00-01:00'); // 09:00 UTC-1 - startTime = DateTime.parse('2023-10-01T11:00:00+01:00'); // 11:00 UTC+1 - - difference = calculateTimeDifference(now, startTime); - expect( - difference.inHours, equals(0)); // 09:00 UTC-1 - 11:00 UTC+1 = 0 hours - - // Test case 3: Current time is in UTC+3 and start time is in UTC-1 - now = DateTime.parse('2023-10-01T15:00:00+03:00'); // 15:00 UTC+3 - startTime = DateTime.parse('2023-10-01T13:00:00-01:00'); // 13:00 UTC-1 - - difference = calculateTimeDifference(now, startTime); - expect( - difference.inHours, equals(-2)); // 15:00 UTC+3 - 13:00 UTC-1 = -2 hours - }); -}