fixes multiple issues

This commit is contained in:
otsmr 2026-04-06 15:36:01 +02:00
parent 48bfc774c2
commit 083faaa876
6 changed files with 34 additions and 10 deletions

View file

@ -3,13 +3,16 @@
## 0.1.3 ## 0.1.3
- New: Video stabilization - New: Video stabilization
- New: Crop or rotate images before share them - New: Crop or rotate images before sharing them.
- New: Clicking on “Text Notifications” will now open the chat directly (Android only) - New: Clicking on “Text Notifications” will now open the chat directly (Android only)
- New: Developer settings to reduce flames - New: Developer settings to reduce flames
- Improve: Improved troubleshooting for issues with push notifications - Improve: Improved troubleshooting for issues with push notifications
- Improve: A message appears if someone has deleted their account.
- Improve: Make the verification badge more visible.
- Fix: Flash not activated when starting a video recording - Fix: Flash not activated when starting a video recording
- Fix: Problem sending media when a recipient has deleted their account. - Fix: Problem sending media when a recipient has deleted their account.
- Fix: Receive push notifications without receiving an in-app message (Android) - Fix: Receive push notifications without receiving an in-app message (Android)
- Fix: Issue with sending GIFs from Memories
- Fix: Incorrect processing of messages that have already been fetched from the server causes the UI to freeze - Fix: Incorrect processing of messages that have already been fetched from the server causes the UI to freeze
## 0.1.1 ## 0.1.1

View file

@ -507,7 +507,7 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
mediaService.tempPath.deleteSync(); mediaService.tempPath.deleteSync();
} }
if (mediaService.originalPath.existsSync()) { if (mediaService.originalPath.existsSync()) {
if (media.type != MediaType.video) { if (media.type == MediaType.image) {
mediaService.originalPath.deleteSync(); mediaService.originalPath.deleteSync();
} }
} }
@ -516,8 +516,6 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
if (media.type == MediaType.gif) { if (media.type == MediaType.gif) {
if (bytes != null) { if (bytes != null) {
mediaService.originalPath.writeAsBytesSync(bytes.toList()); mediaService.originalPath.writeAsBytesSync(bytes.toList());
} else {
Log.error('Could not load image bytes for gif!');
} }
} else { } else {
image = await getEditedImageBytes(); image = await getEditedImageBytes();

View file

@ -45,6 +45,7 @@ class _UserListItem extends State<GroupListItem> {
List<Message> _previewMessages = []; List<Message> _previewMessages = [];
final List<MediaFile> _previewMediaFiles = []; final List<MediaFile> _previewMediaFiles = [];
bool _hasNonOpenedMediaFile = false; bool _hasNonOpenedMediaFile = false;
bool _receiverDeletedAccount = false;
@override @override
void initState() { void initState() {
@ -61,7 +62,7 @@ class _UserListItem extends State<GroupListItem> {
super.dispose(); super.dispose();
} }
void initStreams() { Future<void> initStreams() async {
_lastMessageStream = twonlyDB.messagesDao _lastMessageStream = twonlyDB.messagesDao
.watchLastMessage(widget.group.groupId) .watchLastMessage(widget.group.groupId)
.listen((update) { .listen((update) {
@ -99,6 +100,13 @@ class _UserListItem extends State<GroupListItem> {
} }
setState(() {}); setState(() {});
}); });
final groupContacts = await twonlyDB.groupsDao.getGroupContact(
widget.group.groupId,
);
if (groupContacts.length == 1) {
_receiverDeletedAccount = groupContacts.first.accountDeleted;
}
} }
Mutex protectUpdateState = Mutex(); Mutex protectUpdateState = Mutex();
@ -133,6 +141,9 @@ class _UserListItem extends State<GroupListItem> {
)) { )) {
_currentMessage = newLastMessage; _currentMessage = newLastMessage;
_previewMessages = [newLastMessage]; _previewMessages = [newLastMessage];
} else {
_currentMessage = null;
_previewMessages = [];
} }
} }
@ -220,7 +231,9 @@ class _UserListItem extends State<GroupListItem> {
), ),
], ],
), ),
subtitle: (_currentMessage == null) subtitle: _receiverDeletedAccount
? Text(context.lang.userDeletedAccount)
: (_currentMessage == null)
? (widget.group.totalMediaCounter == 0) ? (widget.group.totalMediaCounter == 0)
? Text(context.lang.chatsTapToSend) ? Text(context.lang.chatsTapToSend)
: Row( : Row(
@ -267,7 +280,7 @@ class _UserListItem extends State<GroupListItem> {
}, },
child: AvatarIcon(group: widget.group), child: AvatarIcon(group: widget.group),
), ),
trailing: (widget.group.leftGroup) trailing: (widget.group.leftGroup || _receiverDeletedAccount)
? null ? null
: IconButton( : IconButton(
onPressed: () { onPressed: () {

View file

@ -13,6 +13,7 @@ import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/model/memory_item.model.dart'; import 'package:twonly/src/model/memory_item.model.dart';
import 'package:twonly/src/services/api/messages.dart'; import 'package:twonly/src/services/api/messages.dart';
import 'package:twonly/src/services/notifications/background.notifications.dart'; import 'package:twonly/src/services/notifications/background.notifications.dart';
import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/views/chats/chat_messages_components/chat_group_action.dart'; import 'package:twonly/src/views/chats/chat_messages_components/chat_group_action.dart';
import 'package:twonly/src/views/chats/chat_messages_components/chat_list_entry.dart'; import 'package:twonly/src/views/chats/chat_messages_components/chat_list_entry.dart';
import 'package:twonly/src/views/chats/chat_messages_components/entries/chat_date_chip.dart'; import 'package:twonly/src/views/chats/chat_messages_components/entries/chat_date_chip.dart';
@ -53,6 +54,7 @@ class _ChatMessagesViewState extends State<ChatMessagesView> {
late FocusNode textFieldFocus; late FocusNode textFieldFocus;
final ItemScrollController itemScrollController = ItemScrollController(); final ItemScrollController itemScrollController = ItemScrollController();
int? focusedScrollItem; int? focusedScrollItem;
bool _receiverDeletedAccount = false;
@override @override
void initState() { void initState() {
@ -107,6 +109,13 @@ class _ChatMessagesViewState extends State<ChatMessagesView> {
await setMessages(update, groupActions); await setMessages(update, groupActions);
}); });
}); });
final groupContacts = await twonlyDB.groupsDao.getGroupContact(
widget.groupId,
);
if (groupContacts.length == 1) {
_receiverDeletedAccount = groupContacts.first.accountDeleted;
}
} }
Future<void> setMessages( Future<void> setMessages(
@ -334,7 +343,7 @@ class _ChatMessagesViewState extends State<ChatMessagesView> {
], ],
), ),
), ),
if (!group.leftGroup) if (!group.leftGroup && !_receiverDeletedAccount)
MessageInput( MessageInput(
group: group, group: group,
quotesMessage: quotesMessage, quotesMessage: quotesMessage,
@ -345,6 +354,8 @@ class _ChatMessagesViewState extends State<ChatMessagesView> {
}); });
}, },
), ),
if (_receiverDeletedAccount)
Text(context.lang.userDeletedAccount),
], ],
), ),
), ),

View file

@ -14,7 +14,6 @@ import 'package:twonly/src/views/components/better_list_title.dart';
import 'package:twonly/src/views/components/flame.dart'; import 'package:twonly/src/views/components/flame.dart';
import 'package:twonly/src/views/components/max_flame_list_title.dart'; import 'package:twonly/src/views/components/max_flame_list_title.dart';
import 'package:twonly/src/views/components/select_chat_deletion_time.comp.dart'; import 'package:twonly/src/views/components/select_chat_deletion_time.comp.dart';
import 'package:twonly/src/views/components/svg_icon.dart';
import 'package:twonly/src/views/components/verified_shield.dart'; import 'package:twonly/src/views/components/verified_shield.dart';
import 'package:twonly/src/views/groups/group.view.dart'; import 'package:twonly/src/views/groups/group.view.dart';

View file

@ -3,7 +3,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec
publish_to: 'none' publish_to: 'none'
version: 0.1.2+102 version: 0.1.3+103
environment: environment:
sdk: ^3.11.0 sdk: ^3.11.0