Merge commit 'bd1508c54547936a7f96082b7f21a7eddfd9d34f' into yiffed

This commit is contained in:
Inex Code 2020-10-06 22:16:52 +03:00
commit 73e3c85626
19 changed files with 369 additions and 158 deletions

1
.gitignore vendored
View file

@ -3,6 +3,7 @@
*.log *.log
*.pyc *.pyc
*.swp *.swp
*.snap
.DS_Store .DS_Store
.atom/ .atom/
.buildlog/ .buildlog/

View file

@ -181,3 +181,37 @@ pages:
- public - public
only: only:
- main - main
build_linux:
stage: coverage
image: registry.gitlab.com/famedly/containers/flutter-dockerimages:dev
dependencies: []
script:
- sudo apt update
- sudo apt install clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev
- flutter config --enable-linux-desktop
- flutter pub get
- flutter build linux --release
artifacts:
when: on_success
paths:
- build/linux/release/bundle/
only:
- main
snap:publish:
stage: publish
image: "cibuilds/snapcraft:core18"
only:
- tags
script:
- snapcraft
- echo $SNAPCRAFT_LOGIN_FILE | base64 --decode --ignore-garbage > snapcraft.login
- snapcraft login --with snapcraft.login
- snapcraft push --release=stable *.snap
- snapcraft logout
artifacts:
paths:
- './*.snap'
when: on_success
expire_in: 1 week

View file

@ -2,6 +2,9 @@
### Features ### Features
- Add ability to enable / disable emotes globally - Add ability to enable / disable emotes globally
- Add ability to manage emote packs with different state keys - Add ability to manage emote packs with different state keys
### Fixes
- Fix amoled / theme settings not always saving properly
- Show device name in account information correctly
# Version 0.19.0 - 2020-09-21 # Version 0.19.0 - 2020-09-21
### Features ### Features

View file

@ -17,7 +17,7 @@ class StatusListItem extends StatelessWidget {
future: client.getProfileFromUserId(status.userId), future: client.getProfileFromUserId(status.userId),
builder: (context, snapshot) { builder: (context, snapshot) {
final profile = final profile =
snapshot.data ?? Profile(client.userID, Uri.parse('')); snapshot.data ?? Profile(status.userId.localpart, null);
return InkWell( return InkWell(
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
onTap: () => Navigator.of(context).push( onTap: () => Navigator.of(context).push(

View file

@ -21,6 +21,7 @@ import '../utils/beautify_string_extension.dart';
import '../utils/famedlysdk_store.dart'; import '../utils/famedlysdk_store.dart';
import '../utils/presence_extension.dart'; import '../utils/presence_extension.dart';
import '../views/key_verification.dart'; import '../views/key_verification.dart';
import '../utils/platform_infos.dart';
import 'avatar.dart'; import 'avatar.dart';
class Matrix extends StatefulWidget { class Matrix extends StatefulWidget {
@ -211,7 +212,7 @@ class MatrixState extends State<Matrix> {
final Set verificationMethods = <KeyVerificationMethod>{ final Set verificationMethods = <KeyVerificationMethod>{
KeyVerificationMethod.numbers KeyVerificationMethod.numbers
}; };
if (!kIsWeb) { if (PlatformInfos.isMobile) {
// emojis don't show in web somehow // emojis don't show in web somehow
verificationMethods.add(KeyVerificationMethod.emoji); verificationMethods.add(KeyVerificationMethod.emoji);
} }

View file

@ -176,8 +176,9 @@ class ThemeSwitcherWidgetState extends State<ThemeSwitcherWidget> {
Future loadSelection(MatrixState matrix) async { Future loadSelection(MatrixState matrix) async {
String item = await matrix.store.getItem('theme') ?? 'light'; String item = await matrix.store.getItem('theme') ?? 'light';
selectedTheme = selectedTheme = Themes.values.firstWhere(
Themes.values.firstWhere((e) => e.toString() == 'Themes.' + item); (e) => e.toString() == 'Themes.' + item,
orElse: () => Themes.system);
amoledEnabled = (await matrix.store.getItem('amoled_enabled') ?? 'false') amoledEnabled = (await matrix.store.getItem('amoled_enabled') ?? 'false')
.toLowerCase() == .toLowerCase() ==
@ -240,26 +241,6 @@ class ThemeSwitcherWidgetState extends State<ThemeSwitcherWidget> {
void setup() async { void setup() async {
final matrix = Matrix.of(context); final matrix = Matrix.of(context);
await loadSelection(matrix); await loadSelection(matrix);
if (selectedTheme == null) {
switchTheme(matrix, Themes.light, false);
} else {
switch (selectedTheme) {
case Themes.light:
switchTheme(matrix, Themes.light, false);
break;
case Themes.dark:
if (amoledEnabled) {
switchTheme(matrix, Themes.dark, true);
} else {
switchTheme(matrix, Themes.dark, false);
}
break;
case Themes.system:
switchTheme(matrix, Themes.system, false);
break;
}
}
} }
@override @override

View file

@ -23,7 +23,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"accountInformation": "Account informations", "accountInformation": "Account information",
"@accountInformation": { "@accountInformation": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -159,6 +159,11 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"changeDeviceName": "Change device name",
"@changeDeviceName": {
"type": "text",
"placeholders": {}
},
"changedTheChatAvatar": "{username} changed the chat avatar", "changedTheChatAvatar": "{username} changed the chat avatar",
"@changedTheChatAvatar": { "@changedTheChatAvatar": {
"type": "text", "type": "text",
@ -1207,7 +1212,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"sentryInfo": "Informations about your privacy: https://sentry.io/security/", "sentryInfo": "Information about your privacy: https://sentry.io/security/",
"@sentryInfo": { "@sentryInfo": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1315,7 +1320,7 @@
"username": {} "username": {}
} }
}, },
"sentCallInformations": "{senderName} sent call informations", "sentCallInformations": "{senderName} sent call information",
"@sentCallInformations": { "@sentCallInformations": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -1723,4 +1728,4 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
} }
} }

View file

@ -23,7 +23,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"accountInformation": "Informations du compte", "accountInformation": "Informations sur le compte",
"@accountInformation": { "@accountInformation": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1702,5 +1702,20 @@
"@yourOwnUsername": { "@yourOwnUsername": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
},
"privacy": "Vie privée",
"@privacy": {
"type": "text",
"placeholders": {}
},
"enableEmotesGlobally": "Activer globalement le pack d'émoticônes",
"@enableEmotesGlobally": {
"type": "text",
"placeholders": {}
},
"emotePacks": "Packs d'émoticônes pour le salon",
"@emotePacks": {
"type": "text",
"placeholders": {}
} }
} }

View file

@ -1702,5 +1702,20 @@
"@yourOwnUsername": { "@yourOwnUsername": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
},
"enableEmotesGlobally": "Aktiviraj paket emotikona globalno",
"@enableEmotesGlobally": {
"type": "text",
"placeholders": {}
},
"emotePacks": "Paketi emotikona za sobu",
"@emotePacks": {
"type": "text",
"placeholders": {}
},
"privacy": "Privatnost",
"@privacy": {
"type": "text",
"placeholders": {}
} }
} }

1
lib/l10n/intl_it.arb Normal file
View file

@ -0,0 +1 @@
{}

View file

@ -102,7 +102,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"askVerificationRequest": "{username}'den gelen doğrulama talebini kabul etmek istiyor musunuz?", "askVerificationRequest": "{username} kişisinden gelen bu doğrulama isteği kabul edilsin mi?",
"@askVerificationRequest": { "@askVerificationRequest": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -119,7 +119,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"banFromChat": "Sohbetten engellendiniz", "banFromChat": "Sohbetten engelle",
"@banFromChat": { "@banFromChat": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -129,7 +129,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"bannedUser": "{username} engelledi: {targetName}", "bannedUser": "{username}, {targetName} kişisini engelledi",
"@bannedUser": { "@bannedUser": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -249,7 +249,7 @@
"username": {} "username": {}
} }
}, },
"changedTheRoomAliases": "", "changedTheRoomAliases": "{username} oda takma adlarını değiştirdi",
"@changedTheRoomAliases": { "@changedTheRoomAliases": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -268,7 +268,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"changeTheHomeserver": "", "changeTheHomeserver": "Ana sunucuyu değiştir",
"@changeTheHomeserver": { "@changeTheHomeserver": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -293,7 +293,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"channelCorruptedDecryptError": "", "channelCorruptedDecryptError": "Şifreleme bozuldu",
"@channelCorruptedDecryptError": { "@channelCorruptedDecryptError": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -323,12 +323,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"compareEmojiMatch": "", "compareEmojiMatch": "Karşılaştırın ve aşağıdaki emojilerin diğer cihazdakilerle eşleştiğinden emin olun:",
"@compareEmojiMatch": { "@compareEmojiMatch": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"compareNumbersMatch": "", "compareNumbersMatch": "Karşılaştırın ve aşağıdaki numaraların diğer cihazdakilerle eşleştiğinden emin olun:",
"@compareNumbersMatch": { "@compareNumbersMatch": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -353,7 +353,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"contentViewer": "", "contentViewer": "İçerik görüntüleyici",
"@contentViewer": { "@contentViewer": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -380,7 +380,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"couldNotSetDisplayname": "", "couldNotSetDisplayname": "Görünen ad ayarlanamadı",
"@couldNotSetDisplayname": { "@couldNotSetDisplayname": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -414,17 +414,17 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"crossSigningDisabled": "", "crossSigningDisabled": "Çapraz imzalama devre dışı bırakıldı",
"@crossSigningDisabled": { "@crossSigningDisabled": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"crossSigningEnabled": "", "crossSigningEnabled": "Çapraz imzalama etkinleştirildi",
"@crossSigningEnabled": { "@crossSigningEnabled": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"currentlyActive": "", "currentlyActive": "Şu anda etkin",
"@currentlyActive": { "@currentlyActive": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -469,7 +469,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"deny": "", "deny": "Reddet",
"@deny": { "@deny": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -484,12 +484,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"discardPicture": "", "discardPicture": "Resmi at",
"@discardPicture": { "@discardPicture": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"displaynameHasBeenChanged": "", "displaynameHasBeenChanged": "Görünen ad değiştirildi",
"@displaynameHasBeenChanged": { "@displaynameHasBeenChanged": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -499,52 +499,52 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"downloadFile": "", "downloadFile": "Dosyayı indir",
"@downloadFile": { "@downloadFile": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"editDisplayname": "", "editDisplayname": "Görünen adı düzenle",
"@editDisplayname": { "@editDisplayname": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"editJitsiInstance": "", "editJitsiInstance": "Jitsi örneğini düzenle",
"@editJitsiInstance": { "@editJitsiInstance": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"emoteExists": "", "emoteExists": "İfade zaten var!",
"@emoteExists": { "@emoteExists": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"emoteInvalid": "", "emoteInvalid": "Geçersiz ifade kısa kodu!",
"@emoteInvalid": { "@emoteInvalid": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"emoteSettings": "", "emoteSettings": "İfade Ayarları",
"@emoteSettings": { "@emoteSettings": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"emoteShortcode": "", "emoteShortcode": "İfade kısa kodu",
"@emoteShortcode": { "@emoteShortcode": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"emoteWarnNeedToPick": "", "emoteWarnNeedToPick": "Bir ifade kısa kodu ve bir resim seçmeniz gerekiyor!",
"@emoteWarnNeedToPick": { "@emoteWarnNeedToPick": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"emptyChat": "", "emptyChat": "Boş sohbet",
"@emptyChat": { "@emptyChat": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"enableEncryptionWarning": "", "enableEncryptionWarning": "Artık şifrelemeyi devre dışı bırakamayacaksınız. Emin misiniz?",
"@enableEncryptionWarning": { "@enableEncryptionWarning": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -559,7 +559,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"encryptionNotEnabled": "", "encryptionNotEnabled": "Şifreleme etkinleştirilmedi",
"@encryptionNotEnabled": { "@encryptionNotEnabled": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -579,7 +579,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"enterYourHomeserver": "", "enterYourHomeserver": "Ana sunucunuzu girin",
"@enterYourHomeserver": { "@enterYourHomeserver": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -599,7 +599,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"forward": "", "forward": "İlet",
"@forward": { "@forward": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -609,12 +609,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"fromJoining": "", "fromJoining": "Katılmadan",
"@fromJoining": { "@fromJoining": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"fromTheInvitation": "", "fromTheInvitation": "Davetten",
"@fromTheInvitation": { "@fromTheInvitation": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -634,19 +634,19 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"groupIsPublic": "", "groupIsPublic": "Grup herkese açık",
"@groupIsPublic": { "@groupIsPublic": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"groupWith": "", "groupWith": "{displayname} ile grup",
"@groupWith": { "@groupWith": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
"displayname": {} "displayname": {}
} }
}, },
"guestsAreForbidden": "", "guestsAreForbidden": "Misafirlere izin verilmiyor",
"@guestsAreForbidden": { "@guestsAreForbidden": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -656,7 +656,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"hasWithdrawnTheInvitationFor": "", "hasWithdrawnTheInvitationFor": "{username}, {targetName} için daveti geri çekti",
"@hasWithdrawnTheInvitationFor": { "@hasWithdrawnTheInvitationFor": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -669,44 +669,44 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"homeserverIsNotCompatible": "", "homeserverIsNotCompatible": "Ana sunucu uyumlu değil",
"@homeserverIsNotCompatible": { "@homeserverIsNotCompatible": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"id": "", "id": "Kimlik",
"@id": { "@id": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"identity": "", "identity": "Kimlik",
"@identity": { "@identity": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"incorrectPassphraseOrKey": "", "incorrectPassphraseOrKey": "Yanlış parola veya kurtarma anahtarı",
"@incorrectPassphraseOrKey": { "@incorrectPassphraseOrKey": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"inviteContact": "", "inviteContact": "Kişi davet et",
"@inviteContact": { "@inviteContact": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"inviteContactToGroup": "", "inviteContactToGroup": "Kişiyi {groupName} grubuna davet et",
"@inviteContactToGroup": { "@inviteContactToGroup": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
"groupName": {} "groupName": {}
} }
}, },
"invited": "", "invited": "Davet edildi",
"@invited": { "@invited": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"invitedUser": "", "invitedUser": "{username}, {targetName} kişisini davet etti",
"@invitedUser": { "@invitedUser": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -719,7 +719,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"inviteText": "", "inviteText": "{username} sizi FluffyChat'e davet etti. \n1. FluffyChat kurun: https://fluffychat.im \n2. Kaydolun veya giriş yapın \n3. Davet bağlantısınıın: {link}",
"@inviteText": { "@inviteText": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -727,7 +727,7 @@
"link": {} "link": {}
} }
}, },
"isDeviceKeyCorrect": "", "isDeviceKeyCorrect": "Aşağıdaki cihaz anahtarı doğru mu?",
"@isDeviceKeyCorrect": { "@isDeviceKeyCorrect": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -744,17 +744,17 @@
"username": {} "username": {}
} }
}, },
"keysCached": "", "keysCached": "Anahtarlar önbelleğe alındı",
"@keysCached": { "@keysCached": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"keysMissing": "", "keysMissing": "Anahtarlar eksik",
"@keysMissing": { "@keysMissing": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"kicked": "", "kicked": "{username}, {targetName} kişisini attı",
"@kicked": { "@kicked": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -762,7 +762,7 @@
"targetName": {} "targetName": {}
} }
}, },
"kickedAndBanned": "", "kickedAndBanned": "{username}, {targetName} kişisini attı ve engelledi",
"@kickedAndBanned": { "@kickedAndBanned": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -770,19 +770,19 @@
"targetName": {} "targetName": {}
} }
}, },
"kickFromChat": "", "kickFromChat": "Sohbetten at",
"@kickFromChat": { "@kickFromChat": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"lastActiveAgo": "", "lastActiveAgo": "Son görülen: {localizedTimeShort}",
"@lastActiveAgo": { "@lastActiveAgo": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
"localizedTimeShort": {} "localizedTimeShort": {}
} }
}, },
"lastSeenIp": "", "lastSeenIp": "Son görülen IP",
"@lastSeenIp": { "@lastSeenIp": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -797,7 +797,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"leftTheChat": "", "leftTheChat": "Sohbetten ayrıldı",
"@leftTheChat": { "@leftTheChat": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -812,7 +812,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"loadCountMoreParticipants": "", "loadCountMoreParticipants": "{count} katılımcı daha yükle",
"@loadCountMoreParticipants": { "@loadCountMoreParticipants": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -834,7 +834,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"logInTo": "", "logInTo": "{homeserver} üzerinde oturum aç",
"@logInTo": { "@logInTo": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -846,17 +846,17 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"makeAModerator": "", "makeAModerator": "Moderatör yap",
"@makeAModerator": { "@makeAModerator": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"makeAnAdmin": "", "makeAnAdmin": "Yönetici yap",
"@makeAnAdmin": { "@makeAnAdmin": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"makeSureTheIdentifierIsValid": "", "makeSureTheIdentifierIsValid": "Tanımlayıcının geçerli olduğundan emin olun",
"@makeSureTheIdentifierIsValid": { "@makeSureTheIdentifierIsValid": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -866,7 +866,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"moderator": "", "moderator": "Moderatör",
"@moderator": { "@moderator": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -876,94 +876,94 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"muteChat": "", "muteChat": "Sohbeti sessize al",
"@muteChat": { "@muteChat": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"needPantalaimonWarning": "", "needPantalaimonWarning": "Uçtan uca şifreleme kullanmak için şimdilik Pantalaimon'a ihtiyacınız olduğunu lütfen unutmayın.",
"@needPantalaimonWarning": { "@needPantalaimonWarning": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"newMessageInFluffyChat": "", "newMessageInFluffyChat": "FluffyChat'te yeni mesaj",
"@newMessageInFluffyChat": { "@newMessageInFluffyChat": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"newPrivateChat": "", "newPrivateChat": "Yeni özel sohbet",
"@newPrivateChat": { "@newPrivateChat": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"newVerificationRequest": "", "newVerificationRequest": "Yeni doğrulama isteği!",
"@newVerificationRequest": { "@newVerificationRequest": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"noCrossSignBootstrap": "", "noCrossSignBootstrap": "FluffyChat şu anda çapraz imzalamanın etkinleştirilmesini desteklemiyor. Lütfen Riot içinden etkinleştirin.",
"@noCrossSignBootstrap": { "@noCrossSignBootstrap": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"noEmotesFound": "", "noEmotesFound": "İfade bulunamadı. 😕",
"@noEmotesFound": { "@noEmotesFound": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"noGoogleServicesWarning": "", "noGoogleServicesWarning": "Görünüşe göre telefonunuzda Google hizmetleri yok. Bu, mahremiyetiniz için iyi bir karar! FluffyChat'te anlık bildirimler almak için microG kullanmanızı tavsiye ediyoruz: https://microg.org/",
"@noGoogleServicesWarning": { "@noGoogleServicesWarning": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"noMegolmBootstrap": "", "noMegolmBootstrap": "FluffyChat şu anda çevrim içi anahtar yedeklemenin etkinleştirilmesini desteklemiyor. Lütfen Riot içinden etkinleştirin.",
"@noMegolmBootstrap": { "@noMegolmBootstrap": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"none": "", "none": "Yok",
"@none": { "@none": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"noPermission": "", "noPermission": "İzin yok",
"@noPermission": { "@noPermission": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"noRoomsFound": "", "noRoomsFound": "Oda bulunamadı...",
"@noRoomsFound": { "@noRoomsFound": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"notSupportedInWeb": "", "notSupportedInWeb": "Web'de desteklenmiyor",
"@notSupportedInWeb": { "@notSupportedInWeb": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"numberSelected": "", "numberSelected": "{number} seçildi",
"@numberSelected": { "@numberSelected": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
"number": {} "number": {}
} }
}, },
"ok": "", "ok": "tamam",
"@ok": { "@ok": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"onlineKeyBackupDisabled": "", "onlineKeyBackupDisabled": "Çevrim içi anahtar yedekleme devre dışı bırakıldı",
"@onlineKeyBackupDisabled": { "@onlineKeyBackupDisabled": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"onlineKeyBackupEnabled": "", "onlineKeyBackupEnabled": "Çevrim içi anahtar yedekleme etkinleştirildi",
"@onlineKeyBackupEnabled": { "@onlineKeyBackupEnabled": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"oopsSomethingWentWrong": "", "oopsSomethingWentWrong": "Tüh, bir şeyler yanlış gitti...",
"@oopsSomethingWentWrong": { "@oopsSomethingWentWrong": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -983,12 +983,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"participatingUserDevices": "", "participatingUserDevices": "Katılan kullanıcı cihazları",
"@participatingUserDevices": { "@participatingUserDevices": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"passphraseOrKey": "", "passphraseOrKey": "parola veya kurtarma anahtarı",
"@passphraseOrKey": { "@passphraseOrKey": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -998,12 +998,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"pickImage": "", "pickImage": "Resim seç",
"@pickImage": { "@pickImage": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"play": "", "play": "{fileName} dosyasını oynat",
"@play": { "@play": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -1015,7 +1015,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"pleaseEnterAMatrixIdentifier": "", "pleaseEnterAMatrixIdentifier": "Lütfen bir matrix tanımlayıcısı girin",
"@pleaseEnterAMatrixIdentifier": { "@pleaseEnterAMatrixIdentifier": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1030,17 +1030,17 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"publicRooms": "", "publicRooms": "Herkese Açık Odalar",
"@publicRooms": { "@publicRooms": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"recording": "", "recording": "Kaydediliyor",
"@recording": { "@recording": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"redactedAnEvent": "", "redactedAnEvent": "{username} bir etkinliği düzenledi",
"@redactedAnEvent": { "@redactedAnEvent": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -1086,7 +1086,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"removeExile": "", "removeExile": "Engeli kaldır",
"@removeExile": { "@removeExile": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1096,12 +1096,12 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"renderRichContent": "", "renderRichContent": "Zengin mesaj içeriğini görüntüle",
"@renderRichContent": { "@renderRichContent": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"reply": "", "reply": "Yanıtla",
"@reply": { "@reply": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1121,7 +1121,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"roomHasBeenUpgraded": "", "roomHasBeenUpgraded": "Oda yükseltildi",
"@roomHasBeenUpgraded": { "@roomHasBeenUpgraded": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1174,7 +1174,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"sendImage": "", "sendImage": "Resim gönder",
"@sendImage": { "@sendImage": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1347,7 +1347,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"unbannedUser": "{username} engeli kaldırdı: {targetName}", "unbannedUser": "{username}, {targetName} kişisinin engelini kaldırdı",
"@unbannedUser": { "@unbannedUser": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -1355,7 +1355,7 @@
"targetName": {} "targetName": {}
} }
}, },
"unblockDevice": "", "unblockDevice": "Cihazın Engellemesini Kaldır",
"@unblockDevice": { "@unblockDevice": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1370,7 +1370,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"unknownEvent": "", "unknownEvent": "Bilinmeyen etkinlik '{type}'",
"@unknownEvent": { "@unknownEvent": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -1449,7 +1449,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"userSentUnknownEvent": "", "userSentUnknownEvent": "{username} bir {type} etkinliği gönderdi",
"@userSentUnknownEvent": { "@userSentUnknownEvent": {
"type": "text", "type": "text",
"placeholders": { "placeholders": {
@ -1527,7 +1527,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"waitingPartnerNumbers": "", "waitingPartnerNumbers": "Ortağın numaraları kabul etmesi bekleniyor...",
"@waitingPartnerNumbers": { "@waitingPartnerNumbers": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
@ -1596,5 +1596,126 @@
"@yourOwnUsername": { "@yourOwnUsername": {
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
},
"warning": "Uyarı!",
"@warning": {
"type": "text",
"placeholders": {}
},
"unpin": "Sabitlemeyi kaldır",
"@unpin": {
"type": "text",
"placeholders": {}
},
"startedACall": "{senderName} bir arama başlattı",
"@startedACall": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"sentCallInformations": "{senderName} arama bilgilerini gönderdi",
"@sentCallInformations": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"sendVideo": "Video gönder",
"@sendVideo": {
"type": "text",
"placeholders": {}
},
"sendOriginal": "Orijinali gönder",
"@sendOriginal": {
"type": "text",
"placeholders": {}
},
"sendAudio": "Ses gönder",
"@sendAudio": {
"type": "text",
"placeholders": {}
},
"changesHaveBeenSaved": "Değişiklikler kaydedildi",
"@changesHaveBeenSaved": {
"type": "text",
"placeholders": {}
},
"sentryInfo": "Gizliliğiniz hakkında bilgiler: https://sentry.io/security/",
"@sentryInfo": {
"type": "text",
"placeholders": {}
},
"sendBugReports": "sentry.io ile hata raporları göndermeye izin ver",
"@sendBugReports": {
"type": "text",
"placeholders": {}
},
"pin": "Sabitle",
"@pin": {
"type": "text",
"placeholders": {}
},
"passwordHasBeenChanged": "Parola değiştirildi",
"@passwordHasBeenChanged": {
"type": "text",
"placeholders": {}
},
"privacy": "Gizlilik",
"@privacy": {
"type": "text",
"placeholders": {}
},
"no": "Hayır",
"@no": {
"type": "text",
"placeholders": {}
},
"joinRoom": "Odaya katıl",
"@joinRoom": {
"type": "text",
"placeholders": {}
},
"ignoreListDescription": "Sizi rahatsız eden kullanıcıları yok sayabilirsiniz. Kişisel yok sayma listenizdeki kullanıcılardan herhangi bir mesaj veya oda daveti alamayacaksınız.",
"@ignoreListDescription": {
"type": "text",
"placeholders": {}
},
"ignoreUsername": "Kullanıcıyı yok say",
"@ignoreUsername": {
"type": "text",
"placeholders": {}
},
"ignoredUsers": "Yok sayılan kullanıcılar",
"@ignoredUsers": {
"type": "text",
"placeholders": {}
},
"endedTheCall": "{senderName} aramayı sonlandırdı",
"@endedTheCall": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"enableEmotesGlobally": "İfade paketini küresel olarak etkinleştir",
"@enableEmotesGlobally": {
"type": "text",
"placeholders": {}
},
"emotePacks": "Oda için ifade paketleri",
"@emotePacks": {
"type": "text",
"placeholders": {}
},
"deleteAccount": "Hesabı sil",
"@deleteAccount": {
"type": "text",
"placeholders": {}
},
"deactivateAccountWarning": "Bu, kullanıcı hesabınızı devre dışı bırakacak. Bu geri alınamaz! Emin misiniz?",
"@deactivateAccountWarning": {
"type": "text",
"placeholders": {}
} }
} }

View file

@ -2,6 +2,7 @@ import 'dart:ffi';
import 'dart:io'; import 'dart:io';
import 'dart:isolate'; import 'dart:isolate';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart' show getDatabasesPath; import 'package:sqflite/sqflite.dart' show getDatabasesPath;
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -64,22 +65,17 @@ Future<Database> constructDb(
final isolate = (await receivePort.first as MoorIsolate); final isolate = (await receivePort.first as MoorIsolate);
return Database.connect(await isolate.connect()); return Database.connect(await isolate.connect());
} else if (Platform.isLinux) { } else if (Platform.isLinux) {
debugPrint('[Moor] using desktop moor'); debugPrint('[Moor] using Linux desktop moor');
open.overrideFor(OperatingSystem.linux, _openOnLinux); final appDocDir = await getApplicationSupportDirectory();
return Database(moor.VmDatabase.memory()); return Database(moor.VmDatabase(File('${appDocDir.path}/$filename')));
} else if (Platform.isWindows) { } else if (Platform.isWindows) {
debugPrint('[Moor] using desktop moor'); debugPrint('[Moor] using Windows desktop moor');
open.overrideFor(OperatingSystem.linux, _openOnWindows); open.overrideFor(OperatingSystem.windows, _openOnWindows);
return Database(moor.VmDatabase.memory()); return Database(moor.VmDatabase.memory());
} }
throw Exception('Platform not supported'); throw Exception('Platform not supported');
} }
DynamicLibrary _openOnLinux() {
final libraryNextToScript = File('/usr/lib/x86_64-linux-gnu/libsqlite3.so');
return DynamicLibrary.open(libraryNextToScript.path);
}
DynamicLibrary _openOnWindows() { DynamicLibrary _openOnWindows() {
final script = File(Platform.script.toFilePath()); final script = File(Platform.script.toFilePath());
final libraryNextToScript = File('${script.path}/sqlite3.dll'); final libraryNextToScript = File('${script.path}/sqlite3.dll');

View file

@ -37,7 +37,9 @@ class AppInfo extends StatelessWidget {
), ),
ListTile( ListTile(
title: Text('Device name:'), title: Text('Device name:'),
subtitle: Text(client.deviceName), subtitle: Text(client.userDeviceKeys[client.userID]
?.deviceKeys[client.deviceID]?.deviceDisplayName ??
L10n.of(context).unknownDevice),
), ),
ListTile( ListTile(
title: Text('Device ID:'), title: Text('Device ID:'),

View file

@ -227,7 +227,7 @@ class _ChatState extends State<_Chat> {
} }
void sendImageAction(BuildContext context) async { void sendImageAction(BuildContext context) async {
MatrixFile file; MatrixImageFile file;
if (PlatformInfos.isMobile) { if (PlatformInfos.isMobile) {
final result = await ImagePicker().getImage( final result = await ImagePicker().getImage(
source: ImageSource.gallery, source: ImageSource.gallery,
@ -235,7 +235,7 @@ class _ChatState extends State<_Chat> {
maxWidth: 1600, maxWidth: 1600,
maxHeight: 1600); maxHeight: 1600);
if (result == null) return; if (result == null) return;
file = MatrixFile( file = MatrixImageFile(
bytes: await result.readAsBytes(), bytes: await result.readAsBytes(),
name: result.path, name: result.path,
); );
@ -243,7 +243,7 @@ class _ChatState extends State<_Chat> {
final result = final result =
await FilePickerCross.importFromStorage(type: FileTypeCross.image); await FilePickerCross.importFromStorage(type: FileTypeCross.image);
if (result == null) return; if (result == null) return;
file = MatrixFile( file = MatrixImageFile(
bytes: result.toUint8List(), bytes: result.toUint8List(),
name: result.fileName, name: result.fileName,
); );

View file

@ -456,12 +456,16 @@ class _ChatListState extends State<ChatList> {
ConnectionStatusHeader(), ConnectionStatusHeader(),
Expanded( Expanded(
child: StreamBuilder( child: StreamBuilder(
stream: Matrix.of(context) stream:
.client Matrix.of(context).client.onSync.stream.where(
.onSync (s) =>
.stream s.hasRoomUpdate ||
.where((s) => s.accountData
s.hasRoomUpdate || s.hasPresenceUpdate), .where((a) =>
a.type ==
MatrixState.userStatusesType)
.isNotEmpty,
),
builder: (context, snapshot) { builder: (context, snapshot) {
return FutureBuilder<void>( return FutureBuilder<void>(
future: waitForFirstSync(context), future: waitForFirstSync(context),

View file

@ -56,6 +56,19 @@ class DevicesSettingsState extends State<DevicesSettings> {
} }
} }
void _renameDeviceAction(BuildContext context, Device device) async {
final displayName = await SimpleDialogs(context).enterText(
hintText: device.displayName,
labelText: L10n.of(context).changeDeviceName,
);
if (displayName == null) return;
await SimpleDialogs(context).tryRequestWithLoadingDialog(
Matrix.of(context)
.client
.setDeviceMetadata(device.deviceId, displayName: displayName),
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -117,6 +130,7 @@ class DevicesSettingsState extends State<DevicesSettings> {
itemBuilder: (BuildContext context, int i) => itemBuilder: (BuildContext context, int i) =>
UserDeviceListItem( UserDeviceListItem(
devices[i], devices[i],
rename: (d) => _renameDeviceAction(context, d),
remove: (d) => _removeDevicesAction(context, [d]), remove: (d) => _removeDevicesAction(context, [d]),
), ),
), ),
@ -132,23 +146,34 @@ class DevicesSettingsState extends State<DevicesSettings> {
class UserDeviceListItem extends StatelessWidget { class UserDeviceListItem extends StatelessWidget {
final Device userDevice; final Device userDevice;
final Function remove; final Function remove;
final Function rename;
const UserDeviceListItem(this.userDevice, {this.remove, Key key}) const UserDeviceListItem(this.userDevice, {this.remove, this.rename, Key key})
: super(key: key); : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return PopupMenuButton( return PopupMenuButton(
onSelected: (String action) { onSelected: (String action) {
if (action == 'remove' && remove != null) { switch (action) {
remove(userDevice); case 'remove':
if (remove != null) remove(userDevice);
break;
case 'rename':
if (rename != null) rename(userDevice);
} }
}, },
itemBuilder: (BuildContext context) => [ itemBuilder: (BuildContext context) => [
PopupMenuItem<String>(
value: 'rename',
child: Text(L10n.of(context).changeDeviceName),
),
PopupMenuItem<String>( PopupMenuItem<String>(
value: 'remove', value: 'remove',
child: Text(L10n.of(context).removeDevice, child: Text(
style: TextStyle(color: Colors.red)), L10n.of(context).removeDevice,
style: TextStyle(color: Colors.red),
),
), ),
], ],
child: ListTile( child: ListTile(

View file

@ -45,6 +45,14 @@ apply_standard_settings(${BINARY_NAME})
target_link_libraries(${BINARY_NAME} PRIVATE flutter) target_link_libraries(${BINARY_NAME} PRIVATE flutter)
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
add_dependencies(${BINARY_NAME} flutter_assemble) add_dependencies(${BINARY_NAME} flutter_assemble)
# Only the install-generated bundle's copy of the executable will launch
# correctly, since the resources must in the right relative locations. To avoid
# people trying to run the unbundled copy, put it in a subdirectory instead of
# the default top-level location.
set_target_properties(${BINARY_NAME}
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
)
# Generated plugin build rules, which manage building the plugins and adding # Generated plugin build rules, which manage building the plugins and adding
# them to the application. # them to the application.

View file

@ -325,7 +325,7 @@ packages:
name: flutter_matrix_html name: flutter_matrix_html
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.5" version: "0.1.7"
flutter_olm: flutter_olm:
dependency: "direct main" dependency: "direct main"
description: description:
@ -967,7 +967,7 @@ packages:
source: hosted source: hosted
version: "1.0.8" version: "1.0.8"
url_launcher_web: url_launcher_web:
dependency: "direct main" dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"

View file

@ -30,8 +30,7 @@ dependencies:
localstorage: ^3.0.1+4 localstorage: ^3.0.1+4
file_picker_cross: ^4.2.2 file_picker_cross: ^4.2.2
image_picker: ^0.6.7+11 image_picker: ^0.6.7+11
url_launcher: ^5.4.1 url_launcher: ^5.7.2
url_launcher_web: ^0.1.0
cached_network_image: ^2.3.2+1 cached_network_image: ^2.3.2+1
firebase_messaging: ^7.0.2 firebase_messaging: ^7.0.2
flutter_local_notifications: ^1.4.3 flutter_local_notifications: ^1.4.3
@ -49,7 +48,7 @@ dependencies:
open_file: ^3.0.1 open_file: ^3.0.1
mime_type: ^0.3.0 mime_type: ^0.3.0
bot_toast: ^3.0.0 bot_toast: ^3.0.0
flutter_matrix_html: ^0.1.5 flutter_matrix_html: ^0.1.7
moor: ^3.3.1 moor: ^3.3.1
sqlite3_flutter_libs: ^0.2.0 sqlite3_flutter_libs: ^0.2.0
sqlite3: ^0.1.4 sqlite3: ^0.1.4
@ -85,7 +84,7 @@ flutter_icons:
# The following section is specific to Flutter. # The following section is specific to Flutter.
flutter: flutter:
# Adds code generation (synthetic package) support # Adds code generation (synthetic package) support
generate: true generate: true