diff --git a/CHANGES.md b/CHANGES.md
index 9947146a9e..e9a990f1b2 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,20 @@
+Changes in Element 1.1.12 (2021-07-05)
+======================================
+
+Features ✨
+----------
+ - Reveal password: use facility from com.google.android.material.textfield.TextInputLayout instead of manual handling. ([#3545](https://github.com/vector-im/element-android/issues/3545))
+ - Implements new design for Jump to unread and quick fix visibility issues. ([#3547](https://github.com/vector-im/element-android/issues/3547))
+
+Bugfixes 🐛
+----------
+ - Fix some issues with timeline cache invalidation and visibility. ([#3542](https://github.com/vector-im/element-android/issues/3542))
+ - Fix call invite processed after call is ended because of fastlane mode. ([#3564](https://github.com/vector-im/element-android/issues/3564))
+ - Fix crash after video call. ([#3577](https://github.com/vector-im/element-android/issues/3577))
+ - Fix crash out of memory ([#3583](https://github.com/vector-im/element-android/issues/3583))
+ - CryptoStore migration has to be object to avoid crash ([#3605](https://github.com/vector-im/element-android/issues/3605))
+
+
Changes in Element v1.1.11 (2021-06-22)
=======================================
diff --git a/attachment-viewer/build.gradle b/attachment-viewer/build.gradle
index 4b95b20029..a756e07cbd 100644
--- a/attachment-viewer/build.gradle
+++ b/attachment-viewer/build.gradle
@@ -55,7 +55,7 @@ dependencies {
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
- implementation 'androidx.core:core-ktx:1.5.0'
+ implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation "androidx.recyclerview:recyclerview:1.2.1"
diff --git a/build.gradle b/build.gradle
index 48274d88bf..fdf80f0e68 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,7 +12,7 @@ buildscript {
}
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.2.1'
+ classpath 'com.android.tools.build:gradle:4.2.2'
classpath 'com.google.gms:google-services:4.3.8'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3'
diff --git a/changelog.d/3273.feature b/changelog.d/3273.feature
new file mode 100644
index 0000000000..0edc81796b
--- /dev/null
+++ b/changelog.d/3273.feature
@@ -0,0 +1 @@
+Remove redundant mimetype (vector-im/element-web#2547)
\ No newline at end of file
diff --git a/changelog.d/3545.feature b/changelog.d/3545.feature
deleted file mode 100644
index f582affbf2..0000000000
--- a/changelog.d/3545.feature
+++ /dev/null
@@ -1 +0,0 @@
-Reveal password: use facility from com.google.android.material.textfield.TextInputLayout instead of manual handling.
\ No newline at end of file
diff --git a/changelog.d/3547.feature b/changelog.d/3547.feature
deleted file mode 100644
index 8921932067..0000000000
--- a/changelog.d/3547.feature
+++ /dev/null
@@ -1 +0,0 @@
-Implements new design for Jump to unread and quick fix visibility issues.
\ No newline at end of file
diff --git a/changelog.d/3564.bugfix b/changelog.d/3564.bugfix
deleted file mode 100644
index 74f71ccded..0000000000
--- a/changelog.d/3564.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fix call invite processed after call is ended because of fastlane mode.
\ No newline at end of file
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101070.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101070.txt
new file mode 100644
index 0000000000..2a6afb21a5
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: beta podpora pro Spaces. Komprimace videa před odesláním.
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101080.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101080.txt
new file mode 100644
index 0000000000..5ec173ebea
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: vylepšení pro Spaces
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101090.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101090.txt
new file mode 100644
index 0000000000..782a2fa8c5
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: doplněna podpora pro síť gitter.im
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/en-US/changelogs/40101120.txt b/fastlane/metadata/android/en-US/changelogs/40101120.txt
new file mode 100644
index 0000000000..6118974777
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Main changes in this version: theme and style update and fix a crash after video call
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.12
\ No newline at end of file
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101070.txt b/fastlane/metadata/android/fr-FR/changelogs/40101070.txt
new file mode 100644
index 0000000000..66cc5d1671
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : prise en charge des espaces en bêta. Compression des vidéos avant envoi.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101080.txt b/fastlane/metadata/android/fr-FR/changelogs/40101080.txt
new file mode 100644
index 0000000000..31a4b72363
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : amélioration des espaces.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101090.txt b/fastlane/metadata/android/fr-FR/changelogs/40101090.txt
new file mode 100644
index 0000000000..99f02f1bb2
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : ajout de la prise en charge de gitter.im
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt
index 066b94868b..78fcdf5617 100644
--- a/fastlane/metadata/android/fr-FR/full_description.txt
+++ b/fastlane/metadata/android/fr-FR/full_description.txt
@@ -1,30 +1,39 @@
-Element est une nouvelle application de messagerie et de collaboration qui :
+Element est à la fois une messagerie sécurisée et une application de collaboration en équipe, idéale pour les conversations de groupe en télétravail. Cette application utilise le chiffrement de bout en bout. Elle permet de mettre en place des téléconférences vidéo, du partage de fichier et des appels vocaux.
-1. Vous permet de préserver votre vie privée
-2. Vous permet de communiquer avec n’importe qui sur réseau Matrix, et plus encore grâce aux intégrations d’autres applications telles que Slack ou Discord
-3. Vous protège de la publicité et de la collecte de données
-4. Vous protège grâce au chiffrement de bout-à-bout et à la signature croisée pour authentifier les autres utilisateurs
+Les fonctionnalités d’Element incluent :
+- Outils de communication en ligne avancés
+- Communication d’entreprise sécurisée par le chiffrement de bout en bout des messages, même pour les travailleurs à distance
+- Messagerie décentralisée basée sur le framework open source Matrix
+- Partage sécurisé de fichiers avec chiffrement des données lors de la gestion de projet
+- Conversations vidéo par voix sur IP et partage d’écran
+- Intégration facile avec vos outils de collaboration, de gestion de projet, services de VoIP et autres applications de messagerie
-Element est complètement différente des autres applications de messagerie et de collaboration puisque l’application est décentralisée et open-source.
+Element est complètement différente des autres applications de messagerie et de collaboration. Elle s’appuie sur Matrix, un réseau ouvert de communication décentralisée. Elle permet l’auto-hébergement pour que ses utilisateurs restent le plus en contrôle possible de leurs données et leurs messages.
-Element vous permet d’héberger vous-même ou de choisir un hôte vous permettant d’assurer votre vie privée, la propriété et le contrôle de vos données et de vos conversations. Cela vous donne accès à un réseau ouvert. Vous n’êtes donc pas condamné à parler à d’autres utilisateurs d’Element seulement. Et c'est très sécurisé.
+Confidentialité et messagerie chiffrée
+Element vous protège des publicités non désirées, du minage de données et des prisons dorées. Elle protègé vos données et vos communications vocales grâce au chiffrement de bout en bout et à la vérification de signature croisée entre appareils.
-Element peut faire tout ça car elle est basée sur Matrix, le protocole standard pour la communication ouverte et décentralisée.
+Element vous donne la main sur votre confidentialité en vous permettant de communiquer de manière sécurisée avec tout le réseau Matrix ou d’autres applications de communication d’entreprise au travers d’intégrations d’applications comme Slack.
-Element vous donne le contrôle en vous laissant choisir qui héberge vos conversations. Depuis l'application Element, vous pouvez choisir votre hôte de différentes manières :
+Element peut être auto-hébergé
+Pour une meilleure souveraineté sur vos données et conversations, Element peut être auto-hébergé ou vous pouvez choisir votre hôte Matrix - la norme open source pour les communications décentralisées. Element garantit votre confidentialité, conformité aux normes de sécurité, tout en proposant une intégration souple.
-1. Créer un compte gratuit sur le serveur public matrix.org hébergé par les développeurs de Matrix, ou choisir parmi les milliers de serveurs public hébergés par des bénévoles
-2. Héberger vous-même votre compte en installant un serveur sur votre propre machine
-3. Créer un compte sur un serveur personnalisé en souscrivant sur la plateforme d'hébergement « Element Matrix Services » (EMS)
+Vos données vous appartiennent
+Vous décidez où stocker vos données et messages. Aucun risque de minage de données où d’accès par des tierce parties.
-Pourquoi choisir Element ?
+Element vous place aux commandes de différente manières :
+1. Inscrivez vous sur le serveur public matrix.org hébergé par les développeurs de Matrix ou choisissez parmi des milliers de serveurs publics hébergés par des bénévoles
+2. Auto-hébergez votre compte sur un serveur de votre proper infrastructure informatique
+3. Inscrivez vous à la plateforme d’hébergement Element Matrix Services
-VOS DONNÉES VOUS APPARTIENNENT : vous décidez où stocker vos données et messages. Ils vous appartiennent et vous les maîtrisez. Aucune multinationale ne viendra extraire vos données pour les envoyer au plus offrant.
+Messagerie et collaboration ouvertes
+Vous pouvez discuter avec tout le réseau Matrix, que vos interlocuteurs utilisent Element, une autre application Matrix, ou même s’ils utilisent une application complètement différente.
-MESSAGERIE ET COLLABORATION OUVERTES : vous pouvez discuter avec tout le réseau Matrix, qu’ils utilisent Element ou une autre application Matrix, même s’ils utilisent une autre plateforme de messagerie telle que Slack, IRC ou XMPP.
+Ultra sécurisé
+Chiffrement de bout en bout (seules les personnes dans la conversation peuvent déchiffrer les messages) et vérification de signature croisée entre appareils.
-ULTRA SÉCURISÉ : chiffrement de bout en bout (seuls les membres d’une conversation peuvent déchiffrer les messages), et signature croisée pour vérifier les appareils de vos interlocuteurs.
+Communication et intégration parfaites
+Messagerie instantannée, appels audio et vidéo, partage de fichier, partage d’écran et bien d’autres intégrations, bots et widgets. Lancez des salons, des communautés, restez en contact et menez vos projets à bien.
-TOUTES VOS COMMUNICATIONS : messagerie, appels audio et vidéo, partage de fichier, partage d’écran et un grand nombre d’intégrations, robots et widgets. Participez à des salons, des communautés, restez en contact et faites avancer vos projets.
-
-PARTOUT AVEC VOUS : votre historique reste synchronisé entre tous vos appareils et sur le web sur https://element.io/app.
+Reprenez où vous vous êtes arrêté
+Restez en contact où que vous soyez grâce à l’historique des messages synchronisé entre tous vos appareils et sur le web sur https://app.element.io
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 283500479a..17ba19021b 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionSha256Sum=a9e356a21595348b6f04b024ed0b08ac8aea6b2ac37e6c0ef58e51549cd7b9cb
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-all.zip
+distributionSha256Sum=9bb8bc05f562f2d42bdf1ba8db62f6b6fa1c3bf6c392228802cc7cb0578fe7e0
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/library/ui-styles/src/main/res/values/dimens_font.xml b/library/ui-styles/src/main/res/values/dimens_font.xml
index 92df8dbf35..1b5a826acb 100644
--- a/library/ui-styles/src/main/res/values/dimens_font.xml
+++ b/library/ui-styles/src/main/res/values/dimens_font.xml
@@ -8,6 +8,6 @@
12sp
10sp
- 16sp
+ 14sp
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_buttons.xml b/library/ui-styles/src/main/res/values/styles_buttons.xml
index 8d34995751..ad90469a52 100644
--- a/library/ui-styles/src/main/res/values/styles_buttons.xml
+++ b/library/ui-styles/src/main/res/values/styles_buttons.xml
@@ -6,6 +6,7 @@
- 16dp
- 94dp
- @style/TextAppearance.Vector.Button
+ - 8dp
- 24sp
@@ -32,6 +33,7 @@
- 16dp
- 94dp
- @style/TextAppearance.Vector.Button
+ - 8dp
- 24sp
@@ -48,6 +50,7 @@
- ?colorSecondary
- @style/VectorMaterialThemeOverlayPositive
- @style/TextAppearance.Vector.Button
+ - 8dp
- 24sp
@@ -61,6 +64,7 @@
- @color/button_background_tint_selector
- 1dp
- @style/TextAppearance.Vector.Button
+ - 8dp
- 24sp
diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle
index cb00b0fd56..4f65b48a5f 100644
--- a/matrix-sdk-android/build.gradle
+++ b/matrix-sdk-android/build.gradle
@@ -9,7 +9,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath "io.realm:realm-gradle-plugin:10.6.0"
+ classpath "io.realm:realm-gradle-plugin:10.6.1"
}
}
@@ -121,7 +121,7 @@ dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
implementation "androidx.appcompat:appcompat:1.3.0"
- implementation "androidx.core:core-ktx:1.5.0"
+ implementation "androidx.core:core-ktx:1.6.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
@@ -175,24 +175,24 @@ dependencies {
testImplementation 'org.robolectric:robolectric:4.5.1'
//testImplementation 'org.robolectric:shadows-support-v4:3.0'
// Note: version sticks to 1.9.2 due to https://github.com/mockk/mockk/issues/281
- testImplementation 'io.mockk:mockk:1.11.0'
+ testImplementation 'io.mockk:mockk:1.12.0'
testImplementation 'org.amshove.kluent:kluent-android:1.67'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
// Plant Timber tree for test
testImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1'
kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion"
- androidTestImplementation 'androidx.test:core:1.3.0'
- androidTestImplementation 'androidx.test:runner:1.3.0'
- androidTestImplementation 'androidx.test:rules:1.3.0'
+ androidTestImplementation 'androidx.test:core:1.4.0'
+ androidTestImplementation 'androidx.test:runner:1.4.0'
+ androidTestImplementation 'androidx.test:rules:1.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'org.amshove.kluent:kluent-android:1.65'
- androidTestImplementation 'io.mockk:mockk-android:1.11.0'
+ androidTestImplementation 'io.mockk:mockk-android:1.12.0'
androidTestImplementation "androidx.arch.core:core-testing:$arch_version"
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
// Plant Timber tree for test
androidTestImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1'
- androidTestUtil 'androidx.test:orchestrator:1.3.0'
+ androidTestUtil 'androidx.test:orchestrator:1.4.0'
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageAudioContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageAudioContent.kt
index fcf3d73cbe..b4ba5c0a66 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageAudioContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageAudioContent.kt
@@ -54,5 +54,5 @@ data class MessageAudioContent(
) : MessageWithAttachmentContent {
override val mimeType: String?
- get() = encryptedFileInfo?.mimetype ?: audioInfo?.mimeType
+ get() = audioInfo?.mimeType
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageFileContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageFileContent.kt
index d93f115322..96877b4d9f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageFileContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageFileContent.kt
@@ -60,8 +60,7 @@ data class MessageFileContent(
) : MessageWithAttachmentContent {
override val mimeType: String?
- get() = encryptedFileInfo?.mimetype
- ?: info?.mimeType
+ get() = info?.mimeType
?: MimeTypeMap.getFileExtensionFromUrl(filename ?: body)?.let { extension ->
MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageImageContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageImageContent.kt
index 73e27b64e3..73fd1eab56 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageImageContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageImageContent.kt
@@ -20,7 +20,6 @@ import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import org.matrix.android.sdk.api.session.events.model.Content
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
-import org.matrix.android.sdk.api.util.MimeTypes
import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo
@JsonClass(generateAdapter = true)
@@ -55,5 +54,5 @@ data class MessageImageContent(
@Json(name = "file") override val encryptedFileInfo: EncryptedFileInfo? = null
) : MessageImageInfoContent {
override val mimeType: String?
- get() = encryptedFileInfo?.mimetype ?: info?.mimeType ?: MimeTypes.Images
+ get() = info?.mimeType
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageStickerContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageStickerContent.kt
index 280316d4b5..8e1d4d3d75 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageStickerContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageStickerContent.kt
@@ -55,5 +55,5 @@ data class MessageStickerContent(
@Json(name = "file") override val encryptedFileInfo: EncryptedFileInfo? = null
) : MessageImageInfoContent {
override val mimeType: String?
- get() = encryptedFileInfo?.mimetype ?: info?.mimeType
+ get() = info?.mimeType
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVideoContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVideoContent.kt
index b7581c9fbf..3f5d2dab2e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVideoContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVideoContent.kt
@@ -53,5 +53,5 @@ data class MessageVideoContent(
@Json(name = "file") override val encryptedFileInfo: EncryptedFileInfo? = null
) : MessageWithAttachmentContent {
override val mimeType: String?
- get() = encryptedFileInfo?.mimetype ?: videoInfo?.mimeType
+ get() = videoInfo?.mimeType
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoModule.kt
index e114f86a99..84d4fef5af 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoModule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoModule.kt
@@ -112,7 +112,6 @@ internal abstract class CryptoModule {
@SessionScope
fun providesRealmConfiguration(@SessionFilesDirectory directory: File,
@UserMd5 userMd5: String,
- realmCryptoStoreMigration: RealmCryptoStoreMigration,
realmKeysUtils: RealmKeysUtils): RealmConfiguration {
return RealmConfiguration.Builder()
.directory(directory)
@@ -123,7 +122,7 @@ internal abstract class CryptoModule {
.modules(RealmCryptoStoreModule())
.allowWritesOnUiThread(true)
.schemaVersion(RealmCryptoStoreMigration.CRYPTO_STORE_SCHEMA_VERSION)
- .migration(realmCryptoStoreMigration)
+ .migration(RealmCryptoStoreMigration)
.build()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/MXEncryptedAttachments.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/MXEncryptedAttachments.kt
index 5a9852b6db..70730326da 100755
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/MXEncryptedAttachments.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/MXEncryptedAttachments.kt
@@ -39,7 +39,9 @@ internal object MXEncryptedAttachments {
private const val SECRET_KEY_SPEC_ALGORITHM = "AES"
private const val MESSAGE_DIGEST_ALGORITHM = "SHA-256"
- fun encrypt(clearStream: InputStream, mimetype: String?, outputFile: File, progress: ((current: Int, total: Int) -> Unit)): EncryptedFileInfo {
+ fun encrypt(clearStream: InputStream,
+ outputFile: File,
+ progress: ((current: Int, total: Int) -> Unit)): EncryptedFileInfo {
val t0 = System.currentTimeMillis()
val secureRandom = SecureRandom()
val initVectorBytes = ByteArray(16) { 0.toByte() }
@@ -86,7 +88,6 @@ internal object MXEncryptedAttachments {
return EncryptedFileInfo(
url = null,
- mimetype = mimetype,
key = EncryptedFileKey(
alg = "A256CTR",
ext = true,
@@ -155,10 +156,9 @@ internal object MXEncryptedAttachments {
* Encrypt an attachment stream.
* DO NOT USE for big files, it will load all in memory
* @param attachmentStream the attachment stream. Will be closed after this method call.
- * @param mimetype the mime type
* @return the encryption file info
*/
- fun encryptAttachment(attachmentStream: InputStream, mimetype: String?): EncryptionResult {
+ fun encryptAttachment(attachmentStream: InputStream): EncryptionResult {
val t0 = System.currentTimeMillis()
val secureRandom = SecureRandom()
@@ -207,7 +207,6 @@ internal object MXEncryptedAttachments {
return EncryptionResult(
encryptedFileInfo = EncryptedFileInfo(
url = null,
- mimetype = mimetype,
key = EncryptedFileKey(
alg = "A256CTR",
ext = true,
@@ -232,7 +231,9 @@ internal object MXEncryptedAttachments {
* @param outputStream the outputStream where the decrypted attachment will be write.
* @return true in case of success, false in case of error
*/
- fun decryptAttachment(attachmentStream: InputStream?, elementToDecrypt: ElementToDecrypt?, outputStream: OutputStream): Boolean {
+ fun decryptAttachment(attachmentStream: InputStream?,
+ elementToDecrypt: ElementToDecrypt?,
+ outputStream: OutputStream): Boolean {
// sanity checks
if (null == attachmentStream || elementToDecrypt == null) {
Timber.e("## decryptAttachment() : null stream")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/EncryptedFileInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/EncryptedFileInfo.kt
index 0ed6c0dac9..4fc3adb42c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/EncryptedFileInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/EncryptedFileInfo.kt
@@ -29,12 +29,6 @@ data class EncryptedFileInfo(
@Json(name = "url")
val url: String? = null,
- /**
- * Not documented
- */
- @Json(name = "mimetype")
- val mimetype: String? = null,
-
/**
* Required. A JSON Web Key object.
*/
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStoreMigration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStoreMigration.kt
index bca7914388..8e77f5b823 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStoreMigration.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStoreMigration.kt
@@ -18,6 +18,9 @@ package org.matrix.android.sdk.internal.crypto.store.db
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
+import io.realm.DynamicRealm
+import io.realm.RealmMigration
+import io.realm.RealmObjectSchema
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.internal.crypto.model.MXDeviceInfo
@@ -35,29 +38,24 @@ import org.matrix.android.sdk.internal.crypto.store.db.model.KeysBackupDataEntit
import org.matrix.android.sdk.internal.crypto.store.db.model.MyDeviceLastSeenInfoEntityFields
import org.matrix.android.sdk.internal.crypto.store.db.model.OlmInboundGroupSessionEntityFields
import org.matrix.android.sdk.internal.crypto.store.db.model.OlmSessionEntityFields
+import org.matrix.android.sdk.internal.crypto.store.db.model.OutboundGroupSessionInfoEntityFields
import org.matrix.android.sdk.internal.crypto.store.db.model.OutgoingGossipingRequestEntityFields
import org.matrix.android.sdk.internal.crypto.store.db.model.SharedSessionEntityFields
import org.matrix.android.sdk.internal.crypto.store.db.model.TrustLevelEntityFields
import org.matrix.android.sdk.internal.crypto.store.db.model.UserEntityFields
import org.matrix.android.sdk.internal.crypto.store.db.model.WithHeldSessionEntityFields
+import org.matrix.android.sdk.internal.di.MoshiProvider
import org.matrix.android.sdk.internal.di.SerializeNulls
-import io.realm.DynamicRealm
-import io.realm.RealmMigration
-import io.realm.RealmObjectSchema
-import org.matrix.android.sdk.internal.crypto.store.db.model.OutboundGroupSessionInfoEntityFields
import org.matrix.androidsdk.crypto.data.MXOlmInboundGroupSession2
import timber.log.Timber
-import javax.inject.Inject
import org.matrix.androidsdk.crypto.data.MXDeviceInfo as LegacyMXDeviceInfo
-internal class RealmCryptoStoreMigration @Inject constructor(private val crossSigningKeysMapper: CrossSigningKeysMapper) : RealmMigration {
+internal object RealmCryptoStoreMigration : RealmMigration {
- companion object {
- // 0, 1, 2: legacy Riot-Android
- // 3: migrate to RiotX schema
- // 4, 5, 6, 7, 8, 9: migrations from RiotX (which was previously 1, 2, 3, 4, 5, 6)
- const val CRYPTO_STORE_SCHEMA_VERSION = 12L
- }
+ // 0, 1, 2: legacy Riot-Android
+ // 3: migrate to RiotX schema
+ // 4, 5, 6, 7, 8, 9: migrations from RiotX (which was previously 1, 2, 3, 4, 5, 6)
+ const val CRYPTO_STORE_SCHEMA_VERSION = 12L
private fun RealmObjectSchema.addFieldIfNotExists(fieldName: String, fieldType: Class<*>): RealmObjectSchema {
if (!hasField(fieldName)) {
@@ -384,6 +382,8 @@ internal class RealmCryptoStoreMigration @Inject constructor(private val crossSi
private fun migrateTo7(realm: DynamicRealm) {
Timber.d("Step 6 -> 7")
Timber.d("Updating KeyInfoEntity table")
+ val crossSigningKeysMapper = CrossSigningKeysMapper(MoshiProvider.providesMoshi())
+
val keyInfoEntities = realm.where("KeyInfoEntity").findAll()
try {
keyInfoEntities.forEach {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt
index 2b3c3b28ee..6eccaf8774 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt
@@ -19,9 +19,10 @@ package org.matrix.android.sdk.internal.database
import io.realm.DynamicRealm
import io.realm.FieldAttribute
import io.realm.RealmMigration
-import org.matrix.android.sdk.api.session.room.model.VersioningState
import org.matrix.android.sdk.api.session.events.model.EventType
+import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
+import org.matrix.android.sdk.api.session.room.model.VersioningState
import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent
import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntityFields
@@ -40,14 +41,12 @@ import org.matrix.android.sdk.internal.database.model.SpaceChildSummaryEntityFie
import org.matrix.android.sdk.internal.database.model.SpaceParentSummaryEntityFields
import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
import org.matrix.android.sdk.internal.di.MoshiProvider
+import org.matrix.android.sdk.internal.query.process
import timber.log.Timber
-import javax.inject.Inject
-class RealmSessionStoreMigration @Inject constructor() : RealmMigration {
+internal object RealmSessionStoreMigration : RealmMigration {
- companion object {
- const val SESSION_STORE_SCHEMA_VERSION = 14L
- }
+ const val SESSION_STORE_SCHEMA_VERSION = 15L
override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
Timber.v("Migrating Realm Session from $oldVersion to $newVersion")
@@ -66,6 +65,7 @@ class RealmSessionStoreMigration @Inject constructor() : RealmMigration {
if (oldVersion <= 11) migrateTo12(realm)
if (oldVersion <= 12) migrateTo13(realm)
if (oldVersion <= 13) migrateTo14(realm)
+ if (oldVersion <= 14) migrateTo15(realm)
}
private fun migrateTo1(realm: DynamicRealm) {
@@ -292,7 +292,7 @@ class RealmSessionStoreMigration @Inject constructor() : RealmMigration {
Timber.d("Step 13 -> 14")
val roomAccountDataSchema = realm.schema.create("RoomAccountDataEntity")
.addField(RoomAccountDataEntityFields.CONTENT_STR, String::class.java)
- .addField(RoomAccountDataEntityFields.TYPE, String::class.java, FieldAttribute.INDEXED)
+ .addField(RoomAccountDataEntityFields.TYPE, String::class.java, FieldAttribute.INDEXED)
realm.schema.get("RoomEntity")
?.addRealmListField(RoomEntityFields.ACCOUNT_DATA.`$`, roomAccountDataSchema)
@@ -306,4 +306,16 @@ class RealmSessionStoreMigration @Inject constructor() : RealmMigration {
roomAccountDataSchema.isEmbedded = true
}
+
+ private fun migrateTo15(realm: DynamicRealm) {
+ // fix issue with flattenParentIds on DM that kept growing with duplicate
+ // so we reset it, will be updated next sync
+ realm.where("RoomSummaryEntity")
+ .process(RoomSummaryEntityFields.MEMBERSHIP_STR, Membership.activeMemberships())
+ .equalTo(RoomSummaryEntityFields.IS_DIRECT, true)
+ .findAll()
+ .onEach {
+ it.setString(RoomSummaryEntityFields.FLATTEN_PARENT_IDS, null)
+ }
+ }
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/SessionRealmConfigurationFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/SessionRealmConfigurationFactory.kt
index 244fe3432a..1771c5b202 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/SessionRealmConfigurationFactory.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/SessionRealmConfigurationFactory.kt
@@ -43,7 +43,6 @@ internal class SessionRealmConfigurationFactory @Inject constructor(
@SessionFilesDirectory val directory: File,
@SessionId val sessionId: String,
@UserMd5 val userMd5: String,
- val migration: RealmSessionStoreMigration,
context: Context) {
// Keep legacy preferences name for compatibility reason
@@ -72,7 +71,7 @@ internal class SessionRealmConfigurationFactory @Inject constructor(
.allowWritesOnUiThread(true)
.modules(SessionRealmModule())
.schemaVersion(RealmSessionStoreMigration.SESSION_STORE_SCHEMA_VERSION)
- .migration(migration)
+ .migration(RealmSessionStoreMigration)
.build()
// Try creating a realm instance and if it succeeds we can clear the flag
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt
index 4586cfea1e..ad2aff4c9d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt
@@ -42,7 +42,6 @@ import org.matrix.android.sdk.internal.legacy.riot.HomeServerConnectionConfig as
internal class DefaultLegacySessionImporter @Inject constructor(
private val context: Context,
private val sessionParamsStore: SessionParamsStore,
- private val realmCryptoStoreMigration: RealmCryptoStoreMigration,
private val realmKeysUtils: RealmKeysUtils
) : LegacySessionImporter {
@@ -172,7 +171,7 @@ internal class DefaultLegacySessionImporter @Inject constructor(
.name("crypto_store.realm")
.modules(RealmCryptoStoreModule())
.schemaVersion(RealmCryptoStoreMigration.CRYPTO_STORE_SCHEMA_VERSION)
- .migration(realmCryptoStoreMigration)
+ .migration(RealmCryptoStoreMigration)
.build()
Timber.d("Migration: copy DB to encrypted DB")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt
index 237411db53..f14c85cf80 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/UploadContentWorker.kt
@@ -234,7 +234,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
.also { filesToDelete.add(it) }
uploadedFileEncryptedFileInfo =
- MXEncryptedAttachments.encrypt(fileToUpload.inputStream(), attachment.getSafeMimeType(), encryptedFile) { read, total ->
+ MXEncryptedAttachments.encrypt(fileToUpload.inputStream(), encryptedFile) { read, total ->
notifyTracker(params) {
contentUploadStateTracker.setEncrypting(it, read.toLong(), total.toLong())
}
@@ -315,7 +315,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
if (params.isEncrypted) {
Timber.v("Encrypt thumbnail")
notifyTracker(params) { contentUploadStateTracker.setEncryptingThumbnail(it) }
- val encryptionResult = MXEncryptedAttachments.encryptAttachment(thumbnailData.bytes.inputStream(), thumbnailData.mimeType)
+ val encryptionResult = MXEncryptedAttachments.encryptAttachment(thumbnailData.bytes.inputStream())
val contentUploadResponse = fileUploader.uploadByteArray(
byteArray = encryptionResult.encryptedByteArray,
filename = null,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/IdentityModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/IdentityModule.kt
index 7a39a333a5..4d664b76be 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/IdentityModule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/IdentityModule.kt
@@ -60,7 +60,6 @@ internal abstract class IdentityModule {
@SessionScope
fun providesIdentityRealmConfiguration(realmKeysUtils: RealmKeysUtils,
@SessionFilesDirectory directory: File,
- migration: RealmIdentityStoreMigration,
@UserMd5 userMd5: String): RealmConfiguration {
return RealmConfiguration.Builder()
.directory(directory)
@@ -69,7 +68,7 @@ internal abstract class IdentityModule {
realmKeysUtils.configureEncryption(this, SessionModule.getKeyAlias(userMd5))
}
.schemaVersion(RealmIdentityStoreMigration.IDENTITY_STORE_SCHEMA_VERSION)
- .migration(migration)
+ .migration(RealmIdentityStoreMigration)
.allowWritesOnUiThread(true)
.modules(IdentityRealmModule())
.build()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/db/RealmIdentityStoreMigration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/db/RealmIdentityStoreMigration.kt
index 6081dbab12..21c0f8eb9e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/db/RealmIdentityStoreMigration.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/db/RealmIdentityStoreMigration.kt
@@ -19,13 +19,10 @@ package org.matrix.android.sdk.internal.session.identity.db
import io.realm.DynamicRealm
import io.realm.RealmMigration
import timber.log.Timber
-import javax.inject.Inject
-internal class RealmIdentityStoreMigration @Inject constructor() : RealmMigration {
+internal object RealmIdentityStoreMigration : RealmMigration {
- companion object {
- const val IDENTITY_STORE_SCHEMA_VERSION = 1L
- }
+ const val IDENTITY_STORE_SCHEMA_VERSION = 1L
override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
Timber.v("Migrating Realm Identity from $oldVersion to $newVersion")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt
index 449189e6b5..092fec4d72 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt
@@ -142,7 +142,7 @@ internal class DefaultSendService @AssistedInject constructor(
// The image has not yet been sent
val attachmentData = ContentAttachmentData(
size = messageContent.info!!.size,
- mimeType = messageContent.info.mimeType!!,
+ mimeType = messageContent.mimeType,
width = messageContent.info.width.toLong(),
height = messageContent.info.height.toLong(),
name = messageContent.body,
@@ -169,7 +169,7 @@ internal class DefaultSendService @AssistedInject constructor(
is MessageFileContent -> {
val attachmentData = ContentAttachmentData(
size = messageContent.info!!.size,
- mimeType = messageContent.info.mimeType!!,
+ mimeType = messageContent.mimeType,
name = messageContent.getFileName(),
queryUri = Uri.parse(messageContent.url),
type = ContentAttachmentData.Type.FILE
@@ -181,7 +181,7 @@ internal class DefaultSendService @AssistedInject constructor(
val attachmentData = ContentAttachmentData(
size = messageContent.audioInfo?.size ?: 0,
duration = messageContent.audioInfo?.duration?.toLong() ?: 0L,
- mimeType = messageContent.audioInfo?.mimeType,
+ mimeType = messageContent.mimeType,
name = messageContent.body,
queryUri = Uri.parse(messageContent.url),
type = ContentAttachmentData.Type.AUDIO
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt
index 7cbcfee713..842c9d3aba 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt
@@ -199,7 +199,6 @@ internal class RoomSummaryUpdater @Inject constructor(
measureTimeMillis {
val lookupMap = realm.where(RoomSummaryEntity::class.java)
.process(RoomSummaryEntityFields.MEMBERSHIP_STR, Membership.activeMemberships())
- .equalTo(RoomSummaryEntityFields.IS_DIRECT, false)
// we order by roomID to be consistent when breaking parent/child cycles
.sort(RoomSummaryEntityFields.ROOM_ID)
.findAll().map {
diff --git a/vector/build.gradle b/vector/build.gradle
index 36eee3329f..0085574683 100644
--- a/vector/build.gradle
+++ b/vector/build.gradle
@@ -14,7 +14,7 @@ kapt {
// Note: 2 digits max for each value
ext.versionMajor = 1
ext.versionMinor = 1
-ext.versionPatch = 12
+ext.versionPatch = 13
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'
@@ -246,6 +246,11 @@ android {
productFlavors {
gplay {
+ apply plugin: 'com.google.gms.google-services'
+ afterEvaluate {
+ tasks.matching { it.name.contains("GoogleServices") && !it.name.contains("Gplay") }*.enabled = false
+ }
+
dimension "store"
isDefault = true
versionName "${versionMajor}.${versionMinor}.${versionPatch}${getGplayVersionSuffix()}"
@@ -316,8 +321,8 @@ dependencies {
// Tests
def kluent_version = '1.67'
- def androidxTest_version = '1.3.0'
- def espresso_version = '3.3.0'
+ def androidxTest_version = '1.4.0'
+ def espresso_version = '3.4.0'
implementation project(":matrix-sdk-android")
implementation project(":matrix-sdk-android-rx")
@@ -336,7 +341,7 @@ dependencies {
implementation "androidx.fragment:fragment-ktx:$fragment_version"
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation "androidx.sharetarget:sharetarget:1.1.0"
- implementation 'androidx.core:core-ktx:1.5.0'
+ implementation 'androidx.core:core-ktx:1.6.0'
implementation "androidx.media:media:1.3.1"
implementation "androidx.transition:transition:1.4.1"
@@ -507,7 +512,3 @@ dependencies {
exclude group: 'org.jetbrains.kotlin'
}
}
-
-if (getGradle().getStartParameter().getTaskRequests().toString().contains("Gplay")) {
- apply plugin: 'com.google.gms.google-services'
-}
diff --git a/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt b/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt
index 759e130e29..92dc76670f 100644
--- a/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt
+++ b/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt
@@ -41,7 +41,7 @@ fun SearchView.withoutLeftMargin() {
}
fun EditText.hidePassword() {
- inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+ inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
}
fun View.getMeasurements(): Pair {
diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt
index 6d838b2812..79bf1055f4 100644
--- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt
+++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt
@@ -83,9 +83,9 @@ import java.util.concurrent.TimeUnit
import javax.inject.Provider
import kotlin.coroutines.CoroutineContext
-private const val STREAM_ID = "ARDAMS"
-private const val AUDIO_TRACK_ID = "ARDAMSa0"
-private const val VIDEO_TRACK_ID = "ARDAMSv0"
+private const val STREAM_ID = "userMedia"
+private const val AUDIO_TRACK_ID = "${STREAM_ID}a0"
+private const val VIDEO_TRACK_ID = "${STREAM_ID}v0"
private val DEFAULT_AUDIO_CONSTRAINTS = MediaConstraints()
class WebRtcCall(
@@ -274,12 +274,77 @@ class WebRtcCall(
peerConnection = peerConnectionFactory.createPeerConnection(rtcConfig, PeerConnectionObserver(this))
}
- fun attachViewRenderers(localViewRenderer: SurfaceViewRenderer?, remoteViewRenderer: SurfaceViewRenderer, mode: String?) {
- Timber.v("## VOIP attachViewRenderers localRendeder $localViewRenderer / $remoteViewRenderer")
- localSurfaceRenderers.addIfNeeded(localViewRenderer)
- remoteSurfaceRenderers.addIfNeeded(remoteViewRenderer)
-
+ /**
+ * Without consultation
+ */
+ fun transferToUser(targetUserId: String, targetRoomId: String?) {
sessionScope?.launch(dispatcher) {
+ mxCall.transfer(
+ targetUserId = targetUserId,
+ targetRoomId = targetRoomId,
+ createCallId = CallIdGenerator.generate(),
+ awaitCallId = null
+ )
+ endCall(sendEndSignaling = false)
+ }
+ }
+
+ /**
+ * With consultation
+ */
+ fun transferToCall(transferTargetCall: WebRtcCall) {
+ sessionScope?.launch(dispatcher) {
+ val newCallId = CallIdGenerator.generate()
+ transferTargetCall.mxCall.transfer(
+ targetUserId = mxCall.opponentUserId,
+ targetRoomId = null,
+ createCallId = null,
+ awaitCallId = newCallId
+ )
+ mxCall.transfer(
+ targetUserId = transferTargetCall.mxCall.opponentUserId,
+ targetRoomId = null,
+ createCallId = newCallId,
+ awaitCallId = null
+ )
+ endCall(sendEndSignaling = false)
+ transferTargetCall.endCall(sendEndSignaling = false)
+ }
+ }
+
+ fun acceptIncomingCall() {
+ sessionScope?.launch {
+ Timber.v("## VOIP acceptIncomingCall from state ${mxCall.state}")
+ if (mxCall.state == CallState.LocalRinging) {
+ internalAcceptIncomingCall()
+ }
+ }
+ }
+
+ /**
+ * Sends a DTMF digit to the other party
+ * @param digit The digit (nb. string - '#' and '*' are dtmf too)
+ */
+ fun sendDtmfDigit(digit: String) {
+ sessionScope?.launch {
+ for (sender in peerConnection?.senders.orEmpty()) {
+ if (sender.track()?.kind() == "audio" && sender.dtmf()?.canInsertDtmf() == true) {
+ try {
+ sender.dtmf()?.insertDtmf(digit, 100, 70)
+ return@launch
+ } catch (failure: Throwable) {
+ Timber.v("Fail to send Dtmf digit")
+ }
+ }
+ }
+ }
+ }
+
+ fun attachViewRenderers(localViewRenderer: SurfaceViewRenderer?, remoteViewRenderer: SurfaceViewRenderer, mode: String?) {
+ sessionScope?.launch(dispatcher) {
+ Timber.v("## VOIP attachViewRenderers localRendeder $localViewRenderer / $remoteViewRenderer")
+ localSurfaceRenderers.addIfNeeded(localViewRenderer)
+ remoteSurfaceRenderers.addIfNeeded(remoteViewRenderer)
when (mode) {
VectorCallActivity.INCOMING_ACCEPT -> {
internalAcceptIncomingCall()
@@ -299,67 +364,31 @@ class WebRtcCall(
}
}
- /**
- * Without consultation
- */
- suspend fun transferToUser(targetUserId: String, targetRoomId: String?) {
- mxCall.transfer(
- targetUserId = targetUserId,
- targetRoomId = targetRoomId,
- createCallId = CallIdGenerator.generate(),
- awaitCallId = null
- )
- endCall(sendEndSignaling = false)
- }
-
- /**
- * With consultation
- */
- suspend fun transferToCall(transferTargetCall: WebRtcCall) {
- val newCallId = CallIdGenerator.generate()
- transferTargetCall.mxCall.transfer(
- targetUserId = mxCall.opponentUserId,
- targetRoomId = null,
- createCallId = null,
- awaitCallId = newCallId
- )
- mxCall.transfer(
- targetUserId = transferTargetCall.mxCall.opponentUserId,
- targetRoomId = null,
- createCallId = newCallId,
- awaitCallId = null
- )
- endCall(sendEndSignaling = false)
- transferTargetCall.endCall(sendEndSignaling = false)
- }
-
- fun acceptIncomingCall() {
- sessionScope?.launch {
- Timber.v("## VOIP acceptIncomingCall from state ${mxCall.state}")
- if (mxCall.state == CallState.LocalRinging) {
- internalAcceptIncomingCall()
+ private suspend fun attachViewRenderersInternal() = withContext(dispatcher) {
+ // render local video in pip view
+ localSurfaceRenderers.forEach { renderer ->
+ renderer.get()?.let { pipSurface ->
+ pipSurface.setMirror(cameraInUse?.type == CameraType.FRONT)
+ // no need to check if already added, addSink is checking that
+ localVideoTrack?.addSink(pipSurface)
}
}
- }
- /**
- * Sends a DTMF digit to the other party
- * @param digit The digit (nb. string - '#' and '*' are dtmf too)
- */
- fun sendDtmfDigit(digit: String) {
- for (sender in peerConnection?.senders.orEmpty()) {
- if (sender.track()?.kind() == "audio" && sender.dtmf()?.canInsertDtmf() == true) {
- try {
- sender.dtmf()?.insertDtmf(digit, 100, 70)
- return
- } catch (failure: Throwable) {
- Timber.v("Fail to send Dtmf digit")
- }
+ // If remote track exists, then sink it to surface
+ remoteSurfaceRenderers.forEach { renderer ->
+ renderer.get()?.let { participantSurface ->
+ remoteVideoTrack?.addSink(participantSurface)
}
}
}
fun detachRenderers(renderers: List?) {
+ sessionScope?.launch(dispatcher) {
+ detachRenderersInternal(renderers)
+ }
+ }
+
+ private suspend fun detachRenderersInternal(renderers: List?) = withContext(dispatcher) {
Timber.v("## VOIP detachRenderers")
if (renderers.isNullOrEmpty()) {
// remove all sinks
@@ -452,24 +481,6 @@ class WebRtcCall(
})
}
- private fun attachViewRenderersInternal() {
- // render local video in pip view
- localSurfaceRenderers.forEach { renderer ->
- renderer.get()?.let { pipSurface ->
- pipSurface.setMirror(this.cameraInUse?.type == CameraType.FRONT)
- // no need to check if already added, addSink is checking that
- localVideoTrack?.addSink(pipSurface)
- }
- }
-
- // If remote track exists, then sink it to surface
- remoteSurfaceRenderers.forEach { renderer ->
- renderer.get()?.let { participantSurface ->
- remoteVideoTrack?.addSink(participantSurface)
- }
- }
- }
-
private suspend fun getTurnServer(): TurnServerResponse? {
return tryOrNull {
sessionProvider.get()?.callSignalingService()?.getTurnServer()
@@ -580,9 +591,11 @@ class WebRtcCall(
}
fun setCaptureFormat(format: CaptureFormat) {
- Timber.v("## VOIP setCaptureFormat $format")
- videoCapturer?.changeCaptureFormat(format.width, format.height, format.fps)
- currentCaptureFormat = format
+ sessionScope?.launch(dispatcher) {
+ Timber.v("## VOIP setCaptureFormat $format")
+ videoCapturer?.changeCaptureFormat(format.width, format.height, format.fps)
+ currentCaptureFormat = format
+ }
}
private fun updateMuteStatus() {
@@ -645,13 +658,17 @@ class WebRtcCall(
}
fun muteCall(muted: Boolean) {
- micMuted = muted
- updateMuteStatus()
+ sessionScope?.launch(dispatcher) {
+ micMuted = muted
+ updateMuteStatus()
+ }
}
fun enableVideo(enabled: Boolean) {
- videoMuted = !enabled
- updateMuteStatus()
+ sessionScope?.launch(dispatcher) {
+ videoMuted = !enabled
+ updateMuteStatus()
+ }
}
fun canSwitchCamera(): Boolean {
@@ -668,28 +685,30 @@ class WebRtcCall(
}
fun switchCamera() {
- Timber.v("## VOIP switchCamera")
- if (mxCall.state is CallState.Connected && mxCall.isVideoCall) {
- val oppositeCamera = getOppositeCameraIfAny() ?: return
- videoCapturer?.switchCamera(
- object : CameraVideoCapturer.CameraSwitchHandler {
- // Invoked on success. |isFrontCamera| is true if the new camera is front facing.
- override fun onCameraSwitchDone(isFrontCamera: Boolean) {
- Timber.v("## VOIP onCameraSwitchDone isFront $isFrontCamera")
- cameraInUse = oppositeCamera
- localSurfaceRenderers.forEach {
- it.get()?.setMirror(isFrontCamera)
+ sessionScope?.launch(dispatcher) {
+ Timber.v("## VOIP switchCamera")
+ if (mxCall.state is CallState.Connected && mxCall.isVideoCall) {
+ val oppositeCamera = getOppositeCameraIfAny() ?: return@launch
+ videoCapturer?.switchCamera(
+ object : CameraVideoCapturer.CameraSwitchHandler {
+ // Invoked on success. |isFrontCamera| is true if the new camera is front facing.
+ override fun onCameraSwitchDone(isFrontCamera: Boolean) {
+ Timber.v("## VOIP onCameraSwitchDone isFront $isFrontCamera")
+ cameraInUse = oppositeCamera
+ localSurfaceRenderers.forEach {
+ it.get()?.setMirror(isFrontCamera)
+ }
+ listeners.forEach {
+ tryOrNull { it.onCameraChanged() }
+ }
}
- listeners.forEach {
- tryOrNull { it.onCameraChanged() }
- }
- }
- override fun onCameraSwitchError(errorDescription: String?) {
- Timber.v("## VOIP onCameraSwitchError isFront $errorDescription")
- }
- }, oppositeCamera.name
- )
+ override fun onCameraSwitchError(errorDescription: String?) {
+ Timber.v("## VOIP onCameraSwitchError isFront $errorDescription")
+ }
+ }, oppositeCamera.name
+ )
+ }
}
}
@@ -718,11 +737,12 @@ class WebRtcCall(
return currentCaptureFormat
}
- private fun release() {
+ private suspend fun release() {
listeners.clear()
mxCall.removeListener(this)
timer.stop()
timer.tickListener = null
+ detachRenderersInternal(null)
videoCapturer?.stopCapture()
videoCapturer?.dispose()
videoCapturer = null
@@ -736,6 +756,8 @@ class WebRtcCall(
localAudioTrack = null
localVideoSource = null
localVideoTrack = null
+ remoteAudioTrack = null
+ remoteVideoTrack = null
cameraAvailabilityCallback = null
}
@@ -745,7 +767,7 @@ class WebRtcCall(
if (stream.audioTracks.size > 1 || stream.videoTracks.size > 1) {
Timber.e("## VOIP StreamObserver weird looking stream: $stream")
// TODO maybe do something more??
- mxCall.hangUp()
+ endCall(true)
return@launch
}
if (stream.audioTracks.size == 1) {
@@ -774,27 +796,27 @@ class WebRtcCall(
}
fun endCall(sendEndSignaling: Boolean = true, reason: CallHangupContent.Reason? = null) {
- if (mxCall.state == CallState.Terminated) {
- return
- }
- // Close tracks ASAP
- localVideoTrack?.setEnabled(false)
- localVideoTrack?.setEnabled(false)
- cameraAvailabilityCallback?.let { cameraAvailabilityCallback ->
- val cameraManager = context.getSystemService()!!
- cameraManager.unregisterAvailabilityCallback(cameraAvailabilityCallback)
- }
- val wasRinging = mxCall.state is CallState.LocalRinging
- mxCall.state = CallState.Terminated
sessionScope?.launch(dispatcher) {
+ if (mxCall.state == CallState.Terminated) {
+ return@launch
+ }
+ // Close tracks ASAP
+ localVideoTrack?.setEnabled(false)
+ localVideoTrack?.setEnabled(false)
+ cameraAvailabilityCallback?.let { cameraAvailabilityCallback ->
+ val cameraManager = context.getSystemService()!!
+ cameraManager.unregisterAvailabilityCallback(cameraAvailabilityCallback)
+ }
+ val wasRinging = mxCall.state is CallState.LocalRinging
+ mxCall.state = CallState.Terminated
release()
onCallEnded(callId)
- }
- if (sendEndSignaling) {
- if (wasRinging) {
- mxCall.reject()
- } else {
- mxCall.hangUp(reason)
+ if (sendEndSignaling) {
+ if (wasRinging) {
+ mxCall.reject()
+ } else {
+ mxCall.hangUp(reason)
+ }
}
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
index a0f87b9749..95d7acb571 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
@@ -39,13 +39,13 @@ import im.vector.app.features.home.room.detail.UnreadState
import im.vector.app.features.home.room.detail.timeline.factory.MergedHeaderItemFactory
import im.vector.app.features.home.room.detail.timeline.factory.ReadReceiptsItemFactory
import im.vector.app.features.home.room.detail.timeline.factory.TimelineItemFactory
+import im.vector.app.features.home.room.detail.timeline.factory.TimelineItemFactoryParams
import im.vector.app.features.home.room.detail.timeline.helper.ContentDownloadStateTrackerBinder
import im.vector.app.features.home.room.detail.timeline.helper.ContentUploadStateTrackerBinder
import im.vector.app.features.home.room.detail.timeline.helper.TimelineControllerInterceptorHelper
import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventDiffUtilCallback
import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventVisibilityHelper
import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventVisibilityStateChangedListener
-import im.vector.app.features.home.room.detail.timeline.factory.TimelineItemFactoryParams
import im.vector.app.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider
import im.vector.app.features.home.room.detail.timeline.item.AbsMessageItem
import im.vector.app.features.home.room.detail.timeline.item.BasedMergedItem
@@ -163,10 +163,19 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
override fun onChanged(position: Int, count: Int, payload: Any?) {
synchronized(modelCache) {
assertUpdateCallbacksAllowed()
- (position until (position + count)).forEach {
+ (position until position + count).forEach {
// Invalidate cache
modelCache[it] = null
}
+ // Also invalidate the first previous displayable event if
+ // it's sent by the same user so we are sure we have up to date information.
+ val invalidatedSenderId: String? = currentSnapshot.getOrNull(position)?.senderInfo?.userId
+ val prevDisplayableEventIndex = currentSnapshot.subList(0, position).indexOfLast {
+ timelineEventVisibilityHelper.shouldShowEvent(it, eventIdToHighlight)
+ }
+ if (prevDisplayableEventIndex != -1 && currentSnapshot[prevDisplayableEventIndex].senderInfo.userId == invalidatedSenderId) {
+ modelCache[prevDisplayableEventIndex] = null
+ }
requestModelBuild()
}
}
@@ -340,10 +349,14 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
val event = currentSnapshot[position]
val nextEvent = currentSnapshot.nextOrNull(position)
val prevEvent = currentSnapshot.prevOrNull(position)
+ val nextDisplayableEvent = currentSnapshot.subList(position + 1, currentSnapshot.size).firstOrNull {
+ timelineEventVisibilityHelper.shouldShowEvent(it, eventIdToHighlight)
+ }
val params = TimelineItemFactoryParams(
event = event,
prevEvent = prevEvent,
nextEvent = nextEvent,
+ nextDisplayableEvent = nextDisplayableEvent,
highlightedEventId = eventIdToHighlight,
lastSentEventIdWithoutReadReceipts = lastSentEventWithoutReadReceipts,
callback = callback
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
index b1bac3378e..4767269833 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
@@ -314,7 +314,7 @@ class MessageItemFactory @Inject constructor(
.leftGuideline(avatarSizeProvider.leftGuideline)
.imageContentRenderer(imageContentRenderer)
.contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
- .playable(messageContent.info?.mimeType == MimeTypes.Gif)
+ .playable(messageContent.mimeType == MimeTypes.Gif)
.highlighted(highlight)
.mediaData(data)
.apply {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactoryParams.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactoryParams.kt
index f92cd2800a..0e595ba30e 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactoryParams.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactoryParams.kt
@@ -23,6 +23,7 @@ data class TimelineItemFactoryParams(
val event: TimelineEvent,
val prevEvent: TimelineEvent? = null,
val nextEvent: TimelineEvent? = null,
+ val nextDisplayableEvent: TimelineEvent? = null,
val highlightedEventId: String? = null,
val lastSentEventIdWithoutReadReceipts: String? = null,
val callback: TimelineEventController.Callback? = null
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt
index 124b196f72..221149aced 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt
@@ -50,27 +50,28 @@ import javax.inject.Inject
class MessageInformationDataFactory @Inject constructor(private val session: Session,
private val roomSummariesHolder: RoomSummariesHolder,
private val dateFormatter: VectorDateFormatter,
+ private val visibilityHelper: TimelineEventVisibilityHelper,
private val vectorPreferences: VectorPreferences) {
fun create(params: TimelineItemFactoryParams): MessageInformationData {
val event = params.event
- val nextEvent = params.nextEvent
+ val nextDisplayableEvent = params.nextDisplayableEvent
val eventId = event.eventId
val date = event.root.localDateTime()
- val nextDate = nextEvent?.root?.localDateTime()
+ val nextDate = nextDisplayableEvent?.root?.localDateTime()
val addDaySeparator = date.toLocalDate() != nextDate?.toLocalDate()
val isNextMessageReceivedMoreThanOneHourAgo = nextDate?.isBefore(date.minusMinutes(60))
?: false
val showInformation =
addDaySeparator
- || event.senderInfo.avatarUrl != nextEvent?.senderInfo?.avatarUrl
- || event.senderInfo.disambiguatedDisplayName != nextEvent?.senderInfo?.disambiguatedDisplayName
- || nextEvent.root.getClearType() !in listOf(EventType.MESSAGE, EventType.STICKER, EventType.ENCRYPTED)
+ || event.senderInfo.avatarUrl != nextDisplayableEvent?.senderInfo?.avatarUrl
+ || event.senderInfo.disambiguatedDisplayName != nextDisplayableEvent?.senderInfo?.disambiguatedDisplayName
+ || nextDisplayableEvent.root.getClearType() !in listOf(EventType.MESSAGE, EventType.STICKER, EventType.ENCRYPTED)
|| isNextMessageReceivedMoreThanOneHourAgo
- || isTileTypeMessage(nextEvent)
- || nextEvent.isEdition()
+ || isTileTypeMessage(nextDisplayableEvent)
+ || nextDisplayableEvent.isEdition()
val time = dateFormatter.format(event.root.originServerTs, DateFormatKind.MESSAGE_SIMPLE)
val e2eDecoration = getE2EDecoration(event)
diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
index 9fc496a914..b247dbfcf6 100755
--- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
@@ -16,6 +16,7 @@
package im.vector.app.features.settings
import android.content.Context
+import android.content.SharedPreferences
import android.media.RingtoneManager
import android.net.Uri
import android.provider.MediaStore
@@ -253,6 +254,19 @@ class VectorPreferences @Inject constructor(private val context: Context) {
private val defaultPrefs = DefaultSharedPreferences.getInstance(context)
+ /**
+ * Allow subscribing and unsubscribing to configuration changes. This is
+ * particularly useful when you need to be notified of a configuration change
+ * in a background service, e.g. for the P2P demos.
+ */
+ fun subscribeToChanges(listener: SharedPreferences.OnSharedPreferenceChangeListener) {
+ defaultPrefs.registerOnSharedPreferenceChangeListener(listener)
+ }
+
+ fun unsubscribeToChanges(listener: SharedPreferences.OnSharedPreferenceChangeListener) {
+ defaultPrefs.unregisterOnSharedPreferenceChangeListener(listener)
+ }
+
/**
* Clear the preferences.
*/
diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml
index 7523be029e..0b37b4e046 100644
--- a/vector/src/main/res/values-cs/strings.xml
+++ b/vector/src/main/res/values-cs/strings.xml
@@ -2859,4 +2859,9 @@
Zadejte název nového serveru, který chcete prozkoumat.
Přidat nový server
Váš server
+ Přesto pokračovat
+ V současné době se lidé nemohou připojit k soukromým místnostem, které jste vytvořili.
+\n
+\nV rámci beta verze to zlepšíme, ale jen jsme vás chtěli informovat.
+ Prostory pro spolupracovníky nejsou ještě zcela připravené, ale přesto je můžete vyzkoušet
\ No newline at end of file
diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
index fa6d20d007..5b5fb0809d 100644
--- a/vector/src/main/res/values-de/strings.xml
+++ b/vector/src/main/res/values-de/strings.xml
@@ -511,7 +511,7 @@
Vorschau
Ablehnen
- Zur ersten ungelesenen Nachricht springen.
+ Zur ersten ungelesenen Nachricht
Du wurdest von %s in diesen Raum eingeladen
Diese Einladung wurde an %s gesendet, welche nicht mit diesem Konto verknüpft ist.
@@ -650,9 +650,9 @@
Benachrichtigungen für diesen Account aktivieren
Benachrichtigungen für diese Sitzung aktivieren
Bildschirm für 3 Sekunden aktivieren
- Nachrichten in direkten Chats
- Nachrichten in Gruppen-Chats
- Wenn ich in einen Raum eingeladen werde
+ Direktnachrichten
+ Gruppenchats
+ Einladungen
Anrufe
Nachrichten von Bots
Hintergrundsynchronisierung
@@ -741,7 +741,7 @@
Wer kann den Chatverlauf lesen?
Wer kann auf diesen Raum zugreifen?
- Jede*r
+ Alle
Nur Mitglieder (ab dem Zeitpunkt, an dem diese Option ausgewählt wurde)
Nur Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden)
Nur Mitglieder (ab dem Zeitpunkt, an dem sie beigetreten sind)
@@ -797,7 +797,7 @@
Sitzungsschlüssel
Verifizierungsstatus
Ed25519-Fingerabdruck
- Ende-zu-Ende-Verschlüsselungs-Raumschlüssel exportieren
+ Ende-zu-Ende-Raumschlüssel exportieren
Raumschlüssel exportieren
Schlüssel in lokale Datei exportieren
Exportieren
@@ -805,7 +805,7 @@
Passphrase bestätigen
Die Ende-zu-Ende-Raumschlüssel wurden in \'%s\' gespeichert.
\n
-\nAchtung: Diese Datei wird vielleicht gelöscht, wenn die App deinstalliert wird.
+\nWarnung: Diese Datei wird möglicherweise gelöscht, wenn die App deinstalliert wird.
Ende-zu-Ende-Raumschlüssel importieren
Raumschlüssel importieren
Schlüssel aus lokaler Datei importieren
@@ -877,7 +877,7 @@
Du hast keine Berechtigung, diese Aktion in diesem Raum auszuführen.
Anfrage beinhaltet keine Raum-ID.
Raum %s ist nicht sichtbar.
- Matrix-Apps hinzufügen
+ Integrationen hinzufügen
Benachrichtigungston
Anfrage konnte nicht gesendet werden.
Anfrage enthält keine user_id.
@@ -887,7 +887,7 @@
Synchronisiere…
Auf Ereignisse lauschen
Nachrichten mit meinem Anzeigenamen
- Nachrichten, die meinen Benutzernamen enthalten
+ Nachrichten mit meinen Benutzernamen
Du hast die neue Sitzung \'%s\' hinzugefügt, die jetzt Verschlüsselungs-Schlüssel anfordert.
Deine bislang nicht verifiziertes Sitzung \'%s\' fordert Verschlüsselungs-Schlüssel an.
Verifizierung beginnen
@@ -1028,7 +1028,7 @@
\n
\nMöchtest du welche hinzufügen\?
Account deaktivieren
- Deaktiviere meinen Account
+ Meinen Account deaktivieren
Sende Analysedaten
${app_name} sammelt anonyme Analysedaten um uns zu helfen, die App zu verbessern.
Bitte aktive Analysedaten um uns zu helfen ${app_name} zu verbessern.
@@ -1150,11 +1150,11 @@
Entfernen
Grund
Linkvorschau im Chat aktivieren, falls dein Home-Server diese Funktion unterstützt.
- Sende Schreibbenachrichtigungen
+ Schreibbenachrichtigungen senden
Lasse andere Benutzer wissen, dass du tippst.
Markdown-Formatierung
- Formatiere Nachrichten mittels Markdown-Syntax, bevor sie gesendet werden. Dies erlaubt erweiterte Formatierungen, etwa Sternchen (*) um kursiven Text anzuzeigen.
- Zeige Lesebestätigungen
+ Formatiere Nachrichten mittels Markdown-Syntax, bevor sie gesendet werden. Dies erlaubt erweiterte Formatierungen wie Sternchen (*), um kursiven Text anzuzeigen.
+ Lesebestätigungen zeigen
Klicke auf die Lesebestätigungen für eine detailliertere Liste.
Einladungen, Kicks und Banns bleiben unberührt.
Passwort
@@ -1223,7 +1223,7 @@
Einschränkungen deaktivieren
Batterieoptimierung
${app_name} wird nicht von Batterieoptimierungen beeinflusst.
- Fehler bei Benachrichtigungen finden
+ Benachrichtigungsprobleme finden
Diagnose von Fehlern
Basisdiagnose ist OK. Wenn du immer noch keine Benachrichtigungen bekommst, sende bitte einen Fehlerbericht, um uns beim Nachforschen zu helfen.
Prüfung der Play-Dienste
@@ -1254,8 +1254,8 @@
Konto hinzufügen
Laute Benachrichtigungen einstellen
Anrufbenachrichtigung einstellen
- Lautlose Benachrichtigungen einstellen
- Wähle LED-Farbe, Vibration, Ton…
+ Stumme Benachrichtigungen einstellen
+ LED-Farbe, Vibration, Ton usw. wählen
Stumm
Bitte eine Passphrase eingeben
Passphrase ist zu schwach
@@ -1391,7 +1391,7 @@
Mit Single-Sign-On anmelden
Diese URL ist nicht erreichbar, bitte prüfen
Dein Gerät nutzt eine veraltetes TLS-Sicherheitsprotokoll, das anfällig für Angriffe ist. Zu deiner Sicherheit wirst du nicht in der Lage sein, dich zu verbinden
- Schicke Nachricht mit Eingabetaste
+ Nachricht mit Eingabetaste senden
Eingabetaste der Bildschirmtastatur schickt die Nachricht ab, statt einen Zeilenumbruch zu erzeugen
Passwort aktualisieren
Das Passwort ist ungültig
@@ -1569,7 +1569,7 @@
Kannst du nicht finden, wonach du suchst\?
Erstelle einen neuen Raum
Name oder ID (#beispiel:matrix.org)
- Aktiviere Wischen, um in der Zeitleiste zu antworten
+ Wischen, um in der Zeitleiste zu antworten
Kein Ergebnis gefunden. Verwende \'Mit Matrix-ID hinzufügen\', um auf dem Server zu suchen.
Beginne mit der Eingabe, um Ergebnisse zu erhalten
Filtern nach Benutzername oder ID…
@@ -1638,7 +1638,7 @@
Integrationen
Benutze einen Integrations-Manager um Bots, Brücken, Widgets und Sticker-Pakete zu verwalten.
\nIntegrations-Manager erhalten Konfigurationsdaten und können Widgets verändern, Raum-Einladungen senden und in deinem Namen Berechtigungslevel setzen.
- Erlaube Integrationen
+ Integrationen erlauben
Widget
Widget laden
Dieses Widget wurde hinzugefügt von:
@@ -1659,7 +1659,7 @@
Mikrofon benutzen
Lese DRM-geschützte Medien
Du wirst nicht über eingehende Nachrichten benachrichtigt, wenn die App im Hintergrund ist.
- Verwalte deine Erkennungseinstellungen.
+ Erkennungseinstellungen verwalten.
Zugriff für mich zurückziehen
Sitzungsname:
Format:
@@ -1989,7 +1989,7 @@
\nSchlüssel sind nicht vertrauenswürdig
Cross-Signing ist nicht aktiviert
Aktive Sitzungen
- Zeige alle Sitzungen
+ Alle Sitzungen anzeigen
Sitzungen verwalten
Diese Sitzung abmelden
Keine kryptografischen Informationen verfügbar
@@ -2101,8 +2101,8 @@
Speichere ihn auf einem USB-Stick oder auf einem Sicherungslaufwerk
Import der Schlüssel fehlgeschlagen
Benachrichtigungskonfiguration
- Nachrichten, die @raum enthalten
- Verschlüsselte Nachrichten in Gruppenchats
+ Nachrichten mit \"@room\"
+ Verschlüsselte Gruppenchats
Setze die Benachrichtigungspräferenz abhängig vom Ereignistyp
Sendet eine Nachricht als einfachen Text, ohne sie als Markdown zu interpretieren
Inkorrekter Benutzername und/oder Passwort. Das eingegebene Passwort beginnt oder endet mit Leerzeichen, bitte kontrolliere es.
@@ -2113,7 +2113,7 @@
Kopier es in deinen persönlichen Cloud-Speicher
Verschlüsselung ist nicht aktiviert
Dies kann nicht von einem mobilen Gerät erfolgen
- Wenn Räume verbessert werden
+ Raumupgrades
Verschlüsselung aktiviert
Nachrichten in diesem Raum sind Ende-zu-Ende-verschlüsselt. Erfahre mehr & verifiziere Benutzer in deren Profil.
Die Verschlüsselung in diesem Raum wird nicht unterstützt
@@ -2123,7 +2123,7 @@
%s hat den Raum erstellt und konfiguriert.
Fast geschafft! Zeigt das andere Gerät das gleiche Schild an\?
Fast geschafft! Warte auf Bestätigung…
- Verschlüsselte Nachrichten in 1:1 Chats
+ Verschlüsselte Direktnachrichten
Nachricht…
Verifiziere dich & andere, um eure Chats zu schützen
Gib zum Fortfahren deinen %s ein
@@ -2150,7 +2150,7 @@
nutze deinen Schlüsselbackup-Wiederherstellungsschlüssel
Wenn du dein Schlüsselbackup-Passwort nicht weißt, kannst du %s.
Schlüsselbackup-Wiederherstellungsschlüssel
- Verhindere Screenshots innerhalb der Anwendung
+ Screenshots innerhalb der Anwendung verhindern
Das Aktivieren dieser Einstellung setzt das FLAG_SECURE in allen Aktivitäten. Starte die Anwendung neu, damit die Änderung wirksam wird.
Datei wurde der Galerie hinzugefügt
Datei konnte nicht zur Galerie hinzugefügt werden
@@ -2381,7 +2381,7 @@
Aktiviere PIN
Wenn du deine PIN zurücksetzen möchtest, tippe \"PIN vergessen\" um dich abzumelden und sie anschließend zurückzusetzen.
Bestätige PIN um die PIN zu deaktivieren
- Verhindere versehentliche Anrufe
+ Versehentliche Anrufe verhindern
Bitte um Bestätigung, bevor du einen Anruf tätigst
Einrichten
Dir fehlt die Berechtigung in diesem Raum eine Konferenz zu starten
@@ -2397,7 +2397,7 @@
- %1$d/%2$d Schlüssel erfolgreich importiert.
- %1$d/%2$d Schlüssel erfolgreich importiert.
- Verwalte Integrationen
+ Integrationen verwalten
Keine aktiven Widgets
Der Raum wurde erstellt, aber manche Einladungen wurden aus folgendem Grund nicht versendet:
\n
@@ -2456,7 +2456,7 @@
Aktiviere Gerät-spezifische Biometrie wie Fingerabdrücke und Gesichtserkennung.
Biometrie aktivieren
Schutz konfigurieren
- Zugriff schützen
+ Zugriffsschutz
Schütze den Zugriff mit PIN und Biometrie.
- Zeigen das Gerät, mit dem du jetzt überprüfen kannst
@@ -2556,7 +2556,7 @@
Hey, schreibe mit mir auf ${app_name}: %s
Freunde einladen
Leute hinzufügen
- "Thema "
+ "Thema: "
Füge ein Thema hinzu
%s, um zu zeigen um was es in diesem Raum geht.
Das ist der Anfang deiner Direktnachrichten mit %s.
@@ -2579,7 +2579,7 @@
Der Raum ist gerade nicht zugänglich.
\nVersuche es später nochmal, oder bitte einen Raum-Admin um Hilfe.
Eine neue Adresse veröffentlichen
- Mit einer öffentlichen Adresse kann jede*r mit jedem Server deinem Raum beitreten. Um eine Adresse zu veröffentlichen, muss sie zuerst als lokale Adresse gesetzt sein.
+ Mit einer öffentlichen Adresse kann jeder den Raum betreten. Um eine Adresse zu veröffentlichen, muss sie zuerst als lokale Adresse gesetzt sein.
Diesen Raum im Verzeichnis von %1$s veröffentlichen\?
Die Adresse \"%1$s\" nicht mehr veröffentlichen\?
Diese Adresse nicht mehr veröffentlichen
@@ -2629,7 +2629,7 @@
Knopf zum Nachrichteneditor hinzufügen, der die Emoji-Tastatur öffnet
Emoji-Tastatur anzeigen
Nutze /confetti Kommando oder sende Nachrichten, die ❄️ oder 🎉 enthalten
- Chat-Effekte zeigen
+ Chateffekte
Thema ändern
Raum aktualisieren
Rollen, die zum Ändern verschiedener Teile des Raums erforderlich sind, auswählen
@@ -2642,8 +2642,8 @@
Cross-Signing konnte nicht eingerichtet werden
Nicht autorisierte, fehlende gültige Authentifizierungsdaten
Nutzer
- Beim Übertragen des Anrufs ist ein Fehler aufgetreten
- Übertragen
+ Beim Weiterleiten des Anrufs ist ein Fehler aufgetreten
+ Weiterleiten
Verbinden
- 1 aktiver Anruf (%1$s) · 1 pausierter Anruf
@@ -2735,7 +2735,7 @@
Senden der Nachricht gescheitert
Wird gesendet
Nachricht gesendet
- Zuerst nachfragen
+ Zuerst anfragen
Privat
Öffentlich
Du kannst dies später ändern
@@ -2755,9 +2755,9 @@
Diese werden kein Teil von %s sein
Tritt meinem Space %1$s %2$s bei
Willkommen zu %1$s, %2$s.
- Warnung benötigt Server Unterstützung und eine experimentelle Raumversion
+ Warnung: benötigt Server-Unterstützung und eine experimentelle Raumversion
Experimenteller Space - Zugangsbeschränkter Raum.
- Mit Spaces hast du die Möglichkeit Personen und Räume zu gruppieren.
+ Mit Spaces kannst du Personen und Räume zu gruppieren.
Sag hallo zu Spaces!
Füge bereits existierende Räume und Spaces hinzu
Vorübergehend überspringen
@@ -2791,7 +2791,7 @@
Meine Teamkameraden und ich
Ein privater Space um deine Räume zu organisieren
Um einem bereits existierenden Space beizutreten, benötigst du eine Einladung.
- Wir haben Spaces entwickelt, damit ihr eure vielen Räume besser organisieren könnt.
+ Wir haben Spaces entwickelt, damit ihr eure Räume besser organisieren könnt
Dein privater Space
Dein öffentlicher Space
Betrete einen Space mit der angegebenen ID
@@ -2866,4 +2866,11 @@
Spaces Feedback
Dieser Server ist schon in der Liste vorhanden
Server oder Raumliste kann nicht gefunden werden
+ Momentan kann es sein, dass einige Leute deinen privaten Räumen nicht beitreten können.
+\n
+\nDies werden wir demnächst als Teil der Beta verbessern, wir wollten aber sicherstellen, dass du bescheid weißt.
+ Team-Spaces sind noch nicht fertig entwickelt, du kannst sie aber schon testen
+ Trotzdem fortfahren
+ Bei %1$s anfragen
+ Zu %1$s weiterleiten
\ No newline at end of file
diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml
index 88081c59c5..49761f6d88 100644
--- a/vector/src/main/res/values-et/strings.xml
+++ b/vector/src/main/res/values-et/strings.xml
@@ -2806,4 +2806,9 @@
Sisesta serveri nimi, mille sisu sa soovid uurida.
Lisa uus server
Sinu server
+ Kaasteeliste kogukonnakeskused pole veel päris valmis, aga sa võid neid juba proovida
+ Jätka ikkagi
+ Hetkel teiste kasutajate liitumine sinu poolt tehtud privaatsete jututubadega ei pruugi õnnestuda.
+\n
+\nKuna tegemist on beetaversiooniga, siis me veel parandame seda funktsionaalsust, aga lihtsalt tahtsime sind teavitada.
\ No newline at end of file
diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml
index 2d5cad33f3..c33afe70d1 100644
--- a/vector/src/main/res/values-fr/strings.xml
+++ b/vector/src/main/res/values-fr/strings.xml
@@ -2813,4 +2813,9 @@
Ajouter un nouveau serveur
Votre serveur
Consultation de %1$s
+ Pour l’instant, vos coéquipiers pourraient ne pas pouvoir rejoindre les salons privés que vous créez.
+\n
+\nNous allons améliorer ceci dans la bêta, mais nous voulions vous en faire part.
+ Les espaces pour les équipes ne sont pas tout à fait prêts, mais vous pouvez quand même les essayer
+ Poursuivre malgré tout
\ No newline at end of file
diff --git a/vector/src/main/res/values-fy/strings.xml b/vector/src/main/res/values-fy/strings.xml
index 12a1df9012..5bdcc26d1f 100644
--- a/vector/src/main/res/values-fy/strings.xml
+++ b/vector/src/main/res/values-fy/strings.xml
@@ -630,4 +630,39 @@
Iepenbier
Eltsenien kin by disse keamer oankopje, leden kinne don akseptearje as ôfslaan
Eltsenien dyt in link nei disse keamer hat, sels gasten
+ Do hast gjin brûkers negearre
+ Negearre brûkers
+ Stim & Fideo
+ Avansearre ynstellingen
+ Oanpaste en avansearre ynstellingen
+ Akkount Tafoegje
+ Oanpaste Ynstellingen.
+ Ynskeakelje
+ Ynskeakelje
+ Notifikaasjes binne ynskeakele foar dyn akkount.
+ Akkount Ynstellingen.
+ Ynstellingen Iepenje
+ Notifikaasjes binne ynskeakele yn de systeem ynstellingen.
+ Systeem Ynstellingen.
+ Tests Útfiere
+ Telefoannûmers
+ E-mailadressen
+ Wachtwurd befêstigje
+ Applikaasje informaasje yn de systeem ynstellingen sjen litte.
+ Applikaasje informaasje
+ Telefoannûmer tafoegje
+ Der is gjin telefoannûmer tafoege oan syn akkount
+ E-mailadres tafoegje
+ Email
+ Ynstellingen
+ Petear Ferlitte
+ Direkt Petear
+ Alle berjochten
+ Alle berjochten (lûd)
+ Ynstellingen
+ Ynstellingen feroarje
+ Keamer rjochten
+ Do hast de tsjinner ACLs foar dizze keamer feroare.
+ %s hat de tsjinner ACLs foar dizze keamer feroare.
+ Do hast dyn profyl ôfbylding feroare
\ No newline at end of file
diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml
index 797ea4f036..ba1e3a9e8e 100644
--- a/vector/src/main/res/values-hu/strings.xml
+++ b/vector/src/main/res/values-hu/strings.xml
@@ -2811,4 +2811,9 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Add meg a felfedezni kívánt új szerver nevét.
Új szerver hozzáadása
Matrix szervered
+ Az emberek jelen pillanatban nem fognak tudni csatlakozni egyetlen olyan privát szobához sem amit készítettél.
+\n
+\nEzt folyamatosan fejlesztjük a béta program keretében, csak szerettünk volna tájékoztatni róla.
+ A csoporttárs terek még nem igazán vannak készen de már tehetsz velük egy próbát
+ Mindenképpen folytatás
\ No newline at end of file
diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml
index 2bffefc310..1792d09cae 100644
--- a/vector/src/main/res/values-it/strings.xml
+++ b/vector/src/main/res/values-it/strings.xml
@@ -1430,10 +1430,7 @@
\nNome sessione: %1$s
\nUltimo accesso: %2$s
\nSe non hai effettuato l\'accesso da un\'altra sessione, ignora questa richiesta.
- Una sessione non verificata sta chiedendo le chiavi crittografiche.
-\nNome sessione: %1$s
-\nUltimo accesso: %2$s
-\nSe non hai effettuato l\'accesso da un\'altra sessione, ignora questa richiesta.
+ Una sessione non verificata sta chiedendo le chiavi crittografiche.\nNome sessione: %1$s\nUltimo accesso: %2$s\nSe non hai effettuato l\'accesso da un\'altra sessione, ignora questa richiesta.
Verifica
Condividi
Richiesta condivisione chiavi crittografiche
@@ -1897,12 +1894,7 @@
Per avere la massima certezza effettuate l\'operazione tramite un mezzo di comunicazione già fidato oppure fatelo di persona.
Il badge verde garantisce che l\'identità dell\'utente è verificata. Verifica tutti gli utenti in una stanza per assicurarti che sia sicura.
Non sicuro
- Uno dei seguenti potrebbe essere compromesso:
-\n
-\n - Il tuo Home Server
-\n - L\'Home Server al quale è connesso l\'utente che stai verificando
-\n - La tua connessione internet o quella dell\'altro utente
-\n - Il tuo dispositivo o quello dell\'altro utente
+ Uno dei seguenti potrebbe essere compromesso:\n\n - Il tuo Home Server\n - L\'Home Server al quale è connesso l\'utente che stai verificando\n - La tua connessione internet o quella dell\'altro utente\n - Il tuo dispositivo o quello dell\'altro utente
Video.
Immagine.
Audio
@@ -2868,4 +2860,9 @@
Inserisci il nome di un nuovo server che vuoi esplorare.
Aggiungi un nuovo server
Il tuo server
+ Al momento le persone potrebbero non poter entrare nelle stanze private che crei.
+\n
+\nMiglioreremo questa cosa come parte della beta, ma volevamo almeno fartelo sapere.
+ Gli spazi dei compagni non sono ancora pronti del tutto, ma puoi comunque provarli
+ Continua comunque
\ No newline at end of file
diff --git a/vector/src/main/res/values-nb-rNO/strings.xml b/vector/src/main/res/values-nb-rNO/strings.xml
index 827c7ceaae..bf220237da 100644
--- a/vector/src/main/res/values-nb-rNO/strings.xml
+++ b/vector/src/main/res/values-nb-rNO/strings.xml
@@ -140,7 +140,7 @@
Ignorer
Folk
Filer
- Instillinger
+ Innstillinger
BLE MED
Avbryt opplastning
Avbryt nedlasting
@@ -318,7 +318,7 @@
Lyd
Galleri
Demp
- Instillinger
+ Innstillinger
Lær mer
Annet
Fortsett
@@ -349,7 +349,7 @@
Logg på
Logg på
Passord
- Instillinger
+ Innstillinger
Gjeldende økt
Føyer til ¯\\_(ツ)_/¯ på en råtekstmelding
Video.
@@ -897,13 +897,13 @@
Denne hjemmetjeneren vil vite om du er en robot
Registrering med e-post og telefonummer samtidig fungerer ikke enda. Bare telefonummeret kommer til å bli registrert.
\n
-\nDu kan legge e-postadressen din til i instillinger.
- Bruk egendefinerte tjenerinstillinger (avansert)
+\nDu kan legge e-postadressen din til i innstillinger.
+ Bruk egendefinerte tjenerinnstillinger (avansert)
Klarte ikke å starte en sanntidskopling.
\nVennligst be hjemmetjeneradministratoren din om å sette opp en TURN server så samtaler blir mer stabile.
Vennligst be administratoren for hjemmetjeneren din (%1$s) til å sette opp en TURN tjener for at telefonsamtaler skal fungere ordentlig.
\n
-\nAlternativt kan du prøve å bruke den offentlige tjeneren på %2$s, men dette vil ikke være like stabilt, og det vil dele IP-adressen din med den serveren. Du kan styre dette i instillinger.
+\nAlternativt kan du prøve å bruke den offentlige tjeneren på %2$s, men dette vil ikke være like stabilt, og det vil dele IP-adressen din med den serveren. Du kan styre dette i innstillinger.
E-postkoblingen som ikke er klikket på ennå
Dette brukernavnet er allerede brukt
Inneholdt ikke gyldig JSON
diff --git a/vector/src/main/res/values-nl/strings.xml b/vector/src/main/res/values-nl/strings.xml
index b2c1aff6ec..a76c94cc05 100644
--- a/vector/src/main/res/values-nl/strings.xml
+++ b/vector/src/main/res/values-nl/strings.xml
@@ -1477,4 +1477,66 @@
%1$s heeft de kamer aangemaakt
Jouw uitnodiging
Je hebt een afbeelding gestuurd.
+ U heeft %1$s verbannen. Reden: %2$s
+ U heeft de verbanning van %1$s opgeheven. Reden: %2$s
+ U heeft %1$s eruit getrapt. Reden: %2$s
+ U heeft de uitnodiging geweigerd. Reden: %1$s
+ U bent vertrokken. Reden: %1$s
+ %1$s is vertrokken. Reden: %2$s
+ U heeft de ruimte verlaten. Reden: %1$s
+ U heeft zich aangesloten. Reden: %1$s
+ %1$s heeft zich aangesloten. Reden: %2$s
+ U heeft zich aangesloten bij de kamer. Reden: %1$s
+
+ - %1$s, %2$s, %3$s en %4$d andere
+ - %1$s, %2$s, %3$s en %4$d anderen
+
+ %1$s, %2$s, %3$s en %4$s
+ %1$s, %2$s en %3$s
+ %1$s van %2$s naar %3$s
+ %1$s heeft het machtigingsniveau van %2$s aangepast.
+ U heeft het machtigingsniveau van %1$s aangepast.
+ Speciaal
+ Speciaal (%1$d)
+ Standaardlid
+ Beheerder
+ U heeft de videoconferentie aangepast
+ Videoconferentie aangepast door %1$s
+ U heeft de videoconferentie beëindigd
+ Videoconferentie beëindigd door %1$s
+ U heeft een videoconferentie gestart
+ Videoconferentie gestart door %1$s
+ U heeft de widget %1$s aangepast
+ %1$s heeft de widget %2$s aangepast
+ U heeft de widget %1$s verwijderd
+ %1$s heeft de widget %2$s verwijderd
+ U heeft de widget %1$s toegevoegd
+ %1$s heeft de widget %2$s toegevoegd
+ U heeft de uitnodiging voor %1$s geaccepteerd
+ U heeft de uitnodiging voor %1$s ingetrokken
+ %1$s heeft de uitnodiging voor %2$s ingetrokken
+ U heeft de uitnodiging voor %1$s ingetrokken om zich bij de kamer aan te sluiten
+ U heeft een uitnodiging gestuurd naar %1$s om zich bij de kamer aan te sluiten
+ U heeft de kameravatar verwijderd
+ %1$s heeft de kameravatar verwijderd
+ U heeft het kameronderwerp verwijderd
+ U heeft de kamernaam verwijderd
+ U heeft de ruimte geüpgradet.
+ U verstuurde data om het gesprek op te zetten.
+ %s verstuurde data om het gesprek op te zetten.
+ U heeft een audiogesprek geopend.
+ U heeft een videogesprek geopend.
+ U heeft de ruimtenaam veranderd naar: %1$s
+ U heeft de ruimteavatar aangepast
+ %1$s heeft de ruimteavatar aangepast
+ U heeft het onderwerp gewijzigd naar: %1$s
+ U heeft uw weergavenaam verwijderd (voorheen %1$s)
+ U heeft de uitnodiging van %1$s ingetrokken
+ U heeft %1$s verbannen
+ U heeft de verbanning van %1$s opgeheven
+ U heeft %1$s eruit getrapt
+ U sloot zich aan
+ %1$s sluit aan
+ Je hebt de kamer betreden
+ Je hebt een sticker verzonden.
\ No newline at end of file
diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml
index db7f940e38..f1aa5b6fb9 100644
--- a/vector/src/main/res/values-pt-rBR/strings.xml
+++ b/vector/src/main/res/values-pt-rBR/strings.xml
@@ -313,8 +313,8 @@
Convidar
Fazer signout
- Chamada de Voz
- Chamada de Vídeo
+ Chamar por Voz
+ Chamar por Vídeo
Pesquisa global
Marcar tudo como lido
Histórico
@@ -359,7 +359,7 @@
Enviar crash logs
Enviar screenshot
Reportar bug
- Por favor descreva o bug. O que você fez\? O que você esperava que acontecese\? O que aconteceu na verdade\?
+ Por favor descreva o bug. O que você fez\? O que você esperava que acontecesse\? O que na verdade aconteceu\?
Descreva seu problema aqui
A fim de diagnosticar problemas, logs deste cliente vão ser enviados com este reporte de bug. Este reporte de bug, incluindo os logs e o screenshot, não será visível publicamente. Se você prefere somente enviar o texto acima, por favor desmarque:
Você parece estar agitando o telefone em frustração. Você gostaria de abrir a tela de reporte de bug\?
@@ -429,7 +429,7 @@
Falha para verificar endereço de email: assegure-se que clicou no link no email
Sua senha tem sido resettada.
\n
-\nVocê tem sido feito logout de todas as sessões e não vai mais receber notificações push. Para reativar notificações, faça re-login em cada dispositivo.
+\nVocê tem sido feito logout de todas as sessões e não vai mais receber notificações push. Para re-ativar notificações, re-faça login em cada dispositivo.
URL deve começar com http[s]://
Incapaz de fazer login: Erro de rede
@@ -640,7 +640,7 @@
Versão
Termos & condições
Notas de terceiros
- Direito de autor
+ Copyright
Política de privacidade
Imagem de Perfil
@@ -667,7 +667,7 @@
versão de olm
Termos & condições
Notas de terceiros
- Direitos de autor
+ Copyright
Política de privacidade
Limpar cache
@@ -894,7 +894,7 @@
Lista de Grupos
Chamar
Banir usuária(o) vai expulsá-la(o) desta sala e preveni-la(o) de se juntar de novo.
- Todas as mensagens (barulhentas)
+ Todas as mensagens (barulhento)
Todas as mensagens
Menções somente
Mudo
@@ -1015,7 +1015,7 @@
Avatar de recibo
Avatar de nota
Avatar
- Agite com raiva para reportar bug
+ Agitar com raiva para reportar bug
Normal
Privacidade reduzida
O app precisa de permissão para rodar no background
@@ -1077,7 +1077,7 @@
Privacidade de Notificação
${app_name} pode rodar no background para gerenciar suas notificações seguramente e privadamente. Isto pode afetar uso de bateria.
Conceder permissão
- Escolha um outra opção
+ Escolher uma outra opção
Enviar dados de analítica
${app_name} coleta analítica anônima para nos permitir melhorar o aplicativo.
Por favor ative analítica para nos ajudar a melhorar ${app_name}.
@@ -1203,7 +1203,7 @@
Enviar notificações de digitação
Deixar outras(os) usuárias(os) saberem que você está digitando.
Mostrar recibos de leitura
- Clicar nos recibos de leitura para uma lista detalhada.
+ Clique nos recibos de leitura para uma lista detalhada.
Mostrar eventos de juntar-se e sair
Convites, expulsões e bans são desafetados.
Mostrar eventos de conta
@@ -1358,7 +1358,7 @@
Desbanir usuária(o)
Desbanir usuária(o) vai permitir-lhe se juntar à sala de novo.
Confirme sua senha
- Você não pode fazer isto de ${app_name} celular
+ Você não pode fazer isto desde ${app_name} mobile
Autenticação é requerida
O app não precisa de se conectar ao ServidorCasa no background, isto deveria reduzir uso de bateria
Modo Sinc no Background
@@ -1387,7 +1387,7 @@
Gere uma nova Chave de Segurança ou defina uma nova Frase de Segurança para seu backup existente.
Isto vai substituir sua Chave ou Frase atual.
Descoberta
- Gerencie suas configurações de descoberta.
+ Gerenciar suas configurações de descoberta.
Modo de economia de dados aplica um filtro específico para que atualizações de presença e notificações de digitação sejam filtradas fora.
Permitir integrações
Gerenciador de Integração
@@ -1600,9 +1600,9 @@
Você recebeu uma requisição de verificação entrante.
Visualizar requisição
Esperando por parceira(o) confirmar…
- Verificada!
+ Verificada(o)!
Você tem confirmado esta sessão com sucesso.
- Mensagens seguras com esta(e) usuária(o) estão encriptadas ponta-a-ponta e não são capazes de ser lidas por terceiros.
+ Mensagens seguras com esta(e) usuária(o) são encriptadas ponta-a-ponta e não são capazes de ser lidas por terceiros.
Entendido
Nada aparecendo\? Não todos os clientes suportam verificação interativa ainda. Use verificação legado.
Usar verificação legado.
@@ -1637,10 +1637,10 @@
Convidada(o) por %s
Você está em dia!
Você não tem mais nenhuma mensagem não-lida
- Boas-vindas!
+ Boas-vindas a casa!
Fique em dia com suas mensagens não-lidas aqui
Conversas
- Suas conversas de mensagem direta vai ser exibidas aqui. Toque no + à direita fundo para começar algumas.
+ Suas conversas de mensagem direta vão ser exibidas aqui. Toque no + à direita fundo para começar algumas.
Salas
Suas salas vão ser exibidas aqui. Toque no + à direita fundo para encontrar umas existentes ou começar algumas propriamente suas.
Reações
@@ -1669,7 +1669,7 @@
Nova Sala
CRIAR
Nome
- Público
+ Pública
Qualquer pessoa vai ser capaz de se juntar a esta sala
Diretório de Salas
Publicar esta sala no diretório de salas
@@ -1816,7 +1816,7 @@
\nPor favor permita acesso no próximo pop-up para ser capaz de exportar suas chaves manualmente.
Não há nenhuma conexão de rede no momento
Ignorar usuária(o)
- Todas as mensagens (barulhentas)
+ Todas as mensagens (barulhento)
Todas as mensagens
Menções somente
Mutar
@@ -1840,13 +1840,13 @@
Faça chat com pessoas diretamente ou em grupos
Mantenha conversas privadas com encriptação
Extenda & personalize sua experiência
- Comece agora
+ Começar agora
Selecione um servidor
Assim como email, contas têm uma casa, embora você pode falar com qualquer pessoa
Junte-se a milhões de graça no maior servidor público
Hospedagem premium para organizações
Saiba mais
- Outros
+ Outro
Configurações personalizadas & avançadas
Continuar
Conectar-se a %1$s
@@ -1943,7 +1943,7 @@
Este não é um identificador de usuária(o) válido. Formato esperado: \'@usuarix:servidorcasa.org\'
Incapaz de encontrar um servidorcasa válido. Por favor cheque seu identificador
Vista por
- Você fez signout
+ Você está com signout feito
Pode ser devido a várias razões:
\n
\n• Você tem mudado sua senha numa outra sessão.
@@ -1952,7 +1952,7 @@
\n
\n• O/a administrador(a) de seu servidor tem invalidado seu acesso por razão de segurança.
Fazer signin de novo
- Você fez signout
+ Você está com signout feito
Fazer signin
A/o admin de seu servidorcasa (%1$s) fez seu signout de sua conta %2$s (%3$s).
Faça signin para recuperar chaves de encriptação armazenadas exclusivamente neste dispositivo. Você precisa delas para ler todas suas mensagens seguras em qualquer dispositivo.
@@ -1995,7 +1995,7 @@
Eles correspondem
Eles não correspondem
Verifique esta(e) usuária(o) ao confirmar que os seguintes emoji únicos aparecem na tela dela(e), na mesma ordem.
- Para máxima segurança, use um outro meio de comunicação confiado ou faça isto em pessoa.
+ Para segurança ótima, use um outro meio de comunicação confiado ou faça isto em pessoa.
Procure pelo escudo verde para assegurar que um/uma usuário(a) é confiado. Confie em todos(as) os/as usuários(as) numa sala para assegurar que a sala é segura.
Não seguro
Um dos seguintes pode estar comprometido:
@@ -2010,7 +2010,7 @@
Arquivo
Sticker
Esperando…
- %s cancelado
+ %s cancelou
Você cancelou
%s aceitou
Você aceitou
@@ -2036,7 +2036,7 @@
Mensagens nesta sala não são encriptadas ponta-a-ponta.
Mensagens nesta sala são encriptadas ponta-a-ponta.
\n
-\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipente têm as chaves únicas para os destrancar.
+\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipente têm as chaves únicas para as destrancar.
Segurança
Saiba mais
Mais
@@ -2109,7 +2109,7 @@
Completar Segurança
Use uma sessão existente para verificar esta aqui, garantindo-lhe acesso a mensagens encriptadas.
Verificar
- Verificada
+ Verificada(o)
Aviso
Falha para obter sessões
Sessões
@@ -2207,7 +2207,7 @@
Configurando Backup de Chave
Suas %2$s & %1$s estão agora definidas.
\n
-\nMantenha-as seguras! Você vai precisar delas para destrancar mensagens encriptadas e informação segura se você perder todas as suas sessões ativas.
+\nMantenha-as seguras! Você vai precisar delas para destrancar mensagens encriptadas e informação segura se você perder todas suas sessões ativas.
Imprima-a e armazene-a em algum lugar seguro
Salve-a em uma chave USB ou drive de backup
Copie-a para seu armazenamento nuvem pessoal
@@ -2361,7 +2361,7 @@
Você não pode acessar esta mensagem porque o/a enviador(a) propositalmente não enviou as chaves
Esperando por histórico de encriptação
Riot agora é Element!
- Nós estamos animados em anunciar que nós mudamos de nome! Seu app está atualizado e o signin está feito a sua conta.
+ Nós estamos animados em anunciar que nós temos mudado de nome! Seu app está atualizado e você está com signin feito a sua conta.
ENTENDI
SABER MAIS
Salvar chave de recuperação em
@@ -2475,7 +2475,7 @@
Configurações
Mensagens aqui são encriptadas ponta-a-ponta.
\n
-\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipiente têm as chaves únicas para os destrancar.
+\nSuas mensagens são asseguradas com cadeados e somente você e a/o recipiente têm as chaves únicas para as destrancar.
Mensagens aqui não são encriptadas ponta-a-ponta.
Este servidorcasa está rodando uma versão antiga. Peça à/ao admin de seu servidorcasa para fazer upgrade. Você pode continuar, mas algumas funcionalidades podem não funcionar corretamente.
Mostrar histórico completo em salas encriptadas
@@ -2510,7 +2510,7 @@
Rotar e recortar
Configurações de sala
Tópico
- Tópico da sala (opcional)
+ Tópico de sala (opcional)
Nome de sala
Enviar histórico de requisições de compartilhamento de chaves
Mais nenhum resultado
@@ -2519,7 +2519,7 @@
Mostrar avançadas
Esconder avançadas
Link Matrix
- %s para deixar pessoas sabendo do que esta sala se trata.
+ %s para deixar pessoas saberem do que esta sala se trata.
Por favor proveja um endereço de sala
Recente
QR code não scannado!
@@ -2876,4 +2876,9 @@
- Enviar vídeo com o tamanho original
- Enviar vídeos com o tamanho original
+ No momento pessoas podem não ser capaz de se juntar a quaisquer salas privadas que você fizer.
+\n
+\nNós vamos melhorar isto como parte da beta, mas só queríamos deixar você saber.
+ Espaços de colegas de trabalho não estão bem prontos mas você ainda pode dar-lhes uma tentativa
+ Continuar Mesmo Assim
\ No newline at end of file
diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml
index 73512f103c..167d4a6354 100644
--- a/vector/src/main/res/values-sq/strings.xml
+++ b/vector/src/main/res/values-sq/strings.xml
@@ -2796,4 +2796,9 @@
Jepni emrin e e një shërbyesi të ri që doni të eksploroni.
Shtoni shërbyes të ri
Shërbyesi juaj
+ Hëpërhë, personat mund të mos jenë në gjendje të hyjnë në çfarëdo dhome private që krijoni.
+\n
+\nDo ta përmirësojmë këtë punë, si pjesë e versionit beta, thjesht donim t’ua bënim të ditur.
+ Hapësirat për anëtarë ekipi ende s’janë tërësisht gati, por mund t’i provoni
+ Vazhdo, Sido Qoftë
\ No newline at end of file
diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml
index ce65fd9a5a..d9b58bb605 100644
--- a/vector/src/main/res/values-sv/strings.xml
+++ b/vector/src/main/res/values-sv/strings.xml
@@ -2806,4 +2806,9 @@
Ange namnet för en ny server du vill utforska.
Lägg till en ny server
Din server
+ För tillfället så kan folk kanske inte gå med i privata rum som du skapar.
+\n
+\nVi kommer att förbättra detta som en del av betan, men ville låta dig veta.
+ Lagkamratsutrymmen är inte riktigt färdiga men du kan ändå testa dem
+ Fortsätt ändå
\ No newline at end of file
diff --git a/vector/src/main/res/values-ta/strings.xml b/vector/src/main/res/values-ta/strings.xml
new file mode 100644
index 0000000000..a6b3daec93
--- /dev/null
+++ b/vector/src/main/res/values-ta/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml
index d3cc148943..190ea00a1e 100644
--- a/vector/src/main/res/values-zh-rCN/strings.xml
+++ b/vector/src/main/res/values-zh-rCN/strings.xml
@@ -2763,4 +2763,9 @@
输入你想要探索的新服务器的名称。
添加一个新的服务器
你的服务器
+ 眼下,人们可能无法加入您设置的任何私人房间。
+\n
+\n作为测试版的一部分,我们将对此进行改进,只是想让你知道。
+ 队友空间还没有完全准备好,但你仍然可以尝试一下
+ 不论如何继续
\ No newline at end of file
diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml
index 1c67fdbbcd..e6577580b5 100644
--- a/vector/src/main/res/values-zh-rTW/strings.xml
+++ b/vector/src/main/res/values-zh-rTW/strings.xml
@@ -2753,4 +2753,9 @@
輸入您想要探索的新伺服器名稱。
加入新的伺服器
您的伺服器
+ 目前,人們可能無法加入您開啟的任何私人聊天室。
+\n
+\n作為測試版的一部分,我們會對此進行改善,但想先讓您知道。
+ 隊友空間還沒有完全準備好,但您仍可以試試看
+ 無論如何都要繼續
\ No newline at end of file