Merge pull request #412 from twonlyapp/dev
Some checks are pending
Publish on Github / build_and_publish (push) Waiting to run

- Fix: Issue with opening directly in chats
- Fix: Multiple smaller issues
This commit is contained in:
Tobi 2026-05-17 20:33:02 +02:00 committed by GitHub
commit dec79f3463
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 50 additions and 20 deletions

View file

@ -1,5 +1,10 @@
# Changelog # Changelog
## 0.2.14
- Fix: Issue with opening directly in chats
- Fix: Multipe smaller issues
## 0.2.13 ## 0.2.13
- New: Tutorial on how to use zoom. - New: Tutorial on how to use zoom.

View file

@ -197,7 +197,14 @@ class MediaFileService {
Future<void> createThumbnail() async { Future<void> createThumbnail() async {
if (!storedPath.existsSync()) { if (!storedPath.existsSync()) {
Log.error('Could not create Thumbnail as stored media does not exists.'); if (mediaFile.stored &&
mediaFile.createdAt.isBefore(
clock.now().subtract(const Duration(days: 30)),
)) {
// media files does not exists any more so also delete the database entry
await twonlyDB.mediaFilesDao.deleteMediaFile(mediaFile.mediaId);
fullMediaRemoval();
}
return; return;
} }
var success = false; var success = false;

View file

@ -158,13 +158,18 @@ Future<void> runMigrations() async {
final now = clock.now(); final now = clock.now();
for (final messageId in messageIds.first.split(',')) { for (final messageId in messageIds.first.split(',')) {
await (twonlyDB.update( await (twonlyDB.update(
twonlyDB.messages, twonlyDB.messages,
)..where((tbl) => tbl.messageId.equals(messageId))).write( )..where(
MessagesCompanion( (tbl) =>
openedAt: Value(now), tbl.messageId.equals(messageId) &
openedByAll: Value(now), (tbl.openedByAll.isNull() | tbl.openedAt.isNull()),
), ))
); .write(
MessagesCompanion(
openedAt: Value(now),
openedByAll: Value(now),
),
);
} }
} }
} }

View file

@ -30,7 +30,7 @@ Future<void> setupNotificationWithUsers({
// HotFIX: Search for user with id 0 if not there remove all // HotFIX: Search for user with id 0 if not there remove all
// and create new push keys with all users. // and create new push keys with all users.
final pushUser = pushUsers.firstWhereOrNull((x) => x.userId == 0); final pushUser = pushUsers.firstWhereOrNull((x) => x.userId.toInt() == 0);
if (pushUser == null) { if (pushUser == null) {
Log.info('Clearing push keys'); Log.info('Clearing push keys');
await setPushKeys(SecureStorageKeys.receivingPushKeys, []); await setPushKeys(SecureStorageKeys.receivingPushKeys, []);
@ -51,7 +51,7 @@ Future<void> setupNotificationWithUsers({
final contacts = await twonlyDB.contactsDao.getAllContacts(); final contacts = await twonlyDB.contactsDao.getAllContacts();
for (final contact in contacts) { for (final contact in contacts) {
final pushUser = pushUsers.firstWhereOrNull( final pushUser = pushUsers.firstWhereOrNull(
(x) => x.userId == contact.userId, (x) => x.userId.toInt() == contact.userId,
); );
if (pushUser != null && pushUser.pushKeys.isNotEmpty) { if (pushUser != null && pushUser.pushKeys.isNotEmpty) {
@ -124,7 +124,9 @@ Future<void> sendNewPushKey(int userId, PushKey pushKey) async {
Future<void> updatePushUser(Contact contact) async { Future<void> updatePushUser(Contact contact) async {
final pushKeys = await getPushKeys(SecureStorageKeys.receivingPushKeys); final pushKeys = await getPushKeys(SecureStorageKeys.receivingPushKeys);
final pushUser = pushKeys.firstWhereOrNull((x) => x.userId == contact.userId); final pushUser = pushKeys.firstWhereOrNull(
(x) => x.userId.toInt() == contact.userId,
);
if (pushUser == null) { if (pushUser == null) {
pushKeys.add( pushKeys.add(
@ -148,7 +150,9 @@ Future<void> updatePushUser(Contact contact) async {
Future<void> handleNewPushKey(int fromUserId, int keyId, List<int> key) async { Future<void> handleNewPushKey(int fromUserId, int keyId, List<int> key) async {
final pushKeys = await getPushKeys(SecureStorageKeys.sendingPushKeys); final pushKeys = await getPushKeys(SecureStorageKeys.sendingPushKeys);
var pushUser = pushKeys.firstWhereOrNull((x) => x.userId == fromUserId); var pushUser = pushKeys.firstWhereOrNull(
(x) => x.userId.toInt() == fromUserId,
);
if (pushUser == null) { if (pushUser == null) {
final contact = await twonlyDB.contactsDao final contact = await twonlyDB.contactsDao
@ -164,7 +168,7 @@ Future<void> handleNewPushKey(int fromUserId, int keyId, List<int> key) async {
lastMessageId: uuid.v7(), lastMessageId: uuid.v7(),
), ),
); );
pushUser = pushKeys.firstWhereOrNull((x) => x.userId == fromUserId); pushUser = pushKeys.firstWhereOrNull((x) => x.userId.toInt() == fromUserId);
} }
if (pushUser == null) { if (pushUser == null) {
@ -187,7 +191,9 @@ Future<void> handleNewPushKey(int fromUserId, int keyId, List<int> key) async {
Future<void> updateLastMessageId(int fromUserId, String messageId) async { Future<void> updateLastMessageId(int fromUserId, String messageId) async {
final pushUsers = await getPushKeys(SecureStorageKeys.receivingPushKeys); final pushUsers = await getPushKeys(SecureStorageKeys.receivingPushKeys);
final pushUser = pushUsers.firstWhereOrNull((x) => x.userId == fromUserId); final pushUser = pushUsers.firstWhereOrNull(
(x) => x.userId.toInt() == fromUserId,
);
if (pushUser == null) { if (pushUser == null) {
unawaited(setupNotificationWithUsers()); unawaited(setupNotificationWithUsers());
return; return;
@ -285,7 +291,7 @@ Future<PushNotification?> getPushNotificationFromEncryptedContent(
if (content.hasMediaUpdate()) { if (content.hasMediaUpdate()) {
final msg = await twonlyDB.messagesDao final msg = await twonlyDB.messagesDao
.getMessageById(content.reaction.targetMessageId) .getMessageById(content.mediaUpdate.targetMessageId)
.getSingleOrNull(); .getSingleOrNull();
// These notifications should only be send to the original sender. // These notifications should only be send to the original sender.
if (msg == null || msg.senderId != toUserId) { if (msg == null || msg.senderId != toUserId) {
@ -304,7 +310,9 @@ Future<PushNotification?> getPushNotificationFromEncryptedContent(
if (content.hasGroupCreate()) { if (content.hasGroupCreate()) {
kind = PushKind.ADDED_TO_GROUP; kind = PushKind.ADDED_TO_GROUP;
final group = await twonlyDB.groupsDao.getGroup(content.groupId); final group = await twonlyDB.groupsDao.getGroup(content.groupId);
additionalContent = group!.groupName; if (group != null) {
additionalContent = group.groupName;
}
} }
if (kind == null) return null; if (kind == null) return null;
@ -339,7 +347,9 @@ Future<Uint8List?> encryptPushNotification(
var key = 'InsecureOnlyUsedForAddingContact'.codeUnits; var key = 'InsecureOnlyUsedForAddingContact'.codeUnits;
var keyId = 0; var keyId = 0;
final pushUser = pushKeys.firstWhereOrNull((x) => x.userId == toUserId); final pushUser = pushKeys.firstWhereOrNull(
(x) => x.userId.toInt() == toUserId,
);
if (pushUser == null) { if (pushUser == null) {
// user does not have send any push keys // user does not have send any push keys

View file

@ -44,7 +44,7 @@ class MainCameraController {
CameraController? cameraController; CameraController? cameraController;
ScreenshotController screenshotController = ScreenshotController(); ScreenshotController screenshotController = ScreenshotController();
SelectedCameraDetails selectedCameraDetails = SelectedCameraDetails(); SelectedCameraDetails selectedCameraDetails = SelectedCameraDetails();
bool initCameraStarted = true; bool initCameraStarted = false;
Map<int, ScannedVerifiedContact> contactsVerified = {}; Map<int, ScannedVerifiedContact> contactsVerified = {};
Map<int, ScannedNewProfile> scannedNewProfiles = {}; Map<int, ScannedNewProfile> scannedNewProfiles = {};
final Set<String> _handledProfileLinks = {}; final Set<String> _handledProfileLinks = {};

View file

@ -91,7 +91,9 @@ class HomeViewState extends State<HomeView> {
streamHomeViewPageIndex.add(0); streamHomeViewPageIndex.add(0);
}); });
unawaited(_mainCameraController.selectCamera(0, true)); if (initialPage == 1) {
unawaited(_mainCameraController.selectCamera(0, true));
}
unawaited(_initAsync()); unawaited(_initAsync());
// Subscribe to all events (initial link and further) // Subscribe to all events (initial link and further)

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.2.13+122 version: 0.2.14+123
environment: environment:
sdk: ^3.11.0 sdk: ^3.11.0
@ -185,6 +185,7 @@ dev_dependencies:
in_app_purchase_platform_interface: ^1.4.0 in_app_purchase_platform_interface: ^1.4.0
integration_test: integration_test:
sdk: flutter sdk: flutter
workmanager_platform_interface: any
flutter_launcher_icons: flutter_launcher_icons:
android: true android: true