fluffychat merge

This commit is contained in:
ggurdin 2026-02-05 12:27:25 -05:00
commit 6935a9ff74
No known key found for this signature in database
GPG key ID: A01CB41737CBB478
6 changed files with 11095 additions and 11061 deletions

View file

@ -26,7 +26,7 @@ More information is available at: [https://pub.dev/packages/sqflite](https://pub
## <a id="encryption" href="#encryption">#</a> Encryption
All communication of substantive content between Fluffychat and any server is done in secure way, using transport encryption to protect it.
FluffyChat also uses End-To-End-Encryption by using [libolm](https://gitlab.matrix.org/matrix-org/olm) and enables it by default for private chats.
FluffyChat also uses End-To-End-Encryption by using [Vodozemac](https://github.com/matrix-org/vodozemac) and enables it by default for private chats.
## <a id="app-permissions" href="#app-permissions">#</a> App Permissions
@ -59,7 +59,7 @@ FluffyChat uses the Firebase Cloud Messaging service for push notifications on A
4. The device receives the push notification from Firebase Cloud Messaging and displays it as a notification
The source code of the push gateway can be viewed here:
[https://gitlab.com/famedly/services/famedly-push-gateway](https://gitlab.com/famedly/services/famedly-push-gateway)
[https://github.com/krille-chan/fluffygate](https://github.com/krille-chan/fluffygate)
`event_id_only` is used as the format for the push notification. A typical push notification therefore only contains:
- Event ID

View file

@ -432,6 +432,70 @@
}
}
},
"changedTheProfileAvatar": "Ο χρήστης {username} άλλαξε την εικόνα προφίλ του",
"@changedTheProfileAvatar": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"changePassword": "Αλλαγή κωδικού πρόσβασης",
"@changePassword": {
"type": "String",
"placeholders": {}
},
"changeTheme": "Άλλαξε το στυλ σου",
"@changeTheme": {
"type": "String",
"placeholders": {}
},
"changeYourAvatar": "Αλλαγή εικόνας προφιλ",
"@changeYourAvatar": {
"type": "String",
"placeholders": {}
},
"joinedChats": "Συνδεδεμένες συνομιλίες",
"@joinedChats": {},
"chatBackup": "Αντίγραφο ασφαλείας συνομιλίας",
"chatDetails": "Λεπτομέρειες συνομιλίας",
"@chatDetails": {
"type": "String",
"placeholders": {}
},
"chatHasBeenAddedToThisSpace": "Η συνομιλία προστέθηκε στο δωμάτιο",
"@chatHasBeenAddedToThisSpace": {},
"chats": "Συνομιλίες",
"@chats": {
"type": "String",
"placeholders": {}
},
"chooseAStrongPassword": "Εισάγετε ένα δυνατό κωδικό πρόσβασης",
"@chooseAStrongPassword": {
"type": "String",
"placeholders": {}
},
"close": "Κλείσιμο",
"@close": {
"type": "String",
"placeholders": {}
},
"commandHint_ban": "Αποκλεισμός χρήστη από το δωμάτιο",
"@commandHint_ban": {
"type": "String",
"description": "Usage hint for the command /ban"
},
"commandHint_clearcache": "Εκκαθάριση προσωρινής μνήμης",
"@commandHint_clearcache": {
"type": "String",
"description": "Usage hint for the command /clearcache"
},
"commandHint_invite": "Πρόσκληση αυτού του χρήστη στο δωμάτιο",
"@commandHint_invite": {
"type": "String",
"description": "Usage hint for the command /invite"
},
"@showPassword": {
"type": "String",
"placeholders": {}
@ -479,10 +543,6 @@
},
"commandHint_cuddle": "Στείλτε μια αγκαλιά",
"@commandHint_cuddle": {},
"@chats": {
"type": "String",
"placeholders": {}
},
"@widgetVideo": {
"type": "String",
"placeholders": {}
@ -532,18 +592,10 @@
"type": "String",
"placeholders": {}
},
"@close": {
"type": "String",
"placeholders": {}
},
"@configureChat": {
"type": "String",
"placeholders": {}
},
"@chatHasBeenAddedToThisSpace": {
"type": "String",
"placeholders": {}
},
"@reply": {
"type": "String",
"placeholders": {}
@ -830,10 +882,6 @@
"type": "String",
"placeholders": {}
},
"@changeTheme": {
"type": "String",
"placeholders": {}
},
"@id": {
"type": "String",
"placeholders": {}
@ -1327,10 +1375,6 @@
"type": "String",
"placeholders": {}
},
"@commandHint_clearcache": {
"type": "String",
"description": "Usage hint for the command /clearcache"
},
"@loadingPleaseWait": {
"type": "String",
"placeholders": {}
@ -1542,10 +1586,6 @@
"type": "String",
"placeholders": {}
},
"@chatDetails": {
"type": "String",
"placeholders": {}
},
"@people": {
"type": "String",
"placeholders": {}
@ -1934,14 +1974,6 @@
"type": "String",
"placeholders": {}
},
"@changedTheProfileAvatar": {
"type": "String",
"placeholders": {
"username": {
"type": "String"
}
}
},
"allChats": "Όλες οι συνομιλίες",
"@allChats": {
"type": "String",
@ -2077,10 +2109,6 @@
"type": "String",
"placeholders": {}
},
"@chooseAStrongPassword": {
"type": "String",
"placeholders": {}
},
"@hideUnknownEvents": {
"type": "String",
"placeholders": {}
@ -2388,10 +2416,6 @@
"type": "String",
"placeholders": {}
},
"@commandHint_ban": {
"type": "String",
"description": "Usage hint for the command /ban"
},
"importEmojis": "Εισαγωγή Emojis",
"@importEmojis": {},
"@confirm": {
@ -2509,10 +2533,6 @@
"type": "String",
"placeholders": {}
},
"@commandHint_invite": {
"type": "String",
"description": "Usage hint for the command /invite"
},
"@userSentUnknownEvent": {
"type": "String",
"placeholders": {
@ -2856,10 +2876,6 @@
"type": "String",
"placeholders": {}
},
"@changePassword": {
"type": "String",
"placeholders": {}
},
"@devices": {
"type": "String",
"placeholders": {}
@ -2907,10 +2923,6 @@
"type": "String",
"placeholders": {}
},
"@changeYourAvatar": {
"type": "String",
"placeholders": {}
},
"@sendImage": {
"type": "String",
"placeholders": {}
@ -3039,7 +3051,6 @@
"countChatsAndCountParticipants": "{chats} συνομιλίες και {participants} συμμετέχοντες",
"noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...",
"noChatsFoundHere": "Δεν βρέθηκαν συνομιλίες εδώ ακόμα. Ξεκινήστε μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️",
"joinedChats": "Ενταγμένες συνομιλίες",
"unread": "Ανεγνωσμένα",
"space": "Χώρος",
"spaces": "Χώροι",
@ -3055,34 +3066,21 @@
"changedTheHistoryVisibilityTo": "{username} άλλαξε την ορατότητα ιστορικού σε: {rules}",
"changedTheJoinRules": "{username} άλλαξε τους κανόνες συμμετοχής",
"changedTheJoinRulesTo": "{username} άλλαξε τους κανόνες συμμετοχής σε: {joinRules}",
"changedTheProfileAvatar": "{username} άλλαξε το προφίλ εικόνας του",
"changedTheRoomAliases": "{username} άλλαξε τα ψευδώνυμα του δωματίου",
"changedTheRoomInvitationLink": "{username} άλλαξε τον σύνδεσμο πρόσκλησης",
"changePassword": "Αλλαγή κωδικού πρόσβασης",
"changeTheHomeserver": "Αλλαγή του διακομιστή σπιτιού",
"changeTheme": "Αλλαγή στυλ",
"changeTheNameOfTheGroup": "Αλλαγή ονόματος ομάδας",
"changeYourAvatar": "Αλλαγή προφίλ εικόνας",
"channelCorruptedDecryptError": "Ο κρυπτογραφημένος κώδικας έχει καταστραφεί",
"chat": "Συνομιλία",
"yourChatBackupHasBeenSetUp": "Η δημιουργία αντιγράφων ασφαλείας της συνομιλίας σας έχει ρυθμιστεί.",
"chatBackup": "Αντίγραφο ασφαλείας συνομιλίας",
"chatBackupDescription": "Τα παλιά σας μηνύματα είναι ασφαλή με ένα κλειδί ανάκτησης. Παρακαλώ βεβαιωθείτε ότι δεν το χάνετε.",
"chatDetails": "Λεπτομέρειες συνομιλίας",
"chatHasBeenAddedToThisSpace": "Η συνομιλία έχει προστεθεί σε αυτόν τον χώρο",
"chats": "Συνομιλίες",
"chooseAStrongPassword": "Επιλέξτε έναν ισχυρό κωδικό πρόσβασης",
"clearArchive": "Διαγραφή αρχείου",
"close": "Κλείσιμο",
"commandHint_markasdm": "Σημειώστε ως άμεσο μήνυμα για το δοσμένο ID του Matrix",
"commandHint_markasgroup": "Σημειώστε ως ομάδα",
"commandHint_ban": "Απαγορεύστε τον δοσμένο χρήστη από αυτό το δωμάτιο",
"commandHint_clearcache": "Εκκαθαρίστε την προσωρινή μνήμη",
"commandHint_create": "Δημιουργήστε μια κενή ομαδική συνομιλία\nΧρησιμοποιήστε --no-encryption για να απενεργοποιήσετε την κρυπτογράφηση",
"commandHint_discardsession": "Απορρίψτε τη συνεδρία",
"commandHint_dm": "Ξεκινήστε μια άμεση συνομιλία\nΧρησιμοποιήστε --no-encryption για να απενεργοποιήσετε την κρυπτογράφηση",
"commandHint_html": "Αποστείλετε κείμενο μορφοποιημένο σε HTML",
"commandHint_invite": "Προσκαλέστε τον δοσμένο χρήστη σε αυτό το δωμάτιο",
"commandHint_join": "Ενταχθείτε στο δοσμένο δωμάτιο",
"commandHint_kick": "Αφαιρέστε τον δοσμένο χρήστη από αυτό το δωμάτιο",
"commandHint_leave": "Αφήστε αυτό το δωμάτιο",
@ -4946,10 +4944,6 @@
"type": "String",
"placeholders": {}
},
"@joinedChats": {
"type": "String",
"placeholders": {}
},
"@unread": {
"type": "String",
"placeholders": {}

File diff suppressed because it is too large Load diff

View file

@ -382,7 +382,7 @@
"type": "String",
"placeholders": {}
},
"chatBackupDescription": "Je oude berichten zijn beveiligd met een herstelsleutel. Zorg ervoor dat je deze niet verliest.",
"chatBackupDescription": "Je berichten zijn beveiligd met een herstelsleutel. Zorg ervoor dat je deze niet verliest.",
"@chatBackupDescription": {
"type": "String",
"placeholders": {}
@ -1163,7 +1163,7 @@
"type": "String",
"placeholders": {}
},
"needPantalaimonWarning": "Houd er rekening mee dat je voorlopig Pantalaimon nodig hebt om eind-tot-eindversleuteling te gebruiken.",
"needPantalaimonWarning": "Houd er rekening mee dat je voorlopig Pantalaimon nodig hebt om eind-tot-eind versleuteling te gebruiken.",
"@needPantalaimonWarning": {
"type": "String",
"placeholders": {}
@ -2654,7 +2654,7 @@
"type": "String",
"placeholders": {}
},
"searchChatsRooms": "Zoek naar #chats, @personen...",
"searchChatsRooms": "Zoek #chats, @personen...",
"@searchChatsRooms": {},
"swipeRightToLeftToReply": "Veeg van rechts naar links om te reageren",
"@swipeRightToLeftToReply": {},
@ -2756,7 +2756,7 @@
"@changeGeneralChatSettings": {},
"restricted": "Beperkt",
"@restricted": {},
"searchForUsers": "Zoek naar @personen...",
"searchForUsers": "Zoek @personen...",
"@searchForUsers": {},
"searchMore": "Zoek meer...",
"@searchMore": {},
@ -3487,6 +3487,30 @@
"@thread": {},
"backToMainChat": "Terug naar hoofdchat",
"@backToMainChat": {},
"saveChanges": "Wijzigingen opslaan",
"@saveChanges": {},
"createSticker": "Sticker of emoji maken",
"@createSticker": {},
"useAsSticker": "Gebruik als sticker",
"@useAsSticker": {},
"useAsEmoji": "Gebruik als emoji",
"@useAsEmoji": {},
"stickerPackNameAlreadyExists": "Stickerpakketnaam bestaat al",
"@stickerPackNameAlreadyExists": {},
"newStickerPack": "Nieuw stickerpakket",
"@newStickerPack": {},
"stickerPackName": "Stickerpakketnaam",
"@stickerPackName": {},
"attribution": "Toeschrijving",
"@attribution": {},
"skipChatBackup": "Chatback-up overslaan",
"@skipChatBackup": {},
"skipChatBackupWarning": "Weet je het zeker? Zonder chat back-up verlies je toegang tot je berichten als je van apparaat wisselt.",
"@skipChatBackupWarning": {},
"loadingMessages": "Berichten laden",
"@loadingMessages": {},
"setupChatBackup": "Chatback-up instellen",
"@setupChatBackup": {},
"writeAMessageLangCodes": "Typ in {l1} of {l2}...",
"requests": "Verzoeken",
"holdForInfo": "Klik en houd vast voor woordinformatie.",
@ -3528,7 +3552,6 @@
"updateLanguage": "Mijn talen",
"whatLanguageYouWantToLearn": "Welke taal wil je leren?",
"whatIsYourBaseLanguage": "Wat is jouw brontaal?",
"saveChanges": "Wijzigingen opslaan",
"publicProfileTitle": "Sta toe dat mijn profiel gevonden kan worden in zoekopdrachten",
"publicProfileDesc": "Door deze optie in te schakelen, kunnen andere gebruikers jouw profiel vinden in de wereldwijde zoekbalk en verzoeken sturen om te chatten. Op dat moment kun je kiezen om het verzoek te accepteren of te weigeren.",
"errorDisableIT": "Vertaalhulp is uitgeschakeld.",
@ -4790,10 +4813,6 @@
"type": "String",
"placeholders": {}
},
"@saveChanges": {
"type": "String",
"placeholders": {}
},
"@publicProfileTitle": {
"type": "String",
"placeholders": {}

View file

@ -21,6 +21,7 @@ class _LockScreenState extends State<LockScreen> {
final TextEditingController _textEditingController = TextEditingController();
void tryUnlock(String text) async {
text = text.trim();
setState(() {
_errorText = null;
});
@ -35,7 +36,7 @@ class _LockScreenState extends State<LockScreen> {
return;
}
if (AppLock.of(context).unlock(enteredPin.toString())) {
if (AppLock.of(context).unlock(text)) {
setState(() {
_inputBlocked = false;
_errorText = null;
@ -60,57 +61,59 @@ class _LockScreenState extends State<LockScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(L10n.of(context).pleaseEnterYourPin),
centerTitle: true,
),
extendBodyBehindAppBar: true,
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: ConstrainedBox(
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth,
),
child: ListView(
shrinkWrap: true,
children: [
Center(
child: Image.asset(
'assets/info-logo.png',
width: 256,
),
),
TextField(
controller: _textEditingController,
textInputAction: TextInputAction.done,
keyboardType: TextInputType.number,
obscureText: true,
autofocus: true,
textAlign: TextAlign.center,
readOnly: _inputBlocked,
onChanged: tryUnlock,
onSubmitted: tryUnlock,
style: const TextStyle(fontSize: 40),
inputFormatters: [
LengthLimitingTextInputFormatter(4),
],
decoration: InputDecoration(
errorText: _errorText,
hintText: '****',
suffix: IconButton(
icon: const Icon(Icons.lock_open_outlined),
onPressed: () => tryUnlock(_textEditingController.text),
return ScaffoldMessenger(
child: Scaffold(
appBar: AppBar(
title: Text(L10n.of(context).pleaseEnterYourPin),
centerTitle: true,
),
extendBodyBehindAppBar: true,
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: ConstrainedBox(
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth,
),
child: ListView(
shrinkWrap: true,
children: [
Center(
child: Image.asset(
'assets/info-logo.png',
width: 256,
),
),
),
if (_inputBlocked)
const Padding(
padding: EdgeInsets.all(8.0),
child: LinearProgressIndicator(),
TextField(
controller: _textEditingController,
textInputAction: TextInputAction.done,
keyboardType: TextInputType.number,
obscureText: true,
autofocus: true,
textAlign: TextAlign.center,
readOnly: _inputBlocked,
onChanged: tryUnlock,
onSubmitted: tryUnlock,
style: const TextStyle(fontSize: 40),
inputFormatters: [
LengthLimitingTextInputFormatter(4),
],
decoration: InputDecoration(
errorText: _errorText,
hintText: '****',
suffix: IconButton(
icon: const Icon(Icons.lock_open_outlined),
onPressed: () => tryUnlock(_textEditingController.text),
),
),
),
],
if (_inputBlocked)
const Padding(
padding: EdgeInsets.all(8.0),
child: LinearProgressIndicator(),
),
],
),
),
),
),

View file

@ -9,7 +9,7 @@
# Looking to add descriptions for a new command, but don't know what it does?
# It is likely defined here (in registerDefaultCommands()):
# https://gitlab.com/famedly/company/frontend/famedlysdk/-/blob/main/lib/src/utils/commands_extension.dart
# https://github.com/famedly/matrix-dart-sdk/tree/main/lib/src/utils/commands_extension.dart
echo "\
// This file is auto-generated using scripts/generate_command_hints_glue.sh.