some smaller bug fixes
Some checks failed
Flutter analyze & test / flutter_analyze_and_test (push) Has been cancelled

This commit is contained in:
otsmr 2026-08-06 10:16:27 +02:00
parent 8505ed865a
commit eade1d87e6
8 changed files with 33 additions and 2 deletions

View file

@ -6,6 +6,7 @@ import 'package:twonly/src/database/tables/mediafiles.table.dart';
enum MessageType { media, text, contacts, restoreFlameCounter, askAboutUser } enum MessageType { media, text, contacts, restoreFlameCounter, askAboutUser }
@DataClassName('Message') @DataClassName('Message')
@TableIndex(name: 'idx_messages_group_id_created_at', columns: {#groupId, #createdAt})
class Messages extends Table { class Messages extends Table {
TextColumn get groupId => TextColumn get groupId =>
text().references(Groups, #groupId, onDelete: KeyAction.cascade)(); text().references(Groups, #groupId, onDelete: KeyAction.cascade)();

View file

@ -3,6 +3,7 @@ import 'package:twonly/src/database/tables/contacts.table.dart';
import 'package:twonly/src/database/tables/messages.table.dart'; import 'package:twonly/src/database/tables/messages.table.dart';
@DataClassName('Receipt') @DataClassName('Receipt')
@TableIndex(name: 'idx_receipts_message_id', columns: {#messageId})
class Receipts extends Table { class Receipts extends Table {
TextColumn get receiptId => text()(); TextColumn get receiptId => text()();

View file

@ -13843,6 +13843,14 @@ abstract class _$TwonlyDB extends GeneratedDatabase {
); );
late final $LabelsTable labels = $LabelsTable(this); late final $LabelsTable labels = $LabelsTable(this);
late final $ContactLabelsTable contactLabels = $ContactLabelsTable(this); late final $ContactLabelsTable contactLabels = $ContactLabelsTable(this);
late final Index idxMessagesGroupIdCreatedAt = Index(
'idx_messages_group_id_created_at',
'CREATE INDEX idx_messages_group_id_created_at ON messages (group_id, created_at)',
);
late final Index idxReceiptsMessageId = Index(
'idx_receipts_message_id',
'CREATE INDEX idx_receipts_message_id ON receipts (message_id)',
);
late final MessagesDao messagesDao = MessagesDao(this as TwonlyDB); late final MessagesDao messagesDao = MessagesDao(this as TwonlyDB);
late final ContactsDao contactsDao = ContactsDao(this as TwonlyDB); late final ContactsDao contactsDao = ContactsDao(this as TwonlyDB);
late final ReceiptsDao receiptsDao = ReceiptsDao(this as TwonlyDB); late final ReceiptsDao receiptsDao = ReceiptsDao(this as TwonlyDB);
@ -13889,6 +13897,8 @@ abstract class _$TwonlyDB extends GeneratedDatabase {
shortcutMembers, shortcutMembers,
labels, labels,
contactLabels, contactLabels,
idxMessagesGroupIdCreatedAt,
idxReceiptsMessageId,
]; ];
@override @override
StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([ StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([

View file

@ -140,6 +140,9 @@ signalDecryptMessageV1(
) = await lockingSignalProtocol.protect(() async { ) = await lockingSignalProtocol.protect(() async {
Log.info('Lock acquired for $fromUserId (V1)'); Log.info('Lock acquired for $fromUserId (V1)');
try { try {
// Yield execution to the event loop to prevent UI freezing during bulk decryption
await Future.delayed(Duration.zero);
final session = SessionCipher.fromStore( final session = SessionCipher.fromStore(
(await getSignalStore())!, (await getSignalStore())!,
getSignalAddress(fromUserId), getSignalAddress(fromUserId),

View file

@ -84,6 +84,7 @@ class _ChatMessagesViewState extends State<ChatMessagesView>
contactSub?.cancel(); contactSub?.cancel();
groupActionsSub?.cancel(); groupActionsSub?.cancel();
_nextTypingIndicator?.cancel(); _nextTypingIndicator?.cancel();
textFieldFocus?.dispose();
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
super.dispose(); super.dispose();
} }

View file

@ -27,6 +27,13 @@ class _BackupRecoveryViewState extends State<BackupRecoveryView> {
final TextEditingController usernameCtrl = TextEditingController(); final TextEditingController usernameCtrl = TextEditingController();
final TextEditingController passwordCtrl = TextEditingController(); final TextEditingController passwordCtrl = TextEditingController();
@override
void dispose() {
usernameCtrl.dispose();
passwordCtrl.dispose();
super.dispose();
}
Future<void> _recoverTwonlySafe() async { Future<void> _recoverTwonlySafe() async {
setState(() { setState(() {
isLoading = true; isLoading = true;

View file

@ -17,6 +17,14 @@ class DataAndStorageView extends StatefulWidget {
} }
class _DataAndStorageViewState extends State<DataAndStorageView> { class _DataAndStorageViewState extends State<DataAndStorageView> {
late Future<Map<MediaType, int>> _storageStatsFuture;
@override
void initState() {
super.initState();
_storageStatsFuture = twonlyDB.mediaFilesDao.getStorageStats();
}
Future<void> showAutoDownloadOptions( Future<void> showAutoDownloadOptions(
BuildContext context, BuildContext context,
ConnectivityResult connectionMode, ConnectivityResult connectionMode,
@ -93,7 +101,7 @@ class _DataAndStorageViewState extends State<DataAndStorageView> {
return ListView( return ListView(
children: [ children: [
FutureBuilder<Map<MediaType, int>>( FutureBuilder<Map<MediaType, int>>(
future: twonlyDB.mediaFilesDao.getStorageStats(), future: _storageStatsFuture,
builder: (context, snapshot) { builder: (context, snapshot) {
final stats = snapshot.data ?? {}; final stats = snapshot.data ?? {};
final totalBytes = stats.values.fold<int>(0, (a, b) => a + b); final totalBytes = stats.values.fold<int>(0, (a, b) => a + b);

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.5.0+168 version: 0.5.0+169
environment: environment:
sdk: ^3.11.0 sdk: ^3.11.0