feat: clean exif

update gradle
This commit is contained in:
OfficialDakari 2025-10-08 15:44:46 +05:00
parent 5eadcb5c1c
commit 1e28469aa5
65 changed files with 738 additions and 195 deletions

View File

@ -1,6 +1,6 @@
#Mon Mar 17 08:36:03 CET 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -18,7 +18,7 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.7.3" apply false
id "com.android.application" version "8.11.1" apply false
id "org.jetbrains.kotlin.android" version "2.1.10" apply false
// id "com.google.gms.google-services" version "4.3.8" apply false
}

View File

@ -7,6 +7,16 @@
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
},
"cleanExif": "Clean EXIF metadata",
"@cleanExif": {
"type": "String",
"placeholders": {}
},
"cleanExifDescription": "Remove EXIF metadata (camera model, geolocation, time) when sending a photo.",
"@cleanExifDescription": {
"type": "String",
"placeholders": {}
},
"repeatPassword": "Repeat password",
"@repeatPassword": {},
"notAnImage": "Not an image file.",

View File

@ -7,6 +7,16 @@
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
},
"cleanExif": "Очищать EXIF",
"@cleanExif": {
"type": "String",
"placeholders": {}
},
"cleanExifDescription": "Удалять метаданные EXIF (модель камеры, геолокация, время) из изображений еред отправкой.",
"@cleanExifDescription": {
"type": "String",
"placeholders": {}
},
"repeatPassword": "Повторите пароль",
"@repeatPassword": {},
"notAnImage": "Это не картинка.",
@ -2993,7 +3003,7 @@
}
}
},
"sendReadReceipts": "Отправка отчётов о прочтении",
"sendReadReceipts": "Отправлять отчёты о прочтении",
"@sendReadReceipts": {},
"sendTypingNotificationsDescription": "Другие участники чата будут видеть, когда Вы набираете новое сообщение.",
"@sendTypingNotificationsDescription": {},

View File

@ -13,6 +13,7 @@ abstract class AppConfig {
static bool displayNavigationRail = true;
static bool enableGradient = true;
static bool cleanExif = true;
static String get defaultHomeserver => _defaultHomeserver;
static double fontSizeFactor = 1;

View File

@ -1,6 +1,7 @@
import 'package:shared_preferences/shared_preferences.dart';
abstract class SettingKeys {
static const String cleanExif = 'xyz.extera.next.cleanExif';
static const String displayNavigationRail = 'chat.fluffy.displayNavigationRail';
static const String hideAvatarsInInvites = 'xyz.extera.next.hideAvatarsInInvites';
static const String pureBlack = 'xyz.extera.next.pureBlack';

View File

@ -205,6 +205,18 @@ abstract class L10n {
/// **'false'**
String get alwaysUse24HourFormat;
/// No description provided for @cleanExif.
///
/// In en, this message translates to:
/// **'Clean EXIF metadata'**
String get cleanExif;
/// No description provided for @cleanExifDescription.
///
/// In en, this message translates to:
/// **'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.'**
String get cleanExifDescription;
/// No description provided for @repeatPassword.
///
/// In en, this message translates to:

View File

@ -14,6 +14,13 @@ class L10nAr extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'كرّر كلمة السر';

View File

@ -14,6 +14,13 @@ class L10nBe extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repeat password';

View File

@ -14,6 +14,13 @@ class L10nBn extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repeat password';

View File

@ -14,6 +14,13 @@ class L10nBo extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repeat password';

View File

@ -14,6 +14,13 @@ class L10nCa extends L10n {
@override
String get alwaysUse24HourFormat => 'true';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repetiu la contrasenya';

View File

@ -14,6 +14,13 @@ class L10nCs extends L10n {
@override
String get alwaysUse24HourFormat => 'Vypnuto';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Zopakujte heslo';

View File

@ -14,6 +14,13 @@ class L10nDe extends L10n {
@override
String get alwaysUse24HourFormat => 'true';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Passwort wiederholen';

View File

@ -14,6 +14,13 @@ class L10nEl extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Επανάληψη κωδικού πρόσβασης';

View File

@ -14,6 +14,13 @@ class L10nEn extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repeat password';

View File

@ -14,6 +14,13 @@ class L10nEo extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repeat password';

View File

@ -14,6 +14,13 @@ class L10nEs extends L10n {
@override
String get alwaysUse24HourFormat => 'falso';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repite la contraseña';

View File

@ -14,6 +14,13 @@ class L10nEt extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Korda salasõna';

View File

@ -14,6 +14,13 @@ class L10nEu extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Idatzi berriro pasahitza';

View File

@ -14,6 +14,13 @@ class L10nFa extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'تکرار رمزعبور';

View File

@ -14,6 +14,13 @@ class L10nFi extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Salasana uudelleen';

View File

@ -14,6 +14,13 @@ class L10nFil extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Ulitin ang password';

View File

@ -14,6 +14,13 @@ class L10nFr extends L10n {
@override
String get alwaysUse24HourFormat => 'true';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Répétez le mot de passe';

View File

@ -14,6 +14,13 @@ class L10nGa extends L10n {
@override
String get alwaysUse24HourFormat => 'bréagach';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Scríobh an pasfhocal arís';

View File

@ -14,6 +14,13 @@ class L10nGl extends L10n {
@override
String get alwaysUse24HourFormat => 'falso';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repite o contrasinal';

View File

@ -14,6 +14,13 @@ class L10nHe extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'כתוב שוב את הסיסמה';

View File

@ -14,6 +14,13 @@ class L10nHi extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'पासवर्ड दोहराएं';

View File

@ -14,6 +14,13 @@ class L10nHr extends L10n {
@override
String get alwaysUse24HourFormat => 'true';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Ponovi lozinku';

View File

@ -14,6 +14,13 @@ class L10nHu extends L10n {
@override
String get alwaysUse24HourFormat => 'true';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Jelszó megismétlése';

View File

@ -14,6 +14,13 @@ class L10nIa extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repeter le contrasigno';

View File

@ -14,6 +14,13 @@ class L10nId extends L10n {
@override
String get alwaysUse24HourFormat => 'tidak';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Ulangi kata sandi';

View File

@ -14,6 +14,13 @@ class L10nIe extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repetir li contrasigne';

View File

@ -14,6 +14,13 @@ class L10nIt extends L10n {
@override
String get alwaysUse24HourFormat => 'disattivato';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Ripeti password';

View File

@ -14,6 +14,13 @@ class L10nJa extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'パスワードを繰り返そ';

View File

@ -14,6 +14,13 @@ class L10nKa extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'გაიმეორეთ პაროლი';

View File

@ -14,6 +14,13 @@ class L10nKo extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => '비밀번호 다시 입력';

View File

@ -14,6 +14,13 @@ class L10nLt extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Pakartokite slaptažodį';

View File

@ -14,6 +14,13 @@ class L10nLv extends L10n {
@override
String get alwaysUse24HourFormat => '';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Atkārtot paroli';

View File

@ -14,6 +14,13 @@ class L10nNb extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Gjenta passord';

View File

@ -14,6 +14,13 @@ class L10nNl extends L10n {
@override
String get alwaysUse24HourFormat => 'true';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Wachtwoord herhalen';

View File

@ -14,6 +14,13 @@ class L10nPl extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Powtórz hasło';

View File

@ -14,6 +14,13 @@ class L10nPt extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repeat password';

View File

@ -14,6 +14,13 @@ class L10nRo extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repetați parola';

View File

@ -14,6 +14,13 @@ class L10nRu extends L10n {
@override
String get alwaysUse24HourFormat => 'нет';
@override
String get cleanExif => 'Очищать EXIF';
@override
String get cleanExifDescription =>
'Удалять метаданные EXIF (модель камеры, геолокация, время) из изображений еред отправкой.';
@override
String get repeatPassword => 'Повторите пароль';
@ -2251,7 +2258,7 @@ class L10nRu extends L10n {
}
@override
String get sendReadReceipts => 'Отправка отчётов о прочтении';
String get sendReadReceipts => 'Отправлять отчёты о прочтении';
@override
String get sendTypingNotificationsDescription =>

View File

@ -14,6 +14,13 @@ class L10nSk extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Zopakujte heslo';

View File

@ -14,6 +14,13 @@ class L10nSl extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Ponovite geslo';

View File

@ -14,6 +14,13 @@ class L10nSr extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Repeat password';

View File

@ -14,6 +14,13 @@ class L10nSv extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Upprepa lösenord';

View File

@ -14,6 +14,13 @@ class L10nTa extends L10n {
@override
String get alwaysUse24HourFormat => 'தவறு';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'கடவுச்சொல்லை மீண்டும் செய்யவும்';

View File

@ -14,6 +14,13 @@ class L10nTe extends L10n {
@override
String get alwaysUse24HourFormat => 'తప్పుడు';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'పాస్‌వర్డ్‌ను పునరావృతం చేయండి';

View File

@ -14,6 +14,13 @@ class L10nTh extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'ใส่รหัสผ่านอีกรอบ';

View File

@ -14,6 +14,13 @@ class L10nTr extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Parolayı tekrarlayın';

View File

@ -14,6 +14,13 @@ class L10nUk extends L10n {
@override
String get alwaysUse24HourFormat => 'ні';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Повторіть пароль';

View File

@ -14,6 +14,13 @@ class L10nVi extends L10n {
@override
String get alwaysUse24HourFormat => 'Không';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => 'Nhập lại mật khẩu';

View File

@ -14,6 +14,13 @@ class L10nZh extends L10n {
@override
String get alwaysUse24HourFormat => 'false';
@override
String get cleanExif => 'Clean EXIF metadata';
@override
String get cleanExifDescription =>
'Remove EXIF metadata (camera model, geolocation, time) when sending a photo.';
@override
String get repeatPassword => '重复输入密码';

View File

@ -1,3 +1,6 @@
import 'dart:typed_data';
import 'package:extera_next/utils/clean_exif.dart';
import 'package:extera_next/widgets/matrix.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@ -50,9 +53,6 @@ class SendFileDialogState extends State<SendFileDialog> {
final l10n = L10n.of(context);
try {
if (!widget.room.otherPartyCanReceiveMessages) {
throw OtherPartyCanNotReceiveMessages();
}
scaffoldMessenger.showLoadingSnackBar(l10n.prepareSendingAttachment);
Navigator.of(context, rootNavigator: false).pop();
final clientConfig = await widget.room.client.getConfig();
@ -74,10 +74,24 @@ class SendFileDialogState extends State<SendFileDialog> {
file = await xfile.resizeVideo();
scaffoldMessenger.showLoadingSnackBar(l10n.generatingVideoThumbnail);
thumbnail = await xfile.getVideoThumbnail();
} else if (mimeType != null &&
mimeType.startsWith('image') &&
AppConfig.cleanExif) {
if (length > maxUploadSize) {
throw FileTooBigMatrixException(length, maxUploadSize);
}
// Else we just create a MatrixFile
file = MatrixFile(
bytes: Uint8List.fromList(ExifCleaner.removeExifData(await xfile.readAsBytes())),
name: xfile.name,
mimeType: mimeType,
).detectFileType;
} else {
if (length > maxUploadSize) {
throw FileTooBigMatrixException(length, maxUploadSize);
}
// Else we just create a MatrixFile
file = MatrixFile(
bytes: await xfile.readAsBytes(),
@ -108,9 +122,11 @@ class SendFileDialogState extends State<SendFileDialog> {
extraContent['body'] = label;
final html = markdown(
label,
getEmotePacks: () => widget.room.getImagePacksFlat(ImagePackUsage.emoticon),
getEmotePacks: () =>
widget.room.getImagePacksFlat(ImagePackUsage.emoticon),
getMention: widget.room.getMention,
convertLinebreaks: Matrix.of(context).client.convertLinebreaksInFormatting,
convertLinebreaks:
Matrix.of(context).client.convertLinebreaksInFormatting,
);
// if the decoded html is the same as the body, there is no need in sending a formatted message

View File

@ -43,7 +43,7 @@ class DownloadManagerView extends StatelessWidget {
),
title: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 256),
child: const Center(child: Text("Downloads", textAlign: TextAlign.center)),
child: Center(child: Text(L10n.of(context).downloads, textAlign: TextAlign.center)),
),
);
}

View File

@ -48,7 +48,11 @@ class SettingsController extends State<Settings> {
final matrix = Matrix.of(context);
final success = await showFutureLoadingDialog(
context: context,
future: () => matrix.client.setDisplayName(matrix.client.userID!, input),
future: () => matrix.client.setProfileField(
matrix.client.userID!,
'displayname',
{ 'displayname': input }
),
);
if (success.error == null) {
updateProfile();

View File

@ -76,6 +76,14 @@ class SettingsSecurityView extends StatelessWidget {
),
),
),
SettingsSwitchListTile.adaptive(
title: L10n.of(context).cleanExif,
subtitle:
L10n.of(context).cleanExifDescription,
onChanged: (b) => AppConfig.cleanExif = b,
storeKey: SettingKeys.cleanExif,
defaultValue: AppConfig.cleanExif,
),
SettingsSwitchListTile.adaptive(
title: L10n.of(context).sendTypingNotifications,
subtitle:

135
lib/utils/clean_exif.dart Normal file
View File

@ -0,0 +1,135 @@
import 'dart:typed_data';
import 'package:image/image.dart';
class ExifCleaner {
static List<int> removeExifData(List<int> imageBytes) {
// Decode the image (this strips EXIF data)
final Image? image = decodeImage(Uint8List.fromList(imageBytes));
if (image == null) {
throw Exception('Failed to decode image');
}
// Encode back to bytes without EXIF based on detected format
List<int> cleanedBytes;
image.exif.clear();
if (_isJpeg(imageBytes)) {
cleanedBytes = encodeJpg(image);
} else if (_isPng(imageBytes)) {
cleanedBytes = encodePng(image);
} else if (_isGif(imageBytes)) {
cleanedBytes = encodeGif(image);
} else if (_isBmp(imageBytes)) {
cleanedBytes = encodeBmp(image);
} else if (_isTiff(imageBytes)) {
// TIFF doesn't have a direct encoder in image package, convert to PNG
cleanedBytes = encodeTiff(image);
} else if (_isHeic(imageBytes)) {
// HEIC format - convert to JPEG since image package doesn't have HEIC encoder
cleanedBytes = encodeJpg(image);
} else {
// Default fallback - try to encode as PNG, then JPEG
try {
cleanedBytes = encodePng(image);
} catch (e) {
cleanedBytes = encodeJpg(image);
}
}
return cleanedBytes;
}
static bool _isJpeg(List<int> bytes) {
return bytes.length >= 2 && bytes[0] == 0xFF && bytes[1] == 0xD8;
}
static bool _isPng(List<int> bytes) {
return bytes.length >= 8 &&
bytes[0] == 0x89 &&
bytes[1] == 0x50 &&
bytes[2] == 0x4E &&
bytes[3] == 0x47;
}
static bool _isGif(List<int> bytes) {
return bytes.length >= 6 &&
bytes[0] == 0x47 && // G
bytes[1] == 0x49 && // I
bytes[2] == 0x46 && // F
bytes[3] == 0x38 && // 8
(bytes[4] == 0x37 || bytes[4] == 0x39) && // 7 or 9
bytes[5] == 0x61; // a
}
static bool _isBmp(List<int> bytes) {
return bytes.length >= 2 &&
bytes[0] == 0x42 && // B
bytes[1] == 0x4D; // M
}
static bool _isTiff(List<int> bytes) {
return bytes.length >= 4 &&
((bytes[0] == 0x49 && bytes[1] == 0x49 && bytes[2] == 0x2A && bytes[3] == 0x00) || // Little Endian
(bytes[0] == 0x4D && bytes[1] == 0x4D && bytes[2] == 0x00 && bytes[3] == 0x2A)); // Big Endian
}
static bool _isWebP(List<int> bytes) {
return bytes.length >= 12 &&
bytes[0] == 0x52 && // R
bytes[1] == 0x49 && // I
bytes[2] == 0x46 && // F
bytes[3] == 0x46 && // F
bytes[8] == 0x57 && // W
bytes[9] == 0x45 && // E
bytes[10] == 0x42 && // B
bytes[11] == 0x50; // P
}
static bool _isHeic(List<int> bytes) {
// HEIC files start with 'ftyp' at position 4
if (bytes.length < 12) return false;
// Check for 'ftyp' at position 4
bool hasFtyp = bytes[4] == 0x66 && // f
bytes[5] == 0x74 && // t
bytes[6] == 0x79 && // y
bytes[7] == 0x70; // p
if (!hasFtyp) return false;
// Check for HEIC brand variants
List<List<int>> heicBrands = [
[0x68, 0x65, 0x69, 0x63], // heic
[0x68, 0x65, 0x69, 0x78], // heix
[0x68, 0x65, 0x76, 0x63], // hevc
[0x68, 0x65, 0x76, 0x78], // hevx
[0x6D, 0x69, 0x66, 0x31], // mif1
[0x6D, 0x73, 0x66, 0x31], // msf1
];
for (var brand in heicBrands) {
if (bytes[8] == brand[0] &&
bytes[9] == brand[1] &&
bytes[10] == brand[2] &&
bytes[11] == brand[3]) {
return true;
}
}
return false;
}
// Utility method to get image format name
static String getImageFormat(List<int> bytes) {
if (_isJpeg(bytes)) return 'JPEG';
if (_isPng(bytes)) return 'PNG';
if (_isGif(bytes)) return 'GIF';
if (_isBmp(bytes)) return 'BMP';
if (_isTiff(bytes)) return 'TIFF';
if (_isWebP(bytes)) return 'WebP';
if (_isHeic(bytes)) return 'HEIC';
return 'Unknown';
}
}

View File

@ -146,6 +146,9 @@ class MatrixLocals extends MatrixLocalizations {
return l10n.groupWith(displayname);
}
@override
String get refreshingLastEvent => l10n.loadingPleaseWait;
@override
String get guestsAreForbidden => l10n.guestsAreForbidden;

View File

@ -23,7 +23,7 @@ import just_audio
import package_info_plus
import pasteboard
import path_provider_foundation
import record_darwin
import record_macos
import share_plus
import shared_preferences_foundation
import sqflite_darwin
@ -53,7 +53,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
PasteboardPlugin.register(with: registry.registrar(forPlugin: "PasteboardPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
RecordPlugin.register(with: registry.registrar(forPlugin: "RecordPlugin"))
RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))

View File

@ -37,10 +37,10 @@ packages:
dependency: "direct main"
description:
name: app_links
sha256: "85ed8fc1d25a76475914fff28cc994653bd900bc2c26e4b57a49e097febb54ba"
sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8"
url: "https://pub.dev"
source: hosted
version: "6.4.0"
version: "6.4.1"
app_links_linux:
dependency: transitive
description:
@ -141,10 +141,10 @@ packages:
dependency: transitive
description:
name: build_cli_annotations
sha256: b59d2769769efd6c9ff6d4c4cede0be115a566afc591705c2040b707534b1172
sha256: e563c2e01de8974566a1998410d3f6f03521788160a02503b0b1f1a46c7b3d95
url: "https://pub.dev"
source: hosted
version: "2.1.0"
version: "2.1.1"
canonical_json:
dependency: transitive
description:
@ -181,10 +181,10 @@ packages:
dependency: "direct main"
description:
name: chewie
sha256: "4d9554a8f87cc2dc6575dfd5ad20a4375015a29edd567fd6733febe6365e2566"
sha256: "44bcfc5f0dfd1de290c87c9d86a61308b3282a70b63435d5557cfd60f54a69ca"
url: "https://pub.dev"
source: hosted
version: "1.11.3"
version: "1.13.0"
cli_config:
dependency: transitive
description:
@ -245,10 +245,10 @@ packages:
dependency: transitive
description:
name: coverage
sha256: aa07dbe5f2294c827b7edb9a87bba44a9c15a3cc81bc8da2ca19b37322d30080
sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d"
url: "https://pub.dev"
source: hosted
version: "1.14.1"
version: "1.15.0"
cross_file:
dependency: "direct main"
description:
@ -285,10 +285,10 @@ packages:
dependency: transitive
description:
name: dart_webrtc
sha256: "5b76fd85ac95d6f5dee3e7d7de8d4b51bfbec1dc73804647c6aebb52d6297116"
sha256: "51bcda4ba5d7dd9e65a309244ce3ac0b58025e6e1f6d7442cee4cd02134ef65f"
url: "https://pub.dev"
source: hosted
version: "1.5.3+hotfix.2"
version: "1.6.0"
dbus:
dependency: transitive
description:
@ -325,10 +325,10 @@ packages:
dependency: transitive
description:
name: device_info_plus_platform_interface
sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2"
sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f
url: "https://pub.dev"
source: hosted
version: "7.0.2"
version: "7.0.3"
dio:
dependency: "direct main"
description:
@ -369,14 +369,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.9.9"
enhanced_enum:
dependency: transitive
description:
name: enhanced_enum
sha256: "074c5a8b9664799ca91e1e8b68003b8694cb19998671cbafd9c7779c13fcdecf"
url: "https://pub.dev"
source: hosted
version: "0.2.4"
fake_async:
dependency: transitive
description:
@ -405,34 +397,34 @@ packages:
dependency: "direct main"
description:
name: file_picker
sha256: "13ba4e627ef24503a465d1d61b32596ce10eb6b8903678d362a528f9939b4aa8"
sha256: f2d9f173c2c14635cc0e9b14c143c49ef30b4934e8d1d274d6206fcb0086a06f
url: "https://pub.dev"
source: hosted
version: "10.2.1"
version: "10.3.3"
file_selector:
dependency: "direct main"
description:
name: file_selector
sha256: "5019692b593455127794d5718304ff1ae15447dea286cdda9f0db2a796a1b828"
sha256: "5f1d15a7f17115038f433d1b0ea57513cc9e29a9d5338d166cb0bef3fa90a7a0"
url: "https://pub.dev"
source: hosted
version: "1.0.3"
version: "1.0.4"
file_selector_android:
dependency: transitive
description:
name: file_selector_android
sha256: "6bba3d590ee9462758879741abc132a19133600dd31832f55627442f1ebd7b54"
sha256: "1ce58b609289551f8ec07265476720e77d19764339cc1d8e4df3c4d34dac6499"
url: "https://pub.dev"
source: hosted
version: "0.5.1+14"
version: "0.5.1+17"
file_selector_ios:
dependency: transitive
description:
name: file_selector_ios
sha256: "94b98ad950b8d40d96fee8fa88640c2e4bd8afcdd4817993bd04e20310f45420"
sha256: fe9f52123af16bba4ad65bd7e03defbbb4b172a38a8e6aaa2a869a0c56a5f5fb
url: "https://pub.dev"
source: hosted
version: "0.5.3+1"
version: "0.5.3+2"
file_selector_linux:
dependency: transitive
description:
@ -445,10 +437,10 @@ packages:
dependency: transitive
description:
name: file_selector_macos
sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711"
sha256: "19124ff4a3d8864fdc62072b6a2ef6c222d55a3404fe14893a3c02744907b60c"
url: "https://pub.dev"
source: hosted
version: "0.9.4+3"
version: "0.9.4+4"
file_selector_platform_interface:
dependency: transitive
description:
@ -620,10 +612,10 @@ packages:
dependency: "direct dev"
description:
name: flutter_native_splash
sha256: "7062602e0dbd29141fb8eb19220b5871ca650be5197ab9c1f193a28b17537bc7"
sha256: "8321a6d11a8d13977fa780c89de8d257cce3d841eecfb7a4cadffcc4f12d82dc"
url: "https://pub.dev"
source: hosted
version: "2.4.4"
version: "2.4.6"
flutter_new_badger:
dependency: "direct main"
description:
@ -644,18 +636,18 @@ packages:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e
sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31
url: "https://pub.dev"
source: hosted
version: "2.0.28"
version: "2.0.30"
flutter_rust_bridge:
dependency: "direct main"
description:
name: flutter_rust_bridge
sha256: b416ff56002789e636244fb4cc449f587656eff995e5a7169457eb0593fcaddb
sha256: "37ef40bc6f863652e865f0b2563ea07f0d3c58d8efad803cc01933a4b2ee067e"
url: "https://pub.dev"
source: hosted
version: "2.10.0"
version: "2.11.1"
flutter_secure_storage:
dependency: "direct main"
description:
@ -730,10 +722,10 @@ packages:
dependency: "direct main"
description:
name: flutter_vodozemac
sha256: "2405ca121b84d1cd83200a14021022e1691b123a23bcefc36adc7740cefbc1f9"
sha256: "54cd3790b6dfdc1afce928f8c46f7eeea9e4f8326f077400894935926f202057"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
version: "0.3.0"
flutter_web_auth_2:
dependency: "direct main"
description:
@ -829,10 +821,10 @@ packages:
dependency: transitive
description:
name: get_it
sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1
sha256: a4292e7cf67193f8e7c1258203104eb2a51ec8b3a04baa14695f4064c144297b
url: "https://pub.dev"
source: hosted
version: "7.7.0"
version: "8.2.0"
glob:
dependency: transitive
description:
@ -925,10 +917,10 @@ packages:
dependency: "direct main"
description:
name: http
sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b"
sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007
url: "https://pub.dev"
source: hosted
version: "1.4.0"
version: "1.5.0"
http_multi_server:
dependency: transitive
description:
@ -957,66 +949,66 @@ packages:
dependency: "direct main"
description:
name: image_picker
sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a"
sha256: "736eb56a911cf24d1859315ad09ddec0b66104bc41a7f8c5b96b4e2620cf5041"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
version: "1.2.0"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb"
sha256: "28f3987ca0ec702d346eae1d90eda59603a2101b52f1e234ded62cff1d5cfa6e"
url: "https://pub.dev"
source: hosted
version: "0.8.12+23"
version: "0.8.13+1"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
version: "3.1.0"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100"
sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e
url: "https://pub.dev"
source: hosted
version: "0.8.12+2"
version: "0.8.13"
image_picker_linux:
dependency: transitive
description:
name: image_picker_linux
sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9"
sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
url: "https://pub.dev"
source: hosted
version: "0.2.1+2"
version: "0.2.2"
image_picker_macos:
dependency: transitive
description:
name: image_picker_macos
sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1"
sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04
url: "https://pub.dev"
source: hosted
version: "0.2.1+2"
version: "0.2.2"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0"
sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665"
url: "https://pub.dev"
source: hosted
version: "2.10.1"
version: "2.11.0"
image_picker_windows:
dependency: transitive
description:
name: image_picker_windows
sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
version: "0.2.2"
import_sorter:
dependency: "direct dev"
description:
@ -1074,10 +1066,10 @@ packages:
dependency: transitive
description:
name: just_audio_platform_interface
sha256: "4cd94536af0219fa306205a58e78d67e02b0555283c1c094ee41e402a14a5c4a"
sha256: "2532c8d6702528824445921c5ff10548b518b13f808c2e34c2fd54793b999a6a"
url: "https://pub.dev"
source: hosted
version: "4.5.0"
version: "4.6.0"
just_audio_web:
dependency: transitive
description:
@ -1154,10 +1146,10 @@ packages:
dependency: transitive
description:
name: logger
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
sha256: a7967e31b703831a893bbc3c3dd11db08126fe5f369b5c648a36f821979f5be3
url: "https://pub.dev"
source: hosted
version: "2.5.0"
version: "2.6.2"
logging:
dependency: transitive
description:
@ -1203,7 +1195,7 @@ packages:
description:
path: "."
ref: main
resolved-ref: "0817bb43f0e34e1f4961b1cfb76111ffcbe188df"
resolved-ref: "58c4cf19d010d9ae193e9df10bd1f8fdf02277b0"
url: "https://git.extera.xyz/OfficialDakari/matrix-dart-sdk.git"
source: git
version: "2.0.1"
@ -1235,10 +1227,10 @@ packages:
dependency: "direct dev"
description:
name: msix
sha256: edde648a8133bf301883c869d19d127049683037c65ff64173ba526ac7a8af2f
sha256: f88033fcb9e0dd8de5b18897cbebbd28ea30596810f4a7c86b12b0c03ace87e5
url: "https://pub.dev"
source: hosted
version: "3.16.9"
version: "3.16.12"
native_imaging:
dependency: "direct main"
description:
@ -1283,18 +1275,18 @@ packages:
dependency: "direct main"
description:
name: package_info_plus
sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191"
sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968"
url: "https://pub.dev"
source: hosted
version: "8.3.0"
version: "8.3.1"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c"
sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
version: "3.2.1"
pana:
dependency: transitive
description:
@ -1331,18 +1323,18 @@ packages:
dependency: transitive
description:
name: path_provider_android
sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9
sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db"
url: "https://pub.dev"
source: hosted
version: "2.2.17"
version: "2.2.18"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
version: "2.4.2"
path_provider_linux:
dependency: transitive
description:
@ -1419,10 +1411,10 @@ packages:
dependency: transitive
description:
name: petitparser
sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646"
sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1"
url: "https://pub.dev"
source: hosted
version: "6.1.0"
version: "7.0.1"
platform:
dependency: transitive
description:
@ -1483,26 +1475,26 @@ packages:
dependency: transitive
description:
name: pool
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d"
url: "https://pub.dev"
source: hosted
version: "1.5.1"
version: "1.5.2"
posix:
dependency: transitive
description:
name: posix
sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62
sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61"
url: "https://pub.dev"
source: hosted
version: "6.0.2"
version: "6.0.3"
pretty_qr_code:
dependency: "direct main"
description:
name: pretty_qr_code
sha256: b078bd5d51956dea4342378af1b092ad962b81bdbb55b10fffce03461da8db74
sha256: "2291db3f68d70a3dcd46c6bd599f30991ae4c02f27f36215fbb3f4865a609259"
url: "https://pub.dev"
source: hosted
version: "3.4.0"
version: "3.5.0"
process:
dependency: transitive
description:
@ -1523,10 +1515,10 @@ packages:
dependency: "direct main"
description:
name: provider
sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84"
sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272"
url: "https://pub.dev"
source: hosted
version: "6.1.5"
version: "6.1.5+1"
pub_semver:
dependency: transitive
description:
@ -1563,10 +1555,10 @@ packages:
dependency: "direct main"
description:
name: qr_code_scanner_plus
sha256: "39696b50d277097ee4d90d4292de36f38c66213a4f5216a06b2bdd2b63117859"
sha256: a0f1ac8e13299b3db2646635f252fe2ec67222b848b24ed34d11052faf080bfa
url: "https://pub.dev"
source: hosted
version: "2.0.10+1"
version: "2.0.12"
qr_image:
dependency: "direct main"
description:
@ -1595,58 +1587,66 @@ packages:
dependency: "direct main"
description:
name: record
sha256: "2e3d56d196abcd69f1046339b75e5f3855b2406fc087e5991f6703f188aa03a6"
sha256: "6bad72fb3ea6708d724cf8b6c97c4e236cf9f43a52259b654efeb6fd9b737f1f"
url: "https://pub.dev"
source: hosted
version: "5.2.1"
version: "6.1.2"
record_android:
dependency: transitive
description:
name: record_android
sha256: "97d7122455f30de89a01c6c244c839085be6b12abca251fc0e78f67fed73628b"
sha256: f05677eeed074898327f890f232f9eb49cd99d1c20d0daaf22b5612f4b2301bb
url: "https://pub.dev"
source: hosted
version: "1.3.3"
record_darwin:
version: "1.4.3"
record_ios:
dependency: transitive
description:
name: record_darwin
sha256: e487eccb19d82a9a39cd0126945cfc47b9986e0df211734e2788c95e3f63c82c
name: record_ios
sha256: "765b42ac1be019b1674ddd809b811fc721fe5a93f7bb1da7803f0d16772fd6d7"
url: "https://pub.dev"
source: hosted
version: "1.2.2"
version: "1.1.4"
record_linux:
dependency: transitive
description:
name: record_linux
sha256: "74d41a9ebb1eb498a38e9a813dd524e8f0b4fdd627270bda9756f437b110a3e3"
sha256: "235b1f1fb84e810f8149cc0c2c731d7d697f8d1c333b32cb820c449bf7bb72d8"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "1.2.1"
record_macos:
dependency: transitive
description:
name: record_macos
sha256: "842ea4b7e95f4dd237aacffc686d1b0ff4277e3e5357865f8d28cd28bc18ed95"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
record_platform_interface:
dependency: transitive
description:
name: record_platform_interface
sha256: "8a575828733d4c3cb5983c914696f40db8667eab3538d4c41c50cbb79e722ef4"
sha256: b0065fdf1ec28f5a634d676724d388a77e43ce7646fb049949f58c69f3fcb4ed
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.4.0"
record_web:
dependency: transitive
description:
name: record_web
sha256: "024c81eb7f51468b1833a3eca8b461c7ca25c04899dba37abe580bb57afd32e4"
sha256: "4f0adf20c9ccafcc02d71111fd91fba1ca7b17a7453902593e5a9b25b74a5c56"
url: "https://pub.dev"
source: hosted
version: "1.1.8"
version: "1.2.0"
record_windows:
dependency: transitive
description:
name: record_windows
sha256: "85a22fc97f6d73ecd67c8ba5f2f472b74ef1d906f795b7970f771a0914167e99"
sha256: "223258060a1d25c62bae18282c16783f28581ec19401d17e56b5205b9f039d78"
url: "https://pub.dev"
source: hosted
version: "1.0.6"
version: "1.0.7"
retry:
dependency: transitive
description:
@ -1715,10 +1715,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_android
sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac"
sha256: bd14436108211b0d4ee5038689a56d4ae3620fd72fd6036e113bf1345bc74d9e
url: "https://pub.dev"
source: hosted
version: "2.4.10"
version: "2.4.13"
shared_preferences_foundation:
dependency: transitive
description:
@ -1856,18 +1856,18 @@ packages:
dependency: transitive
description:
name: sqflite_common
sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b"
sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6"
url: "https://pub.dev"
source: hosted
version: "2.5.5"
version: "2.5.6"
sqflite_common_ffi:
dependency: "direct main"
description:
name: sqflite_common_ffi
sha256: "1f3ef3888d3bfbb47785cc1dda0dc7dd7ebd8c1955d32a9e8e9dae1e38d1c4c1"
sha256: "9faa2fedc5385ef238ce772589f7718c24cdddd27419b609bb9c6f703ea27988"
url: "https://pub.dev"
source: hosted
version: "2.3.5"
version: "2.3.6"
sqflite_darwin:
dependency: transitive
description:
@ -1888,18 +1888,18 @@ packages:
dependency: "direct main"
description:
name: sqlcipher_flutter_libs
sha256: "777c3469ada8fe6b808bd50f1c752cdd2ca1b1f3cf751d434502ead15334f3a5"
sha256: dd1fcc74d5baf3c36ad53e2652b2d06c9f8747494a3ccde0076e88b159dfe622
url: "https://pub.dev"
source: hosted
version: "0.6.6"
version: "0.6.8"
sqlite3:
dependency: transitive
description:
name: sqlite3
sha256: c0503c69b44d5714e6abbf4c1f51a3c3cc42b75ce785f44404765e4635481d38
sha256: "5c225083e72ea56c96d94ba1dd14fb89c8bb7731c8496ee840ab77be9bb67ae2"
url: "https://pub.dev"
source: hosted
version: "2.7.6"
version: "2.9.1"
stack_trace:
dependency: transitive
description:
@ -1952,10 +1952,10 @@ packages:
dependency: transitive
description:
name: synchronized
sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6"
sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0
url: "https://pub.dev"
source: hosted
version: "3.3.1"
version: "3.4.0"
tar:
dependency: transitive
description:
@ -2104,26 +2104,26 @@ packages:
dependency: "direct main"
description:
name: url_launcher
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8
url: "https://pub.dev"
source: hosted
version: "6.3.1"
version: "6.3.2"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79"
sha256: "81777b08c498a292d93ff2feead633174c386291e35612f8da438d6e92c4447e"
url: "https://pub.dev"
source: hosted
version: "6.3.16"
version: "6.3.20"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb"
sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7
url: "https://pub.dev"
source: hosted
version: "6.3.3"
version: "6.3.4"
url_launcher_linux:
dependency: transitive
description:
@ -2136,10 +2136,10 @@ packages:
dependency: transitive
description:
name: url_launcher_macos
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f
url: "https://pub.dev"
source: hosted
version: "3.2.2"
version: "3.2.3"
url_launcher_platform_interface:
dependency: transitive
description:
@ -2200,34 +2200,34 @@ packages:
dependency: transitive
description:
name: video_player_android
sha256: "4a5135754a62dbc827a64a42ef1f8ed72c962e191c97e2d48744225c2b9ebb73"
sha256: "6cfe0b1e102522eda1e139b82bf00602181c5844fd2885340f595fb213d74842"
url: "https://pub.dev"
source: hosted
version: "2.8.7"
version: "2.8.14"
video_player_avfoundation:
dependency: transitive
description:
name: video_player_avfoundation
sha256: "9ee764e5cd2fc1e10911ae8ad588e1a19db3b6aa9a6eb53c127c42d3a3c3f22f"
sha256: f9a780aac57802b2892f93787e5ea53b5f43cc57dc107bee9436458365be71cd
url: "https://pub.dev"
source: hosted
version: "2.7.1"
version: "2.8.4"
video_player_platform_interface:
dependency: transitive
description:
name: video_player_platform_interface
sha256: df534476c341ab2c6a835078066fc681b8265048addd853a1e3c78740316a844
sha256: cf2a1d29a284db648fd66cbd18aacc157f9862d77d2cc790f6f9678a46c1db5a
url: "https://pub.dev"
source: hosted
version: "6.3.0"
version: "6.4.0"
video_player_web:
dependency: transitive
description:
name: video_player_web
sha256: e8bba2e5d1e159d5048c9a491bb2a7b29c535c612bb7d10c1e21107f5bd365ba
sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb"
url: "https://pub.dev"
source: hosted
version: "2.3.5"
version: "2.4.0"
vm_service:
dependency: transitive
description:
@ -2240,34 +2240,34 @@ packages:
dependency: "direct main"
description:
name: vodozemac
sha256: dba14017e042748fb22d270e8ab1d3e46965b89788dd3857dba938ec07571968
sha256: "95cac62ffab94db99e134c8f9aac198f8131a4eed0bed76a6cfc9c72add229b9"
url: "https://pub.dev"
source: hosted
version: "0.2.0"
version: "0.3.0"
wakelock_plus:
dependency: "direct main"
description:
name: wakelock_plus
sha256: a474e314c3e8fb5adef1f9ae2d247e57467ad557fa7483a2b895bc1b421c5678
sha256: "61713aa82b7f85c21c9f4cd0a148abd75f38a74ec645fcb1e446f882c82fd09b"
url: "https://pub.dev"
source: hosted
version: "1.3.2"
version: "1.3.3"
wakelock_plus_platform_interface:
dependency: transitive
description:
name: wakelock_plus_platform_interface
sha256: e10444072e50dbc4999d7316fd303f7ea53d31c824aa5eb05d7ccbdd98985207
sha256: "036deb14cd62f558ca3b73006d52ce049fabcdcb2eddfe0bf0fe4e8a943b5cf2"
url: "https://pub.dev"
source: hosted
version: "1.2.3"
version: "1.3.0"
watcher:
dependency: transitive
description:
name: watcher
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.4"
web:
dependency: transitive
description:
@ -2312,10 +2312,10 @@ packages:
dependency: "direct main"
description:
name: webrtc_interface
sha256: "86fe3afc81a08481dfb25cf14a5a94e27062ecef25544783f352c914e0bbc1ca"
sha256: "2e604a31703ad26781782fb14fa8a4ee621154ee2c513d2b9938e486fa695233"
url: "https://pub.dev"
source: hosted
version: "1.2.2+hotfix.2"
version: "1.3.0"
win32:
dependency: "direct overridden"
description:
@ -2360,10 +2360,10 @@ packages:
dependency: transitive
description:
name: xml
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025"
url: "https://pub.dev"
source: hosted
version: "6.5.0"
version: "6.6.1"
yaml:
dependency: transitive
description:
@ -2374,4 +2374,4 @@ packages:
version: "3.1.3"
sdks:
dart: ">=3.8.0 <4.0.0"
flutter: ">=3.29.0"
flutter: ">=3.32.0"

View File

@ -47,7 +47,7 @@ dependencies:
git:
url: https://github.com/famedly/flutter_typeahead.git
ref: main
flutter_vodozemac: ^0.2.2
flutter_vodozemac: ^0.3.0
flutter_web_auth_2: ^3.1.1 # Version 4 blocked by https://github.com/MixinNetwork/flutter-plugins/issues/379
flutter_webrtc: ^0.12.9
geolocator: ^13.0.1
@ -57,7 +57,7 @@ dependencies:
hive_flutter: ^1.1.0
html: ^0.15.4
http: ^1.2.0
image: ^4.1.7
image: ^4.5.4
image_picker: ^1.1.0
intl: ^0.20.2
just_audio: ^0.9.39
@ -82,7 +82,7 @@ dependencies:
qr_code_scanner_plus: ^2.0.10+1
qr_image: ^1.0.0
receive_sharing_intent: ^1.8.1
record: ^5.1.2
record: ^6.1.1
scroll_to_index: ^3.0.1
share_plus: ^10.0.2
shared_preferences: ^2.2.0 # Pinned because https://github.com/flutter/flutter/issues/118401
@ -97,7 +97,7 @@ dependencies:
url_launcher: ^6.2.5
video_compress: ^3.1.4
video_player: ^2.9.2
vodozemac: ^0.2.0
vodozemac: ^0.3.0
wakelock_plus: ^1.2.2
webrtc_interface: ^1.0.13
dio: ^5.9.0