From f879ae00f15b67bffa7bb6a8e38362cdb75bc35e Mon Sep 17 00:00:00 2001 From: otsmr Date: Sat, 8 Nov 2025 21:39:19 +0100 Subject: [PATCH] hotfix: display time changed to milliseconds... --- lib/src/services/api.service.dart | 6 ++-- .../services/api/client2client/media.c2c.dart | 14 ++++++-- .../api/mediafiles/upload.service.dart | 5 +++ .../mediafiles/mediafile.service.dart | 2 +- .../views/camera/share_image_editor_view.dart | 14 ++++---- lib/src/views/chats/media_viewer.view.dart | 36 +++++++++++++++---- pubspec.yaml | 2 +- 7 files changed, 58 insertions(+), 21 deletions(-) diff --git a/lib/src/services/api.service.dart b/lib/src/services/api.service.dart index 57b3ed9..1611db1 100644 --- a/lib/src/services/api.service.dart +++ b/lib/src/services/api.service.dart @@ -51,9 +51,9 @@ final lockRetransStore = Mutex(); /// errors or network changes. class ApiService { ApiService(); - // final String apiHost = kReleaseMode ? 'api.twonly.eu' : '10.99.0.140:3030'; - final String apiHost = kReleaseMode ? 'api.twonly.eu' : 'dev.twonly.eu'; - final String apiSecure = kReleaseMode ? 's' : 's'; + final String apiHost = kReleaseMode ? 'api.twonly.eu' : '10.99.0.140:3030'; + // final String apiHost = kReleaseMode ? 'api.twonly.eu' : 'dev.twonly.eu'; + final String apiSecure = kReleaseMode ? 's' : ''; bool appIsOutdated = false; bool isAuthenticated = false; diff --git a/lib/src/services/api/client2client/media.c2c.dart b/lib/src/services/api/client2client/media.c2c.dart index 616086d..8556218 100644 --- a/lib/src/services/api/client2client/media.c2c.dart +++ b/lib/src/services/api/client2client/media.c2c.dart @@ -66,15 +66,23 @@ Future handleMedia( mediaType = MediaType.audio; } + int? displayLimitInMilliseconds; + if (media.hasDisplayLimitInMilliseconds()) { + if (media.displayLimitInMilliseconds.toInt() < 1000) { + displayLimitInMilliseconds = + media.displayLimitInMilliseconds.toInt() * 1000; + } else { + displayLimitInMilliseconds = media.displayLimitInMilliseconds.toInt(); + } + } + final mediaFile = await twonlyDB.mediaFilesDao.insertMedia( MediaFilesCompanion( downloadState: const Value(DownloadState.pending), type: Value(mediaType), requiresAuthentication: Value(media.requiresAuthentication), displayLimitInMilliseconds: Value( - media.hasDisplayLimitInMilliseconds() - ? media.displayLimitInMilliseconds.toInt() - : null, + displayLimitInMilliseconds, ), downloadToken: Value(Uint8List.fromList(media.downloadToken)), encryptionKey: Value(Uint8List.fromList(media.encryptionKey)), diff --git a/lib/src/services/api/mediafiles/upload.service.dart b/lib/src/services/api/mediafiles/upload.service.dart index 7fa39d9..9712f16 100644 --- a/lib/src/services/api/mediafiles/upload.service.dart +++ b/lib/src/services/api/mediafiles/upload.service.dart @@ -54,6 +54,11 @@ Future initializeMediaUpload( int? displayLimitInMilliseconds, { bool isDraftMedia = false, }) async { + if (displayLimitInMilliseconds != null && displayLimitInMilliseconds < 1000) { + // in case the time was set in seconds... + // ignore: parameter_assignments + displayLimitInMilliseconds = displayLimitInMilliseconds * 1000; + } final chacha20 = FlutterChacha20.poly1305Aead(); final encryptionKey = await (await chacha20.newSecretKey()).extract(); final encryptionNonce = chacha20.newNonce(); diff --git a/lib/src/services/mediafiles/mediafile.service.dart b/lib/src/services/mediafiles/mediafile.service.dart index 00bed5a..2dab6fd 100644 --- a/lib/src/services/mediafiles/mediafile.service.dart +++ b/lib/src/services/mediafiles/mediafile.service.dart @@ -157,7 +157,7 @@ class MediaFileService { MediaFilesCompanion( requiresAuthentication: Value(requiresAuthentication), displayLimitInMilliseconds: - requiresAuthentication ? const Value(12) : const Value.absent(), + requiresAuthentication ? const Value(12000) : const Value.absent(), ), ); await updateFromDB(); diff --git a/lib/src/views/camera/share_image_editor_view.dart b/lib/src/views/camera/share_image_editor_view.dart index 3db605c..d38c36e 100644 --- a/lib/src/views/camera/share_image_editor_view.dart +++ b/lib/src/views/camera/share_image_editor_view.dart @@ -192,7 +192,7 @@ class _ShareImageEditorView extends State { ? '0' : media.displayLimitInMilliseconds == null ? '∞' - : media.displayLimitInMilliseconds.toString(), + : (media.displayLimitInMilliseconds! ~/ 1000).toString(), child: ActionButton( (media.type == MediaType.video) ? media.displayLimitInMilliseconds == null @@ -211,11 +211,13 @@ class _ShareImageEditorView extends State { } int? maxShowTime; if (media.displayLimitInMilliseconds == null) { - maxShowTime = 1; - } else if (media.displayLimitInMilliseconds == 1) { - maxShowTime = 5; - } else if (media.displayLimitInMilliseconds == 5) { - maxShowTime = 20; + maxShowTime = 1000; + } else if (media.displayLimitInMilliseconds == 1000) { + maxShowTime = 5000; + } else if (media.displayLimitInMilliseconds == 5000) { + maxShowTime = 12000; + } else if (media.displayLimitInMilliseconds == 12000) { + maxShowTime = 20000; } await mediaService.setDisplayLimit(maxShowTime); if (!mounted) return; diff --git a/lib/src/views/chats/media_viewer.view.dart b/lib/src/views/chats/media_viewer.view.dart index 471cc42..9a62a59 100644 --- a/lib/src/views/chats/media_viewer.view.dart +++ b/lib/src/views/chats/media_viewer.view.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:collection'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:lottie/lottie.dart'; @@ -54,7 +55,7 @@ class _MediaViewerViewState extends State { bool imageSaved = false; bool imageSaving = false; - bool displayTwonlyPresent = true; + bool displayTwonlyPresent = false; final emojiKey = GlobalKey(); StreamSubscription? downloadStateListener; @@ -63,6 +64,8 @@ class _MediaViewerViewState extends State { late StreamSubscription> _subscription; TextEditingController textMessageController = TextEditingController(); + final HashSet _alreadyOpenedMediaIds = HashSet(); + @override void initState() { super.initState(); @@ -92,6 +95,13 @@ class _MediaViewerViewState extends State { _subscription = messages.listen((messages) async { for (final msg in messages) { + if (_alreadyOpenedMediaIds.contains(msg.mediaId)) { + continue; + } + if (msg.mediaId == null) { + continue; + } + if (msg.mediaId == currentMedia?.mediaFile.mediaId) { // The update of the current Media in case of a download is done in loadCurrentMediaFile continue; @@ -195,13 +205,17 @@ class _MediaViewerViewState extends State { bool showTwonly, ) async { if (allMediaFiles.isEmpty) return; - currentMessage = allMediaFiles.removeAt(0); final currentMediaLocal = - await MediaFileService.fromMediaId(currentMessage!.mediaId!); + await MediaFileService.fromMediaId(allMediaFiles.first.mediaId!); if (currentMediaLocal == null || !mounted) return; if (currentMediaLocal.mediaFile.requiresAuthentication) { - if (!showTwonly) return; + if (!showTwonly) { + setState(() { + displayTwonlyPresent = true; + }); + return; + } final isAuth = await authenticateUser( context.lang.mediaViewerAuthReason, @@ -209,10 +223,20 @@ class _MediaViewerViewState extends State { ); if (!isAuth) { await nextMediaOrExit(); + setState(() { + displayTwonlyPresent = false; + }); return; } } + _alreadyOpenedMediaIds.add(allMediaFiles.first.mediaId!); + currentMessage = allMediaFiles.removeAt(0); + + setState(() { + displayTwonlyPresent = false; + }); + await notifyContactAboutOpeningMessage( currentMessage!.senderId!, [currentMessage!.messageId], @@ -490,9 +514,7 @@ class _MediaViewerViewState extends State { ), ), ), - if (currentMedia != null && - currentMedia!.mediaFile.requiresAuthentication && - displayTwonlyPresent) + if (displayTwonlyPresent) Positioned.fill( child: GestureDetector( onTap: () { diff --git a/pubspec.yaml b/pubspec.yaml index ad4dfdd..f964597 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec publish_to: 'none' -version: 0.0.65+65 +version: 0.0.66+66 environment: sdk: ^3.6.0