Compare commits

...

19 Commits

Author SHA1 Message Date
Krille-chan
b4fcb5b0d9 chore: Use correct versions of adaptive_dialog 2023-07-14 08:02:47 +00:00
Krille
1911004d05
refactor: Update dependencies 2023-07-13 19:46:16 +09:00
Raatty
5d67564445
Added translation using Weblate (Greek) 2023-07-09 09:42:27 +02:00
Krille
be04c5a46e
design: Adjust open url dialog design a little bit 2023-07-07 12:10:07 +09:00
Farooq Karimi Zadeh
bd7a4c9dfb
Translated using Weblate (Persian)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fa/
2023-07-06 10:52:33 +02:00
Krille
10ee57722e
chore: Enable webrtc for linux again 2023-06-30 19:15:45 +09:00
Malin Errenst
ff5f7ab50e Merge branch 'malin/group-notification-channels' into 'main'
feat: Added grouping to message notification channels

See merge request famedly/fluffychat!1134
2023-06-30 07:55:24 +00:00
Krille
277885a61e
chore: Streamline background gradients 2023-06-29 16:56:15 +09:00
Malin Errenst
6633ebc376
feat: Added grouping to message notification channels 2023-06-29 09:36:08 +02:00
Krille-chan
b2d9986cd3 Merge branch 'braid/cute-events' into 'main'
fix: overflow in cute events

See merge request famedly/fluffychat!1132
2023-06-29 07:13:55 +00:00
Krille-chan
a0b9bb277f Merge branch 'braid/url-launch-copy' into 'main'
feat: add button to copy url in open dialog

See merge request famedly/fluffychat!1133
2023-06-29 07:13:30 +00:00
TheOneWithTheBraid
d381705cdd
feat: add button to copy url in open dialog
Signed-off-by: TheOneWithTheBraid <the-one@with-the-braid.cf>
2023-06-27 14:09:00 +02:00
3820d4264a
Translated using Weblate (Finnish)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fi/
2023-06-26 14:50:25 +02:00
Milo Ivir
cf4e2d3fad
Translated using Weblate (Croatian)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/hr/
2023-06-26 14:50:24 +02:00
josé m
002dc87577
Translated using Weblate (Galician)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/
2023-06-22 07:51:05 +02:00
The one with the braid
922e7ad0ff fix: overflow in cute events
Signed-off-by: The one with the braid <the-one@with-the-braid.cf>
2023-06-21 16:08:20 +02:00
Oğuz Ersen
5d7be8a672
Translated using Weblate (Turkish)
Currently translated at 100.0% (549 of 549 strings)

Translation: FluffyChat/Translations
Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/tr/
2023-06-20 19:50:49 +02:00
Krille-chan
431b357cfa Merge branch 'braid/allow-aarch64-failure' into 'main'
fix: allow aarch64 upload failure

See merge request famedly/fluffychat!1131
2023-06-19 10:35:58 +00:00
TheOneWithTheBraid
2938acf152 fix: allow aarch64 upload failure
Signed-off-by: TheOneWithTheBraid <the-one@with-the-braid.cf>
2023-06-19 12:27:07 +02:00
33 changed files with 8089 additions and 7792 deletions

View File

@ -372,6 +372,7 @@ upload_linux_arm64:
- tar czf package.tar.gz -C build/linux/arm64/release/bundle/ . - tar czf package.tar.gz -C build/linux/arm64/release/bundle/ .
- | - |
curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz curl --fail-with-body --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz
allow_failure: true
upload_windows: upload_windows:
extends: .release extends: .release

1
assets/l10n/intl_el.arb Normal file
View File

@ -0,0 +1 @@
{}

View File

@ -2480,5 +2480,27 @@
"storeInSecureStorageDescription": "کلید بازیابی را در محل ذخیره‌سازی امن این دستگاه ذخیره کنید.", "storeInSecureStorageDescription": "کلید بازیابی را در محل ذخیره‌سازی امن این دستگاه ذخیره کنید.",
"@storeInSecureStorageDescription": {}, "@storeInSecureStorageDescription": {},
"jump": "پرش", "jump": "پرش",
"@jump": {} "@jump": {},
"discover": "کشف کنید",
"@discover": {
"type": "text",
"placeholders": {}
},
"allRooms": "تمام چت‌های گروهی",
"@allRooms": {
"type": "text",
"placeholders": {}
},
"report": "گزارش",
"@report": {},
"openLinkInBrowser": "بازکردن پیوند در مرورگر",
"@openLinkInBrowser": {},
"reportErrorDescription": "اوه نه. اشتباهی رخ داد. لطفا بعدا تلاش کنید. اگر تمایل دارید، می‌توانید این اشکال را با توسعه‌دهندگان گزارش دهید.",
"@reportErrorDescription": {},
"signInWithPassword": "ورود با رمزعبور",
"@signInWithPassword": {},
"continueWith": "ادامه دادن با:",
"@continueWith": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "لطفا بعدا تلاش کنید یا سرور دیگری انتخاب کنید.",
"@pleaseTryAgainLaterOrChooseDifferentServer": {}
} }

View File

@ -1047,7 +1047,7 @@
"type": "text", "type": "text",
"description": "Usage hint for the command /me" "description": "Usage hint for the command /me"
}, },
"compareEmojiMatch": "Vertaile ja varmista emojien olevan samat molemmilla laitteilla:", "compareEmojiMatch": "Vertaa hymiöitä",
"@compareEmojiMatch": { "@compareEmojiMatch": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1111,7 +1111,7 @@
"@commandInvalid": { "@commandInvalid": {
"type": "text" "type": "text"
}, },
"compareNumbersMatch": "Vertaile ja varmista numeroiden olevan samat molemmilla laitteilla:", "compareNumbersMatch": "Vertaa numeroita",
"@compareNumbersMatch": { "@compareNumbersMatch": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -2364,7 +2364,7 @@
"@commandHint_markasgroup": {}, "@commandHint_markasgroup": {},
"whyIsThisMessageEncrypted": "Miksei tätä viestiä voida lukea?", "whyIsThisMessageEncrypted": "Miksei tätä viestiä voida lukea?",
"@whyIsThisMessageEncrypted": {}, "@whyIsThisMessageEncrypted": {},
"noKeyForThisMessage": "Tämä voi tapahtua mikäli viesti lähetettiin ennen sisäänkirjautumistasi tälle laitteelle.\n\nOn myös mahdollista, että lähettäjä on estänyt tämän laitteen tai jokin meni pieleen verkkoyhteyden kanssa.\n\nPystytkö lukemaan viestin toisella istunnolla? Siinä tapauksessa voit siirtää viestin siltä! Mene Asetukset > Laitteet ja varmista, että laitteesi ovat varmistaneet toisensa. Seuraavankerran avatessasi laitteen ja molempien istuntojen ollessa etualalla, avaimet siirretään automaattisesti.\n\nHaluatko varmistaa ettet menetä avaimia uloskirjautuessa tai laitteita vaihtaessa? Varmista avainvarmuuskopion käytössäolo asetuksista.", "noKeyForThisMessage": "Tämä voi tapahtua mikäli viesti lähetettiin ennen sisäänkirjautumistasi tälle laitteelle.\n\nOn myös mahdollista, että lähettäjä on estänyt tämän laitteen tai jokin meni pieleen verkkoyhteyden kanssa.\n\nPystytkö lukemaan viestin toisella istunnolla? Siinä tapauksessa voit siirtää viestin siltä! Mene Asetukset > Laitteet ja varmista, että laitteesi ovat varmistaneet toisensa. Seuraavankerran avatessasi huoneen ja molempien istuntojen ollessa etualalla, avaimet siirretään automaattisesti.\n\nHaluatko varmistaa ettet menetä avaimia uloskirjautuessa tai laitteita vaihtaessa? Varmista avainvarmuuskopion käytössäolo asetuksista.",
"@noKeyForThisMessage": {}, "@noKeyForThisMessage": {},
"commandHint_markasdm": "Merkitse yksityiskeskusteluksi", "commandHint_markasdm": "Merkitse yksityiskeskusteluksi",
"@commandHint_markasdm": {}, "@commandHint_markasdm": {},
@ -2433,5 +2433,73 @@
"hideUnimportantStateEvents": "Piilota ei-niin-tärkeät tilatapahtumat", "hideUnimportantStateEvents": "Piilota ei-niin-tärkeät tilatapahtumat",
"@hideUnimportantStateEvents": {}, "@hideUnimportantStateEvents": {},
"doNotShowAgain": "Älä näytä uudelleen", "doNotShowAgain": "Älä näytä uudelleen",
"@doNotShowAgain": {} "@doNotShowAgain": {},
"fileHasBeenSavedAt": "Tiedosto on tallennettu sijaintiin {path}",
"@fileHasBeenSavedAt": {
"type": "text",
"placeholders": {
"path": {}
}
},
"disableEncryptionWarning": "Turvallisuuden vuoksi et voi poistaa salausta käytöstä huoneista, joissa se on aiemmin otettu käyttöön.",
"@disableEncryptionWarning": {},
"allRooms": "Kaikki ryhmäkeskustelut",
"@allRooms": {
"type": "text",
"placeholders": {}
},
"startFirstChat": "Aloita ensimmäinen keskustelusi",
"@startFirstChat": {},
"newSpaceDescription": "Tilat mahdollistavat keskusteluidesi keräämisen ja yksityisten tai julkisten yhteisöjen rakentamisen.",
"@newSpaceDescription": {},
"deviceKeys": "Laite-avaimet:",
"@deviceKeys": {},
"letsStart": "Aloitetaan",
"@letsStart": {},
"enterInviteLinkOrMatrixId": "Syötä kutsulinkki tai Matrix ID...",
"@enterInviteLinkOrMatrixId": {},
"reopenChat": "Avaa keskustelu uudelleen",
"@reopenChat": {},
"noOtherDevicesFound": "Muita laitteita ei löytynyt",
"@noOtherDevicesFound": {},
"jumpToLastReadMessage": "Hyppää viimeiseen luettuun viestiin",
"@jumpToLastReadMessage": {},
"readUpToHere": "Luettu tähän asti",
"@readUpToHere": {},
"jump": "Hyppää",
"@jump": {},
"openLinkInBrowser": "Avaa linkki selaimessa",
"@openLinkInBrowser": {},
"report": "ilmoita",
"@report": {},
"encryptThisChat": "Salaa tämä keskustelu",
"@encryptThisChat": {},
"endToEndEncryption": "Päästä-päähän salaus",
"@endToEndEncryption": {},
"discover": "Löydä",
"@discover": {
"type": "text",
"placeholders": {}
},
"noBackupWarning": "Varoitus! Ilman avainvarmuuskopion käyttöönottoa menetät pääsyn salattuihin viesteihisi. Suosittelemme ehdottomasti avainvarmuuskopion käyttöönottoa ennen uloskirjautumista.",
"@noBackupWarning": {},
"fileIsTooBigForServer": "Palvelimen mukaan tiedosto on liian suuri lähetettäväksi.",
"@fileIsTooBigForServer": {},
"reportErrorDescription": "Voi ei. Jokin meni pieleen. Yritäthän myöhemmin uudelleen. Halutessasi voit ilmoittaa ongelman kehittäjille.",
"@reportErrorDescription": {},
"wasDirectChatDisplayName": "Tyhjä keskustelu (oli {oldDisplayName})",
"@wasDirectChatDisplayName": {
"type": "text",
"placeholders": {
"oldDisplayName": {}
}
},
"sorryThatsNotPossible": "Anteeksi... se ei ole mahdollista",
"@sorryThatsNotPossible": {},
"signInWithPassword": "Kirjaudu sisään salasanalla",
"@signInWithPassword": {},
"continueWith": "Jatka käyttäen:",
"@continueWith": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "Yritä myöhemmin uudelleen tai valitse toinen palvelin.",
"@pleaseTryAgainLaterOrChooseDifferentServer": {}
} }

View File

@ -23,7 +23,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"activatedEndToEndEncryption": "🔐 {username} activou o cifrado extremo-a-extremo", "activatedEndToEndEncryption": "🔐 {username} activou a cifraxe extremo-a-extremo",
"@activatedEndToEndEncryption": { "@activatedEndToEndEncryption": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -314,7 +314,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"channelCorruptedDecryptError": "O cifrado está corrompido", "channelCorruptedDecryptError": "A cifraxe está estragada",
"@channelCorruptedDecryptError": { "@channelCorruptedDecryptError": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -704,12 +704,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"enableEncryption": "Activar cifrado", "enableEncryption": "Activar cifraxe",
"@enableEncryption": { "@enableEncryption": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"enableEncryptionWarning": "Non poderás desactivar o cifrado posteriormente, tes certeza?", "enableEncryptionWarning": "Non poderás desactivar a cifraxe posteriormente, tes certeza?",
"@enableEncryptionWarning": { "@enableEncryptionWarning": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -719,12 +719,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"encryption": "Cifrado", "encryption": "Cifraxe",
"@encryption": { "@encryption": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"encryptionNotEnabled": "O cifrado non está activado", "encryptionNotEnabled": "A cifraxe non está activada",
"@encryptionNotEnabled": { "@encryptionNotEnabled": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1119,7 +1119,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"needPantalaimonWarning": "Ten en conta que polo de agora precisas Pantalaimon para o cifrado extremo-a-extremo.", "needPantalaimonWarning": "Ten en conta que polo de agora precisas Pantalaimon para a cifraxe extremo-a-extremo.",
"@needPantalaimonWarning": { "@needPantalaimonWarning": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1159,7 +1159,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"noEncryptionForPublicRooms": "Só podes activar o cifrado tan pronto como a sala non sexa públicamente accesible.", "noEncryptionForPublicRooms": "Só podes activar a cifraxe tan pronto como a sala non sexa públicamente accesible.",
"@noEncryptionForPublicRooms": { "@noEncryptionForPublicRooms": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1824,7 +1824,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"unknownEncryptionAlgorithm": "Algoritmo de cifrado descoñecido", "unknownEncryptionAlgorithm": "Algoritmo de cifraxe descoñecido",
"@unknownEncryptionAlgorithm": { "@unknownEncryptionAlgorithm": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -2103,7 +2103,7 @@
"type": "text", "type": "text",
"description": "Usage hint for the command /discardsession" "description": "Usage hint for the command /discardsession"
}, },
"commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar o cifrado", "commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar a cifraxe",
"@commandHint_create": { "@commandHint_create": {
"type": "text", "type": "text",
"description": "Usage hint for the command /create" "description": "Usage hint for the command /create"
@ -2113,7 +2113,7 @@
"type": "text", "type": "text",
"description": "Usage hint for the command /clearcache" "description": "Usage hint for the command /clearcache"
}, },
"commandHint_dm": "Iniciar un chat directo\nUsa --no-encryption para desactivar o cifrado", "commandHint_dm": "Iniciar un chat directo\nUsa --no-encryption para desactivar a cifraxe",
"@commandHint_dm": { "@commandHint_dm": {
"type": "text", "type": "text",
"description": "Usage hint for the command /dm" "description": "Usage hint for the command /dm"
@ -2447,9 +2447,9 @@
"@enterInviteLinkOrMatrixId": {}, "@enterInviteLinkOrMatrixId": {},
"encryptThisChat": "Cifrar esta conversa", "encryptThisChat": "Cifrar esta conversa",
"@encryptThisChat": {}, "@encryptThisChat": {},
"endToEndEncryption": "Cifrado de extremo a extremo", "endToEndEncryption": "Cifraxe de extremo a extremo",
"@endToEndEncryption": {}, "@endToEndEncryption": {},
"disableEncryptionWarning": "Por razóns de seguridade non podes desactivar o cifrado dunha conversa onde foi activado previamente.", "disableEncryptionWarning": "Por razóns de seguridade non podes desactivar a cifraxe dunha conversa onde foi activada previamente.",
"@disableEncryptionWarning": {}, "@disableEncryptionWarning": {},
"sorryThatsNotPossible": "Lamentámolo... iso non é posible", "sorryThatsNotPossible": "Lamentámolo... iso non é posible",
"@sorryThatsNotPossible": {}, "@sorryThatsNotPossible": {},

View File

@ -2503,6 +2503,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"reportErrorDescription": "Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš grešku možeš prijaviti programerima.", "reportErrorDescription": "Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.",
"@reportErrorDescription": {} "@reportErrorDescription": {},
"signInWithPassword": "Prijavi se s lozinkom",
"@signInWithPassword": {},
"continueWith": "Nastavi sa:",
"@continueWith": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "Pokušaj ponovo kasnije ili odaberi jedan drugi poslužitelj.",
"@pleaseTryAgainLaterOrChooseDifferentServer": {}
} }

View File

@ -2490,5 +2490,25 @@
"jump": "Atla", "jump": "Atla",
"@jump": {}, "@jump": {},
"openLinkInBrowser": "Bağlantıyı tarayıcıda aç", "openLinkInBrowser": "Bağlantıyı tarayıcıda aç",
"@openLinkInBrowser": {} "@openLinkInBrowser": {},
"allRooms": "Tüm Grup Sohbetleri",
"@allRooms": {
"type": "text",
"placeholders": {}
},
"discover": "Keşfet",
"@discover": {
"type": "text",
"placeholders": {}
},
"reportErrorDescription": "Olamaz. Bir şeyler yanlış gitti. Lütfen daha sonra tekrar deneyin. İsterseniz hatayı geliştiricilere bildirebilirsiniz.",
"@reportErrorDescription": {},
"report": "bildir",
"@report": {},
"signInWithPassword": "Parola ile oturum aç",
"@signInWithPassword": {},
"continueWith": "Devam et:",
"@continueWith": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "Lütfen daha sonra tekrar deneyin veya farklı bir sunucu seçin.",
"@pleaseTryAgainLaterOrChooseDifferentServer": {}
} }

View File

@ -41,6 +41,22 @@ abstract class FluffyThemes {
titleSmall: fallbackTextStyle, titleSmall: fallbackTextStyle,
); );
static LinearGradient backgroundGradient(
BuildContext context,
int alpha,
) {
final colorScheme = Theme.of(context).colorScheme;
return LinearGradient(
begin: Alignment.topCenter,
colors: [
colorScheme.primaryContainer.withAlpha(alpha),
colorScheme.secondaryContainer.withAlpha(alpha),
colorScheme.tertiaryContainer.withAlpha(alpha),
colorScheme.primaryContainer.withAlpha(alpha),
],
);
}
static const Duration animationDuration = Duration(milliseconds: 250); static const Duration animationDuration = Duration(milliseconds: 250);
static const Curve animationCurve = Curves.easeInOut; static const Curve animationCurve = Curves.easeInOut;

View File

@ -869,8 +869,11 @@ class ChatController extends State<ChatPageWithRoom> {
setState(() => showEmojiPicker = false); setState(() => showEmojiPicker = false);
if (emoji == null) return; if (emoji == null) return;
// make sure we don't send the same emoji twice // make sure we don't send the same emoji twice
if (_allReactionEvents if (_allReactionEvents.any(
.any((e) => e.content['m.relates_to']['key'] == emoji.emoji)) return; (e) => e.content.tryGetMap('m.relates_to')?['key'] == emoji.emoji,
)) {
return;
}
return sendEmojiAction(emoji.emoji); return sendEmojiAction(emoji.emoji);
} }

View File

@ -146,7 +146,6 @@ class ChatView extends StatelessWidget {
); );
} }
final bottomSheetPadding = FluffyThemes.isColumnMode(context) ? 16.0 : 8.0; final bottomSheetPadding = FluffyThemes.isColumnMode(context) ? 16.0 : 8.0;
final colorScheme = Theme.of(context).colorScheme;
return VWidgetGuard( return VWidgetGuard(
onSystemPop: (redirector) async { onSystemPop: (redirector) async {
@ -220,14 +219,9 @@ class ChatView extends StatelessWidget {
else else
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: FluffyThemes.backgroundGradient(
begin: Alignment.topCenter, context,
colors: [ 64,
colorScheme.primaryContainer.withAlpha(64),
colorScheme.secondaryContainer.withAlpha(64),
colorScheme.tertiaryContainer.withAlpha(64),
colorScheme.primaryContainer.withAlpha(64),
],
), ),
), ),
), ),

View File

@ -36,8 +36,6 @@ class _CuteContentState extends State<CuteContent> {
return GestureDetector( return GestureDetector(
onTap: addOverlay, onTap: addOverlay,
child: SizedBox.square(
dimension: 300,
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@ -49,7 +47,6 @@ class _CuteContentState extends State<CuteContent> {
if (label != null) Text(label) if (label != null) Text(label)
], ],
), ),
),
); );
}, },
); );
@ -144,6 +141,7 @@ class _CuteEventOverlayState extends State<CuteEventOverlay>
return SizedBox( return SizedBox(
height: constraints.maxHeight, height: constraints.maxHeight,
width: constraints.maxWidth, width: constraints.maxWidth,
child: OverflowBox(
child: Stack( child: Stack(
alignment: Alignment.bottomLeft, alignment: Alignment.bottomLeft,
fit: StackFit.expand, fit: StackFit.expand,
@ -163,6 +161,7 @@ class _CuteEventOverlayState extends State<CuteEventOverlay>
) )
.toList(), .toList(),
), ),
),
); );
}, },
), ),

View File

@ -61,7 +61,7 @@ class MessageReactions extends StatelessWidget {
final evt = allReactionEvents.firstWhereOrNull( final evt = allReactionEvents.firstWhereOrNull(
(e) => (e) =>
e.senderId == e.room.client.userID && e.senderId == e.room.client.userID &&
e.content['m.relates_to']['key'] == r.key, e.content.tryGetMap('m.relates_to')?['key'] == r.key,
); );
if (evt != null) { if (evt != null) {
showFutureLoadingDialog( showFutureLoadingDialog(

View File

@ -52,7 +52,8 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
final networkUri = _networkUri; final networkUri = _networkUri;
if (kIsWeb && networkUri != null && _chewieManager == null) { if (kIsWeb && networkUri != null && _chewieManager == null) {
_chewieManager ??= ChewieController( _chewieManager ??= ChewieController(
videoPlayerController: VideoPlayerController.network(networkUri), videoPlayerController:
VideoPlayerController.networkUrl(Uri.parse(networkUri)),
autoPlay: true, autoPlay: true,
autoInitialize: true, autoInitialize: true,
); );

View File

@ -183,12 +183,13 @@ class InputBar extends StatelessWidget {
final state = r.getState(EventTypes.RoomCanonicalAlias); final state = r.getState(EventTypes.RoomCanonicalAlias);
if ((state != null && if ((state != null &&
((state.content['alias'] is String && ((state.content['alias'] is String &&
state.content['alias'] state.content
.tryGet<String>('alias')!
.split(':')[0] .split(':')[0]
.toLowerCase() .toLowerCase()
.contains(roomSearch)) || .contains(roomSearch)) ||
(state.content['alt_aliases'] is List && (state.content['alt_aliases'] is List &&
state.content['alt_aliases'].any( (state.content['alt_aliases'] as List).any(
(l) => (l) =>
l is String && l is String &&
l l

View File

@ -52,7 +52,7 @@ class ReactionsPicker extends StatelessWidget {
for (final event in allReactionEvents) { for (final event in allReactionEvents) {
try { try {
emojis.remove(event.content['m.relates_to']['key']); emojis.remove(event.content.tryGetMap('m.relates_to')!['key']);
} catch (_) {} } catch (_) {}
} }
return Row( return Row(

View File

@ -83,7 +83,9 @@ class ChatDetailsController extends State<ChatDetails> {
RequestType.GET, RequestType.GET,
'/client/unstable/org.matrix.msc2432/rooms/${Uri.encodeComponent(room.id)}/aliases', '/client/unstable/org.matrix.msc2432/rooms/${Uri.encodeComponent(room.id)}/aliases',
) )
.then((response) => List<String>.from(response['aliases'])), .then(
(response) => List<String>.from(response['aliases'] as Iterable),
),
); );
// Switch to the stable api once it is implemented. // Switch to the stable api once it is implemented.

View File

@ -73,8 +73,10 @@ class ChatPermissionsSettingsController extends State<ChatPermissionsSettings> {
void updateRoomAction(Capabilities capabilities) async { void updateRoomAction(Capabilities capabilities) async {
final room = Matrix.of(context).client.getRoomById(roomId!)!; final room = Matrix.of(context).client.getRoomById(roomId!)!;
final String roomVersion = final roomVersion = room
room.getState(EventTypes.RoomCreate)!.content['room_version'] ?? '1'; .getState(EventTypes.RoomCreate)!
.content['room_version'] as String? ??
'1';
final newVersion = await showConfirmationDialog<String>( final newVersion = await showConfirmationDialog<String>(
context: context, context: context,
title: L10n.of(context)!.replaceRoomWithNewerVersion, title: L10n.of(context)!.replaceRoomWithNewerVersion,

View File

@ -127,9 +127,9 @@ class ChatPermissionsSettingsView extends StatelessWidget {
), ),
); );
} }
final String roomVersion = room final roomVersion = room
.getState(EventTypes.RoomCreate)! .getState(EventTypes.RoomCreate)!
.content['room_version'] ?? .content['room_version'] as String? ??
'1'; '1';
return ListTile( return ListTile(

View File

@ -109,6 +109,10 @@ class KeyVerificationPageState extends State<KeyVerificationDialog> {
Widget body; Widget body;
final buttons = <Widget>[]; final buttons = <Widget>[];
switch (widget.request.state) { switch (widget.request.state) {
case KeyVerificationState.showQRSuccess:
case KeyVerificationState.confirmQRScan:
case KeyVerificationState.askChoice:
throw 'Not implemented';
case KeyVerificationState.askSSSS: case KeyVerificationState.askSSSS:
// prompt the user for their ssss passphrase / key // prompt the user for their ssss passphrase / key
final textEditingController = TextEditingController(); final textEditingController = TextEditingController();

View File

@ -59,7 +59,7 @@ class NewPrivateChatView extends StatelessWidget {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
QrImage( QrImageView(
data: data:
'https://matrix.to/#/${Matrix.of(context).client.userID}', 'https://matrix.to/#/${Matrix.of(context).client.userID}',
version: QrVersions.auto, version: QrVersions.auto,

View File

@ -151,12 +151,11 @@ class EmotesSettingsController extends State<EmotesSettings> {
bool isGloballyActive(Client? client) => bool isGloballyActive(Client? client) =>
room != null && room != null &&
client!.accountData['im.ponies.emote_rooms']?.content is Map && client!.accountData['im.ponies.emote_rooms']?.content
client.accountData['im.ponies.emote_rooms']!.content['rooms'] is Map && .tryGetMap<String, Object?>('rooms')
client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id] ?.tryGetMap<String, Object?>(room!.id)
is Map && ?.tryGetMap<String, Object?>(stateKey ?? '') !=
client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id] null;
[stateKey ?? ''] is Map;
bool get readonly => bool get readonly =>
room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes')); room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes'));

View File

@ -40,16 +40,14 @@ class MultipleEmotesSettingsView extends StatelessWidget {
itemCount: keys.length, itemCount: keys.length,
itemBuilder: (BuildContext context, int i) { itemBuilder: (BuildContext context, int i) {
final event = packs[keys[i]]; final event = packs[keys[i]];
String? packName = keys[i].isNotEmpty ? keys[i] : 'Default Pack'; final eventPack =
if (event != null && event.content['pack'] is Map) { event?.content.tryGetMap<String, Object?>('pack');
if (event.content['pack']['displayname'] is String) { final packName = eventPack?.tryGet<String>('displayname') ??
packName = event.content['pack']['displayname']; eventPack?.tryGet<String>('name') ??
} else if (event.content['pack']['name'] is String) { (keys[i].isNotEmpty ? keys[i] : 'Default Pack');
packName = event.content['pack']['name'];
}
}
return ListTile( return ListTile(
title: Text(packName!), title: Text(packName),
onTap: () async { onTap: () async {
VRouter.of(context).toSegments( VRouter.of(context).toSegments(
['rooms', room.id, 'details', 'emotes', keys[i]], ['rooms', room.id, 'details', 'emotes', keys[i]],

View File

@ -182,8 +182,12 @@ class MatrixLocals extends MatrixLocalizations {
String get noPermission => l10n.noKeyForThisMessage; String get noPermission => l10n.noKeyForThisMessage;
@override @override
String redactedAnEvent(String senderName) { String redactedAnEvent(Event redactedEvent) {
return l10n.redactedAnEvent(senderName); return l10n.redactedAnEvent(
redactedEvent.redactedBecause?.senderFromMemoryOrFallback
.calcLocalizedBodyFallback(this) ??
l10n.user,
);
} }
@override @override
@ -192,8 +196,10 @@ class MatrixLocals extends MatrixLocalizations {
} }
@override @override
String removedBy(String calcDisplayname) { String removedBy(Event redactedEvent) {
return l10n.removedBy(calcDisplayname); return l10n.removedBy(
redactedEvent.senderFromMemoryOrFallback.calcLocalizedBodyFallback(this),
);
} }
@override @override

View File

@ -198,11 +198,33 @@ Future<void> _tryPushHelper(
final roomName = event.room.getLocalizedDisplayname(MatrixLocals(l10n)); final roomName = event.room.getLocalizedDisplayname(MatrixLocals(l10n));
final notificationGroupId =
event.room.isDirectChat ? 'directChats' : 'groupChats';
final groupName = event.room.isDirectChat ? l10n.directChats : l10n.groups;
final messageRooms = AndroidNotificationChannelGroup(
notificationGroupId,
groupName,
);
final roomsChannel = AndroidNotificationChannel(
event.room.id,
roomName,
groupId: notificationGroupId,
);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannelGroup(messageRooms);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(roomsChannel);
final androidPlatformChannelSpecifics = AndroidNotificationDetails( final androidPlatformChannelSpecifics = AndroidNotificationDetails(
event.room.id, event.room.id,
roomName, roomName,
channelDescription: channelDescription: groupName,
event.room.isDirectChat ? l10n.directChats : l10n.groups,
number: notification.counts?.unread, number: notification.counts?.unread,
category: AndroidNotificationCategory.message, category: AndroidNotificationCategory.message,
styleInformation: messagingStyleInformation ?? styleInformation: messagingStyleInformation ??
@ -215,7 +237,7 @@ Future<void> _tryPushHelper(
ticker: l10n.unreadChats(notification.counts?.unread ?? 1), ticker: l10n.unreadChats(notification.counts?.unread ?? 1),
importance: Importance.max, importance: Importance.max,
priority: Priority.max, priority: Priority.max,
groupKey: event.room.id, groupKey: notificationGroupId,
); );
const iOSPlatformChannelSpecifics = DarwinNotificationDetails(); const iOSPlatformChannelSpecifics = DarwinNotificationDetails();
final platformChannelSpecifics = NotificationDetails( final platformChannelSpecifics = NotificationDetails(

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:collection/collection.dart' show IterableExtension; import 'package:collection/collection.dart' show IterableExtension;
@ -37,14 +38,34 @@ class UrlLauncher {
); );
return; return;
} }
final consent = await showOkCancelAlertDialog( final consent = await showModalActionSheet<_LaunchUrlResponse>(
context: context, context: context,
title: L10n.of(context)!.openLinkInBrowser, title: url,
message: url, style: AdaptiveStyle.material,
okLabel: L10n.of(context)!.ok, actions: [
cancelLabel: L10n.of(context)!.cancel, SheetAction(
key: _LaunchUrlResponse.copy,
icon: Icons.copy_outlined,
label: L10n.of(context)!.copy,
),
SheetAction(
key: _LaunchUrlResponse.launch,
icon: Icons.launch_outlined,
label: L10n.of(context)!.openLinkInBrowser,
),
],
); );
if (consent != OkCancelResult.ok) return; if (consent == _LaunchUrlResponse.copy) {
await Clipboard.setData(ClipboardData(text: uri.toString()));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(L10n.of(context)!.copiedToClipboard),
),
);
return;
}
if (consent != _LaunchUrlResponse.launch) return;
if (!{'https', 'http'}.contains(uri.scheme)) { if (!{'https', 'http'}.contains(uri.scheme)) {
// just launch non-https / non-http uris directly // just launch non-https / non-http uris directly
@ -215,3 +236,8 @@ class UrlLauncher {
} }
} }
} }
enum _LaunchUrlResponse {
launch,
copy,
}

View File

@ -48,18 +48,9 @@ class LoginScaffold extends StatelessWidget {
: null, : null,
); );
if (isMobileMode) return scaffold; if (isMobileMode) return scaffold;
final colorScheme = Theme.of(context).colorScheme;
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: FluffyThemes.backgroundGradient(context, 156),
begin: Alignment.topCenter,
colors: [
colorScheme.primaryContainer.withAlpha(64),
colorScheme.secondaryContainer.withAlpha(64),
colorScheme.tertiaryContainer.withAlpha(64),
colorScheme.primaryContainer.withAlpha(64),
],
),
), ),
child: Column( child: Column(
children: [ children: [

View File

@ -10,7 +10,9 @@
#include <desktop_lifecycle/desktop_lifecycle_plugin.h> #include <desktop_lifecycle/desktop_lifecycle_plugin.h>
#include <dynamic_color/dynamic_color_plugin.h> #include <dynamic_color/dynamic_color_plugin.h>
#include <emoji_picker_flutter/emoji_picker_flutter_plugin.h> #include <emoji_picker_flutter/emoji_picker_flutter_plugin.h>
#include <file_selector_linux/file_selector_plugin.h>
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h> #include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <handy_window/handy_window_plugin.h> #include <handy_window/handy_window_plugin.h>
#include <record_linux/record_linux_plugin.h> #include <record_linux/record_linux_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h> #include <url_launcher_linux/url_launcher_plugin.h>
@ -29,9 +31,15 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar = g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin");
emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar); emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar);
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin");
flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);
g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin");
flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar);
g_autoptr(FlPluginRegistrar) handy_window_registrar = g_autoptr(FlPluginRegistrar) handy_window_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin");
handy_window_plugin_register_with_registrar(handy_window_registrar); handy_window_plugin_register_with_registrar(handy_window_registrar);

View File

@ -7,7 +7,9 @@ list(APPEND FLUTTER_PLUGIN_LIST
desktop_lifecycle desktop_lifecycle
dynamic_color dynamic_color
emoji_picker_flutter emoji_picker_flutter
file_selector_linux
flutter_secure_storage_linux flutter_secure_storage_linux
flutter_webrtc
handy_window handy_window
record_linux record_linux
url_launcher_linux url_launcher_linux

View File

@ -12,6 +12,7 @@ import desktop_lifecycle
import device_info_plus import device_info_plus
import dynamic_color import dynamic_color
import emoji_picker_flutter import emoji_picker_flutter
import file_selector_macos
import flutter_app_badger import flutter_app_badger
import flutter_local_notifications import flutter_local_notifications
import flutter_secure_storage_macos import flutter_secure_storage_macos
@ -19,15 +20,18 @@ import flutter_web_auth_2
import flutter_webrtc import flutter_webrtc
import geolocator_apple import geolocator_apple
import just_audio import just_audio
import macos_ui
import macos_window_utils
import package_info_plus import package_info_plus
import path_provider_foundation import path_provider_foundation
import record_macos import record_macos
import share_plus import share_plus
import shared_preferences_macos import shared_preferences_foundation
import sqflite import sqflite
import url_launcher_macos import url_launcher_macos
import video_compress import video_compress
import wakelock_macos import wakelock_macos
import wakelock_plus
import window_to_front import window_to_front
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
@ -38,6 +42,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FlutterAppBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterAppBadgerPlugin")) FlutterAppBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterAppBadgerPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
@ -45,6 +50,8 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin"))
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin"))
MacOSUiPlugin.register(with: registry.registrar(forPlugin: "MacOSUiPlugin"))
MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin"))
FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin")) RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin"))
@ -54,5 +61,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin")) VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin"))
WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin"))
WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin")) WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin"))
} }

File diff suppressed because it is too large Load Diff

View File

@ -7,19 +7,19 @@ environment:
sdk: ">=3.0.0 <4.0.0" sdk: ">=3.0.0 <4.0.0"
dependencies: dependencies:
adaptive_dialog: ^1.9.0-no-macos.2 adaptive_dialog: ^1.9.0-x-macos-beta.1
animations: ^2.0.7 animations: ^2.0.7
badges: ^2.0.3 badges: ^2.0.3
blurhash_dart: ^1.1.0 blurhash_dart: ^1.1.0
callkeep: ^0.3.2 callkeep: ^0.3.2
chewie: ^1.3.6 chewie: ^1.3.6
collection: ^1.16.0 collection: ^1.16.0
connectivity_plus: ^3.0.2 connectivity_plus: ^4.0.1
cupertino_icons: any cupertino_icons: any
desktop_drop: ^0.4.0 desktop_drop: ^0.4.0
desktop_lifecycle: ^0.1.0 desktop_lifecycle: ^0.1.0
desktop_notifications: ^0.6.3 desktop_notifications: ^0.6.3
device_info_plus: ^8.0.0 device_info_plus: ^9.0.2
dynamic_color: ^1.6.0 dynamic_color: ^1.6.0
emoji_picker_flutter: ^1.5.1 emoji_picker_flutter: ^1.5.1
emoji_proposal: ^0.0.1 emoji_proposal: ^0.0.1
@ -32,37 +32,37 @@ dependencies:
flutter_app_lock: ^3.0.0 flutter_app_lock: ^3.0.0
flutter_blurhash: ^0.7.0 flutter_blurhash: ^0.7.0
flutter_cache_manager: ^3.3.0 flutter_cache_manager: ^3.3.0
flutter_foreground_task: ^3.10.0 flutter_foreground_task: ^6.0.0+1
flutter_highlighter: ^0.1.1 flutter_highlighter: ^0.1.1
flutter_html: ^3.0.0-beta.2 flutter_html: ^3.0.0-beta.2
flutter_html_table: ^3.0.0-beta.2 flutter_html_table: ^3.0.0-beta.2
flutter_linkify: ^6.0.0 flutter_linkify: ^6.0.0
flutter_local_notifications: ^12.0.2 flutter_local_notifications: ^15.1.0+1
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
flutter_map: ^3.1.0 flutter_map: ^4.0.0
flutter_math_fork: ^0.7.1 flutter_math_fork: ^0.7.1
flutter_olm: ^1.2.0 flutter_olm: ^1.2.0
flutter_openssl_crypto: ^0.1.0 flutter_openssl_crypto: ^0.1.0
flutter_ringtone_player: ^3.1.1 flutter_ringtone_player: ^3.1.1
flutter_secure_storage: ^7.0.1 flutter_secure_storage: ^8.0.0
flutter_typeahead: ^4.3.2 flutter_typeahead: ^4.3.2
flutter_web_auth_2: ^2.1.1 flutter_web_auth_2: ^2.1.1
flutter_webrtc: ^0.9.30+hotfix.2 flutter_webrtc: ^0.9.35
future_loading_dialog: ^0.2.3 future_loading_dialog: ^0.2.3
geolocator: ^7.6.2 geolocator: ^7.6.2
handy_window: ^0.1.9 handy_window: ^0.3.1
hive: ^2.2.3 hive: ^2.2.3
hive_flutter: ^1.1.0 hive_flutter: ^1.1.0
http: ^0.13.4 http: ^0.13.4
image_picker: ^0.8.4+8 image_picker: ^1.0.0
intl: any intl: any
just_audio: ^0.9.30 just_audio: ^0.9.30
just_audio_mpv: ^0.1.6 just_audio_mpv: ^0.1.6
keyboard_shortcuts: ^0.1.4 keyboard_shortcuts: ^0.1.4
latlong2: ^0.8.1 latlong2: ^0.8.1
linkify: ^5.0.0 linkify: ^5.0.0
matrix: ^0.20.5 matrix: ^0.22.0
matrix_homeserver_recommendations: ^0.3.0 matrix_homeserver_recommendations: ^0.3.0
native_imaging: ^0.1.0 native_imaging: ^0.1.0
package_info_plus: ^4.0.0 package_info_plus: ^4.0.0
@ -77,12 +77,12 @@ dependencies:
record: ^4.4.4 record: ^4.4.4
scroll_to_index: ^3.0.1 scroll_to_index: ^3.0.1
share_plus: ^7.0.0 share_plus: ^7.0.0
shared_preferences: 2.0.15 # Pinned because https://github.com/flutter/flutter/issues/118401 shared_preferences: ^2.2.0 # Pinned because https://github.com/flutter/flutter/issues/118401
slugify: ^2.0.0 slugify: ^2.0.0
swipe_to_action: ^0.2.0 swipe_to_action: ^0.2.0
tor_detector_web: ^1.1.0 tor_detector_web: ^1.1.0
uni_links: ^0.5.1 uni_links: ^0.5.1
unifiedpush: ^4.0.3 unifiedpush: ^5.0.0
universal_html: ^2.0.8 universal_html: ^2.0.8
url_launcher: ^6.0.20 url_launcher: ^6.0.20
vibration: ^1.7.4-nullsafety.0 vibration: ^1.7.4-nullsafety.0
@ -93,7 +93,7 @@ dependencies:
webrtc_interface: ^1.0.13 webrtc_interface: ^1.0.13
dev_dependencies: dev_dependencies:
dart_code_metrics: ^4.10.1 dart_code_metrics: ^5.7.5
flutter_lints: ^2.0.1 flutter_lints: ^2.0.1
flutter_native_splash: ^2.0.3+1 flutter_native_splash: ^2.0.3+1
flutter_test: flutter_test:
@ -153,8 +153,6 @@ dependency_overrides:
git: git:
url: https://gitlab.com/TheOneWithTheBraid/flutter_secure_storage_windows.git url: https://gitlab.com/TheOneWithTheBraid/flutter_secure_storage_windows.git
ref: main ref: main
flutter_webrtc:
git: https://github.com/krille-chan/flutter-webrtc.git
geolocator_android: geolocator_android:
hosted: hosted:
name: geolocator_android name: geolocator_android

View File

@ -11,6 +11,7 @@
#include <desktop_lifecycle/desktop_lifecycle_plugin.h> #include <desktop_lifecycle/desktop_lifecycle_plugin.h>
#include <dynamic_color/dynamic_color_plugin_c_api.h> #include <dynamic_color/dynamic_color_plugin_c_api.h>
#include <emoji_picker_flutter/emoji_picker_flutter_plugin_c_api.h> #include <emoji_picker_flutter/emoji_picker_flutter_plugin_c_api.h>
#include <file_selector_windows/file_selector_windows.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h> #include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h> #include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <record_windows/record_windows_plugin_c_api.h> #include <record_windows/record_windows_plugin_c_api.h>
@ -29,6 +30,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
EmojiPickerFlutterPluginCApiRegisterWithRegistrar( EmojiPickerFlutterPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi")); registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi"));
FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows"));
FlutterWebRTCPluginRegisterWithRegistrar( FlutterWebRTCPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); registry->GetRegistrarForPlugin("FlutterWebRTCPlugin"));
PermissionHandlerWindowsPluginRegisterWithRegistrar( PermissionHandlerWindowsPluginRegisterWithRegistrar(

View File

@ -8,6 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
desktop_lifecycle desktop_lifecycle
dynamic_color dynamic_color
emoji_picker_flutter emoji_picker_flutter
file_selector_windows
flutter_webrtc flutter_webrtc
permission_handler_windows permission_handler_windows
record_windows record_windows