From 5ac590a8e046dd8ca781c4f90c96ab854c91c8f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 23:01:53 +0000 Subject: [PATCH 001/153] Bump androidx.work:work-runtime-ktx from 2.7.1 to 2.8.0 Bumps androidx.work:work-runtime-ktx from 2.7.1 to 2.8.0. --- updated-dependencies: - dependency-name: androidx.work:work-runtime-ktx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index a87fd3f868..dbe647e384 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -59,7 +59,7 @@ ext.libs = [ 'fragmentTesting' : "androidx.fragment:fragment-testing:$fragment", 'fragmentTestingManifest' : "androidx.fragment:fragment-testing-manifest:$fragment", 'constraintLayout' : "androidx.constraintlayout:constraintlayout:2.1.4", - 'work' : "androidx.work:work-runtime-ktx:2.7.1", + 'work' : "androidx.work:work-runtime-ktx:2.8.0", 'autoFill' : "androidx.autofill:autofill:1.1.0", 'preferenceKtx' : "androidx.preference:preference-ktx:1.2.0", 'junit' : "androidx.test.ext:junit:1.1.5", From 35b7860ec240d424935a962553c34aa41116f78b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 23:03:07 +0000 Subject: [PATCH 002/153] Bump androidx.browser:browser from 1.4.0 to 1.5.0 Bumps androidx.browser:browser from 1.4.0 to 1.5.0. --- updated-dependencies: - dependency-name: androidx.browser:browser dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- vector/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/build.gradle b/vector/build.gradle index 5a9037288e..8d5a132e4e 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -199,7 +199,7 @@ dependencies { implementation 'com.github.hyuwah:DraggableView:1.0.0' // Custom Tab - implementation 'androidx.browser:browser:1.4.0' + implementation 'androidx.browser:browser:1.5.0' // Passphrase strength helper implementation 'com.nulab-inc:zxcvbn:1.7.0' From 9cd3a9e13d60c8b65e717e0fae8fcfb38a9871d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Feb 2023 23:57:06 +0000 Subject: [PATCH 003/153] Bump io.element.android:wysiwyg from 1.0.0 to 1.1.1 Bumps [io.element.android:wysiwyg](https://github.com/matrix-org/matrix-wysiwyg) from 1.0.0 to 1.1.1. - [Release notes](https://github.com/matrix-org/matrix-wysiwyg/releases) - [Changelog](https://github.com/matrix-org/matrix-rich-text-editor/blob/main/CHANGELOG.md) - [Commits](https://github.com/matrix-org/matrix-wysiwyg/compare/1.0.0...1.1.1) --- updated-dependencies: - dependency-name: io.element.android:wysiwyg dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 72172fc61e..72fd140f71 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -103,7 +103,7 @@ ext.libs = [ ], element : [ 'opusencoder' : "io.element.android:opusencoder:1.1.0", - 'wysiwyg' : "io.element.android:wysiwyg:1.0.0" + 'wysiwyg' : "io.element.android:wysiwyg:1.1.1" ], squareup : [ 'moshi' : "com.squareup.moshi:moshi:$moshi", From 1861ab1fba65e46fce82b98b789fc0d1389666fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 23:58:27 +0000 Subject: [PATCH 004/153] Bump flipper from 0.178.1 to 0.182.0 Bumps `flipper` from 0.178.1 to 0.182.0. Updates `com.facebook.flipper:flipper` from 0.178.1 to 0.182.0 - [Release notes](https://github.com/facebook/flipper/releases) - [Commits](https://github.com/facebook/flipper/compare/v0.178.1...v0.182.0) Updates `com.facebook.flipper:flipper-network-plugin` from 0.178.1 to 0.182.0 - [Release notes](https://github.com/facebook/flipper/releases) - [Commits](https://github.com/facebook/flipper/compare/v0.178.1...v0.182.0) --- updated-dependencies: - dependency-name: com.facebook.flipper:flipper dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.facebook.flipper:flipper-network-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 7120789e10..67bb90eb43 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -18,7 +18,7 @@ def markwon = "4.6.2" def moshi = "1.14.0" def lifecycle = "2.5.1" def flowBinding = "1.2.0" -def flipper = "0.178.1" +def flipper = "0.182.0" def epoxy = "5.0.0" def mavericks = "3.0.1" def glide = "4.14.2" From d785bbba13dcc9e2a9f0bb1971b3670e7e097c0a Mon Sep 17 00:00:00 2001 From: "Auri B. P" Date: Wed, 15 Feb 2023 15:19:38 +0000 Subject: [PATCH 005/153] Translated using Weblate (Catalan) Currently translated at 97.9% (2544 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ca/ --- .../src/main/res/values-ca/strings.xml | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ca/strings.xml b/library/ui-strings/src/main/res/values-ca/strings.xml index 1f2cf1983c..153036da0f 100644 --- a/library/ui-strings/src/main/res/values-ca/strings.xml +++ b/library/ui-strings/src/main/res/values-ca/strings.xml @@ -1160,7 +1160,7 @@ Tema "Tema: " Afegeix un tema - %s perquè la gent sàpiga de que tracta la sala. + %s perquè la gent sàpiga de què tracta la sala. Tema Tema de la sala (opcional) Esperant l\'històric xifrat @@ -2808,7 +2808,7 @@ Activa l\'editor de text enriquit Rep notificacions en aquesta sessió. Notificacions - Carregant + Carregant… Pausa l\'emissió de veu Reprodueix o reprèn l\'emissió de veu Atura l\'enregistrament d\'emissió de veu @@ -2833,4 +2833,19 @@ Format de text Enrere 30 segons Avança 30 segons - + No es pot iniciar la nova l\'emissió de veu + Emissió en directe + No es pot iniciar el missatge de veu + Comprova-ho per assegurar que el teu compte és segur + Tens sessions no verificades + Històric de l\'enquesta + Emissió de veu iniciada + Citant + Responent a %s + Editant + Mostra els xats recents al menú de compartició del sistema + Activa la compartició directa + Has finalitzat una emissió de veu. + %1$s a finalitzat una emissió de veu. + Sí, atura + \ No newline at end of file From 890260b996435d01f6050776f4f74e324201bc9e Mon Sep 17 00:00:00 2001 From: Vri Date: Wed, 15 Feb 2023 15:18:26 +0000 Subject: [PATCH 006/153] Translated using Weblate (German) Currently translated at 100.0% (2598 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- library/ui-strings/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 06c477b410..3262df2729 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -2783,7 +2783,7 @@ Öffne die App auf deinem anderen Gerät Die Anfrage wurde auf dem anderen Gerät abgelehnt. Die Verbindung konnte nicht in der erforderlichen Zeit hergestellt werden. - Verbindung mit diesem Gerät nicht unterstützt. + Die Verbindung mit diesem Gerät wird nicht unterstützt. Verbindung fehlgeschlagen Überprüfe dein angemeldetes Gerät. Der unten gezeigte Code sollte angezeigt werden. Bestätige, dass beide Codes übereinstimmen: Sichere Verbindung hergestellt From 1026b0a4fa40ea0e2681ac0d04cfce2a8efac58b Mon Sep 17 00:00:00 2001 From: Tuomas Hietala Date: Fri, 17 Feb 2023 17:54:43 +0000 Subject: [PATCH 007/153] Translated using Weblate (Finnish) Currently translated at 82.4% (2142 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fi/ --- .../src/main/res/values-fi/strings.xml | 96 ++++++++++++++++--- 1 file changed, 84 insertions(+), 12 deletions(-) diff --git a/library/ui-strings/src/main/res/values-fi/strings.xml b/library/ui-strings/src/main/res/values-fi/strings.xml index 66f333845f..96408da021 100644 --- a/library/ui-strings/src/main/res/values-fi/strings.xml +++ b/library/ui-strings/src/main/res/values-fi/strings.xml @@ -88,8 +88,8 @@ Peruutit eston %1$s. Syy: %2$s Poistit käyttäjän %1$s. Syy: %2$s Hylkäsit kutsun. Syy: %1$s - Lähdit. Syy: %1$s - %1$s lähti. Syy: %2$s + Poistuit. Syy: %1$s + %1$s poistui. Syy: %2$s Poistuit huoneesta. Syy: %1$s Liityit. Syy: %1$s %1$s liittyi. Syy: %2$s @@ -139,9 +139,9 @@ Päivitit tässä. %s päivitti täällä. Päivitit tämän huoneen. - Teit tulevista viesteistä näkyviä käyttäjälle %1$s - %1$s teki tulevista viesteistä näkyviä käyttäjälle %2$s - Teit tulevan huonehistorian näkyväksi %1$s + Teit tulevista viesteistä näkyviä seuraaville: %1$s + %1$s teki tulevista viesteistä näkyviä seuraaville: %2$s + Teit tulevan huonehistorian näkyväksi seuraaville: %1$s Lopetit puhelun. Vastasit puheluun. Lähetit tietoja puhelun valmistelemiseksi. @@ -168,7 +168,7 @@ Liityit %1$s liittyi Liityit huoneeseen - Kutsuit %1$s + Kutsuit käyttäjän %1$s Loit keskustelun %1$s loi keskustelun Loit huoneen @@ -1311,7 +1311,7 @@ QR-koodin skannaaminen vaatii luvan kameran käyttöön. Kysy varmistusta ennen puhelun aloittamista Estä vahinkopuhelut - SSL Virhe. + SSL-virhe. Takakamera Etukamera Vaihda kameraa @@ -2119,8 +2119,8 @@ Vahvistetu Suodata - Käyttämättä %1$d päivän tai pidempään - Käyttämättä %1$d päivää tai pidempään + Käyttämättä vuorokauden tai pidempään + Käyttämättä %1$d vuorokautta tai pidempään Käyttämätön Ei valmis turvallista viestintää varten @@ -2136,7 +2136,7 @@ Käyttämättä olevat istunnot Vahvista nämä istunnot tai kirjaudu niistä ulos. Vahvistamattomat istunnot - Paranna tilisi turvallisuutta seuraamalla näitä suosituksia. + Paranna tilisi turvallisuutta noudattamalla näitä suosituksia. Turvallisuussuositukset Käyttämättä %1$d+ päivän (%2$s) @@ -2164,8 +2164,8 @@ Tällä hetkellä käytössä %s. Menetelmä - Löytyi %d menetelmä. - Löytyi %d menetelmää. + Yksi menetelmä löytyi. + %d menetelmää löytyi. Saatavilla olevat menetelmät Ilmoitusmenetelmä @@ -2357,4 +2357,76 @@ Anna kameran käyttöoikeus järjestelmän asetuksista tämän toiminnon suorittamiseksi. Tämän toiminnon suorittaminen vaatii enemmän oikeuksia. Anna oikeudet järjestelmän asetuksista. Kuunnellaan ilmoituksia + Lukemattomat viestisi näkyvät tässä sitten kun saat niitä. + Ei ilmoitettavaa. + Kirjaudu QR-koodilla + Huomaa, että istuntojen nimet näkyvät ihmisille, joiden kanssa viestit. + Istunnon nimi + IP-osoite + Käyttöjärjestelmä + Malli + Selain + URL-osoite + Versio + Nimi + Istunnon nimi + Kirjaudu ulos tästä istunnosta + Piilota IP-osoite + Näytä IP-osoite + Kirjaudu ulos kaikista muista istunnoista + + Kirjaudu ulos yhdestä istunnosta + Kirjaudu ulos %1$d istunnosta + + Kirjaudu ulos + + Harkitse vanhoista (yksi vuorokausi tai vanhemmista), käyttämättömistä istunnoista uloskirjautumista. + Harkitse vanhoista (%1$d vuorokautta tai vanhemmista), käyttämättömistä istunnoista uloskirjautumista. + + + Harkitse vanhoista (yksi vuorokausi tai vanhemmista), käyttämättömistä istunnoista uloskirjautumista. + Harkitse vanhoista (%1$d vuorokautta tai vanhemmista), käyttämättömistä istunnoista uloskirjautumista. + + Tämä istunto on valmiina turvalliseen viestintään. + Nykyinen istuntosi on valmina turvalliseen viestintään. + Kamera + Sijainti + Kyselyt + Liitteet + Tarrat + Karttaa ei voida ladata +\nTätä kotipalvelinta ei välttämättä ole säädetty näyttämään karttoja. + Virhe kyselyjä noudettaessa. + Lataa lisää kyselyjä + + Viime vuorokaudelta ei ole menneitä kyselyjä. +\nLataa lisää kyselyjä nähdäksesi aiempien päivien kyselyt. + Viimeisiltä %1$d vuorokaudelta ei ole menneitä kyselyjä. +\nLataa lisää kyselyjä nähdäksesi aiempien päivien kyselyt. + + Tässä huoneessa ei ole menneitä kyselyjä + Menneet kyselyt + + Ei kyselyjä viimeisen vuorokauden ajalta. +\nLataa lisää kyselyjä nähdäksesi aiempien päivien kyselyt. + Ei kyselyjä viimeisen %1$d vuorokauden ajalta. +\nLataa lisää kyselyjä nähdäksesi aiempien päivien kyselyt. + + Tässä huoneessa ei ole aktiivisia kyselyjä + Aktiiviset kyselyt + Salauksen purkamisvirheistä johtuen joitakin ääniä ei ehkä lasketa + Tämä estää ihmisiä äänestämästä ja näyttää kyselyn lopulliset tulokset. + Ota LaTeX-matematiikka käyttöön + %1$s jäljellä + Äänitä pitämällä painettuna, lähetä päästämällä + Huoneen päivittäminen on edistynyt toiminto, jota yleensä suositellaan, kun huone on epävakaa virheistä, puuttuvista ominaisuuksita tai tietoturvahaavoittuvuuksista johtuen. +\nSe vaikuttaa yleensä vain siihen, miten huonetta käsitellään palvelimella. + Merkitse ei-ehdotetuksi + Merkitse ehdotetuksi + Viestien lähettäminen epäonnistui + Varattu + Virhe puhelua siirrettäessä + Yhdistä + Kumoa kutsu + Kotipalvelin ei hyväksy pelkistä numeroista koostuvaa käyttäjänimeä. \ No newline at end of file From 333860306b7af374044d8f66c8ac5a782ea357ca Mon Sep 17 00:00:00 2001 From: Yoan Pintas Date: Wed, 15 Feb 2023 13:40:58 +0000 Subject: [PATCH 008/153] Translated using Weblate (French (Canada)) Currently translated at 69.8% (1814 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fr_CA/ --- library/ui-strings/src/main/res/values-fr-rCA/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/ui-strings/src/main/res/values-fr-rCA/strings.xml b/library/ui-strings/src/main/res/values-fr-rCA/strings.xml index cd39fa3381..9a9a288b99 100644 --- a/library/ui-strings/src/main/res/values-fr-rCA/strings.xml +++ b/library/ui-strings/src/main/res/values-fr-rCA/strings.xml @@ -296,7 +296,7 @@ code QR Ajouter avec un code QR Lien copié dans le presse-papiers - Ajouter un onglet dédié aux notifications non-lues sur l’écran principal. + Ajouter un onglet dédié aux notifications non lues sur l’écran principal. Activer le balayage pour répondre dans l’historique Nom ou identifiant (#exemple:matrix.org) Voir le répertoire des salons @@ -842,7 +842,7 @@ Le code est requis à l’ouverture d’${app_name}. Le code est demandé après 2 minutes d\'inutilisation d’${app_name}. Demander le code après 2 minutes - Afficher uniquement le numéro de messages non-lus dans une simple notification. + Afficher uniquement le numéro de messages non lus dans une simple notification. Afficher les détails comme les noms des salons et le contenu du message. Afficher le contenu dans les notifications Le code est la seule façon de déverrouiller ${app_name}. @@ -2068,4 +2068,4 @@ \n \nCette action va redémarrer l’application et pourra prendre du temps. Requête de synchronisation initiale - + \ No newline at end of file From 41180778551dfad21fd92a1db64e107d695bb6a0 Mon Sep 17 00:00:00 2001 From: Yoan Pintas Date: Thu, 16 Feb 2023 08:13:50 +0000 Subject: [PATCH 009/153] Translated using Weblate (French) Currently translated at 100.0% (2598 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/ --- .../src/main/res/values-fr/strings.xml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml index 491a2660c4..8b05bdaeff 100644 --- a/library/ui-strings/src/main/res/values-fr/strings.xml +++ b/library/ui-strings/src/main/res/values-fr/strings.xml @@ -274,9 +274,9 @@ Rejoindre Rejeter Quitter le salon - Conversations privées + Messages directs Inviter - Bannir + Interdire l’accès au salon (définitif) Révoquer le bannissement Mentionner Faire confiance @@ -473,7 +473,7 @@ Chargement… Voulez-vous vraiment engager un nouvel appel audio \? Voulez-vous vraiment engager un nouvel appel vidéo \? - Bannir un utilisateur va l’expulser du salon et l’empêcher de le rejoindre à nouveau. + L’exclusion de l’utilisateur va l’expulser du salon et l’empêcher de le rejoindre à nouveau. Notification pour chaque message Ajouter à l’écran d’accueil Aperçu des liens @@ -579,7 +579,7 @@ réduire %1$s : %2$s +%d - Expulser + Retirer du salon (réversible) Afficher un aperçu des liens dans la discussion quand votre serveur d’accueil le permet. Envoyer des notifications de saisie Les autres utilisateurs pourront voir que vous êtes en train d’écrire. @@ -836,7 +836,7 @@ Changer de réseau Veuillez patienter… On dirait que vous avez déjà configuré une sauvegarde de clé depuis une autre session. Voulez-vous la remplacer par celle que vous êtes en train de créer \? - Vos conversations privées seront affichées ici. Appuyez sur « + » en bas à droite pour en démarrer une. + Vos messages directs seront affichés ici. Appuyez sur « + » en bas à droite pour en démarrer une. Salons Vos salons seront affichés ici. Appuyez sur le « + » en bas à droite pour trouver ceux existant ou en créer de nouveaux. Réactions @@ -852,7 +852,7 @@ Changer Impossible d’avoir un aperçu de ce salon Salons - Conversations privées + Messages directs CRÉER Nom Public @@ -884,7 +884,7 @@ Merci, la suggestion a bien été envoyée Échec d’envoi de la suggestion (%s) Afficher les évènements cachés dans les discussions - Conversations privées + Messages directs Attente… Chiffrement de la miniature… Envoi de la miniature (%1$s / %2$s) @@ -1410,7 +1410,7 @@ Le lien %1$s vous emmène sur un autre site : %2$s. \n \nVoulez-vous vraiment poursuivre \? - Nous n’avons pas pu créer votre conversation privée. Vérifiez les utilisateurs que vous souhaitez inviter et réessayez. + Nous n’avons pas pu créer votre message direct. Vérifiez les utilisateurs que vous souhaitez inviter et réessayez. Non chiffré Chiffré par un appareil non vérifié Vérifiez la nouvelle connexion accédant à votre compte : %1$s @@ -1570,7 +1570,7 @@ Le code est requis à l’ouverture de ${app_name}. Le code est demandé après 2 minutes d\'inutilisation de ${app_name}. Demander le code après 2 minutes - Afficher uniquement le numéro de messages non-lus dans une simple notification. + Afficher uniquement le numéro de messages non lus dans une simple notification. Afficher les détails comme les noms des salons et le contenu du message. Afficher le contenu dans les notifications Le code est la seule façon de déverrouiller ${app_name}. @@ -1607,7 +1607,7 @@ %1$s, %2$s et %3$d autre ont lu %1$s, %2$s et %3$d autres ont lu - Ajouter un onglet dédié aux notifications non-lues sur l’écran principal. + Ajouter un onglet dédié aux notifications non lues sur l’écran principal. Le salon a été créé, mais certaines invitations n’ont pas été envoyées pour la raison suivante : \n \n%s @@ -1716,12 +1716,12 @@ Sujet Sujet du salon (facultatif) Nom du salon - Conversation privée + Message direct Inclure l’historique d’échange de clés Plus aucun résultat Exporter le rapport d’audit %s pour permettre aux gens de connaître le sujet de ce salon. - Ceci est le début de l’historique de votre conversation privée avec %s. + Ceci est le début de l’historique de votre message direct avec %s. Ceci est le début de cette conversation. Ceci est le début de %s. Vous n\'avez pas le droit d’activer le chiffrement dans ce salon. @@ -2131,8 +2131,8 @@ Les invitations à des salons Les conversations de groupe chiffrées Les conversations de groupe - Les conversations privées chiffrées - Les conversations privées + Les conversations à deux chiffrées + Les messages directs Mon nom d’utilisateur Mon nom d’affichage Me notifier pour @@ -2614,7 +2614,7 @@ Préférences de présentation Parcourir les salons Créer un salon - Commencer une discussion + Commencer un message direct Non vérifiée · Dernière activité %1$s Vérifié · Dernière activité %1$s Tout voir (%1$d) @@ -2636,7 +2636,7 @@ Accéder aux espaces Pour simplifier Element, les onglets sont désormais facultatifs. Gérez les depuis le menu en haut à droite. Bienvenu dans une nouvelle vue ! - C\'est ici que vos messages non-lus s’afficheront lorsque vous en aurez. + C\'est ici que vos messages non lus s’afficheront lorsque vous en aurez. Rien à signaler. La messagerie sécurisée tout-en-un pour les équipes, les amis, et les organisations. Créez une discussion ou rejoignez un salon pour démarrer. Bienvenue dans ${app_name}, From 18a7c2443b3e42f8aa07892af3e18142a4f67d31 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Thu, 16 Feb 2023 05:34:58 +0000 Subject: [PATCH 010/153] Translated using Weblate (Japanese) Currently translated at 100.0% (2598 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- .../src/main/res/values-ja/strings.xml | 108 +++++++++--------- 1 file changed, 57 insertions(+), 51 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index f51f2ba81a..72df8c57a9 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -143,7 +143,7 @@ このセッションで通知を有効にする 1対1のチャットでのメッセージ グループチャットでのメッセージ - ルームへ招待されたとき + ルームに招待されたとき 通話への招待 ボットによるメッセージ 端末起動時に開始 @@ -252,7 +252,7 @@ 公開端末名 ルームのエンドツーエンド暗号鍵をエクスポート 認証済 - このルームに参加していません。 + あなたはこのルームのメンバーではありません。 このルームでそれを行う権限がありません。 ルーム %s は閲覧できません。 ユーザー名 @@ -394,7 +394,7 @@ 指定したIDのユーザーをブロック 指定したIDのユーザーのブロックを解除 ユーザーの権限レベルを規定 - 指定したIDのユーザーの管理者権限を取り消す + 指定したIDのユーザーの権限をリセット 指定したIDのユーザーを現在のルームに招待 指定したアドレスのルームに参加 ルームから退出 @@ -406,7 +406,7 @@ %1$sのホームサーバーを引き続き使用するには、利用規約を確認して同意する必要があります。 エラー 確認 - アカウントを無効化 + アカウントの無効化 この操作により、あなたのアカウントは永久に使えなくなります。ログインしたり同じユーザーIDを再登録したりすることはできなくなります。あなたのアカウントは参加している全てのルームから退出し、あなたのIDサーバーからアカウントの詳細が削除されます。<b>この操作は取り消せません。</b> \n \nアカウントを無効化しても、<b>デフォルトではあなたが送信したメッセージの履歴は消去されません</b>。メッセージの履歴を消去する場合は、以下のボックスにチェックを入れてください。 @@ -484,7 +484,7 @@ 通知に関する問題解決 システムの設定。 アカウントの設定。 - カスタム設定。 + ユーザー定義の設定。 端末起動時に開始 バックグラウンド制限の確認 編集 @@ -537,13 +537,13 @@ ルームから退出しています… 管理者 モデレーター - カスタム + ユーザー定義 招待中 ユーザー %1$sの管理者 %1$sのモデレーター %1$sの既定のユーザー - %2$sのカスタム(%1$d) + %2$sのユーザー定義(%1$d) タイムライン エンドツーエンド暗号化を有効にする… 暗号化を有効にする @@ -572,7 +572,7 @@ アカウントデータ 削除… 削除の確認 - このイベントを削除してよろしいですか?ルーム名やトピックの変更を削除すると、変更が取り消されます。 + このイベントを削除してよろしいですか?ルームの名前やトピックの変更を削除すると、変更が取り消される可能性があります。 暗号化が有効です このルーム内でのメッセージはエンドツーエンドで暗号化されます。詳細の確認や認証はユーザーのプロフィールをご確認ください。 暗号化が有効になっていません @@ -714,7 +714,7 @@ Playサービスを修正 Google PlayサービスのAPKは利用可能で最新の状態になっています。 Playサービスのチェック - 一部の通知はカスタム設定で無効になっています。 + 一部の通知はユーザー定義の設定で無効になっています。 一部のメッセージがサイレントに設定されていることに注意してください(音を出さずに通知します)。 1つ以上のテストが失敗しました。調査用のバグレポートを送信してください。 1つ以上のテストが失敗しました。提案された修正を試してください。 @@ -911,8 +911,8 @@ %1$s、%2$s、%3$sと%4$s %1$s、%2$sと%3$s %1$sの権限レベルを%2$sから%3$sへ - カスタム - カスタム (%1$d) + ユーザー定義 + ユーザー定義 (%1$d) 既定 モデレーター 管理者 @@ -940,7 +940,7 @@ これにより、現在のキーまたはフレーズが置き換えられます。 新しいセキュリティーキーを生成するか、既存のバックアップに新しいセキュリティーフレーズを設定してください。 サーバー上の暗号鍵をバックアップして、暗号化されたメッセージとデータへのアクセスが失われるのを防ぎましょう。 - メッセージ作成画面に絵文字キーボードを開くためのボタンを追加 + メッセージ入力欄に絵文字キーボードを開くためのボタンを追加 絵文字キーボードを表示 アバターと表示名の変更を含む。 アカウントのイベントを表示 @@ -1144,7 +1144,7 @@ \n直近のオンライン日時:%2$s \n新しいセッションにログインしなかった場合、この要求を無視してください。 鍵の共有リクエスト - カスタムカメラ画面の代わりにシステムカメラを開始。 + ユーザー定義のカメラ画面の代わりにシステムカメラを開始。 使用中のウィジェットがありません インテグレーションを管理 DRMで保護されているメディアを読み込む @@ -1187,7 +1187,7 @@ スペースのメンバーのみ 誰でもルームを発見し参加できます 公開 - 招待した人のみが検索・参加できます + 招待した人のみが検索し、参加できます 非公開 不明のアクセス設定(%s) 誰でもルームにノックができ、メンバーがその参加を承認または拒否できます @@ -1197,7 +1197,7 @@ このアドレスを公開 アドレスを設定すると、他のユーザーがあなたのホームサーバー(%1$s)を通じてこのルームを見つけられるようになります。 ローカルアドレス - 新しい公開アドレス(例:#alias:server) + 新しい公開アドレス(例:#alias:server) 他の公開アドレスはまだありません。以下から追加できます。 他の公開アドレスはまだありません。 アドレス\"%1$s\"を非公開にしますか? @@ -1252,7 +1252,7 @@ Matrix IDでサインイン 詳細を表示 その他 - カスタムと高度な設定 + ユーザー定義と高度な設定 組織向けのプレミアムホスティング 組織向けのプレミアムホスティング 最大の公開サーバーで、数百万人に無料で参加 @@ -1333,8 +1333,8 @@ これを使用するとデータが%sと共有される可能性があります: %1$s:%2$s %3$s %1$s:%2$s - あなたが知らないかもしれない他のスペースやルーム - 誰がこのルームを検索・参加できるか選択してください。 + 知らないかもしれない他のスペースやルーム + 誰がこのルームを検索し、参加できるか選択してください。 タップしスペースを編集 スペースを選択 アクセス可能なスペース @@ -1354,8 +1354,8 @@ ダイレクトメッセージ 自分のユーザー名 自分の表示名 - グループチャットで暗号化されたメッセージ - 1対1のチャットで暗号化されたメッセージ + グループチャットでの暗号化されたメッセージ + 1対1のチャットでの暗号化されたメッセージ 以下の場合に通知 その他 メンションとキーワード @@ -1436,8 +1436,8 @@ %1$s個以上の選択肢が必要です - 呼び出したユーザーは話し中です。 - 話し中です + 呼び出したユーザーは通話中です。 + 通話中 %sとの音声通話 %sとのビデオ通話 呼び出しています… @@ -1507,7 +1507,7 @@ 警告! 位置情報 メディア - アンケート終了 + アンケートが終了しました アンケートを終了しますか? アンケートを削除 スペースを作成 @@ -1628,11 +1628,11 @@ 不適切として報告済 添付ファイルを送信 詳細なログを有効にする。 - メールアドレスか電話番号でアカウントを見つけてもらえるようにするには、IDサーバー(%s)の利用規約への同意が必要です。 + メールアドレスか電話番号でアカウントを検出可能にするには、IDサーバー(%s)の利用規約への同意が必要です。 ${app_name}は位置情報にアクセスできませんでした ${app_name}は位置情報にアクセスできませんでした。後でもう一度やり直してください。 音声メッセージ(%1$s) - 推奨のルームバージョンへとアップグレード + 推奨のルームバージョンにアップグレード 音声メッセージを録音 あなたのホームサーバーの運営方針 一番下に移動 @@ -1707,7 +1707,7 @@ 素早くクラッシュ 開発者モードは隠された機能を有効にするため、アプリケーションが不安定になる恐れがあります。開発者向けです! 復号エラーが生じた際に、自動的にログを送信 - 復号エラーを自動的に報告する。 + 復号エラーを自動で報告。 変更を有効にするにはアプリケーションの再起動が必要です。 LaTeXによる数学表記を有効にする 以下の場合に通知 @@ -1731,7 +1731,7 @@ 投票する 投票した人には、投票の際に即座に結果が表示されます アンケートの終了後に結果を公開 - 結果はアンケートを終了した後でのみ明らかにされます + 結果はアンケートが終了した後で表示されます 以下で開く 暗号化のアップグレードが利用できます SSSSキーをリカバリーキーから生成しています @@ -1812,7 +1812,7 @@ サーバーのバージョン サーバー名 電話番号が正しくないようです。確認してください - カスタムホームサーバーを選択 + ユーザー定義のホームサーバーを選択 Element Matrix Servicesを選択 再送信 コードを入力 @@ -1825,7 +1825,7 @@ 信頼済 認証済 未送信のメッセージを削除 - カスタムイベントを送信 + ユーザー定義のイベントを送信 ルームの状態を調査 開封確認メッセージを表示 通知しない @@ -1842,7 +1842,7 @@ 合計%1$d票。投票すると結果を確認できます - 未認証の端末で暗号化 + 未認証の端末による暗号化 メッセージを紙吹雪と共に送信 メッセージを降雪と共に送信 紙吹雪🎉を送る @@ -1863,7 +1863,7 @@ 正しい参加者が%sにアクセスできるようにしましょう。 連絡先を追加 - %d人の知り合いがすでに参加しています + %d人の知人が既に参加しています %sに招待 ユーザー名かメールアドレスで招待 @@ -1874,18 +1874,18 @@ 注意:アプリケーションが再起動します ホームサーバーの管理者にお問い合わせください あなたが参加している全てのルームがホームに表示されます。 - 親のスペースを自動的に更新 + 上位のスペースを自動的に更新 残り%1$d秒 %sに属する人は、誰でもこのルームを検索し、参加することができます。手動で全員を招待する必要はありません。これはルームの設定からいつでも変更できます。 - 親のスペースに属する人は、誰でもこのルームを検索し、参加することができます。手動で全員を招待する必要はありません。これはルームの設定からいつでも変更できます。 + 上位のスペースに属する人は、誰でもこのルームを検索し、参加することができます。手動で全員を招待する必要はありません。これはルームの設定からいつでも変更できます。 %1$d個の投票に基づく - 合計%1$d票の投票に基づく最終結果 + 合計%1$d票に基づく最終結果 新しいセッションが認証されました。セッションは暗号化されたメッセージにアクセスすることができます。また、セッションは他のユーザーに「信頼済」として表示されます。 - このルームを同じホームサーバー上で組織内のチームとのコラボレーションにのみ使用する場合、このオプションを有効にするといいかもしれません。これは後から変更できません。 + このルームを、あなたのホームサーバーで、組織内のチームとのコラボレーションにのみ使用するなら、この設定を有効にするといいかもしれません。これは後から変更できません。 %sに属していないユーザーによるこのルームへの参加を、今後永久に拒否 プレーンテキストメッセージの前に ( ͡° ͜ʖ ͡°) を付ける このメールアドレスのドメインの登録は許可されていません @@ -1906,7 +1906,7 @@ これは正しいユーザーIDではありません。正しいフォーマットは「@user:homeserver.org」です。 パスワードを忘れた場合、戻ってパスワードを再設定してください。 メールボックスを確認してください - カスタムサーバーに接続 + ユーザー定義のサーバーに接続 既にアカウントがあります 既存のサーバーに参加しますか? この質問をスキップ @@ -1991,7 +1991,7 @@ このルームはまだ作成されていません。キャンセルしますか? テキストメッセージで共有 保護を設定 - このルームのみ + このルームにのみ 誰でも参加可能。コミュニティー向け 既存のスペースに参加するには、招待が必要です。 これは後から変更できます @@ -2033,9 +2033,9 @@ \n%sで利用規約を閲覧できます。 最初の検索結果のみ表示しています。文字をもっと入力してください… matrix.toリンクのフォーマットが正しくありませんでした - 注意!この端末には暗号鍵を含む個人データが保存されています。 + 警告:あなたの個人データ(暗号化の鍵を含む)が、この端末に保存されています。 \n -\nこの端末での使用を終了、または他のアカウントにサインインする場合、このデータをクリアしてください。 +\nこの端末の使用を終了するか、他のアカウントにログインしたい場合は、そのデータを消去してください。 この端末に現在保存されている全てのデータをクリアしますか? \nアカウントデータとメッセージにアクセスするにはもう一度サインインしてください。 現在のセッションはユーザー %1$s のものですが、あなたが提供している認証情報はユーザー %2$s のものです。この操作は${app_name}ではサポートされていません。 @@ -2188,10 +2188,10 @@ ディスカバリーの設定を終了します。 ここの参加者はあなただけです。退出すると、今後あなたを含めて誰も参加できなくなります。 再び招待されない限り、再参加することはできません。 - あなたはこのスペースの唯一の管理者です。退出すると、誰もそれをコントロールすることができなくなります。 + あなたはこのスペースの唯一の管理者です。退出すると、誰もそれを管理できなくなります。 名前のないルーム - このルームはホームサーバーが不安定と判断したルームバージョン%sで動作しています。 - 申し訳ありませんが、%sに参加する途中で問題が発生しました + このルームは、ホームサーバーが不安定と判断したルームバージョン%sで動作しています。 + 申し訳ありませんが、%sに参加する際に問題が発生しました このルームへの招待が、アカウントに関連付けられていないメールアドレス %s に送られました 投票がありません ルーム全体に通知 @@ -2238,7 +2238,7 @@ アプリの名前を変更しました!アプリは最新版で、アカウントにはログイン済です。 ステートイベントを送信 ステートイベント - カスタムのステートイベントを送信 + ユーザー定義のステートイベントを送信 ステートイベントを送信しました! 続行するには名前を設定してください。 どんな作業に取り組みますか? @@ -2318,7 +2318,7 @@ 鍵のバックアップの機密情報をSSSSに保存しています あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。 詳細を非表示 - 他の参加者はいません。%sに招待しましょう。 + まだ他の参加者はいません。%sに招待しましょう。 位置情報(ライブ)が有効です 現在の位置情報を共有 現在の位置情報を共有 @@ -2503,7 +2503,7 @@ %1$d日以上使用されていません(%2$s) 地図を読み込めません -\nこのホームサーバーは地図が読み込むよう設定されていないおそれがあります。 +\nこのホームサーバーは地図が読み込めるように設定されていないおそれがあります。 スペースは、ルームや連絡先をまとめる新しい方法です。右下のボタンを使うと、既存のルームを追加したり新たに作成したりできます。 セキュリティーに関する勧告 その他のセッション @@ -2526,7 +2526,7 @@ 未読のメッセージがある場合は、ここに表示されます。 未読はありません。 クライアントの情報の保存を有効にする - セッション名は連絡先にも表示されます。 + セッション名は連絡先に対しても表示されます。ご注意ください。 セッション名を設定すると、端末をより簡単に認識できるようになります。 このセッションでプッシュ通知を受信。 絞り込みを解除 @@ -2614,7 +2614,7 @@ Googleサービス 通知の受信方法を選択してください 画面を共有しています - ${app_name}画面共有 + ${app_name}の画面共有 テキストの装飾 連絡先 カメラ @@ -2631,14 +2631,14 @@ 一時的な実装。位置情報がルームの履歴に残ります 位置情報(ライブ)の共有を有効にする 位置情報を共有しています - ${app_name}位置情報(ライブ) + ${app_name}の位置情報(ライブ) 残り%1$s 位置情報(ライブ)を表示 位置情報(ライブ)が終了しました 位置情報(ライブ)を読み込んでいます… 8時間 1時間 - 15分 + 15分間 位置情報(ライブ)を共有する時間 現在の位置にズーム 地図で選択した位置情報のピン @@ -2656,7 +2656,7 @@ ライブ配信を終了してよろしいですか?配信を終了し、録音をこのルームで利用できるよう設定します。 ライブ配信を停止しますか? 残り%1$s - 接続エラー - 録音を停止しました + 接続エラー - 録音を一時停止しました この音声配信を再生できません。 既に音声配信を録音しています。新しく始めるには今の音声配信を終了してください。 他の人が既に音声配信を録音しています。新しく始めるには音声配信が終わるまで待機してください。 @@ -2800,7 +2800,7 @@ %s \nは空です。 クライアントの名称、バージョン、URLを記録し、セッションマネージャーでより容易にセッションを認識できるよう設定。 - セッション名を変更 + セッション名の変更 絞り込む 直近のオンライン日時 %1$s @@ -2854,4 +2854,10 @@ 認証済のセッションは、パスフレーズの入力、または他の認証済のセッションで本人確認を行ったセッションです。 \n \n認証済のセッションには、暗号化されたメッセージを復号化する際に使用する全ての鍵が備わっています。また、他のユーザーに対しては、あなたがこのセッションを信頼していることが表示されます。 + %1$s タップして戻る + もう一方の端末でサインインしてください。 + 携帯端末にサインインしますか? + サインインの画面で開始 + サインインの画面で開始 + セキュアなメッセージのやり取りを設定している際に、セキュリティー上の問題に遭遇しました。あなたのホームサーバー、インターネット接続、端末のいずれかの安全性が損なわれている可能性があります。 \ No newline at end of file From fe3f806545e3da0298a916c8ce28bd2120d14a8f Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Sat, 18 Feb 2023 09:44:53 +0000 Subject: [PATCH 011/153] Translated using Weblate (Latvian) Currently translated at 69.1% (1796 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/lv/ --- .../src/main/res/values-lv/strings.xml | 94 +++++++------------ 1 file changed, 35 insertions(+), 59 deletions(-) diff --git a/library/ui-strings/src/main/res/values-lv/strings.xml b/library/ui-strings/src/main/res/values-lv/strings.xml index 9201bf146a..3d32bf83a1 100644 --- a/library/ui-strings/src/main/res/values-lv/strings.xml +++ b/library/ui-strings/src/main/res/values-lv/strings.xml @@ -39,7 +39,6 @@ Uzaicinājums uz istabu %1$s un %2$s Tukša istaba - Jūs nomainījāt savu parādāmo vārdu no %1$s uz %2$s Jūs nomainījāt savu parādāmo vārdu uz %1$s Jūs nomainījāt savu avataru @@ -222,7 +221,6 @@ Dzēst Pārdēvēt Ziņot par saturu - vai Uzaicināt Izrakstīties @@ -245,7 +243,6 @@ Vienīgi Matrix kontakti Nav rezultātu Istabas - Nosūtīt logfailus Nosūtīt sistēmas avārijas logfailus Nosūtīt ekrānattēlu @@ -272,7 +269,7 @@ Gaiša tēma Tumša tēma Melna tēma - Notikumu monitorings + Uztver notikumus Skaņas paziņojumi Klusi paziņojumi Kļūdas atskaite @@ -285,10 +282,8 @@ Šķiet ievadīta nederīga epasta adrese Šī epasta adrese jau tiek izmantota. Aizmirsāt paroli\? - Mājasservers vēlas pārbaudīt, vai neesat robots Neizdevās verificēt epasta adresi: pārbaudiet, vai esi noklikšķinājis(usi) uz saiti atsūtītajā epastā - Ievadi korektu URL adresi Bojāts JSON Nav derīgs JSON @@ -305,15 +300,10 @@ Notiek zvans… Adresāts neatbildēja uz zvanu. Element informācija - - ${app_name}-am nepieciešama atļauja piekļūt mikrofonam, lai nodrošinātu audio zvanus. - ${app_name} nepieciešama atļauja piekļūt kamerai un mikrofonam, lai veiktu videozvanus. \n \nLūdzu, dodiet piekļuves atļauju nākamajā uznirstošajā logā, lai būtu iespēja veikt zvanus. - - Turpināt @@ -321,7 +311,6 @@ Pievienoties Noraidīt Pāriet uz pirmo neizlasīto ziņu - Pamest istabu Vai tiešām vēlies pamest istabu\? TIEŠIE ČATI @@ -349,7 +338,6 @@ Servera sertifikāts ir izmanījies un Tava ierīce tam tagad neuzticas. Tas ir ĻOTI NEPARASTI. Iesakām NEUZTICĒTIES šim jaunajam sertifikātam. Sertifikāts izmainījās no iepriekš uzticama uz neuzticamu. Iespējams, serveris ir aktualizējis savu sertifikātu. Sazinies ar servera administratoru, lai saņemtu sagaidāmo nospiedumu (fingerprint). Akceptē sertifikātu TIKAI tad, kad servera administrators publicējis sertifikāta nospiedumu, kurš atbilst augstāk redzamajam. - Meklēšana Istabas dalībnieku filtrs Rezultātu nav @@ -407,7 +395,6 @@ Ierīces nosaukums Pēdējo reizi manīts %1$s @ %2$s - Autentifikācija Pierakstījies kā Mājasserveris @@ -450,7 +437,6 @@ %d biedru izmaiņas Biedru katalogs - %d biedri %d biedrs @@ -461,11 +447,8 @@ %d jauna ziņa %d jaunas ziņas - - Iestatīt kā galveno adresi Atiestatīt kā galveno adresi - Tēma Atšifrēšanas kļūda Ierīces nosaukums @@ -475,9 +458,8 @@ Eksportēt istabas atslēgas Eksportēt atslēgas vietējā failā Eksportēt - Ievadiet frāzveida paroli - Apstiprināt frāzveida paroli - + Ievadīt paroles vārdkopu + Apstiprināt paroles vārdkopu Importēt E2E istabas atslēgas Importēt istabas atslēgas Importēt atslēgas no vietējā faila @@ -490,17 +472,15 @@ Apstipriniet, salīdzinot sekojošo ar lietotāja iestatījumiem citā savā sesijā: Ja tā sakrīt, nospied zemāk esošo verifikācijas pogu. Ja tā nesakrīt, tad kāds ir pārtvēris šo ierīci un Tu droši vien vēlies šo ierīci pievienot melnajam sarakstam. Nākotnē šī pārbaudes procedūra plānota sarežģītāka. - Izvēlies istabu katalogu Mājasservera nosaukums Visas istabas %s serverī Visas vietējās %s istabas - %d nelasīta paziņota ziņa - %d nelasītas paziņotas ziņas - %d nelasītu paziņotu ziņu + %d nelasītu paziņotu ziņu + %d nelasīta paziņota ziņa + %d nelasītas paziņotas ziņu - %d istaba %d istabas @@ -908,8 +888,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Nosūtīja jums uzaicinājumu %s vēlas verificēt jūsu sesiju Verifikācijas pieprasījums - - Nodrošinieties pret piekļuves zaudēšanu šifrētām ziņām un datiem Neparedzēta kļūda Izveidot frāzveida paroli @@ -936,7 +914,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Iztrūks obligāts parametrs. %1$s: %2$s %3$s %1$s: %2$s - ** Neizdevās nosūtīt - atveriet istabu + ** Neizdevās nosūtīt - lūgums atvērt istabu Es Jauns uzaicinājums Jaunas ziņas @@ -1036,7 +1014,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. %1$d cilvēki %1$d cilvēki - Gaida %s… Verificēts %s Verificē %s @@ -1159,7 +1136,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Jūs neizmantojat nevienu identitāšu serveri Rezerves kopiju nevarēja atšifrēt ar šo atkopšanās atslēgu: lūdzu, pārbaudiet, vai ievadījāt pareizo atkopšanās atslēgu. Kalkulē atkopšanās atslēgu… - Frāzveida parole pārāk vāja + Paroles vārdkopa ir pārāk vāja Nosūta doto ziņu ar sniegu Nosūta doto ziņu ar konfeti Atbastīta tikai šifrētās istabās @@ -1247,8 +1224,8 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Gandrīz galā! Vai %s redzams tas pats vairogs\? Kamēr šis lietotājs nav padarījis šo sesiju uzticamu, ziņas uz un no tās ir marķētas ar brīdinājumiem. Alternatīvi, jūs varat manuāli verificēt šos sesiju. %1$s (%2$s) pierakstījās, izmantojot jaunu sesiju: - Lūdzu, ievadiet frāzveida paroli - Frāzveida paroles nesakrīt + Lūgums ievadīt paroles vārdkopu + Paroles vārdkopa nesakrīt Piekļuve istabai Pārvaldiet epasta adreses un tālruņu numurus, kas saistīti ar jūsu Matrix kontu Epasti un tālruņa numuri @@ -1290,7 +1267,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Jauna šifrēto ziņu atslēga Izmantot Atslēgu Dublēšanu Nekad nezaudējiet šifrētās ziņas - Dzēst savu dublēto šifrēšanas atslēgu no servera\? Jūs vairs nevarēsiet izmantot atkopšanas atsļēgu, lai lasītu šifrēto ziņu vēsturi. Izdzēst dublējumu Pārbauda dublējuma statusu @@ -1322,10 +1298,8 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. \nPievienojiet dažas tagad\? Neizdevās izveidot reālā laika savienojumu. \nLūdzu, jautājiet sava servera administratoram, lai konfigurētu PAGRIEZIENA serveri, lai zvani strādātu uzticami. - Izmantojiet Integrācijas Pārvaldnieku, lai pārvaldītu botus, tiltus, logrīkus un uzlīmes. \nIntegrācijas Pārvaldnieks saņem konfigurācijas datus un var modificēt logrīkus, sūtīt istabu uzaicinājumus jūsu vārdā. - Jūs nesaņemsiet jaunas notifikācijas, kad aplikācija ir fonā. Bez fona sinhronizācijas Optimizēts reālajam laikam @@ -1380,21 +1354,20 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Lūdzu uztaisiet kopiju Stop Aizvietot - Dublējums jau pastāv jūsu mājasserverī - Atgūšanas atslēgas tika saglabātas. - - Saglabāt kā Failu + Rezerves kopija jau pastāv jūsu mājasserverī + Atkopšanas atslēgas tika saglabātas. + Saglabāt datnē Saglabāt Atgūšanas Atslēgu Es uztaisīju kopiju Saglabājiet savu atgūšanas atslēgu kaut kur ļoti drošā vietā, piemēram, paroles pārvaldniekā (vai seifā) Jūsu atkopšanas atslēga ir drošības tīkls - to var izmantot, lai atjaunotu piekļuvi jūsu šifrētajām ziņām, ja esat aizmirsis savu paroles frāzi. \nSaglabājiet savu atgūšanas atslēgu kaut kur ļoti drošā vietā, piemēram, paroles pārvaldniekā (vai seifā) - Jūsu atslēgas tiek dublētas. - Izdevās ! - (Advancēti) Iestatīt ar Atgūšanas Atslēgu - Vai, aizsargājiet jūsu dublējumu ar Atgūšanas Atslēgu, saglabājot to drošā vietā. - Taisa Dublējumu - Iestatīt Frāzi + Tiek veidota atslēgu rezerves kopija. + Izdevās! + (Papildu) Uzstādīt ar atkopšanas atslēgu + Vai aizsargā rezerves kopiju ar atkopšanas atslēgu, saglabājot to drošā vietā. + Veido rezerves kopiju + Uzstādīt paroles vārdkopu Mēs saglabāsim šifrētu jūsu atslēgu kopiju savā serverī. Aizsargājiet savu dublējumu ar frāzi, lai tā būtu droši aizsargāta. \n \nLai nodrošinātu maksimālu drošību, tam jāatšķiras no jūsu konta paroles. @@ -1454,7 +1427,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Publicēt jaunu adresi manuāli Šī ir galvenā adrese ${app_name} apkopo anonīmu analītiku, lai ļautu mums uzlabot aplikāciju. - Šis aizvietos jūsu esošo Atslēgu vai Frāzi. Izveidot jaunu Drošības Atslēgu vai iestatīt jaunu Drošības Frāzi jūsu esošajam dublējumam. Iestatīt uz šīs ierīces @@ -1657,8 +1629,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Kopīgojiet atkopšanas atslēgu ar… Lūdzu, %s, lai turpinātu izmantot šo pakalpojumu. Lūdzu, %s, lai palielinātu šo limitu. - - Palaidiet sistēmas kameru, nevis pielāgotās kameras ekrānu. Lasīt DRM aizsargātu multividi Izmantojot to, var kopīgot datus ar %s: @@ -1700,7 +1670,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. %d izvēlēti Modificēt logrīku - Trūkst atļauju Lai veiktu šo darbību, lūdzu, piešķiriet kamerai atļauju sistēmas iestatījumos. Lai veiktu šo darbību, trūkst dažu atļauju. Lūdzu, sistēmas Iestatījumos piešķiriet atļaujas. @@ -1778,7 +1747,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Savienoties %1$s Pieskarieties, lai atgrieztos Aktīvs zvans (%1$s) · - Aktīvs zvans (%1$s) Tika pieļauta kļūda, meklējot tālruņa numuru Zvanu taustiņi @@ -1945,7 +1913,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. \n• Jūsu servera administrators ir anulējis jūsu piekļuvi drošības apsvērumu dēļ. Neizskatās pēc derīgas e-pasta adreses Nosūta doto ziņojumu kā pārsteigumu - %1$s pie %2$s Šajā istabā nav multivides Multivide @@ -1961,7 +1928,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Atveriet izvēlni izveidot telpu Atveriet navigācijas atvilktni Izskatās, ka serveris pārāk ilgi neatbild, to var izraisīt slikts savienojums vai servera kļūda. Lūdzu, pēc brīža mēģiniet vēlreiz. - Identitātes serveris nesniedz nekādu politiku Slēpt identitātes servera politiku Parādīt identitātes servera politiku @@ -2000,7 +1966,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Šifrētās tiešās ziņas Tiešās ziņas Mans lietotājvārds - Neizdevās iegūt jaunāko atjaunošanas atslēgu versiju (%s). %d jaunu atslēgu tika pievienotas šai sesijai. @@ -2011,7 +1976,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Iegūst rezerves kopiju… Atjaunošanas atslēgas ģenerēšana, izmantojot paroli, šis process var aizņemt vairākas sekundes. Izskatās, ka jums jau ir izveidots atslēgas dublējums no citas sesijas. Vai vēlaties to aizstāt ar izveidoto\? - Lūdzu, dzēsiet parolesfrāzi, ja vēlaties, lai ${app_name} ģenerētu atkopšanas atslēgu. + Lūgums izdzēst paroles vārdkopu, ja ir vēlams, lai ${app_name} izveidotu atkopšanas atslēgu. Nav atrasts derīgs Google Play Services APK. Paziņojumi var nedarboties pareizi. Marķēšana ir izslēgta. Marķēšana ir ieslēgta. @@ -2063,9 +2028,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. izmetot lietotāju, noņems viņu no šīs Telpas. \n \nLai novērstu viņu atkārtotu pievienošanos, jums tā vietā vajadzētu viņiem aizliegt pievienoties. - - - Beidz zvanu… Nav atbildes Lietotājs, kuram zvanījāt, ir aizņemts. @@ -2091,4 +2053,18 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Lai sūtītu balss ziņojumus, piešķiriet Mikrofona atļauju. Telpas Uztver paziņojumus - + Atvērt aptauju + Sniegt atgriezenisko saiti + Piesist augšējā labajā stūrī, lai redzētu iespēju sniegt atgriezenisko saiti. + Tu beidzi balss pārraidi. + %1$s izbeidza balss pārraidi. + Izmantot ierīci, kurā veikta pieteikšanās, lai nolasītu zemāk esošo kvadrātkodu: + Nolasīt zemāk esošo kvadrātkodu ar ierīci, kurā ir notikusi atteikšanās. + Pieteikties ar kvadrātkodu + Jāizmanto ierīces kamera, lai nolasītu citā ierīcē attēlotu kvadrātkodu: + Nolasīt kvadrātkodu + 3 + 2 + 1 + Izmēģināt + \ No newline at end of file From df8382e93365efa8a114369eb680440bf866882d Mon Sep 17 00:00:00 2001 From: phardyle Date: Mon, 13 Feb 2023 09:53:05 +0000 Subject: [PATCH 012/153] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.8% (2568 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- library/ui-strings/src/main/res/values-zh-rCN/strings.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index f3b5854afb..68f714ae00 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -1265,7 +1265,7 @@ 上传 离开房间 - 正在离开房间… + 正在离开房间…… 管理员 协管员 自定义 @@ -1758,7 +1758,7 @@ 权限 查看和更新更改房间各个部分所需的角色。 房间权限 - 此房间不公开。你没有邀请将无法重新加入。 + 此房间不公开。没有邀请,你将无法重新加入。 你保持通话 %s 保持通话 保持 @@ -2820,4 +2820,6 @@ 你无法启动语音消息因为你正在录制实时广播。请终止实时广播以开始录制语音消息 无法启动语音消息 结束了投票。 + 你的访问令牌提供对你账户的完全访问权限。勿与任何人分享它。 + 访问令牌 \ No newline at end of file From 71421cd75ab99d28b78975faf05b59b2595034d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E4=BA=91?= Date: Sat, 11 Feb 2023 07:53:11 +0000 Subject: [PATCH 013/153] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.8% (2568 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- .../src/main/res/values-zh-rCN/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index 68f714ae00..53daab10df 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -9,7 +9,7 @@ %1$s 移除了 %2$s %1$s 解封了 %2$s %1$s 封禁了 %2$s - %1$s 更换了他们的头像 + %1$s 更换了其头像 %1$s 将他们的显示名称设置为 %2$s %1$s 将其显示名称从 %2$s 更改为 %3$s %1$s 移除了他们的显示名称(%2$s) @@ -178,7 +178,7 @@ 拒绝 挂断 引用 - 共享 + 分享 语音通话 视频通话 全部标记为已读 @@ -797,10 +797,10 @@ 房间 回应 同意 - 添加反应 - 查看反应 + 添加回应 + 查看回应 反应 - 由用户删除的事件 + 事件被用户删除 创建新房间 修改 请稍候…… @@ -825,7 +825,7 @@ 帮助和关于 (已编辑) - 撤消 + 撤销 断开连接 拒绝 这不是有效的 Matrix 服务器地址 @@ -942,7 +942,7 @@ 消息已移除 显示已移除消息 对已移除消息显示占位符 - 房间管理员主持的事件 + 事件被房间管理员删除 格式错误事件,无法显示 无网络。请检查你的网络连接。 更改网络 @@ -1597,7 +1597,7 @@ %d 秒 轮询 - 用%s反应 + 用%s回应 验证结果 是否删除类型 %1$s 的账户数据? \n From 548eef7cefe73c803767b2d7924e3f1e40bacd03 Mon Sep 17 00:00:00 2001 From: lidinxian Date: Sun, 19 Feb 2023 00:04:14 +0000 Subject: [PATCH 014/153] Added translation using Weblate (English (Middle)) --- library/ui-strings/src/main/res/values-enm/strings.xml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 library/ui-strings/src/main/res/values-enm/strings.xml diff --git a/library/ui-strings/src/main/res/values-enm/strings.xml b/library/ui-strings/src/main/res/values-enm/strings.xml new file mode 100644 index 0000000000..a6b3daec93 --- /dev/null +++ b/library/ui-strings/src/main/res/values-enm/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 8d9ebc4189a08b853175f093fb2dff1d8f8ec989 Mon Sep 17 00:00:00 2001 From: Conarius Date: Sun, 19 Feb 2023 01:18:09 +0000 Subject: [PATCH 015/153] Translated using Weblate (German) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/de/ --- fastlane/metadata/android/de-DE/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/de-DE/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/de-DE/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/de-DE/changelogs/40105250.txt diff --git a/fastlane/metadata/android/de-DE/changelogs/40105240.txt b/fastlane/metadata/android/de-DE/changelogs/40105240.txt new file mode 100644 index 0000000000..16b6849700 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Die wichtigsten Änderungen in dieser Version: Hauptsächlich Fehlerbehebungen, insbesondere nicht angezeigte Nachrichten in der Zeitleiste wurde behoben. +Das ganze Änderungsprotokoll: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/de-DE/changelogs/40105250.txt b/fastlane/metadata/android/de-DE/changelogs/40105250.txt new file mode 100644 index 0000000000..16b6849700 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Die wichtigsten Änderungen in dieser Version: Hauptsächlich Fehlerbehebungen, insbesondere nicht angezeigte Nachrichten in der Zeitleiste wurde behoben. +Das ganze Änderungsprotokoll: https://github.com/vector-im/element-android/releases From 2e4ceb61d5cb6614ebcdbbbdf61d1737b043e83f Mon Sep 17 00:00:00 2001 From: Conarius Date: Sun, 19 Feb 2023 01:12:03 +0000 Subject: [PATCH 016/153] Translated using Weblate (German) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- library/ui-strings/src/main/res/values-de/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 3262df2729..e41e4fa38c 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -2919,4 +2919,12 @@ Kann Sprachnachricht nicht beginnen Verbindungsfehler − Aufnahme pausiert Als Inline-Code formatieren + Einrücken + Zeige Umfrage in der Zeitleiste an + Verschlüsselung dieser Sprachübertragung ist nicht möglich. + Zitat umschalten + Nicht einrücken + Codeblock umschalten + Konto + Deine Kontodetails werden separat verwaltet bei %1$s. \ No newline at end of file From 832a91ef2645f370b8941528198c6da3de2fae07 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sun, 19 Feb 2023 09:39:24 +0000 Subject: [PATCH 017/153] Translated using Weblate (Czech) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/ --- library/ui-strings/src/main/res/values-cs/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-cs/strings.xml b/library/ui-strings/src/main/res/values-cs/strings.xml index b1f7df9bb4..efb7928eae 100644 --- a/library/ui-strings/src/main/res/values-cs/strings.xml +++ b/library/ui-strings/src/main/res/values-cs/strings.xml @@ -2980,4 +2980,12 @@ Nelze spustit hlasovou zprávu Chyba připojení - nahrávání pozastaveno Použít formát inline kódu + Přepnout blok kódu + Přepnout citaci + Zrušit odsazení + Odsazení + Zobrazit hlasování na časové ose + Nelze dešifrovat toto hlasové vysílání. + Údaje o vašem účtu jsou spravovány odděleně na adrese %1$s. + Účet \ No newline at end of file From c6baef177135736bcb9083b80881f53b4bc59a87 Mon Sep 17 00:00:00 2001 From: Vri Date: Sun, 19 Feb 2023 07:39:19 +0000 Subject: [PATCH 018/153] Translated using Weblate (German) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- library/ui-strings/src/main/res/values-de/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index e41e4fa38c..911d1dee78 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -941,7 +941,7 @@ Url: Nutzungsbedingungen Für andere auffindbar sein - Verwende Bots, Bridges, Widgets und Sticker-Pakete + Nutze Bots, Brücken, Widgets und Sticker-Pakete Identitäts-Server Verbindung zum Identitäts-Server trennen Identitäts-Server konfigurieren @@ -2920,8 +2920,8 @@ Verbindungsfehler − Aufnahme pausiert Als Inline-Code formatieren Einrücken - Zeige Umfrage in der Zeitleiste an - Verschlüsselung dieser Sprachübertragung ist nicht möglich. + Umfrage im Verlauf anzeigen + Entschlüsseln der Sprachübertragung nicht möglich. Zitat umschalten Nicht einrücken Codeblock umschalten From cede9b07d869e5f66bc15809ff7bb48daef7c0ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sun, 19 Feb 2023 07:22:24 +0000 Subject: [PATCH 019/153] Translated using Weblate (Estonian) Currently translated at 99.6% (2598 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/et/ --- library/ui-strings/src/main/res/values-et/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index 0f005fe04e..c62e147b34 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -2911,4 +2911,12 @@ Kuna sa hetkel salvestad ringhäälingukõnet, siis häälsõnumi salvestamine või esitamine ei õnnestu. Selleks palun lõpeta ringhäälingukõne Viga võrguühenduses - salvestamine on peatatud Kasuta lõimitud koodi vormingut + Kasutajakonto + Sinu kasutajakonto andmeid hallatakse siin: %1$s. + Selle ringhäälingukõne dekrüptimine ei õnnestu. + Näita küsitlust ajajoonel + Lisa taandrida + Eemalda taandrida + Lülita tsiteerimine sisse/välja + Lülita koodiblokk sisse/välja \ No newline at end of file From bbb84204bc67506daafae1090a79e9878eae0721 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Sun, 19 Feb 2023 01:10:02 +0000 Subject: [PATCH 020/153] Translated using Weblate (Persian) Currently translated at 99.9% (2604 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- library/ui-strings/src/main/res/values-fa/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index 9b1d367dde..41b429c134 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -2920,4 +2920,10 @@ نمی‌توان پخش صوتی را آغاز کرد خطای اتّصال - ضبط مکث شد اعمال قالب کد درون‌خط + تغییر حالت بلوک کد + تغییر حالت نقل قول + تونرفتگی + تورفتگی + دیدن نظرسنجی در خط زمانی + حساب \ No newline at end of file From 5e120b5228fe908e582f4ed5570365afaf4be6a9 Mon Sep 17 00:00:00 2001 From: Glandos Date: Sun, 19 Feb 2023 12:18:54 +0000 Subject: [PATCH 021/153] Translated using Weblate (French) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/ --- library/ui-strings/src/main/res/values-fr/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml index 8b05bdaeff..7bbc23a747 100644 --- a/library/ui-strings/src/main/res/values-fr/strings.xml +++ b/library/ui-strings/src/main/res/values-fr/strings.xml @@ -2920,4 +2920,12 @@ Impossible de démarrer un message vocal Erreur de connexion – Enregistrement en pause Appliquer le formatage de code en ligne + Bloc de code + Citation + Désindenter + Indenter + Consulter la chronologie des sondages + Impossible de déchiffrer cette diffusion audio. + Les détails de votre compte sont gérés séparément sur %1$s. + Compte \ No newline at end of file From 27a7c29383cfd7a2fca49f12e4e5c9eb0ebf2252 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Mon, 20 Feb 2023 07:24:36 +0000 Subject: [PATCH 022/153] Translated using Weblate (Hungarian) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- library/ui-strings/src/main/res/values-hu/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index a44bc9b78b..d536f075cb 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -2920,4 +2920,12 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Hang üzenetet nem lehet elindítani Kapcsolódási hiba – Felvétel szüneteltetve Beágyazott kód formátum alkalmazása + Kód blokk be/ki + Idézet be/ki + Behúzás kijjebb + Behúzás + Szavazás megjelenítése az idővonalon + A hang közvetítés nem fejthető vissza. + A fiókadatok külön vannak kezelve itt: %1$s. + Fiók \ No newline at end of file From 1bb7829676a79886a600fb2ebdb7782b3cf6196e Mon Sep 17 00:00:00 2001 From: Linerly Date: Sun, 19 Feb 2023 01:26:57 +0000 Subject: [PATCH 023/153] Translated using Weblate (Indonesian) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/id/ --- library/ui-strings/src/main/res/values-in/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml index ca871db81b..66adb6737f 100644 --- a/library/ui-strings/src/main/res/values-in/strings.xml +++ b/library/ui-strings/src/main/res/values-in/strings.xml @@ -2862,4 +2862,12 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Anda tidak dapat memulai sebuah pesan suara karena Anda saat ini merekam sebuah siaran langsung. Silakan mengakhiri siaran langsung Anda untuk memulai merekam sebuah pesan suara Tidak dapat memulai pesan suara Terapkan format kode dalam baris + Alih balok kode + Alih kutipan + Batalkan inden + Inden + Tampilkan pemungutan suara di lini masa + Tidak dapat mendekripsi siaran suara ini. + Detail akun Anda dikelola secara terpisah di %1$s. + Akun \ No newline at end of file From b633f6bc26d22587e005d47dc626470778572489 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sun, 19 Feb 2023 16:34:16 +0000 Subject: [PATCH 024/153] Translated using Weblate (Japanese) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- .../src/main/res/values-ja/strings.xml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 72df8c57a9..cf28976e65 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -418,7 +418,7 @@ このルームは置き換えられており、アクティブではありません。 こちらから継続中の会話を確認 このルームは別の会話の続きです - 以前のメッセージを表示するには、ここをクリックしてください + ここをクリックすると、以前のメッセージを表示します サービス管理者に連絡 このホームサーバーはリソース制限の1つを超過しているため、 ユーザーがログインできなくなることがあります このホームサーバーはリソースの上限に達しました。 @@ -1076,7 +1076,7 @@ バックアップには認証済のセッション %s による署名があります。 バックアップにはこのセッションによる有効な署名があります。 バックアップには%sというIDの不明のセッションによる署名があります。 - このセッションでは鍵がバックアップされていません。 + 鍵はこのセッションからバックアップされていません。 このセッションでは鍵のバックアップが無効になっています。 このセッションでは鍵のバックアップが正しく設定されています。 最新の復号化キーのバージョンを取得するのに失敗しました(%s)。 @@ -2507,7 +2507,7 @@ スペースは、ルームや連絡先をまとめる新しい方法です。右下のボタンを使うと、既存のルームを追加したり新たに作成したりできます。 セキュリティーに関する勧告 その他のセッション - セキュリティーを最大限に高めるには、不明なセッションや利用していないセッションからサインアウトしてください。 + セキュリティーを最大限に高めるには、不明なセッションや使用していないセッションからサインアウトしてください。 生体認証を有効にできませんでした。 関連付けに失敗しました。 おかえりなさい! @@ -2541,7 +2541,7 @@ 未認証のセッションはありません。 認証済のセッションはありません。 - 使用していない古いセッション(%1$d日以上使用されていません)からサインアウトすることを検討してください。 + 使用していない古いセッション(%1$d日以上使用されていません)からのサインアウトを検討してください。 非アクティブ セッションを認証すると、より安全なメッセージのやりとりが可能になります。見覚えのない、または使用していないセッションがあれば、サインアウトしましょう。 @@ -2811,7 +2811,7 @@ 未認証・直近のオンライン日時 %1$s 認証済・直近のオンライン日時 %1$s 現在のセッションを認証すると、このセッションの認証の状態を確認できます。 - セキュリティーを最大限に高めるには、セッションを認証し、不明なセッションや利用していないセッションからサインアウトしてください。 + セキュリティーを最大限に高めるには、セッションを認証し、不明なセッションや使用していないセッションからサインアウトしてください。 Element Callウィジェットを自動で承認し、カメラまたはマイクのアクセス権を付与 Element Callの権限のショートカットを有効にする 現在のゲートウェイ:%s @@ -2860,4 +2860,12 @@ サインインの画面で開始 サインインの画面で開始 セキュアなメッセージのやり取りを設定している際に、セキュリティー上の問題に遭遇しました。あなたのホームサーバー、インターネット接続、端末のいずれかの安全性が損なわれている可能性があります。 + コードブロックの表示を切り替える + あなたのアカウントの詳細は%1$sで管理されています。 + 引用の表示を切り替える + インデントを減らす + インデントを増やす + アンケートをタイムラインに表示 + この音声配信を復号化できません。 + アカウント \ No newline at end of file From 99580b7ab4ff2d86167740f477f11b12886292be Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Mon, 20 Feb 2023 08:50:42 +0000 Subject: [PATCH 025/153] Translated using Weblate (Latvian) Currently translated at 68.8% (1795 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/lv/ --- .../src/main/res/values-lv/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/library/ui-strings/src/main/res/values-lv/strings.xml b/library/ui-strings/src/main/res/values-lv/strings.xml index 3d32bf83a1..81a7a10dcc 100644 --- a/library/ui-strings/src/main/res/values-lv/strings.xml +++ b/library/ui-strings/src/main/res/values-lv/strings.xml @@ -1279,10 +1279,10 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Izmantojiet savu Atgūšanas Atslēgu, lai atbloķētu savu šifrēto ziņu vēsturi izmantojiet savu atgūšanas atslēgu Lietotāju ielūgšana, izmešana un aizliegšana tika neaizskarta. - Konfigurēt Skaļās Notifikācijas + Uzstādīt skaļos paziņojumus Izslēgt ierobežojumus Pārbaudīt fona ierobežojumus - Notifikācija tika nospiesta! + Paziņojumam tika piesists! Neizdevās reģistrēt FCM žetonu mājasserverī: \n%1$s FCM žetons veiksmīgi reģistrēts mājasserverī. @@ -1300,15 +1300,15 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. \nLūdzu, jautājiet sava servera administratoram, lai konfigurētu PAGRIEZIENA serveri, lai zvani strādātu uzticami. Izmantojiet Integrācijas Pārvaldnieku, lai pārvaldītu botus, tiltus, logrīkus un uzlīmes. \nIntegrācijas Pārvaldnieks saņem konfigurācijas datus un var modificēt logrīkus, sūtīt istabu uzaicinājumus jūsu vārdā. - Jūs nesaņemsiet jaunas notifikācijas, kad aplikācija ir fonā. + Par ienākošajiem ziņojumiem netiks paziņots, kad lietotne darbojas fonā. Bez fona sinhronizācijas Optimizēts reālajam laikam Fona Sinhronizācijas Režīms Izvēlaites LED krāsu, vibrāciju, skaņu… - Konfigurēt Klusās Notifikācijas - Konfigurēt Zvanu Notifikācijas + Uzstādīt klusos paziņojumus + Uzstādīt zvanu paziņojumus Pakalpojums startēsies, kad ierīce būs restartēta. - Notifikāciju Displejs + Paziņojumu attēlošana Google Play Servisu APK ir pieejams un atjaunināts. Filtrēt aizliegtos lietotājus Lūdzu palaidiet ${app_name} citā ierīcē, kas var atšifrēt ziņu, lai tā varētu nosūtīt šīs sesijas atslēgas. @@ -1481,7 +1481,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Pārbaudes diagnostika Paziņojumu pārbaude Paziņojumu svarīgums - Advancēti Notifikāciju Iestatījumi + Paziņojumu papildu iestatījumi Jūs apturējāt zvanu %s apturēja zvanu Apturēt @@ -1801,7 +1801,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Neatļaut ekrānšāviņus lietotnē Izmantot failu Ievadiet savu %s, lai turpinātu - Notifikāciju iestatījumi + Paziņojumu uzstādīšana Neizdevās importēt atslēgas %s, lai ļautu cilvēkiem uzzināt, par ko ir šī istaba. Nokopējiet to uz personālās mākoņa krātuves From 88c2a54db0649d23614e4e4aa0c8bf512c0276bc Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Sun, 19 Feb 2023 21:59:28 +0000 Subject: [PATCH 026/153] Translated using Weblate (Slovak) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- library/ui-strings/src/main/res/values-sk/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml index 82deefb371..819308c900 100644 --- a/library/ui-strings/src/main/res/values-sk/strings.xml +++ b/library/ui-strings/src/main/res/values-sk/strings.xml @@ -2980,4 +2980,12 @@ Nemožno spustiť hlasovú správu Chyba pripojenia - nahrávanie pozastavené Použiť formát riadkového kódu + Prepnutie bloku kódu + Prepínanie citácie + Zrušiť odsadenie + Odsadenie + Zobraziť anketu na časovej osi + Toto hlasové vysielanie sa nedá dešifrovať. + Údaje o vašom účte sú spravované samostatne na %1$s. + Účet \ No newline at end of file From 40cf3231460d5b3aeec47e5f0e63dbc6c22c6e30 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sun, 19 Feb 2023 13:28:04 +0000 Subject: [PATCH 027/153] Translated using Weblate (Albanian) Currently translated at 99.3% (2590 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sq/ --- library/ui-strings/src/main/res/values-sq/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-sq/strings.xml b/library/ui-strings/src/main/res/values-sq/strings.xml index 447a2b52d7..9b22f97af1 100644 --- a/library/ui-strings/src/main/res/values-sq/strings.xml +++ b/library/ui-strings/src/main/res/values-sq/strings.xml @@ -2906,4 +2906,12 @@ Gabim lidhjeje - Incizimi u ndal S’mund të nisni një mesazh zanor teksa jeni aktualisht duke incizuar një transmetim të drejtpërdrejtë. Ju lutemi, përfundoni transmetimin tuaj të drejtpërdrejtë, që të mund të nisni incizimin e një mesazhi zanor S’niset dot mesazh zanor + Shfaq/fshih bllok kodi + Shfaq/fshih citim + Hiqe zhvendosjen e kryeradhës + Zhvendos kryeradhën + Shihni pyetësor në rrjedhë kohore + S’arrihet të shfeshtëzohet ky transmetim zanor. + Hollësitë e llogarisë tuaj administrohen më vete, te %1$s. + Llogari \ No newline at end of file From 50975536b19d735c5e533131eabd7f84302c7390 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Sun, 19 Feb 2023 19:47:45 +0000 Subject: [PATCH 028/153] Translated using Weblate (Swedish) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sv/ --- library/ui-strings/src/main/res/values-sv/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-sv/strings.xml b/library/ui-strings/src/main/res/values-sv/strings.xml index 597dd90b2f..04aaab057c 100644 --- a/library/ui-strings/src/main/res/values-sv/strings.xml +++ b/library/ui-strings/src/main/res/values-sv/strings.xml @@ -2920,4 +2920,12 @@ Kan inte starta röstsändning Startade en röstsändning Använd inline-kodformat + Växla kodblock + Växla citat + Minska indrag + Indrag + Visa omröstning i tidslinjen + Kunder inte avkryptera den här röstsändningen. + Dina kontodetaljer hanteras separat på %1$s. + Konto \ No newline at end of file From c2cde6824862ca9a625da6bcbc60a1c87c53e42d Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sun, 19 Feb 2023 13:07:49 +0000 Subject: [PATCH 029/153] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- library/ui-strings/src/main/res/values-uk/strings.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml index 26d38bb324..ac44d84d63 100644 --- a/library/ui-strings/src/main/res/values-uk/strings.xml +++ b/library/ui-strings/src/main/res/values-uk/strings.xml @@ -1147,7 +1147,7 @@ Ви вийшли Вилучити… Наліпка - Використовувати ботів, мости, віджети та пакунки наліпок + Використовувати боти, мости, віджети та пакунки наліпок Зв\'язок із сервером втрачено Виправлень не знайдено Історія виправлень @@ -3040,4 +3040,12 @@ Не вдалося розпочати запис голосового повідомлення Помилка з\'єднання - Запис призупинено Застосовувати вбудований формат коду + Перемкнути блок коду + Перемкнути цитування + Без відступу + Відступ + Переглянути опитування у стрічці + Неможливо розшифрувати цю голосову трансляцію. + Керування подробицями вашого облікового запису відбувається окремо на %1$s. + Обліковий запис \ No newline at end of file From d5aab33ed916e0def80d718621619af0ccdc98e7 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Mon, 20 Feb 2023 01:53:01 +0000 Subject: [PATCH 030/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- library/ui-strings/src/main/res/values-zh-rTW/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index b3845e550d..5654831901 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -2860,4 +2860,12 @@ 您無法開始語音訊息,因為您目前正在錄製直播。請結束您的直播以開始錄製語音訊息 無法開始語音訊息 套用內嵌程式碼格式 + 切換程式碼區塊 + 切換引用 + 取消縮排 + 縮排 + 在時間軸中檢視投票 + 無法解密此語音廣播。 + 您的帳號詳細資訊已單獨於 %1$s 中管理。 + 帳號 \ No newline at end of file From d6364310df3635cee92c3813deae2aa0d2e5371c Mon Sep 17 00:00:00 2001 From: Vri Date: Sun, 19 Feb 2023 07:26:36 +0000 Subject: [PATCH 031/153] Translated using Weblate (German) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/de/ --- fastlane/metadata/android/de-DE/changelogs/40105240.txt | 4 ++-- fastlane/metadata/android/de-DE/changelogs/40105250.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fastlane/metadata/android/de-DE/changelogs/40105240.txt b/fastlane/metadata/android/de-DE/changelogs/40105240.txt index 16b6849700..6fce28362c 100644 --- a/fastlane/metadata/android/de-DE/changelogs/40105240.txt +++ b/fastlane/metadata/android/de-DE/changelogs/40105240.txt @@ -1,2 +1,2 @@ -Die wichtigsten Änderungen in dieser Version: Hauptsächlich Fehlerbehebungen, insbesondere nicht angezeigte Nachrichten in der Zeitleiste wurde behoben. -Das ganze Änderungsprotokoll: https://github.com/vector-im/element-android/releases +Die wichtigsten Änderungen in dieser Version: Hauptsächlich Fehlerbehebungen, insbesondere für nicht im Verlauf angezeigte Nachrichten. +Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/de-DE/changelogs/40105250.txt b/fastlane/metadata/android/de-DE/changelogs/40105250.txt index 16b6849700..6fce28362c 100644 --- a/fastlane/metadata/android/de-DE/changelogs/40105250.txt +++ b/fastlane/metadata/android/de-DE/changelogs/40105250.txt @@ -1,2 +1,2 @@ -Die wichtigsten Änderungen in dieser Version: Hauptsächlich Fehlerbehebungen, insbesondere nicht angezeigte Nachrichten in der Zeitleiste wurde behoben. -Das ganze Änderungsprotokoll: https://github.com/vector-im/element-android/releases +Die wichtigsten Änderungen in dieser Version: Hauptsächlich Fehlerbehebungen, insbesondere für nicht im Verlauf angezeigte Nachrichten. +Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases From 5080948f403359d52c7e5b874e211e667175c4df Mon Sep 17 00:00:00 2001 From: Glandos Date: Sun, 19 Feb 2023 12:16:43 +0000 Subject: [PATCH 032/153] Translated using Weblate (French) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fr/ --- fastlane/metadata/android/fr-FR/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/fr-FR/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40105250.txt diff --git a/fastlane/metadata/android/fr-FR/changelogs/40105240.txt b/fastlane/metadata/android/fr-FR/changelogs/40105240.txt new file mode 100644 index 0000000000..187c8c8f72 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : Principalement des corrections de bugs, notamment les messages non visibles dans l’historique +Intégralité des changements : https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/fr-FR/changelogs/40105250.txt b/fastlane/metadata/android/fr-FR/changelogs/40105250.txt new file mode 100644 index 0000000000..187c8c8f72 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : Principalement des corrections de bugs, notamment les messages non visibles dans l’historique +Intégralité des changements : https://github.com/vector-im/element-android/releases From 631eea6ce1a20722567d69b763da2140a71aaec7 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Mon, 20 Feb 2023 07:21:13 +0000 Subject: [PATCH 033/153] Translated using Weblate (Hungarian) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/ --- fastlane/metadata/android/hu-HU/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/hu-HU/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40105250.txt diff --git a/fastlane/metadata/android/hu-HU/changelogs/40105240.txt b/fastlane/metadata/android/hu-HU/changelogs/40105240.txt new file mode 100644 index 0000000000..592ef5e7ef --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Legnagyobb változtatás ebben a verzióban: Leginkább hibajavítások, mint amikor az üzenet nem jelenik meg az idővonalon. +Teljes változási napló: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/hu-HU/changelogs/40105250.txt b/fastlane/metadata/android/hu-HU/changelogs/40105250.txt new file mode 100644 index 0000000000..592ef5e7ef --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Legnagyobb változtatás ebben a verzióban: Leginkább hibajavítások, mint amikor az üzenet nem jelenik meg az idővonalon. +Teljes változási napló: https://github.com/vector-im/element-android/releases From ed7b42fd1f60679cad1cdc20f092f78ba19e704a Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Sun, 19 Feb 2023 21:57:33 +0000 Subject: [PATCH 034/153] Translated using Weblate (Slovak) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sk/ --- fastlane/metadata/android/sk/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/sk/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40105250.txt diff --git a/fastlane/metadata/android/sk/changelogs/40105240.txt b/fastlane/metadata/android/sk/changelogs/40105240.txt new file mode 100644 index 0000000000..5d293d4549 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Hlavne opravy chýb, najmä oprava správy, ktorá sa nezobrazuje na časovej osi. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/sk/changelogs/40105250.txt b/fastlane/metadata/android/sk/changelogs/40105250.txt new file mode 100644 index 0000000000..5d293d4549 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Hlavne opravy chýb, najmä oprava správy, ktorá sa nezobrazuje na časovej osi. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases From 6a961d902af34eb77f7e63e0016c2d8a78e97cab Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Sun, 19 Feb 2023 19:49:02 +0000 Subject: [PATCH 035/153] Translated using Weblate (Swedish) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sv/ --- fastlane/metadata/android/sv-SE/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/sv-SE/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40105250.txt diff --git a/fastlane/metadata/android/sv-SE/changelogs/40105240.txt b/fastlane/metadata/android/sv-SE/changelogs/40105240.txt new file mode 100644 index 0000000000..f6b6dd6f2c --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Huvudsakligen buggfixar, fixar speciellt meddelanden som inte visas i tidslinjen. +Full ändringslogg: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/sv-SE/changelogs/40105250.txt b/fastlane/metadata/android/sv-SE/changelogs/40105250.txt new file mode 100644 index 0000000000..f6b6dd6f2c --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Huvudsakligen buggfixar, fixar speciellt meddelanden som inte visas i tidslinjen. +Full ändringslogg: https://github.com/vector-im/element-android/releases From 45bc28c107ad63689cdeb4e3dec825e21e2cbb8d Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sun, 19 Feb 2023 13:09:19 +0000 Subject: [PATCH 036/153] Translated using Weblate (Ukrainian) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/ --- fastlane/metadata/android/uk/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/uk/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/uk/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/uk/changelogs/40105250.txt diff --git a/fastlane/metadata/android/uk/changelogs/40105240.txt b/fastlane/metadata/android/uk/changelogs/40105240.txt new file mode 100644 index 0000000000..c7e1351761 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Основні зміни у цій версії: Переважно виправлення помилок, зокрема, виправлено повідомлення, що не з'являлися у стрічці. +Список усіх змін: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/uk/changelogs/40105250.txt b/fastlane/metadata/android/uk/changelogs/40105250.txt new file mode 100644 index 0000000000..c7e1351761 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Основні зміни у цій версії: Переважно виправлення помилок, зокрема, виправлено повідомлення, що не з'являлися у стрічці. +Список усіх змін: https://github.com/vector-im/element-android/releases From 6c94190256af6ff621757c332ec2ff92045f47e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sun, 19 Feb 2023 07:19:59 +0000 Subject: [PATCH 037/153] Translated using Weblate (Estonian) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/et/ --- fastlane/metadata/android/et/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/et/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/et/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/et/changelogs/40105250.txt diff --git a/fastlane/metadata/android/et/changelogs/40105240.txt b/fastlane/metadata/android/et/changelogs/40105240.txt new file mode 100644 index 0000000000..779a4428a6 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: enamuses veaparandused, sh sõnumite kadumine ajajaoonelt. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/et/changelogs/40105250.txt b/fastlane/metadata/android/et/changelogs/40105250.txt new file mode 100644 index 0000000000..779a4428a6 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: enamuses veaparandused, sh sõnumite kadumine ajajaoonelt. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases From a38d61f412c5196e866ac6ece95a703555f9b4c8 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Mon, 20 Feb 2023 01:50:47 +0000 Subject: [PATCH 038/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/ --- fastlane/metadata/android/zh-TW/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/zh-TW/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40105250.txt diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105240.txt b/fastlane/metadata/android/zh-TW/changelogs/40105240.txt new file mode 100644 index 0000000000..401877b730 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40105240.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:主要為臭蟲修復,特別是修復訊息不會出現在時間軸中的問題。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105250.txt b/fastlane/metadata/android/zh-TW/changelogs/40105250.txt new file mode 100644 index 0000000000..401877b730 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40105250.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:主要為臭蟲修復,特別是修復訊息不會出現在時間軸中的問題。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases From fbba9e90b019f6b284b7e07a13e35798c2b1e226 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sun, 19 Feb 2023 09:42:07 +0000 Subject: [PATCH 039/153] Translated using Weblate (Czech) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/ --- fastlane/metadata/android/cs-CZ/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/cs-CZ/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40105250.txt diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40105240.txt b/fastlane/metadata/android/cs-CZ/changelogs/40105240.txt new file mode 100644 index 0000000000..e0c33880d4 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Hlavně opravy chyb, zejména oprava zpráv, které se nezobrazovaly na časové ose. +Úplný seznam změn: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40105250.txt b/fastlane/metadata/android/cs-CZ/changelogs/40105250.txt new file mode 100644 index 0000000000..e0c33880d4 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Hlavně opravy chyb, zejména oprava zpráv, které se nezobrazovaly na časové ose. +Úplný seznam změn: https://github.com/vector-im/element-android/releases From cb3dfa25a83235163191d0bc893bc825f9afc3f8 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sun, 19 Feb 2023 16:30:00 +0000 Subject: [PATCH 040/153] Translated using Weblate (Japanese) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/ja/ --- fastlane/metadata/android/ja-JP/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40105250.txt diff --git a/fastlane/metadata/android/ja-JP/changelogs/40105240.txt b/fastlane/metadata/android/ja-JP/changelogs/40105240.txt new file mode 100644 index 0000000000..6feaf6245f --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40105240.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:バグの修正。特に、タイムラインにメッセージが表示されない不具合を修正。 +更新履歴:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/ja-JP/changelogs/40105250.txt b/fastlane/metadata/android/ja-JP/changelogs/40105250.txt new file mode 100644 index 0000000000..6feaf6245f --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40105250.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:バグの修正。特に、タイムラインにメッセージが表示されない不具合を修正。 +更新履歴:https://github.com/vector-im/element-android/releases From 76c984381b3ebc9f29aebe71550f9f93aa9add54 Mon Sep 17 00:00:00 2001 From: Linerly Date: Sun, 19 Feb 2023 01:25:20 +0000 Subject: [PATCH 041/153] Translated using Weblate (Indonesian) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/id/ --- fastlane/metadata/android/id/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/id/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/id/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/id/changelogs/40105250.txt diff --git a/fastlane/metadata/android/id/changelogs/40105240.txt b/fastlane/metadata/android/id/changelogs/40105240.txt new file mode 100644 index 0000000000..d924da7ad6 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Secara umum perbaikan kutu, terutama memperbaiki pesan-pesan tidak muncul di lini masa. +Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/id/changelogs/40105250.txt b/fastlane/metadata/android/id/changelogs/40105250.txt new file mode 100644 index 0000000000..d924da7ad6 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Secara umum perbaikan kutu, terutama memperbaiki pesan-pesan tidak muncul di lini masa. +Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases From 597081e9a8fad521b454eb4a256b16c7b60f736e Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 21 Feb 2023 15:22:08 +0100 Subject: [PATCH 042/153] Adding unread counter badge view --- .../res/layout/fragment_new_home_detail.xml | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/vector/src/main/res/layout/fragment_new_home_detail.xml b/vector/src/main/res/layout/fragment_new_home_detail.xml index ced71a7863..8f603e57ab 100644 --- a/vector/src/main/res/layout/fragment_new_home_detail.xml +++ b/vector/src/main/res/layout/fragment_new_home_detail.xml @@ -120,6 +120,28 @@ tools:targetApi="lollipop_mr1" tools:visibility="visible" /> + + Date: Tue, 21 Feb 2023 16:28:30 +0100 Subject: [PATCH 043/153] Use case to compute the notification counter for spaces --- .../app/features/spaces/SpaceListViewModel.kt | 37 ++-------- .../GetNotificationCountForSpacesUseCase.kt | 70 +++++++++++++++++++ 2 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index 99f6a254b8..e5ebce0c11 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -32,13 +32,11 @@ import im.vector.app.features.analytics.plan.Interaction import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.session.coroutineScope import im.vector.app.features.settings.VectorPreferences -import kotlinx.coroutines.Dispatchers +import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.query.QueryStringValue @@ -48,12 +46,9 @@ import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.getUserOrDefault -import org.matrix.android.sdk.api.session.room.RoomSortOrder import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataTypes import org.matrix.android.sdk.api.session.room.model.Membership -import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import org.matrix.android.sdk.api.session.room.spaceSummaryQueryParams -import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount import org.matrix.android.sdk.api.session.space.SpaceOrderUtils import org.matrix.android.sdk.api.session.space.model.SpaceOrderContent import org.matrix.android.sdk.api.session.space.model.TopLevelSpaceComparator @@ -67,6 +62,7 @@ class SpaceListViewModel @AssistedInject constructor( private val vectorPreferences: VectorPreferences, private val autoAcceptInvites: AutoAcceptInvites, private val analyticsTracker: AnalyticsTracker, + private val getNotificationCountForSpacesUseCase: GetNotificationCountForSpacesUseCase, ) : VectorViewModel(initialState) { @AssistedFactory @@ -92,39 +88,14 @@ class SpaceListViewModel @AssistedInject constructor( copy(selectedSpace = selectedSpaceOption.orNull()) } - // XXX there should be a way to refactor this and share it - session.roomService().getPagedRoomSummariesLive( - roomSummaryQueryParams { - this.memberships = listOf(Membership.JOIN) - this.spaceFilter = roomsInSpaceFilter() - }, sortOrder = RoomSortOrder.NONE - ).asFlow() - .sample(300) - .onEach { - val inviteCount = if (autoAcceptInvites.hideInvites) { - 0 - } else { - session.roomService().getRoomSummaries( - roomSummaryQueryParams { this.memberships = listOf(Membership.INVITE) } - ).size - } - val totalCount = session.roomService().getNotificationCountForRooms( - roomSummaryQueryParams { - this.memberships = listOf(Membership.JOIN) - this.spaceFilter = roomsInSpaceFilter() - } - ) - val counts = RoomAggregateNotificationCount( - totalCount.notificationCount + inviteCount, - totalCount.highlightCount + inviteCount - ) + getNotificationCountForSpacesUseCase.execute(roomsInSpaceFilter()) + .onEach { counts -> setState { copy( homeAggregateCount = counts ) } } - .flowOn(Dispatchers.Default) .launchIn(viewModelScope) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt b/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt new file mode 100644 index 0000000000..5f79619c92 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.spaces.notification + +import androidx.lifecycle.asFlow +import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.features.invite.AutoAcceptInvites +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.sample +import org.matrix.android.sdk.api.query.SpaceFilter +import org.matrix.android.sdk.api.session.room.RoomSortOrder +import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams +import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount +import javax.inject.Inject + +// TODO add unit tests +class GetNotificationCountForSpacesUseCase @Inject constructor( + private val activeSessionHolder: ActiveSessionHolder, + private val autoAcceptInvites: AutoAcceptInvites, +) { + + fun execute(spaceFilter: SpaceFilter): Flow { + val session = activeSessionHolder.getSafeActiveSession() + + val spaceQueryParams = roomSummaryQueryParams { + this.memberships = listOf(Membership.JOIN) + this.spaceFilter = spaceFilter + } + return session + ?.roomService() + ?.getPagedRoomSummariesLive(queryParams = spaceQueryParams, sortOrder = RoomSortOrder.NONE) + ?.asFlow() + ?.sample(300) + ?.mapLatest { + val inviteCount = if (autoAcceptInvites.hideInvites) { + 0 + } else { + session.roomService().getRoomSummaries( + roomSummaryQueryParams { this.memberships = listOf(Membership.INVITE) } + ).size + } + val totalCount = session.roomService().getNotificationCountForRooms(spaceQueryParams) + RoomAggregateNotificationCount( + notificationCount = totalCount.notificationCount + inviteCount, + highlightCount = totalCount.highlightCount + inviteCount, + ) + } + ?.flowOn(Dispatchers.Default) + ?: emptyFlow() + } +} From 0e8a2254f8a7e8dbd2ed5d8430773962d736351d Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 21 Feb 2023 17:44:31 +0100 Subject: [PATCH 044/153] Listen for spaces notification count to refresh the badge --- .../app/core/di/MavericksViewModelModule.kt | 6 ++ .../features/home/NewHomeDetailFragment.kt | 15 +++++ .../features/home/NewHomeDetailViewModel.kt | 60 +++++++++++++++++++ .../features/home/NewHomeDetailViewState.kt | 24 ++++++++ 4 files changed, 105 insertions(+) create mode 100644 vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt create mode 100644 vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt diff --git a/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt b/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt index 35d8d0e896..27981c3d36 100644 --- a/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt @@ -40,6 +40,7 @@ import im.vector.app.features.discovery.DiscoverySettingsViewModel import im.vector.app.features.discovery.change.SetIdentityServerViewModel import im.vector.app.features.home.HomeActivityViewModel import im.vector.app.features.home.HomeDetailViewModel +import im.vector.app.features.home.NewHomeDetailViewModel import im.vector.app.features.home.UnknownDeviceDetectorSharedViewModel import im.vector.app.features.home.UnreadMessagesSharedViewModel import im.vector.app.features.home.UserColorAccountDataViewModel @@ -717,4 +718,9 @@ interface MavericksViewModelModule { @IntoMap @MavericksViewModelKey(RoomPollDetailViewModel::class) fun roomPollDetailViewModelFactory(factory: RoomPollDetailViewModel.Factory): MavericksAssistedViewModelFactory<*, *> + + @Binds + @IntoMap + @MavericksViewModelKey(NewHomeDetailViewModel::class) + fun newHomeDetailViewModelFactory(factory: NewHomeDetailViewModel.Factory): MavericksAssistedViewModelFactory<*, *> } diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt index 3189c2b99e..ff995311e6 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt @@ -47,6 +47,7 @@ import im.vector.app.features.call.SharedKnownCallsViewModel import im.vector.app.features.call.VectorCallActivity import im.vector.app.features.call.dialpad.PstnDialActivity import im.vector.app.features.call.webrtc.WebRtcCallManager +import im.vector.app.features.home.room.list.UnreadCounterBadgeView import im.vector.app.features.home.room.list.actions.RoomListSharedAction import im.vector.app.features.home.room.list.actions.RoomListSharedActionViewModel import im.vector.app.features.home.room.list.home.HomeRoomListFragment @@ -63,6 +64,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount import javax.inject.Inject @AndroidEntryPoint @@ -82,6 +84,7 @@ class NewHomeDetailFragment : @Inject lateinit var buildMeta: BuildMeta private val viewModel: HomeDetailViewModel by fragmentViewModel() + private val newHomeDetailViewModel: NewHomeDetailViewModel by fragmentViewModel() private val unknownDeviceDetectorSharedViewModel: UnknownDeviceDetectorSharedViewModel by activityViewModel() private val serverBackupStatusViewModel: ServerBackupStatusViewModel by activityViewModel() @@ -180,6 +183,10 @@ class NewHomeDetailFragment : currentCallsViewPresenter.updateCall(callManager.getCurrentCall(), callManager.getCalls()) invalidateOptionsMenu() } + + newHomeDetailViewModel.onEach { viewState -> + refreshUnreadCounterBadge(viewState.spacesNotificationCount) + } } private fun setupObservers() { @@ -379,6 +386,14 @@ class NewHomeDetailFragment : } } + private fun refreshUnreadCounterBadge(roomAggregateNotificationCount: RoomAggregateNotificationCount) { + val badgeState = UnreadCounterBadgeView.State.Count( + count = roomAggregateNotificationCount.notificationCount, + highlighted = roomAggregateNotificationCount.isHighlight, + ) + views.spacesUnreadCounterBadge.render(badgeState) + } + override fun onTapToReturnToCall() { callManager.getCurrentCall()?.let { call -> VectorCallActivity.newIntent( diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt new file mode 100644 index 0000000000..6f3ba79cf8 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home + +import com.airbnb.mvrx.MavericksViewModelFactory +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import im.vector.app.core.di.MavericksAssistedViewModelFactory +import im.vector.app.core.di.hiltMavericksViewModelFactory +import im.vector.app.core.platform.EmptyAction +import im.vector.app.core.platform.EmptyViewEvents +import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.roomprofile.polls.RoomPollsViewModel +import im.vector.app.features.roomprofile.polls.RoomPollsViewState +import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.matrix.android.sdk.api.query.SpaceFilter + +class NewHomeDetailViewModel @AssistedInject constructor( + @Assisted initialState: NewHomeDetailViewState, + private val getNotificationCountForSpacesUseCase: GetNotificationCountForSpacesUseCase, +) : VectorViewModel(initialState) { + + @AssistedFactory + interface Factory : MavericksAssistedViewModelFactory { + override fun create(initialState: NewHomeDetailViewState): NewHomeDetailViewModel + } + + companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() + + init { + observeSpacesNotificationCount() + } + + private fun observeSpacesNotificationCount() { + getNotificationCountForSpacesUseCase.execute(SpaceFilter.NoFilter) + .onEach { setState { copy(spacesNotificationCount = it) } } + .launchIn(viewModelScope) + } + + override fun handle(action: EmptyAction) { + // do nothing + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt new file mode 100644 index 0000000000..20ad9be4b4 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home + +import com.airbnb.mvrx.MavericksState +import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount + +data class NewHomeDetailViewState( + val spacesNotificationCount: RoomAggregateNotificationCount = RoomAggregateNotificationCount(notificationCount = 0, highlightCount = 0), +) : MavericksState From c36869cd03c14d00dfc8c025ee63606193545c33 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 21 Feb 2023 17:57:23 +0100 Subject: [PATCH 045/153] Adding knowledge of pending space invites --- .../features/home/NewHomeDetailFragment.kt | 22 ++++++++++++++----- .../features/home/NewHomeDetailViewState.kt | 1 + 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt index ff995311e6..51a217c526 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt @@ -185,7 +185,7 @@ class NewHomeDetailFragment : } newHomeDetailViewModel.onEach { viewState -> - refreshUnreadCounterBadge(viewState.spacesNotificationCount) + refreshUnreadCounterBadge(viewState.spacesNotificationCount, viewState.hasPendingSpaceInvites) } } @@ -386,11 +386,21 @@ class NewHomeDetailFragment : } } - private fun refreshUnreadCounterBadge(roomAggregateNotificationCount: RoomAggregateNotificationCount) { - val badgeState = UnreadCounterBadgeView.State.Count( - count = roomAggregateNotificationCount.notificationCount, - highlighted = roomAggregateNotificationCount.isHighlight, - ) + private fun refreshUnreadCounterBadge( + spacesNotificationCount: RoomAggregateNotificationCount, + hasPendingSpaceInvites: Boolean, + ) { + val badgeState = if (hasPendingSpaceInvites && spacesNotificationCount.notificationCount == 0) { + UnreadCounterBadgeView.State.Text( + text = "!", + highlighted = true, + ) + } else { + UnreadCounterBadgeView.State.Count( + count = spacesNotificationCount.notificationCount, + highlighted = spacesNotificationCount.isHighlight, + ) + } views.spacesUnreadCounterBadge.render(badgeState) } diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt index 20ad9be4b4..1ff0b86511 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt @@ -21,4 +21,5 @@ import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotification data class NewHomeDetailViewState( val spacesNotificationCount: RoomAggregateNotificationCount = RoomAggregateNotificationCount(notificationCount = 0, highlightCount = 0), + val hasPendingSpaceInvites: Boolean = false, ) : MavericksState From 13c8ff4ff5c6194c70dc024e677f4c0122a29a31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Feb 2023 07:45:40 +0000 Subject: [PATCH 046/153] Bump com.google.firebase:firebase-bom from 31.2.1 to 31.2.2 Bumps com.google.firebase:firebase-bom from 31.2.1 to 31.2.2. --- updated-dependencies: - dependency-name: com.google.firebase:firebase-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 7120789e10..aef478a733 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -11,7 +11,7 @@ def gradle = "7.4.1" def kotlin = "1.8.10" def kotlinCoroutines = "1.6.4" def dagger = "2.45" -def firebaseBom = "31.2.1" +def firebaseBom = "31.2.2" def appDistribution = "16.0.0-beta05" def retrofit = "2.9.0" def markwon = "4.6.2" From c74cdb9540cbf34b711dde2313ea1e043b174a18 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 10:44:55 +0100 Subject: [PATCH 047/153] Observe the spaces invites --- .../features/home/NewHomeDetailViewModel.kt | 19 +++++++++- .../app/features/spaces/GetSpacesUseCase.kt | 37 +++++++++++++++++++ .../app/features/spaces/SpaceListViewModel.kt | 8 ++-- 3 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/spaces/GetSpacesUseCase.kt diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt index 6f3ba79cf8..7f68accd90 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt @@ -25,16 +25,20 @@ import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.EmptyAction import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.roomprofile.polls.RoomPollsViewModel -import im.vector.app.features.roomprofile.polls.RoomPollsViewState +import im.vector.app.features.spaces.GetSpacesUseCase import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.query.SpaceFilter +import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.spaceSummaryQueryParams +// TODO add unit tests class NewHomeDetailViewModel @AssistedInject constructor( @Assisted initialState: NewHomeDetailViewState, private val getNotificationCountForSpacesUseCase: GetNotificationCountForSpacesUseCase, + private val getSpacesUseCase: GetSpacesUseCase, ) : VectorViewModel(initialState) { @AssistedFactory @@ -46,6 +50,7 @@ class NewHomeDetailViewModel @AssistedInject constructor( init { observeSpacesNotificationCount() + observeSpacesInvite() } private fun observeSpacesNotificationCount() { @@ -54,6 +59,16 @@ class NewHomeDetailViewModel @AssistedInject constructor( .launchIn(viewModelScope) } + private fun observeSpacesInvite() { + val params = spaceSummaryQueryParams { + memberships = listOf(Membership.INVITE) + displayName = QueryStringValue.IsNotEmpty + } + getSpacesUseCase.execute(params) + .onEach { setState { copy(hasPendingSpaceInvites = it.isNotEmpty()) } } + .launchIn(viewModelScope) + } + override fun handle(action: EmptyAction) { // do nothing } diff --git a/vector/src/main/java/im/vector/app/features/spaces/GetSpacesUseCase.kt b/vector/src/main/java/im/vector/app/features/spaces/GetSpacesUseCase.kt new file mode 100644 index 0000000000..d3f462f9f9 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/spaces/GetSpacesUseCase.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.spaces + +import im.vector.app.core.di.ActiveSessionHolder +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow +import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams +import org.matrix.android.sdk.flow.flow +import javax.inject.Inject + +// TODO add unit tests +class GetSpacesUseCase @Inject constructor( + private val activeSessionHolder: ActiveSessionHolder, +) { + + fun execute(params: SpaceSummaryQueryParams): Flow> { + val session = activeSessionHolder.getSafeActiveSession() + + return session?.flow()?.liveSpaceSummaries(params) ?: emptyFlow() + } +} diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index e5ebce0c11..b2776e5f87 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -29,7 +29,6 @@ import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.plan.Interaction -import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.session.coroutineScope import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase @@ -53,16 +52,15 @@ import org.matrix.android.sdk.api.session.space.SpaceOrderUtils import org.matrix.android.sdk.api.session.space.model.SpaceOrderContent import org.matrix.android.sdk.api.session.space.model.TopLevelSpaceComparator import org.matrix.android.sdk.api.util.toMatrixItem -import org.matrix.android.sdk.flow.flow class SpaceListViewModel @AssistedInject constructor( @Assisted initialState: SpaceListViewState, private val spaceStateHandler: SpaceStateHandler, private val session: Session, private val vectorPreferences: VectorPreferences, - private val autoAcceptInvites: AutoAcceptInvites, private val analyticsTracker: AnalyticsTracker, - private val getNotificationCountForSpacesUseCase: GetNotificationCountForSpacesUseCase, + getNotificationCountForSpacesUseCase: GetNotificationCountForSpacesUseCase, + private val getSpacesUseCase: GetSpacesUseCase, ) : VectorViewModel(initialState) { @AssistedFactory @@ -238,7 +236,7 @@ class SpaceListViewModel @AssistedInject constructor( } combine( - session.flow().liveSpaceSummaries(params), + getSpacesUseCase.execute(params), session.accountDataService() .getLiveRoomAccountDataEvents(setOf(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER)) .asFlow() From a509da54e80014b385f5b8840c4964774947d4ad Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:58:26 +0100 Subject: [PATCH 048/153] Adding unit tests for GetSpacesUseCase --- .../app/features/spaces/GetSpacesUseCase.kt | 1 - .../features/spaces/GetSpacesUseCaseTest.kt | 104 ++++++++++++++++++ .../im/vector/app/test/fakes/FakeSession.kt | 2 + .../vector/app/test/fakes/FakeSpaceService.kt | 37 +++++++ 4 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 vector/src/test/java/im/vector/app/features/spaces/GetSpacesUseCaseTest.kt create mode 100644 vector/src/test/java/im/vector/app/test/fakes/FakeSpaceService.kt diff --git a/vector/src/main/java/im/vector/app/features/spaces/GetSpacesUseCase.kt b/vector/src/main/java/im/vector/app/features/spaces/GetSpacesUseCase.kt index d3f462f9f9..048e4b01bd 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/GetSpacesUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/GetSpacesUseCase.kt @@ -24,7 +24,6 @@ import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams import org.matrix.android.sdk.flow.flow import javax.inject.Inject -// TODO add unit tests class GetSpacesUseCase @Inject constructor( private val activeSessionHolder: ActiveSessionHolder, ) { diff --git a/vector/src/test/java/im/vector/app/features/spaces/GetSpacesUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/spaces/GetSpacesUseCaseTest.kt new file mode 100644 index 0000000000..2e8d50ff3f --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/spaces/GetSpacesUseCaseTest.kt @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.spaces + +import im.vector.app.test.fakes.FakeActiveSessionHolder +import im.vector.app.test.fakes.FakeFlowLiveDataConversions +import im.vector.app.test.fakes.givenAsFlow +import im.vector.app.test.test +import io.mockk.mockk +import io.mockk.unmockkAll +import io.mockk.verify +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams + +internal class GetSpacesUseCaseTest { + + private val fakeActiveSessionHolder = FakeActiveSessionHolder() + private val fakeFlowLiveDataConversions = FakeFlowLiveDataConversions() + + private val getSpacesUseCase = GetSpacesUseCase( + activeSessionHolder = fakeActiveSessionHolder.instance, + ) + + @Before + fun setUp() { + fakeFlowLiveDataConversions.setup() + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun `given params when execute then the list of summaries is returned`() = runTest { + // Given + val queryParams = givenSpaceQueryParams() + val firstSummaries = listOf(mockk()) + val nextSummaries = listOf(mockk()) + fakeActiveSessionHolder.fakeSession + .fakeSpaceService + .givenGetSpaceSummariesReturns(firstSummaries) + fakeActiveSessionHolder.fakeSession + .fakeSpaceService + .givenGetSpaceSummariesLiveReturns(nextSummaries) + .givenAsFlow() + + // When + val testObserver = getSpacesUseCase.execute(queryParams).test(this) + advanceUntilIdle() + + // Then + testObserver + .assertValues(firstSummaries, nextSummaries) + .finish() + verify { + fakeActiveSessionHolder.fakeSession.fakeSpaceService.getSpaceSummaries(queryParams) + fakeActiveSessionHolder.fakeSession.fakeSpaceService.getSpaceSummariesLive(queryParams) + } + } + + @Test + fun `given no active session when execute then empty flow is returned`() = runTest { + // Given + fakeActiveSessionHolder.givenGetSafeActiveSessionReturns(null) + val queryParams = givenSpaceQueryParams() + + // When + val testObserver = getSpacesUseCase.execute(queryParams).test(this) + advanceUntilIdle() + + // Then + testObserver + .assertNoValues() + .finish() + verify(inverse = true) { + fakeActiveSessionHolder.fakeSession.fakeSpaceService.getSpaceSummaries(queryParams) + fakeActiveSessionHolder.fakeSession.fakeSpaceService.getSpaceSummariesLive(queryParams) + } + } + + private fun givenSpaceQueryParams(): SpaceSummaryQueryParams { + return mockk() + } +} diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt index 1b6d3e2729..ada23c159e 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt @@ -46,6 +46,7 @@ class FakeSession( val fakeUserService: FakeUserService = FakeUserService(), private val fakeEventService: FakeEventService = FakeEventService(), val fakeSessionAccountDataService: FakeSessionAccountDataService = FakeSessionAccountDataService(), + val fakeSpaceService: FakeSpaceService = FakeSpaceService(), ) : Session by mockk(relaxed = true) { init { @@ -66,6 +67,7 @@ class FakeSession( override fun pushersService() = fakePushersService override fun accountDataService() = fakeSessionAccountDataService override fun userService() = fakeUserService + override fun spaceService() = fakeSpaceService fun givenVectorStore(vectorSessionStore: VectorSessionStore) { coEvery { diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeSpaceService.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeSpaceService.kt new file mode 100644 index 0000000000..59c7d5524d --- /dev/null +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeSpaceService.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.test.fakes + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import io.mockk.every +import io.mockk.mockk +import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.space.SpaceService + +class FakeSpaceService : SpaceService by mockk() { + + fun givenGetSpaceSummariesLiveReturns(roomSummaries: List): LiveData> { + return MutableLiveData(roomSummaries).also { + every { getSpaceSummariesLive(any()) } returns it + } + } + + fun givenGetSpaceSummariesReturns(roomSummaries: List) { + every { getSpaceSummaries(any()) } returns roomSummaries + } +} From e8c95551c1d69e30f6b760fa45ae3317be6bf462 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:19:21 +0100 Subject: [PATCH 049/153] Adding unit tests for GetNotificationCountForSpacesUseCase --- .../GetNotificationCountForSpacesUseCase.kt | 3 +- ...etNotificationCountForSpacesUseCaseTest.kt | 174 ++++++++++++++++++ .../app/test/fakes/FakeAutoAcceptInvites.kt | 4 + .../test/fakes/FakeFlowLiveDataConversions.kt | 7 +- .../vector/app/test/fakes/FakeRoomService.kt | 18 ++ 5 files changed, 202 insertions(+), 4 deletions(-) create mode 100644 vector/src/test/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCaseTest.kt diff --git a/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt b/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt index 5f79619c92..031015757d 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt @@ -32,7 +32,6 @@ import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount import javax.inject.Inject -// TODO add unit tests class GetNotificationCountForSpacesUseCase @Inject constructor( private val activeSessionHolder: ActiveSessionHolder, private val autoAcceptInvites: AutoAcceptInvites, @@ -64,7 +63,7 @@ class GetNotificationCountForSpacesUseCase @Inject constructor( highlightCount = totalCount.highlightCount + inviteCount, ) } - ?.flowOn(Dispatchers.Default) + ?.flowOn(session.coroutineDispatchers.main) ?: emptyFlow() } } diff --git a/vector/src/test/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCaseTest.kt new file mode 100644 index 0000000000..2813b9d79f --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCaseTest.kt @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.spaces.notification + +import androidx.paging.PagedList +import im.vector.app.test.fakes.FakeActiveSessionHolder +import im.vector.app.test.fakes.FakeAutoAcceptInvites +import im.vector.app.test.fakes.FakeFlowLiveDataConversions +import im.vector.app.test.fakes.givenAsFlow +import im.vector.app.test.test +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.unmockkAll +import io.mockk.verify +import kotlinx.coroutines.flow.sample +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.matrix.android.sdk.api.query.SpaceFilter +import org.matrix.android.sdk.api.session.room.RoomSortOrder +import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount + +internal class GetNotificationCountForSpacesUseCaseTest { + + private val fakeActiveSessionHolder = FakeActiveSessionHolder() + private val fakeAutoAcceptInvites = FakeAutoAcceptInvites() + private val fakeFlowLiveDataConversions = FakeFlowLiveDataConversions() + + private val getNotificationCountForSpacesUseCase = GetNotificationCountForSpacesUseCase( + activeSessionHolder = fakeActiveSessionHolder.instance, + autoAcceptInvites = fakeAutoAcceptInvites, + ) + + @Before + fun setUp() { + fakeFlowLiveDataConversions.setup() + mockkStatic("kotlinx.coroutines.flow.FlowKt") + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun `given space filter and hide invites when execute then correct notification count is returned`() = runTest { + // given + val spaceFilter = SpaceFilter.NoFilter + val pagedList = mockk>() + val pagedListFlow = fakeActiveSessionHolder.fakeSession + .fakeRoomService + .givenGetPagedRoomSummariesLiveReturns(pagedList) + .givenAsFlow() + every { pagedListFlow.sample(any()) } returns pagedListFlow + val expectedNotificationCount = RoomAggregateNotificationCount( + notificationCount = 1, + highlightCount = 0, + ) + fakeActiveSessionHolder.fakeSession + .fakeRoomService + .givenGetNotificationCountForRoomsReturns(expectedNotificationCount) + fakeAutoAcceptInvites._hideInvites = true + + // When + val testObserver = getNotificationCountForSpacesUseCase.execute(spaceFilter).test(this) + advanceUntilIdle() + + // Then + testObserver + .assertValues(expectedNotificationCount) + .finish() + verify { + fakeActiveSessionHolder.fakeSession.fakeRoomService.getNotificationCountForRooms( + queryParams = match { it.memberships == listOf(Membership.JOIN) && it.spaceFilter == spaceFilter } + ) + fakeActiveSessionHolder.fakeSession.fakeRoomService.getPagedRoomSummariesLive( + queryParams = match { it.memberships == listOf(Membership.JOIN) && it.spaceFilter == spaceFilter }, + pagedListConfig = any(), + sortOrder = RoomSortOrder.NONE, + ) + } + } + + @Test + fun `given space filter and show invites when execute then correct notification count is returned`() = runTest { + // given + val spaceFilter = SpaceFilter.NoFilter + val pagedList = mockk>() + val pagedListFlow = fakeActiveSessionHolder.fakeSession + .fakeRoomService + .givenGetPagedRoomSummariesLiveReturns(pagedList) + .givenAsFlow() + every { pagedListFlow.sample(any()) } returns pagedListFlow + val notificationCount = RoomAggregateNotificationCount( + notificationCount = 1, + highlightCount = 0, + ) + fakeActiveSessionHolder.fakeSession + .fakeRoomService + .givenGetNotificationCountForRoomsReturns(notificationCount) + val invitedRooms = listOf(mockk()) + fakeActiveSessionHolder.fakeSession + .fakeRoomService + .givenGetRoomSummaries(invitedRooms) + fakeAutoAcceptInvites._hideInvites = false + val expectedNotificationCount = RoomAggregateNotificationCount( + notificationCount = notificationCount.notificationCount + invitedRooms.size, + highlightCount = notificationCount.highlightCount + invitedRooms.size, + ) + + // When + val testObserver = getNotificationCountForSpacesUseCase.execute(spaceFilter).test(this) + advanceUntilIdle() + + // Then + testObserver + .assertValues(expectedNotificationCount) + .finish() + verify { + fakeActiveSessionHolder.fakeSession.fakeRoomService.getRoomSummaries( + queryParams = match { it.memberships == listOf(Membership.INVITE) } + ) + fakeActiveSessionHolder.fakeSession.fakeRoomService.getNotificationCountForRooms( + queryParams = match { it.memberships == listOf(Membership.JOIN) && it.spaceFilter == spaceFilter } + ) + fakeActiveSessionHolder.fakeSession.fakeRoomService.getPagedRoomSummariesLive( + queryParams = match { it.memberships == listOf(Membership.JOIN) && it.spaceFilter == spaceFilter }, + pagedListConfig = any(), + sortOrder = RoomSortOrder.NONE, + ) + } + } + + @Test + fun `given no active session when execute then empty flow is returned`() = runTest { + // given + val spaceFilter = SpaceFilter.NoFilter + fakeActiveSessionHolder.givenGetSafeActiveSessionReturns(null) + + // When + val testObserver = getNotificationCountForSpacesUseCase.execute(spaceFilter).test(this) + + // Then + testObserver + .assertNoValues() + .finish() + verify(inverse = true) { + fakeActiveSessionHolder.fakeSession.fakeRoomService.getPagedRoomSummariesLive( + queryParams = any(), + pagedListConfig = any(), + sortOrder = any(), + ) + } + } +} diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt index 778c2f113d..d1160cedfd 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt @@ -21,7 +21,11 @@ import im.vector.app.features.invite.AutoAcceptInvites class FakeAutoAcceptInvites : AutoAcceptInvites { var _isEnabled: Boolean = false + var _hideInvites: Boolean = false override val isEnabled: Boolean get() = _isEnabled + + override val hideInvites: Boolean + get() = _hideInvites } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeFlowLiveDataConversions.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeFlowLiveDataConversions.kt index 956a86f32e..cdbe828521 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeFlowLiveDataConversions.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeFlowLiveDataConversions.kt @@ -20,6 +20,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.asFlow import io.mockk.every import io.mockk.mockkStatic +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf class FakeFlowLiveDataConversions { @@ -28,6 +29,8 @@ class FakeFlowLiveDataConversions { } } -fun LiveData.givenAsFlow() { - every { asFlow() } returns flowOf(value!!) +fun LiveData.givenAsFlow(): Flow { + return flowOf(value!!).also { + every { asFlow() } returns it + } } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeRoomService.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeRoomService.kt index e957266383..63209222b2 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeRoomService.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeRoomService.kt @@ -16,10 +16,14 @@ package im.vector.app.test.fakes +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.paging.PagedList import io.mockk.every import io.mockk.mockk import org.matrix.android.sdk.api.session.room.RoomService import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount class FakeRoomService( private val fakeRoom: FakeRoom = FakeRoom() @@ -34,4 +38,18 @@ class FakeRoomService( fun set(roomSummary: RoomSummary?) { every { getRoomSummary(any()) } returns roomSummary } + + fun givenGetPagedRoomSummariesLiveReturns(pagedList: PagedList): LiveData> { + return MutableLiveData(pagedList).also { + every { getPagedRoomSummariesLive(queryParams = any(), pagedListConfig = any(), sortOrder = any()) } returns it + } + } + + fun givenGetNotificationCountForRoomsReturns(roomAggregateNotificationCount: RoomAggregateNotificationCount) { + every { getNotificationCountForRooms(queryParams = any()) } returns roomAggregateNotificationCount + } + + fun givenGetRoomSummaries(roomSummaries: List) { + every { getRoomSummaries(any()) } returns roomSummaries + } } From 26bf8b94dc0567b34fbad24e700f9d15e9a9a893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 22 Feb 2023 11:21:14 +0000 Subject: [PATCH 050/153] Translated using Weblate (Estonian) Currently translated at 99.6% (2598 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/et/ --- library/ui-strings/src/main/res/values-et/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index c62e147b34..98a9733c6d 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -2891,7 +2891,7 @@ Sinu koduserver veel ei toeta jutulõngade loendit. Alustasime ringhäälingukõnega Selle ringhäälingukõne esitamine ei õnnestu. - Krüptimisvigade tõttu jääb osa hääli lugemata + Dekrüptimisvigade tõttu jääb osa hääli lugemata Möödunud päevas polnud ühtegi toimumas olnud küsitlust. \nVarasemate päevade vaatamiseks laadi veel küsitlusi. From ecfbbb15d6ccc86feb38c0095dfbef0fd8b0e97a Mon Sep 17 00:00:00 2001 From: random Date: Tue, 21 Feb 2023 13:21:19 +0000 Subject: [PATCH 051/153] Translated using Weblate (Italian) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/it/ --- library/ui-strings/src/main/res/values-it/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml index 80a0b7045f..8a6db0f0e2 100644 --- a/library/ui-strings/src/main/res/values-it/strings.xml +++ b/library/ui-strings/src/main/res/values-it/strings.xml @@ -2911,4 +2911,12 @@ Impossibile iniziare il messaggio vocale Applica formato codice interlinea Errore di connessione - Registrazione in pausa + Attiva/disattiva blocco di codice + Attiva/disattiva citazione + Rimuovi indentazione + Indenta + Vedi sondaggio nella linea temporale + Impossibile decifrare questa trasmissione vocale. + I dettagli del tuo account sono gestiti separatamente su %1$s. + Account \ No newline at end of file From 8fdc95592f3b5b2ff21e6310797a2570e996531a Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Wed, 22 Feb 2023 08:24:50 +0000 Subject: [PATCH 052/153] Translated using Weblate (Swedish) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sv/ --- library/ui-strings/src/main/res/values-sv/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/ui-strings/src/main/res/values-sv/strings.xml b/library/ui-strings/src/main/res/values-sv/strings.xml index 04aaab057c..1c9688e99c 100644 --- a/library/ui-strings/src/main/res/values-sv/strings.xml +++ b/library/ui-strings/src/main/res/values-sv/strings.xml @@ -326,7 +326,7 @@ \nLägg till några nu\? Tyvärr har ingen extern applikation hittats som kan fullfölja denna handling. Logga in - Logga in med externt konto + Logga in med samlad inloggning Skicka in Fel användarnamn och/eller lösenord Det här ser inte ut som en giltig e-postadress @@ -1820,7 +1820,7 @@ Skickar det givna meddelandet med snöfall Skickar de givna meddelandet med konfetti Rensa historik - externt konto + samlad inloggning Logga in med %s Skapa konto med %s Fortsätt med %s From 04ce186b6b46b45fc446a4f3d511f63b996cb58b Mon Sep 17 00:00:00 2001 From: random Date: Tue, 21 Feb 2023 13:24:04 +0000 Subject: [PATCH 053/153] Translated using Weblate (Italian) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/it/ --- fastlane/metadata/android/it-IT/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/it-IT/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/it-IT/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/40105250.txt diff --git a/fastlane/metadata/android/it-IT/changelogs/40105240.txt b/fastlane/metadata/android/it-IT/changelogs/40105240.txt new file mode 100644 index 0000000000..a3f49e5149 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: correzione di errori, in particolare correzione dei messaggi che non comparivano nella linea temporale. +Cronologia completa: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/it-IT/changelogs/40105250.txt b/fastlane/metadata/android/it-IT/changelogs/40105250.txt new file mode 100644 index 0000000000..a3f49e5149 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: correzione di errori, in particolare correzione dei messaggi che non comparivano nella linea temporale. +Cronologia completa: https://github.com/vector-im/element-android/releases From b78da9824d7d3a9218b4b33e8ee56c47e09fbfa4 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:38:35 +0100 Subject: [PATCH 054/153] Adding unit tests for NewHomeDetailViewModel --- .../features/home/NewHomeDetailViewModel.kt | 1 - .../home/NewHomeDetailViewModelTest.kt | 80 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt index 7f68accd90..b26d010137 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt @@ -34,7 +34,6 @@ import org.matrix.android.sdk.api.query.SpaceFilter import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.spaceSummaryQueryParams -// TODO add unit tests class NewHomeDetailViewModel @AssistedInject constructor( @Assisted initialState: NewHomeDetailViewState, private val getNotificationCountForSpacesUseCase: GetNotificationCountForSpacesUseCase, diff --git a/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt b/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt new file mode 100644 index 0000000000..23882bf7c4 --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home + +import com.airbnb.mvrx.test.MavericksTestRule +import im.vector.app.features.spaces.GetSpacesUseCase +import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase +import im.vector.app.test.test +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import org.junit.Rule +import org.junit.Test +import org.matrix.android.sdk.api.query.SpaceFilter +import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount + +internal class NewHomeDetailViewModelTest { + + @get:Rule + val mavericksTestRule = MavericksTestRule(testDispatcher = UnconfinedTestDispatcher()) + + private val initialState = NewHomeDetailViewState() + private val fakeGetNotificationCountForSpacesUseCase = mockk() + private val fakeGetSpacesUseCase = mockk() + + private fun createViewModel(): NewHomeDetailViewModel { + return NewHomeDetailViewModel( + initialState = initialState, + getNotificationCountForSpacesUseCase = fakeGetNotificationCountForSpacesUseCase, + getSpacesUseCase = fakeGetSpacesUseCase, + ) + } + + @Test + fun `given the viewModel is created then viewState is updated with space notifications count and pending space invites`() { + // Given + val spacesNotificationCount = RoomAggregateNotificationCount( + notificationCount = 1, + highlightCount = 1, + ) + every { fakeGetNotificationCountForSpacesUseCase.execute(any()) } returns flowOf(spacesNotificationCount) + val spaceInvites = listOf(mockk()) + every { fakeGetSpacesUseCase.execute(any()) } returns flowOf(spaceInvites) + val expectedViewState = initialState.copy( + spacesNotificationCount = spacesNotificationCount, + hasPendingSpaceInvites = true, + ) + + // When + val viewModel = createViewModel() + val viewModelTest = viewModel.test() + + // Then + viewModelTest + .assertLatestState(expectedViewState) + .finish() + verify { + fakeGetNotificationCountForSpacesUseCase.execute(SpaceFilter.NoFilter) + fakeGetSpacesUseCase.execute(match { it.memberships == listOf(Membership.INVITE) }) + } + } +} From 18c7f0d894e1d5867e4eee7092c118e0526189e9 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:39:44 +0100 Subject: [PATCH 055/153] Remove unused import --- .../spaces/notification/GetNotificationCountForSpacesUseCase.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt b/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt index 031015757d..08d63e2653 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCase.kt @@ -19,7 +19,6 @@ package im.vector.app.features.spaces.notification import androidx.lifecycle.asFlow import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.invite.AutoAcceptInvites -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flowOn From 1b0265662dc4bffe7eae381f58e7392705b440c5 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:50:01 +0100 Subject: [PATCH 056/153] Adding changelog entry --- changelog.d/8157.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8157.feature diff --git a/changelog.d/8157.feature b/changelog.d/8157.feature new file mode 100644 index 0000000000..3cab2b600b --- /dev/null +++ b/changelog.d/8157.feature @@ -0,0 +1 @@ +Add aggregated unread indicator for spaces in the new layout From af4ab418510bd9b8cd35ae2f92382b91d2d536de Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:04:14 +0100 Subject: [PATCH 057/153] Highlight the badge when there is pending space invite --- .../java/im/vector/app/features/home/NewHomeDetailFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt index 51a217c526..a13487afc8 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt @@ -398,7 +398,7 @@ class NewHomeDetailFragment : } else { UnreadCounterBadgeView.State.Count( count = spacesNotificationCount.notificationCount, - highlighted = spacesNotificationCount.isHighlight, + highlighted = spacesNotificationCount.isHighlight || hasPendingSpaceInvites, ) } views.spacesUnreadCounterBadge.render(badgeState) From 7062e0737c4410d613b82a739fdb44ccffaff4e1 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:08:59 +0100 Subject: [PATCH 058/153] Add changelog entry --- changelog.d/7989.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7989.bugfix diff --git a/changelog.d/7989.bugfix b/changelog.d/7989.bugfix new file mode 100644 index 0000000000..b8ec7cdada --- /dev/null +++ b/changelog.d/7989.bugfix @@ -0,0 +1 @@ +Space setting category doesn't show up From 8861b36abaa9050790c925bfe256ce9b45ca54c7 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:09:37 +0100 Subject: [PATCH 059/153] Make the setting visible when using old app layout --- .../app/features/settings/VectorSettingsPreferencesFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt index 073d5f7468..01dd014f92 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt @@ -103,7 +103,7 @@ class VectorSettingsPreferencesFragment : } findPreference(VectorPreferences.SETTINGS_PREF_SPACE_CATEGORY)!!.let { pref -> - pref.isVisible = !vectorFeatures.isNewAppLayoutFeatureEnabled() + pref.isVisible = !vectorPreferences.isNewAppLayoutEnabled() pref.isEnabled = !vectorPreferences.isNewAppLayoutEnabled() } From a98dc86e34fb0480b7148892f0e6debdfb7dbe9d Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 22 Feb 2023 17:51:12 +0100 Subject: [PATCH 060/153] version++ --- matrix-sdk-android/build.gradle | 2 +- vector-app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index 133067cea4..3751b9988d 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -62,7 +62,7 @@ android { // that the app's state is completely cleared between tests. testInstrumentationRunnerArguments clearPackageData: 'true' - buildConfigField "String", "SDK_VERSION", "\"1.5.26\"" + buildConfigField "String", "SDK_VERSION", "\"1.5.28\"" buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\"" buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\"" diff --git a/vector-app/build.gradle b/vector-app/build.gradle index 1203b03791..910927cf24 100644 --- a/vector-app/build.gradle +++ b/vector-app/build.gradle @@ -37,7 +37,7 @@ ext.versionMinor = 5 // Note: even values are reserved for regular release, odd values for hotfix release. // When creating a hotfix, you should decrease the value, since the current value // is the value for the next regular release. -ext.versionPatch = 26 +ext.versionPatch = 28 static def getGitTimestamp() { def cmd = 'git show -s --format=%ct' From 2aa5e6f7a0fc5bbb5eddeda4d5c14d27319b239b Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 22 Feb 2023 17:55:50 +0100 Subject: [PATCH 061/153] Apply changes --- CHANGES.md | 29 +++++++++++++++++++ changelog.d/6121.bugfix | 1 - changelog.d/6367.feature | 1 - changelog.d/8007.feature | 1 - changelog.d/8044.misc | 1 - changelog.d/8045.feature | 1 - changelog.d/8056.feature | 2 -- changelog.d/8090.bugfix | 1 - changelog.d/8110.feature | 1 - changelog.d/8115.misc | 1 - changelog.d/8123.feature | 1 - changelog.d/8129.bugfix | 1 - changelog.d/8130.feature | 1 - changelog.d/8139.misc | 1 - changelog.d/8142.bugfix | 1 - changelog.d/8150.bugfix | 1 - .../android/en-US/changelogs/40105260.txt | 2 ++ 17 files changed, 31 insertions(+), 16 deletions(-) delete mode 100644 changelog.d/6121.bugfix delete mode 100644 changelog.d/6367.feature delete mode 100644 changelog.d/8007.feature delete mode 100644 changelog.d/8044.misc delete mode 100644 changelog.d/8045.feature delete mode 100644 changelog.d/8056.feature delete mode 100644 changelog.d/8090.bugfix delete mode 100644 changelog.d/8110.feature delete mode 100644 changelog.d/8115.misc delete mode 100644 changelog.d/8123.feature delete mode 100644 changelog.d/8129.bugfix delete mode 100644 changelog.d/8130.feature delete mode 100644 changelog.d/8139.misc delete mode 100644 changelog.d/8142.bugfix delete mode 100644 changelog.d/8150.bugfix create mode 100644 fastlane/metadata/android/en-US/changelogs/40105260.txt diff --git a/CHANGES.md b/CHANGES.md index 3fc21c7d07..ae1f10f6c0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,32 @@ +Changes in Element v1.5.26 (2023-02-22) +======================================= + +Features ✨ +---------- + - Adds MSC3824 OIDC-awareness when talking to an OIDC-enabled homeservers ([#6367](https://github.com/vector-im/element-android/issues/6367)) + - [Poll] Synchronize polls push rules with message push rules ([#8007](https://github.com/vector-im/element-android/issues/8007)) + - [Rich text editor] Add code block, quote and indentation actions ([#8045](https://github.com/vector-im/element-android/issues/8045)) + - [Poll] History list: details screen of a poll + - [Poll] History list: enable the new settings entry in release mode ([#8056](https://github.com/vector-im/element-android/issues/8056)) + - [Location sharing] Show own location in map views ([#8110](https://github.com/vector-im/element-android/issues/8110)) + - Updates to protocol used for Sign in with QR code ([#8123](https://github.com/vector-im/element-android/issues/8123)) + - [Poll] Synchronize polls and message push rules ([#8130](https://github.com/vector-im/element-android/issues/8130)) + +Bugfixes 🐛 +---------- + - Android app does not show correct poll data ([#6121](https://github.com/vector-im/element-android/issues/6121)) + - Fix timeline always jumps to the bottom when screen goes back to foreground. ([#8090](https://github.com/vector-im/element-android/issues/8090)) + - [Poll] Improve rendering of poll end message when poll start event isn't available ([#8129](https://github.com/vector-im/element-android/issues/8129)) + - Replace hardcoded colors by theming colors on send button. ([#8142](https://github.com/vector-im/element-android/issues/8142)) + - [Timeline]: Editing a reply from iOS breaks the "in reply to" rendering ([#8150](https://github.com/vector-im/element-android/issues/8150)) + +Other changes +------------- + - Build unmerged APKs on pull request ([#8044](https://github.com/vector-im/element-android/issues/8044)) + - Replace 'Bots' with 'bots' inside terms_description_for_integration_manager ([#8115](https://github.com/vector-im/element-android/issues/8115)) + - Fix ktlint issue with fields and a new line. ([#8139](https://github.com/vector-im/element-android/issues/8139)) + + Changes in Element v1.5.25 (2023-02-15) ======================================= diff --git a/changelog.d/6121.bugfix b/changelog.d/6121.bugfix deleted file mode 100644 index d8049ce9db..0000000000 --- a/changelog.d/6121.bugfix +++ /dev/null @@ -1 +0,0 @@ -Android app does not show correct poll data diff --git a/changelog.d/6367.feature b/changelog.d/6367.feature deleted file mode 100644 index 5d4b46ca99..0000000000 --- a/changelog.d/6367.feature +++ /dev/null @@ -1 +0,0 @@ -Adds MSC3824 OIDC-awareness when talking to an OIDC-enabled homeservers diff --git a/changelog.d/8007.feature b/changelog.d/8007.feature deleted file mode 100644 index 0ae4cc49af..0000000000 --- a/changelog.d/8007.feature +++ /dev/null @@ -1 +0,0 @@ -[Poll] Synchronize polls push rules with message push rules diff --git a/changelog.d/8044.misc b/changelog.d/8044.misc deleted file mode 100644 index dd6836f868..0000000000 --- a/changelog.d/8044.misc +++ /dev/null @@ -1 +0,0 @@ -Build unmerged APKs on pull request \ No newline at end of file diff --git a/changelog.d/8045.feature b/changelog.d/8045.feature deleted file mode 100644 index 89b9111def..0000000000 --- a/changelog.d/8045.feature +++ /dev/null @@ -1 +0,0 @@ -[Rich text editor] Add code block, quote and indentation actions \ No newline at end of file diff --git a/changelog.d/8056.feature b/changelog.d/8056.feature deleted file mode 100644 index ff000c98ff..0000000000 --- a/changelog.d/8056.feature +++ /dev/null @@ -1,2 +0,0 @@ -[Poll] History list: details screen of a poll -[Poll] History list: enable the new settings entry in release mode diff --git a/changelog.d/8090.bugfix b/changelog.d/8090.bugfix deleted file mode 100644 index ebe48c2c35..0000000000 --- a/changelog.d/8090.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix timeline always jumps to the bottom when screen goes back to foreground. diff --git a/changelog.d/8110.feature b/changelog.d/8110.feature deleted file mode 100644 index 6ac7a98c3c..0000000000 --- a/changelog.d/8110.feature +++ /dev/null @@ -1 +0,0 @@ -[Location sharing] Show own location in map views diff --git a/changelog.d/8115.misc b/changelog.d/8115.misc deleted file mode 100644 index 3c40993722..0000000000 --- a/changelog.d/8115.misc +++ /dev/null @@ -1 +0,0 @@ -Replace 'Bots' with 'bots' inside terms_description_for_integration_manager diff --git a/changelog.d/8123.feature b/changelog.d/8123.feature deleted file mode 100644 index d4c4dae9c5..0000000000 --- a/changelog.d/8123.feature +++ /dev/null @@ -1 +0,0 @@ -Updates to protocol used for Sign in with QR code diff --git a/changelog.d/8129.bugfix b/changelog.d/8129.bugfix deleted file mode 100644 index bd3bbc9035..0000000000 --- a/changelog.d/8129.bugfix +++ /dev/null @@ -1 +0,0 @@ -[Poll] Improve rendering of poll end message when poll start event isn't available diff --git a/changelog.d/8130.feature b/changelog.d/8130.feature deleted file mode 100644 index 80b7b1debd..0000000000 --- a/changelog.d/8130.feature +++ /dev/null @@ -1 +0,0 @@ -[Poll] Synchronize polls and message push rules diff --git a/changelog.d/8139.misc b/changelog.d/8139.misc deleted file mode 100644 index 37d4a7a628..0000000000 --- a/changelog.d/8139.misc +++ /dev/null @@ -1 +0,0 @@ -Fix ktlint issue with fields and a new line. diff --git a/changelog.d/8142.bugfix b/changelog.d/8142.bugfix deleted file mode 100644 index 6e496f6c74..0000000000 --- a/changelog.d/8142.bugfix +++ /dev/null @@ -1 +0,0 @@ -Replace hardcoded colors by theming colors on send button. diff --git a/changelog.d/8150.bugfix b/changelog.d/8150.bugfix deleted file mode 100644 index 9c67b2ba37..0000000000 --- a/changelog.d/8150.bugfix +++ /dev/null @@ -1 +0,0 @@ -[Timeline]: Editing a reply from iOS breaks the "in reply to" rendering diff --git a/fastlane/metadata/android/en-US/changelogs/40105260.txt b/fastlane/metadata/android/en-US/changelogs/40105260.txt new file mode 100644 index 0000000000..df2e163506 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Main changes in this version: Mainly bugfixing. +Full changelog: https://github.com/vector-im/element-android/releases From f8449f956723ddd50d447628bac9a4f4f84622f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Feb 2023 23:16:01 +0000 Subject: [PATCH 062/153] Bump androidx.arch.core:core-testing from 2.1.0 to 2.2.0 Bumps androidx.arch.core:core-testing from 2.1.0 to 2.2.0. --- updated-dependencies: - dependency-name: androidx.arch.core:core-testing dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 7120789e10..3021c8560d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -70,7 +70,7 @@ ext.libs = [ 'datastore' : "androidx.datastore:datastore:1.0.0", 'datastorepreferences' : "androidx.datastore:datastore-preferences:1.0.0", 'pagingRuntimeKtx' : "androidx.paging:paging-runtime-ktx:2.1.2", - 'coreTesting' : "androidx.arch.core:core-testing:2.1.0", + 'coreTesting' : "androidx.arch.core:core-testing:2.2.0", 'testCore' : "androidx.test:core:$androidxTest", 'orchestrator' : "androidx.test:orchestrator:$androidxOrchestrator", 'testRunner' : "androidx.test:runner:$androidxTest", From 0d28b3a8600d3294a9e703b101343ee4dee776e8 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 17 Feb 2023 09:59:17 +0100 Subject: [PATCH 063/153] Handle errors when updating push rules --- .../src/main/res/values/strings.xml | 2 + .../preference/VectorCheckboxPreference.kt | 7 ++ .../ConfigureAndStartSessionUseCase.kt | 2 +- .../notifications/PushRuleDefinitions.kt | 3 +- ...torSettingsPushRuleNotificationFragment.kt | 44 +++++--- ...orSettingsPushRuleNotificationViewEvent.kt | 2 +- ...orSettingsPushRuleNotificationViewModel.kt | 48 +++++++-- ...orSettingsPushRuleNotificationViewState.kt | 1 + .../GetPushRulesOnInvalidStateUseCase.kt | 44 ++++++++ .../usecase/UpdatePushRulesIfNeededUseCase.kt | 18 ++-- .../vector_settings_notification_default.xml | 2 +- ...ttingsPushRuleNotificationViewModelTest.kt | 29 ++--- .../GetPushRulesOnInvalidStateUseCaseTest.kt | 100 ++++++++++++++++++ .../UpdatePushRulesIfNeededUseCaseTest.kt | 54 +++++----- .../app/test/fixtures/PushRuleFixture.kt | 49 +++++++++ 15 files changed, 325 insertions(+), 80 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCase.kt create mode 100644 vector/src/test/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCaseTest.kt create mode 100644 vector/src/test/java/im/vector/app/test/fixtures/PushRuleFixture.kt diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index e06355a173..2ee623cf88 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -862,6 +862,8 @@ Keywords cannot start with \'.\' Keywords cannot contain \'%s\' + An error occurred when updating your notification preferences. Please try again. + Troubleshoot Notifications Troubleshooting diagnostics Run Tests diff --git a/vector/src/main/java/im/vector/app/core/preference/VectorCheckboxPreference.kt b/vector/src/main/java/im/vector/app/core/preference/VectorCheckboxPreference.kt index 13b65e11b4..355bab8da8 100644 --- a/vector/src/main/java/im/vector/app/core/preference/VectorCheckboxPreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/VectorCheckboxPreference.kt @@ -32,6 +32,8 @@ class VectorCheckboxPreference : CheckBoxPreference { constructor(context: Context) : super(context) + var summaryTextColor: Int? = null + init { // Set to false to remove the space when there is no icon isIconSpaceReserved = true @@ -42,4 +44,9 @@ class VectorCheckboxPreference : CheckBoxPreference { (holder.findViewById(android.R.id.title) as? TextView)?.isSingleLine = false super.onBindViewHolder(holder) } + + override fun syncSummaryView(holder: PreferenceViewHolder) { + super.syncSummaryView(holder) + summaryTextColor?.let { (holder.findViewById(android.R.id.summary) as? TextView)?.setTextColor(it) } + } } diff --git a/vector/src/main/java/im/vector/app/core/session/ConfigureAndStartSessionUseCase.kt b/vector/src/main/java/im/vector/app/core/session/ConfigureAndStartSessionUseCase.kt index b9573e9292..8a9fc9729d 100644 --- a/vector/src/main/java/im/vector/app/core/session/ConfigureAndStartSessionUseCase.kt +++ b/vector/src/main/java/im/vector/app/core/session/ConfigureAndStartSessionUseCase.kt @@ -52,7 +52,7 @@ class ConfigureAndStartSessionUseCase @Inject constructor( updateMatrixClientInfoIfNeeded(session) createNotificationSettingsAccountDataIfNeeded(session) notificationsSettingUpdater.onSessionStarted(session) - pushRulesUpdater.onSessionStarted(session) +// pushRulesUpdater.onSessionStarted(session) } private fun updateMatrixClientInfoIfNeeded(session: Session) { diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/PushRuleDefinitions.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/PushRuleDefinitions.kt index fff6ffe933..9e19e2afb4 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/PushRuleDefinitions.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/PushRuleDefinitions.kt @@ -42,8 +42,7 @@ fun getStandardAction(ruleId: String, index: NotificationIndex): StandardActions RuleIds.RULE_ID_POLL_START_ONE_TO_ONE, RuleIds.RULE_ID_POLL_START_ONE_TO_ONE_UNSTABLE, RuleIds.RULE_ID_POLL_END_ONE_TO_ONE, - RuleIds.RULE_ID_POLL_END_ONE_TO_ONE_UNSTABLE, - -> + RuleIds.RULE_ID_POLL_END_ONE_TO_ONE_UNSTABLE -> when (index) { NotificationIndex.OFF -> StandardActions.DontNotify NotificationIndex.SILENT -> StandardActions.Notify diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationFragment.kt index 0f991867fe..8a2099ecad 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationFragment.kt @@ -21,33 +21,35 @@ import android.view.View import androidx.preference.Preference import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState +import im.vector.app.R import im.vector.app.core.preference.VectorCheckboxPreference import im.vector.app.features.settings.VectorSettingsBaseFragment +import im.vector.app.features.themes.ThemeUtils abstract class VectorSettingsPushRuleNotificationFragment : VectorSettingsBaseFragment() { - private val viewModel: VectorSettingsPushRuleNotificationViewModel by fragmentViewModel() + protected val viewModel: VectorSettingsPushRuleNotificationViewModel by fragmentViewModel() abstract val prefKeyToPushRuleId: Map override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) observeViewEvents() - viewModel.onEach(VectorSettingsPushRuleNotificationViewState::isLoading) { isLoading -> - if (isLoading) { - displayLoadingView() - } else { - hideLoadingView() - } - } + viewModel.onEach(VectorSettingsPushRuleNotificationViewState::isLoading) { updateLoadingView(it) } + viewModel.onEach(VectorSettingsPushRuleNotificationViewState::rulesOnError) { refreshErrors(it) } } private fun observeViewEvents() { viewModel.observeViewEvents { when (it) { - is VectorSettingsPushRuleNotificationViewEvent.Failure -> refreshDisplay() - is VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated -> updatePreference(it.ruleId, it.checked) + is VectorSettingsPushRuleNotificationViewEvent.Failure -> onFailure(it.ruleId) + is VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated -> { + updatePreference(it.ruleId, it.checked) + if (it.failure != null) { + onFailure(it.ruleId) + } + } } } } @@ -71,14 +73,28 @@ abstract class VectorSettingsPushRuleNotificationFragment : } } - override fun invalidate() = withState(viewModel) { state -> - if (state.isLoading) { + private fun updateLoadingView(isLoading: Boolean) { + if (isLoading) { displayLoadingView() } else { hideLoadingView() } } + private fun refreshErrors(rulesWithError: Set) { + if (withState(viewModel, VectorSettingsPushRuleNotificationViewState::isLoading)) return + prefKeyToPushRuleId.forEach { (preferenceKey, ruleId) -> + val preference = findPreference(preferenceKey)!! + if (ruleId in rulesWithError) { + preference.summaryTextColor = context?.let { ThemeUtils.getColor(it, R.attr.colorError) } + preference.setSummary(R.string.settings_notification_error_on_update) + } else { + preference.summaryTextColor = null + preference.summary = null + } + } + } + protected fun refreshDisplay() { listView?.adapter?.notifyDataSetChanged() } @@ -88,4 +104,8 @@ abstract class VectorSettingsPushRuleNotificationFragment : val preference = findPreference(preferenceKey) ?: return preference.isChecked = checked } + + protected open fun onFailure(ruleId: String) { + refreshDisplay() + } } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewEvent.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewEvent.kt index adfc17f827..490a28c0b0 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewEvent.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewEvent.kt @@ -33,5 +33,5 @@ sealed interface VectorSettingsPushRuleNotificationViewEvent : VectorViewEvents * * @property throwable the related exception, if any. */ - data class Failure(val throwable: Throwable?) : VectorSettingsPushRuleNotificationViewEvent + data class Failure(val ruleId: String, val throwable: Throwable?) : VectorSettingsPushRuleNotificationViewEvent } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModel.kt index 39969ec13e..eee199d550 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModel.kt @@ -26,13 +26,17 @@ import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.settings.notifications.VectorSettingsPushRuleNotificationViewEvent.Failure import im.vector.app.features.settings.notifications.VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated +import im.vector.app.features.settings.notifications.usecase.GetPushRulesOnInvalidStateUseCase import kotlinx.coroutines.launch import org.matrix.android.sdk.api.failure.Failure.ServerError import org.matrix.android.sdk.api.failure.MatrixError +import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes import org.matrix.android.sdk.api.session.pushrules.Action import org.matrix.android.sdk.api.session.pushrules.RuleIds import org.matrix.android.sdk.api.session.pushrules.RuleKind import org.matrix.android.sdk.api.session.pushrules.rest.PushRuleAndKind +import org.matrix.android.sdk.flow.flow +import org.matrix.android.sdk.flow.unwrap private typealias ViewModel = VectorSettingsPushRuleNotificationViewModel private typealias ViewState = VectorSettingsPushRuleNotificationViewState @@ -40,6 +44,7 @@ private typealias ViewState = VectorSettingsPushRuleNotificationViewState class VectorSettingsPushRuleNotificationViewModel @AssistedInject constructor( @Assisted initialState: ViewState, private val activeSessionHolder: ActiveSessionHolder, + private val getPushRulesOnInvalidStateUseCase: GetPushRulesOnInvalidStateUseCase, ) : VectorViewModel(initialState) { @@ -51,6 +56,17 @@ class VectorSettingsPushRuleNotificationViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() + init { + val session = activeSessionHolder.getSafeActiveSession() + session?.flow() + ?.liveUserAccountData(UserAccountDataTypes.TYPE_PUSH_RULES) + ?.unwrap() + ?.setOnEach { + val rulesOnError = getPushRulesOnInvalidStateUseCase.execute(session).map { it.ruleId }.toSet() + copy(rulesOnError = rulesOnError) + } + } + override fun handle(action: VectorSettingsPushRuleNotificationViewAction) { when (action) { is VectorSettingsPushRuleNotificationViewAction.UpdatePushRule -> handleUpdatePushRule(action.pushRuleAndKind, action.checked) @@ -73,6 +89,7 @@ class VectorSettingsPushRuleNotificationViewModel @AssistedInject constructor( val standardAction = getStandardAction(ruleId, newIndex) ?: return val enabled = standardAction != StandardActions.Disabled val newActions = standardAction.actions + setState { copy(isLoading = true) } viewModelScope.launch { @@ -82,22 +99,31 @@ class VectorSettingsPushRuleNotificationViewModel @AssistedInject constructor( updatePushRule(kind, ruleId, enabled, newActions) } } - setState { copy(isLoading = false) } - val failure = results.firstNotNullOfOrNull { result -> + + val failures = results.mapNotNull { result -> // If the failure is a rule not found error, do not consider it result.exceptionOrNull()?.takeUnless { it is ServerError && it.error.code == MatrixError.M_NOT_FOUND } } - val newChecked = if (checked) { - // If any rule is checked, the global rule is checked - results.any { it.isSuccess } + val hasSuccess = results.any { it.isSuccess } + val hasFailures = failures.isNotEmpty() + + // Any rule has been checked or some rules have not been unchecked + val newChecked = (checked && hasSuccess) || (!checked && hasFailures) + if (hasSuccess) { + _viewEvents.post(PushRuleUpdated(ruleId, newChecked, failures.firstOrNull())) } else { - // If any rule has not been unchecked, the global rule remains checked - failure != null + _viewEvents.post(Failure(ruleId, failures.firstOrNull())) } - if (results.any { it.isSuccess }) { - _viewEvents.post(PushRuleUpdated(ruleId, newChecked, failure)) - } else { - _viewEvents.post(Failure(failure)) + + setState { + copy( + isLoading = false, + rulesOnError = when { + hasSuccess && hasFailures -> rulesOnError.plus(ruleId) // some failed + hasSuccess -> rulesOnError.minus(ruleId) // all succeed + else -> rulesOnError // all failed + } + ) } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewState.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewState.kt index 477727aee6..392a8f3bb5 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewState.kt @@ -20,4 +20,5 @@ import com.airbnb.mvrx.MavericksState data class VectorSettingsPushRuleNotificationViewState( val isLoading: Boolean = false, + val rulesOnError: Set = emptySet() ) : MavericksState diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCase.kt new file mode 100644 index 0000000000..225be1ee62 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCase.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.notifications.usecase + +import org.matrix.android.sdk.api.extensions.orTrue +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.pushrules.RuleIds +import org.matrix.android.sdk.api.session.pushrules.getActions +import org.matrix.android.sdk.api.session.pushrules.getParentRule +import org.matrix.android.sdk.api.session.pushrules.getSyncedRules +import org.matrix.android.sdk.api.session.pushrules.rest.PushRule +import javax.inject.Inject + +class GetPushRulesOnInvalidStateUseCase @Inject constructor() { + + fun execute(session: Session): List { + val allRules = session.pushRuleService().getPushRules().getAllRules() + return allRules.filter { it.isOnInvalidState(allRules) } + } + + private fun PushRule.isOnInvalidState(allRules: List): Boolean { + val parent = RuleIds.getParentRule(ruleId)?.let { parentId -> allRules.find { it.ruleId == parentId } } + val children = RuleIds.getSyncedRules(ruleId).mapNotNull { childId -> allRules.find { it.ruleId == childId } } + val isAlignedWithParent = parent?.let { isAlignedWithParentRule(it) }.orTrue() + return !isAlignedWithParent || !isAlignedWithChildrenRules(children) + } + + private fun PushRule.isAlignedWithParentRule(parent: PushRule) = this.getActions() == parent.getActions() && this.enabled == parent.enabled + private fun PushRule.isAlignedWithChildrenRules(children: List) = children.all { it.isAlignedWithParentRule(this) } +} diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/UpdatePushRulesIfNeededUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/UpdatePushRulesIfNeededUseCase.kt index 6998065f01..12fc3d480d 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/UpdatePushRulesIfNeededUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/UpdatePushRulesIfNeededUseCase.kt @@ -24,18 +24,18 @@ import org.matrix.android.sdk.api.session.pushrules.rest.PushRule import org.matrix.android.sdk.api.session.pushrules.rest.PushRuleAndKind import javax.inject.Inject -class UpdatePushRulesIfNeededUseCase @Inject constructor() { +class UpdatePushRulesIfNeededUseCase @Inject constructor( + private val getPushRulesOnInvalidStateUseCase: GetPushRulesOnInvalidStateUseCase, +) { suspend fun execute(session: Session) { + val rulesOnError = getPushRulesOnInvalidStateUseCase.execute(session).takeUnless { it.isEmpty() } ?: return + val ruleSet = session.pushRuleService().getPushRules() - val pushRules = ruleSet.getAllRules() - val rulesToUpdate = pushRules.mapNotNull { rule -> - val parent = RuleIds.getParentRule(rule.ruleId)?.let { ruleId -> ruleSet.findDefaultRule(ruleId) } - if (parent != null && (rule.enabled != parent.pushRule.enabled || rule.actions != parent.pushRule.actions)) { - PushRuleWithParent(rule, parent) - } else { - null - } + val rulesToUpdate = rulesOnError.mapNotNull { rule -> + RuleIds.getParentRule(rule.ruleId) + ?.let { ruleId -> ruleSet.findDefaultRule(ruleId) } + ?.let { PushRuleWithParent(rule, it) } } rulesToUpdate.forEach { diff --git a/vector/src/main/res/xml/vector_settings_notification_default.xml b/vector/src/main/res/xml/vector_settings_notification_default.xml index fb565d2230..9319ef2b39 100644 --- a/vector/src/main/res/xml/vector_settings_notification_default.xml +++ b/vector/src/main/res/xml/vector_settings_notification_default.xml @@ -25,4 +25,4 @@ android:title="@string/settings_encrypted_group_messages" /> - \ No newline at end of file + diff --git a/vector/src/test/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModelTest.kt index 04a22bc21f..7994d173b6 100644 --- a/vector/src/test/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModelTest.kt @@ -17,7 +17,9 @@ package im.vector.app.features.settings.notifications import com.airbnb.mvrx.test.MavericksTestRule +import im.vector.app.features.settings.notifications.usecase.GetPushRulesOnInvalidStateUseCase import im.vector.app.test.fakes.FakeActiveSessionHolder +import im.vector.app.test.fixtures.PushRuleFixture import im.vector.app.test.test import im.vector.app.test.testDispatcher import io.mockk.coVerifyOrder @@ -41,16 +43,19 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { private val fakeActiveSessionHolder = FakeActiveSessionHolder() private val fakePushRuleService = fakeActiveSessionHolder.fakeSession.fakePushRuleService + private val fakeGetPushRulesOnInvalidStateUseCase = mockk() private val initialState = VectorSettingsPushRuleNotificationViewState() private fun createViewModel() = VectorSettingsPushRuleNotificationViewModel( initialState = initialState, activeSessionHolder = fakeActiveSessionHolder.instance, + fakeGetPushRulesOnInvalidStateUseCase, ) @Before fun setup() { mockkStatic("im.vector.app.features.settings.notifications.NotificationIndexKt") + every { fakeGetPushRulesOnInvalidStateUseCase.execute(any()) } returns emptyList() } @After @@ -98,8 +103,8 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { { copy(isLoading = false) }, ) .assertEvents( - VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated(RuleIds.RULE_ID_ONE_TO_ONE_ROOM, true), - VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated(RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS, false), + VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated(firstRuleId, true), + VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated(secondRuleId, false), ) .finish() } @@ -149,13 +154,13 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { .assertStatesChanges( initialState, { copy(isLoading = true) }, - { copy(isLoading = false) }, + { copy(isLoading = false, setOf(firstRuleId)) }, { copy(isLoading = true) }, { copy(isLoading = false) }, ) .assertEvents( - VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated(RuleIds.RULE_ID_ONE_TO_ONE_ROOM, true, failure), - VectorSettingsPushRuleNotificationViewEvent.Failure(failure), + VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated(firstRuleId, true, failure), + VectorSettingsPushRuleNotificationViewEvent.Failure(secondRuleId, failure), ) .finish() } @@ -205,14 +210,14 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { .assertStatesChanges( initialState, { copy(isLoading = true) }, - { copy(isLoading = false) }, + { copy(isLoading = false, rulesOnError = setOf(firstRuleId)) }, { copy(isLoading = true) }, { copy(isLoading = false) }, ) .assertEvents( // The global rule remains checked if all the rules are not unchecked - VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated(RuleIds.RULE_ID_ONE_TO_ONE_ROOM, true, failure), - VectorSettingsPushRuleNotificationViewEvent.Failure(failure), + VectorSettingsPushRuleNotificationViewEvent.PushRuleUpdated(firstRuleId, true, failure), + VectorSettingsPushRuleNotificationViewEvent.Failure(secondRuleId, failure), ) .finish() } @@ -245,11 +250,9 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { } private fun givenARuleId(ruleId: String, notificationIndex: NotificationIndex = NotificationIndex.NOISY): PushRuleAndKind { - val ruleAndKind = mockk { - every { pushRule.ruleId } returns ruleId - every { pushRule.notificationIndex } returns notificationIndex - every { kind } returns mockk() - } + val pushRule = PushRuleFixture.aPushRule(ruleId) + every { pushRule.notificationIndex } returns notificationIndex + val ruleAndKind = PushRuleFixture.aPushRuleAndKind(pushRule) every { fakePushRuleService.getPushRules().findDefaultRule(ruleId) } returns ruleAndKind diff --git a/vector/src/test/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCaseTest.kt new file mode 100644 index 0000000000..a434ac93d3 --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCaseTest.kt @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.notifications.usecase + +import im.vector.app.test.fakes.FakeSession +import im.vector.app.test.fixtures.PushRuleFixture +import io.mockk.every +import io.mockk.mockkStatic +import io.mockk.unmockkAll +import org.amshove.kluent.shouldBeEqualTo +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.matrix.android.sdk.api.session.pushrules.Action +import org.matrix.android.sdk.api.session.pushrules.RuleIds +import org.matrix.android.sdk.api.session.pushrules.rest.PushRule + +internal class GetPushRulesOnInvalidStateUseCaseTest { + + private val fakeSession = FakeSession() + private val getPushRulesOnInvalidStateUseCase = GetPushRulesOnInvalidStateUseCase() + + @Before + fun setup() { + mockkStatic("org.matrix.android.sdk.api.session.pushrules.ActionKt") + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun `given a list of push rules with children not matching their parent when execute then returns the list of not matching rules`() { + // Given + val firstActions = listOf(Action.Notify) + val secondActions = listOf(Action.DoNotNotify) + givenARuleList( + listOf( + // first set of related rules + givenARuleId(RuleIds.RULE_ID_ONE_TO_ONE_ROOM, true, firstActions), + givenARuleId(RuleIds.RULE_ID_POLL_START_ONE_TO_ONE, true, listOf(Action.DoNotNotify)), // diff + givenARuleId(RuleIds.RULE_ID_POLL_START_ONE_TO_ONE_UNSTABLE, true, emptyList()), // diff + givenARuleId(RuleIds.RULE_ID_POLL_END_ONE_TO_ONE, false, listOf(Action.Notify)), // diff + givenARuleId(RuleIds.RULE_ID_POLL_END_ONE_TO_ONE_UNSTABLE, true, listOf(Action.Notify)), + // second set of related rules + givenARuleId(RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS, false, secondActions), + givenARuleId(RuleIds.RULE_ID_POLL_START, true, listOf(Action.Notify)), // diff + givenARuleId(RuleIds.RULE_ID_POLL_START_UNSTABLE, false, listOf(Action.DoNotNotify)), + givenARuleId(RuleIds.RULE_ID_POLL_END, false, listOf(Action.Notify)), // diff + givenARuleId(RuleIds.RULE_ID_POLL_END_UNSTABLE, true, listOf()), // diff + // Another rule + givenARuleId(RuleIds.RULE_ID_CONTAIN_USER_NAME, true, listOf(Action.Notify)), + ) + ) + + // When + val result = getPushRulesOnInvalidStateUseCase.execute(fakeSession).map { it.ruleId } + + // Then + result shouldBeEqualTo listOf( + RuleIds.RULE_ID_ONE_TO_ONE_ROOM, // parent rule + RuleIds.RULE_ID_POLL_START_ONE_TO_ONE, + RuleIds.RULE_ID_POLL_START_ONE_TO_ONE_UNSTABLE, + RuleIds.RULE_ID_POLL_END_ONE_TO_ONE, + RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS, // parent rule + RuleIds.RULE_ID_POLL_START, + RuleIds.RULE_ID_POLL_END, + RuleIds.RULE_ID_POLL_END_UNSTABLE, + ) + } + + private fun givenARuleList(rules: List) { + every { fakeSession.fakePushRuleService.getPushRules().getAllRules() } returns rules + } + + private fun givenARuleId(ruleId: String, enabled: Boolean, actions: List): PushRule { + val ruleAndKind = PushRuleFixture.aPushRuleAndKind( + PushRuleFixture.aPushRule(ruleId, enabled, actions), + ) + + every { fakeSession.fakePushRuleService.getPushRules().findDefaultRule(ruleId) } returns ruleAndKind + + return ruleAndKind.pushRule + } +} diff --git a/vector/src/test/java/im/vector/app/features/settings/notifications/usecase/UpdatePushRulesIfNeededUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/notifications/usecase/UpdatePushRulesIfNeededUseCaseTest.kt index 7dcbe68d4b..1f76a7f9a5 100644 --- a/vector/src/test/java/im/vector/app/features/settings/notifications/usecase/UpdatePushRulesIfNeededUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/notifications/usecase/UpdatePushRulesIfNeededUseCaseTest.kt @@ -17,6 +17,7 @@ package im.vector.app.features.settings.notifications.usecase import im.vector.app.test.fakes.FakeSession +import im.vector.app.test.fixtures.PushRuleFixture import io.mockk.coVerifySequence import io.mockk.every import io.mockk.mockk @@ -28,14 +29,13 @@ import org.junit.Before import org.junit.Test import org.matrix.android.sdk.api.session.pushrules.Action import org.matrix.android.sdk.api.session.pushrules.RuleIds -import org.matrix.android.sdk.api.session.pushrules.getActions import org.matrix.android.sdk.api.session.pushrules.rest.PushRule -import org.matrix.android.sdk.api.session.pushrules.rest.PushRuleAndKind internal class UpdatePushRulesIfNeededUseCaseTest { private val fakeSession = FakeSession() - private val updatePushRulesIfNeededUseCase = UpdatePushRulesIfNeededUseCase() + private val fakeGetPushRulesOnInvalidStateUseCase = mockk() + private val updatePushRulesIfNeededUseCase = UpdatePushRulesIfNeededUseCase(fakeGetPushRulesOnInvalidStateUseCase) @Before fun setup() { @@ -50,25 +50,26 @@ internal class UpdatePushRulesIfNeededUseCaseTest { @Test fun test() = runTest { // Given - val firstActions = listOf(Action.Notify) - val secondActions = listOf(Action.DoNotNotify) - val rules = listOf( + val firstParentEnabled = true + val firstParentActions = listOf(Action.Notify) + val firstParent = givenARuleId(RuleIds.RULE_ID_ONE_TO_ONE_ROOM, firstParentEnabled, firstParentActions) + val secondParentEnabled = false + val secondParentActions = listOf(Action.DoNotNotify) + val secondParent = givenARuleId(RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS, secondParentEnabled, secondParentActions) + val rulesOnError = listOf( // first set of related rules - givenARuleId(RuleIds.RULE_ID_ONE_TO_ONE_ROOM, true, firstActions), + firstParent, givenARuleId(RuleIds.RULE_ID_POLL_START_ONE_TO_ONE, true, listOf(Action.DoNotNotify)), // diff givenARuleId(RuleIds.RULE_ID_POLL_START_ONE_TO_ONE_UNSTABLE, true, emptyList()), // diff givenARuleId(RuleIds.RULE_ID_POLL_END_ONE_TO_ONE, false, listOf(Action.Notify)), // diff - givenARuleId(RuleIds.RULE_ID_POLL_END_ONE_TO_ONE_UNSTABLE, true, listOf(Action.Notify)), // second set of related rules - givenARuleId(RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS, false, secondActions), + secondParent, givenARuleId(RuleIds.RULE_ID_POLL_START, true, listOf(Action.Notify)), // diff - givenARuleId(RuleIds.RULE_ID_POLL_START_UNSTABLE, false, listOf(Action.DoNotNotify)), givenARuleId(RuleIds.RULE_ID_POLL_END, false, listOf(Action.Notify)), // diff givenARuleId(RuleIds.RULE_ID_POLL_END_UNSTABLE, true, listOf()), // diff - // Another rule - givenARuleId(RuleIds.RULE_ID_CONTAIN_USER_NAME, true, listOf(Action.Notify)), ) - every { fakeSession.fakePushRuleService.getPushRules().getAllRules() } returns rules + every { fakeGetPushRulesOnInvalidStateUseCase.execute(fakeSession) } returns rulesOnError + every { fakeSession.fakePushRuleService.getPushRules().getAllRules() } returns rulesOnError // When updatePushRulesIfNeededUseCase.execute(fakeSession) @@ -77,30 +78,23 @@ internal class UpdatePushRulesIfNeededUseCaseTest { coVerifySequence { fakeSession.fakePushRuleService.getPushRules() // first set - fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_START_ONE_TO_ONE, true, firstActions) - fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_START_ONE_TO_ONE_UNSTABLE, true, firstActions) - fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_END_ONE_TO_ONE, true, firstActions) + fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_START_ONE_TO_ONE, firstParentEnabled, firstParentActions) + fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_START_ONE_TO_ONE_UNSTABLE, firstParentEnabled, firstParentActions) + fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_END_ONE_TO_ONE, firstParentEnabled, firstParentActions) // second set - fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_START, false, secondActions) - fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_END, false, secondActions) - fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_END_UNSTABLE, false, secondActions) + fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_START, secondParentEnabled, secondParentActions) + fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_END, secondParentEnabled, secondParentActions) + fakeSession.fakePushRuleService.updatePushRuleActions(any(), RuleIds.RULE_ID_POLL_END_UNSTABLE, secondParentEnabled, secondParentActions) } } private fun givenARuleId(ruleId: String, enabled: Boolean, actions: List): PushRule { - val pushRule = mockk { - every { this@mockk.ruleId } returns ruleId - every { this@mockk.enabled } returns enabled - every { this@mockk.actions } returns actions - every { getActions() } returns actions - } - val ruleAndKind = mockk { - every { this@mockk.pushRule } returns pushRule - every { kind } returns mockk() - } + val ruleAndKind = PushRuleFixture.aPushRuleAndKind( + pushRule = PushRuleFixture.aPushRule(ruleId, enabled, actions), + ) every { fakeSession.fakePushRuleService.getPushRules().findDefaultRule(ruleId) } returns ruleAndKind - return pushRule + return ruleAndKind.pushRule } } diff --git a/vector/src/test/java/im/vector/app/test/fixtures/PushRuleFixture.kt b/vector/src/test/java/im/vector/app/test/fixtures/PushRuleFixture.kt new file mode 100644 index 0000000000..2170d60228 --- /dev/null +++ b/vector/src/test/java/im/vector/app/test/fixtures/PushRuleFixture.kt @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.test.fixtures + +import io.mockk.every +import io.mockk.mockk +import org.matrix.android.sdk.api.session.pushrules.Action +import org.matrix.android.sdk.api.session.pushrules.RuleSetKey +import org.matrix.android.sdk.api.session.pushrules.getActions +import org.matrix.android.sdk.api.session.pushrules.rest.PushRule +import org.matrix.android.sdk.api.session.pushrules.rest.PushRuleAndKind + +object PushRuleFixture { + + private const val A_RULE_ID = "a-rule-id" + + // Needs: mockkStatic("org.matrix.android.sdk.api.session.pushrules.ActionKt") + fun aPushRule( + ruleId: String = A_RULE_ID, + enabled: Boolean = true, + actions: List = listOf(Action.Notify), + ): PushRule = mockk { + every { this@mockk.ruleId } returns ruleId + every { this@mockk.enabled } returns enabled + every { getActions() } returns actions + } + + fun aPushRuleAndKind( + pushRule: PushRule = aPushRule(), + kind: RuleSetKey = RuleSetKey.UNDERRIDE, + ): PushRuleAndKind = mockk { + every { this@mockk.pushRule } returns pushRule + every { this@mockk.kind } returns kind + } +} From 552c6fbbd35ca9a4042c892e5645fecb744e57b4 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 17 Feb 2023 10:34:18 +0100 Subject: [PATCH 064/153] Changelog --- changelog.d/8141.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8141.feature diff --git a/changelog.d/8141.feature b/changelog.d/8141.feature new file mode 100644 index 0000000000..8c03af1150 --- /dev/null +++ b/changelog.d/8141.feature @@ -0,0 +1 @@ +[Poll] Error handling for push rules synchronization From 84ccd30ab753f767bc3b230ed226b6043141d585 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 17 Feb 2023 10:57:27 +0100 Subject: [PATCH 065/153] Fix wrong import --- .../usecase/GetPushRulesOnInvalidStateUseCase.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCase.kt index 225be1ee62..9b131f9a40 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/usecase/GetPushRulesOnInvalidStateUseCase.kt @@ -16,12 +16,12 @@ package im.vector.app.features.settings.notifications.usecase +import im.vector.app.features.settings.notifications.getParentRule +import im.vector.app.features.settings.notifications.getSyncedRules import org.matrix.android.sdk.api.extensions.orTrue import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.pushrules.RuleIds import org.matrix.android.sdk.api.session.pushrules.getActions -import org.matrix.android.sdk.api.session.pushrules.getParentRule -import org.matrix.android.sdk.api.session.pushrules.getSyncedRules import org.matrix.android.sdk.api.session.pushrules.rest.PushRule import javax.inject.Inject From 8f56f9de469884fb29fb866dc8c1d0a542017d86 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 17 Feb 2023 12:22:02 +0100 Subject: [PATCH 066/153] update doc --- .../notifications/VectorSettingsPushRuleNotificationViewEvent.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewEvent.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewEvent.kt index 490a28c0b0..42cb923a5e 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewEvent.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewEvent.kt @@ -31,6 +31,7 @@ sealed interface VectorSettingsPushRuleNotificationViewEvent : VectorViewEvents /** * A failure has occurred. * + * @property ruleId the global rule id related to the failure. * @property throwable the related exception, if any. */ data class Failure(val ruleId: String, val throwable: Throwable?) : VectorSettingsPushRuleNotificationViewEvent From 13866c62bf48386ef40ebf3acb7e7fb399540223 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 17 Feb 2023 17:38:47 +0100 Subject: [PATCH 067/153] Refresh push rules settings on account data changes --- ...torSettingsPushRuleNotificationFragment.kt | 39 ++++++++++--------- ...rSettingsPushRuleNotificationViewAction.kt | 3 +- ...orSettingsPushRuleNotificationViewModel.kt | 30 +++++++------- ...orSettingsPushRuleNotificationViewState.kt | 4 +- 4 files changed, 40 insertions(+), 36 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationFragment.kt index 8a2099ecad..b7264f6cb3 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationFragment.kt @@ -36,6 +36,7 @@ abstract class VectorSettingsPushRuleNotificationFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) observeViewEvents() + viewModel.onEach(VectorSettingsPushRuleNotificationViewState::allRules) { refreshPreferences() } viewModel.onEach(VectorSettingsPushRuleNotificationViewState::isLoading) { updateLoadingView(it) } viewModel.onEach(VectorSettingsPushRuleNotificationViewState::rulesOnError) { refreshErrors(it) } } @@ -55,18 +56,11 @@ abstract class VectorSettingsPushRuleNotificationFragment : } override fun bindPref() { - for (preferenceKey in prefKeyToPushRuleId.keys) { - val preference = findPreference(preferenceKey)!! - preference.isIconSpaceReserved = false - val ruleAndKind = prefKeyToPushRuleId[preferenceKey]?.let { viewModel.getPushRuleAndKind(it) } - if (ruleAndKind == null) { - // The rule is not defined, hide the preference - preference.isVisible = false - } else { - preference.isVisible = true - updatePreference(ruleAndKind.pushRule.ruleId, viewModel.isPushRuleChecked(ruleAndKind.pushRule.ruleId)) - preference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> - viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(ruleAndKind, newValue as Boolean)) + prefKeyToPushRuleId.forEach { (preferenceKey, ruleId) -> + findPreference(preferenceKey)?.apply { + isIconSpaceReserved = false + onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(ruleId, newValue as Boolean)) false } } @@ -81,16 +75,21 @@ abstract class VectorSettingsPushRuleNotificationFragment : } } + private fun refreshPreferences() { + prefKeyToPushRuleId.values.forEach { ruleId -> updatePreference(ruleId, viewModel.isPushRuleChecked(ruleId)) } + } + private fun refreshErrors(rulesWithError: Set) { if (withState(viewModel, VectorSettingsPushRuleNotificationViewState::isLoading)) return prefKeyToPushRuleId.forEach { (preferenceKey, ruleId) -> - val preference = findPreference(preferenceKey)!! - if (ruleId in rulesWithError) { - preference.summaryTextColor = context?.let { ThemeUtils.getColor(it, R.attr.colorError) } - preference.setSummary(R.string.settings_notification_error_on_update) - } else { - preference.summaryTextColor = null - preference.summary = null + findPreference(preferenceKey)?.apply { + if (ruleId in rulesWithError) { + summaryTextColor = ThemeUtils.getColor(context, R.attr.colorError) + setSummary(R.string.settings_notification_error_on_update) + } else { + summaryTextColor = null + summary = null + } } } } @@ -102,6 +101,8 @@ abstract class VectorSettingsPushRuleNotificationFragment : private fun updatePreference(ruleId: String, checked: Boolean) { val preferenceKey = prefKeyToPushRuleId.entries.find { it.value == ruleId }?.key ?: return val preference = findPreference(preferenceKey) ?: return + val ruleIds = withState(viewModel) { state -> state.allRules.map { it.ruleId } } + preference.isVisible = ruleId in ruleIds preference.isChecked = checked } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewAction.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewAction.kt index 61bf7c5b15..94b7666122 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewAction.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewAction.kt @@ -17,8 +17,7 @@ package im.vector.app.features.settings.notifications import im.vector.app.core.platform.VectorViewModelAction -import org.matrix.android.sdk.api.session.pushrules.rest.PushRuleAndKind sealed interface VectorSettingsPushRuleNotificationViewAction : VectorViewModelAction { - data class UpdatePushRule(val pushRuleAndKind: PushRuleAndKind, val checked: Boolean) : VectorSettingsPushRuleNotificationViewAction + data class UpdatePushRule(val ruleId: String, val checked: Boolean) : VectorSettingsPushRuleNotificationViewAction } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModel.kt index eee199d550..31f7f9c531 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModel.kt @@ -20,7 +20,6 @@ import com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel @@ -30,6 +29,7 @@ import im.vector.app.features.settings.notifications.usecase.GetPushRulesOnInval import kotlinx.coroutines.launch import org.matrix.android.sdk.api.failure.Failure.ServerError import org.matrix.android.sdk.api.failure.MatrixError +import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes import org.matrix.android.sdk.api.session.pushrules.Action import org.matrix.android.sdk.api.session.pushrules.RuleIds @@ -43,7 +43,7 @@ private typealias ViewState = VectorSettingsPushRuleNotificationViewState class VectorSettingsPushRuleNotificationViewModel @AssistedInject constructor( @Assisted initialState: ViewState, - private val activeSessionHolder: ActiveSessionHolder, + private val session: Session, private val getPushRulesOnInvalidStateUseCase: GetPushRulesOnInvalidStateUseCase, ) : VectorViewModel by hiltMavericksViewModelFactory() init { - val session = activeSessionHolder.getSafeActiveSession() - session?.flow() - ?.liveUserAccountData(UserAccountDataTypes.TYPE_PUSH_RULES) - ?.unwrap() - ?.setOnEach { + session.flow() + .liveUserAccountData(UserAccountDataTypes.TYPE_PUSH_RULES) + .unwrap() + .setOnEach { + val allRules = session.pushRuleService().getPushRules().getAllRules() val rulesOnError = getPushRulesOnInvalidStateUseCase.execute(session).map { it.ruleId }.toSet() - copy(rulesOnError = rulesOnError) + copy( + allRules = allRules, + rulesOnError = rulesOnError + ) } } override fun handle(action: VectorSettingsPushRuleNotificationViewAction) { when (action) { - is VectorSettingsPushRuleNotificationViewAction.UpdatePushRule -> handleUpdatePushRule(action.pushRuleAndKind, action.checked) + is VectorSettingsPushRuleNotificationViewAction.UpdatePushRule -> handleUpdatePushRule(action.ruleId, action.checked) } } fun getPushRuleAndKind(ruleId: String): PushRuleAndKind? { - return activeSessionHolder.getSafeActiveSession()?.pushRuleService()?.getPushRules()?.findDefaultRule(ruleId) + return session.pushRuleService().getPushRules().findDefaultRule(ruleId) } fun isPushRuleChecked(ruleId: String): Boolean { @@ -82,9 +85,8 @@ class VectorSettingsPushRuleNotificationViewModel @AssistedInject constructor( return rulesGroup.mapNotNull { getPushRuleAndKind(it) }.any { it.pushRule.notificationIndex != NotificationIndex.OFF } } - private fun handleUpdatePushRule(pushRuleAndKind: PushRuleAndKind, checked: Boolean) { - val ruleId = pushRuleAndKind.pushRule.ruleId - val kind = pushRuleAndKind.kind + private fun handleUpdatePushRule(ruleId: String, checked: Boolean) { + val kind = getPushRuleAndKind(ruleId)?.kind ?: return val newIndex = if (checked) NotificationIndex.NOISY else NotificationIndex.OFF val standardAction = getStandardAction(ruleId, newIndex) ?: return val enabled = standardAction != StandardActions.Disabled @@ -129,7 +131,7 @@ class VectorSettingsPushRuleNotificationViewModel @AssistedInject constructor( } private suspend fun updatePushRule(kind: RuleKind, ruleId: String, enable: Boolean, newActions: List?) { - activeSessionHolder.getSafeActiveSession()?.pushRuleService()?.updatePushRuleActions( + session.pushRuleService().updatePushRuleActions( kind = kind, ruleId = ruleId, enable = enable, diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewState.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewState.kt index 392a8f3bb5..091c183d49 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewState.kt @@ -17,8 +17,10 @@ package im.vector.app.features.settings.notifications import com.airbnb.mvrx.MavericksState +import org.matrix.android.sdk.api.session.pushrules.rest.PushRule data class VectorSettingsPushRuleNotificationViewState( val isLoading: Boolean = false, - val rulesOnError: Set = emptySet() + val allRules: List = emptyList(), + val rulesOnError: Set = emptySet(), ) : MavericksState From cd648a0b50d472c7705530a7724581b4e0fa63d1 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Mon, 20 Feb 2023 14:02:28 +0100 Subject: [PATCH 068/153] Fix unit tests --- ...ttingsPushRuleNotificationViewModelTest.kt | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/vector/src/test/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModelTest.kt index 7994d173b6..8a45f922e7 100644 --- a/vector/src/test/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationViewModelTest.kt @@ -18,7 +18,7 @@ package im.vector.app.features.settings.notifications import com.airbnb.mvrx.test.MavericksTestRule import im.vector.app.features.settings.notifications.usecase.GetPushRulesOnInvalidStateUseCase -import im.vector.app.test.fakes.FakeActiveSessionHolder +import im.vector.app.test.fakes.FakeSession import im.vector.app.test.fixtures.PushRuleFixture import im.vector.app.test.test import im.vector.app.test.testDispatcher @@ -34,21 +34,20 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.matrix.android.sdk.api.session.pushrules.RuleIds -import org.matrix.android.sdk.api.session.pushrules.rest.PushRuleAndKind internal class VectorSettingsPushRuleNotificationViewModelTest { @get:Rule val mavericksTestRule = MavericksTestRule(testDispatcher = testDispatcher) - private val fakeActiveSessionHolder = FakeActiveSessionHolder() - private val fakePushRuleService = fakeActiveSessionHolder.fakeSession.fakePushRuleService + private val fakeSession = FakeSession() + private val fakePushRuleService = fakeSession.fakePushRuleService private val fakeGetPushRulesOnInvalidStateUseCase = mockk() private val initialState = VectorSettingsPushRuleNotificationViewState() private fun createViewModel() = VectorSettingsPushRuleNotificationViewModel( initialState = initialState, - activeSessionHolder = fakeActiveSessionHolder.instance, + session = fakeSession, fakeGetPushRulesOnInvalidStateUseCase, ) @@ -70,12 +69,14 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { val firstRuleId = RuleIds.RULE_ID_ONE_TO_ONE_ROOM val secondRuleId = RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS + givenARuleId(firstRuleId) + givenARuleId(secondRuleId) fakePushRuleService.givenUpdatePushRuleActionsSucceed() // When val viewModelTest = viewModel.test() - viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(givenARuleId(firstRuleId), true)) - viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(givenARuleId(secondRuleId), false)) + viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(firstRuleId, true)) + viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(secondRuleId, false)) // Then coVerifyOrder { @@ -116,10 +117,12 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { val failure = mockk() val firstRuleId = RuleIds.RULE_ID_ONE_TO_ONE_ROOM + givenARuleId(firstRuleId) fakePushRuleService.givenUpdatePushRuleActionsSucceed() fakePushRuleService.givenUpdatePushRuleActionsFail(RuleIds.RULE_ID_POLL_START_ONE_TO_ONE_UNSTABLE, failure) val secondRuleId = RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS + givenARuleId(secondRuleId) fakePushRuleService.givenUpdatePushRuleActionsFail(secondRuleId, failure) fakePushRuleService.givenUpdatePushRuleActionsFail(RuleIds.RULE_ID_POLL_START, failure) fakePushRuleService.givenUpdatePushRuleActionsFail(RuleIds.RULE_ID_POLL_START_UNSTABLE, failure) @@ -129,9 +132,9 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { // When val viewModelTest = viewModel.test() // One rule failed to update - viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(givenARuleId(firstRuleId), true)) + viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(firstRuleId, true)) // All the rules failed to update - viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(givenARuleId(secondRuleId), true)) + viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(secondRuleId, true)) // Then coVerifyOrder { @@ -154,7 +157,7 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { .assertStatesChanges( initialState, { copy(isLoading = true) }, - { copy(isLoading = false, setOf(firstRuleId)) }, + { copy(isLoading = false, rulesOnError = setOf(firstRuleId)) }, { copy(isLoading = true) }, { copy(isLoading = false) }, ) @@ -172,10 +175,12 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { val failure = mockk() val firstRuleId = RuleIds.RULE_ID_ONE_TO_ONE_ROOM + givenARuleId(firstRuleId) fakePushRuleService.givenUpdatePushRuleActionsSucceed() fakePushRuleService.givenUpdatePushRuleActionsFail(RuleIds.RULE_ID_POLL_START_ONE_TO_ONE_UNSTABLE, failure) val secondRuleId = RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS + givenARuleId(secondRuleId) fakePushRuleService.givenUpdatePushRuleActionsFail(secondRuleId, failure) fakePushRuleService.givenUpdatePushRuleActionsFail(RuleIds.RULE_ID_POLL_START, failure) fakePushRuleService.givenUpdatePushRuleActionsFail(RuleIds.RULE_ID_POLL_START_UNSTABLE, failure) @@ -185,9 +190,9 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { // When val viewModelTest = viewModel.test() // One rule failed to update - viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(givenARuleId(firstRuleId), false)) + viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(firstRuleId, false)) // All the rules failed to update - viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(givenARuleId(secondRuleId), false)) + viewModel.handle(VectorSettingsPushRuleNotificationViewAction.UpdatePushRule(secondRuleId, false)) // Then coVerifyOrder { @@ -249,13 +254,11 @@ internal class VectorSettingsPushRuleNotificationViewModelTest { secondResult shouldBe false } - private fun givenARuleId(ruleId: String, notificationIndex: NotificationIndex = NotificationIndex.NOISY): PushRuleAndKind { + private fun givenARuleId(ruleId: String, notificationIndex: NotificationIndex = NotificationIndex.NOISY) { val pushRule = PushRuleFixture.aPushRule(ruleId) every { pushRule.notificationIndex } returns notificationIndex val ruleAndKind = PushRuleFixture.aPushRuleAndKind(pushRule) every { fakePushRuleService.getPushRules().findDefaultRule(ruleId) } returns ruleAndKind - - return ruleAndKind } } From 021babc9b10345192ff1b7a653c1a137e3d90496 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Thu, 23 Feb 2023 09:23:30 +0100 Subject: [PATCH 069/153] Fix notification in encrypted room for poll end event --- .../org/matrix/android/sdk/api/session/events/model/Event.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt index 40c69ceb66..ae3e3a63c8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt @@ -488,7 +488,7 @@ fun Event.getPollContent(): MessagePollContent? { } fun Event.supportsNotification() = - this.getClearType() in EventType.MESSAGE + EventType.POLL_START.values + EventType.STATE_ROOM_BEACON_INFO.values + this.getClearType() in EventType.MESSAGE + EventType.POLL_START.values + EventType.POLL_END.values + EventType.STATE_ROOM_BEACON_INFO.values fun Event.isContentReportable() = this.getClearType() in EventType.MESSAGE + EventType.STATE_ROOM_BEACON_INFO.values From 60ebc0dccbe97eb325596bfcac13decb90648beb Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 23 Feb 2023 10:05:45 +0100 Subject: [PATCH 070/153] Update build.yml to fix checkout on main --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e529692dd7..308f4c7a87 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,7 +51,7 @@ jobs: - uses: actions/checkout@v3 with: # https://github.com/actions/checkout/issues/881 - ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} + ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.ref }} - name: Configure gradle uses: gradle/gradle-build-action@v2 with: From f782a315929b46db9bac0de3b19b23bfb7c986c6 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Thu, 23 Feb 2023 10:15:34 +0100 Subject: [PATCH 071/153] Fix unit tests --- .../GetNotificationCountForSpacesUseCaseTest.kt | 6 +++--- .../java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/vector/src/test/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCaseTest.kt index 2813b9d79f..8d4bdb1b30 100644 --- a/vector/src/test/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/spaces/notification/GetNotificationCountForSpacesUseCaseTest.kt @@ -62,7 +62,7 @@ internal class GetNotificationCountForSpacesUseCaseTest { } @Test - fun `given space filter and hide invites when execute then correct notification count is returned`() = runTest { + fun `given space filter and auto accept invites when execute then correct notification count is returned`() = runTest { // given val spaceFilter = SpaceFilter.NoFilter val pagedList = mockk>() @@ -78,7 +78,7 @@ internal class GetNotificationCountForSpacesUseCaseTest { fakeActiveSessionHolder.fakeSession .fakeRoomService .givenGetNotificationCountForRoomsReturns(expectedNotificationCount) - fakeAutoAcceptInvites._hideInvites = true + fakeAutoAcceptInvites._isEnabled = true // When val testObserver = getNotificationCountForSpacesUseCase.execute(spaceFilter).test(this) @@ -121,7 +121,7 @@ internal class GetNotificationCountForSpacesUseCaseTest { fakeActiveSessionHolder.fakeSession .fakeRoomService .givenGetRoomSummaries(invitedRooms) - fakeAutoAcceptInvites._hideInvites = false + fakeAutoAcceptInvites._isEnabled = false val expectedNotificationCount = RoomAggregateNotificationCount( notificationCount = notificationCount.notificationCount + invitedRooms.size, highlightCount = notificationCount.highlightCount + invitedRooms.size, diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt index d1160cedfd..778c2f113d 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeAutoAcceptInvites.kt @@ -21,11 +21,7 @@ import im.vector.app.features.invite.AutoAcceptInvites class FakeAutoAcceptInvites : AutoAcceptInvites { var _isEnabled: Boolean = false - var _hideInvites: Boolean = false override val isEnabled: Boolean get() = _isEnabled - - override val hideInvites: Boolean - get() = _hideInvites } From 2bd0126523cca2b15ce7d89a9e18fd5888fdf6bc Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Thu, 23 Feb 2023 13:59:32 +0100 Subject: [PATCH 072/153] Extracting logic to compute the badge state into a usecase --- .../GetSpacesNotificationBadgeStateUseCase.kt | 67 ++++++++++++++ .../features/home/NewHomeDetailFragment.kt | 19 +--- .../features/home/NewHomeDetailViewModel.kt | 28 ++---- .../features/home/NewHomeDetailViewState.kt | 5 +- ...SpacesNotificationBadgeStateUseCaseTest.kt | 88 +++++++++++++++++++ .../home/NewHomeDetailViewModelTest.kt | 33 +++---- 6 files changed, 174 insertions(+), 66 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/home/GetSpacesNotificationBadgeStateUseCase.kt create mode 100644 vector/src/test/java/im/vector/app/features/home/GetSpacesNotificationBadgeStateUseCaseTest.kt diff --git a/vector/src/main/java/im/vector/app/features/home/GetSpacesNotificationBadgeStateUseCase.kt b/vector/src/main/java/im/vector/app/features/home/GetSpacesNotificationBadgeStateUseCase.kt new file mode 100644 index 0000000000..62d1501dab --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/GetSpacesNotificationBadgeStateUseCase.kt @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home + +import im.vector.app.features.home.room.list.UnreadCounterBadgeView +import im.vector.app.features.spaces.GetSpacesUseCase +import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import org.matrix.android.sdk.api.query.QueryStringValue +import org.matrix.android.sdk.api.query.SpaceFilter +import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.spaceSummaryQueryParams +import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount +import javax.inject.Inject + +class GetSpacesNotificationBadgeStateUseCase @Inject constructor( + private val getNotificationCountForSpacesUseCase: GetNotificationCountForSpacesUseCase, + private val getSpacesUseCase: GetSpacesUseCase, +) { + + fun execute(): Flow { + val params = spaceSummaryQueryParams { + memberships = listOf(Membership.INVITE) + displayName = QueryStringValue.IsNotEmpty + } + return combine( + getNotificationCountForSpacesUseCase.execute(SpaceFilter.NoFilter), + getSpacesUseCase.execute(params), + ) { spacesNotificationCount, spaceInvites -> + computeSpacesNotificationCounterBadgeState(spacesNotificationCount, spaceInvites) + } + } + + private fun computeSpacesNotificationCounterBadgeState( + spacesNotificationCount: RoomAggregateNotificationCount, + spaceInvites: List, + ): UnreadCounterBadgeView.State { + val hasPendingSpaceInvites = spaceInvites.isNotEmpty() + return if (hasPendingSpaceInvites && spacesNotificationCount.notificationCount == 0) { + UnreadCounterBadgeView.State.Text( + text = "!", + highlighted = true, + ) + } else { + UnreadCounterBadgeView.State.Count( + count = spacesNotificationCount.notificationCount, + highlighted = spacesNotificationCount.isHighlight || hasPendingSpaceInvites, + ) + } + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt index a13487afc8..ef855ff15b 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt @@ -64,7 +64,6 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo import org.matrix.android.sdk.api.session.room.model.RoomSummary -import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount import javax.inject.Inject @AndroidEntryPoint @@ -185,7 +184,7 @@ class NewHomeDetailFragment : } newHomeDetailViewModel.onEach { viewState -> - refreshUnreadCounterBadge(viewState.spacesNotificationCount, viewState.hasPendingSpaceInvites) + refreshUnreadCounterBadge(viewState.spacesNotificationCounterBadgeState) } } @@ -386,21 +385,7 @@ class NewHomeDetailFragment : } } - private fun refreshUnreadCounterBadge( - spacesNotificationCount: RoomAggregateNotificationCount, - hasPendingSpaceInvites: Boolean, - ) { - val badgeState = if (hasPendingSpaceInvites && spacesNotificationCount.notificationCount == 0) { - UnreadCounterBadgeView.State.Text( - text = "!", - highlighted = true, - ) - } else { - UnreadCounterBadgeView.State.Count( - count = spacesNotificationCount.notificationCount, - highlighted = spacesNotificationCount.isHighlight || hasPendingSpaceInvites, - ) - } + private fun refreshUnreadCounterBadge(badgeState: UnreadCounterBadgeView.State) { views.spacesUnreadCounterBadge.render(badgeState) } diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt index b26d010137..67b4645944 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewModel.kt @@ -25,19 +25,12 @@ import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.EmptyAction import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.spaces.GetSpacesUseCase -import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import org.matrix.android.sdk.api.query.QueryStringValue -import org.matrix.android.sdk.api.query.SpaceFilter -import org.matrix.android.sdk.api.session.room.model.Membership -import org.matrix.android.sdk.api.session.room.spaceSummaryQueryParams class NewHomeDetailViewModel @AssistedInject constructor( @Assisted initialState: NewHomeDetailViewState, - private val getNotificationCountForSpacesUseCase: GetNotificationCountForSpacesUseCase, - private val getSpacesUseCase: GetSpacesUseCase, + private val getSpacesNotificationBadgeStateUseCase: GetSpacesNotificationBadgeStateUseCase, ) : VectorViewModel(initialState) { @AssistedFactory @@ -48,23 +41,12 @@ class NewHomeDetailViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() init { - observeSpacesNotificationCount() - observeSpacesInvite() + observeSpacesNotificationBadgeState() } - private fun observeSpacesNotificationCount() { - getNotificationCountForSpacesUseCase.execute(SpaceFilter.NoFilter) - .onEach { setState { copy(spacesNotificationCount = it) } } - .launchIn(viewModelScope) - } - - private fun observeSpacesInvite() { - val params = spaceSummaryQueryParams { - memberships = listOf(Membership.INVITE) - displayName = QueryStringValue.IsNotEmpty - } - getSpacesUseCase.execute(params) - .onEach { setState { copy(hasPendingSpaceInvites = it.isNotEmpty()) } } + private fun observeSpacesNotificationBadgeState() { + getSpacesNotificationBadgeStateUseCase.execute() + .onEach { badgeState -> setState { copy(spacesNotificationCounterBadgeState = badgeState) } } .launchIn(viewModelScope) } diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt index 1ff0b86511..7e368fb2d1 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailViewState.kt @@ -17,9 +17,8 @@ package im.vector.app.features.home import com.airbnb.mvrx.MavericksState -import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount +import im.vector.app.features.home.room.list.UnreadCounterBadgeView data class NewHomeDetailViewState( - val spacesNotificationCount: RoomAggregateNotificationCount = RoomAggregateNotificationCount(notificationCount = 0, highlightCount = 0), - val hasPendingSpaceInvites: Boolean = false, + val spacesNotificationCounterBadgeState: UnreadCounterBadgeView.State = UnreadCounterBadgeView.State.Count(count = 0, highlighted = false), ) : MavericksState diff --git a/vector/src/test/java/im/vector/app/features/home/GetSpacesNotificationBadgeStateUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/home/GetSpacesNotificationBadgeStateUseCaseTest.kt new file mode 100644 index 0000000000..4d7d0d98f4 --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/home/GetSpacesNotificationBadgeStateUseCaseTest.kt @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home + +import im.vector.app.features.home.room.list.UnreadCounterBadgeView +import im.vector.app.features.spaces.GetSpacesUseCase +import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase +import im.vector.app.test.test +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.matrix.android.sdk.api.query.QueryStringValue +import org.matrix.android.sdk.api.query.SpaceFilter +import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount + +internal class GetSpacesNotificationBadgeStateUseCaseTest { + + private val fakeGetNotificationCountForSpacesUseCase = mockk() + private val fakeGetSpacesUseCase = mockk() + + private val getSpacesNotificationBadgeStateUseCase = GetSpacesNotificationBadgeStateUseCase( + getNotificationCountForSpacesUseCase = fakeGetNotificationCountForSpacesUseCase, + getSpacesUseCase = fakeGetSpacesUseCase, + ) + + @Test + fun `given flow of spaces invite and notification count then flow of state is correct`() = runTest { + // Given + val noSpacesInvite = emptyList() + val existingSpaceInvite = listOf(mockk()) + val noNotification = RoomAggregateNotificationCount( + notificationCount = 0, + highlightCount = 0, + ) + val existingNotificationNotHighlighted = RoomAggregateNotificationCount( + notificationCount = 1, + highlightCount = 0, + ) + val existingNotificationHighlighted = RoomAggregateNotificationCount( + notificationCount = 1, + highlightCount = 1, + ) + every { fakeGetSpacesUseCase.execute(any()) } returns + flowOf(noSpacesInvite, existingSpaceInvite, existingSpaceInvite, noSpacesInvite, noSpacesInvite) + every { fakeGetNotificationCountForSpacesUseCase.execute(any()) } returns + flowOf(noNotification, noNotification, existingNotificationNotHighlighted, existingNotificationNotHighlighted, existingNotificationHighlighted) + + // When + val testObserver = getSpacesNotificationBadgeStateUseCase.execute().test(this) + advanceUntilIdle() + + // Then + val expectedState1 = UnreadCounterBadgeView.State.Count(count = 0, highlighted = false) + val expectedState2 = UnreadCounterBadgeView.State.Text(text = "!", highlighted = true) + val expectedState3 = UnreadCounterBadgeView.State.Count(count = 1, highlighted = true) + val expectedState4 = UnreadCounterBadgeView.State.Count(count = 1, highlighted = false) + val expectedState5 = UnreadCounterBadgeView.State.Count(count = 1, highlighted = true) + testObserver + .assertValues(expectedState1, expectedState2, expectedState3, expectedState4, expectedState5) + .finish() + verify { + fakeGetSpacesUseCase.execute(match { + it.memberships == listOf(Membership.INVITE) && it.displayName == QueryStringValue.IsNotEmpty + }) + } + verify { fakeGetNotificationCountForSpacesUseCase.execute(SpaceFilter.NoFilter) } + } +} diff --git a/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt b/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt index 23882bf7c4..a92c4be0d7 100644 --- a/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt @@ -17,8 +17,8 @@ package im.vector.app.features.home import com.airbnb.mvrx.test.MavericksTestRule +import im.vector.app.features.home.room.list.UnreadCounterBadgeView import im.vector.app.features.spaces.GetSpacesUseCase -import im.vector.app.features.spaces.notification.GetNotificationCountForSpacesUseCase import im.vector.app.test.test import io.mockk.every import io.mockk.mockk @@ -27,10 +27,6 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.UnconfinedTestDispatcher import org.junit.Rule import org.junit.Test -import org.matrix.android.sdk.api.query.SpaceFilter -import org.matrix.android.sdk.api.session.room.model.Membership -import org.matrix.android.sdk.api.session.room.model.RoomSummary -import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount internal class NewHomeDetailViewModelTest { @@ -38,43 +34,34 @@ internal class NewHomeDetailViewModelTest { val mavericksTestRule = MavericksTestRule(testDispatcher = UnconfinedTestDispatcher()) private val initialState = NewHomeDetailViewState() - private val fakeGetNotificationCountForSpacesUseCase = mockk() - private val fakeGetSpacesUseCase = mockk() + private val fakeGetSpacesNotificationBadgeStateUseCase = mockk() private fun createViewModel(): NewHomeDetailViewModel { return NewHomeDetailViewModel( initialState = initialState, - getNotificationCountForSpacesUseCase = fakeGetNotificationCountForSpacesUseCase, - getSpacesUseCase = fakeGetSpacesUseCase, + getSpacesNotificationBadgeStateUseCase = fakeGetSpacesNotificationBadgeStateUseCase, ) } @Test - fun `given the viewModel is created then viewState is updated with space notifications count and pending space invites`() { + fun `given the viewModel is created then viewState is updated with space notifications badge state`() { // Given - val spacesNotificationCount = RoomAggregateNotificationCount( - notificationCount = 1, - highlightCount = 1, - ) - every { fakeGetNotificationCountForSpacesUseCase.execute(any()) } returns flowOf(spacesNotificationCount) - val spaceInvites = listOf(mockk()) - every { fakeGetSpacesUseCase.execute(any()) } returns flowOf(spaceInvites) - val expectedViewState = initialState.copy( - spacesNotificationCount = spacesNotificationCount, - hasPendingSpaceInvites = true, - ) + val aBadgeState = UnreadCounterBadgeView.State.Count(count = 1, highlighted = false) + every { fakeGetSpacesNotificationBadgeStateUseCase.execute() } returns flowOf(aBadgeState) // When val viewModel = createViewModel() val viewModelTest = viewModel.test() // Then + val expectedViewState = initialState.copy( + spacesNotificationCounterBadgeState = aBadgeState, + ) viewModelTest .assertLatestState(expectedViewState) .finish() verify { - fakeGetNotificationCountForSpacesUseCase.execute(SpaceFilter.NoFilter) - fakeGetSpacesUseCase.execute(match { it.memberships == listOf(Membership.INVITE) }) + fakeGetSpacesNotificationBadgeStateUseCase.execute() } } } From 6649297ea0e9ce46f83339eebd205bcda0d5c190 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Thu, 23 Feb 2023 14:01:49 +0100 Subject: [PATCH 073/153] restore onSessionStarted method call --- .../vector/app/core/session/ConfigureAndStartSessionUseCase.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/core/session/ConfigureAndStartSessionUseCase.kt b/vector/src/main/java/im/vector/app/core/session/ConfigureAndStartSessionUseCase.kt index 8a9fc9729d..b9573e9292 100644 --- a/vector/src/main/java/im/vector/app/core/session/ConfigureAndStartSessionUseCase.kt +++ b/vector/src/main/java/im/vector/app/core/session/ConfigureAndStartSessionUseCase.kt @@ -52,7 +52,7 @@ class ConfigureAndStartSessionUseCase @Inject constructor( updateMatrixClientInfoIfNeeded(session) createNotificationSettingsAccountDataIfNeeded(session) notificationsSettingUpdater.onSessionStarted(session) -// pushRulesUpdater.onSessionStarted(session) + pushRulesUpdater.onSessionStarted(session) } private fun updateMatrixClientInfoIfNeeded(session: Session) { From 53d03335abcf92853c636535a5e4bbc2d915f5f0 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Thu, 23 Feb 2023 14:18:21 +0100 Subject: [PATCH 074/153] Remove unused import --- .../im/vector/app/features/home/NewHomeDetailViewModelTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt b/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt index a92c4be0d7..39adc0a811 100644 --- a/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/home/NewHomeDetailViewModelTest.kt @@ -18,7 +18,6 @@ package im.vector.app.features.home import com.airbnb.mvrx.test.MavericksTestRule import im.vector.app.features.home.room.list.UnreadCounterBadgeView -import im.vector.app.features.spaces.GetSpacesUseCase import im.vector.app.test.test import io.mockk.every import io.mockk.mockk From 8192bb5442898f1d65007f558698922471f12dbc Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Thu, 23 Feb 2023 19:44:03 +0100 Subject: [PATCH 075/153] matrix-sdk: Ensure correct room for events loaded by chunks Chunks should not load events from other rooms if they happen to be requested for one eventId that already exists in a different room. Motivation from a client that renders rich replies (although the broken scenario can appear in other cases as well): If somebody links an invalid eventId in a room, which however is valid in a different room, this can mess up our timelines badly. This can be reproduced by replying to an event in a room, then forward the reply to a different room with a client that also forwards the replied-to information (such as FluffyChat). Then click on the rich reply to open the eventId. Previously, Android could find the event from the other room and thus replace the correct timeline with the wrong one. Compare e.g. https://matrix.to/#/!bfebJVBOZMnORmkVdO:matrix.org/$wUyRiMQEjaWOpJ-XpdBJzuXkh95N7bce2pVT4IMXW50?via=schildi.chat&via=matrix.org&via=envs.net linking to an event that exists here https://matrix.to/#/!SDwMepdfgrmExhyxYZ:schildi.chat/$MO2G4MZZ1zg0Ymc9gTfekIyw7QFkNn4OvYQKK1PAGlE Change-Id: I4dcee94353d954fb6ed57c3970686a620b831c6f --- changelog.d/8168.bugfix | 1 + .../sdk/internal/database/helper/ThreadEventsHelper.kt | 2 +- .../sdk/internal/database/query/ChunkEntityQueries.kt | 7 ++++--- .../android/sdk/internal/database/query/ReadQueries.kt | 6 +++--- .../session/room/timeline/FetchTokenAndPaginateTask.kt | 2 +- .../internal/session/room/timeline/LoadTimelineStrategy.kt | 2 +- 6 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 changelog.d/8168.bugfix diff --git a/changelog.d/8168.bugfix b/changelog.d/8168.bugfix new file mode 100644 index 0000000000..39baa3f60a --- /dev/null +++ b/changelog.d/8168.bugfix @@ -0,0 +1 @@ +Fix timeline loading a wrong room on permalink if a matching event id is found in a different room diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ThreadEventsHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ThreadEventsHelper.kt index 7999a2ea14..a100741452 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ThreadEventsHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ThreadEventsHelper.kt @@ -297,7 +297,7 @@ internal fun updateThreadNotifications(roomId: String, realm: Realm, currentUser val readReceipt = findMyReadReceipt(realm, roomId, currentUserId, threadId = rootThreadEventId) ?: return val readReceiptChunk = ChunkEntity - .findIncludingEvent(realm, readReceipt) ?: return + .findIncludingEvent(realm, roomId, readReceipt) ?: return val readReceiptChunkThreadEvents = readReceiptChunk .timelineEvents diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt index 1e5d96b496..08c8bcf86e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt @@ -72,15 +72,16 @@ internal fun ChunkEntity.Companion.findEventInThreadChunk(realm: Realm, roomId: .findFirst() } -internal fun ChunkEntity.Companion.findAllIncludingEvents(realm: Realm, eventIds: List): RealmResults { +internal fun ChunkEntity.Companion.findAllIncludingEvents(realm: Realm, roomId: String, eventIds: List): RealmResults { return realm.where() + .equalTo(ChunkEntityFields.ROOM.ROOM_ID, roomId) .`in`(ChunkEntityFields.TIMELINE_EVENTS.EVENT_ID, eventIds.toTypedArray()) .isNull(ChunkEntityFields.ROOT_THREAD_EVENT_ID) .findAll() } -internal fun ChunkEntity.Companion.findIncludingEvent(realm: Realm, eventId: String): ChunkEntity? { - return findAllIncludingEvents(realm, listOf(eventId)).firstOrNull() +internal fun ChunkEntity.Companion.findIncludingEvent(realm: Realm, roomId: String, eventId: String): ChunkEntity? { + return findAllIncludingEvents(realm, roomId, listOf(eventId)).firstOrNull() } internal fun ChunkEntity.Companion.create( diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt index ebfe23105e..0cc4abcb3d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadQueries.kt @@ -76,11 +76,11 @@ private fun hasReadMissingEvent(realm: Realm, userId: String, eventId: String, threadId: String? = ReadService.THREAD_ID_MAIN): Boolean { - return realm.doesEventExistInChunkHistory(eventId) && realm.hasReadReceiptInLatestChunk(latestChunkEntity, roomId, userId, threadId) + return realm.doesEventExistInChunkHistory(roomId, eventId) && realm.hasReadReceiptInLatestChunk(latestChunkEntity, roomId, userId, threadId) } -private fun Realm.doesEventExistInChunkHistory(eventId: String): Boolean { - return ChunkEntity.findIncludingEvent(this, eventId) != null +private fun Realm.doesEventExistInChunkHistory(roomId: String, eventId: String): Boolean { + return ChunkEntity.findIncludingEvent(this, roomId, eventId) != null } private fun Realm.hasReadReceiptInLatestChunk(latestChunkEntity: ChunkEntity, roomId: String, userId: String, threadId: String?): Boolean { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/FetchTokenAndPaginateTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/FetchTokenAndPaginateTask.kt index 9d8d8ecbf1..b73dd8160b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/FetchTokenAndPaginateTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/FetchTokenAndPaginateTask.kt @@ -59,7 +59,7 @@ internal class DefaultFetchTokenAndPaginateTask @Inject constructor( ?: throw IllegalStateException("No token found") monarchy.awaitTransaction { realm -> - val chunkToUpdate = ChunkEntity.findIncludingEvent(realm, params.lastKnownEventId) + val chunkToUpdate = ChunkEntity.findIncludingEvent(realm, params.roomId, params.lastKnownEventId) if (params.direction == PaginationDirection.FORWARDS) { chunkToUpdate?.nextToken = fromToken } else { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index 6654eeadfc..2143ac1d21 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -278,7 +278,7 @@ internal class LoadTimelineStrategy constructor( .findAll() } is Mode.Permalink -> { - ChunkEntity.findAllIncludingEvents(realm, listOf(mode.originEventId)) + ChunkEntity.findAllIncludingEvents(realm, roomId, listOf(mode.originEventId)) } is Mode.Thread -> { recreateThreadChunkEntity(realm, mode.rootThreadEventId) From a331d907cef29a2d4e712bd2703f511f1ff873bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Feb 2023 23:58:26 +0000 Subject: [PATCH 076/153] Bump com.posthog.android:posthog from 2.0.2 to 2.0.3 Bumps [com.posthog.android:posthog](https://github.com/PostHog/posthog-android) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/PostHog/posthog-android/releases) - [Changelog](https://github.com/PostHog/posthog-android/blob/master/CHANGELOG.md) - [Commits](https://github.com/PostHog/posthog-android/compare/2.0.2...2.0.3) --- updated-dependencies: - dependency-name: com.posthog.android:posthog dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- vector/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/build.gradle b/vector/build.gradle index 6cbc283d58..e58bf4095f 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -233,7 +233,7 @@ dependencies { kapt libs.dagger.hiltCompiler // Analytics - implementation('com.posthog.android:posthog:2.0.2') { + implementation('com.posthog.android:posthog:2.0.3') { exclude group: 'com.android.support', module: 'support-annotations' } implementation libs.sentry.sentryAndroid From b6ac91580577eb945c992d7c139eb2adfec40078 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Thu, 23 Feb 2023 17:43:39 +0100 Subject: [PATCH 077/153] Apply push rules on encrypted events --- .../android/sdk/api/session/pushrules/EventMatchCondition.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index 15d5cd3153..9fdf848288 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -39,9 +39,8 @@ class EventMatchCondition( override fun technicalDescription() = "'$key' matches '$pattern'" fun isSatisfied(event: Event): Boolean { - // TODO encrypted events? - val rawJson = MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *> - ?: return false + val rawJson: Map<*, *> = event.mxDecryptionResult?.payload ?: MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *> + ?: return false val value = extractField(rawJson, key) ?: return false // The match is performed case-insensitively, and must match the entire value of From 9d7758c9e35801c00895877b731791f1693ff53a Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 24 Feb 2023 09:26:50 +0100 Subject: [PATCH 078/153] Reuse event.supportsNotification extension --- .../sdk/api/session/pushrules/EventMatchCondition.kt | 5 +++-- .../notifications/NotifiableEventResolver.kt | 12 ++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index 9fdf848288..157cee8219 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -39,8 +39,9 @@ class EventMatchCondition( override fun technicalDescription() = "'$key' matches '$pattern'" fun isSatisfied(event: Event): Boolean { - val rawJson: Map<*, *> = event.mxDecryptionResult?.payload ?: MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *> - ?: return false + val rawJson: Map<*, *> = event.mxDecryptionResult?.payload + ?: MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *> + ?: return false val value = extractField(rawJson, key) ?: return false // The match is performed case-insensitively, and must match the entire value of diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt b/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt index 14a36d9922..e1026bbf04 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt @@ -66,9 +66,6 @@ class NotifiableEventResolver @Inject constructor( private val buildMeta: BuildMeta, ) { - private val nonEncryptedNotifiableEventTypes: List = - listOf(EventType.MESSAGE) + EventType.POLL_START.values + EventType.POLL_END.values + EventType.STATE_ROOM_BEACON_INFO.values - suspend fun resolveEvent(event: Event, session: Session, isNoisy: Boolean): NotifiableEvent? { val roomID = event.roomId ?: return null val eventId = event.eventId ?: return null @@ -76,9 +73,8 @@ class NotifiableEventResolver @Inject constructor( return resolveStateRoomEvent(event, session, canBeReplaced = false, isNoisy = isNoisy) } val timelineEvent = session.getRoom(roomID)?.getTimelineEvent(eventId) ?: return null - return when (event.getClearType()) { - in nonEncryptedNotifiableEventTypes, - EventType.ENCRYPTED -> { + return when { + event.supportsNotification() || event.type == EventType.ENCRYPTED -> { resolveMessageEvent(timelineEvent, session, canBeReplaced = false, isNoisy = isNoisy) } else -> { @@ -163,8 +159,8 @@ class NotifiableEventResolver @Inject constructor( } else { event.attemptToDecryptIfNeeded(session) // only convert encrypted messages to NotifiableMessageEvents - when (event.root.getClearType()) { - in nonEncryptedNotifiableEventTypes -> { + when { + event.root.supportsNotification() -> { val body = displayableEventFormatter.format(event, isDm = room.roomSummary()?.isDirect.orFalse(), appendAuthor = false).toString() val roomName = room.roomSummary()?.displayName ?: "" val senderDisplayName = event.senderInfo.disambiguatedDisplayName From b20d74aa1de4410913c854ad3d2a6285e4d2cc22 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Fri, 24 Feb 2023 09:50:07 +0100 Subject: [PATCH 079/153] Add changelog file --- changelog.d/8170.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8170.bugfix diff --git a/changelog.d/8170.bugfix b/changelog.d/8170.bugfix new file mode 100644 index 0000000000..62ded3b2ca --- /dev/null +++ b/changelog.d/8170.bugfix @@ -0,0 +1 @@ +Reapply local push rules after event decryption From 370d58e876aede5d9d3c3b60eea7b27a52f43aa5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 23:58:00 +0000 Subject: [PATCH 080/153] Bump glide from 4.14.2 to 4.15.0 Bumps `glide` from 4.14.2 to 4.15.0. Updates `com.github.bumptech.glide:glide` from 4.14.2 to 4.15.0 - [Release notes](https://github.com/bumptech/glide/releases) - [Commits](https://github.com/bumptech/glide/compare/v4.14.2...v4.15.0) Updates `com.github.bumptech.glide:compiler` from 4.14.2 to 4.15.0 - [Release notes](https://github.com/bumptech/glide/releases) - [Commits](https://github.com/bumptech/glide/compare/v4.14.2...v4.15.0) --- updated-dependencies: - dependency-name: com.github.bumptech.glide:glide dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.github.bumptech.glide:compiler dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 67bb90eb43..a32d067792 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -21,7 +21,7 @@ def flowBinding = "1.2.0" def flipper = "0.182.0" def epoxy = "5.0.0" def mavericks = "3.0.1" -def glide = "4.14.2" +def glide = "4.15.0" def bigImageViewer = "1.8.1" def jjwt = "0.11.5" // Temporary version to unblock #6929. Once 0.16.0 is released we should use it, and revert From a30e4a9d86e0266eea14584f728575b8d31afec4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 23:58:26 +0000 Subject: [PATCH 081/153] Bump androidx.transition:transition from 1.2.0 to 1.4.1 Bumps androidx.transition:transition from 1.2.0 to 1.4.1. --- updated-dependencies: - dependency-name: androidx.transition:transition dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 67bb90eb43..f29927de8b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -79,7 +79,7 @@ ext.libs = [ 'espressoContrib' : "androidx.test.espresso:espresso-contrib:$espresso", 'espressoIntents' : "androidx.test.espresso:espresso-intents:$espresso", 'viewpager2' : "androidx.viewpager2:viewpager2:1.0.0", - 'transition' : "androidx.transition:transition:1.2.0", + 'transition' : "androidx.transition:transition:1.4.1", ], google : [ 'material' : "com.google.android.material:material:1.8.0", From 62ee6c8033bd6e708f03e86afc85b5c3d5bad2bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Feb 2023 23:59:47 +0000 Subject: [PATCH 082/153] Bump com.googlecode.libphonenumber:libphonenumber from 8.13.6 to 8.13.7 Bumps [com.googlecode.libphonenumber:libphonenumber](https://github.com/google/libphonenumber) from 8.13.6 to 8.13.7. - [Release notes](https://github.com/google/libphonenumber/releases) - [Changelog](https://github.com/google/libphonenumber/blob/master/making-metadata-changes.md) - [Commits](https://github.com/google/libphonenumber/compare/v8.13.6...v8.13.7) --- updated-dependencies: - dependency-name: com.googlecode.libphonenumber:libphonenumber dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 67bb90eb43..1f3009da57 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -88,7 +88,7 @@ ext.libs = [ 'appdistributionApi' : "com.google.firebase:firebase-appdistribution-api-ktx:$appDistribution", 'appdistribution' : "com.google.firebase:firebase-appdistribution:$appDistribution", // Phone number https://github.com/google/libphonenumber - 'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.13.6" + 'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.13.7" ], dagger : [ 'dagger' : "com.google.dagger:dagger:$dagger", From 088c2ae44953a2f33f2a1eab4ed1f3f50d475cce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 00:00:01 +0000 Subject: [PATCH 083/153] Bump org.maplibre.gl:android-sdk from 9.6.0 to 10.0.2 Bumps [org.maplibre.gl:android-sdk](https://github.com/maplibre/maplibre-gl-native) from 9.6.0 to 10.0.2. - [Release notes](https://github.com/maplibre/maplibre-gl-native/releases) - [Changelog](https://github.com/maplibre/maplibre-gl-native/blob/main/CHANGELOG.md) - [Commits](https://github.com/maplibre/maplibre-gl-native/compare/android-v9.6.0...android-v10.0.2) --- updated-dependencies: - dependency-name: org.maplibre.gl:android-sdk dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 67bb90eb43..6a00f9a28a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -134,7 +134,7 @@ ext.libs = [ 'mavericksTesting' : "com.airbnb.android:mavericks-testing:$mavericks" ], maplibre : [ - 'androidSdk' : "org.maplibre.gl:android-sdk:9.6.0", + 'androidSdk' : "org.maplibre.gl:android-sdk:10.0.2", 'pluginAnnotation' : "org.maplibre.gl:android-plugin-annotation-v9:1.0.0" ], mockk : [ From 39d9591b26964f8ee9881a727136e9c486684b9e Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Mon, 27 Feb 2023 09:24:56 +0000 Subject: [PATCH 084/153] [Rich text editor] Fix code appearance (#8171) Code does not use the correct theme colour when the theme is manually selected in the app settings. https://github.com/vector-im/verticals-internal/issues/23 --- changelog.d/8171.bugfix | 1 + .../src/main/res/drawable/bg_code_block.xml | 22 ++++++++++++++++++ .../bg_inline_code_multi_line_left.xml | 23 +++++++++++++++++++ .../bg_inline_code_multi_line_mid.xml | 21 +++++++++++++++++ .../bg_inline_code_multi_line_right.xml | 23 +++++++++++++++++++ .../drawable/bg_inline_code_single_line.xml | 22 ++++++++++++++++++ .../res/layout/composer_rich_text_layout.xml | 5 ++++ ..._timeline_event_text_message_rich_stub.xml | 6 +++++ 8 files changed, 123 insertions(+) create mode 100644 changelog.d/8171.bugfix create mode 100644 vector/src/main/res/drawable/bg_code_block.xml create mode 100644 vector/src/main/res/drawable/bg_inline_code_multi_line_left.xml create mode 100644 vector/src/main/res/drawable/bg_inline_code_multi_line_mid.xml create mode 100644 vector/src/main/res/drawable/bg_inline_code_multi_line_right.xml create mode 100644 vector/src/main/res/drawable/bg_inline_code_single_line.xml diff --git a/changelog.d/8171.bugfix b/changelog.d/8171.bugfix new file mode 100644 index 0000000000..799fecabaf --- /dev/null +++ b/changelog.d/8171.bugfix @@ -0,0 +1 @@ +[Rich text editor] Fix code appearance \ No newline at end of file diff --git a/vector/src/main/res/drawable/bg_code_block.xml b/vector/src/main/res/drawable/bg_code_block.xml new file mode 100644 index 0000000000..c492ce02c2 --- /dev/null +++ b/vector/src/main/res/drawable/bg_code_block.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/vector/src/main/res/drawable/bg_inline_code_multi_line_left.xml b/vector/src/main/res/drawable/bg_inline_code_multi_line_left.xml new file mode 100644 index 0000000000..fa5b052562 --- /dev/null +++ b/vector/src/main/res/drawable/bg_inline_code_multi_line_left.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/vector/src/main/res/drawable/bg_inline_code_multi_line_mid.xml b/vector/src/main/res/drawable/bg_inline_code_multi_line_mid.xml new file mode 100644 index 0000000000..0f55cbbbbb --- /dev/null +++ b/vector/src/main/res/drawable/bg_inline_code_multi_line_mid.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/vector/src/main/res/drawable/bg_inline_code_multi_line_right.xml b/vector/src/main/res/drawable/bg_inline_code_multi_line_right.xml new file mode 100644 index 0000000000..0f0d004869 --- /dev/null +++ b/vector/src/main/res/drawable/bg_inline_code_multi_line_right.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/vector/src/main/res/drawable/bg_inline_code_single_line.xml b/vector/src/main/res/drawable/bg_inline_code_single_line.xml new file mode 100644 index 0000000000..e70625152a --- /dev/null +++ b/vector/src/main/res/drawable/bg_inline_code_single_line.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/vector/src/main/res/layout/composer_rich_text_layout.xml b/vector/src/main/res/layout/composer_rich_text_layout.xml index 8992b632c0..f5ad5c51db 100644 --- a/vector/src/main/res/layout/composer_rich_text_layout.xml +++ b/vector/src/main/res/layout/composer_rich_text_layout.xml @@ -126,6 +126,11 @@ app:layout_constraintTop_toBottomOf="@id/composerModeBarrier" app:bulletRadius="4sp" app:bulletGap="8sp" + app:codeBlockBackgroundDrawable="@drawable/bg_code_block" + app:inlineCodeSingleLineBg="@drawable/bg_inline_code_single_line" + app:inlineCodeMultiLineBgLeft="@drawable/bg_inline_code_multi_line_left" + app:inlineCodeMultiLineBgMid="@drawable/bg_inline_code_multi_line_mid" + app:inlineCodeMultiLineBgRight="@drawable/bg_inline_code_multi_line_right" tools:text="@tools:sample/lorem/random" /> From 67d25dfcd8ebe8d613337609dbdaadcd910b9625 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Feb 2023 00:01:45 +0000 Subject: [PATCH 085/153] Bump org.json:json from 20220924 to 20230227 Bumps [org.json:json](https://github.com/douglascrockford/JSON-java) from 20220924 to 20230227. - [Release notes](https://github.com/douglascrockford/JSON-java/releases) - [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md) - [Commits](https://github.com/douglascrockford/JSON-java/commits) --- updated-dependencies: - dependency-name: org.json:json dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- library/external/jsonviewer/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/external/jsonviewer/build.gradle b/library/external/jsonviewer/build.gradle index a5d297b860..7b3b62c082 100644 --- a/library/external/jsonviewer/build.gradle +++ b/library/external/jsonviewer/build.gradle @@ -65,7 +65,7 @@ dependencies { implementation libs.jetbrains.coroutinesCore implementation libs.jetbrains.coroutinesAndroid - testImplementation 'org.json:json:20220924' + testImplementation 'org.json:json:20230227' testImplementation libs.tests.junit androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.espressoCore From 69f8715d0319081037d49b2d2ae40ea40a7054e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Feb 2023 09:34:53 +0000 Subject: [PATCH 086/153] Bump org.owasp:dependency-check-gradle from 8.1.0 to 8.1.1 (#8184) Bumps org.owasp:dependency-check-gradle from 8.1.0 to 8.1.1. --- updated-dependencies: - dependency-name: org.owasp:dependency-check-gradle dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ecd1cd557b..63430431bc 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ buildscript { classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.5.0.2730' classpath 'com.google.android.gms:oss-licenses-plugin:0.10.6' classpath "com.likethesalad.android:stem-plugin:2.3.0" - classpath 'org.owasp:dependency-check-gradle:8.1.0' + classpath 'org.owasp:dependency-check-gradle:8.1.1' classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.20" classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0" classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3' From 8e14579886c5c800936624d622d74065dd67fcba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Feb 2023 09:35:39 +0000 Subject: [PATCH 087/153] Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin Bumps org.sonarsource.scanner.gradle:sonarqube-gradle-plugin from 3.5.0.2730 to 4.0.0.2929. --- updated-dependencies: - dependency-name: org.sonarsource.scanner.gradle:sonarqube-gradle-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 63430431bc..9b6136e94f 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ buildscript { classpath libs.gradle.hiltPlugin classpath 'com.google.firebase:firebase-appdistribution-gradle:3.2.0' classpath 'com.google.gms:google-services:4.3.15' - classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.5.0.2730' + classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.0.0.2929' classpath 'com.google.android.gms:oss-licenses-plugin:0.10.6' classpath "com.likethesalad.android:stem-plugin:2.3.0" classpath 'org.owasp:dependency-check-gradle:8.1.1' From 45ab356b27aedd9823732ee65b860e397e645113 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Mon, 27 Feb 2023 22:50:21 +0000 Subject: [PATCH 088/153] Translated using Weblate (Persian) Currently translated at 100.0% (2606 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- library/ui-strings/src/main/res/values-fa/strings.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index 41b429c134..4348cacf76 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -191,7 +191,7 @@ تنظیمات گزارش اشکال در حال بارگذاری… - باشه + قبول لغو ذخیره ترک کردن @@ -2926,4 +2926,6 @@ تورفتگی دیدن نظرسنجی در خط زمانی حساب + ناتوان در رمزگشایی این پخش صوتی. + جزییات حسابتان جداگانه در %1$s مدیریت می‌شود. \ No newline at end of file From 34e2dca465b9c0be328a1987d7e54782356e771c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E4=BA=91?= Date: Mon, 27 Feb 2023 04:43:43 +0000 Subject: [PATCH 089/153] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.5% (2567 of 2606 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- library/ui-strings/src/main/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index 53daab10df..fea0900f71 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -1702,7 +1702,7 @@ 从低优先级移除 添加到低优先级 - %2$d 的 %1$d + %1$d / %2$d 旋转和裁剪 添加图像自 授予许可 From c5cd0b2911936dd1500813f745fe2cae11b492f0 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Mon, 27 Feb 2023 22:52:18 +0000 Subject: [PATCH 090/153] Translated using Weblate (Persian) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/ --- fastlane/metadata/android/fa/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/fa/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/fa/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/fa/changelogs/40105250.txt diff --git a/fastlane/metadata/android/fa/changelogs/40105240.txt b/fastlane/metadata/android/fa/changelogs/40105240.txt new file mode 100644 index 0000000000..c6e3ddf8a9 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40105240.txt @@ -0,0 +1,2 @@ +تغییرات عمده در این نگارش: عموماً رفع اشکال. به طور خاص رفع نمایان نشدن پیام روی خط زمانی. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/fa/changelogs/40105250.txt b/fastlane/metadata/android/fa/changelogs/40105250.txt new file mode 100644 index 0000000000..c6e3ddf8a9 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40105250.txt @@ -0,0 +1,2 @@ +تغییرات عمده در این نگارش: عموماً رفع اشکال. به طور خاص رفع نمایان نشدن پیام روی خط زمانی. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases From ab1ff2ed84dff3d8d643e94478db94a86ef6e00d Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 27 Feb 2023 10:01:01 +0000 Subject: [PATCH 091/153] Translated using Weblate (Albanian) Currently translated at 100.0% (93 of 93 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sq/ --- fastlane/metadata/android/sq/changelogs/40105240.txt | 2 ++ fastlane/metadata/android/sq/changelogs/40105250.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/sq/changelogs/40105240.txt create mode 100644 fastlane/metadata/android/sq/changelogs/40105250.txt diff --git a/fastlane/metadata/android/sq/changelogs/40105240.txt b/fastlane/metadata/android/sq/changelogs/40105240.txt new file mode 100644 index 0000000000..57b49e89c8 --- /dev/null +++ b/fastlane/metadata/android/sq/changelogs/40105240.txt @@ -0,0 +1,2 @@ +Ndryshimet kryesore në këtë version: Kryesisht ndreqje të metash, veçanërisht ndreqje mosshfaqjeje mesazhesh te rrjedha kohore. +Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/sq/changelogs/40105250.txt b/fastlane/metadata/android/sq/changelogs/40105250.txt new file mode 100644 index 0000000000..57b49e89c8 --- /dev/null +++ b/fastlane/metadata/android/sq/changelogs/40105250.txt @@ -0,0 +1,2 @@ +Ndryshimet kryesore në këtë version: Kryesisht ndreqje të metash, veçanërisht ndreqje mosshfaqjeje mesazhesh te rrjedha kohore. +Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases From 05c16dd09a7bc35c9e581a7858895c4bcaa006b3 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:08:22 +0100 Subject: [PATCH 092/153] Reducing size of the empty title in poll list screen --- vector/src/main/res/layout/fragment_room_polls_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/layout/fragment_room_polls_list.xml b/vector/src/main/res/layout/fragment_room_polls_list.xml index 6a627d73b8..d92111456a 100644 --- a/vector/src/main/res/layout/fragment_room_polls_list.xml +++ b/vector/src/main/res/layout/fragment_room_polls_list.xml @@ -54,7 +54,7 @@ android:gravity="center" android:textAppearance="@style/TextAppearance.Vector.Body" android:textColor="?vctr_content_secondary" - android:textSize="17sp" + android:textSize="15sp" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" From c54de67e03a32d4abc6186b30fc09c42b12c7f22 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:29:14 +0100 Subject: [PATCH 093/153] Increase line spacing of the empty title in poll list screen --- vector/src/main/res/layout/fragment_room_polls_list.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/res/layout/fragment_room_polls_list.xml b/vector/src/main/res/layout/fragment_room_polls_list.xml index d92111456a..85077034ca 100644 --- a/vector/src/main/res/layout/fragment_room_polls_list.xml +++ b/vector/src/main/res/layout/fragment_room_polls_list.xml @@ -55,6 +55,7 @@ android:textAppearance="@style/TextAppearance.Vector.Body" android:textColor="?vctr_content_secondary" android:textSize="15sp" + android:lineSpacingMultiplier="1.2" android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" From b0c8008fe0e0ec637219e5166345eb47c1c81083 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 1 Mar 2023 10:40:53 +0100 Subject: [PATCH 094/153] Adding changelog entry --- changelog.d/8190.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8190.bugfix diff --git a/changelog.d/8190.bugfix b/changelog.d/8190.bugfix new file mode 100644 index 0000000000..95790f7c0c --- /dev/null +++ b/changelog.d/8190.bugfix @@ -0,0 +1 @@ +[Poll history] Fixing small issue about font style From ccf971afc4df8231846cf7835dcdc18efa1ecc43 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Mar 2023 10:42:57 +0100 Subject: [PATCH 095/153] Update encrypted raw json with decrypted event content for event matching condition --- .../session/pushrules/EventMatchCondition.kt | 16 ++++++- .../pushrules/PushRulesConditionTest.kt | 48 ++++++++++++++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index 157cee8219..d637b4d0bb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -39,8 +39,20 @@ class EventMatchCondition( override fun technicalDescription() = "'$key' matches '$pattern'" fun isSatisfied(event: Event): Boolean { - val rawJson: Map<*, *> = event.mxDecryptionResult?.payload - ?: MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *> + val rawJson: Map<*, *> = (MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *>) + ?.let { rawJson -> + val decryptedRawJson = event.mxDecryptionResult?.payload + if (decryptedRawJson != null) { + rawJson + .toMutableMap() + .apply { + set("type", decryptedRawJson["type"]) + set("content", decryptedRawJson["content"]) + } + } else { + rawJson + } + } ?: return false val value = extractField(rawJson, key) ?: return false diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt index 3ddf940241..b1a61875fb 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt @@ -23,7 +23,11 @@ import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test import org.matrix.android.sdk.MatrixTest +import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM +import org.matrix.android.sdk.api.session.crypto.model.OlmDecryptionResult import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.api.session.room.members.MembershipService @@ -38,12 +42,25 @@ class PushRulesConditionTest : MatrixTest { * Test EventMatchCondition * ========================================================================================== */ + private fun createFakeEncryptedEvent() = Event( + type = EventType.ENCRYPTED, + eventId = "mx0", + roomId = "!fakeRoom", + content = EncryptedEventContent( + algorithm = MXCRYPTO_ALGORITHM_MEGOLM, + ciphertext = "AwgBEpACQEKOkd4Gp0+gSXG4M+btcrnPgsF23xs/lUmS2I4YjmqF...", + sessionId = "TO2G4u2HlnhtbIJk", + senderKey = "5e3EIqg3JfooZnLQ2qHIcBarbassQ4qXblai0", + deviceId = "FAKEE" + ).toContent() + ) + private fun createSimpleTextEvent(text: String): Event { return Event( - type = "m.room.message", + type = EventType.MESSAGE, eventId = "mx0", content = MessageTextContent("m.text", text).toContent(), - originServerTs = 0 + originServerTs = 0, ) } @@ -155,6 +172,33 @@ class PushRulesConditionTest : MatrixTest { } } + @Test + fun test_decrypted_eventmatch_type_condition() { + val condition = EventMatchCondition("type", "m.room.message") + + val simpleDecryptedTextEvent = createFakeEncryptedEvent().apply { + mxDecryptionResult = OlmDecryptionResult( + payload = mapOf( + "type" to EventType.MESSAGE, + "content" to MessageTextContent("m.text", "Yo wtf?").toContent(), + ), + senderKey = "the_real_sender_key", + ) + } + val decryptedDummyEvent = createFakeEncryptedEvent().apply { + mxDecryptionResult = OlmDecryptionResult( + payload = mapOf( + "type" to EventType.DUMMY, + ) + ) + } + val encryptedEvent = createFakeEncryptedEvent() + + assert(condition.isSatisfied(simpleDecryptedTextEvent)) + assertFalse(condition.isSatisfied(decryptedDummyEvent)) + assertFalse(condition.isSatisfied(encryptedEvent)) + } + /* ========================================================================================== * Test RoomMemberCountCondition * ========================================================================================== */ From 75559fb21a353e4e97568f6f70c4cf461242b453 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Mar 2023 11:49:43 +0100 Subject: [PATCH 096/153] Ensure the event is decrypted before applying push rules --- .../android/sdk/api/session/pushrules/EventMatchCondition.kt | 5 +---- .../org/matrix/android/sdk/internal/crypto/EventDecryptor.kt | 1 + .../internal/session/pushrules/ProcessEventForPushTask.kt | 5 ++++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index d637b4d0bb..c3ddbf14b3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -45,10 +45,7 @@ class EventMatchCondition( if (decryptedRawJson != null) { rawJson .toMutableMap() - .apply { - set("type", decryptedRawJson["type"]) - set("content", decryptedRawJson["content"]) - } + .apply { putAll(decryptedRawJson) } } else { rawJson } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt index 03672ae81c..ff3ae1890d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt @@ -94,6 +94,7 @@ internal class EventDecryptor @Inject constructor( * @param timeline the id of the timeline where the event is decrypted. It is used to prevent replay attack. */ suspend fun decryptEventAndSaveResult(event: Event, timeline: String) { + if (event.type == EventType.ENCRYPTED && event.mxDecryptionResult != null) return tryOrNull(message = "Unable to decrypt the event") { decryptEvent(event, timeline) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt index 3dfac694ed..7f1acfe0b5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt @@ -21,6 +21,7 @@ import org.matrix.android.sdk.api.session.events.model.isInvitation import org.matrix.android.sdk.api.session.pushrules.PushEvents import org.matrix.android.sdk.api.session.pushrules.rest.PushRule import org.matrix.android.sdk.api.session.sync.model.RoomsSyncResponse +import org.matrix.android.sdk.internal.crypto.EventDecryptor import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.task.Task import timber.log.Timber @@ -36,7 +37,8 @@ internal interface ProcessEventForPushTask : Task + eventDecryptor.decryptEventAndSaveResult(event, "") pushRuleFinder.fulfilledBingRule(event, params.rules)?.let { Timber.v("[PushRules] Rule $it match for event ${event.eventId}") event to it From 891897f0a7ea179b93e18f76d421217d2dfa19f6 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Mar 2023 13:50:40 +0100 Subject: [PATCH 097/153] Add additional tests --- .../pushrules/PushRulesConditionTest.kt | 89 ++++++++++++++----- 1 file changed, 68 insertions(+), 21 deletions(-) diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt index b1a61875fb..50d084755b 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt @@ -64,6 +64,18 @@ class PushRulesConditionTest : MatrixTest { ) } + private fun createSimpleTextEventEncrypted(text: String): Event { + return createFakeEncryptedEvent().apply { + mxDecryptionResult = OlmDecryptionResult( + payload = mapOf( + "type" to EventType.MESSAGE, + "content" to MessageTextContent("m.text", text).toContent(), + ), + senderKey = "the_real_sender_key", + ) + } + } + @Test fun test_eventmatch_type_condition() { val condition = EventMatchCondition("type", "m.room.message") @@ -87,6 +99,26 @@ class PushRulesConditionTest : MatrixTest { assertFalse(condition.isSatisfied(simpleRoomMemberEvent)) } + @Test + fun test_decrypted_eventmatch_type_condition() { + val condition = EventMatchCondition("type", "m.room.message") + + val simpleDecryptedTextEvent = createSimpleTextEventEncrypted("Yo wtf?") + + val encryptedDummyEvent = createFakeEncryptedEvent().apply { + mxDecryptionResult = OlmDecryptionResult( + payload = mapOf( + "type" to EventType.DUMMY, + ) + ) + } + val encryptedEvent = createFakeEncryptedEvent() + + assert(condition.isSatisfied(simpleDecryptedTextEvent)) + assertFalse(condition.isSatisfied(encryptedDummyEvent)) + assertFalse(condition.isSatisfied(encryptedEvent)) + } + @Test fun test_eventmatch_path_condition() { val condition = EventMatchCondition("content.msgtype", "m.text") @@ -142,6 +174,22 @@ class PushRulesConditionTest : MatrixTest { assert(condition.isSatisfied(createSimpleTextEvent("BEN"))) } + @Test + fun test_encrypted_eventmatch_words_only_condition() { + val condition = EventMatchCondition("content.body", "ben") + + assertFalse(condition.isSatisfied(createSimpleTextEventEncrypted("benoit"))) + assertFalse(condition.isSatisfied(createSimpleTextEventEncrypted("Hello benoit"))) + assertFalse(condition.isSatisfied(createSimpleTextEventEncrypted("superben"))) + + assert(condition.isSatisfied(createSimpleTextEventEncrypted("ben"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("hello ben"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("ben is there"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("hello ben!"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("hello Ben!"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("BEN"))) + } + @Test fun test_eventmatch_at_room_condition() { val condition = EventMatchCondition("content.body", "@room") @@ -157,6 +205,21 @@ class PushRulesConditionTest : MatrixTest { assert(condition.isSatisfied(createSimpleTextEvent("Don't ping @room!"))) } + @Test + fun test_encrypted_eventmatch_at_room_condition() { + val condition = EventMatchCondition("content.body", "@room") + + assertFalse(condition.isSatisfied(createSimpleTextEventEncrypted("@roomba"))) + assertFalse(condition.isSatisfied(createSimpleTextEventEncrypted("room benoit"))) + assertFalse(condition.isSatisfied(createSimpleTextEventEncrypted("abc@roomba"))) + + assert(condition.isSatisfied(createSimpleTextEventEncrypted("@room"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("@room, ben"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("@ROOM"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("Use:@room"))) + assert(condition.isSatisfied(createSimpleTextEventEncrypted("Don't ping @room!"))) + } + @Test fun test_notice_condition() { val conditionEqual = EventMatchCondition("content.msgtype", "m.notice") @@ -173,30 +236,14 @@ class PushRulesConditionTest : MatrixTest { } @Test - fun test_decrypted_eventmatch_type_condition() { - val condition = EventMatchCondition("type", "m.room.message") + fun test_eventmatch_encrypted_type_condition() { + val condition = EventMatchCondition("type", "m.room.encrypted") - val simpleDecryptedTextEvent = createFakeEncryptedEvent().apply { - mxDecryptionResult = OlmDecryptionResult( - payload = mapOf( - "type" to EventType.MESSAGE, - "content" to MessageTextContent("m.text", "Yo wtf?").toContent(), - ), - senderKey = "the_real_sender_key", - ) - } - val decryptedDummyEvent = createFakeEncryptedEvent().apply { - mxDecryptionResult = OlmDecryptionResult( - payload = mapOf( - "type" to EventType.DUMMY, - ) - ) - } + val simpleDecryptedTextEvent = createSimpleTextEventEncrypted("Yo wtf?") val encryptedEvent = createFakeEncryptedEvent() - assert(condition.isSatisfied(simpleDecryptedTextEvent)) - assertFalse(condition.isSatisfied(decryptedDummyEvent)) - assertFalse(condition.isSatisfied(encryptedEvent)) + assertFalse(condition.isSatisfied(simpleDecryptedTextEvent)) + assert(condition.isSatisfied(encryptedEvent)) } /* ========================================================================================== From 245ca1304994bcee92425448d891702acfc98fb4 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Mar 2023 13:52:53 +0100 Subject: [PATCH 098/153] Improve encryption check condition --- .../matrix/android/sdk/internal/crypto/EventDecryptor.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt index ff3ae1890d..ac9c61a32a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt @@ -94,8 +94,10 @@ internal class EventDecryptor @Inject constructor( * @param timeline the id of the timeline where the event is decrypted. It is used to prevent replay attack. */ suspend fun decryptEventAndSaveResult(event: Event, timeline: String) { - if (event.type == EventType.ENCRYPTED && event.mxDecryptionResult != null) return - tryOrNull(message = "Unable to decrypt the event") { + // event is not encrypted or already decrypted + if (event.getClearType() != EventType.ENCRYPTED) return + + tryOrNull(message = "decryptEventAndSaveResult | Unable to decrypt the event") { decryptEvent(event, timeline) } ?.let { result -> From 448374fc5835e6e8cd600d858504a8f9a3b697c6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 1 Mar 2023 21:17:24 +0100 Subject: [PATCH 099/153] Be able to let the user trust several Fingerprints during login flow. It was the case before, see `LoginViewModel.handleUserAcceptCertificate(...)` --- .../HomeServerConnectionConfigFactory.kt | 10 ++-------- .../onboarding/OnboardingViewModel.kt | 11 ++++++---- .../onboarding/OnboardingViewModelTest.kt | 20 +++++++++---------- .../FakeHomeServerConnectionConfigFactory.kt | 4 ++-- 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/login/HomeServerConnectionConfigFactory.kt b/vector/src/main/java/im/vector/app/features/login/HomeServerConnectionConfigFactory.kt index 253c514e5a..c8cd6df4ca 100644 --- a/vector/src/main/java/im/vector/app/features/login/HomeServerConnectionConfigFactory.kt +++ b/vector/src/main/java/im/vector/app/features/login/HomeServerConnectionConfigFactory.kt @@ -23,7 +23,7 @@ import javax.inject.Inject class HomeServerConnectionConfigFactory @Inject constructor() { - fun create(url: String?, fingerprint: Fingerprint? = null): HomeServerConnectionConfig? { + fun create(url: String?, fingerprints: List? = null): HomeServerConnectionConfig? { if (url == null) { return null } @@ -31,13 +31,7 @@ class HomeServerConnectionConfigFactory @Inject constructor() { return try { HomeServerConnectionConfig.Builder() .withHomeServerUri(url) - .run { - if (fingerprint == null) { - this - } else { - withAllowedFingerPrints(listOf(fingerprint)) - } - } + .withAllowedFingerPrints(fingerprints) .build() } catch (t: Throwable) { Timber.e(t) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 9c64b5ed87..fc6878ffd2 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -160,6 +160,8 @@ class OnboardingViewModel @AssistedInject constructor( private var emailVerificationPollingJob: Job? by cancelCurrentOnSet() private var currentJob: Job? by cancelCurrentOnSet() + private val trustedFingerprints = mutableListOf() + override fun handle(action: OnboardingAction) { when (action) { is OnboardingAction.SplashAction -> handleSplashAction(action) @@ -293,13 +295,14 @@ class OnboardingViewModel @AssistedInject constructor( private fun handleUserAcceptCertificate(action: OnboardingAction.UserAcceptCertificate) { // It happens when we get the login flow, or during direct authentication. // So alter the homeserver config and retrieve again the login flow + trustedFingerprints.add(action.fingerprint) when (action.retryAction) { - is OnboardingAction.HomeServerChange -> handleHomeserverChange(action.retryAction, fingerprint = action.fingerprint) + is OnboardingAction.HomeServerChange -> handleHomeserverChange(action.retryAction, fingerprints = trustedFingerprints) is AuthenticateAction.LoginDirect -> handleDirectLogin( action.retryAction, // Will be replaced by the task - homeServerConnectionConfigFactory.create("https://dummy.org", action.fingerprint) + homeServerConnectionConfigFactory.create("https://dummy.org", trustedFingerprints) ) else -> Unit } @@ -696,10 +699,10 @@ class OnboardingViewModel @AssistedInject constructor( private fun handleHomeserverChange( action: OnboardingAction.HomeServerChange, serverTypeOverride: ServerType? = null, - fingerprint: Fingerprint? = null, + fingerprints: List? = null, postAction: suspend () -> Unit = {}, ) { - val homeServerConnectionConfig = homeServerConnectionConfigFactory.create(action.homeServerUrl, fingerprint) + val homeServerConnectionConfig = homeServerConnectionConfigFactory.create(action.homeServerUrl, fingerprints) if (homeServerConnectionConfig == null) { // This is invalid _viewEvents.post(OnboardingViewEvents.Failure(Throwable("Unable to create a HomeServerConnectionConfig"))) diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt index bbca6e2aa6..a4afab8488 100644 --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt @@ -621,7 +621,7 @@ class OnboardingViewModelTest { @Test fun `when editing homeserver errors with certificate error, then emits error`() = runTest { - fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, fingerprint = null, A_HOMESERVER_CONFIG) + fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, fingerprints = null, A_HOMESERVER_CONFIG) fakeStartAuthenticationFlowUseCase.givenErrors(A_HOMESERVER_CONFIG, AN_UNRECOGNISED_CERTIFICATE_ERROR) val editAction = OnboardingAction.HomeServerChange.EditHomeServer(A_HOMESERVER_URL) val test = viewModel.test() @@ -640,7 +640,7 @@ class OnboardingViewModelTest { @Test fun `when selecting homeserver errors with certificate error, then emits error`() = runTest { - fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, fingerprint = null, A_HOMESERVER_CONFIG) + fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, fingerprints = null, A_HOMESERVER_CONFIG) fakeStartAuthenticationFlowUseCase.givenErrors(A_HOMESERVER_CONFIG, AN_UNRECOGNISED_CERTIFICATE_ERROR) val selectAction = OnboardingAction.HomeServerChange.SelectHomeServer(A_HOMESERVER_URL) val test = viewModel.test() @@ -842,7 +842,7 @@ class OnboardingViewModelTest { A_HOMESERVER_URL, SELECTED_HOMESERVER_STATE, config = A_HOMESERVER_CONFIG.copy(allowedFingerprints = listOf(A_FINGERPRINT)), - fingerprint = A_FINGERPRINT, + fingerprints = listOf(A_FINGERPRINT), ) viewModel.handle(OnboardingAction.UserAcceptCertificate(A_FINGERPRINT, OnboardingAction.HomeServerChange.SelectHomeServer(A_HOMESERVER_URL))) @@ -866,7 +866,7 @@ class OnboardingViewModelTest { A_HOMESERVER_URL, SELECTED_HOMESERVER_STATE, config = A_HOMESERVER_CONFIG.copy(allowedFingerprints = listOf(A_FINGERPRINT)), - fingerprint = A_FINGERPRINT, + fingerprints = listOf(A_FINGERPRINT), ) val test = viewModel.test() @@ -886,7 +886,7 @@ class OnboardingViewModelTest { @Test fun `given DirectLogin retry action, when accepting user certificate, then logs in directly`() = runTest { - fakeHomeServerConnectionConfigFactory.givenConfigFor("https://dummy.org", A_FINGERPRINT, A_HOMESERVER_CONFIG) + fakeHomeServerConnectionConfigFactory.givenConfigFor("https://dummy.org", listOf(A_FINGERPRINT), A_HOMESERVER_CONFIG) fakeDirectLoginUseCase.givenSuccessResult(A_DIRECT_LOGIN, config = A_HOMESERVER_CONFIG, result = fakeSession) givenInitialisesSession(fakeSession) val test = viewModel.test() @@ -1175,16 +1175,16 @@ class OnboardingViewModelTest { homeserverUrl: String, resultingState: SelectedHomeserverState, config: HomeServerConnectionConfig = A_HOMESERVER_CONFIG, - fingerprint: Fingerprint? = null, + fingerprints: List? = null, ) { - fakeHomeServerConnectionConfigFactory.givenConfigFor(homeserverUrl, fingerprint, config) + fakeHomeServerConnectionConfigFactory.givenConfigFor(homeserverUrl, fingerprints, config) fakeStartAuthenticationFlowUseCase.givenResult(config, StartAuthenticationResult(isHomeserverOutdated = false, resultingState)) givenRegistrationResultFor(RegisterAction.StartRegistration, RegistrationActionHandler.Result.StartRegistration) fakeHomeServerHistoryService.expectUrlToBeAdded(config.homeServerUri.toString()) } private fun givenUpdatingHomeserverErrors(homeserverUrl: String, resultingState: SelectedHomeserverState, error: Throwable) { - fakeHomeServerConnectionConfigFactory.givenConfigFor(homeserverUrl, fingerprint = null, A_HOMESERVER_CONFIG) + fakeHomeServerConnectionConfigFactory.givenConfigFor(homeserverUrl, fingerprints = null, A_HOMESERVER_CONFIG) fakeStartAuthenticationFlowUseCase.givenResult(A_HOMESERVER_CONFIG, StartAuthenticationResult(isHomeserverOutdated = false, resultingState)) givenRegistrationResultFor(RegisterAction.StartRegistration, RegistrationActionHandler.Result.Error(error)) fakeHomeServerHistoryService.expectUrlToBeAdded(A_HOMESERVER_CONFIG.homeServerUri.toString()) @@ -1209,13 +1209,13 @@ class OnboardingViewModelTest { private fun givenHomeserverSelectionFailsWithNetworkError() { fakeContext.givenHasConnection() - fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, fingerprint = null, A_HOMESERVER_CONFIG) + fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, fingerprints = null, A_HOMESERVER_CONFIG) fakeStartAuthenticationFlowUseCase.givenHomeserverUnavailable(A_HOMESERVER_CONFIG) } private fun givenHomeserverSelectionFailsWith(cause: Throwable) { fakeContext.givenHasConnection() - fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, fingerprint = null, A_HOMESERVER_CONFIG) + fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, fingerprints = null, A_HOMESERVER_CONFIG) fakeStartAuthenticationFlowUseCase.givenErrors(A_HOMESERVER_CONFIG, cause) } } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeHomeServerConnectionConfigFactory.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeHomeServerConnectionConfigFactory.kt index c0cfe5375b..7e34ae33c3 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeHomeServerConnectionConfigFactory.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeHomeServerConnectionConfigFactory.kt @@ -25,7 +25,7 @@ import org.matrix.android.sdk.api.network.ssl.Fingerprint class FakeHomeServerConnectionConfigFactory { val instance: HomeServerConnectionConfigFactory = mockk() - fun givenConfigFor(url: String, fingerprint: Fingerprint? = null, config: HomeServerConnectionConfig) { - every { instance.create(url, fingerprint) } returns config + fun givenConfigFor(url: String, fingerprints: List? = null, config: HomeServerConnectionConfig) { + every { instance.create(url, fingerprints) } returns config } } From 7388279eb72f97d39654a08fff7fa26e41f13d2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Mar 2023 00:00:34 +0000 Subject: [PATCH 100/153] Bump flipper from 0.182.0 to 0.183.0 Bumps `flipper` from 0.182.0 to 0.183.0. Updates `com.facebook.flipper:flipper` from 0.182.0 to 0.183.0 - [Release notes](https://github.com/facebook/flipper/releases) - [Commits](https://github.com/facebook/flipper/compare/v0.182.0...v0.183.0) Updates `com.facebook.flipper:flipper-network-plugin` from 0.182.0 to 0.183.0 - [Release notes](https://github.com/facebook/flipper/releases) - [Commits](https://github.com/facebook/flipper/compare/v0.182.0...v0.183.0) --- updated-dependencies: - dependency-name: com.facebook.flipper:flipper dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.facebook.flipper:flipper-network-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 1f3009da57..9a6920f5c5 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -18,7 +18,7 @@ def markwon = "4.6.2" def moshi = "1.14.0" def lifecycle = "2.5.1" def flowBinding = "1.2.0" -def flipper = "0.182.0" +def flipper = "0.183.0" def epoxy = "5.0.0" def mavericks = "3.0.1" def glide = "4.14.2" From c4a540722b69de2f952c845963eeafbae00f7759 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Mar 2023 11:14:05 +0000 Subject: [PATCH 101/153] Bump org.owasp:dependency-check-gradle from 8.1.1 to 8.1.2 Bumps org.owasp:dependency-check-gradle from 8.1.1 to 8.1.2. --- updated-dependencies: - dependency-name: org.owasp:dependency-check-gradle dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9b6136e94f..285713cacf 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ buildscript { classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.0.0.2929' classpath 'com.google.android.gms:oss-licenses-plugin:0.10.6' classpath "com.likethesalad.android:stem-plugin:2.3.0" - classpath 'org.owasp:dependency-check-gradle:8.1.1' + classpath 'org.owasp:dependency-check-gradle:8.1.2' classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.20" classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0" classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3' From 182aa2a9ca2c2085ccb7d61b820dcb6b193b1fa0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 2 Mar 2023 12:30:44 +0100 Subject: [PATCH 102/153] Fix API break. --- .../im/vector/app/features/location/MapBoxMapExt.kt | 13 +++++++------ .../main/res/layout/fragment_location_preview.xml | 2 +- .../main/res/layout/fragment_location_sharing.xml | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/location/MapBoxMapExt.kt b/vector/src/main/java/im/vector/app/features/location/MapBoxMapExt.kt index 8e917c665a..5a6e69b103 100644 --- a/vector/src/main/java/im/vector/app/features/location/MapBoxMapExt.kt +++ b/vector/src/main/java/im/vector/app/features/location/MapBoxMapExt.kt @@ -17,6 +17,7 @@ package im.vector.app.features.location import com.mapbox.mapboxsdk.camera.CameraPosition +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory import com.mapbox.mapboxsdk.constants.MapboxConstants import com.mapbox.mapboxsdk.geometry.LatLng import com.mapbox.mapboxsdk.geometry.LatLngBounds @@ -28,12 +29,12 @@ fun MapboxMap?.zoomToLocation(locationData: LocationData, preserveCurrentZoomLev } else { INITIAL_MAP_ZOOM_IN_PREVIEW } - this?.easeCamera { - CameraPosition.Builder() - .target(LatLng(locationData.latitude, locationData.longitude)) - .zoom(zoomLevel) - .build() - } + val expectedCameraPosition = CameraPosition.Builder() + .target(LatLng(locationData.latitude, locationData.longitude)) + .zoom(zoomLevel) + .build() + val cameraUpdate = CameraUpdateFactory.newCameraPosition(expectedCameraPosition) + this?.easeCamera(cameraUpdate) } fun MapboxMap?.zoomToBounds(latLngBounds: LatLngBounds) { diff --git a/vector/src/main/res/layout/fragment_location_preview.xml b/vector/src/main/res/layout/fragment_location_preview.xml index e70baa1581..6addcc9c73 100644 --- a/vector/src/main/res/layout/fragment_location_preview.xml +++ b/vector/src/main/res/layout/fragment_location_preview.xml @@ -12,7 +12,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:mapbox_renderTextureMode="true" + app:maplibre_renderTextureMode="true" app:showLocateButton="true" /> From 084bd44348cef8e9bd791e35f04f667452a371d9 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Thu, 2 Mar 2023 14:40:31 +0100 Subject: [PATCH 103/153] Update decryption result on the events from the sync response As the decryption is done on a copy of the event (containing the roomId), we have to update the initial event with the decryption result --- .../internal/session/pushrules/ProcessEventForPushTask.kt | 5 ++--- .../internal/session/sync/handler/room/RoomSyncHandler.kt | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt index 7f1acfe0b5..d000d709a9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt @@ -45,14 +45,14 @@ internal class DefaultProcessEventForPushTask @Inject constructor( val newJoinEvents = params.syncResponse.join .mapNotNull { (key, value) -> value.timeline?.events?.mapNotNull { - it.takeIf { !it.isInvitation() }?.copy(roomId = key) + it.takeIf { !it.isInvitation() }?.copyAll(roomId = key) } } .flatten() val inviteEvents = params.syncResponse.invite .mapNotNull { (key, value) -> - value.inviteState?.events?.map { it.copy(roomId = key) } + value.inviteState?.events?.map { it.copyAll(roomId = key) } } .flatten() @@ -75,7 +75,6 @@ internal class DefaultProcessEventForPushTask @Inject constructor( " to check for push rules with ${params.rules.size} rules" ) val matchedEvents = allEvents.mapNotNull { event -> - eventDecryptor.decryptEventAndSaveResult(event, "") pushRuleFinder.fulfilledBingRule(event, params.rules)?.let { Timber.v("[PushRules] Rule $it match for event ${event.eventId}") event to it diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index 5e4886ce1e..f37e384b51 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -437,6 +437,10 @@ internal class RoomSyncHandler @Inject constructor( if (event.isEncrypted() && !isInitialSync) { try { decryptIfNeeded(event, roomId) + // share the decryption result with the rawEvent because the decryption is done on a copy containing the roomId, see previous comment + rawEvent.mxDecryptionResult = event.mxDecryptionResult + rawEvent.mCryptoError = event.mCryptoError + rawEvent.mCryptoErrorReason = event.mCryptoErrorReason } catch (e: InterruptedException) { Timber.i("Decryption got interrupted") } From 15cfb5e85e56fa77da3d8a696bbf85fd82da5309 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 1 Mar 2023 06:20:10 +0000 Subject: [PATCH 104/153] Translated using Weblate (Czech) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/ --- library/ui-strings/src/main/res/values-cs/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-cs/strings.xml b/library/ui-strings/src/main/res/values-cs/strings.xml index efb7928eae..00303591b7 100644 --- a/library/ui-strings/src/main/res/values-cs/strings.xml +++ b/library/ui-strings/src/main/res/values-cs/strings.xml @@ -2988,4 +2988,5 @@ Nelze dešifrovat toto hlasové vysílání. Údaje o vašem účtu jsou spravovány odděleně na adrese %1$s. Účet + Při aktualizaci předvoleb oznámení došlo k chybě. Zkuste to prosím znovu. \ No newline at end of file From 9cd6fae7d30c59b46da4695bb8154d62788c4b82 Mon Sep 17 00:00:00 2001 From: Vri Date: Wed, 1 Mar 2023 06:48:58 +0000 Subject: [PATCH 105/153] Translated using Weblate (German) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- library/ui-strings/src/main/res/values-de/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 911d1dee78..971344a863 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -2927,4 +2927,5 @@ Codeblock umschalten Konto Deine Kontodetails werden separat verwaltet bei %1$s. + Ein Fehler ist während der Aktualisierung deiner Benachrichtigungseinstellungen aufgetreten. Bitte versuche es erneut. \ No newline at end of file From 971aa069ddbaeb4ecc68d4780e2cfc661ad6ac21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 1 Mar 2023 14:10:05 +0000 Subject: [PATCH 106/153] Translated using Weblate (Estonian) Currently translated at 99.6% (2599 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/et/ --- library/ui-strings/src/main/res/values-et/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index 98a9733c6d..8e304efbda 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -2919,4 +2919,5 @@ Eemalda taandrida Lülita tsiteerimine sisse/välja Lülita koodiblokk sisse/välja + Sinu teavituste seadistuste muutmisel tekkis viga. Palu proovi uuesti. \ No newline at end of file From 721faa1febd5544101aa00c3e9ee8ab97aa0758a Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Wed, 1 Mar 2023 07:02:21 +0000 Subject: [PATCH 107/153] Translated using Weblate (Persian) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- library/ui-strings/src/main/res/values-fa/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index 4348cacf76..8e15009c81 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -2928,4 +2928,5 @@ حساب ناتوان در رمزگشایی این پخش صوتی. جزییات حسابتان جداگانه در %1$s مدیریت می‌شود. + هنگام به‌روز رسانی ترجیحات آگاهیتان خطایی رخ داد. لطفاً دوباره تلاش کنید. \ No newline at end of file From dc4c5bcc5d8eb4b88a96b7a3dab0ad0ad5f5e0ef Mon Sep 17 00:00:00 2001 From: Glandos Date: Wed, 1 Mar 2023 09:32:05 +0000 Subject: [PATCH 108/153] Translated using Weblate (French) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/ --- library/ui-strings/src/main/res/values-fr/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml index 7bbc23a747..3d08c58820 100644 --- a/library/ui-strings/src/main/res/values-fr/strings.xml +++ b/library/ui-strings/src/main/res/values-fr/strings.xml @@ -2928,4 +2928,5 @@ Impossible de déchiffrer cette diffusion audio. Les détails de votre compte sont gérés séparément sur %1$s. Compte + Nous avons rencontré une erreur lors de la mise-à-jour de vos préférences de notification. Veuillez réessayer. \ No newline at end of file From 83e0eefa1dae9bd7f1dae8dc1dc4106892b1f31a Mon Sep 17 00:00:00 2001 From: Linerly Date: Wed, 1 Mar 2023 13:51:44 +0000 Subject: [PATCH 109/153] Translated using Weblate (Indonesian) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/id/ --- library/ui-strings/src/main/res/values-in/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml index 66adb6737f..3d8d1b25be 100644 --- a/library/ui-strings/src/main/res/values-in/strings.xml +++ b/library/ui-strings/src/main/res/values-in/strings.xml @@ -2870,4 +2870,5 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Tidak dapat mendekripsi siaran suara ini. Detail akun Anda dikelola secara terpisah di %1$s. Akun + Terjadi kesalahan saat memperbarui preferensi notifikasi Anda. Silakan coba lagi. \ No newline at end of file From acaf39d712ecd497535739053bb9e306e80fa31d Mon Sep 17 00:00:00 2001 From: Piotr Strebski Date: Thu, 2 Mar 2023 09:24:43 +0000 Subject: [PATCH 110/153] Translated using Weblate (Polish) Currently translated at 92.7% (2418 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- library/ui-strings/src/main/res/values-pl/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-pl/strings.xml b/library/ui-strings/src/main/res/values-pl/strings.xml index 2bdd6e806d..0c87b20780 100644 --- a/library/ui-strings/src/main/res/values-pl/strings.xml +++ b/library/ui-strings/src/main/res/values-pl/strings.xml @@ -2827,4 +2827,5 @@ Witaj w ${app_name}, \n%s. Wszechstronna, bezpieczna aplikacja do czatowania dla zespołów, przyjaciół i organizacji. Utwórz czat lub dołącz do istniejącego pokoju, aby rozpocząć. + Twój token dostępu zapewnia pełny dostęp do Twojego konta. Nie udostępniaj go nikomu. \ No newline at end of file From 46daf90ff016abb69e0db2096b6034666bc3839a Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Wed, 1 Mar 2023 07:07:08 +0000 Subject: [PATCH 111/153] Translated using Weblate (Slovak) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- library/ui-strings/src/main/res/values-sk/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml index 819308c900..d825518e0f 100644 --- a/library/ui-strings/src/main/res/values-sk/strings.xml +++ b/library/ui-strings/src/main/res/values-sk/strings.xml @@ -2988,4 +2988,5 @@ Toto hlasové vysielanie sa nedá dešifrovať. Údaje o vašom účte sú spravované samostatne na %1$s. Účet + Pri aktualizácii vašich predvolieb oznámení došlo k chybe. Skúste prosím znova. \ No newline at end of file From 838968d337ac34c3cc1934601a9c867bd176101e Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 1 Mar 2023 09:35:14 +0000 Subject: [PATCH 112/153] Translated using Weblate (Albanian) Currently translated at 99.3% (2591 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sq/ --- library/ui-strings/src/main/res/values-sq/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-sq/strings.xml b/library/ui-strings/src/main/res/values-sq/strings.xml index 9b22f97af1..50f7543f67 100644 --- a/library/ui-strings/src/main/res/values-sq/strings.xml +++ b/library/ui-strings/src/main/res/values-sq/strings.xml @@ -2914,4 +2914,5 @@ S’arrihet të shfeshtëzohet ky transmetim zanor. Hollësitë e llogarisë tuaj administrohen më vete, te %1$s. Llogari + Ndodhi një gabim, kur u përditësuan parapëlqimet tuaja për njoftime. Ju lutemi, riprovoni. \ No newline at end of file From 5bb0e1278d206a3941cb51333c08b8025c394f07 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 1 Mar 2023 00:12:27 +0000 Subject: [PATCH 113/153] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- library/ui-strings/src/main/res/values-uk/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml index ac44d84d63..9df054e1bd 100644 --- a/library/ui-strings/src/main/res/values-uk/strings.xml +++ b/library/ui-strings/src/main/res/values-uk/strings.xml @@ -3048,4 +3048,5 @@ Неможливо розшифрувати цю голосову трансляцію. Керування подробицями вашого облікового запису відбувається окремо на %1$s. Обліковий запис + Сталася помилка під час оновлення налаштувань сповіщень. Повторіть спробу. \ No newline at end of file From 0b4cd619d42586faa5cfc0884f89d96df7e002b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E4=BA=91?= Date: Thu, 2 Mar 2023 13:22:48 +0000 Subject: [PATCH 114/153] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.4% (2567 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- library/ui-strings/src/main/res/values-zh-rCN/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index fea0900f71..52d5e5f17a 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -1883,7 +1883,7 @@ 此别名当前无法被访问。 \n请稍后再试,或询问房间管理员你身份有权访问。 - 无论以何种方式加入 + 依然加入 加入空间 创建空间 暂且略过 From af042005ca39f8bae89abb8bc9d8d8a136fe1db6 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 1 Mar 2023 05:58:08 +0000 Subject: [PATCH 115/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- library/ui-strings/src/main/res/values-zh-rTW/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 5654831901..058a4e4507 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -2868,4 +2868,5 @@ 無法解密此語音廣播。 您的帳號詳細資訊已單獨於 %1$s 中管理。 帳號 + 更新您的通知偏好設定時發生錯誤。請再試一次。 \ No newline at end of file From 89bce099fe0f8f2412c7d71dde12200a4d849aa7 Mon Sep 17 00:00:00 2001 From: Vri Date: Wed, 1 Mar 2023 06:47:47 +0000 Subject: [PATCH 116/153] Translated using Weblate (German) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/de/ --- fastlane/metadata/android/de-DE/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/de-DE/changelogs/40105260.txt diff --git a/fastlane/metadata/android/de-DE/changelogs/40105260.txt b/fastlane/metadata/android/de-DE/changelogs/40105260.txt new file mode 100644 index 0000000000..71f4cbd484 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Die wichtigsten Änderungen in dieser Version: Hauptsächlich Fehlerbehebungen. +Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases From 94c4d68bbe4133ffd40dbdacccd568cce97dbfe0 Mon Sep 17 00:00:00 2001 From: Glandos Date: Wed, 1 Mar 2023 09:30:54 +0000 Subject: [PATCH 117/153] Translated using Weblate (French) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fr/ --- fastlane/metadata/android/fr-FR/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40105260.txt diff --git a/fastlane/metadata/android/fr-FR/changelogs/40105260.txt b/fastlane/metadata/android/fr-FR/changelogs/40105260.txt new file mode 100644 index 0000000000..2b066a3512 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : Principalement des corrections de bugs. +Intégralité des changements : https://github.com/vector-im/element-android/releases From 8a56ca082c408c19dffe115ba97a663d82817c17 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Wed, 1 Mar 2023 07:08:20 +0000 Subject: [PATCH 118/153] Translated using Weblate (Slovak) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sk/ --- fastlane/metadata/android/sk/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/sk/changelogs/40105260.txt diff --git a/fastlane/metadata/android/sk/changelogs/40105260.txt b/fastlane/metadata/android/sk/changelogs/40105260.txt new file mode 100644 index 0000000000..f857b15b9f --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Hlavne opravy chýb. +Celý zoznam zmien: https://github.com/vector-im/element-android/releases From a53f030ff26047564e40f2cddead2f3174895812 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 1 Mar 2023 00:13:31 +0000 Subject: [PATCH 119/153] Translated using Weblate (Ukrainian) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/ --- fastlane/metadata/android/uk/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/uk/changelogs/40105260.txt diff --git a/fastlane/metadata/android/uk/changelogs/40105260.txt b/fastlane/metadata/android/uk/changelogs/40105260.txt new file mode 100644 index 0000000000..608d8e7d37 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Основні зміни в цій версії: Виправлення помилок +Перелік усіх змін: https://github.com/vector-im/element-android/releases From c1c8606cac0147fae87637e45b7695c0dadf10e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 1 Mar 2023 14:11:01 +0000 Subject: [PATCH 120/153] Translated using Weblate (Estonian) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/et/ --- fastlane/metadata/android/et/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/et/changelogs/40105260.txt diff --git a/fastlane/metadata/android/et/changelogs/40105260.txt b/fastlane/metadata/android/et/changelogs/40105260.txt new file mode 100644 index 0000000000..396e654160 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: põhiliselt veaparandused. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases From 66239ead8458e905453274c1e35158efc1d0c70b Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Wed, 1 Mar 2023 07:03:31 +0000 Subject: [PATCH 121/153] Translated using Weblate (Persian) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/ --- fastlane/metadata/android/fa/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/fa/changelogs/40105260.txt diff --git a/fastlane/metadata/android/fa/changelogs/40105260.txt b/fastlane/metadata/android/fa/changelogs/40105260.txt new file mode 100644 index 0000000000..f3bb20cef8 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40105260.txt @@ -0,0 +1,2 @@ +تغییرات عمده در این نگارش: عمدتاً رفع اشکال. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases From df1dbb34193462258dea73b5f1fe03233400f0d0 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 1 Mar 2023 05:58:52 +0000 Subject: [PATCH 122/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/ --- fastlane/metadata/android/zh-TW/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40105260.txt diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105260.txt b/fastlane/metadata/android/zh-TW/changelogs/40105260.txt new file mode 100644 index 0000000000..5346472634 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40105260.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:主要是臭蟲修復。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases From d35cad0949438e48fe12a91440110a03f7653ae0 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 1 Mar 2023 06:20:31 +0000 Subject: [PATCH 123/153] Translated using Weblate (Czech) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/ --- fastlane/metadata/android/cs-CZ/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40105260.txt diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40105260.txt b/fastlane/metadata/android/cs-CZ/changelogs/40105260.txt new file mode 100644 index 0000000000..5c6d6cf466 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Hlavně opravy chyb. +Úplný seznam změn: https://github.com/vector-im/element-android/releases From f9492a227493b667089fdbff0f6715cecd293d1f Mon Sep 17 00:00:00 2001 From: Linerly Date: Wed, 1 Mar 2023 13:52:46 +0000 Subject: [PATCH 124/153] Translated using Weblate (Indonesian) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/id/ --- fastlane/metadata/android/id/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/id/changelogs/40105260.txt diff --git a/fastlane/metadata/android/id/changelogs/40105260.txt b/fastlane/metadata/android/id/changelogs/40105260.txt new file mode 100644 index 0000000000..329f1cc199 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Kebanyakan perbaikan kutu. +Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases From 7dd15af6d3c8c35969df8fbfacbf80a82c6c2431 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Thu, 2 Mar 2023 15:48:36 +0000 Subject: [PATCH 125/153] [Rich text editor] Add ability to insert GIFs from keyboard (#8185) Closes vector-im/verticals-internal#21 --- changelog.d/8185.feature | 1 + .../room/detail/composer/ComposerEditText.kt | 29 +++--------- .../detail/composer/RichTextComposerLayout.kt | 12 +++++ .../composer/images/UriContentListener.kt | 45 +++++++++++++++++++ 4 files changed, 64 insertions(+), 23 deletions(-) create mode 100644 changelog.d/8185.feature create mode 100644 vector/src/main/java/im/vector/app/features/home/room/detail/composer/images/UriContentListener.kt diff --git a/changelog.d/8185.feature b/changelog.d/8185.feature new file mode 100644 index 0000000000..3e1f10d438 --- /dev/null +++ b/changelog.d/8185.feature @@ -0,0 +1 @@ +[Rich text editor] Add ability to insert GIFs from keyboard \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt index 9e88882866..f0014f4ecd 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt @@ -17,7 +17,6 @@ package im.vector.app.features.home.room.detail.composer -import android.content.ClipData import android.content.Context import android.net.Uri import android.os.Build @@ -27,12 +26,12 @@ import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputConnection import androidx.annotation.RequiresApi import androidx.appcompat.widget.AppCompatEditText -import androidx.core.view.OnReceiveContentListener import androidx.core.view.ViewCompat import androidx.core.view.inputmethod.EditorInfoCompat import androidx.core.view.inputmethod.InputConnectionCompat import im.vector.app.core.extensions.ooi import im.vector.app.core.platform.SimpleTextWatcher +import im.vector.app.features.home.room.detail.composer.images.UriContentListener import im.vector.app.features.html.PillImageSpan import timber.log.Timber @@ -56,27 +55,11 @@ class ComposerEditText @JvmOverloads constructor( EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes) ic = InputConnectionCompat.createWrapper(this, ic, editorInfo) - val onReceiveContentListener = OnReceiveContentListener { _, payload -> - val split = payload.partition { item -> item.uri != null } - val uriContent = split.first - val remaining = split.second - - if (uriContent != null) { - val clip: ClipData = uriContent.clip - for (i in 0 until clip.itemCount) { - val uri = clip.getItemAt(i).uri - // ... app-specific logic to handle the URI ... - callback?.onRichContentSelected(uri) - } - } - // Return anything that we didn't handle ourselves. This preserves the default platform - // behavior for text and anything else for which we are not implementing custom handling. - // Return anything that we didn't handle ourselves. This preserves the default platform - // behavior for text and anything else for which we are not implementing custom handling. - remaining - } - - ViewCompat.setOnReceiveContentListener(this, mimeTypes, onReceiveContentListener) + ViewCompat.setOnReceiveContentListener( + this, + mimeTypes, + UriContentListener { callback?.onRichContentSelected(it) } + ) return ic } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/RichTextComposerLayout.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/RichTextComposerLayout.kt index a13ef25d62..a821458939 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/RichTextComposerLayout.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/RichTextComposerLayout.kt @@ -36,6 +36,7 @@ import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.constraintlayout.widget.ConstraintSet import androidx.core.text.toSpannable +import androidx.core.view.ViewCompat import androidx.core.view.isGone import androidx.core.view.isInvisible import androidx.core.view.isVisible @@ -47,6 +48,7 @@ import im.vector.app.core.extensions.showKeyboard import im.vector.app.core.utils.DimensionConverter import im.vector.app.databinding.ComposerRichTextLayoutBinding import im.vector.app.databinding.ViewRichTextMenuButtonBinding +import im.vector.app.features.home.room.detail.composer.images.UriContentListener import io.element.android.wysiwyg.EditorEditText import io.element.android.wysiwyg.inputhandlers.models.InlineFormat import io.element.android.wysiwyg.inputhandlers.models.LinkAction @@ -188,6 +190,16 @@ internal class RichTextComposerLayout @JvmOverloads constructor( views.plainTextComposerEditText.addTextChangedListener( TextChangeListener({ callback?.onTextChanged(it) }, { updateTextFieldBorder(isFullScreen) }) ) + ViewCompat.setOnReceiveContentListener( + views.richTextComposerEditText, + arrayOf("image/*"), + UriContentListener { callback?.onRichContentSelected(it) } + ) + ViewCompat.setOnReceiveContentListener( + views.plainTextComposerEditText, + arrayOf("image/*"), + UriContentListener { callback?.onRichContentSelected(it) } + ) disallowParentInterceptTouchEvent(views.richTextComposerEditText) disallowParentInterceptTouchEvent(views.plainTextComposerEditText) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/images/UriContentListener.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/images/UriContentListener.kt new file mode 100644 index 0000000000..da0152fd9e --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/images/UriContentListener.kt @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.home.room.detail.composer.images + +import android.content.ClipData +import android.net.Uri +import android.view.View +import androidx.core.view.ContentInfoCompat +import androidx.core.view.OnReceiveContentListener + +class UriContentListener( + private val onContent: (uri: Uri) -> Unit +) : OnReceiveContentListener { + override fun onReceiveContent(view: View, payload: ContentInfoCompat): ContentInfoCompat? { + val split = payload.partition { item -> item.uri != null } + val uriContent = split.first + val remaining = split.second + + if (uriContent != null) { + val clip: ClipData = uriContent.clip + for (i in 0 until clip.itemCount) { + val uri = clip.getItemAt(i).uri + // ... app-specific logic to handle the URI ... + onContent(uri) + } + } + // Return anything that we didn't handle ourselves. This preserves the default platform + // behavior for text and anything else for which we are not implementing custom handling. + return remaining + } +} From 446ed24bead9c77ae8f978f478e2e076c59d4a92 Mon Sep 17 00:00:00 2001 From: Yoan Pintas Date: Fri, 3 Mar 2023 10:28:50 +0100 Subject: [PATCH 126/153] Update room member shields behavior (#8195) --- changelog.d/8195.bugfix | 1 + .../session/crypto/model/CryptoDeviceInfo.kt | 3 ++ .../RoomMemberProfileController.kt | 12 ++---- .../devices/DeviceListBottomSheetViewModel.kt | 2 + .../devices/DeviceListEpoxyController.kt | 38 ++++++++++++++++--- .../devices/DeviceTrustInfoEpoxyController.kt | 26 +++++++++++-- 6 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 changelog.d/8195.bugfix diff --git a/changelog.d/8195.bugfix b/changelog.d/8195.bugfix new file mode 100644 index 0000000000..72da824aa1 --- /dev/null +++ b/changelog.d/8195.bugfix @@ -0,0 +1 @@ +Update room member shields behavior diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt index 418b1e6ce3..a1c5866fff 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt @@ -34,6 +34,9 @@ data class CryptoDeviceInfo( val isVerified: Boolean get() = trustLevel?.isVerified() == true + val isCrossSigningVerified: Boolean + get() = trustLevel?.isCrossSigningVerified() == true + val isUnknown: Boolean get() = trustLevel == null diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt index bdf2978cca..9585e6aaa1 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt @@ -107,16 +107,10 @@ class RoomMemberProfileController @Inject constructor( // Cross signing is enabled for this user if (state.userMXCrossSigningInfo.isTrusted()) { // User is trusted - val icon = if (state.allDevicesAreTrusted) { - R.drawable.ic_shield_trusted + val (icon, titleRes) = if (state.allDevicesAreCrossSignedTrusted) { + Pair(R.drawable.ic_shield_trusted, R.string.verification_profile_verified) } else { - R.drawable.ic_shield_warning - } - - val titleRes = if (state.allDevicesAreTrusted) { - R.string.verification_profile_verified - } else { - R.string.verification_profile_warning + Pair(R.drawable.ic_shield_warning, R.string.verification_profile_warning) } buildProfileAction( diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt index eb23c5654e..683e4b4945 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt @@ -45,6 +45,7 @@ data class DeviceListViewState( val allowDeviceAction: Boolean, val userItem: MatrixItem? = null, val memberCrossSigningKey: MXCrossSigningInfo? = null, + val myDeviceId: String = "", val cryptoDevices: Async> = Loading(), val selectedDevice: CryptoDeviceInfo? = null ) : MavericksState @@ -70,6 +71,7 @@ class DeviceListBottomSheetViewModel @AssistedInject constructor( userId = userId, allowDeviceAction = args.allowDeviceAction, userItem = session.getUserOrDefault(userId).toMatrixItem(), + myDeviceId = session.sessionParams.deviceId ?: "", ) } } diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt index 995de365eb..764268e6a5 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt @@ -32,9 +32,12 @@ import im.vector.app.core.ui.list.genericItem import im.vector.app.core.ui.list.genericWithValueItem import im.vector.app.core.utils.DimensionConverter import im.vector.app.features.settings.VectorPreferences +import im.vector.app.features.settings.devices.TrustUtils import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence import me.gujun.android.span.span +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel import javax.inject.Inject class DeviceListEpoxyController @Inject constructor( @@ -68,10 +71,20 @@ class DeviceListEpoxyController @Inject constructor( it.isVerified } + val trustMSK = data.memberCrossSigningKey?.isTrusted().orFalse() + val legacyMode = data.memberCrossSigningKey == null + // Build top header - val allGreen = deviceList.fold(true, { prev, device -> - prev && device.isVerified - }) + val allGreen = deviceList.fold(true) { prev, device -> + val trustLevel = TrustUtils.shieldForTrust( + data.myDeviceId == device.deviceId, + trustMSK, + legacyMode, + device.trustLevel + ) + + prev && trustLevel == RoomEncryptionTrustLevel.Trusted + } genericItem { id("title") @@ -105,8 +118,21 @@ class DeviceListEpoxyController @Inject constructor( // Build list of device with status deviceList.forEach { device -> genericWithValueItem { + val trustLevel = TrustUtils.shieldForTrust( + data.myDeviceId == device.deviceId, + trustMSK, + legacyMode, + device.trustLevel + ) + val shield = when (trustLevel) { + RoomEncryptionTrustLevel.Default -> R.drawable.ic_shield_unknown + RoomEncryptionTrustLevel.Warning -> R.drawable.ic_shield_warning + RoomEncryptionTrustLevel.Trusted -> R.drawable.ic_shield_trusted + RoomEncryptionTrustLevel.E2EWithUnsupportedAlgorithm -> R.drawable.ic_warning_badge + } + id(device.deviceId) - titleIconResourceId(if (device.isVerified) R.drawable.ic_shield_trusted else R.drawable.ic_shield_warning) + titleIconResourceId(shield) apply { val title = if (host.vectorPreferences.developerMode()) { val seq = span { @@ -126,12 +152,12 @@ class DeviceListEpoxyController @Inject constructor( } value( host.stringProvider.getString( - if (device.isVerified) R.string.trusted else R.string.not_trusted + if (trustLevel == RoomEncryptionTrustLevel.Trusted) R.string.trusted else R.string.not_trusted ) ) valueColorInt( host.colorProvider.getColorFromAttribute( - if (device.isVerified) R.attr.colorPrimary else R.attr.colorError + if (trustLevel == RoomEncryptionTrustLevel.Trusted) R.attr.colorPrimary else R.attr.colorError ) ) itemClickAction { diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceTrustInfoEpoxyController.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceTrustInfoEpoxyController.kt index 569a7f980c..20c388dd95 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceTrustInfoEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceTrustInfoEpoxyController.kt @@ -27,9 +27,12 @@ import im.vector.app.core.ui.list.genericWithValueItem import im.vector.app.core.utils.DimensionConverter import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem import im.vector.app.features.settings.VectorPreferences +import im.vector.app.features.settings.devices.TrustUtils import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence import me.gujun.android.span.span +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel import javax.inject.Inject class DeviceTrustInfoEpoxyController @Inject constructor( @@ -49,11 +52,26 @@ class DeviceTrustInfoEpoxyController @Inject constructor( override fun buildModels(data: DeviceListViewState?) { val host = this data?.selectedDevice?.let { cryptoDeviceInfo -> - val isVerified = cryptoDeviceInfo.trustLevel?.isVerified() == true + val trustMSK = data.memberCrossSigningKey?.isTrusted().orFalse() + val legacyMode = data.memberCrossSigningKey == null + val isMyDevice = data.myDeviceId == cryptoDeviceInfo.deviceId + val trustLevel = TrustUtils.shieldForTrust( + isMyDevice, + trustMSK, + legacyMode, + cryptoDeviceInfo.trustLevel + ) + val isVerified = trustLevel == RoomEncryptionTrustLevel.Trusted + val shield = when (trustLevel) { + RoomEncryptionTrustLevel.Default -> R.drawable.ic_shield_unknown + RoomEncryptionTrustLevel.Warning -> R.drawable.ic_shield_warning + RoomEncryptionTrustLevel.Trusted -> R.drawable.ic_shield_trusted + RoomEncryptionTrustLevel.E2EWithUnsupportedAlgorithm -> R.drawable.ic_warning_badge + } genericItem { id("title") style(ItemStyle.BIG_TEXT) - titleIconResourceId(if (isVerified) R.drawable.ic_shield_trusted else R.drawable.ic_shield_warning) + titleIconResourceId(shield) title( host.stringProvider .getString(if (isVerified) R.string.verification_profile_verified else R.string.verification_profile_warning) @@ -90,7 +108,7 @@ class DeviceTrustInfoEpoxyController @Inject constructor( genericWithValueItem { id(cryptoDeviceInfo.deviceId) - titleIconResourceId(if (isVerified) R.drawable.ic_shield_trusted else R.drawable.ic_shield_warning) + titleIconResourceId(shield) title( span { +(cryptoDeviceInfo.displayName() ?: "") @@ -103,7 +121,7 @@ class DeviceTrustInfoEpoxyController @Inject constructor( ) } - if (!isVerified) { + if (!isVerified && !isMyDevice) { genericFooterItem { id("warn") centered(false) From 8bb78ce68b858b1f12291004a741fd18b2c6f9c9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 3 Mar 2023 16:40:23 +0100 Subject: [PATCH 127/153] `sonarqube` task is deprecated, use `sonar` now. --- .github/workflows/tests.yml | 2 +- build.gradle | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 111648a2d4..6ee85168af 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -111,7 +111,7 @@ jobs: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} ORG_GRADLE_PROJECT_SONAR_LOGIN: ${{ secrets.SONAR_TOKEN }} if: ${{ always() && env.GITHUB_TOKEN != '' && env.SONAR_TOKEN != '' && env.ORG_GRADLE_PROJECT_SONAR_LOGIN != '' }} - run: ./gradlew sonarqube $CI_GRADLE_ARG_PROPERTIES + run: ./gradlew sonar $CI_GRADLE_ARG_PROPERTIES - name: Format unit test results if: always() diff --git a/build.gradle b/build.gradle index 285713cacf..2e28911a4f 100644 --- a/build.gradle +++ b/build.gradle @@ -203,10 +203,10 @@ if (launchTask.contains("coverage".toLowerCase())) { apply plugin: 'org.sonarqube' // To run a sonar analysis: -// Run './gradlew sonarqube -Dsonar.login=' +// Run './gradlew sonar -Dsonar.login=' // The SONAR_KEY is stored in passbolt as Token Sonar Cloud Bma -sonarqube { +sonar { properties { property "sonar.projectName", "element-android" property "sonar.projectKey", "vector-im_element-android" @@ -225,7 +225,7 @@ sonarqube { } project(":vector") { - sonarqube { + sonar { properties { property "sonar.sources", project(":vector").android.sourceSets.main.java.srcDirs // exclude source code from analyses separated by a colon (:) @@ -236,13 +236,13 @@ project(":vector") { } project(":library:external:diff-match-patch") { - sonarqube { + sonar { skipProject = true } } //project(":matrix-sdk-android") { -// sonarqube { +// sonar { // properties { // property "sonar.sources", project(":matrix-sdk-android").android.sourceSets.main.java.srcDirs // // exclude source code from analyses separated by a colon (:) From ceda85f6249a20972b811fb37a0522396c47767e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 3 Mar 2023 18:01:10 +0100 Subject: [PATCH 128/153] Fix test by mocking `WorkManagerProvider.tag` Appeared when upgrading androidx.work:work-runtime-ktx from 2.7.1 to 2.8.0 in #8099 --- .../org/matrix/android/sdk/internal/di/WorkManagerProvider.kt | 2 +- .../matrix/android/sdk/test/fakes/FakeWorkManagerProvider.kt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt index ad28286a84..d8cdd162f1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt @@ -41,7 +41,7 @@ internal class WorkManagerProvider @Inject constructor( private val coroutineDispatchers: MatrixCoroutineDispatchers, private val sessionScope: CoroutineScope ) { - private val tag = MATRIX_SDK_TAG_PREFIX + sessionId + val tag = MATRIX_SDK_TAG_PREFIX + sessionId val workManager = WorkManager.getInstance(context) diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/test/fakes/FakeWorkManagerProvider.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/test/fakes/FakeWorkManagerProvider.kt index 51ff24c01d..437fda65e4 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/test/fakes/FakeWorkManagerProvider.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/test/fakes/FakeWorkManagerProvider.kt @@ -26,5 +26,6 @@ internal class FakeWorkManagerProvider( val instance = mockk().also { every { it.workManager } returns fakeWorkManager.instance + every { it.tag } returns "Tag" } } From fd8cdef04cb467d9d5727a4d7e1948fdf63608c7 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 3 Mar 2023 13:23:17 +0000 Subject: [PATCH 129/153] Translated using Weblate (Hungarian) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- library/ui-strings/src/main/res/values-hu/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index d536f075cb..6877571cce 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -2928,4 +2928,5 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze A hang közvetítés nem fejthető vissza. A fiókadatok külön vannak kezelve itt: %1$s. Fiók + Hiba történt az értesítések beállításának frissítésekor. Próbáld újra. \ No newline at end of file From 0051e922ea69997b4bf82caed23bb17a274a44e6 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 2 Mar 2023 18:36:05 +0000 Subject: [PATCH 130/153] Translated using Weblate (Hungarian) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/ --- fastlane/metadata/android/hu-HU/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40105260.txt diff --git a/fastlane/metadata/android/hu-HU/changelogs/40105260.txt b/fastlane/metadata/android/hu-HU/changelogs/40105260.txt new file mode 100644 index 0000000000..9a73803dc4 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Legnagyobb változtatás ebben a verzióban: Hibajavítások. +Teljes változási napló: https://github.com/vector-im/element-android/releases From 8abbe6ae3828d083056e538fe21239db076bdbc6 Mon Sep 17 00:00:00 2001 From: sonata-chen Date: Sat, 4 Mar 2023 14:22:30 +0000 Subject: [PATCH 131/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- .../src/main/res/values-zh-rTW/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 058a4e4507..0d2957933e 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -493,7 +493,7 @@ 在 %s 伺服器上的所有聊天室 所有本地 %s 聊天室 - %d 條未讀的已通知訊息 + %d 則未讀的通知訊息 %d 個聊天室 @@ -838,7 +838,7 @@ 您都看完了! 您已經沒有未讀的訊息了 對話 - 您的直接訊息對話將會在此顯示。點擊右下角的 + 開始一些直接訊息。 + 您的私人訊息對話將會在此顯示。點擊右下角的 + 可以建立私訊。 聊天室 您的聊天室將會在此顯示。點擊右下角的 + 來尋找既有的或開始您自己的。 反應 @@ -1902,8 +1902,8 @@ 失敗 已傳送 正在傳送 - 顯示聊天室目錄中的所有聊天室,包含有明確內容的聊天室。 - 顯示帶有明確內容的聊天室 + 顯示聊天室目錄中的所有聊天室時,也顯示含有兒童不宜內容的聊天室。 + 顯示帶有兒童不宜內容的聊天室 聊天室目錄 訊息已傳送 您被邀請了 @@ -2092,8 +2092,8 @@ 聊天室邀請 已加密的群組訊息 群組訊息 - 已加密的直接訊息 - 直接訊息 + 已加密的私人訊息 + 私人訊息 我的使用者名稱 我的顯示名稱 通知我 From ee92f0cd0529ad8b4845921d0b64f1e1a9eafd7e Mon Sep 17 00:00:00 2001 From: Open Culture Foundation Date: Sat, 4 Mar 2023 12:06:29 +0000 Subject: [PATCH 132/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- .../src/main/res/values-zh-rTW/strings.xml | 1442 ++++++++--------- 1 file changed, 721 insertions(+), 721 deletions(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 0d2957933e..89adc859a8 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -1,159 +1,159 @@ %s 的邀請 - %1$s 邀請了 %2$s - %1$s 邀請您 + %1$s 已邀請 %2$s + %1$s 已邀請您 %1$s 已加入聊天室 %1$s 已離開聊天室 - %1$s 拒絕邀請 - %1$s 踢出 %2$s - %1$s 解除禁止 %2$s - %1$s 禁止 %2$s - %1$s 收回了對 %2$s 的邀請 - %1$s 變更了他們的大頭貼 - %1$s 設定了他們的顯示名稱為 %2$s - %1$s 變更了他們的顯示名稱從 %2$s 到 %3$s - %1$s 移除了他們的顯示名稱 (%2$s) - %1$s 變更主題為:%2$s - %1$s 變更房間名稱為:%2$s - %s 撥出了視訊通話。 - %s 撥出了語音通話。 - %s 回覆了通話。 - %s 結束通話。 - %1$s 讓房間未來可讓 %2$s 看到歷史紀錄 - 所有的房間成員,從他們被邀請的時間開始。 - 所有的房間成員,從他們加入的時間開始。 - 所有的房間成員。 + %1$s 已拒絕邀請 + %1$s 已移除 %2$s + %1$s 取消封鎖 %2$s + %1$s 已封鎖 %2$s + %1$s 已撤回 %2$s 的邀請 + %1$s 已變更他們的大頭照 + %1$s 已將他們的顯示名稱設定為 %2$s + %1$s 已將他們的顯示名稱從 %2$s 變更為 %3$s + %1$s 已移除了自己的顯示名稱(之前是 %2$s) + %1$s 已變更主題為:%2$s + %1$s 已變更聊天室名稱為:%2$s + %s 已開始視訊通話。 + %s 已開始語音通話。 + %s 已回覆通話。 + %s 已結束通話。 + %1$s 讓 %2$s 也能看到聊天室未來的歷史紀錄 + 所有聊天室的成員,從他們被邀請的時間點。 + 所有聊天室的成員,從他們加入的時間點。 + 所有聊天室的成員。 任何人。 - (大頭貼也變更了) - %1$s 移除了房間名稱 - %1$s 移除了房間主題 - %1$s 傳送加入房間的邀請給 %2$s - %1$s 接受 %2$s 的邀請 + (大頭照也已變更) + %1$s 已移除聊天室的名稱 + %1$s 已移除聊天室的主題 + %1$s 已傳送邀請給 %2$s 以加入聊天室 + %1$s 已接受對 %2$s 的邀請 ** 無法解密:%s ** - 傳送者的裝置並未在此訊息傳送他們的金鑰。 + 傳送者的裝置並未將此訊息的金鑰傳給我們。 無法傳送訊息 Matrix 錯誤 - 電子郵件 + 電子郵件地址 電話號碼 聊天室邀請 - %1$s 和 %2$s - 空聊天室 - 初始化同步: -\n正在匯入帳號…… - 初始化同步: -\n正在匯入 crypto - 初始化同步: + %1$s 與 %2$s + 空的聊天室 + 初始同步: +\n正在匯入帳號… + 初始同步: +\n正在匯入加密 + 初始同步: \n正在匯入聊天室 - 初始化同步: + 初始同步: \n正在載入您的對話 -\n若您加入了很多聊天室,這可能會花一點時間 - 初始化同步: +\n如果您已加入很多聊天室,這可能會花一點時間 + 初始同步: \n正在匯入已邀請的聊天室 - 初始化同步: + 初始同步: \n正在匯入已離開的聊天室 - 初始化同步: + 初始同步: \n正在匯入帳號資料 %s 已升級此聊天室。 - 正在傳送訊息…… - %1$s 撤銷了 %2$s 加入聊天室的邀請 + 正在傳送訊息… + %1$s 已撤銷 %2$s 加入聊天室的邀請 %1$s 的邀請。理由:%2$s - %1$s 邀請了 %2$s。理由:%3$s - %1$s 邀請了您。理由:%2$s + %1$s 已邀請 %2$s。理由:%3$s + %1$s 已邀請您。理由:%2$s %1$s 已加入聊天室。理由:%2$s %1$s 已離開聊天室。理由:%2$s - %1$s 已回絕邀請。理由:%2$s - %1$s 踢走了 %2$s。理由:%3$s - %1$s 取消封鎖了 %2$s。理由:%3$s - %1$s 封鎖了 %2$s。理由:%3$s - %1$s 接受 %2$s 的邀請。理由:%3$s - %1$s 撤回了對 %2$s 的邀請。理由:%3$s + %1$s 已拒絕邀請。理由:%2$s + %1$s 已移除 %2$s。理由:%3$s + %1$s 已取消封鎖 %2$s。理由:%3$s + %1$s 已封鎖 %2$s。理由:%3$s + %1$s 已接受 %2$s 的邀請。理由:%3$s + %1$s 已撤回 %2$s 的邀請。理由:%3$s - %1$s 新增了 %2$s 為此聊天室的地址。 + %1$s 已新增 %2$s 為此聊天室的位址。 - %1$s 移除了此聊天室的 %2$s 地址。 + %1$s 已移除 %2$s 為此聊天室的位址。 - %1$s 為此聊天室新增 %2$s 並移除 %3$s 地址。 - %1$s 為此聊天室設定了 %2$s 為主地址。 - %1$s 為此聊天室移除了主要地址。 + %1$s 已新增 %2$s 並移除 %3$s 為此聊天室的位址。 + %1$s 設定 %2$s 為主聊天室的位址。 + %1$s 已移除主聊天室的位址。 %1$s 已允許訪客加入聊天室。 %1$s 已禁止訪客加入聊天室。 - %1$s 已開啟端到端加密。 - %1$s 已開啟端到端加密(無法識別的演算法 %2$s)。 - %1$s 建立了聊天室 + %1$s 已開啟端對端加密。 + %1$s 已開啟端對端加密(無法識別的演算法 %2$s)。 + %1$s 已建立聊天室 您的邀請 - 您建立了聊天室 - 您邀請了 %1$s - 您加入了聊天室 - 您離開的聊天室 - 您回絕了邀請 - 您踢除了 %1$s - 您取消封鎖了 %1$s - 您封鎖了 %1$s - 您撤銷了 %1$s 的邀請 - 您變更了您的大頭貼 - 您將您的顯示名稱設定為 %1$s - 您將您的顯示名稱從 %1$s 變更為 %2$s - 您移除了您的顯示名稱(其曾為 %1$s) - 您將主題變更為:%1$s - %1$s 變更了聊天室大頭貼 - 您變更了聊天室大頭貼 - 您將聊天室名稱變更為:%1$s - 您發起了視訊通話。 - 您發起了音訊通話。 - %s 傳送了資料以建立通話。 - 您傳送了資料以建立通話。 - 您接了通話。 - 您結束了通話。 - 您已將未來的聊天室歷史設定為對 %1$s 可見 - 您升級了此聊天室。 - 您移除了聊天室名稱 - 您移除了聊天室主題 - %1$s 移除了聊天室大頭貼 - 您移除了聊天室大頭貼 - 您傳送了邀請給 %1$s 以加入聊天室 - 您已撤銷對 %1$s 加入聊天室的邀請 - 您接受了 %1$s 的邀請 - %1$s 新增了 %2$s 小工具 - 您新增了 %1$s 小工具 - %1$s 移除了 %2$s 小工具 - 您移除了 %1$s 小工具 - %1$s 修改了 %2$s 小工具 - 您修改了 %1$s 小工具 + 您已建立聊天室 + 您已邀請 %1$s + 您已加入聊天室 + 您已離開聊天室 + 您已拒絕邀請 + 您已移除 %1$s + 您已取消封鎖 %1$s + 您已封鎖 %1$s + 您已撤回 %1$s 的邀請 + 您已變更您的大頭照 + 您已將顯示名稱設定為 %1$s + 您已將您的顯示名稱從 %1$s 變更為 %2$s + 您已移除了您的顯示名稱(之前為 %1$s) + 您已變更主題為:%1$s + %1$s 已變更了聊天室大頭照 + 您已變更聊天室大頭照 + 您已變更聊天室名稱為:%1$s + 您已開始視訊通話。 + 您已開始語音通話。 + %s 傳送資料以設定通話。 + 您傳送資料以設定通話。 + 您已回覆通話。 + 您已結束通話。 + 您讓 %1$s 也能看到聊天室未來的歷史紀錄 + 您已升級此聊天室。 + 您已移除聊天室的名稱 + 您已移除聊天室的主題 + %1$s 已移除聊天室的大頭照 + 您已移除聊天室的大頭照 + 您已傳送邀請給 %1$s 以加入聊天室 + 您已撤銷 %1$s 加入聊天室的邀請 + 您已接受對 %1$s 的邀請 + %1$s 已新增 %2$s 小工具 + 您已新增 %1$s 小工具 + %1$s 已移除 %2$s 小工具 + 您已移除 %1$s 小工具 + %1$s 已修改 %2$s 小工具 + 您已修改 %1$s 小工具 管理員 - 板主 + 主持人 預設 - 自訂 (%1$d) + 自訂(%1$d) 自訂 - 您變更了 %1$s 的權力等級。 - %1$s 變更了 %2$s 的權力等級。 + 您已變更 %1$s 的權限等級。 + %1$s 已變更 %2$s 的權限等級。 %1$s 從 %2$s 到 %3$s 您的邀請。理由:%1$s - 您邀請了 %1$s。理由:%2$s - 您加入了聊天室。理由:%1$s + 您已邀請 %1$s。理由:%2$s + 您已加入聊天室。理由:%1$s 您離開了聊天室。理由:%1$s - 您回絕了邀請。理由:%1$s - 您踢除了 %1$s。理由:%2$s - 您取消封鎖了 %1$s。理由:%2$s - 您封鎖了 %1$s。理由:%2$s - 您接受了 %1$s 的邀請。理由:%2$s - 您撤回了 %1$s 的邀請。理由:%2$s + 您已拒絕邀請。理由:%1$s + 您已移除 %1$s。理由:%2$s + 您已取消封鎖 %1$s。理由:%2$s + 您已封鎖 %1$s。理由:%2$s + 您已接受 %1$s 的邀請。理由:%2$s + 您已撤回 %1$s 的邀請。理由:%2$s - 您為此聊天室新增了 %1$s 作為地址。 + 您已新增 %1$s 為此聊天室的位址。 - 您為此聊天室移除了 %1$s 作為地址。 + 您已移除 %1$s 為此聊天室的位址。 - 您為此聊天室新增了 %1$s 並移除了 %2$s 作為地址。 - 您將此聊天室的主要地址設定為 %1$s。 - 您將此聊天室的主要地址移除。 + 您已新增 %1$s 並移除 %2$s 為此聊天室的位址。 + 您設定 %1$s 為此聊天室的位址。 + 您已移除主聊天室的位址。 您已允許訪客加入聊天室。 - 您已阻止訪客加入聊天室。 - 您開啟了端到端加密。 - 您開啟了端到端加密(無法識別的演算法 %1$s)。 - 您已避免訪客加入此聊天室。 - %1$s 已避免訪客加入此聊天室。 + 您已禁止訪客加入聊天室。 + 您已開啟端對端加密。 + 您已開啟端對端加密(無法識別的演算法 %1$s)。 + 您已禁止訪客加入聊天室。 + %1$s 已禁止訪客加入聊天室。 您已允許訪客加入這裡。 %1$s 已允許訪客加入這裡。 您已離開。理由:%1$s @@ -162,57 +162,57 @@ %1$s 已加入。理由:%2$s 您已撤銷對 %1$s 的邀請 %1$s 已撤銷對 %2$s 的邀請 - 您已邀請了 %1$s - %1$s 邀請了 %2$s - 您已在此升級。 - %s 已在此升級。 - 您讓未來的訊息對 %1$s 可見 - %1$s 已讓未來的訊息對 %2$s 可見 + 您已邀請 %1$s + %1$s 已邀請 %2$s + 您已升級這裡。 + %s 已升級這裡。 + 您讓 %1$s 也能看到聊天室未來的歷史紀錄 + %1$s 讓 %2$s 也能看到聊天室未來的歷史紀錄 您已離開聊天室 %1$s 已離開聊天室 您已加入 %1$s 已加入 - 您已建立此討論 - %1$s 已建立此討論 + 您已建立討論 + %1$s 已建立討論 空的聊天室(曾為 %s) - %1$s, %2$s, %3$s 與 %4$d 個其他 + %1$s、 %2$s、 %3$s 與 %4$d 個其他 - %1$s, %2$s, %3$s 與 %4$s - %1$s, %2$s 與 %3$s - 🎉 禁止所有伺服器參與!無法再使用此聊天室。 + %1$s、%2$s、 %3$s 與 %4$s + %1$s、%2$s 與 %3$s + 🎉 所有伺服器已封鎖參與!此聊天室無法再被使用。 無變更。 - • 禁止符合 IP 文字的伺服器。 - • 允許符合 IP 文字的伺服器。 + • 符合 IP 字段的伺服器現在已封鎖。 + • 符合 IP 字段的伺服器現在已允許。 • 符合 %s 的伺服器已從允許清單中移除。 - • 允許符合 %s 的伺服器。 - • 符合 %s 的伺服器已從禁止清單中移除。 - • 現在禁止符合 %s 的伺服器。 - 您為此聊天室變更了伺服器 ACL。 - %s 為此聊天室變更了伺服器 ACL。 - • 禁止符合 IP 文字的伺服器。 - • 允許符合 IP 文字的伺服器。 - • 已允許符合 %s 的伺服器。 - • 已禁止符合 %s 的伺服器。 - 您為此聊天室設定了伺服器 ACL。 - %s 為此聊天室設定了伺服器 ACL。 - 您變更了此聊天室的地址。 - %1$s 變更了此聊天室的地址。 - 您為此聊天室變更了主要及備用地址。 - %1$s 為此聊天室變更了主要及備用地址。 - 您為此聊天室變更了備用地址。 - %1$s 變更了此聊天室的備用地址。 + • 符合 %s 的伺服器現在已允許。 + • 符合 %s 的伺服器從封鎖清單中已移除。 + • 符合 %s 的伺服器現在已封鎖。 + 您為此聊天室已變更伺服器存取控制清單。 + %s 為此聊天室已變更伺服器存取控制清單。 + • 符合 IP 字段的伺服器已封鎖。 + • 符合 IP 字段的伺服器已允許。 + • 符合 %s 的伺服器已允許。 + • 符合 %s 的伺服器已封鎖。 + 您為此聊天室設定伺服器存取控制清單。 + %s 為此聊天室設定伺服器存取控制清單。 + 您已變更此聊天室的位址。 + %1$s 已變更此聊天室的位址。 + 您已變更此聊天室的主要及備用位址。 + %1$s 已變更此聊天室的主要及備用位址。 + 您已變更此聊天室的備用位址。 + %1$s 已變更此聊天室的備用位址。 - 您為此聊天室移除了備用地址 %1$s。 + 您為此聊天室移除備用位址 %1$s。 - %1$s 已為此聊天室移除備用地址 %2$s。 + %1$s 已為此聊天室移除備用位址 %2$s。 - 您為此聊天室新增了備用地址 %1$s。 + 您已為此聊天室新增備用位址 %1$s。 - %1$s 已為此聊天室新增了備用地址 %2$s。 + %1$s 已為此聊天室新增備用位址 %2$s。 淺色主題 深色主題 @@ -230,13 +230,13 @@ 載入中… 發送 分享 - 查看源代碼 - 通知音效 + 查看原始碼 + 吵雜通知 靜音通知 引用 - 稍後 + 稍後再說 永久連結 - 檢視解密的來源 + 檢視解密的原始碼 刪除 重新命名 回報內容 @@ -252,7 +252,7 @@ 已複製到剪貼簿 確認 警告 - 最愛 + 我的最愛 聯絡人 聊天室 過濾聊天室名稱 @@ -262,23 +262,23 @@ 僅 Matrix 聯絡人 沒有結果 聊天室 - 傳送記錄 + 傳送記錄檔 傳送當機紀錄 傳送螢幕截圖 - 回報臭蟲 + 回報錯誤 請描述此錯誤。做了什麼?預期發生什麼?實際發生什麼? - 在這裡描述你的問題 + 請在這裡描述您的問題 為了診斷問題,客戶端的紀錄將會同錯誤回報一起送出。這個包含了紀錄與螢幕截圖的錯誤回報將不會公開可見。如果您只想送出上方的文字,請取消勾選: 您似乎沮喪的搖晃著手機。您要開啟錯誤回報畫面嗎? 這個應用程式上次當掉了。您想要開啟錯誤回報畫面嗎? - 憤怒搖晃來回報臭蟲 + 透過大力搖晃回報錯誤 此錯誤回報已成功送出 此錯誤回報無法送出(%s) 進度(%s%%) 加入聊天室 使用者名稱 登出 - 家伺服器網址 + 家伺服器 URL 搜尋 開始語音通話 開始視訊通話 @@ -289,14 +289,14 @@ 拍照 錄影 登入 - 傳送 + 遞交 不正確的使用者名稱和/或密碼 這看起不像是有效的電子郵件地址 - 此電子郵件位址已經被定義。 + 此電子郵件地址已經被定義。 忘記密碼? - 這個家伺服器想要確定您不是機器人 + 這個家伺服器想要確認您不是機器人 電子郵件地址驗證失敗: 請確保您已點擊郵件中的連結 - 請輸入有效的網址 + 請輸入有效的 URL 異常的 JSON 沒有包含有效的 JSON 傳送太多請求 @@ -305,11 +305,11 @@ 通話 - 通話正在連線…… + 通話正在連線… 通話結束 - 視訊來電 + 視訊通話 語音來電 - 通話進行中…… + 通話進行中… 遠端未能接聽。 資訊 ${app_name} 需要權限來存取麥克風,來撥打語音通話。 @@ -325,22 +325,22 @@ 成員 跳到未讀 - %d 個成員 + %d 位成員 離開聊天室 您確定想要離開聊天室? 私人訊息 邀請 封鎖 - 封禁 + 解除封鎖 忽略 取消忽略 提及 封鎖使用者將會把他們從此聊天室中移除,並避免他們再次加入。 %s 正在打字… %1$s 和 %2$s 正在打字… - 由於您提升此使用者擁有的權限等級與你自己相同,因此您將無法還原此變更。 -\n你確定? + 由於您將此使用者的權限等級提升到與您相同,因此將無法還原此變更。 +\n確定嗎? %1$s 及 %2$s 和其他人正在打字… 您沒有權限在此聊天室發言。 @@ -351,14 +351,14 @@ 登出 忽略 指紋(%s): - 無法驗證遠端伺服器的身份。 + 無法驗證遠端伺服器的身分。 %d 會員變動 - 這可能表示有人正惡意的攔截你的流量,或你的手機不信任由遠端伺服器提供的憑證。 - 如果伺服器管理員說這是正常的,請確保底下的指紋與他們所提供的指紋符合。 - 你的手機曾經信任的憑證已經變動。這非常不尋常。建議你不要接受此新的憑證。 - 發送貼圖 + 這可能表示有人正惡意地攔截您的流量,或是您的手機並不信任由遠端伺服器提供的憑證。 + 如果伺服器管理員認為這是正常的,請確保底下的指紋與他們所提供的指紋相符。 + 此憑證已經被您手機所信任的人變動。這種情形非常不尋常,建議您不要接受這個新的憑證。 + 傳送一張貼圖 下載 發送語音訊息 發送貼圖 @@ -368,14 +368,14 @@ 對不起,沒有應用程式可以完成此操作。 從其他工作階段重新請求加密金鑰。 請在另一個可以解密訊息的裝置上啟動 ${app_name},以便它將金鑰發送到此工作階段。 - 憑證已從以前受信任的更改為不受信任的憑證。伺服器可能已續訂其憑證。請與伺服器管理員聯繫以尋找所需的指紋。 - 僅當伺服器管理員發佈的指紋與上面的指紋匹配時才接受此憑證。 + 受信任憑證已被變更為不受信任的憑證。此伺服器可能已更新憑證。請與伺服器管理員聯繫,取得所需的指紋驗證。 + 僅當伺服器管理員發佈的指紋與上面的指紋相符時才接受此憑證。 搜尋 過濾聊天室成員 沒有結果 所有訊息 新增到主畫面 - 個人檔案圖片 + 大頭照 顯示名稱 新增電子郵件地址 新增電話號碼 @@ -385,23 +385,23 @@ 啟用這個帳號的通知 啟用此工作階段的通知 包含我顯示名稱的訊息 - 包含我用戶名稱的訊息 + 包含我的使用者名稱的訊息 來自私訊的訊息 來自群組的訊息 當我被邀請進聊天室時 - 通話請求 - 來自機器人的訊息 - 在裝置啓動時自動啓動 + 通話邀請 + 聊天機器人送出的訊息 + 裝置啓動時自動啓動 後臺同步 同步請求超時 - 每次同步間的延遲 + 延遲同步 版本 olm 版本 - 條款與條件 + 條款與細則 第三方通知 版權 隱私權政策 - 清空暫存檔 + 清除暫存檔 清除媒體暫存檔 保留媒體檔案 使用者設定 @@ -423,9 +423,9 @@ 提及使用者時震動 停用帳號 停用我的帳號 - 傳送分析資料 + 分析資料 傳送分析資料 - ${app_name} 會收集匿名分析以讓我們可以改進此應用程式。 + ${app_name} 會收集匿名分析以讓我們改進此應用程式。 ID 公開名稱 更新公開名稱 @@ -434,7 +434,7 @@ 授權 登入爲 家伺服器 - 身份認證伺服器 + 身分認證伺服器 使用者介面 語言 選擇語言 @@ -444,8 +444,8 @@ 變更密碼 目前的密碼 新密碼 - 更新密碼失敗 - 您的密碼已經更新 + 無法更新密碼 + 您的密碼已更新 顯示所有來自 %s 的訊息? 選擇國家 3 天 @@ -453,19 +453,19 @@ 1 個月 永遠 主題 - 房間歷史可讀性 + 聊天室歷史紀錄的可讀性 誰能檢視歷史訊息? 任何人 - 僅成員(自選取此選項開始) - 僅成員(自他們被邀請開始) - 僅成員(自他們加入開始) - 被封鎖的用戶 + 僅限成員(自選取此選項開始) + 僅限成員(自他們被邀請開始) + 僅限成員(自他們加入開始) + 被封鎖的使用者 進階 此聊天室的內部 ID 為 實驗室 - 這些是可能以非預期的方式壞掉的實驗性功能。請小心服用。 - 設定為主要地址 - 取消設定為主要地址 + 這些是可能以非預期的方式故障的實驗性功能。請小心服用。 + 設定為主要位址 + 取消設定為主要位址 主題 解密錯誤 公開名稱 @@ -475,19 +475,19 @@ 匯出聊天室的加密金鑰 匯出金鑰到本機檔案 匯出 - 輸入通關密語 - 確認通關密語 - 匯入聊天室端到端加密密鑰 + 輸入安全密語 + 確認安全密語 + 匯入聊天室端到端加密金鑰 匯入聊天室金鑰 從本機檔案匯入金鑰 匯入 僅加密驗證過的工作階段 - 從不自此工作階段傳送加密的訊息到未驗證的工作階段。 + 絕不從此工作階段傳送已加密的訊息到未驗證的工作階段。 未驗證 已驗證 驗證 透過將以下內容與您的其他工作階段中的使用者設定來確認: - 如果不符合的話,您的通訊安全可能正受到威脅。 + 如果不相符的話,您的通訊安全可能正受到威脅。 選擇一個聊天室目錄 伺服器名稱 在 %s 伺服器上的所有聊天室 @@ -509,15 +509,15 @@ 巨大 您確定要從聊天室刪除小工具嗎? - %d 個作用中的小工具 + %d 個活躍的小工具 - 無法建立小部件。 - 發送請求失敗。 + 無法建立小工具。 + 無法發送請求。 權限等級必需為正整數。 您不在此聊天室。 您沒有在這個聊天室做執行此操作的權限。 - 請求中缺失聊天室地址。 - 在請求中遺失使用者 ID。 + 您所要的 room_id 並不存在。 + 請求的 user_id 並存在。 聊天室 %s 不可見。 缺少必需的參數。 新增 Matrix 應用程式 @@ -529,38 +529,38 @@ 無法辨識的指令:%s 關閉 通知並震動 - 已加密的訊息 + 已加密訊息 建立 首頁 聊天室 已邀請 - 您已被 %2$s 從 %1$s 踢出 + 您已被 %2$s 從 %1$s 移除 您已被 %2$s 從 %1$s 封鎖 理由:%1$s - 用戶資料圖片 - 如要繼續使用此 %1$s 主伺服器,您必須同意該合約條款。 + 大頭照 + 如要繼續使用此 %1$s 主伺服器,您必須同意該條款與細則。 現在檢視 停用帳號 - 這將使您的帳戶永久不可用。您將無法登錄, 並且沒有人能夠重新註冊相同的使用者 ID。這將導致您的帳戶離開已參與的所有房間,它將從您的身份伺服器上刪除您的帳戶詳細資訊。此操作是不可逆轉的。 + 這將使您的帳戶永遠無法使用。您將無法登入, 且沒有人能夠再次以相同的使用者 ID 重新註冊。這將導致您的帳戶離開已登入的所有聊天室,您將從身分伺服器上移除此帳戶的詳細資訊。此操作不可逆。 \n -\n停用您的帳戶不會預設導致我們刪除您發送的訊息。如果您想讓我們忘記您的訊息, 請在下面的方框中打勾。 +\n停用您的帳戶預設不會讓我們移除您發送的訊息。如果您想讓我們移除您的訊息, 請在下面的方框中打勾。 \n -\nMatrix 中的訊息可見度類似于電子郵件。我們忘記您的訊息意味著您發送的訊息將不會與任何新的或未註冊的使用者分享,但是已註冊並已取得這些訊息的用戶仍然可以訪問他們的副本。 - 請在我的帳號停用時忘記我傳送過的所有訊息(警告:這將會造成未來的使用者無法看見完整的對話紀錄) +\nMatrix 中的訊息可見度類似電子郵件。我們移除您的訊息,意味著您發送的訊息將不會與任何新的或未註冊的使用者分享,但是已註冊並取得這些訊息的使用者仍然可以訪問他們的副本。 + 請在我的帳號停用時移除我傳送過的所有訊息(警告:這將會造成未來的使用者無法看見完整的對話紀錄) 停用帳號 請輸入您的密碼。 如果可以,請使用英文撰寫描述。 在傳送前預覽媒體 顯示動作 - 阻擋指定 id 的使用者 - 取消阻擋指定 id 的使用者 + 封鎖特定 id 的使用者 + 取消封鎖特定 id 的使用者 定義使用者的權限等級 取消指定 id 的使用者的管理權 邀請指定 id 的使用者到目前的聊天室 - 加入指定地址的聊天室 + 加入指定位址的聊天室 離開聊天室 設定聊天室主題 - 踢除指定 id 的使用者 + 移除指定 id 的使用者 變更您的顯示暱稱 開啟/關閉 markdown 為了修復 Matrix 應用程式管理 @@ -581,15 +581,15 @@ 請 %s 以繼續使用此服務。 錯誤 抱歉,遇到錯誤 - 請建立密語以加密您匯出的金鑰。您將需要輸入這些密語以匯入金鑰。 - 建立密語 - 密語必須符合 + 請建立安全密語以加密您匯出的金鑰。您將需要輸入這些安全密語以匯入金鑰。 + 建立安全密語 + 密語不相符 展開 - 摺疊 + 收折 從聊天移除 當您的家伺服器支援此功能時在聊天中預覽連結。 傳送輸入通知 - 讓其他使用者知道您正在輸入。 + 讓其他使用者知道您正在打字。 Markdown 格式 在您傳送之前使用 Markdown 格式化訊息。這讓您可以使用進階的格式化,如使用星號來顯示斜體文字。 顯示讀取回條 @@ -597,7 +597,7 @@ 顯示加入與離開的活動 邀請、移除與封鎖不受影響。 顯示帳號活動 - 包含大頭貼與顯示名稱變動。 + 包含大頭照與顯示名稱變動。 密碼 啟動系統相機而非自訂的相機畫面。 指令「%s」需要更多參數,或是有一些參數不正確。 @@ -614,7 +614,7 @@ 疑難排解通知 疑難排解診斷 執行測試 - 正在執行……(%2$d 中的 %1$d) + 正在執行…(%2$d 中的 %1$d) 基本診斷正常。如果您仍然沒有收到通知,請遞交錯誤回報以協助我們調查原因。 一個或更多的測試失敗,嘗試建議的修復。 一個或更多的測試失敗,請遞交錯誤回報以協助我們調查原因。 @@ -629,7 +629,7 @@ \n請檢查帳號設定。 啟用 工作階段設定。 - 通知已為此工作階段啟用。 + 此工作階段已啟用通知。 此工作階段未啟用通知。 \n請檢查 ${app_name} 設定。 啟用 @@ -641,11 +641,11 @@ Firebase 權杖 成功擷取 FCM token: \n%1$s - 擷取 FCM token 失敗: + 無法擷取 FCM 權杖 : \n%1$s - 註冊 token - FCM token 成功註冊至家伺服器。 - FCM token 註冊至家伺服器失敗: + 註冊權杖 + FCM 權杖成功註冊至家伺服器。 + 無法將 FCM 權杖註冊至家伺服器: \n%1$s 開機時啟動 服務將會在裝置重新啟動時自行啟動。 @@ -660,10 +660,10 @@ 停用限制 電池最佳化 ${app_name} 不會被電池最佳化影響。 - 如果使用者不為裝置充電,並讓其靜置一段時間,且將螢幕關閉,裝置將會進入 Doze 模式。這可能會導致應用程式無法存取網路,並延遲它們的工作、同步與標準警報。 + 如果使用者不為裝置充電,並讓其靜置一段時間,且將螢幕關閉,裝置將會進入瞌睡模式。這可能會導致應用程式無法存取網路,並延遲它們的工作、同步與標準警報。 忽略最佳化 找不到有效的 Google Play 服務 APK。通知可能無法正常運作。 - 視訊通話進行中…… + 視訊通話進行中… 金鑰備份 使用金鑰備份 略過 @@ -680,39 +680,39 @@ [%1$s] \n這個錯誤並非 ${app_name} 所能控制。手機上沒有 Google 帳號。請開啟帳號管理員並新增一個 Google 帳號。 新增帳號 - 設定吵鬧的通知 + 設定吵雜通知 設定通話通知 設定安靜的通知 - 選擇 LED 顏色、震動、音效…… + 選擇 LED 顏色、震動、音效… 加密金鑰管理 管理金鑰備份 安靜 - 請輸入通關密語 - 通關密語太弱了 - 如果您想要讓 ${app_name} 生成復原金鑰的話,請刪除通關密語。 - 永不遺失已加密的訊息 - 在加密聊天室裡的訊息是使用端到端加密。只有您和接收者有金鑰可以閱讀這些訊息。 + 請輸入安全密語 + 安全密語太弱了 + 如果您想要讓 ${app_name} 生成復原金鑰的話,請刪除安全密語。 + 絕不失去已加密訊息 + 已加密聊天室裡的訊息使用端對端加密保護。只有您和接收者有金鑰可以閱讀這些訊息。 \n \n安全地備份您的金鑰以避免失去它們。 - 設定通關密語 + 設定安全密語 完成 儲存復原金鑰 儲存為檔案 - 請複製 - 分享復原金鑰與…… - 正在使用通關密語生成復原金鑰,這個過程可能需要數秒鐘。 + 請複製金鑰 + 分享復原金鑰與… + 正在使用安全密語生成復原金鑰,這個過程可能需要數秒鐘。 復原金鑰 未預期的錯誤 您確定嗎? 如果您登出或遺失您的裝置的話,您可能會失去對您的訊息的存取權。 - 正在擷取…… - 使用您的復原通關密語以解鎖您的加密訊息歷史 + 正在擷取… + 使用您的復原安全密語以解鎖您的已加密訊息歷史 使用您的復原金鑰 - 不知道您的復原通關密語,您可以 %s。 - 使用您的復原金鑰以解鎖您的加密訊息歷史 + 不知道您的復原安全密語,您可以 %s。 + 使用您的復原金鑰以解鎖您的已加密訊息歷史 輸入復原金鑰 遺失您的復原金鑰?您可以在設定中設定一個新的。 - 備份可能無法使用此通關密語解密:請驗證您是否輸入正確的復原通關密語。 + 備份可能無法使用此安全密語解密:請驗證您是否輸入正確的復原安全密語。 正在復原備份: 解鎖歷史紀錄 請輸入復原金鑰 @@ -724,7 +724,7 @@ %d 新的金鑰已加入到此工作階段。 - 取得最新的復原金鑰版本 (%s0。 + 無法取得最新的復原金鑰版本 (%s0。 自備份復原 刪除備份 金鑰備份已為此工作階段正確設定。 @@ -736,25 +736,25 @@ 備份有從未驗證的 %s 工作階段而來的有效簽章 備份有從已驗證的 %s 工作階段而來的無效簽章 備份有從未驗證的 %s 工作階段而來的無效簽章 - 請刪除備份…… + 請刪除備份… 刪除備份 - 要從伺服器刪除您已備份的加密金鑰?您將無法使用您的復原金鑰來讀取已加密的訊息歷史。 - 如果您現在登出的話,您將會失去您的加密訊息 - 金鑰備份進行中。如果您現在登出,您將會失去您的加密訊息。 - 安全金鑰備份應該在您所有的工作階段中啟用以避免失去對您的加密訊息的存取權。 - 我不想要我的加密訊息 - 正在備份金鑰…… + 從伺服器刪除您已備份的加密金鑰?您將無法使用您的復原金鑰來讀取已加密的訊息歷史。 + 如果您現在登出,您將會失去已加密訊息 + 金鑰備份進行中。如果您現在登出,您將失去已加密訊息的存取權。 + 安全金鑰備份應該在您所有的工作階段中啟用,以避免失去已加密訊息的存取權。 + 我不想要我的已加密訊息 + 正在備份金鑰… 您確定嗎? 備份 - 除非您在登出前備份您的金鑰,否則您將會失去對您的加密訊息的存取權。 + 除非您在登出前備份您的金鑰,否則您將會失去已加密訊息的存取權。 您想要登出嗎? - 加密訊息復原 + 已加密訊息復原 請輸入使用者名稱。 開始使用金鑰備份 (進階) 手動匯出金鑰 - 以通關密語保護您的備份。 - 我們將會在您的家伺服器上儲存一份加密過的您的金鑰副本。使用通關密語保護您的備份以確保其安全。 + 以安全密語保護您的備份。 + 我們將會在您的家伺服器儲存一份您已加密的金鑰副本。使用安全密語保護您的備份以確保其安全。 \n \n要有最大的安全性,這個應該要與您的帳號密碼不一樣。 正在建立備份 @@ -762,27 +762,27 @@ (進階)使用復原金鑰設定 成功! 您的金鑰正在備份。 - 您的復原金鑰是安全網,如果您忘記您的通關密語,您可以使用它來復原您對您的加密訊息的存取權。 -\n把你的復原金鑰放在非常安全的地方,如密碼管理員(或保險箱) + 您的復原金鑰是一個安全網,如果您忘記您的安全密語,您可以使用它來復原您對已加密訊息的存取。 +\n請把您的復原金鑰放在非常安全的地方,如密碼管理員(或保險箱) 確保您的復原金鑰放在非常安全的地方,如密碼管理員(或保險箱) 我已經複製完了 分享 - 永遠不失去加密訊息 + 絕不失去已加密訊息 使用金鑰備份 新安全訊息金鑰 管理金鑰備份 - 正在備份金鑰…… + 正在備份金鑰… 所有金鑰都已備份 - 正在備份 %d 金鑰…… + 正在備份 %d 金鑰… 版本 演算法 簽章 - 要在此工作階段上使用金鑰備份,現在就使用您的通關密語或復原金鑰復原。 - 正在計算復原金鑰…… - 正在下載金鑰…… - 正在匯出金鑰…… + 要在此工作階段上使用金鑰備份,現在就使用您的安全密語或復原金鑰復原。 + 正在計算復原金鑰… + 正在下載金鑰… + 正在匯出金鑰… 忽略 使用單一登入系統登入 使用 Enter 傳送訊息 @@ -806,7 +806,7 @@ 新訊息 新邀請 - ** 傳送失敗 - 請開啟聊天室 + ** 無法傳送 - 請開啟聊天室 抱歉,使用 Jitsi 建立會議通話在舊裝置上並不支援(Android 系統版本小於 6.0 的裝置) 未知的 IP 有新工作階段正在要求加密金鑰。 @@ -821,7 +821,7 @@ 金鑰分享請求 忽略 已驗證! - 知道了 + 了解 驗證請求 %s 想要驗證您的工作階段 未知錯誤 @@ -840,20 +840,20 @@ 對話 您的私人訊息對話將會在此顯示。點擊右下角的 + 可以建立私訊。 聊天室 - 您的聊天室將會在此顯示。點擊右下角的 + 來尋找既有的或開始您自己的。 + 您的聊天室將會在此顯示。點擊右下角的 + 來尋找既有的或開始您自己的聊天室。 反應 同意 新增反應 檢視反應 反應 - 由使用者刪除的活動 - 由聊天室管理員審核的活動 + 使用者刪除的活動 + 聊天室管理員審核的活動 活動格式錯誤,無法顯示 建立新聊天室 沒有網路。請檢查您的網路連線。 變更 變更網路 - 請稍候…… + 請稍候… 無法預覽此聊天室 聊天室 直接訊息 @@ -871,43 +871,43 @@ 偏好設定 安全與隱私 推送規則 - 未定義通送規則 + 未定義推送規則 沒有已註冊的推送閘道 - App ID: + 應用程式 ID: 推送金鑰: 應用程式顯示名稱: 工作階段顯示名稱: Url: 格式: - 音訊與視訊 - 說明與關於 + 語音與視訊 + 說明與協助 註冊權杖 建議 請在下面編寫您的建議。 在此描述您的建議 感謝,建議已成功傳送 - 建議傳送失敗 (%s) + 無法傳送建議(%s) 在時間軸中顯示隱藏的活動 直接訊息 - 正在等待…… - 正在加密縮圖…… + 正在等待… + 正在加密縮圖… 正在傳送縮圖 (%1$s / %2$s) - 正在加密檔案…… + 正在加密檔案… 正在傳送檔案 (%1$s / %2$s) 檔案 %1$s 已下載! (已編輯) 訊息編輯 找不到編輯 - 過濾對話…… + 過濾對話… 找不到您要尋找的東西? - 建立新聊天室 - 傳送新直接訊息 + 建立一間新聊天室 + 傳送一則新的直接訊息 檢視聊天室目錄 - 名稱或 ID (#example:matrix.org) + 名稱或 ID(#example:matrix.org) 啟用滑動以在時間軸上回覆 連結已複製到剪貼簿 整合管理員 - 正在建立聊天室…… + 正在建立聊天室… 檢視編輯歷史 婉拒 要繼續,您必須接受此服務的條款。 @@ -929,38 +929,38 @@ 當應用程式在背景時,您將不會收到訊息通知。 探索 管理您的探索設定。 - 您未使用任何身份識別伺服器 - 看起來您正在嘗試連線到其它家伺服器。您想要登出嗎? - 身份識別伺服器 - 取消連線到身份識別伺服器 - 設定身份識別伺服器 - 變更身份識別伺服器 + 您未使用任何身分伺服器 + 看來您正在嘗試連線到其它家伺服器。您想要登出嗎? + 身分伺服器 + 取消連線到身分伺服器 + 設定身分伺服器 + 變更身分伺服器 您正在使用 %1$s 來探索與被您認識的既有聯絡人探索。 - 您目前並未使用身份識別伺服器。要探索與被您認識的聯絡人探索,請在下方設定一個。 + 您目前並未使用身分伺服器。要探索與被您認識的聯絡人探索,請在下方設定一個。 可探索的電子郵件地址 在您新增電子郵件地址後,探索選項將會出現。 在您新增電話號碼後,探索選項將會出現。 - 與您的身份識別伺服器斷線代表您無法被其他使用者探索,且您將無法透過電子郵件或電話邀請其他人。 + 與您的身分伺服器斷線代表您無法被其他使用者探索,且您將無法透過電子郵件或電話邀請其他人。 可探索的電話號碼 我們已傳送電子郵件到 %s,請檢查您的電子郵件並在確認連結上點選 - 輸入身份識別伺服器 URL - 無法連線到身份識別伺服器 - 請輸入身份識別伺服器 URL - 身份識別伺服器無服務條款 - 您選擇的身份識別伺服器沒有任何服務條款。僅在您信任服務擁有者時才繼續 + 輸入身分伺服器 URL + 無法連線到身分伺服器 + 請輸入身分伺服器 URL + 身分伺服器無服務條款 + 您選擇的身分伺服器沒有任何服務條款。僅在您信任服務擁有者時才繼續 文字訊息已傳送給 %s。請輸入其中包含的驗證碼。 - 您目前正在身份識別伺服器 %1$s 上分享電子郵件地址或電話號碼。您將必須重新連線到 %2$s 以停止分享它們。 - 同意身份識別伺服器 (%s) 的服務條款以允許您被透過電子郵件地址或電話號碼探索。 + 您目前正在身分伺服器 %1$s 上分享電子郵件地址或電話號碼。您將必須重新連線到 %2$s 以停止分享它們。 + 同意身分伺服器 (%s) 的服務條款以允許您被透過電子郵件地址或電話號碼探索。 啟用詳細紀錄。 詳細紀錄可以協助開發者在您傳送憤怒搖晃時取得更多紀錄。即使啟用這個設定,應用程式依然不會紀錄訊息內容或任何個人資料。 - 請在您接受您家伺服器的條款與條件前繼續重試。 + 請在您接受您家伺服器的條款與細則前繼續重試。 看起來伺服器回應時間似乎太久了,這可能是不良的網路連線或伺服器錯誤所造成。請稍後再試。 傳送附件 開啟導航選單 開啟建立聊天室選單 - 關閉建立聊天室選單…… - 建立新的直接對話 - 建立新的聊天室 + 關閉建立聊天室選單… + 建立一則新的直接對話 + 建立一間新聊天室 關閉金鑰備份橫幅 跳到底部 %1$s、%2$s 與 %3$s 已閱讀 @@ -977,7 +977,7 @@ 無法處理分享資料 垃圾訊息 不合適 - 自訂回報…… + 自訂回報… 回報此內容 回報此內容的理由 回報 @@ -995,21 +995,21 @@ \n \n如果您不想要看到從此使用者而來的更多內容,您可以忽略他們以隱藏他們的訊息。 整合 - 使用整合管理員以管理機器人、橋接、小工具與貼紙包。 -\n整合管理員可以代表您接收設定資料,調整小工具、傳送聊天室邀請並設定權力等級。 + 使用整合管理員以管理聊天機器人、橋接、小工具與貼圖包。 +\n整合管理員可以代表您接收設定資料,調整小工具、傳送聊天室邀請並設定權限等級。 允許整合 小工具 載入小工具 此小工具新增由: 使用它可能會設定 cookies 並與 %s 分享資料: 使用它可能會與 %s 分享資料: - 載入小工具失敗。 + 無法載入小工具。 \n%s 重新載入小工具 在瀏覽器中開啟 撤銷我的存取權限 您的顯示名稱 - 您的大頭貼 URL + 您的大頭照 URL 您的使用者 ID 您的佈景主題 小工具 ID @@ -1020,7 +1020,7 @@ 使用相機 使用麥克風 讀取 DRM 保護的媒體 - 這不是有效的 Matrix 伺服器位置 + 這不是有效的 Matrix 伺服器位址 忽略使用者 所有訊息(吵雜) 所有訊息 @@ -1035,7 +1035,7 @@ 您未忽略任何使用者 長按聊天室以檢視更多選項 %1$s 將聊天室設為公開給所有知道連結的人。 - %1$s 將聊天室設為僅邀請可進入。 + %1$s 將聊天室設為邀請才可進入。 未讀訊息 這是您的通訊。您才是所有者。 直接或在群組中與夥伴們聊天 @@ -1051,16 +1051,16 @@ 自訂與進階設定 繼續 連線到 %1$s - 連線到 Element Matrix Services + 連線到 Element Matrix 服務 連線到自訂伺服器 登入到 %1$s 註冊 登入 以 SSO 繼續 - Element Matrix Services 位置 - 位置 + Element Matrix 服務位址 + 位址 組織有專業主機 - 輸入 Modular Element 或您想要使用的伺服器位置 + 輸入 Modular Element 或您想要使用的伺服器位址 載入頁面時發生錯誤:%1$s (%2$d) 應用程式無法登入此家伺服器。家伺服器支援以下登入類型:%1$s。 \n @@ -1069,23 +1069,23 @@ 應用程式無法在此家伺服器上建立帳號。 \n \n您想要使用網路客戶端註冊嗎? - 此電子郵件地址未關聯到任何帳號。 + 此電子郵件地址與任何帳號無關聯。 在 %1$s 上重設密碼 驗證郵件已傳送到您的收件匣以確認您要設定新密碼。 下一步 電子郵件 新密碼 警告! - 變更您的密碼將會重設在您所有工作階段中任何的端到端加密金鑰,讓已加密的聊天歷史無法讀取。請在重設您的密碼前從其他工作階段設定金鑰備份或匯出您的聊天室金鑰。 + 變更您的密碼將會重設您所有工作階段中任何的端對端加密金鑰,讓已加密的聊天歷史無法讀取。請在重設您的密碼前從其他工作階段設定金鑰備份或匯出您的聊天室金鑰。 繼續 - 此電子郵件地址未被連結到任何帳號 + 此電子郵件位址未被連結到任何帳號 檢查您的收件匣 驗證電子郵件已傳送至 %1$s。 輕點連結以確認您的新密碼。在您使用了其中包含的連結後,請點擊下方。 我已經驗證了我的電子郵件地址 成功! 您的密碼已被重設。 - 您已登出所有工作階段,且不會再收到推播通知。要重新啟用通知,請在裝置上再次登入。 + 您已登出所有工作階段,且不會再收到推送通知。要重新啟用通知,請在裝置上再次登入。 返回登入 警告 您的密碼未變更。 @@ -1127,7 +1127,7 @@ 輸入的驗證碼不正確。請檢查。 未更新的家伺服器 - 傳送了太多請求。您可以在 %1$d 秒後重試…… + 傳送了太多請求。您可以在 %1$d 秒後重試… 檢視由 您已登出 @@ -1158,7 +1158,7 @@ \n請先清除您的資料,然後再以其他帳號登入。 您的 matrix.to 連結格式錯誤 描述太短了 - 初始化同步…… + 初始化同步… 進階設定 開發者模式 開發者模式會啟用隱藏的功能,但可能會造成應用程式較不穩定。僅供開發者使用! @@ -1169,12 +1169,12 @@ 設定 目前的工作階段 其他工作階段 - 僅顯示第一個結果,輸入更多字母…… + 僅顯示第一個結果,輸入更多字母… 快速失敗 在發生非預期的錯誤時,${app_name} 可能更常當機 將 ¯\\_(ツ)_/¯ 附加到純文字訊息中 啟用加密 - 加密一旦啟用就無法停用。 + 一旦啟用加密就無法停用。 您的電子郵件網域無法在此伺服器上註冊 未受信任的登入 它們相符 @@ -1190,7 +1190,7 @@ 圖片。 音訊 檔案 - 正在等待…… + 正在等待… %s 已取消 您已取消 %s 已接受 @@ -1201,16 +1201,16 @@ 掃描其他使用者裝置的條碼以安全地相互驗證 掃描他們的條碼 無法掃描 - 如果您無法面對面進行,請用比較顏文字代替 - 透過比較顏文字驗證 + 如果您無法面對面進行,請用比較表情符號代替 + 透過比較表情符號驗證 驗證 %s 已驗證 %s - 正在等待驗證 %s…… - 此聊天室中的訊息未端到端加密。 - 此聊天室中的訊息有端到端加密。 + 正在等待驗證 %s… + 此聊天室中的訊息未端對端加密。 + 此聊天室的訊息有端對端加密。 \n -\n您的訊息已被鎖保護,只有您與收件者有獨一無二的金鑰可以將其解鎖。 - 安全性 +\n您的訊息已被鎖保護,只有您與收件者有獨特的金鑰可以解鎖。 + 安全 取得更多資訊 更多 聊天室設定 @@ -1220,18 +1220,18 @@ 上傳 離開聊天室 - 正在離開聊天室…… + 正在離開聊天室… 管理員 - 板主 + 主持人 自訂 邀請 使用者 %1$s 中的管理員 - %1$s 中的板主 - %2$s 中的自訂 (%1$d) + %1$s 中的主持人 + 自訂 %2$s 中的 (%1$d) 跳至讀取回條 ${app_name} 無法處理類型為「%1$s」的事件 - 在彩現 id「%1$s」事件的內容時,${app_name} 遇到問題 + 在渲染 id「%1$s」事件的內容時,${app_name} 遇到問題 取消忽略 此工作階段無法與您其他的工作階段分享此驗證。 \n驗證將會儲存在本機並在未來版本的應用程式中共享。 @@ -1239,16 +1239,16 @@ 將指定的表情符號以彩虹的方式上色後傳送 時間軸 訊息編輯器 - 啟用端到端加密…… + 啟用端對端加密… 啟用加密? - 一旦啟用對聊天室的加密就無法停用。傳送到已加密聊天室的訊息無法被伺服器看見,僅有聊天室的參與者可見。啟用加密可能會讓許多機器人與橋接無法運作。 + 一旦啟用,對聊天室的加密就無法停用。傳送到已加密聊天室的訊息無法被伺服器看見,僅有聊天室的參與者可見。啟用加密可能會讓許多聊天機器人與橋接無法運作。 啟用加密 要確定安全,請透過一次性的代碼驗證 %s。 要確定安全,請面對面進行或使用其他方式來通訊。 - 比較獨一無二的顏文字,並確保它們以相同的順序出現。 + 比較獨特的表情符號,並確保它們以相同的順序出現。 以其中一方的畫面上顯示的代碼與其他使用者的畫面比較。 - 與此使用者的訊息是端到端加密的,無法被第三方讀取。 - 您的新工作階段已被驗證。其已存取您已加密的訊息,其他使用者也會看到其已受信任。 + 與此使用者的訊息是端對端加密的,無法被第三方讀取。 + 您新的工作階段現在已被驗證。其已存取您已加密的訊息,其他使用者也會看到其已受信任。 交叉簽署 交叉簽署已啟用 \n私鑰在裝置上。 @@ -1264,25 +1264,25 @@ 登出此工作階段 無可用的密碼學資訊 因為您已驗證此工作階段,所以其在安全通訊上是可受信任的: - 驗證此工作階段以將其標記為受信任並讓其可以存取已加密的訊息。如果您並未登入此工作階段,您的帳號可能已被盜用: + 驗證此工作階段以將其標記為受信任並讓其可以存取已加密訊息。如果您並未登入此工作階段,您的帳號可能已被盜用: %d 活躍的工作階段 驗證此裝置 - 使用既有的工作階段來驗證這個,讓它可以存取已加密的訊息。 + 使用已存在的工作階段來驗證這個,讓它可以存取已加密的訊息。 驗證 已驗證 警告 - 取得工作階段失敗 + 無法取得工作階段 工作階段 受信任 未受信任 - 因為 %1$s (%2$s) 已驗證此工作階段,所以其在安全通訊上是可受信任的: - %1$s (%2$s) 使用新的工作階段登入: - 直到此使用者信任此工作階段為止,傳送到該工作階段與從它傳送的訊息都會以警告標記。或者您可以手動進行驗證。 + 因為 %1$s (%2$s)已驗證此工作階段,所以其在安全通訊上是可受信任的: + %1$s(%2$s)使用新的工作階段登入: + 直到此使用者信任此工作階段為止,傳送到該工作階段與從它傳送的訊息都會標記為警告。或者您可以手動進行驗證。 初始化交叉簽署 重設金鑰 - QR code + QR 碼 就快完成了!%s 有顯示打勾嗎? @@ -1290,10 +1290,10 @@ 使用者名稱 開發者工具 帳號資料 - 使用復原通關密語或金鑰 + 使用復原安全密語或金鑰 如果您無法存取既有的工作階段的話 - 在儲存空間中找不到秘密 - 移除…… + 在儲存空間找不到秘密 + 移除… 您想要傳送此附件到 %1$s 嗎? 使用原始大小傳送圖片 @@ -1307,10 +1307,10 @@ 金鑰已為最新! ${app_name} Android 金鑰請求 - 解鎖已加密的訊息歷史 + 解鎖已加密訊息歷史 重新整理 新登入。是您嗎? - 使用此工作階段來驗證新的,讓它可以存取已加密的訊息。 + 使用此工作階段來驗證新的,讓它可以存取已加密訊息。 這不是我 您的帳號可能已被盜用 如果您取消,您可能無法在此裝置上讀取已加密的訊息,而其他使用者也不會信任它 @@ -1326,46 +1326,46 @@ \n我們建議您立刻在設定中變更您的密碼與復原金鑰。 已取消驗證。您可以再次開始驗證。 驗證已取消 - 復原通關密語 + 復原安全密語 訊息金鑰 輸入您的 %s 以繼續。 - 不要重用您的帳號密碼。 + 不要使用您的帳號密碼。 這可能需要數秒,請稍候。 設定復原。 已完成! 把它放在安全的地方 完成 正在發佈已建立的識別金鑰 - 正在從通關密語生成安全金鑰 + 正在從安全密語生成安全金鑰 正在定義 SSSS 預設金鑰 - 正在同步主控金鑰 + 正在同步主金鑰 正在同步使用者金鑰 正在同步自行簽署金鑰 設定金鑰備份 - 您的 %2$s 與 %1$s 設定好了。 + 您的 %2$s 與 %1$s 現在設定好了。 \n -\n請保護它們的安全!如果您遺失所有作用中的工作階段,您將會需要它們來解鎖已加密的訊息並保護資訊。 +\n請確保它們的安全!如果您失去所有活躍的工作階段,您將會需要它們來解鎖已加密訊息並保護資訊。 列印並將其存放在安全的地方 將其儲存在 USB 隨身碟或備份磁碟上 將其複製到您的私人雲端儲存空間 加密已啟用 - 在此聊天室中的訊息已端到端加密。取得更多資訊並在使用者的個人檔案中驗證他們。 + 在此聊天室中的訊息已端對端加密。取得更多資訊並在使用者的個人檔案中驗證他們。 加密未啟用 用於此聊天室的加密未受支援 %s 建立並設定聊天室。 就快完成了!其他裝置有顯示打勾嗎? - 就快完成了!正在等待確認…… - 正在等待 %s…… - 匯入金鑰失敗 + 就快完成了!正在等待確認… + 正在等待 %s… + 無法匯入金鑰 通知設定 訊息包含 @room 在一對一的聊天中已加密的訊息 - 群組聊天中的已加密訊息 + 群組聊天中的加密訊息 當聊天室升級時 疑難排解 - 傳送純文字訊息,不將它們解譯為 markdown + 傳送純文字訊息,不將它們轉譯為 markdown 不正確的使用者名稱及/或密碼。輸入的密碼以空格開頭或結尾,請檢查。 - 訊息…… + 訊息… 提供加密升級 驗證您自己與其他人以保證聊天安全 輸入您的 %s 以繼續 @@ -1375,49 +1375,49 @@ 正在檢查備份金鑰 正在檢查備份金鑰 (%s) 正在取得曲線金鑰 - 正在從通關密語生成 SSSS 金鑰 - 正在從通關密語生成 SSSS 金鑰 (%s) + 正在從安全密語生成 SSSS 金鑰 + 正在從安全密語生成 SSSS 金鑰 (%s) 正在從復原金鑰生成 SSSS 金鑰 - 正在 SSSS 中儲存金鑰備份秘密 - 輸入您的金鑰備份通關密語以繼續。 + 正在 SSSS 中儲存金鑰備份的秘密 + 輸入您的金鑰備份安全密語以繼續。 使用您的金鑰備份復原金鑰 - 不知道您的金鑰備份通關密語,您可以 %s。 + 不知道您的金鑰備份安全密語,您可以 %s。 金鑰備份復原金鑰 避免對應用程式進行螢幕截圖 啟用此設定會新增 FLAG_SECURE 到所有活動。重新啟動應用程式以讓變動生效。 - 設定新的帳號密碼…… - 在您的其他裝置上使用最新的 ${app_name}、${app_name} Web、${app_name} 桌面版、${app_name} iOS、${app_name} for Android 或其他有交叉簽章功能的 Matrix 客戶端 - ${app_name} Web + 設定新的帳號密碼… + 在您的其他裝置上使用最新的 ${app_name}、${app_name} 網頁版、${app_name} 桌面版、${app_name} iOS、${app_name} 安卓版或其他有交叉簽署功能的 Matrix 客戶端 + ${app_name} 網頁版 \n${app_name} 桌面版 ${app_name} iOS \n${app_name} Android - 或其他有交叉簽章功能的 Matrix 客戶端 + 或其他有交叉簽署功能的 Matrix 客戶端 在您的其他裝置上使用最新的 ${app_name}: - 強制丟棄目前在加密聊天室中的外發群組工作階段 - 僅在加密聊天室中支援 + 強制丟棄目前在已加密聊天室中的外發群組工作階段 + 僅在已加密聊天室中支援 使用您的 %1$s 或使用您的 %2$s 以繼續。 使用復原金鑰 選取您的復原金鑰,或是透過打字或從您的剪貼簿貼上來手動輸入 - 存取安全儲存空間失敗 + 無法存取安全儲存空間 透過文字手動驗證 驗證登入 - 透過顏文字來進行互動驗證 - 從您的其他工作階段驗證此登入以確認您的身份並授予存取加密訊息的權限。 + 透過表情符號來進行互動驗證 + 從您的其他工作階段驗證此登入以確認您的身分,並授予存取已加密訊息的權限。 請選擇使用者名稱。 請選擇密碼。 - 仔細檢查此連結 + 請再次檢查此連結 連結 %1$s 正在將您帶往其他網站:%2$s。 \n -\n您確定您想要繼續嗎? +\n您確定要繼續嗎? 我們無法建立您的直接訊息。請檢查您想要邀請的使用者,然後再試一次。 未加密 - 由未驗證的裝置加密 + 已由未驗證的裝置加密 驗證正在存取您帳號的新登入:%1$s %1$s:%2$s %1$s:%2$s %3$s 新增成員 邀請 - 正在邀請使用者…… + 正在邀請使用者… 邀請使用者 邀請已傳送給 %1$s 邀請已傳送給 %1$s 與 %2$s @@ -1438,34 +1438,34 @@ 使用我的 Matrix 識別符登入 登入 如果您在家伺服器上建立了帳號,使用您的 Matrix ID(例如 @user:domain.com)與下方的密碼。 - 使用者識別符 + Matrix ID 這不是有效的使用者識別符。預期中的格式:\'@user:homeserver.org\' 找不到有效的家伺服器。請檢查您的識別符 飛航模式開啟 目前語言 其他可用的語言 - 正在載入可用的語言…… + 正在載入可用的語言… 開啟 %s 的條款 - 從身份識別伺服器 %s 斷線? - 此身份識別伺服器太舊了。${app_name} 僅支援 API V2。 + 從身分伺服器 %s 斷線? + 此身分伺服器太舊了。${app_name} 僅支援 API V2。 此動作是不可能的。家伺服器太舊了。 - 請先設定身份識別伺服器。 - 請先在設定中同意身份識別伺服器的條款。 + 請先設定身分伺服器。 + 請先在設定中同意身分伺服器的條款。 為了保護您的隱私,${app_name} 僅支援傳送雜湊過的使用者電子郵件地址與電話號碼。 - 關聯失敗。 + 已無法關聯。 目前沒有此識別符的關聯。 - 您的家伺服器 (%1$s) 建議將 %2$s 用於您的身份識別伺服器 + 您的家伺服器 (%1$s) 建議將 %2$s 用於您的身分伺服器 使用 %1$s - 或者您可以輸入任何身份識別伺服器 URL - 輸入身份識別伺服器 URL + 或者您可以輸入任何身分伺服器 URL + 輸入身分伺服器 URL 遞交 播放 - 忽略 + 關閉 複製 成功 通知 - ${app_name} 呼叫失敗 - 建立即時連線失敗。 + 無法 ${app_name} 呼叫 + 無法建立即時連線。 \n請要求您家伺服器的管理員設定 TURN 伺服器以讓通話的運作更可靠。 選取音效裝置 電話 @@ -1477,7 +1477,7 @@ 關閉 HD 開啟 HD - SSL 錯誤:對方的身份未驗證。 + SSL 錯誤:對方的身分未驗證。 SSL 錯誤。 取消邀請 將您自己降級? @@ -1491,11 +1491,11 @@ 取消忽略此使用者將再次顯示從他們而來的所有訊息。 取消邀請 您確定您想要取消對此使用者的邀請嗎? - 踢除使用者 - 踢除的理由 - 踢除使用者將會將他們從此聊天室中移除。 + 移除使用者 + 移除的理由 + 使用者將會從此聊天空間中被移除。 \n -\n要避免他們再次加入,您應改為封鎖他們。 +\n為了防止他們再加入,您應該封鎖他們。 封鎖使用者 封鎖的理由 取消封鎖使用者 @@ -1504,7 +1504,7 @@ 設定安全備份 重設安全備份 在此裝置上設定 - 透過備份加密金鑰到您的伺服器上以防止遺失對加密訊息與資料的存取權。 + 透過備份加密金鑰到您的伺服器上,以防止失去存取已加密訊息與資料。 為您現有的備份生成新的安全金鑰或設定新的安全密語。 這將會取代您目前的金鑰或密語。 整合被停用 @@ -1514,25 +1514,25 @@ 金鑰已成功匯出 檢視 - 作用中的小工具 + 活躍的小工具 復原金鑰已儲存。 安全備份 - 防止遺失對加密訊息與資料的存取權 + 小心不要失去已加密訊息與資料的存取權 設定安全備份 - 在主畫面上新增專用的未讀通知分頁。 - 新增到最愛 - 從最愛移除 + 新增專用的未讀通知分頁到主畫面。 + 新增到我的最愛 + 從我的最愛中移除 您未做出變更 您讓聊天室對所有知道連結的人公開。 - 您讓聊天室變為僅邀請可加入。 - 輸入您想要使用的伺服器地址 + 您讓聊天室變為邀請才可加入。 + 輸入您想要使用的伺服器位址 如果您不知道您的密碼,請返回並重設。 貼圖 管理動作 在 %1$s 中的預設 - 您的伺服器管理員已在私人聊天室與直接訊息中預設停用端到端加密。 + 您的伺服器管理員已在私人聊天室與直接訊息中預設停用端對端加密。 輸入只有您知道的安全密語,用於保護您伺服器上的安全祕密。 - 如果您現在取消,您可能會失去對加密訊息與資料的存取權,如果您失去對您登入的存取權的話。 + 如果您現在取消,您可能會失去存取已加密訊息與資料,如果您失去存取您的登入。 \n \n您也可以在設定中設定安全備份與管理您的金鑰。 您建立並設定了聊天室。 @@ -1546,7 +1546,7 @@ 停止相機 開啟相機 安全備份 - 透過備份加密金鑰到您的伺服器上以防止遺失對加密訊息與資料的存取權。 + 確保您能存取加密訊息與資料,請在您的伺服器上備份您的金鑰。 設定 使用安全金鑰 生成安全金鑰並儲存在安全的地方,如密碼管理員或保險櫃。 @@ -1563,28 +1563,28 @@ 您成功變更了聊天室設定 您無法存取此訊息 正在等待此訊息,可能需要花一點時間 - 由於端到端加密,您可能要等待某人的訊息抵達,因為加密金鑰未正確地傳送給您。 + 由於端對端加密,您可能要等待某人的訊息抵達,因為加密金鑰未正確地傳送給您。 您無法存取此訊息,因為您被傳送者封鎖 您無法存取此訊息,因為您的工作階段未被傳送者所信任 您無法存取此訊息,因為傳送者刻意未傳送金鑰 正在等待加密歷史 Riot 現在是 Element 了! 我們很高興地我們已變更名稱!您的應用程式是最新的,而您也登入了您的帳號。 - 知道了 + 了解 取得更多資訊 儲存復原金鑰於 - 正在擷取您的聯絡人…… + 正在擷取您的聯絡人… 您的通訊錄為空 通訊錄 撤銷邀請 撤銷對 %1$s 的邀請? 被 %1$s 封鎖 - 取消封鎖使用者失敗 + 無法取消封鎖使用者 推送通知已停用 審閱您的設定以啟用推送通知 選擇 PIN 碼以確保安全 確認 PIN 碼 - 驗證 PIN 碼失敗,請點擊新的。 + 無法驗證 PIN 碼,請點擊新的。 輸入您的 PIN 碼 忘記 PIN 碼? 重設 PIN 碼 @@ -1596,17 +1596,17 @@ 開始通話前要求確認 您沒有在此聊天室中開始會議通話的權限 開始視訊會議 - 開始音訊會議 - 會議使用 Jitsi 安全與權限策略。目前在聊天室中的所有人在您的會議開始時都會看到加入的邀請。 + 開始語音會議 + 會議使用 Jitsi 安全與權限策略。目前在聊天室中的所有人,在您會議開始時都會看到加入的邀請。 您無法與自己通話 您無法與自己進行通話,請等候參與者接受邀請 - 新增小工具失敗 - 移除小工具失敗 + 無法新增小工具 + 無法移除小工具 %1$d/%2$d 金鑰匯入成功。 管理整合 - 無作用中的小工具 + 非活躍中的小工具 已建立聊天室,但因為以下理由而未傳送某些邀請: \n \n%s @@ -1629,8 +1629,8 @@ 管理連結到您 Matrix 帳號的電子郵件地址與電話號碼 代碼 請使用國際格式(電話號碼必須以 \'+\' 開頭) - 透過確認此登入來驗證您的身份,以及授予存取加密訊息的權限。 - 無法開啟禁止您進入的聊天室。 + 驗證此登入來確認您的身分,以及授予存取已加密訊息的權限。 + 無法開啟封鎖您的聊天室。 找不到此聊天室。請確定它存在。 %d 秒 @@ -1657,24 +1657,24 @@ 顯示您現在可以驗證的 %d 個裝置 - 您將會重新啟動,沒有歷史紀錄,已信任的裝置或已信任的使用者 + 重新啟動後,歷史紀錄、訊息、已信任的裝置或已信任的使用者將會被清空 如果您重設了所有東西 僅在您沒有其他裝置可以驗證此裝置時才使用這個。 - 重設所有東西 + 恢復所有設定 忘記或遺失所有復原選項?重設所有東西 您已加入。 %s 已加入。 - 此聊天中的訊息有端到端加密。 + 此聊天中的訊息有端對端加密。 離開 設定 - 這裡的訊息有端到端加密。 + 這裡的訊息有端對端加密。 \n -\n您的訊息已使用鎖來保護,只有您與收件者才有獨特的金鑰來解鎖他們。 - 這裡的訊息沒有端到端加密。 +\n您的訊息已被鎖保護,只有您與收件者有獨特的金鑰可以解鎖。 + 這裡的訊息沒有端對端加密。 此家伺服器正在執行較舊的版本。請要求您的家伺服器管理原升級。您可以繼續,但某些功能可能無法正常運作。 - 您讓此變為僅邀請。 - %1$s 讓此變為僅邀請。 - 在已加密的聊天室中顯示完整歷史紀錄 + 您讓此變為邀請制。 + %1$s 讓此變為邀請制。 + 在已加密的聊天室顯示完整歷史紀錄 %1$s 與 %2$s %1$s 在 %2$s 與 %3$s @@ -1684,10 +1684,10 @@ 請點擊通知。如果您沒有看到通知,請檢查系統設定。 通知顯示 您正在檢視通知!點擊我! - 接收推播失敗。解決方法可能是重新安裝應用程式。 - 應用程式正在接收 PUSH - 應用程式正在等待 PUSH - 測試推播 + 接收推送失敗。解決方法可能是重新安裝應用程式。 + 應用程式正在接收推送 + 應用程式正在等待推送 + 測試推送 過濾被封鎖的使用者 您沒有開始通話的權限 您沒有開始會議通話的權限 @@ -1708,18 +1708,18 @@ 直接訊息 傳送金鑰共享請求歷史 沒有更多結果 - 未掃描 QR code! - 無效的 QR code(無效的 URI)! + 未掃描 QR 碼! + 無效的 QR 碼(無效的 URI)! 無法對您自己直接訊息! 透過文字分享 在 Matrix 上搜尋聯絡人 設定大頭照 使用者尚未提供其同意。 - 與夥伴們分享此條碼,這樣他們就可以掃描它來加入您並開始聊天。 - 我的條碼 - 分享我的條碼 - 掃描 QR code - 不是有效的 Matrix QR code + 與夥伴們分享此邀請碼,這樣他們就可以掃描它來加入您並開始聊天。 + 我的邀請碼 + 分享我的邀請碼 + 掃描 QR 碼 + 不是有效的 Matrix QR 碼 🔐️ 在 ${app_name} 上加入我 嗨,和我在 ${app_name} 上聊天吧:%s 邀請朋友 @@ -1731,25 +1731,25 @@ 這是此對話的開頭。 這是 %s 的開頭。 您沒有在此聊天室中啟用加密的權限。 - 正在建立聊天室…… - 不允許部份字元 - 請提供聊天室地址 - 此地址已被使用 - 如果聊天室僅用於與您的家伺服氣上的內部團隊協作的話,可以啟用此功能。但無法在稍後變更。 + 正在建立聊天室… + 有些字元未被允許 + 請提供聊天室位址 + 此位址已被使用 + 如果聊天室僅用於與您家伺服器上內部團隊協作的話,可以啟用此功能。但無法在稍後變更。 封鎖任何不是 %s 一部分的人加入此聊天室 隱藏進階 顯示進階 %2$d 中的 %1$d 給予同意 撤銷我的同意 - 您已同意傳送電子郵件地址與電話號碼到此身份提供者以從您的聯絡人中探索其他使用者。 + 您已同意傳送電子郵件地址與電話號碼到此身分提供者,以從您的聯絡人中探索其他使用者。 傳送電子郵件或電話號碼 建議 已知的使用者 - QR code - 透過 QR code 新增 + QR 碼 + 透過 QR 碼新增 允許存取您聯絡人的權限。 - 要掃描 QR code,您必須允許存取攝影機。 + 要掃描 QR 碼,您必須允許存取相機。 開始聊天 變更您目前的 PIN 變更 PIN @@ -1758,27 +1758,27 @@ \n請稍後再試,或是詢問聊天室管理員來檢查您是否可以存取。 無法擷取目前的聊天室目錄可見度 (%1$s)。 將此聊天室在 %1$s 的聊天室目錄中公開發佈? - 取消發佈此地址 - 發佈此地址 - 新增本地地址 - 此聊天室沒有本地地址 - 設定此聊天室的地址,這樣使用者就可以透過您的家伺服器 (%1$s) 尋找此聊天室 - 本地地址 - 新發佈的地址(例如:#alias:server) - 尚無其他已發佈的地址。 - 尚無其他已發佈的地址,在下面新增一個。 - 刪除地址「%1$s」? - 取消發佈地址「%1$s」? + 取消發佈此位址 + 發佈此位址 + 新增本機位址 + 此聊天室沒有本機位址 + 設定此聊天室的位址,這樣使用者就可以透過您的家伺服器 (%1$s) 搜尋此聊天室 + 本機位址 + 新發佈的位址(例如:#alias:server) + 尚無其他已發佈的位址。 + 尚無其他已發佈的位址,在下面新增一個。 + 刪除位址「%1$s」? + 取消發佈位址「%1$s」? 發佈 - 手動發佈新地址 - 其他已發佈地址: - 這是主要地址 - 任何伺服器上的任何人都可以用已發佈的地址加入您的聊天室。要發佈地址,必須先將其設為本地地址才行。 - 已發佈的地址 - 檢視並管理此聊天室的地址,以及其在聊天室目錄中的可見性。 - 聊天室地址 + 手動發佈新位址 + 其他已發佈位址: + 這是主要位址 + 任何伺服器上的任何人,都可以用已發佈的位址加入您的聊天室。要發佈位址,必須先將其設為本地位址才行。 + 已發佈的位址 + 檢視並管理此聊天室的位址,以及其在聊天室目錄中的可見性。 + 聊天室位址 聊天室存取權 - 對可讀取歷史紀錄的人的變更將僅試用於此聊天室中的未來訊息。現有歷史紀錄的可見性將保持不便。 + 對可讀取歷史紀錄的人的變更,將僅試用於此聊天室中的未來訊息。現有歷史紀錄的可見性將保持不便。 取消發佈 新增 傳送下雪特效 ❄️ @@ -1800,34 +1800,34 @@ 變更聊天室名稱 變更歷史紀錄可見性 啟用聊天室加密 - 變更聊天室的主要位置 + 變更聊天室的主要位址 變更聊天室大頭照 修改小工具 通知每個人 移除其他人傳送的訊息 封鎖使用者 - 踢除使用者 + 移除使用者 變更設定 邀請使用者 傳送訊息 預設角色 - 您無權更新聊天室各部份所需的角色 + 您無權限更新聊天室各部份所需的角色 選取聊天室各部份所需的角色 權限 檢視並更新聊天室各部份所需的角色。 聊天室權限 此聊天室不公開。沒有邀請,您將無法重新加入。 - 系統預設值 + 系統預設 在訊息編輯器上新增按鈕以開啟表情符號鍵盤 顯示表情符號鍵盤 - 驗證失敗 + 無法驗證 ${app_name} 需要您輸入您的憑證來執行此動作。 需要重新驗證 - 未能設定交叉簽章 - 未授權,缺少有效的身份驗證憑證 + 未能設定交叉簽署 + 未授權,缺少有效的身分驗證憑證 使用者 - 轉移電話時發生錯誤 - 轉移 + 轉接電話時發生錯誤 + 轉接 連線 先諮詢 通話中 (%1$s) @@ -1839,7 +1839,7 @@ 您保留了通話 %s 保留了通話 保留 - 恢復 + 繼續 活動內容 狀態活動已傳送! 活動已傳送! @@ -1891,15 +1891,15 @@ 新值 切換 初始同步: -\n正在下載資料…… +\n正在下載資料… 初始同步: -\n正在等待伺服器回應…… +\n正在等待伺服器回應… 您確定您想要刪除此聊天室中所有未傳送的訊息嗎? 刪除未傳送的訊息 - 訊息傳送失敗 + 無法傳送訊息 您想要取消傳送訊息嗎? - 刪除所有失敗的訊息 - 失敗 + 刪除所有錯誤的訊息 + 錯誤 已傳送 正在傳送 顯示聊天室目錄中的所有聊天室時,也顯示含有兒童不宜內容的聊天室。 @@ -1907,8 +1907,8 @@ 聊天室目錄 訊息已傳送 您被邀請了 - 空間是將聊天室與人們分組的新方式。 - 新增既有的聊天室與空間 + 聊天空間是將聊天室與人們分組的新方式。 + 新增既有的聊天室與聊天空間 離開 新增聊天室 探索聊天室 @@ -1918,10 +1918,10 @@ 目前無法存取此別名。 \n請稍後再試,或要求聊天室管理員檢查您是否有權存取。 無論如何都要加入 - 加入空間 - 建立空間 + 加入聊天空間 + 建立聊天空間 現在略過 - 加入我的空間 %1$s %2$s + 加入我的聊天空間 %1$s %2$s 他們不會是 %s 的一部分 剛到此聊天室 他們將可以探索 %s @@ -1930,9 +1930,9 @@ 透過電子郵件邀請 此刻只有您。%s 與其他人一起會更好。 邀請夥伴 - 邀請夥伴進入您的空間 + 邀請夥伴進入您的聊天空間 描述 - 正在建立空間…… + 正在建立聊天空間… 隨機 一般 讓我們為每個主題建立一個聊天室。您也可以稍後再新增,包含既有的。 @@ -1942,40 +1942,40 @@ 為它命名以繼續。 新增一些詳細資訊以協助人們識別。您隨時可以變更這些資訊。 加入一些詳細資訊以協助其脫穎而出。您隨時都可以變更這些資料。 - 建立空間 - 僅邀請,最適合您自己或團隊 + 建立聊天空間 + 邀請制,最適合您自己或團隊 私人 對任何人開放,最適合社群 公開 - 供您與您的隊友使用的私人空間 - 我與隊友 - 用來整理您聊天室的私人空間 + 您與您的團隊成員的私人聊天空間 + 我與團隊成員 + 整理您聊天室的私人聊天空間 只有我 確定合適的人有權存取 %s。 您與誰一起工作? - 要加入既有的空間,您需要邀請。 + 要加入既有的聊天空間,您需要取得邀請。 您可以稍後再更改 - 您想要建立哪種類型的空間? - 您的私人空間 - 您的公開空間 - 新增空間 + 您想要建立哪種類型的聊天空間? + 您的私人聊天空間 + 您公開的聊天空間 + 新增聊天空間 離開有指定 id 的聊天室(如果是 null 的話則為目前聊天室) - 使用指定的 id 加入空間 - 建立空間 + 使用特定的 id 加入聊天空間 + 建立聊天空間 未檢查 搜尋名稱 - 擁有此聊天室空間中的任何人都可以尋找並加入。僅此聊天室的管理員可以將其新增到空間中。 - 僅空間成員 + 此聊天空間與聊天室中的任何人都可以找到並加入。但只有此聊天室的管理員可以將其新增到聊天空間中。 + 僅限限聊天空間成員 任何人都可以尋找聊天室並加入 公開 僅被邀請的夥伴可以尋找並加入 私人 未知的存取設定 (%s) - 任何人都可以要求加入聊天室,成員可以接受或回絕 + 任何人都可以要求加入聊天室,成員可以接受或拒絕 允許訪客加入 - 空間 + 聊天空間 建議的聊天室 - 管理聊天室與空間 + 管理聊天室與聊天空間 標記為不建議 標記為建議 建議 @@ -1989,34 +1989,34 @@ 檔案太大了,無法上傳。 正在壓縮影片 %d%% - 正在壓縮圖片…… + 正在壓縮圖片… 預設使用,不再詢問 總是詢問 - 有些聊天室可能是隱藏的,因為其為私人聊天室,您需要邀請。 - 有些聊天室可能是隱藏的,因為其為私人聊天室,您需要邀請。 + 有些聊天室可能是隱藏的,因為其為私人聊天室,您需要被邀請。 + 有些聊天室可能是隱藏的,因為其為私人聊天室,您需要被邀請。 \n您沒有權限新增聊天室。 - 此空間沒有聊天室 + 此聊天空間沒有聊天室 請聯絡您的家伺服器管理員以取得進一步的資訊 - 看來您的家伺服器尚未支援空間 + 看來您的家伺服器尚未支援聊天空間 想要做點實驗嗎? -\n您可以將既有的空間新增至其他空間中。 - 您是此空間唯一的管理員。若離開將意味著沒有人可以控制它。 +\n您可以將既有的聊天空間新增至其他聊天空間中。 + 您是此聊天空間唯一的管理員。若離開將意味著沒有人可以控制它。 除非被重新邀請,否則您將無法重新加入。 您是這裡唯一的人。如果您離開,包含您在內的所有人都將無法加入。 邀請至 %s 給予回饋 - 回饋傳送失敗 (%s) + 無法傳送回饋 (%s) 謝謝,您的回饋已成功傳送 如果您有任何後續的問題,歡迎聯絡我 - 您正在使用空間的測試版本。您的回饋有助於改善未來的版本。我們將會紀錄您的平台與使用者名稱以協助我們使用您的回饋。 + 您正在使用聊天空間的測試版本。您的回饋有助於改善未來的版本。我們將會紀錄您的平台與使用者名稱以協助我們使用您的回饋。 回饋 - 空間回饋 + 聊天空間回饋 抱歉,嘗試加入會議時發生錯誤 未命名聊天室 - 私人空間 - 公開空間 + 私人聊天空間 + 公開聊天空間 未知的人 - 轉移至 %1$s + 轉接至 %1$s 與 %1$s 進行諮詢 此伺服器已在清單中 找不到此伺服器或其聊天室清單 @@ -2024,17 +2024,17 @@ 加入新的伺服器 您的伺服器 抱歉,試圖加入時發生錯誤:%s - 空間地址 - 檢視與管理此空間的地址。 - 空間地址 + 聊天空間位址 + 檢視與管理此聊天空間的位址。 + 聊天空間位址 升級到建議的聊天室版本 此聊天室正在執行聊天室版本 %s,此家伺服器已被標記為不穩定。 您需要升級聊天室的權限 - 自動更新空間上層 + 自動更新母聊天空間 自動邀請使用者 您將要把此聊天室從 %1$s 升級到 %2$s。 - 升級聊天是是一項進階動作,通常建議在聊天室因臭蟲、缺少功能或安全漏洞而不穩定時使用。 -\n這通常只會影響聊天是在伺服器上的處理方式。 + 升級聊天室是一項進階動作,通常建議在聊天室因錯誤、缺少功能或安全漏洞而不穩定時使用。 +\n這通常只會影響在伺服器上處理聊天室的方式。 升級私人聊天室 升級公開聊天室 升級 @@ -2053,16 +2053,16 @@ 要執行此動作,請從系統設定中授予「相機」權限。 缺少執行此動作的部份權限,請從系統設定中授予權限。 - %d 通未接聽通話 + %d 通未接聽視訊通話 %d 通未接聽通話 請注意,升級會讓聊天室變為新的版本。目前的所有訊息都將保留在此被封存的聊天室中。 - 上層空間中的任何人都可以找到並加入此聊天室,不需要手動邀請所有人。您隨時都可以在聊天室設定中變更此設定。 + 母聊天空間中的任何人都可以找到並加入此聊天室,不需要手動邀請所有人。您隨時都可以在聊天室設定中變更此設定。 任何在 %s 中的人都可以找到並加入此聊天室,不需要手動邀請所有人。您隨時都可以在聊天室設定中變更此設定。 語音訊息 (%1$s) - 語音訊息作用中時無法回覆或編輯 + 語音訊息活躍時無法回覆或編輯 無法錄製語音訊息 無法播放此語音訊息 點擊您的錄音以停止或收聽 @@ -2076,19 +2076,19 @@ 錄製語音訊息 必須升級 語音 - 您可能不知道的其他空間或聊天室 - 您所知的包含此聊天是的空間 + 您可能不知道的其他聊天空間或聊天室 + 您所知包含此聊天室的聊天空間 決定誰可以找到並加入此聊天室。 - 點擊以編輯空間 - 選取空間 - 決定哪些空間可以存取此聊天室。若選取了某個空間,其成員就可以找到並加入此聊天室。 - 可以存取的空間 - 允許空間成員尋找並存取。 - 空間 %s 的成員可以找到、預覽並加入。 - 私人(僅邀請) + 點擊以編輯聊天空間 + 選取聊天空間 + 決定哪些聊天空間可以存取此聊天室。若選取了某個聊天空間,其成員就可以找到並加入此聊天室。 + 可以存取的聊天空間 + 允許聊天空間成員找到並存取此空間。 + 聊天空間 %s 的成員可以找到、預覽並加入。 + 私人(邀請制) 要傳送語音訊息,請授予「麥克風」權限。 聊天室升級 - 機器人訊息 + 來自聊天機器人的訊息 聊天室邀請 已加密的群組訊息 群組訊息 @@ -2102,15 +2102,15 @@ 預設通知 設定中的 %s 可直接在 ${app_name} 中接收邀請。 將此電子郵件地址與您的帳號連結 - 此空間的邀請已傳送給與您的帳號無關的 %s - 此聊天室的邀請已傳送給與您的帳號無關的 %s + 此聊天空間的邀請已傳送給與您的帳號無關聯的 %s + 此聊天室的邀請已傳送給與您的帳號無關聯的 %s 您所在的所有聊天室都會顯示在 Home 中。 顯示 Home 中的所有聊天室 滑動結束通話 %1$s 點擊返回 - 作用中的通話 (%1$s)。 + 進行中的通話 (%1$s)。 - %1$d 作用中的通話。 + %1$d 活躍的通話。 無回應 未接聽的視訊通話 @@ -2119,16 +2119,16 @@ 視訊通話已回絕 視訊通話已結束 • %1$s 語音通話已結束 • %1$s - 作用中的視訊通話 - 作用中的語音通話 - 來電視訊通話 - 來電語音通話 + 進行中的視訊通話 + 進行中的語音通話 + 視訊通話來電中 + 語音通話來電中 您回絕了此通話 帳號設定 您可以管理 %1$s 中的通知。 - 請注意,行動裝置上的加密聊天室並不提供提及與關鍵字通知。 + 請注意,行動裝置上已加密聊天室並不提供被提及與關鍵字通知。 通知我 - 您不會在行動裝置上收到在加密聊天室中的提及與關鍵字通知。 + 您將不會在手機上收到加密聊天室中被提及或關鍵字的通知。 關鍵字 \@room 關鍵字不能包含「%s」 @@ -2137,59 +2137,59 @@ 您的關鍵字 僅提及與關鍵字 - 結束通話…… + 結束通話… 無回應 您要通話的使用者忙碌中。 使用者忙碌 使用 %s 音訊通話 使用 %s 視訊通話 - 通話響鈴中…… - 空間 - 新增空間至您管理的任何空間。 - 新增既有的空間 + 通話響鈴中… + 聊天空間 + 新增聊天空間至您管理的任何聊天空間。 + 新增既有的聊天空間 新增既有的聊天室 您確定您想要離開 %s? 探索 (%s) 結束設定 - 透過電子郵件邀請、尋找聯絡人以及更多…… + 透過電子郵件邀請、尋找聯絡人以及更多… 完成探索設定。 - 您目前並未使用身份認證伺服器。為了邀請隊友並被他們探索,請在下方設定一個。 + 您目前並未使用身分認證伺服器。為了邀請團隊成員並被他們探索,請在下方設定一個。 透過使用者名稱或電子郵件邀請 確保合適的人可以存取 %s 公司。您可以稍後再邀請。 - 誰是您的隊友? - 新增至指定的空間 - 正在建立空間…… + 誰是您的團隊成員? + 新增至特定的聊天空間 + 正在建立聊天空間… 顯示一些有用的資訊以協助應用程式除錯 在畫面上顯示除錯資訊 看起來不是有效的電子郵件地址 開啟探索設定 以名稱、ID 或電子郵件搜尋 - 建立新空間 - 任何人都可以找到空間並加入 - 空間存取 + 建立新聊天空間 + 任何人都可以找到此聊天空間並加入 + 存取聊天空間 誰可以存取? 啟用 %s 的電子郵件通知 - 要收到通知用的電子郵件,請將電子郵件地址關聯至您的 Matrix 帳號 + 要收到通知用的電子郵件,請將電子郵件地址連結至您的 Matrix 帳號 電子郵件通知 - 升級空間 - 變更空間名稱 - 啟用空間加密 - 變更空間的主要位置 - 變更空間大頭照 - 您無權更新變更此空間各部份所需角色的權限 - 選取變更此空間各部份所需的角色 - 檢視並更新變更空間各部份所需的角色。 - 空間權限 - 取消封鎖使用者將讓他們可以再次加入空間。 - 封鎖使用者會將他們自此空間移除並防止他們再次加入。 - 踢除使用者將會將他們從此空間中移除。 + 升級聊天空間 + 變更聊天空間名稱 + 啟用聊天空間加密 + 變更聊天空間的主要位址 + 變更聊天空間大頭照 + 您無權限更新變更此聊天空間各部份所需角色的權限 + 選取變更此聊天空間各部份所需的角色 + 檢視並更新變更聊天空間各部份所需的角色。 + 聊天空間權限 + 取消封鎖使用者將讓他們可以再次加入聊天空間。 + 封鎖使用者將會把他們從此聊天空間中移除,並避免他們再次加入。 + 使用者將會從此聊天空間中被移除。 \n \n為了防止他們再加入,您應該封鎖他們。 停止錄製 將 ( ͡° ͜ʖ ͡°) 附加至純文字訊息 - 身份伺服器未提供政策 - 隱藏身份伺服器政策 - 顯示身份伺服器政策 + 身分伺服器未提供政策 + 隱藏身分伺服器政策 + 顯示身分伺服器政策 顯示關於使用者的資訊 僅在目前的聊天室中變更您的大頭照 變更目前聊天室的大頭照 @@ -2202,7 +2202,7 @@ 線上 選擇家伺服器 無法存取 URL %s 的家伺服器。請檢查您的連結或手動選擇家伺服器。 - 監聽通知 + 聆聽通知 需要至少 %1$s 選項 @@ -2216,11 +2216,11 @@ 建立投票 投票 向 %s 傳送電子郵件地址與電話號碼 - 您的通訊錄是私人的。要從您的通訊錄中探索使用者,我們需要您的權限來傳送聯絡人資訊到您的身份識別伺服器。 + 您的通訊錄是私人的。要從您的通訊錄中探索使用者,我們需要您的權限來傳送聯絡人資訊到您的身分伺服器。 已登出工作階段! 已離開聊天室! 您同意傳送此資訊嗎? - 要探索現有聯絡人,您必須傳送聯絡人資訊(電子郵件地址與電話號碼)到您的身份識別伺服器。我們會在傳送前對您的資料進行雜湊處理以保護隱私。 + 要探索現有聯絡人,您必須傳送聯絡人資訊(電子郵件地址與電話號碼)到您的身分伺服器。我們會在傳送前對您的資料進行雜湊處理以保護隱私。 現在不要 您確定要移除此投票?移除後將無法復原。 移除投票 @@ -2244,33 +2244,33 @@ 系統設定 版本 - 取得關於使用 ${app_name} 的協助 + 取得關於使用 ${app_name} 的說明 說明與支援 說明 法律 此伺服器並未提供任何政策。 第三方函式庫 - 您的身份識別伺服器政策 + 您的身分伺服器政策 您的家伺服器政策 ${app_name} 政策 您隨時可以在設定中關閉此功能 我們不會與第三方分享資訊 我們不會記錄或分析任何帳號資料 這裡 - 透過分享匿名使用資料協助我們找出問題並改善 ${app_name}。為了了解人們如何使用多裝置,我們將會產生隨機識別字串,在您的裝置間共享。 + 透過分享匿名使用資料協助我們找出問題並改善 ${app_name}。為了解人們如何使用多裝置,我們將會產生隨機識別字串,在您的裝置間共享。 \n \n您可以閱讀我們的條款 %s。 協助改善 ${app_name} 啟用 重新啟動應用程式以讓變更生效。 啟用 LaTeX 數學 - 您無法加入此聊天室 + 您未被允許加入此聊天室 建立投票 開啟通訊錄 傳送貼圖 上傳檔案 傳送圖片與影片 - 開啟攝影機 + 開啟相機 發生無法解密錯誤時,您的系統將會自動傳送紀錄檔 自動回報解密錯誤。 覆寫顯示名稱色彩 @@ -2279,13 +2279,13 @@ 您已掌控了您的資料。 擁有您的對話。 分享位置 - 開啟以 + 開啟時用 ${app_name} 無法存取您的位置。請稍後再試。 ${app_name} 無法存取您的位置 位置 分享位置 結果僅在您結束投票後顯示 - 封闭式投票 + 已結束投票 投票者在投票後可以立刻看到投票結果 開放式投票 投票類型 @@ -2298,14 +2298,14 @@ 分享了他們的位置 建立帳號 為您的團隊傳送訊息。 - 端到端加密,不需要電話號碼。沒有廣告或資料挖礦。 + 端對端加密且不需電話號碼。沒有廣告或資料探勘。 選擇保留對話的位置,讓您擁有控制權與獨立性。透過 Matrix 連結。 安全且獨立的通訊,為您提供與在家中進行面對面對話相同的隱私等級。 位置 加密設定錯誤,因此您無法傳送訊息。點擊以開啟設定。 加密設定錯誤,因此您無法傳送訊息。請聯絡管理員將加密還原至有效的狀態。 顯示訊息泡泡 - 載入地圖失敗 + 無法載入地圖 地圖 注意:應用程式將會重新啟動 啟用討論串訊息 @@ -2321,19 +2321,19 @@ 您已經在檢視此討論串了! 在聊天室中檢視 在討論串中回覆 - 可識別指令「%s」,但在討論串中不支援。 + 可識別指令「%s」,但在「討論串」中不支援。 來自討論串 秘訣:長按訊息並使用「%s」。 - 討論串可以協助您的對話不離題且易於追蹤。 - 使用討論串來讓討論保持有條不紊 - 顯示您參與的所有討論串 - 我的討論串 - 從目前的聊天室顯示所有討論串 - 所有討論串 + 「討論串」可以協助您的對話不離題且易於追蹤。 + 使用「討論串」來讓討論保持有條不紊 + 顯示您參與的所有「討論串」 + 我的「討論串」 + 從目前的聊天室顯示所有「討論串」 + 所有「討論串」 過濾 - 討論串 + 「討論串」 討論串 - 過濾聊天室中的討論串 + 過濾聊天室中的「討論串」 複製連結至討論串 在聊天室中檢視 檢視討論串 @@ -2345,7 +2345,7 @@ 顯示較少 - %d 伺服器 ACL 變更 + %d 伺服器存取控制清單變更 %1$s 與 %2$s %1$s、%2$s 與其他人 @@ -2359,12 +2359,12 @@ 分享我目前的位置 縮放至目前位置 地圖上選定位置的圖釘 - 我們愈來愈接近將討論串釋出為公開測試版。 + 我們即將要將釋出「討論串」的公開測試版本。 \n -\n在我們為此做準備時,我們需要做出一些變動:先前建立的討論串將會顯示為一般回覆。 +\n正當我們為此做準備時,我們需要做出一些變動:先前建立的討論串將會顯示為一般回覆。 \n -\n這會是一次性的過渡,因為討論串現在是 Matrix 規範的一部分了。 - 討論串接近測試版了 🎉 +\n這會是單次的過渡做法,因為「討論串」現在已經是 Matrix 規範中的一部分了。 + 「討論串」快要有測試版了 🎉 正在進行位置分享 ${app_name} 即時位置 家伺服器不接受僅有數字的使用者名稱。 @@ -2380,10 +2380,10 @@ 選擇顯示名稱 您的帳號 %s 已建立 恭喜! - 帶我回家 + 帶我回首頁 個人化檔案 停用 - 正在載入即時位置…… + 正在載入即時位置… 8小時 1小時 15分鐘 @@ -2398,24 +2398,24 @@ 分享了他們的即時位置 ${app_name} 也非常適合工作場所。其受到世界上最安全的組織信任。 測試版 - 討論串是一項正在進行中的工作,包含了新的、令人興奮的即將推出的功能,例如改進的通知。我們想要聽到您的回饋! - 討論串測試版回饋 + 「討論串」是一項正在進行中的工作,包含了即將推出令人興奮的新功能(例如改善後的通知)。我們想要聽到您的回饋! + 「討論串」測試版回饋 給予回饋 測試版 若啟用,即使在使用應用程式時,您也會對其他使用者顯示為離線狀態。 離線模式 - 在場 - 您的家伺服器目前不支援討論串,所以此功能可能不可靠。部份已進入討論串的訊息可能無法可靠地使用。%s您仍想啟用討論串嗎? - 討論串測試版 - 討論串有助於讓您的對話不離題且易於追蹤。%s啟用討論串將會重新整理應用程式。對於特定帳號,可能需要更長的時間。 - 討論串測試版 + 出席 + 您的家伺服器目前不支援討論串,所以此功能可能並不可靠。部份已進入「討論串」的訊息,可能無法可靠地使用。%s 您仍想啟用討論串功能嗎? + 「討論串」測試版 + 「討論串」有助於讓您的對話不離題且易於追蹤。%s 啟用討論串將會重新整理應用程式。對於特定帳號可能需要較多的時間。 + 「討論串」測試版 取得更多資訊 試試看 正在分享畫面 ${app_name} 分享畫面中 停止分享畫面 分享畫面 - - 部份使用者已被取消忽略 + - 有些使用者已被取消忽略 ${app_name} 需要執行清除快取以保持最新狀態,原因如下: \n%s \n @@ -2424,9 +2424,9 @@ 顯示所有訊息的最新個人檔案資訊(大頭照與顯示名稱)。 顯示最新的使用者資訊 忙碌 - 備份具有來自該使用者的有效簽名。 + 備份具有來自該使用者的有效簽章。 %1$s 前已更新 - 暫時的實作:位置會保留在聊天室歷史紀錄中 + 暫時的建置:位置會保留在聊天室歷史紀錄中 啟用即時位置分享 剩餘 %1$s 即時分享至 %1$s @@ -2436,14 +2436,14 @@ 找不到結果 不離開 離開全部 - 此空間內的東西 + 此聊天空間內的東西 動畫圖片一出現就在時間軸中播放 自動播放動畫圖片 - 分鐘 + 小時 啟用位置分享 - 請注意:這是使用暫時實作的實驗室功能。這代表了您將無法刪除您的位置歷史紀錄,即使您停止與此聊天室分享您的即時位置,進階使用者也還是能看到您的位置歷史紀錄。 + 請注意:這是使用暫時建置的實驗室功能。這代表了您將無法刪除您的位置歷史紀錄,即使您停止與此聊天室分享您的即時位置,進階使用者也還是能看到您的位置歷史紀錄。 即時位置分享 目前閘道:%s 閘道 @@ -2463,28 +2463,28 @@ Google 服務 選擇如何接收通知 無法啟用生物特徵驗證。 - 生物特徵驗證方式被停用,因為最新新增了新的生物特徵驗證方式。您可以在「設定」中再次啟用它。 + 生物特徵驗證方式被停用,因為最新增了生物特徵驗證方式。您可以在「設定」中再次啟用它。 重設通知方式 個人檔案標籤: - 註冊端點權杖至家伺服器失敗: + 無法將端點權杖註冊至家伺服器: \n%1$s 端點成功註冊至家伺服器。 端點註冊 下一步 結果將在投票結束時可見 - 在分享歷史的加密聊天室中邀請時,加密歷史會是可見的。 + 在分享歷史的已加密聊天室中邀請時,已加密歷史會是可見的。 MSC3061:為過去的訊息分享聊天室金鑰 傳送您的第一則訊息以邀請 %s 來聊天 - 此聊天中的訊息將會是端到端加密。 - 出發 + 此聊天中的訊息將會是端對端加密。 + 繼續前往 已移除 %d 則訊息 分享位置 您必須擁有正確的權限才能在此聊天室中分享即時位置。 - 您無權分享即時位置 - 無法開啟此連結:社群已被空間取代 - 使用者名稱 / 電子郵件 / 電話 + 您沒有權限分享即時位置 + 無法開啟此連結:社群已被聊天空間取代 + 使用者名稱/電子郵件/電話 您是人類嗎? 按照寄送到 %s 的說明操作 密碼重設 @@ -2503,7 +2503,7 @@ 新密碼 檢查您的電子郵件。 %s 將會傳送給您驗證連結 - 確認代碼 + 驗證碼 電話號碼 %s 必須驗證您的帳號 輸入您的電話號碼 @@ -2513,31 +2513,31 @@ 請仔細閱讀 %s 的條款與政策 伺服器政策 保持聯絡 - Element Matrix Services (EMS) 是一個強大且可靠的主機託管服務,可實現快速、安全且即時的通訊。可在 element.io/ems 上了解如何使用 + Element Matrix Services(EMS)是一個強大且可靠的主機託管服務,可實現快速、安全且即時的通訊。可在 element.io/ems 上了解如何使用 想要架設自己的伺服器? 伺服器 URL - 您的伺服器位置是什麼?這就像您所有資料的家 + 您的伺服器位址是什麼?這就像您所有資料的家 選取您的伺服器 歡迎回來! 編輯 您的對話將在哪裡進行 - 必須是 8 個字元或更多 - 其他人可以探索您 %s + 必須是 8 個以上字元長 + 其他人可以找到您 %s 建立您的帳號 使用系統預設值 手動選擇 自動設定 選擇字型大小 - 自動批准 Element Call 小工具並授予相機/麥克風存取權限 + 自動批准 Element Call 小工具並授予相機/麥克風存取權限 啟用 Element Call 權限捷徑 即時位置 - 這個 QR code 的格式似乎不正確。請嘗試使用其他方法進行驗證。 + 這個 QR 碼的格式似乎不正確。請嘗試使用其他方法進行驗證。 您將無法存取已加密的訊息歷史紀錄。重設您的安全訊息備份與驗證金鑰以重新開始。 無法驗證此裝置 - 您的伺服器地址是? - 您的對話所在位置 - 正在更新您的資料…… + 您的伺服器位址是? + 您的對話要在哪裡進行 + 正在更新您的資料… %1$s 與 %2$d 個其他人 @@ -2550,10 +2550,10 @@ 為了取得最佳安全性,請驗證您的工作階段並登出任何您無法識別或不再使用的工作階段。 其他工作階段 工作階段 - 開啟空間清單 - 建立新的對話或聊天室 + 開啟聊天空間清單 + 建立一則新的對話或一間聊天室 聯絡人 - 最愛 + 我的最愛 未讀 全部 A - Z @@ -2567,7 +2567,7 @@ 開始聊天 未驗證 · 最後活動 %1$s 已驗證 · 最後活動 %1$s - 檢視全部 (%1$d) + 檢視全部(%1$d) 檢視詳細資訊 驗證工作階段 未驗證的工作階段 @@ -2582,8 +2582,8 @@ 試試看 輕點右上角來檢視回饋選項。 給予回饋 - 存取您的空間(右下角)比以往任何時候都更快且更輕鬆。 - 存取空間 + 存取您的聊天空間(右下角)比以往任何時候都更快且更輕鬆。 + 存取聊天空間 為了簡化您的 ${app_name},分頁現在是選擇性的。使用右上角的選單管理它們。 歡迎使用新的檢視! 當您有一些未讀的訊息時,這裡會顯示您的未讀訊息。 @@ -2591,7 +2591,7 @@ 適用於團隊、朋友與組織的多合一安全聊天應用程式。建立聊天室,或加入一個既有的聊天室。 歡迎使用 ${app_name}, \n%s. - 空間是一種為聊天室與人們分組的新方式。使用右下角的按鈕新增既有的聊天室或建立新的。 + 聊天空間是一種為聊天室與人們分組的新方式。使用右下角的按鈕新增既有的聊天室或建立新的。 %s \n看起來有點空。 @@ -2603,16 +2603,16 @@ 按照這些建議提高您的帳號安全性。 安全建議 - 不活躍 %1$d+ 天 (%2$s) + 不活躍 %1$d+ 天(%2$s) - 這是您的新請求與邀請的所在。 + 這是您新請求與邀請的所在。 沒有新東西。 - 空間是一種對聊天室與人們分組的新方式。建立空間以開始。 - 尚無空間。 - 折疊 %s 個子空間 - 展開 %s 個子空間 - 變更空間 - IP 位置 + 聊天空間是一種分類聊天室與聯絡人的新方式。開始建立聊天空間吧。 + 尚無聊天空間。 + 收折 %s 個子聊天空間 + 展開 %s 個子聊天空間 + 變更聊天空間 + IP 位址 最後活動 工作階段名稱 應用程式、裝置與活動資訊。 @@ -2622,13 +2622,13 @@ 找不到未驗證的工作階段。 找不到已驗證的工作階段。 - 閒置%1$d天或更久 + 閒置 %1$d 天或更久 - 考慮登出您不再使用的舊工作階段(%1$d天或更久)。 + 考慮登出您不再使用(%1$d天或更久)的舊工作階段。 不活躍 - 驗證您的工作階段以強化安全通訊或從您無法識別或不再使用的工作階段登出。 + 驗證您的工作階段以強化安全通訊,或從您無法識別或不再使用的工作階段登出。 未驗證 為取得最佳安全性,請從任何您無法識別或不再使用的工作階段登出。 已驗證 @@ -2636,7 +2636,7 @@ 不活躍 尚未準備好安全通訊 未驗證 - 準備好安全通訊 + 已準備好安全通訊 已驗證 所有工作階段 過濾 @@ -2652,7 +2652,7 @@ 啟用延期直接訊息 包含選擇性分頁的簡潔 Element 啟用新佈局 - 您加入的直接消息與聊天室中的其他使用者可以檢視您的工作階段的完整清單。 + 您加入的直接消息與聊天室中的其他使用者,可以檢視您的工作階段的完整清單。 \n \n這讓他們確信他們真的在與您交談,但這也意味著他們可以看到您在此處輸入的工作階段名稱。 正在重新命名工作階段 @@ -2663,7 +2663,7 @@ 未驗證的工作階段 不活躍的工作階段是您有一段時間未使用的工作階段,但它們會繼續接收加密金鑰。 \n -\n移除不活躍的工作階段可以改善安全性與效能,並讓您可以更容易地識別新的工作階段是否可疑。 +\n刪除不活躍的工作階段可以改善安全性與效能,並讓您可以更容易地識別新的工作階段是否可疑。 不活躍的工作階段 請注意,與您交流的人也可以看到工作階段名稱。 自訂工作階段名稱可以協助您更輕鬆地識別您的裝置。 @@ -2672,7 +2672,7 @@ 登出此工作階段 未驗證 · 您目前的工作階段 開始語音廣播 - 此裝置無法保證此加密訊息的真實性。 + 此裝置無法保證此已加密訊息的真實性。 要求鍵盤不要根據您在對話中輸入的內容更新任何個人化資料(如輸入歷史紀錄與字典等)。請注意,某些鍵盤可能不會遵守此設定。 無痕式鍵盤 將 (╯°□°)╯︵ ┻━┻ 放到純文字訊息之前 @@ -2680,8 +2680,8 @@ 開啟開發者工具畫面 🔒 您已在「安全」設定中為所有聊天室啟用加密驗證工作階段。 ⚠ 此聊天室中有未驗證的裝置,它們將無法解密您傳送的訊息。 - 切莫向此聊天室中未經驗證的工作階段傳送加密訊息。 - 知道了 + 絕不在此聊天室中向未經驗證的工作階段傳送已加密訊息。 + 了解 套用底線格式 套用刪除線格式 套用義式斜體格式 @@ -2697,8 +2697,8 @@ 版本 名稱 應用程式 - 接收關於此工作階段的推播通知。 - 推播通知 + 接收關於此工作階段的推送通知。 + 推送通知 驗證您目前的工作階段以顯示此工作階段的驗證狀態。 未知的驗證狀態 已啟用: @@ -2710,63 +2710,63 @@ ${app_name} 需要權限才能顯示通知。通知可以顯示您的訊息、您的邀請等等。 \n \n請在下一個彈出式視窗允許存取以檢視通知。 - 試用格式化文字編輯器(純文字模式即將推出) - 啟用格式化文字編輯器 + 試用富文字編輯器(純文字模式即將推出) + 啟用富文字編輯器 請確保您知道此驗證碼的來源。透過連結裝置,您將為某人提供對您帳號的完整存取權限。 確認 - 再試一次 + 再次嘗試 不相符? - 登入 + 正在將你登入 連線至裝置 - 掃描 QR code - 正在使用行動裝置登入? - 在此裝置顯示 QR code - 選取「掃描 QR code」 + 掃描 QR 碼 + 正在使用行動裝置登入嗎? + 在此裝置顯示 QR 碼 + 選取「掃描 QR 碼」 從登入畫面開始 - 選取「使用 QR code 登入」 + 選取「使用 QR 碼登入」 從登入畫面開始 - 選取「顯示 QR code」 + 選取「顯示 QR 碼」 到「設定」→「安全與隱私」 在您的其他裝置上開啟應用程式 請求在另一台裝置上被拒絕。 - 連結未在規定時間內完成。 + 連結未在要求的時間內完成。 不支援與其裝置連結。 連線不成功 請檢查您已登入的裝置,應該會顯示以下驗證碼。請確認以下驗證碼與該裝置相符: 已建立安全連線 - 使用您已登出的裝置掃描以下 QR code。 - 使用您已登入的裝置來掃描下方的 QR code: - 使用 QR code 登入 - 使用此裝置的相機掃描您其他裝置上顯示的 QR code: - 掃描 QR code + 使用您已登出的裝置掃描以下 QR 碼。 + 使用您已登入的裝置來掃描下方的 QR 碼: + 使用 QR 碼登入 + 使用此裝置的相機掃描您其他裝置上顯示的 QR 碼: + 掃描 QR 碼 3 2 1 - 您可以使用此裝置透過 QR code 登入移動裝置或網路裝置。有兩種方法可以作到: - 使用 QR code 登入 - 掃描 QR code - 家伺服器不支援使用 QR code 登入。 - 登入已在其他裝置上取消。 - 該 QR code 無效。 + 您可以使用此裝置透過 QR 碼登入行動裝置或網路裝置。有兩種方法可以作到: + 使用 QR 碼登入 + 掃描 QR 碼 + 家伺服器不支援使用 QR 碼登入。 + 已在其他裝置上取消登入。 + 該 QR 碼無效。 其他裝置必須登入。 其他裝置已登入。 - 設定安全訊息傳遞時遇到安全問題。以下其中一項可能已被駭入:您的家伺服器、您的網際網路連線、您的裝置; - 請求失敗。 + 設定安全訊息傳遞時遇到安全問題。以下其中一項可能已被駭入:您的家伺服器;您的網際網路連線;您的裝置; + 無法請求。 可以在聊天室時間軸中錄製並傳送語音廣播。 啟用語音廣播 - 正在緩衝…… + 正在緩衝… 暫停語音廣播 播放或繼續語音廣播 - 停止語音廣播錄製 - 暫停語音廣播錄製 - 繼續語音廣播錄製 + 停止錄製語音廣播 + 暫停錄製語音廣播 + 繼續錄製語音廣播 直播 選取工作階段 聯絡人 相機 位置 投票 - 音訊廣播 + 語音廣播 附件 貼圖 照片媒體庫 @@ -2783,9 +2783,9 @@ 無法開始新的語音廣播 快轉30秒 快退30秒 - 已驗證的工作階段是您輸入通關密語或透過另一個已驗證工作階段確認您的身份後使用此帳號的任何地方。 + 已驗證的工作階段是您輸入安全密語或透過另一個已驗證工作階段確認您的身分後使用此帳號的任何地方。 \n -\n這代表了您擁有解鎖加密訊息並向其他使用者確認您信任此工作階段所需的所有金鑰。 +\n這代表您擁有解鎖已加密訊息並向其他使用者確認您信任此工作階段所需的所有金鑰。 登出 %1$d 個工作階段 @@ -2799,27 +2799,27 @@ 已傳送音訊檔。 已傳送檔案。 回覆給 - 隱藏 IP 位置 - 顯示 IP 位置 + 隱藏 IP 位址 + 顯示 IP 位址 引用 回覆給 %s 正在編輯 在系統分享選單中顯示最近聊天 啟用直接分享 - 檢查以確保您的帳號安全 + 請確認您的帳戶安全 您有未驗證的工作階段 - 此工作階段不支援加密,因此無法驗證。 + 無法對此對話進行加密,因此無法驗證。 \n -\n使用此工作階段時,您將無法參與啟用了加密的聊天室。 +\n您無法進入已加密的聊天室中。 \n -\n為了取得最佳的安全性與隱私,建議使用支援加密的 Matrix 客戶端。 - 登出其他所有工作階段 - 此工作階段不支援加密,因此無法驗證。 - 取得最新版本(注意:您可能會無法登入) - Nightly 版本 - 即時廣播 - 您結束了語音廣播。 - %1$s 結束了語音廣播。 +\n為了安全與隱私,建議使用支援加密的 Matrix 客戶端。 + 登出所有其他的工作階段 + 此工作階段無法被加密,因此無法被驗證。 + 取得最新版本的建構(注意:您可能會無法登入) + 每夜建構 + 直播 + 您已結束語音直播。 + %1$s 已結束語音直播。 您真的想要停止您的即時廣播嗎?這將會結束廣播,完整的錄音會在聊天室中提供。 停止即時廣播? 是的,停止 From 254c31b7364833ba3ca7222c51ce60935761928d Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Sat, 4 Mar 2023 14:22:52 +0000 Subject: [PATCH 133/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- library/ui-strings/src/main/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 89adc859a8..4e8e4b586b 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -838,7 +838,7 @@ 您都看完了! 您已經沒有未讀的訊息了 對話 - 您的私人訊息對話將會在此顯示。點擊右下角的 + 可以建立私訊。 + 將會在此顯示您的私人訊息對話。點擊右下角的 + 可以建立私訊。 聊天室 您的聊天室將會在此顯示。點擊右下角的 + 來尋找既有的或開始您自己的聊天室。 反應 From 257a2cfb5a5557ffbfa630ce82d9c7fd03e24f5c Mon Sep 17 00:00:00 2001 From: Open Culture Foundation Date: Sat, 4 Mar 2023 12:05:30 +0000 Subject: [PATCH 134/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/ --- .../android/zh-TW/changelogs/40100100.txt | 4 ++-- .../android/zh-TW/changelogs/40100110.txt | 2 +- .../android/zh-TW/changelogs/40100120.txt | 2 +- .../android/zh-TW/changelogs/40100130.txt | 2 +- .../android/zh-TW/changelogs/40100140.txt | 2 +- .../android/zh-TW/changelogs/40100150.txt | 2 +- .../android/zh-TW/changelogs/40100160.txt | 2 +- .../android/zh-TW/changelogs/40100170.txt | 2 +- .../android/zh-TW/changelogs/40101020.txt | 2 +- .../android/zh-TW/changelogs/40101030.txt | 2 +- .../android/zh-TW/changelogs/40101040.txt | 2 +- .../android/zh-TW/changelogs/40101050.txt | 2 +- .../android/zh-TW/changelogs/40101060.txt | 2 +- .../android/zh-TW/changelogs/40101070.txt | 2 +- .../android/zh-TW/changelogs/40101080.txt | 2 +- .../android/zh-TW/changelogs/40101090.txt | 2 +- .../android/zh-TW/changelogs/40101100.txt | 2 +- .../android/zh-TW/changelogs/40101110.txt | 2 +- .../android/zh-TW/changelogs/40101120.txt | 2 +- .../android/zh-TW/changelogs/40101130.txt | 2 +- .../android/zh-TW/changelogs/40101140.txt | 2 +- .../android/zh-TW/changelogs/40101150.txt | 2 +- .../android/zh-TW/changelogs/40101160.txt | 2 +- .../android/zh-TW/changelogs/40102000.txt | 2 +- .../android/zh-TW/changelogs/40102010.txt | 2 +- .../android/zh-TW/changelogs/40103000.txt | 2 +- .../android/zh-TW/changelogs/40103010.txt | 2 +- .../android/zh-TW/changelogs/40103020.txt | 2 +- .../android/zh-TW/changelogs/40103030.txt | 2 +- .../android/zh-TW/changelogs/40103040.txt | 2 +- .../android/zh-TW/changelogs/40103050.txt | 2 +- .../android/zh-TW/changelogs/40103060.txt | 2 +- .../android/zh-TW/changelogs/40103070.txt | 2 +- .../android/zh-TW/changelogs/40103080.txt | 2 +- .../android/zh-TW/changelogs/40103090.txt | 2 +- .../android/zh-TW/changelogs/40103100.txt | 2 +- .../android/zh-TW/changelogs/40103110.txt | 2 +- .../android/zh-TW/changelogs/40103120.txt | 2 +- .../android/zh-TW/changelogs/40103130.txt | 2 +- .../android/zh-TW/changelogs/40103140.txt | 2 +- .../android/zh-TW/changelogs/40103150.txt | 2 +- .../android/zh-TW/changelogs/40103160.txt | 2 +- .../android/zh-TW/changelogs/40103170.txt | 2 +- .../android/zh-TW/changelogs/40103180.txt | 2 +- .../android/zh-TW/changelogs/40104000.txt | 2 +- .../android/zh-TW/changelogs/40104020.txt | 2 +- .../android/zh-TW/changelogs/40104040.txt | 2 +- .../android/zh-TW/changelogs/40104060.txt | 2 +- .../android/zh-TW/changelogs/40104070.txt | 2 +- .../android/zh-TW/changelogs/40104080.txt | 2 +- .../android/zh-TW/changelogs/40104100.txt | 2 +- .../android/zh-TW/changelogs/40104110.txt | 2 +- .../android/zh-TW/changelogs/40104120.txt | 2 +- .../android/zh-TW/changelogs/40104130.txt | 2 +- .../android/zh-TW/changelogs/40104140.txt | 2 +- .../android/zh-TW/changelogs/40104160.txt | 2 +- .../android/zh-TW/changelogs/40104180.txt | 2 +- .../android/zh-TW/changelogs/40104190.txt | 2 +- .../android/zh-TW/changelogs/40104200.txt | 2 +- .../android/zh-TW/changelogs/40104220.txt | 2 +- .../android/zh-TW/changelogs/40104230.txt | 2 +- .../android/zh-TW/changelogs/40104240.txt | 2 +- .../android/zh-TW/changelogs/40104250.txt | 2 +- .../android/zh-TW/changelogs/40104260.txt | 2 +- .../android/zh-TW/changelogs/40104270.txt | 2 +- .../android/zh-TW/changelogs/40104280.txt | 2 +- .../android/zh-TW/changelogs/40104300.txt | 2 +- .../android/zh-TW/changelogs/40104310.txt | 2 +- .../android/zh-TW/changelogs/40104320.txt | 2 +- .../android/zh-TW/changelogs/40104340.txt | 2 +- .../android/zh-TW/changelogs/40105000.txt | 2 +- .../android/zh-TW/changelogs/40105020.txt | 2 +- .../android/zh-TW/changelogs/40105040.txt | 2 +- .../android/zh-TW/changelogs/40105060.txt | 2 +- .../android/zh-TW/changelogs/40105070.txt | 2 +- .../android/zh-TW/changelogs/40105080.txt | 2 +- .../android/zh-TW/changelogs/40105100.txt | 2 +- .../android/zh-TW/changelogs/40105110.txt | 2 +- .../android/zh-TW/changelogs/40105120.txt | 2 +- .../metadata/android/zh-TW/full_description.txt | 16 ++++++++-------- .../metadata/android/zh-TW/short_description.txt | 2 +- 81 files changed, 89 insertions(+), 89 deletions(-) diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100100.txt b/fastlane/metadata/android/zh-TW/changelogs/40100100.txt index 0ea092ba9a..982c4b3197 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40100100.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40100100.txt @@ -1,2 +1,2 @@ -這個新版本主要包含錯誤修復與改善。傳送訊息更快了。 -完整的變更紀錄請見:https://github.com/vector-im/element-android/releases/tag/v1.0.10 +新版本主要包含錯誤修復與改善。傳送訊息更快了。 +完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.10 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100110.txt b/fastlane/metadata/android/zh-TW/changelogs/40100110.txt index 22dfe07097..20a1c1a8f9 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40100110.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40100110.txt @@ -1,2 +1,2 @@ -這個新版本主要包含使用者介面與使用者體驗改善。現在您可以邀請朋友,並透過掃描 QR code 來快速建立直接訊息了。 +新版本主要包含使用者介面與使用者體驗改善。現在您可以邀請朋友,並透過掃描 QR 碼來快速建立直接訊息了。 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.11 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100120.txt b/fastlane/metadata/android/zh-TW/changelogs/40100120.txt index 846126af63..efb372d583 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40100120.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40100120.txt @@ -1,2 +1,2 @@ -此版本中的主要變更:URL 預覽、新的表情符號鍵盤、新的聊天室設定功能以及聖誕節降雪! +此版本的主要變更:URL 預覽、新表情符號鍵盤、新聊天室設定功能以及聖誕節降雪! 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.12 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100130.txt b/fastlane/metadata/android/zh-TW/changelogs/40100130.txt index f42e9d3101..2909385827 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40100130.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40100130.txt @@ -1,2 +1,2 @@ -此版本中的主要變更:URL 預覽、新的表情符號鍵盤、新的聊天室設定功能以及聖誕節降雪! +此版本的主要變更:URL 預覽、新的表情符號鍵盤、新的聊天室設定功能以及聖誕節降雪! 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.13 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100140.txt b/fastlane/metadata/android/zh-TW/changelogs/40100140.txt index 9ed2152127..0bfed1ded5 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40100140.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40100140.txt @@ -1,2 +1,2 @@ -此版本的主要變動:編輯聊天室權限、自動淺色/深色佈景主題與許多臭蟲修復。 +此版本的主要變動:編輯聊天室權限、自動淺色/深色佈景主題與許多錯誤修復。 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.14 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100150.txt b/fastlane/metadata/android/zh-TW/changelogs/40100150.txt index 09a67d544b..4fd4f08ab8 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40100150.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40100150.txt @@ -1,2 +1,2 @@ -此版本的主要變動:社群網路登入支援。 +此版本的主要變動:支援社群網路登入。 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.15 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100160.txt b/fastlane/metadata/android/zh-TW/changelogs/40100160.txt index 77606636d3..07ab58e6fe 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40100160.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40100160.txt @@ -1,2 +1,2 @@ -此版本的主要變動:社群網路登入支援。 +此版本的主要變動:支援社群網路登入。 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.15 以及 https://github.com/vector-im/element-android/releases/tag/v1.0.16 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100170.txt b/fastlane/metadata/android/zh-TW/changelogs/40100170.txt index 35b8a54110..93c814a640 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40100170.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40100170.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:錯誤修復! +此版本的主要變動:錯誤修復! 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101020.txt b/fastlane/metadata/android/zh-TW/changelogs/40101020.txt index 90e76b074e..c4fc6abbd0 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101020.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101020.txt @@ -1,2 +1,2 @@ -此版本中的主要變更:效能改進與錯誤修復! +此版本的主要變更:效能改進與錯誤修復! 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.2 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101030.txt b/fastlane/metadata/android/zh-TW/changelogs/40101030.txt index c13d6ecfd4..ef69a00622 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101030.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101030.txt @@ -1,2 +1,2 @@ -此版本中的主要變更:效能改進與錯誤修復! +此版本的主要變更:效能改進與錯誤修復! 完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.3 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101040.txt b/fastlane/metadata/android/zh-TW/changelogs/40101040.txt index 1786691c42..e6df797a05 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101040.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101040.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:效能改善與錯誤修復! +此版本的主要變動:效能改善與錯誤修復! 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.4 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101050.txt b/fastlane/metadata/android/zh-TW/changelogs/40101050.txt index 899ce72c9a..6cd4319dc5 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101050.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101050.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:1.1.4 的快速修補 +此版本的主要變動:1.1.4 的熱修復 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.5 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101060.txt b/fastlane/metadata/android/zh-TW/changelogs/40101060.txt index 838dc6d731..c3e8ff1a20 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101060.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101060.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:1.1.5 的快速修補 +此版本的主要變動:1.1.5 的熱修復 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.6 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101070.txt b/fastlane/metadata/android/zh-TW/changelogs/40101070.txt index c62c7d5224..3e9d32268c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101070.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101070.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:對「空間」的測試版支援。傳送前壓縮影片。 +此版本的主要變動:對「空間」的測試版支援。傳送前壓縮影片。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101080.txt b/fastlane/metadata/android/zh-TW/changelogs/40101080.txt index 4ed232fe70..37ef69ae6f 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101080.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101080.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:改善「空間」的功能。 +此版本的主要變動:改善「空間」功能。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101090.txt b/fastlane/metadata/android/zh-TW/changelogs/40101090.txt index 84e46bdd76..3df9fdbc45 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101090.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101090.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:新增對 gitter.im 網路的支援。 +此版本的主要變動:新增對 gitter.im 網路的支援。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101100.txt b/fastlane/metadata/android/zh-TW/changelogs/40101100.txt index 08e081fd8b..34c1cd3bdc 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101100.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101100.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:佈景主題與樣式更新,以及空間的新功能。 +此版本的主要變動:佈景主題與風格的更新,以及空間的新功能。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.10 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101110.txt b/fastlane/metadata/android/zh-TW/changelogs/40101110.txt index 91bbc18fff..092c695116 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101110.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101110.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:佈景主題與樣式更新,以及空間的新功能(1.1.10 的臭蟲修復版本) +此版本的主要變動:佈景主題與風格的更新,以及空間的新功能(1.1.10 的臭蟲修復版本) 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.11 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101120.txt b/fastlane/metadata/android/zh-TW/changelogs/40101120.txt index 152173fe1b..4bfb315755 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101120.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101120.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:佈景主題與樣式更新,以及修復視訊通話後當機的問題 +此版本的主要變動:佈景主題與風格的更新,以及修復視訊通話後當機的問題 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.12 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101130.txt b/fastlane/metadata/android/zh-TW/changelogs/40101130.txt index 88f439281f..f35789a222 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101130.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101130.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:主要是穩定性與臭蟲修復更新。 +此版本的主要變動:主要是穩定性與錯誤修復的更新。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.13 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101140.txt b/fastlane/metadata/android/zh-TW/changelogs/40101140.txt index 3eb5aa35ed..2a094dc292 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101140.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101140.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:修復關於加密訊息的問題。 +此版本的主要變動:修復關於加密訊息的問題。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.14 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101150.txt b/fastlane/metadata/android/zh-TW/changelogs/40101150.txt index c730151fe7..c87a69fb9e 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101150.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101150.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:實驗室設定下,語音訊息的實作。 +此版本的主要變動:實驗室設定下的語音訊息建置。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101160.txt b/fastlane/metadata/android/zh-TW/changelogs/40101160.txt index 364bec14b9..bf10f3425f 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40101160.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40101160.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:修復在聊天室中有人登出時傳送加密訊息所發生的問題。 +此版本的主要變動:修復聊天室中有人登出時傳送加密訊息所發生的問題。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.16 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40102000.txt b/fastlane/metadata/android/zh-TW/changelogs/40102000.txt index 993a59c825..9248caf20c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40102000.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40102000.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:語音訊息預設啟用。 +此版本的主要變動:語音訊息的預設為啟用。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.2.0 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40102010.txt b/fastlane/metadata/android/zh-TW/changelogs/40102010.txt index b520266a78..6c5e63b960 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40102010.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40102010.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:對 VoIP 與空間功能的諸多改善(仍在測試中)。 +此版本的主要變動:對 VoIP 與空間功能的諸多改善(仍在測試中)。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.2.1 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103000.txt b/fastlane/metadata/android/zh-TW/changelogs/40103000.txt index fbae69cd21..6c9534077b 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103000.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103000.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:使用空間來整理您的聊天室! +此版本的主要變動:使用空間來整理您的聊天室! 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.0 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103010.txt b/fastlane/metadata/android/zh-TW/changelogs/40103010.txt index 95dcd59e46..37ba0f53f8 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103010.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103010.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:使用空間來整理您的聊天室!v1.3.1 修復了在 v1.3.0 中遇到的當機問題。 +此版本的主要變動:使用空間來整理您的聊天室!v1.3.1 修復了在 v1.3.0 中遇到的當機問題。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.1 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103020.txt b/fastlane/metadata/android/zh-TW/changelogs/40103020.txt index 6a00bed1e7..5bdca7d2d5 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103020.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103020.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:新增對 Android Auto 的支援。以及許多錯誤修復! +此版本的主要變動:新增對 Android Auto 的支援。以及許多錯誤修復! 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.2 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103030.txt b/fastlane/metadata/android/zh-TW/changelogs/40103030.txt index 7531d1d4a2..b4e477573e 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103030.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103030.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:讓身份伺服器政策在設定中可見。暫時移除 Android Auto 支援。 +此版本的主要變動:讓身分伺服器政策在設定中可見。暫時移除 Android Auto 支援。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.3 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103040.txt b/fastlane/metadata/android/zh-TW/changelogs/40103040.txt index bd82b54e45..d60363b798 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103040.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103040.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。加回 Android Auto 支援。 +此版本的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。恢復對 Android Auto 的支援。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.4 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103050.txt b/fastlane/metadata/android/zh-TW/changelogs/40103050.txt index 659be479f5..37c3329178 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103050.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103050.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。加回 Android Auto 支援。 +此版本的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。恢復對 Android Auto 的支援。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103060.txt b/fastlane/metadata/android/zh-TW/changelogs/40103060.txt index e1223a40e5..43caca7ed8 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103060.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103060.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。加回 Android Auto 支援。 +此版本的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。加回 Android Auto 支援。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.6 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103070.txt b/fastlane/metadata/android/zh-TW/changelogs/40103070.txt index 1f9173fa1e..19dbaa623f 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103070.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103070.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:主要關於通知的臭蟲修復。 +此版本的主要變動:主要關於通知的錯誤修復。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.7-RC2 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103080.txt b/fastlane/metadata/android/zh-TW/changelogs/40103080.txt index 07689479a3..be0514e659 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103080.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103080.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:臭蟲修復! +此版本的主要變動:錯誤修復! 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.8 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103090.txt b/fastlane/metadata/android/zh-TW/changelogs/40103090.txt index c74a27acbf..0ab8844b7e 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103090.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103090.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:新增對語音訊息草稿的支援。許多臭蟲修復! +此版本的主要變動:新增對語音訊息草稿的支援。許多錯誤修復! 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.9 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103100.txt b/fastlane/metadata/android/zh-TW/changelogs/40103100.txt index 70d93e833d..17515e6710 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103100.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103100.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:新增對投票(在實驗室中)的支援。新的 URL 預覽設計。 +此版本的主要變動:新增(在實驗室中)對投票的支援。新的 URL 預覽設計。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103110.txt b/fastlane/metadata/android/zh-TW/changelogs/40103110.txt index d5450f4c6a..e0c8f48c4b 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103110.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103110.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:臭蟲修復! +此版本的主要變動:錯誤修復! 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103120.txt b/fastlane/metadata/android/zh-TW/changelogs/40103120.txt index 0ee60318c1..3a102c6c4b 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103120.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103120.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:臭蟲修復! +此版本的主要變動:錯誤修復! 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.12 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103130.txt b/fastlane/metadata/android/zh-TW/changelogs/40103130.txt index e0f9b47e16..0022bbc9b3 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103130.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103130.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:首次使用畫面的第一個變化,包含了選擇加入的分析功能。新增對數學活動的支援至實驗室中。 +此版本的主要變動:首次使用畫面的第一個變化,包含了選擇加入的分析功能。新增對數學活動的支援至實驗室中。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.13 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103140.txt b/fastlane/metadata/android/zh-TW/changelogs/40103140.txt index 8366a01265..9b9b234697 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103140.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103140.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:首次使用畫面的第一個變化,包含了選擇加入的分析功能。新增對數學活動的支援至實驗室中。 +此版本的主要變動:首次使用畫面的第一個變化,包含了選擇加入的分析功能。新增對數學活動的支援至實驗室中。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.14 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103150.txt b/fastlane/metadata/android/zh-TW/changelogs/40103150.txt index a6ddd5aa8c..e28e9aecc3 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103150.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103150.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:首次使用畫面的第一個變化,包含了選擇加入的分析功能。新增對數學活動的支援至實驗室中。 +此版本的主要變動:首次使用畫面的第一個變化,包含了選擇加入的分析功能。新增對數學活動的支援至實驗室中。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.15 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103160.txt b/fastlane/metadata/android/zh-TW/changelogs/40103160.txt index 04e51e013c..c44321d993 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103160.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103160.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:將您的位置傳送給任何聊天室。編輯投票。 +此版本的主要變動:將您的位置傳送給任何聊天室。編輯投票。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.16 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103170.txt b/fastlane/metadata/android/zh-TW/changelogs/40103170.txt index a8e353c2eb..257d8b0d8a 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103170.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103170.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:將您的位置傳送給任何聊天室。編輯投票。 +此版本的主要變動:將您的位置傳送給任何聊天室。編輯投票。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.17 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103180.txt b/fastlane/metadata/android/zh-TW/changelogs/40103180.txt index 3eabe8b7cc..e0fa18d687 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40103180.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40103180.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:將您的位置傳送給任何聊天室。編輯投票。 +此版本的主要變動:將您的位置傳送給任何聊天室。編輯投票。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.18 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104000.txt b/fastlane/metadata/android/zh-TW/changelogs/40104000.txt index e61c235762..0870cb3787 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104000.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104000.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:訊息討論串的初始實作。訊息泡泡。 +此版本的主要變動:訊息討論串的初始建置。訊息泡泡。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.4.0 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104020.txt b/fastlane/metadata/android/zh-TW/changelogs/40104020.txt index 92d0360bf1..77f570ce84 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104020.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104020.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:新增對 @room 的支援與未公開的投票,以及其他許多小變動。 +此版本的主要變動:新增對 @room 的支援與未公開的投票,以及其他許多小變動。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.4.2 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104040.txt b/fastlane/metadata/android/zh-TW/changelogs/40104040.txt index 8949ec3486..fb4e0a62b8 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104040.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104040.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:輸入指示器使用者介面更新。許多臭蟲修復與穩定性改善。 +此版本的主要變動:輸入指示器使用者介面更新。修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.4.4 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104060.txt b/fastlane/metadata/android/zh-TW/changelogs/40104060.txt index 316fad3363..7e36657bcf 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104060.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104060.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:討論串時間軸現已更新,而且更快了。多個臭蟲修復與穩定性改善。 +此版本的主要變動:討論串時間軸現已上線,而且更快了。修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.4.6 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104070.txt b/fastlane/metadata/android/zh-TW/changelogs/40104070.txt index 2cd9da666e..7c5ade2085 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104070.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104070.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.4.7 diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104080.txt b/fastlane/metadata/android/zh-TW/changelogs/40104080.txt index c036aa7d56..f3be961844 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104080.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104080.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:討論串時間軸現已更新,而且更快了。多個臭蟲修復與穩定性改善。 +此版本的主要變動:討論串時間軸現已上線,而且更快了。修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104100.txt b/fastlane/metadata/android/zh-TW/changelogs/40104100.txt index c78ed7dd2d..9990a2d64b 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104100.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104100.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:捲動音訊訊息。多個臭蟲修復與穩定性改善。 +此版本的主要變動:捲動語音訊息。修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104110.txt b/fastlane/metadata/android/zh-TW/changelogs/40104110.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104110.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104110.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104120.txt b/fastlane/metadata/android/zh-TW/changelogs/40104120.txt index d3d48abab9..0b22b32ef0 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104120.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104120.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:允許使用者顯示為離線並為音訊附件新增音訊播放器 +此版本的主要變動:允許使用者顯示為離線並為音訊附件新增音訊播放器 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104130.txt b/fastlane/metadata/android/zh-TW/changelogs/40104130.txt index d3d48abab9..0b22b32ef0 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104130.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104130.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:允許使用者顯示為離線並為音訊附件新增音訊播放器 +此版本的主要變動:允許使用者顯示為離線並為音訊附件新增音訊播放器 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104140.txt b/fastlane/metadata/android/zh-TW/changelogs/40104140.txt index ff830dab7c..f0c5fa8268 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104140.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104140.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:改善被忽略使用者的管理。多個臭蟲修復與穩定性改善。 +此版本的主要變動:改善被忽略使用者的管理。修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104160.txt b/fastlane/metadata/android/zh-TW/changelogs/40104160.txt index 0e64d36868..e2fd94140c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104160.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104160.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:對於被加密的訊息有更好的管理方式。多個臭蟲修復與穩定性改善。 +此版本的主要變動:對於被加密的訊息有更好的管理方式。修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104180.txt b/fastlane/metadata/android/zh-TW/changelogs/40104180.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104180.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104180.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104190.txt b/fastlane/metadata/android/zh-TW/changelogs/40104190.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104190.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104190.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104200.txt b/fastlane/metadata/android/zh-TW/changelogs/40104200.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104200.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104200.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104220.txt b/fastlane/metadata/android/zh-TW/changelogs/40104220.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104220.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104220.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104230.txt b/fastlane/metadata/android/zh-TW/changelogs/40104230.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104230.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104230.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104240.txt b/fastlane/metadata/android/zh-TW/changelogs/40104240.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104240.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104240.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104250.txt b/fastlane/metadata/android/zh-TW/changelogs/40104250.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104250.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104250.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104260.txt b/fastlane/metadata/android/zh-TW/changelogs/40104260.txt index 7569b4f491..ff3722effc 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104260.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104260.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:使用 UnifiedPush 並允許使用者在沒有 FCM 的情況下推送。 +此版本的主要變動:使用 UnifiedPush 並允許使用者在沒有 FCM 的情況下推送。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104270.txt b/fastlane/metadata/android/zh-TW/changelogs/40104270.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104270.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104270.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104280.txt b/fastlane/metadata/android/zh-TW/changelogs/40104280.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104280.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104280.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104300.txt b/fastlane/metadata/android/zh-TW/changelogs/40104300.txt index 3055389b2b..4576d13849 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104300.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104300.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:啟用改善的登入與註冊流程。 +此版本的主要變動:啟用改善的登入與註冊流程。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104310.txt b/fastlane/metadata/android/zh-TW/changelogs/40104310.txt index 3055389b2b..4576d13849 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104310.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104310.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:啟用改善的登入與註冊流程。 +此版本的主要變動:啟用改善的登入與註冊流程。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104320.txt b/fastlane/metadata/android/zh-TW/changelogs/40104320.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104320.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104320.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104340.txt b/fastlane/metadata/android/zh-TW/changelogs/40104340.txt index 4bcca9a0b8..af2e29cf1c 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40104340.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40104340.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:多個臭蟲修復與穩定性改善。 +此版本的主要變動:修復多個錯誤與改善穩定性。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105000.txt b/fastlane/metadata/android/zh-TW/changelogs/40105000.txt index 7ab6a7a7bf..8b7e371d4f 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105000.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105000.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:預設啟用延遲直接訊息。 +此版本的主要變動:預設啟用延遲直接訊息。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105020.txt b/fastlane/metadata/android/zh-TW/changelogs/40105020.txt index d83fd08a53..9112ae8f09 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105020.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105020.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:預設啟用新的應用程式佈局! +此版本的主要變動:預設啟用新的應用程式佈局! 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105040.txt b/fastlane/metadata/android/zh-TW/changelogs/40105040.txt index b35b1185b9..a0358632d4 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105040.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105040.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:實驗室設定下有新功能:格式化文字編輯器、新裝置管理、語音廣播。仍在積極開發中! +此版本的主要變動:實驗室設定下有新功能:富文本編輯器、新裝置管理、語音廣播。仍在積極開發中! 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105060.txt b/fastlane/metadata/android/zh-TW/changelogs/40105060.txt index 56667ccfc0..ac30daf3bf 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105060.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105060.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:選取附件的新使用者介面。 +此版本的主要變動:選取附件的新使用者介面。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105070.txt b/fastlane/metadata/android/zh-TW/changelogs/40105070.txt index 56667ccfc0..ac30daf3bf 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105070.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105070.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:選取附件的新使用者介面。 +此版本的主要變動:選取附件的新使用者介面。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105080.txt b/fastlane/metadata/android/zh-TW/changelogs/40105080.txt index 2a368ec8be..58176c43b8 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105080.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105080.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:臭蟲修復與改善。 +此版本的主要變動:修復錯誤與改善。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105100.txt b/fastlane/metadata/android/zh-TW/changelogs/40105100.txt index 20341b84fe..4d1cbe2c2f 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105100.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105100.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:格式化文字編輯器的全螢幕模式新實作與臭蟲修復。 +此版本的主要變動:富文本編輯器全螢幕模式的全新建置與錯誤修復。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105110.txt b/fastlane/metadata/android/zh-TW/changelogs/40105110.txt index 20341b84fe..37efa35f58 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105110.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105110.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:格式化文字編輯器的全螢幕模式新實作與臭蟲修復。 +此版本的主要變動:富文本編輯器全螢幕模式全新建置與錯誤修復。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105120.txt b/fastlane/metadata/android/zh-TW/changelogs/40105120.txt index 9c66f3c2ad..4d6cd8c2ff 100644 --- a/fastlane/metadata/android/zh-TW/changelogs/40105120.txt +++ b/fastlane/metadata/android/zh-TW/changelogs/40105120.txt @@ -1,2 +1,2 @@ -此版本中的主要變動:討論串現在預設啟用。 +此版本的主要變動:預設開啟對話串功能。 完整的變更紀錄:https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/zh-TW/full_description.txt b/fastlane/metadata/android/zh-TW/full_description.txt index eda511c4af..99a711e34a 100644 --- a/fastlane/metadata/android/zh-TW/full_description.txt +++ b/fastlane/metadata/android/zh-TW/full_description.txt @@ -2,7 +2,7 @@ Element 同時是安全的通訊軟體,也是生產力團隊協作應用程式 Element 的功能包含了: - 進階線上通訊工具 -- 完全加密的訊息,即使對於遠端工作者,也可以有更安全的公司通訊 +- 完全加密的訊息,即使對於遠端工作者,也可以有更安全的企業通訊 - 以 Matrix 開放原始碼框架為基礎的去中心化的聊天 - 在管理專案時透過加密資料安全地分享檔案 - 包含了 VoIP 與畫面分享的視訊聊天 @@ -11,15 +11,15 @@ Element 同時是安全的通訊軟體,也是生產力團隊協作應用程式 Element 與其他訊息傳遞與協作應用程式完全不同。它在 Matrix(一個用於安全傳遞訊息與去中心化通訊的開放網路)上執行。其可以自架,讓使用者對他們的資料與訊息有最大的所有權與控制權。 隱私與加密訊息傳遞 -Element 保護您不受不想要的廣告、資料挖礦與圍牆花園侵擾。其也透過端到端加密與交叉簽章裝置驗證保護了您所有的資料,並提供一對一視訊以及語音通訊。 +Element 保護您不受不想要的廣告、資料探勘與圍牆花園侵擾。其也透過端到端加密與交叉簽章裝置驗證保護了您所有的資料,並提供一對一視訊以及語音通訊。 Element 透過與其他商業協作工具,如 Slack 等應用程式整合,讓您可以在控制您的隱私的同時,也可以與 Matrix 網路上的任何人安全地通訊。 Element 可以自架 -為了可以完整控制您的敏感資料與對話,Element 可以自架,您也可以選擇任何以 Matrix 為基礎的服務提供商,開放原始碼、去中心化的通訊標準。Element 為您提供隱私、安全合規與整合活性。 +為了可以完整控制您的敏感資料與對話,Element 可以自架,您也可以選擇任何以 Matrix 為基礎的服務提供商,來使用其開放原始碼、去中心化的通訊標準。Element 為您提供隱私、安全合規與整合活性。 擁有您的資料 -您可以決定將您的資料與訊息儲存在何處。沒有資料挖礦或被第三方存取的風險。 +您可以決定將您的資料與訊息儲存在何處。沒有資料探勘或被第三方存取的風險。 Element 透過不同的方式讓您掌控一切: 1. 在 Matrix 開發者架設的 matrix.org 公開伺服器上取得免費帳號,或是從數千個由志願者架設的公開伺服器中選擇 @@ -30,13 +30,13 @@ Element 透過不同的方式讓您掌控一切: 您可以與 Matrix 網路上的任何人聊天,不論他們是使用 Element、其他 Matrix 應用程式或其他通訊應用程式。 超級安全 -真的端到端加密(僅有那些在對話中的可以解密訊息)以及交叉簽章裝置驗證。 +真正的端到端加密(僅有那些在對話中的使用者可以解密訊息)以及交叉簽章裝置驗證。 -完整的通訊與整合Complete communication and integration +完整的通訊與整合 訊息傳遞、語音與視訊通話、檔案分享、畫面分享與超多的整合、機器人與小工具。建構聊天室、社群、保持聯絡並完成工作。 從上次離開的地方開始 -無論您身在何處,都可以透過在您所有裝置與網頁 https://app.element.io 間完全同步的訊息歷史保持聯絡 +無論您身在何處,都可以透過在您所有裝置與網頁 https://app.element.io 間完全同步的訊息歷史保持聯絡。 開放原始碼 -Android 版的 Element 是開放原始碼專案,託管於 GitHub 上。請在 https://github.com/vector-im/element-android 上回報臭蟲及/或貢獻其開發 +Android 版的 Element 是開放原始碼專案,託管於 GitHub 上。請在 https://github.com/vector-im/element-android 上回報錯誤及/或貢獻其開發 diff --git a/fastlane/metadata/android/zh-TW/short_description.txt b/fastlane/metadata/android/zh-TW/short_description.txt index 0d1f5bb7cd..3e13097738 100644 --- a/fastlane/metadata/android/zh-TW/short_description.txt +++ b/fastlane/metadata/android/zh-TW/short_description.txt @@ -1 +1 @@ -群組通訊軟體 - 訊息加密、群組聊天與視訊通話 +群組通訊軟體 - 加密訊息、群組聊天與視訊通話 From 36ed81749e5615d027bd4bb492b89a55c252c2f2 Mon Sep 17 00:00:00 2001 From: sonata-chen Date: Sat, 4 Mar 2023 14:23:18 +0000 Subject: [PATCH 135/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- .../src/main/res/values-zh-rTW/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 4e8e4b586b..2f8f9ae1fb 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -856,7 +856,7 @@ 請稍候… 無法預覽此聊天室 聊天室 - 直接訊息 + 私人訊息 建立 名稱 公開 @@ -888,7 +888,7 @@ 感謝,建議已成功傳送 無法傳送建議(%s) 在時間軸中顯示隱藏的活動 - 直接訊息 + 私人訊息 正在等待… 正在加密縮圖… 正在傳送縮圖 (%1$s / %2$s) @@ -901,7 +901,7 @@ 過濾對話… 找不到您要尋找的東西? 建立一間新聊天室 - 傳送一則新的直接訊息 + 傳送新的私人訊息 檢視聊天室目錄 名稱或 ID(#example:matrix.org) 啟用滑動以在時間軸上回覆 @@ -959,7 +959,7 @@ 開啟導航選單 開啟建立聊天室選單 關閉建立聊天室選單… - 建立一則新的直接對話 + 建立新的私人對話 建立一間新聊天室 關閉金鑰備份橫幅 跳到底部 @@ -1240,7 +1240,7 @@ 時間軸 訊息編輯器 啟用端對端加密… - 啟用加密? + 是否啟用加密? 一旦啟用,對聊天室的加密就無法停用。傳送到已加密聊天室的訊息無法被伺服器看見,僅有聊天室的參與者可見。啟用加密可能會讓許多聊天機器人與橋接無法運作。 啟用加密 要確定安全,請透過一次性的代碼驗證 %s。 @@ -1705,7 +1705,7 @@ 聊天室主題(選擇性) 聊天室名稱 匯出審核 - 直接訊息 + 私人訊息 傳送金鑰共享請求歷史 沒有更多結果 未掃描 QR 碼! From f7fffcdd679dbbef8a9e4e8fd611e8a3931f74c9 Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Sat, 4 Mar 2023 14:25:32 +0000 Subject: [PATCH 136/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- library/ui-strings/src/main/res/values-zh-rTW/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 2f8f9ae1fb..2201d614df 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -1240,7 +1240,7 @@ 時間軸 訊息編輯器 啟用端對端加密… - 是否啟用加密? + 要開啟加密嗎? 一旦啟用,對聊天室的加密就無法停用。傳送到已加密聊天室的訊息無法被伺服器看見,僅有聊天室的參與者可見。啟用加密可能會讓許多聊天機器人與橋接無法運作。 啟用加密 要確定安全,請透過一次性的代碼驗證 %s。 @@ -1530,7 +1530,7 @@ 貼圖 管理動作 在 %1$s 中的預設 - 您的伺服器管理員已在私人聊天室與直接訊息中預設停用端對端加密。 + 您的伺服器管理員已在私人聊天室與私人訊息中預設停用端對端加密。 輸入只有您知道的安全密語,用於保護您伺服器上的安全祕密。 如果您現在取消,您可能會失去存取已加密訊息與資料,如果您失去存取您的登入。 \n From b1b00b00be666efa9909416c586f26515688fbe6 Mon Sep 17 00:00:00 2001 From: sonata-chen Date: Sat, 4 Mar 2023 14:25:45 +0000 Subject: [PATCH 137/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- library/ui-strings/src/main/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 2201d614df..e83566d489 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -1530,7 +1530,7 @@ 貼圖 管理動作 在 %1$s 中的預設 - 您的伺服器管理員已在私人聊天室與私人訊息中預設停用端對端加密。 + 您的伺服器管理員已在私人聊天室與私人訊息中預設停用端到端加密。 輸入只有您知道的安全密語,用於保護您伺服器上的安全祕密。 如果您現在取消,您可能會失去存取已加密訊息與資料,如果您失去存取您的登入。 \n From a6211a1da349a381e160df0ebdf9d47860462b97 Mon Sep 17 00:00:00 2001 From: bmarty Date: Mon, 6 Mar 2023 00:03:43 +0000 Subject: [PATCH 138/153] Sync analytics plan --- .../app/features/analytics/plan/Error.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/vector/src/main/java/im/vector/app/features/analytics/plan/Error.kt b/vector/src/main/java/im/vector/app/features/analytics/plan/Error.kt index 5c082f530e..386c090848 100644 --- a/vector/src/main/java/im/vector/app/features/analytics/plan/Error.kt +++ b/vector/src/main/java/im/vector/app/features/analytics/plan/Error.kt @@ -29,6 +29,10 @@ data class Error( * Context - client defined, can be used for debugging. */ val context: String? = null, + /** + * Which crypto module is the client currently using. + */ + val cryptoModule: CryptoModule? = null, val domain: Domain, val name: Name, ) : VectorAnalyticsEvent { @@ -52,11 +56,25 @@ data class Error( VoipUserMediaFailed, } + enum class CryptoModule { + + /** + * Native / legacy crypto module specific to each platform. + */ + Native, + + /** + * Shared / cross-platform crypto module written in Rust. + */ + Rust, + } + override fun getName() = "Error" override fun getProperties(): Map? { return mutableMapOf().apply { context?.let { put("context", it) } + cryptoModule?.let { put("cryptoModule", it.name) } put("domain", domain.name) put("name", name.name) }.takeIf { it.isNotEmpty() } From 5117727827927bf224f0fff558159f5b36a060cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 07:56:57 +0100 Subject: [PATCH 139/153] Bump org.jlleitschuh.gradle.ktlint from 11.2.0 to 11.3.1 (#8205) Bumps org.jlleitschuh.gradle.ktlint from 11.2.0 to 11.3.1. --- updated-dependencies: - dependency-name: org.jlleitschuh.gradle.ktlint dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2e28911a4f..cfeb006d97 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ buildscript { plugins { // ktlint Plugin - id "org.jlleitschuh.gradle.ktlint" version "11.2.0" + id "org.jlleitschuh.gradle.ktlint" version "11.3.1" // Detekt id "io.gitlab.arturbosch.detekt" version "1.22.0" // Ksp From 8595bd2be85664e03d76351b387d5c71110486b4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 6 Mar 2023 15:49:16 +0100 Subject: [PATCH 140/153] Fix compilation issue. --- .../vector/app/features/analytics/DecryptionFailureTracker.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt b/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt index b38a4d934b..90a4a3213c 100644 --- a/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt +++ b/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt @@ -137,7 +137,7 @@ class DecryptionFailureTracker @Inject constructor( // for now we ignore events already reported even if displayed again? .filter { alreadyReported.contains(it).not() } .forEach { failedEventId -> - analyticsTracker.capture(Error(aggregation.key.first, Error.Domain.E2EE, aggregation.key.second)) + analyticsTracker.capture(Error(context = aggregation.key.first, domain = Error.Domain.E2EE, name = aggregation.key.second)) alreadyReported.add(failedEventId) } } From 29f2bf25fc5170c39d89f7d313958218a67795e8 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Mon, 6 Mar 2023 16:03:53 +0000 Subject: [PATCH 141/153] Extend workaround for extra new lines in timeline (#8187) * Extend workaround for extra new lines in timeline Closes vector-im/element-android#8179 Caused by noties/Markwon#423 * Refactor Co-authored-by: Yoan Pintas --------- Co-authored-by: Yoan Pintas --- changelog.d/8187.bugfix | 1 + .../java/im/vector/app/core/utils/TestSpan.kt | 4 +++ .../features/html/EventHtmlRendererTest.kt | 24 +++++++++++++++++ .../app/features/html/EventHtmlRenderer.kt | 27 ++++++++++++++----- 4 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 changelog.d/8187.bugfix diff --git a/changelog.d/8187.bugfix b/changelog.d/8187.bugfix new file mode 100644 index 0000000000..e0a9dd3a29 --- /dev/null +++ b/changelog.d/8187.bugfix @@ -0,0 +1 @@ +Extend workaround for extra new lines in timeline \ No newline at end of file diff --git a/vector/src/androidTest/java/im/vector/app/core/utils/TestSpan.kt b/vector/src/androidTest/java/im/vector/app/core/utils/TestSpan.kt index 1d0d6548e1..ebbe565642 100644 --- a/vector/src/androidTest/java/im/vector/app/core/utils/TestSpan.kt +++ b/vector/src/androidTest/java/im/vector/app/core/utils/TestSpan.kt @@ -20,6 +20,7 @@ import android.graphics.Canvas import android.graphics.Paint import android.text.Layout import android.text.Spanned +import android.text.style.StrikethroughSpan import androidx.core.text.getSpans import im.vector.app.features.html.HtmlCodeSpan import io.element.android.wysiwyg.spans.InlineCodeSpan @@ -28,6 +29,7 @@ import io.mockk.mockk import io.mockk.slot import io.mockk.verify import io.noties.markwon.core.spans.EmphasisSpan +import io.noties.markwon.core.spans.LinkSpan import io.noties.markwon.core.spans.OrderedListItemSpan import io.noties.markwon.core.spans.StrongEmphasisSpan import me.gujun.android.span.style.CustomTypefaceSpan @@ -59,6 +61,8 @@ private fun Any.readTags(): SpanTags { StrongEmphasisSpan::class -> "bold" EmphasisSpan::class, CustomTypefaceSpan::class -> "italic" InlineCodeSpan::class -> "inline code" + StrikethroughSpan::class -> "strikethrough" + LinkSpan::class -> "link" else -> if (this::class.qualifiedName!!.startsWith("android.widget")) { null } else { diff --git a/vector/src/androidTest/java/im/vector/app/features/html/EventHtmlRendererTest.kt b/vector/src/androidTest/java/im/vector/app/features/html/EventHtmlRendererTest.kt index c095b33b44..94d60538d9 100644 --- a/vector/src/androidTest/java/im/vector/app/features/html/EventHtmlRendererTest.kt +++ b/vector/src/androidTest/java/im/vector/app/features/html/EventHtmlRendererTest.kt @@ -73,6 +73,30 @@ class EventHtmlRendererTest { result shouldBeEqualTo "__italic__ **bold**" } + // https://github.com/noties/Markwon/issues/423 + @Test + fun doesNotIntroduceExtraNewLines() { + // Given initial render (required to trigger bug) + """Some italic""".renderAsTestSpan() + val results = arrayOf( + """Some italic""".renderAsTestSpan(), + """Some bold""".renderAsTestSpan(), + """Some code""".renderAsTestSpan(), + """Some link""".renderAsTestSpan(), + """Some strikethrough""".renderAsTestSpan(), + """Some span""".renderAsTestSpan(), + ) + + results shouldBeEqualTo arrayOf( + "Some [italic]italic[/italic]", + "Some [bold]bold[/bold]", + "Some [inline code]code[/inline code]", + "Some [link]link[/link]", + "Some \n[strikethrough]strikethrough[/strikethrough]", // FIXME + "Some \nspan", // FIXME + ) + } + @Test fun processesHtmlWithinCodeBlocks() { val result = """italic bold""".renderAsTestSpan() diff --git a/vector/src/main/java/im/vector/app/features/html/EventHtmlRenderer.kt b/vector/src/main/java/im/vector/app/features/html/EventHtmlRenderer.kt index e75d12f1d8..cb3f12d867 100644 --- a/vector/src/main/java/im/vector/app/features/html/EventHtmlRenderer.kt +++ b/vector/src/main/java/im/vector/app/features/html/EventHtmlRenderer.kt @@ -31,6 +31,9 @@ import android.graphics.Typeface import android.graphics.drawable.Drawable import android.text.Spannable import android.text.SpannableStringBuilder +import android.text.style.StrikethroughSpan +import android.text.style.URLSpan +import android.text.style.UnderlineSpan import android.widget.TextView import androidx.core.text.toSpannable import com.bumptech.glide.Glide @@ -46,6 +49,8 @@ import io.noties.markwon.Markwon import io.noties.markwon.MarkwonPlugin import io.noties.markwon.MarkwonSpansFactory import io.noties.markwon.PrecomputedFutureTextSetterCompat +import io.noties.markwon.core.spans.EmphasisSpan +import io.noties.markwon.core.spans.StrongEmphasisSpan import io.noties.markwon.ext.latex.JLatexMathPlugin import io.noties.markwon.ext.latex.JLatexMathTheme import io.noties.markwon.html.HtmlPlugin @@ -154,14 +159,24 @@ class EventHtmlRenderer @Inject constructor( /** * Workaround for https://github.com/noties/Markwon/issues/423 */ - private val removeLeadingNewlineForInlineCode = object : AbstractMarkwonPlugin() { + private val removeLeadingNewlineForInlineElement = object : AbstractMarkwonPlugin() { override fun afterSetText(textView: TextView) { super.afterSetText(textView) val text = SpannableStringBuilder(textView.text.toSpannable()) - val inlineCodeSpans = text.getSpans(0, textView.length(), InlineCodeSpan::class.java).toList() - val legacyInlineCodeSpans = text.getSpans(0, textView.length(), HtmlCodeSpan::class.java).filter { !it.isBlock } - val spans = inlineCodeSpans + legacyInlineCodeSpans + val length = textView.length() + val spans = arrayOf( + InlineCodeSpan::class.java, + EmphasisSpan::class.java, + CustomTypefaceSpan::class.java, + StrongEmphasisSpan::class.java, + UnderlineSpan::class.java, + URLSpan::class.java, + StrikethroughSpan::class.java + ).map { text.getSpans(0, length, it) } + .toTypedArray() + .plus(text.getSpans(0, length, HtmlCodeSpan::class.java).filter { !it.isBlock }.toTypedArray()) + .flatten() if (spans.isEmpty()) return @@ -179,11 +194,11 @@ class EventHtmlRenderer @Inject constructor( private val markwon = Markwon.builder(context) .usePlugin(HtmlRootTagPlugin()) .usePlugin(HtmlPlugin.create(htmlConfigure)) - .usePlugin(removeLeadingNewlineForInlineCode) + .usePlugin(removeLeadingNewlineForInlineElement) .usePlugin(glidePlugin) .apply { if (vectorPreferences.latexMathsIsEnabled()) { - // If latex maths is enabled in app preferences, refomat it so Markwon recognises it + // If latex maths is enabled in app preferences, reformat it so Markwon recognises it // It needs to be in this specific format: https://noties.io/Markwon/docs/v4/ext-latex latexPlugins.forEach(::usePlugin) } From 94675b9f854ddaa2f3b6220866203ebb956f5f0f Mon Sep 17 00:00:00 2001 From: Yoan Pintas Date: Mon, 6 Mar 2023 23:05:43 +0100 Subject: [PATCH 142/153] create encrypted DM for user invite by email (#8172) Co-authored-by: jonnyandrew --- changelog.d/6912.misc | 1 + .../src/main/res/values/strings.xml | 3 + .../room/create/CreateRoomBodyBuilder.kt | 4 +- .../membership/RoomDisplayNameResolver.kt | 7 +- .../app/core/di/MavericksViewModelModule.kt | 6 -- .../createdirect/CreateDirectRoomActivity.kt | 1 + .../createdirect/CreateDirectRoomViewModel.kt | 2 +- .../home/room/detail/TimelineFragment.kt | 4 + .../timeline/factory/EncryptionItemFactory.kt | 43 ++++++---- .../timeline/item/MergedRoomCreationItem.kt | 33 +++++--- .../timeline/item/StatusTileTimelineItem.kt | 2 + .../HomeServerCapabilitiesViewModel.kt | 83 ------------------- .../HomeServerCapabilitiesViewState.kt | 25 ------ .../userdirectory/UserListController.kt | 8 ++ .../userdirectory/UserListFragment.kt | 5 +- .../userdirectory/UserListFragmentArgs.kt | 1 + .../userdirectory/UserListViewModel.kt | 31 ++++++- .../userdirectory/UserListViewState.kt | 3 + 18 files changed, 113 insertions(+), 149 deletions(-) create mode 100644 changelog.d/6912.misc delete mode 100644 vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt delete mode 100644 vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewState.kt diff --git a/changelog.d/6912.misc b/changelog.d/6912.misc new file mode 100644 index 0000000000..c43830e902 --- /dev/null +++ b/changelog.d/6912.misc @@ -0,0 +1 @@ +Direct Message: Manage encrypted DM in case of invite by email diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 2ee623cf88..62f061f009 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -1817,6 +1817,7 @@ Add by QR code QR code "Creating room…" + You can only invite one email at a time Known Users Suggestions @@ -2561,6 +2562,8 @@ Messages in this room are end-to-end encrypted. Learn more & verify users in their profile. Messages in this chat are end-to-end encrypted. Messages in this chat will be end-to-end encrypted. + Waiting for users to join ${app_name} + Once invited users have joined ${app_name}, you will be able to chat and the room will be end-to-end encrypted Encryption not enabled Encryption is misconfigured The encryption used by this room is not supported diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomBodyBuilder.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomBodyBuilder.kt index 4105c77cc8..92081885af 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomBodyBuilder.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomBodyBuilder.kt @@ -190,10 +190,8 @@ internal class CreateRoomBodyBuilder @Inject constructor( private suspend fun canEnableEncryption(params: CreateRoomParams): Boolean { return params.enableEncryptionIfInvitedUsersSupportIt && // Parity with web, enable if users have encryption ready devices - // for now remove checks on cross signing and 3pid invites + // for now remove checks on cross signing // && crossSigningService.isCrossSigningVerified() - params.invite3pids.isEmpty() && - params.invitedUserIds.isNotEmpty() && params.invitedUserIds.let { userIds -> val keys = deviceListManager.downloadKeys(userIds, forceDownload = false) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt index 4645bb05ab..7497ecf21b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt @@ -115,7 +115,12 @@ internal class RoomDisplayNameResolver @Inject constructor( val leftMembersNames = roomMembers.queryLeftRoomMembersEvent() .findAll() .map { displayNameResolver.getBestName(it.toMatrixItem()) } - roomDisplayNameFallbackProvider.getNameForEmptyRoom(roomSummary?.isDirect.orFalse(), leftMembersNames) + val directUserId = roomSummary?.directUserId + if (!directUserId.isNullOrBlank() && leftMembersNames.isEmpty()) { + directUserId + } else { + roomDisplayNameFallbackProvider.getNameForEmptyRoom(roomSummary?.isDirect.orFalse(), leftMembersNames) + } } 1 -> { roomDisplayNameFallbackProvider.getNameFor1member( diff --git a/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt b/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt index 27981c3d36..8b435c9e6c 100644 --- a/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/MavericksViewModelModule.kt @@ -57,7 +57,6 @@ import im.vector.app.features.home.room.list.RoomListViewModel import im.vector.app.features.home.room.list.home.HomeRoomListViewModel import im.vector.app.features.home.room.list.home.invites.InvitesViewModel import im.vector.app.features.home.room.list.home.release.ReleaseNotesViewModel -import im.vector.app.features.homeserver.HomeServerCapabilitiesViewModel import im.vector.app.features.invite.InviteUsersToRoomViewModel import im.vector.app.features.location.LocationSharingViewModel import im.vector.app.features.location.live.map.LiveLocationMapViewModel @@ -500,11 +499,6 @@ interface MavericksViewModelModule { @MavericksViewModelKey(StartAppViewModel::class) fun startAppViewModelFactory(factory: StartAppViewModel.Factory): MavericksAssistedViewModelFactory<*, *> - @Binds - @IntoMap - @MavericksViewModelKey(HomeServerCapabilitiesViewModel::class) - fun homeServerCapabilitiesViewModelFactory(factory: HomeServerCapabilitiesViewModel.Factory): MavericksAssistedViewModelFactory<*, *> - @Binds @IntoMap @MavericksViewModelKey(InviteUsersToRoomViewModel::class) diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt index acaf24dca7..fbddf815c6 100644 --- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt +++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt @@ -93,6 +93,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() { title = getString(R.string.fab_menu_create_chat), menuResId = R.menu.vector_create_direct_room, submitMenuItemId = R.id.action_create_direct_room, + single3pidSelection = true, ) ) } diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt index 3f67708a28..dce1e63766 100644 --- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt @@ -124,7 +124,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor( } val result = runCatchingToAsync { - if (vectorPreferences.isDeferredDmEnabled()) { + if (vectorPreferences.isDeferredDmEnabled() && roomParams.invite3pids.isEmpty()) { session.roomService().createLocalRoom(roomParams) } else { analyticsTracker.capture(CreatedRoom(isDM = roomParams.isDirect.orFalse())) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt index 2bb6fdb3e6..f363128ad5 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt @@ -1176,6 +1176,10 @@ class TimelineFragment : views.hideComposerViews() views.notificationAreaView.render(NotificationAreaView.State.Tombstone(mainState.tombstoneEvent)) } + + if (summary.isDirect && summary.isEncrypted && summary.joinedMembersCount == 1 && summary.invitedMembersCount == 0) { + views.hideComposerViews() + } } else if (summary?.membership == Membership.INVITE && inviter != null) { views.hideComposerViews() lazyLoadedViews.inviteView(true)?.apply { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt index 69b4f6e039..9d757a5f2e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt @@ -56,22 +56,37 @@ class EncryptionItemFactory @Inject constructor( val description: String val shield: StatusTileTimelineItem.ShieldUIState if (isSafeAlgorithm) { - val isDirect = session.getRoomSummary(event.root.roomId.orEmpty())?.isDirect.orFalse() - title = stringProvider.getString(R.string.encryption_enabled) - description = stringProvider.getString( + val roomSummary = session.getRoomSummary(event.root.roomId.orEmpty()) + val isDirect = roomSummary?.isDirect.orFalse() + val (resTitle, resDescription, resShield) = when { + isDirect -> { + val isWaitingUser = roomSummary?.isEncrypted.orFalse() && roomSummary?.joinedMembersCount == 1 && roomSummary.invitedMembersCount == 0 when { - isDirect && RoomLocalEcho.isLocalEchoId(event.root.roomId.orEmpty()) -> { - R.string.direct_room_encryption_enabled_tile_description_future - } - isDirect -> { - R.string.direct_room_encryption_enabled_tile_description - } - else -> { - R.string.encryption_enabled_tile_description - } + RoomLocalEcho.isLocalEchoId(event.root.roomId.orEmpty()) -> Triple( + R.string.encryption_enabled, + R.string.direct_room_encryption_enabled_tile_description_future, + StatusTileTimelineItem.ShieldUIState.BLACK + ) + isWaitingUser -> Triple( + R.string.direct_room_encryption_enabled_waiting_users, + R.string.direct_room_encryption_enabled_waiting_users_tile_description, + StatusTileTimelineItem.ShieldUIState.WAITING + ) + else -> Triple( + R.string.encryption_enabled, + R.string.direct_room_encryption_enabled_tile_description, + StatusTileTimelineItem.ShieldUIState.BLACK + ) } - ) - shield = StatusTileTimelineItem.ShieldUIState.BLACK + } + else -> { + Triple(R.string.encryption_enabled, R.string.encryption_enabled_tile_description, StatusTileTimelineItem.ShieldUIState.BLACK) + } + } + + title = stringProvider.getString(resTitle) + description = stringProvider.getString(resDescription) + shield = resShield } else { title = stringProvider.getString(R.string.encryption_misconfigured) description = stringProvider.getString(R.string.encryption_unknown_algorithm_tile_description) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt index a5e2b0d064..d8a9170402 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt @@ -40,6 +40,7 @@ import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.home.room.detail.timeline.tools.linkify import im.vector.app.features.themes.ThemeUtils import me.gujun.android.span.span +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.model.localecho.RoomLocalEcho import org.matrix.android.sdk.api.util.toMatrixItem @@ -127,26 +128,38 @@ abstract class MergedRoomCreationItem : BasedMergedItem { - if (attributes.isLocalRoom) { - resources.getString(R.string.direct_room_encryption_enabled_tile_description_future) - } else { - resources.getString(R.string.direct_room_encryption_enabled_tile_description) + val isWaitingUser = roomSummary?.isEncrypted.orFalse() && roomSummary?.joinedMembersCount == 1 && roomSummary?.invitedMembersCount == 0 + when { + attributes.isLocalRoom -> Triple( + R.string.encryption_enabled, + R.string.direct_room_encryption_enabled_tile_description_future, + R.drawable.ic_shield_black + ) + isWaitingUser -> Triple( + R.string.direct_room_encryption_enabled_waiting_users, + R.string.direct_room_encryption_enabled_waiting_users_tile_description, + R.drawable.ic_room_profile_member_list + ) + else -> Triple( + R.string.encryption_enabled, + R.string.direct_room_encryption_enabled_tile_description, + R.drawable.ic_shield_black + ) } } else -> { - resources.getString(R.string.encryption_enabled_tile_description) + Triple(R.string.encryption_enabled, R.string.encryption_enabled_tile_description, R.drawable.ic_shield_black) } } - holder.e2eTitleTextView.text = holder.expandView.resources.getString(R.string.encryption_enabled) + holder.e2eTitleTextView.text = holder.expandView.resources.getString(title) holder.e2eTitleTextView.setCompoundDrawablesWithIntrinsicBounds( - ContextCompat.getDrawable(holder.view.context, R.drawable.ic_shield_black), + ContextCompat.getDrawable(holder.view.context, drawable), null, null, null ) - holder.e2eTitleDescriptionView.text = description + holder.e2eTitleDescriptionView.text = holder.expandView.resources.getString(description) holder.e2eTitleDescriptionView.textAlignment = View.TEXT_ALIGNMENT_CENTER } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/StatusTileTimelineItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/StatusTileTimelineItem.kt index 1e5bb0521d..5a0c024ec8 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/StatusTileTimelineItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/StatusTileTimelineItem.kt @@ -57,6 +57,7 @@ abstract class StatusTileTimelineItem : AbsBaseMessageItem R.drawable.ic_shield_trusted ShieldUIState.BLACK -> R.drawable.ic_shield_black ShieldUIState.RED -> R.drawable.ic_shield_warning + ShieldUIState.WAITING -> R.drawable.ic_room_profile_member_list ShieldUIState.ERROR -> R.drawable.ic_warning_badge } @@ -101,6 +102,7 @@ abstract class StatusTileTimelineItem : AbsBaseMessageItem(initialState) { - - @AssistedFactory - interface Factory : MavericksAssistedViewModelFactory { - override fun create(initialState: HomeServerCapabilitiesViewState): HomeServerCapabilitiesViewModel - } - - companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() { - - override fun initialState(viewModelContext: ViewModelContext): HomeServerCapabilitiesViewState { - val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getSafeActiveSession() - return HomeServerCapabilitiesViewState( - capabilities = session?.homeServerCapabilitiesService()?.getHomeServerCapabilities() ?: HomeServerCapabilities() - ) - } - } - - init { - - initAdminE2eByDefault() - } - - private fun initAdminE2eByDefault() { - viewModelScope.launch(Dispatchers.IO) { - val adminE2EByDefault = tryOrNull { - rawService.getElementWellknown(session.sessionParams) - ?.isE2EByDefault() - ?: true - } ?: true - - setState { - copy( - isE2EByDefault = adminE2EByDefault - ) - } - } - } - - override fun handle(action: EmptyAction) {} -} diff --git a/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewState.kt b/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewState.kt deleted file mode 100644 index d7ced5e632..0000000000 --- a/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewState.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.homeserver - -import com.airbnb.mvrx.MavericksState -import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities - -data class HomeServerCapabilitiesViewState( - val capabilities: HomeServerCapabilities = HomeServerCapabilities(), - val isE2EByDefault: Boolean = true -) : MavericksState diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserListController.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserListController.kt index 2131eda60e..54e43038b1 100644 --- a/vector/src/main/java/im/vector/app/features/userdirectory/UserListController.kt +++ b/vector/src/main/java/im/vector/app/features/userdirectory/UserListController.kt @@ -25,6 +25,7 @@ import im.vector.app.R import im.vector.app.core.epoxy.errorWithRetryItem import im.vector.app.core.epoxy.loadingItem import im.vector.app.core.epoxy.noResultItem +import im.vector.app.core.epoxy.profiles.notifications.textHeaderItem import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.StringProvider @@ -61,6 +62,13 @@ class UserListController @Inject constructor( val currentState = state ?: return val host = this + if (currentState.isE2EByDefault && currentState.single3pidSelection && currentState.pendingSelections.isNotEmpty()) { + textHeaderItem { + id("userListNotificationHeader") + textRes(R.string.direct_room_user_list_only_invite_one_email) + } + } + // Build generic items if (currentState.searchTerm.isBlank()) { if (currentState.showInviteActions()) { diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserListFragment.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserListFragment.kt index fbb6a8ee14..6447452e5b 100644 --- a/vector/src/main/java/im/vector/app/features/userdirectory/UserListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/userdirectory/UserListFragment.kt @@ -27,7 +27,6 @@ import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.args -import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import com.google.android.material.chip.Chip import dagger.hilt.android.AndroidEntryPoint @@ -42,7 +41,6 @@ import im.vector.app.core.utils.DimensionConverter import im.vector.app.core.utils.showIdentityServerConsentDialog import im.vector.app.core.utils.startSharePlainTextIntent import im.vector.app.databinding.FragmentUserListBinding -import im.vector.app.features.homeserver.HomeServerCapabilitiesViewModel import im.vector.app.features.settings.VectorSettingsActivity import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -63,7 +61,6 @@ class UserListFragment : private val args: UserListFragmentArgs by args() private val viewModel: UserListViewModel by activityViewModel() - private val homeServerCapabilitiesViewModel: HomeServerCapabilitiesViewModel by fragmentViewModel() private lateinit var sharedActionViewModel: UserListSharedActionViewModel override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentUserListBinding { @@ -86,7 +83,7 @@ class UserListFragment : setupRecyclerView() setupSearchView() - homeServerCapabilitiesViewModel.onEach { + viewModel.onEach { views.userListE2EbyDefaultDisabled.isVisible = !it.isE2EByDefault } diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserListFragmentArgs.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserListFragmentArgs.kt index d6e55c29ae..0a0ae8127a 100644 --- a/vector/src/main/java/im/vector/app/features/userdirectory/UserListFragmentArgs.kt +++ b/vector/src/main/java/im/vector/app/features/userdirectory/UserListFragmentArgs.kt @@ -26,6 +26,7 @@ data class UserListFragmentArgs( val submitMenuItemId: Int, val excludedUserIds: Set? = null, val singleSelection: Boolean = false, + val single3pidSelection: Boolean = false, val showInviteActions: Boolean = true, val showContactBookAction: Boolean = true, val showToolbar: Boolean = true diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt index 5a764f11fd..ae28ff020d 100644 --- a/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt @@ -31,6 +31,9 @@ import im.vector.app.core.extensions.toggle import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider import im.vector.app.features.discovery.fetchIdentityServerWithTerms +import im.vector.app.features.raw.wellknown.getElementWellknown +import im.vector.app.features.raw.wellknown.isE2EByDefault +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.filter @@ -41,6 +44,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.raw.RawService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.identity.IdentityServiceError import org.matrix.android.sdk.api.session.identity.IdentityServiceListener @@ -57,6 +61,7 @@ data class ThreePidUser( class UserListViewModel @AssistedInject constructor( @Assisted initialState: UserListViewState, private val stringProvider: StringProvider, + private val rawService: RawService, private val session: Session ) : VectorViewModel(initialState) { @@ -84,6 +89,7 @@ class UserListViewModel @AssistedInject constructor( } init { + initAdminE2eByDefault() observeUsers() setState { copy( @@ -93,6 +99,22 @@ class UserListViewModel @AssistedInject constructor( session.identityService().addListener(identityServerListener) } + private fun initAdminE2eByDefault() { + viewModelScope.launch(Dispatchers.IO) { + val adminE2EByDefault = tryOrNull { + rawService.getElementWellknown(session.sessionParams) + ?.isE2EByDefault() + ?: true + } ?: true + + setState { + copy( + isE2EByDefault = adminE2EByDefault + ) + } + } + } + private fun cleanISURL(url: String?): String? { return url?.removePrefix("https://") } @@ -258,8 +280,13 @@ class UserListViewModel @AssistedInject constructor( } private fun handleSelectUser(action: UserListAction.AddPendingSelection) = withState { state -> - val selections = state.pendingSelections.toggle(action.pendingSelection, singleElement = state.singleSelection) - setState { copy(pendingSelections = selections) } + val canSelectUser = !state.isE2EByDefault || state.pendingSelections.isEmpty() || !state.single3pidSelection || + (action.pendingSelection is PendingSelection.UserPendingSelection && + state.pendingSelections.last() is PendingSelection.UserPendingSelection) + if (canSelectUser) { + val selections = state.pendingSelections.toggle(action.pendingSelection, singleElement = state.singleSelection) + setState { copy(pendingSelections = selections) } + } } private fun handleRemoveSelectedUser(action: UserListAction.RemovePendingSelection) = withState { state -> diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewState.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewState.kt index f91e273aeb..ec932a2a57 100644 --- a/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewState.kt +++ b/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewState.kt @@ -32,6 +32,8 @@ data class UserListViewState( val pendingSelections: Set = emptySet(), val searchTerm: String = "", val singleSelection: Boolean, + val single3pidSelection: Boolean, + val isE2EByDefault: Boolean = false, val configuredIdentityServer: String? = null, private val showInviteActions: Boolean, val showContactBookAction: Boolean @@ -40,6 +42,7 @@ data class UserListViewState( constructor(args: UserListFragmentArgs) : this( excludedUserIds = args.excludedUserIds, singleSelection = args.singleSelection, + single3pidSelection = args.single3pidSelection, showInviteActions = args.showInviteActions, showContactBookAction = args.showContactBookAction ) From 4c1c0ce6a3f6950e15882f4eb2081dd0c072b891 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 23:57:30 +0000 Subject: [PATCH 143/153] Bump danger/danger-js from 11.2.3 to 11.2.4 Bumps [danger/danger-js](https://github.com/danger/danger-js) from 11.2.3 to 11.2.4. - [Release notes](https://github.com/danger/danger-js/releases) - [Changelog](https://github.com/danger/danger-js/blob/main/CHANGELOG.md) - [Commits](https://github.com/danger/danger-js/compare/11.2.3...11.2.4) --- updated-dependencies: - dependency-name: danger/danger-js dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/danger.yml | 2 +- .github/workflows/quality.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml index a88a5faa9d..4c00894a36 100644 --- a/.github/workflows/danger.yml +++ b/.github/workflows/danger.yml @@ -11,7 +11,7 @@ jobs: - run: | npm install --save-dev @babel/plugin-transform-flow-strip-types - name: Danger - uses: danger/danger-js@11.2.3 + uses: danger/danger-js@11.2.4 with: args: "--dangerfile ./tools/danger/dangerfile.js" env: diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index b8800ea65b..bf298df26e 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -66,7 +66,7 @@ jobs: yarn add danger-plugin-lint-report --dev - name: Danger lint if: always() - uses: danger/danger-js@11.2.3 + uses: danger/danger-js@11.2.4 with: args: "--dangerfile ./tools/danger/dangerfile-lint.js" env: From 9037c6f8da0f5dd65e07e09aadc0002aaea818a2 Mon Sep 17 00:00:00 2001 From: random Date: Mon, 6 Mar 2023 09:40:05 +0000 Subject: [PATCH 144/153] Translated using Weblate (Italian) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/it/ --- library/ui-strings/src/main/res/values-it/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml index 8a6db0f0e2..081a845ed2 100644 --- a/library/ui-strings/src/main/res/values-it/strings.xml +++ b/library/ui-strings/src/main/res/values-it/strings.xml @@ -2919,4 +2919,5 @@ Impossibile decifrare questa trasmissione vocale. I dettagli del tuo account sono gestiti separatamente su %1$s. Account + Si è verificato un errore aggiornando le tue preferenze di notifica. Riprova. \ No newline at end of file From d790ee474e92bc1a88c1aad74e2b7d9dfc837d95 Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Tue, 7 Mar 2023 06:17:40 +0000 Subject: [PATCH 145/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- .../src/main/res/values-zh-rTW/strings.xml | 796 +++++++++--------- 1 file changed, 398 insertions(+), 398 deletions(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index e83566d489..46b6c25ea8 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -18,18 +18,18 @@ %1$s 已變更聊天室名稱為:%2$s %s 已開始視訊通話。 %s 已開始語音通話。 - %s 已回覆通話。 + %s 已接聽通話。 %s 已結束通話。 %1$s 讓 %2$s 也能看到聊天室未來的歷史紀錄 所有聊天室的成員,從他們被邀請的時間點。 所有聊天室的成員,從他們加入的時間點。 - 所有聊天室的成員。 + 聊天室的所有成員。 任何人。 (大頭照也已變更) %1$s 已移除聊天室的名稱 %1$s 已移除聊天室的主題 %1$s 已傳送邀請給 %2$s 以加入聊天室 - %1$s 已接受對 %2$s 的邀請 + %1$s 已接受 %2$s 的邀請 ** 無法解密:%s ** 傳送者的裝置並未將此訊息的金鑰傳給我們。 無法傳送訊息 @@ -42,16 +42,16 @@ 初始同步: \n正在匯入帳號… 初始同步: -\n正在匯入加密 +\n正在匯入加密資料 初始同步: \n正在匯入聊天室 初始同步: \n正在載入您的對話 -\n如果您已加入很多聊天室,這可能會花一點時間 +\n如果您加入了很多聊天室,可能要花一點時間 初始同步: -\n正在匯入已邀請的聊天室 +\n正在匯入已邀請的聊天室資料 初始同步: -\n正在匯入已離開的聊天室 +\n正在匯入已離開的聊天室資料 初始同步: \n正在匯入帳號資料 %s 已升級此聊天室。 @@ -74,9 +74,9 @@ %1$s 已移除 %2$s 為此聊天室的位址。 - %1$s 已新增 %2$s 並移除 %3$s 為此聊天室的位址。 - %1$s 設定 %2$s 為主聊天室的位址。 - %1$s 已移除主聊天室的位址。 + %1$s 為此聊天室新增 %2$s 並移除 %3$s 位址。 + %1$s 將此聊天室的主要位址設定為 %2$s。 + %1$s 已移除聊天室的主要位址。 %1$s 已允許訪客加入聊天室。 %1$s 已禁止訪客加入聊天室。 %1$s 已開啟端對端加密。 @@ -104,7 +104,7 @@ 您已開始語音通話。 %s 傳送資料以設定通話。 您傳送資料以設定通話。 - 您已回覆通話。 + 您已接聽通話。 您已結束通話。 您讓 %1$s 也能看到聊天室未來的歷史紀錄 您已升級此聊天室。 @@ -122,13 +122,13 @@ %1$s 已修改 %2$s 小工具 您已修改 %1$s 小工具 管理員 - 主持人 + 版主 預設 自訂(%1$d) 自訂 您已變更 %1$s 的權限等級。 %1$s 已變更 %2$s 的權限等級。 - %1$s 從 %2$s 到 %3$s + %1$s 的權限等級從 %2$s 調整為 %3$s 您的邀請。理由:%1$s 您已邀請 %1$s。理由:%2$s 您已加入聊天室。理由:%1$s @@ -145,9 +145,9 @@ 您已移除 %1$s 為此聊天室的位址。 - 您已新增 %1$s 並移除 %2$s 為此聊天室的位址。 - 您設定 %1$s 為此聊天室的位址。 - 您已移除主聊天室的位址。 + 您為此聊天室新增 %1$s 並移除 %2$s 位址。 + 您將此聊天室的主要位址設定為 %1$s。 + 您已移除聊天室的主要位址。 您已允許訪客加入聊天室。 您已禁止訪客加入聊天室。 您已開啟端對端加密。 @@ -176,24 +176,24 @@ %1$s 已建立討論 空的聊天室(曾為 %s) - %1$s、 %2$s、 %3$s 與 %4$d 個其他 + %1$s、 %2$s、 %3$s 與另 %4$d 位成員 %1$s、%2$s、 %3$s 與 %4$s %1$s、%2$s 與 %3$s - 🎉 所有伺服器已封鎖參與!此聊天室無法再被使用。 + 🎉 已封鎖所有伺服器參與!無法再使用此聊天室。 無變更。 - • 符合 IP 字段的伺服器現在已封鎖。 - • 符合 IP 字段的伺服器現在已允許。 - • 符合 %s 的伺服器已從允許清單中移除。 - • 符合 %s 的伺服器現在已允許。 - • 符合 %s 的伺服器從封鎖清單中已移除。 - • 符合 %s 的伺服器現在已封鎖。 - 您為此聊天室已變更伺服器存取控制清單。 - %s 為此聊天室已變更伺服器存取控制清單。 - • 符合 IP 字段的伺服器已封鎖。 - • 符合 IP 字段的伺服器已允許。 - • 符合 %s 的伺服器已允許。 - • 符合 %s 的伺服器已封鎖。 + • 現在起將封鎖符合 IP 位置的伺服器。 + • 現在起允許符合 IP 位置的伺服器。 + • 已從允許清單中移除符合 %s 的伺服器。 + • 現在起將允許符合 %s 的伺服器。 + • 已將符合 %s 的伺服器從封鎖清單中移除。 + • 現在起將封鎖符合 %s 的伺服器。 + 您變更了此聊天室的伺服器存取控制清單。 + %s 變更了此聊天室的伺服器存取控制清單。 + • 已封鎖符合 IP 地址的伺服器。 + • 已允許符合 IP 地址的伺服器。 + • 已允許符合 %s 的伺服器。 + • 已封鎖符合 %s 的伺服器。 您為此聊天室設定伺服器存取控制清單。 %s 為此聊天室設定伺服器存取控制清單。 您已變更此聊天室的位址。 @@ -217,7 +217,7 @@ 淺色主題 深色主題 黑色主題 - 聆聽事件 + 正在監聽事件 接受 拒絕 掛斷 @@ -228,7 +228,7 @@ 離開 儲存 載入中… - 發送 + 傳送 分享 查看原始碼 吵雜通知 @@ -268,12 +268,12 @@ 回報錯誤 請描述此錯誤。做了什麼?預期發生什麼?實際發生什麼? 請在這裡描述您的問題 - 為了診斷問題,客戶端的紀錄將會同錯誤回報一起送出。這個包含了紀錄與螢幕截圖的錯誤回報將不會公開可見。如果您只想送出上方的文字,請取消勾選: - 您似乎沮喪的搖晃著手機。您要開啟錯誤回報畫面嗎? + 為了診斷問題,將會隨錯誤回報一起送出客戶端紀錄。這份錯誤回報(包含紀錄檔與螢幕截圖)將不會公開。如果您只想送出上方的文字,請取消勾選: + 您似乎沮喪的搖晃著手機。要開啟錯誤回報畫面嗎? 這個應用程式上次當掉了。您想要開啟錯誤回報畫面嗎? 透過大力搖晃回報錯誤 - 此錯誤回報已成功送出 - 此錯誤回報無法送出(%s) + 已成功送出錯誤回報 + 無法送出此錯誤回報(%s) 進度(%s%%) 加入聊天室 使用者名稱 @@ -282,16 +282,16 @@ 搜尋 開始語音通話 開始視訊通話 - 您確定想要與開始語音通話? - 您確定想要與開始視訊通話? + 您確定要開始語音通話嗎? + 您確定要開始視訊通話嗎? 傳送檔案 拍照或錄影 拍照 錄影 登入 - 遞交 - 不正確的使用者名稱和/或密碼 - 這看起不像是有效的電子郵件地址 + 送出 + 使用者名稱和/或密碼不正確 + 這看起來不是有效的電子郵件地址 此電子郵件地址已經被定義。 忘記密碼? 這個家伺服器想要確認您不是機器人 @@ -305,17 +305,17 @@ 通話 - 通話正在連線… + 接通中… 通話結束 - 視訊通話 - 語音來電 - 通話進行中… - 遠端未能接聽。 + 視訊通話來電 + 語音通話來電 + 通話中… + 對方未接聽電話。 資訊 - ${app_name} 需要權限來存取麥克風,來撥打語音通話。 - ${app_name} 需要權限來存取相機及麥克風來撥打視訊通話。 + ${app_name} 需要麥克風存取權限來撥打語音通話。 + ${app_name} 需要相機及麥克風存取權限來撥打視訊通話。 \n -\n為了可以正常使用通話功能,請在下個彈跳視窗中允許存取。 +\n請在下個彈跳視窗中允許存取,才能正常撥打。 繼續 @@ -353,21 +353,21 @@ 指紋(%s): 無法驗證遠端伺服器的身分。 - %d 會員變動 + %d 個成員狀態變動 這可能表示有人正惡意地攔截您的流量,或是您的手機並不信任由遠端伺服器提供的憑證。 如果伺服器管理員認為這是正常的,請確保底下的指紋與他們所提供的指紋相符。 - 此憑證已經被您手機所信任的人變動。這種情形非常不尋常,建議您不要接受這個新的憑證。 - 傳送一張貼圖 + 憑證已從您手機原先信任的憑證更改為另一張憑證。這種情形非常不尋常,建議您「不要」接受這張新憑證。 + 傳送貼圖 下載 - 發送語音訊息 - 發送貼圖 + 傳送語音訊息 + 傳送貼圖 您目前沒有任何貼圖。 \n \n要現在新增一些貼圖嗎? 對不起,沒有應用程式可以完成此操作。 從其他工作階段重新請求加密金鑰。 - 請在另一個可以解密訊息的裝置上啟動 ${app_name},以便它將金鑰發送到此工作階段。 + 請在另一個可以解密訊息的裝置上啟動 ${app_name},以便它將金鑰傳送到此工作階段。 受信任憑證已被變更為不受信任的憑證。此伺服器可能已更新憑證。請與伺服器管理員聯繫,取得所需的指紋驗證。 僅當伺服器管理員發佈的指紋與上面的指紋相符時才接受此憑證。 搜尋 @@ -392,17 +392,17 @@ 通話邀請 聊天機器人送出的訊息 裝置啓動時自動啓動 - 後臺同步 + 背景同步 同步請求超時 - 延遲同步 + 每次同步的時間間隔 版本 olm 版本 條款與細則 第三方通知 版權 隱私權政策 - 清除暫存檔 - 清除媒體暫存檔 + 清除快取 + 清除媒體快取 保留媒體檔案 使用者設定 通知 @@ -418,14 +418,14 @@ 釘選含有錯過的通知的聊天室 釘選含有未讀訊息的聊天室 內嵌 URL 預覽 - 對所有訊息顯示時間戳 - 用12小時制顯示時間戳 + 對所有訊息顯示時間戳記 + 用 12 小時制顯示時間戳記 提及使用者時震動 停用帳號 停用我的帳號 分析資料 傳送分析資料 - ${app_name} 會收集匿名分析以讓我們改進此應用程式。 + ${app_name} 會收集匿名分析資訊,讓我們可改進此應用程式。 ID 公開名稱 更新公開名稱 @@ -438,9 +438,9 @@ 使用者介面 語言 選擇語言 - 請檢查您的電子郵件並點選其中包含的連結。只要這個完成了,就點選選繼續。 + 請收信並點擊信中的連結。完成後,再點擊「繼續」。 此電子郵件地址已經被使用。 - 這個電話號碼已被使用。 + 此電話號碼已被使用。 變更密碼 目前的密碼 新密碼 @@ -481,12 +481,12 @@ 匯入聊天室金鑰 從本機檔案匯入金鑰 匯入 - 僅加密驗證過的工作階段 - 絕不從此工作階段傳送已加密的訊息到未驗證的工作階段。 + 僅對驗證過的工作階段進行加密 + 絕不從此工作階段傳送加密訊息到未驗證的工作階段。 未驗證 已驗證 驗證 - 透過將以下內容與您的其他工作階段中的使用者設定來確認: + 透過將下列內容與您其他工作階段中的「使用者設定」所顯示的內容來確認: 如果不相符的話,您的通訊安全可能正受到威脅。 選擇一個聊天室目錄 伺服器名稱 @@ -498,8 +498,8 @@ %d 個聊天室 - %1$s 條在 %2$s 中 - 文字大小選擇 + %1$s 則 %2$s 的通知 + 字體大小 微小 一般 @@ -509,15 +509,15 @@ 巨大 您確定要從聊天室刪除小工具嗎? - %d 個活躍的小工具 + %d 個使用中的小工具 無法建立小工具。 - 無法發送請求。 + 無法傳送請求。 權限等級必需為正整數。 您不在此聊天室。 您沒有在這個聊天室做執行此操作的權限。 - 您所要的 room_id 並不存在。 - 請求的 user_id 並存在。 + 請求中缺少 room_id。 + 請求中缺少 user_id。 聊天室 %s 不可見。 缺少必需的參數。 新增 Matrix 應用程式 @@ -528,8 +528,8 @@ 指令出錯 無法辨識的指令:%s 關閉 - 通知並震動 - 已加密訊息 + 吵雜 + 加密訊息 建立 首頁 聊天室 @@ -538,38 +538,38 @@ 您已被 %2$s 從 %1$s 封鎖 理由:%1$s 大頭照 - 如要繼續使用此 %1$s 主伺服器,您必須同意該條款與細則。 + 如要繼續使用此 %1$s 家伺服器,您必須同意該條款與細則。 現在檢視 停用帳號 - 這將使您的帳戶永遠無法使用。您將無法登入, 且沒有人能夠再次以相同的使用者 ID 重新註冊。這將導致您的帳戶離開已登入的所有聊天室,您將從身分伺服器上移除此帳戶的詳細資訊。此操作不可逆。 + 這將使您的帳號永遠無法使用。您將無法再登入,且沒有人能夠再次註冊相同的使用者 ID。這將導致您的帳號離開參與的所有聊天室,並將從身分伺服器上移除此帳號的詳細資訊。此操作無法還原。 \n -\n停用您的帳戶預設不會讓我們移除您發送的訊息。如果您想讓我們移除您的訊息, 請在下面的方框中打勾。 +\n單純停用帳號不會讓我們移除您傳送過的訊息。如果您希望同步刪除您的訊息,請勾選下面的選取盒。 \n -\nMatrix 中的訊息可見度類似電子郵件。我們移除您的訊息,意味著您發送的訊息將不會與任何新的或未註冊的使用者分享,但是已註冊並取得這些訊息的使用者仍然可以訪問他們的副本。 - 請在我的帳號停用時移除我傳送過的所有訊息(警告:這將會造成未來的使用者無法看見完整的對話紀錄) +\nMatrix 中的訊息可見度類似電子郵件。刪除您的訊息只是代表您發送的訊息不會再顯示給任何新的或未註冊的使用者,但是已註冊並曾經取得訊息的使用者,仍然可以存取他們收到的訊息。 + 請在停用我的帳號時刪除我傳送過的所有訊息(警告:未來的使用者將無法看見完整對話紀錄) 停用帳號 請輸入您的密碼。 如果可以,請使用英文撰寫描述。 在傳送前預覽媒體 顯示動作 - 封鎖特定 id 的使用者 - 取消封鎖特定 id 的使用者 + 封鎖特定 ID 的使用者 + 取消封鎖特定 ID 的使用者 定義使用者的權限等級 - 取消指定 id 的使用者的管理權 - 邀請指定 id 的使用者到目前的聊天室 + 取消指定 ID 的使用者的管理權 + 邀請指定 ID 的使用者到目前的聊天室 加入指定位址的聊天室 離開聊天室 設定聊天室主題 - 移除指定 id 的使用者 + 移除指定 ID 的使用者 變更您的顯示暱稱 開啟/關閉 markdown 為了修復 Matrix 應用程式管理 - 這個聊天室已被取代,且不再活躍。 + 這個聊天室已被取代,且不再使用。 對話在此繼續 - 這個聊天示是其他對話的延續 - 點選這裡以檢視更舊的訊息 + 這個聊天室是其他對話的延續 + 點擊這裡以檢視更舊的訊息 - %d 已選取 + 已選擇 %d 個 系統警告 聯絡您的服務管理員 @@ -588,18 +588,18 @@ 收折 從聊天移除 當您的家伺服器支援此功能時在聊天中預覽連結。 - 傳送輸入通知 + 傳送「輸入中」的通知 讓其他使用者知道您正在打字。 Markdown 格式 - 在您傳送之前使用 Markdown 格式化訊息。這讓您可以使用進階的格式化,如使用星號來顯示斜體文字。 + 在您傳送之前使用 Markdown 格式化訊息。此功能讓您可以對訊息使用進階的格式,例如用星號來顯示斜體文字。 顯示讀取回條 - 點選讀取回條以顯示詳細資料。 - 顯示加入與離開的活動 + 點擊讀取回條以顯示詳細資料。 + 顯示人員加入與離開的事件 邀請、移除與封鎖不受影響。 - 顯示帳號活動 + 顯示帳號事件 包含大頭照與顯示名稱變動。 密碼 - 啟動系統相機而非自訂的相機畫面。 + 使用系統相機而非自訂的相機畫面。 指令「%s」需要更多參數,或是有一些參數不正確。 Markdown 已啟用。 Markdown 已停用。 @@ -614,42 +614,42 @@ 疑難排解通知 疑難排解診斷 執行測試 - 正在執行…(%2$d 中的 %1$d) + 正在執行…(共 %2$d 個,第 %1$d 個) 基本診斷正常。如果您仍然沒有收到通知,請遞交錯誤回報以協助我們調查原因。 - 一個或更多的測試失敗,嘗試建議的修復。 + 一個或更多的測試失敗,可以嘗試建議的修正方式。 一個或更多的測試失敗,請遞交錯誤回報以協助我們調查原因。 - 系統設定。 - 通知已在系統設定中啟用。 - 通知已在系統設定中停用。 + 系統設定 + 已在系統設定中開啟通知。 + 系統設定中停用了通知。 \n請檢查系統設定。 開啟設定 - 帳號設定。 - 通知已為您的帳號啟用。 - 通知已為您的帳號停用。 + 帳號設定 + 您的帳號已開啟通知。 + 您的帳號已關閉通知。 \n請檢查帳號設定。 啟用 - 工作階段設定。 + 工作階段設定 此工作階段已啟用通知。 此工作階段未啟用通知。 \n請檢查 ${app_name} 設定。 啟用 - Play 服務檢查 - Google Play 服務 APK 可用且已為最新。 - ${app_name} 使用 Google Play 服務來傳遞推送訊息,但它似乎並未正確設定: + Play Services 檢查 + Google Play Services APK 可用且已為最新版。 + ${app_name} 使用 Google Play Services 來傳遞推送訊息,但它似乎並未正確設定: \n%1$s - 修復 Play 服務 - Firebase 權杖 + 修復 Play Services + Firebase Token 成功擷取 FCM token: \n%1$s - 無法擷取 FCM 權杖 : + 無法擷取 FCM token: \n%1$s 註冊權杖 - FCM 權杖成功註冊至家伺服器。 - 無法將 FCM 權杖註冊至家伺服器: + FCM token 成功註冊至家伺服器。 + 無法將 FCM token 註冊至家伺服器: \n%1$s 開機時啟動 服務將會在裝置重新啟動時自行啟動。 - 服務不會在裝置重心啟動時自行啟動,您將不能在 ${app_name} 開啟前收到通知。 + 服務不會在裝置重開時自行啟動,沒有再次開啟 ${app_name} 前不會收到通知。 啟用開機時啟動 檢查背景限制 背景限制已為 ${app_name} 停用。本測試應該使用行動數據執行(不是 WiFi)。 @@ -660,23 +660,23 @@ 停用限制 電池最佳化 ${app_name} 不會被電池最佳化影響。 - 如果使用者不為裝置充電,並讓其靜置一段時間,且將螢幕關閉,裝置將會進入瞌睡模式。這可能會導致應用程式無法存取網路,並延遲它們的工作、同步與標準警報。 + 如果裝置未充電,並且關閉螢幕後靜置一段時間,將進入瞌睡模式。此模式可能會導致應用程式無法使用網路,導致運作、同步與標準警報延後觸發。 忽略最佳化 - 找不到有效的 Google Play 服務 APK。通知可能無法正常運作。 + 找不到有效的 Google Play Services APK。通知可能無法正常運作。 視訊通話進行中… 金鑰備份 使用金鑰備份 略過 完成 進階通知設定 - 活動通知重要程度 - 自訂設定。 - 注意,某些訊息類型會被設定為靜音(將會生成沒有音效的通知)。 + 事件通知的重要性 + 自訂設定 + 注意:某些類型的訊息通知不會有音效。 有一些通知在您的自訂設定中被停用了。 [%1$s] \n這個錯誤並非 ${app_name} 所能控制,而是與 Google 有關,這個錯誤代表裝置註冊了太多使用 FCM 的應用程式。這個錯誤只會發生在有超大量的應用程式的裝置上,所以不應該影響一般的使用者。 [%1$s] -\n這個錯誤並非 ${app_name} 所能控制。可能由多種原因所導致。也可能會在稍後重試時就可以運作,您也可以檢查 Google Play 服務在系統設定中有沒有被限制使用資料,或是您裝置的時鐘是否正確,或是也可能會在自訂的 ROM 上發生。 +\n這個錯誤並非 ${app_name} 所能控制。可能由多種原因所導致。可能稍後再試一次就可以運作,您也可以在系統設定檢查 Google Play Service 有沒有被限制使用網路連線、您裝置的時間是否正確,或也可能會在自訂的 ROM 上發生。 [%1$s] \n這個錯誤並非 ${app_name} 所能控制。手機上沒有 Google 帳號。請開啟帳號管理員並新增一個 Google 帳號。 新增帳號 @@ -689,42 +689,42 @@ 安靜 請輸入安全密語 安全密語太弱了 - 如果您想要讓 ${app_name} 生成復原金鑰的話,請刪除安全密語。 - 絕不失去已加密訊息 - 已加密聊天室裡的訊息使用端對端加密保護。只有您和接收者有金鑰可以閱讀這些訊息。 + 如果您想要讓 ${app_name} 產生復原金鑰的話,請刪除安全密語。 + 絕不失去加密訊息 + 加密聊天室裡的訊息使用端對端加密保護。只有您和接收者有金鑰可以閱讀這些訊息。 \n -\n安全地備份您的金鑰以避免失去它們。 +\n請安全地備份您的金鑰,避免失去訊息內容。 設定安全密語 完成 儲存復原金鑰 儲存為檔案 請複製金鑰 - 分享復原金鑰與… - 正在使用安全密語生成復原金鑰,這個過程可能需要數秒鐘。 + 使用…分享復原金鑰 + 正在使用安全密語產生復原金鑰,這個過程可能需要數秒鐘。 復原金鑰 未預期的錯誤 您確定嗎? - 如果您登出或遺失您的裝置的話,您可能會失去對您的訊息的存取權。 - 正在擷取… - 使用您的復原安全密語以解鎖您的已加密訊息歷史 + 如果您登出或遺失此裝置的話,可能會失去訊息的存取權。 + 正在取回備份版本… + 使用您的復原安全密語以解鎖加密訊息紀錄 使用您的復原金鑰 - 不知道您的復原安全密語,您可以 %s。 - 使用您的復原金鑰以解鎖您的已加密訊息歷史 + 如果不知道復原安全密語,可以%s。 + 使用您的復原金鑰以解鎖加密訊息紀錄 輸入復原金鑰 - 遺失您的復原金鑰?您可以在設定中設定一個新的。 - 備份可能無法使用此安全密語解密:請驗證您是否輸入正確的復原安全密語。 + 遺失您的復原金鑰?可以到設定中打一把新的金鑰。 + 無法使用此安全密語解密備份:請確認您是否輸入正確的復原安全密語。 正在復原備份: 解鎖歷史紀錄 請輸入復原金鑰 - 備份可能無法使用此復原金鑰解密:請驗證您是否輸入正確的復原金鑰。 + 無法使用此復原金鑰解密備份:請確認您是否輸入正確的復原金鑰。 備份已復原 %s! - 使用 %d 金鑰復原備份。 + 還原了包含 %d 把金鑰的備份。 - %d 新的金鑰已加入到此工作階段。 + 已將 %d 把新金鑰加入到此工作階段。 - 無法取得最新的復原金鑰版本 (%s0。 + 無法取得最新的復原金鑰版本(%s)。 自備份復原 刪除備份 金鑰備份已為此工作階段正確設定。 @@ -736,45 +736,45 @@ 備份有從未驗證的 %s 工作階段而來的有效簽章 備份有從已驗證的 %s 工作階段而來的無效簽章 備份有從未驗證的 %s 工作階段而來的無效簽章 - 請刪除備份… + 正在刪除備份… 刪除備份 - 從伺服器刪除您已備份的加密金鑰?您將無法使用您的復原金鑰來讀取已加密的訊息歷史。 - 如果您現在登出,您將會失去已加密訊息 - 金鑰備份進行中。如果您現在登出,您將失去已加密訊息的存取權。 - 安全金鑰備份應該在您所有的工作階段中啟用,以避免失去已加密訊息的存取權。 - 我不想要我的已加密訊息 + 真的要從伺服器刪除您備份的加密金鑰?您將無法再使用復原金鑰來讀取加密訊息記錄。 + 若您現在登出,將會失去加密訊息 + 正在備份金鑰。若您現在登出,將無法再存取加密訊息。 + 您應該在所有的工作階段中都開啟安全金鑰備份,以避免無法再存取加密訊息。 + 我不想要我的加密訊息 正在備份金鑰… 您確定嗎? 備份 - 除非您在登出前備份您的金鑰,否則您將會失去已加密訊息的存取權。 + 除非您在登出前先備份好加密金鑰,否則將會失去所有加密訊息。 您想要登出嗎? - 已加密訊息復原 + 還原加密訊息 請輸入使用者名稱。 開始使用金鑰備份 (進階) 手動匯出金鑰 以安全密語保護您的備份。 - 我們將會在您的家伺服器儲存一份您已加密的金鑰副本。使用安全密語保護您的備份以確保其安全。 + 我們將會在您的家伺服器儲存一份您的金鑰的加密副本。請使用安全密語保護您的備份以確保其安全。 \n -\n要有最大的安全性,這個應該要與您的帳號密碼不一樣。 +\n為了確保有最大的安全性,這個應該要與您的帳號密碼不一樣。 正在建立備份 或是使用復原金鑰來保障您的備份安全,將其儲存在安全的地方。 (進階)使用復原金鑰設定 成功! - 您的金鑰正在備份。 - 您的復原金鑰是一個安全網,如果您忘記您的安全密語,您可以使用它來復原您對已加密訊息的存取。 + 正在備份您的金鑰。 + 您的復原金鑰是一個安全網,如果您忘記您的安全密語,您可以使用它來復原您對加密訊息的存取權限。 \n請把您的復原金鑰放在非常安全的地方,如密碼管理員(或保險箱) 確保您的復原金鑰放在非常安全的地方,如密碼管理員(或保險箱) - 我已經複製完了 + 我已經備份完了 分享 - 絕不失去已加密訊息 + 絕不失去加密訊息 使用金鑰備份 新安全訊息金鑰 管理金鑰備份 - 正在備份金鑰… + 正在備份金鑰,可能會需要幾分鐘… 所有金鑰都已備份 - 正在備份 %d 金鑰… + 正在備份 %d 把金鑰… 版本 演算法 @@ -784,7 +784,7 @@ 正在下載金鑰… 正在匯出金鑰… 忽略 - 使用單一登入系統登入 + 使用單一登入機制登入 使用 Enter 傳送訊息 軟體鍵盤的 Enter 按鈕將會傳送訊息而非換行 密碼無效 @@ -801,21 +801,21 @@ %d 個通知 - 新活動 + 新事件 聊天室 新訊息 新邀請 ** 無法傳送 - 請開啟聊天室 - 抱歉,使用 Jitsi 建立會議通話在舊裝置上並不支援(Android 系統版本小於 6.0 的裝置) + 很抱歉,不支援在舊版裝置(Android 系統版本小於 6.0)使用 Jitsi 進行會議通話 未知的 IP 有新工作階段正在要求加密金鑰。 \n工作階段名稱:%1$s -\n上次檢視:%2$s +\n上次上線:%2$s \n如果您沒有登入其他工作階段,請忽略本請求。 - 有未驗證的工作階段正在要求加密金鑰。 -\n工作階段名稱:%1$s -\n上次檢視:%2$s + 有未驗證的工作階段正在要求加密金鑰。 +\n工作階段名稱:%1$s +\n上次上線:%2$s \n如果您沒有登入其他工作階段,請忽略本請求。 分享 金鑰分享請求 @@ -826,7 +826,7 @@ %s 想要驗證您的工作階段 未知錯誤 您的家伺服器上已有備份 - 看起來您已經從其他工作階段設定金鑰備份了。您想要用您正在建立的這個來取代它嗎? + 看起來您已經從其他工作階段設定金鑰備份了。想要用您正在建立的這個來取代嗎? 取代 停止 正在檢查備份狀態 @@ -846,9 +846,9 @@ 新增反應 檢視反應 反應 - 使用者刪除的活動 - 聊天室管理員審核的活動 - 活動格式錯誤,無法顯示 + 使用者刪除的事件 + 聊天室管理員刪除的事件 + 事件格式錯誤,無法顯示 建立新聊天室 沒有網路。請檢查您的網路連線。 變更 @@ -865,11 +865,11 @@ 取得金鑰備份資料時發生錯誤 從檔案「%1$s」匯入 e2e 金鑰。 Matrix SDK 版本 - 其他第三方提醒 + 其他第三方程式庫授權資訊 您已在檢視此聊天室了! 一般 偏好設定 - 安全與隱私 + 安全性與隱私權 推送規則 未定義推送規則 沒有已註冊的推送閘道 @@ -882,18 +882,18 @@ 語音與視訊 說明與協助 註冊權杖 - 建議 + 提出建議 請在下面編寫您的建議。 在此描述您的建議 感謝,建議已成功傳送 無法傳送建議(%s) - 在時間軸中顯示隱藏的活動 + 在時間軸中顯示隱藏的事件 私人訊息 正在等待… 正在加密縮圖… - 正在傳送縮圖 (%1$s / %2$s) + 正在傳送縮圖(%1$s / %2$s) 正在加密檔案… - 正在傳送檔案 (%1$s / %2$s) + 正在傳送檔案(%1$s / %2$s) 檔案 %1$s 已下載! (已編輯) 訊息編輯 @@ -905,10 +905,10 @@ 檢視聊天室目錄 名稱或 ID(#example:matrix.org) 啟用滑動以在時間軸上回覆 - 連結已複製到剪貼簿 + 已將連結複製到剪貼簿 整合管理員 正在建立聊天室… - 檢視編輯歷史 + 檢視編輯紀錄 婉拒 要繼續,您必須接受此服務的條款。 服務條款 @@ -919,8 +919,8 @@ 斷線 無法在此 URL 找到家伺服器,請檢查 背景同步模式 - 為電池最佳化 - ${app_name} 將會在背景同步以節省裝置的有限資源(電池)。 + 電力最佳化 + ${app_name} 將會在背景同步以節省裝置的電力資源。 \n取決於您裝置的資源狀態,作業系統可能會延遲同步。 為即時作業最佳化 ${app_name} 將會精準地定期在背景同步(可設定)。 @@ -938,23 +938,23 @@ 您正在使用 %1$s 來探索與被您認識的既有聯絡人探索。 您目前並未使用身分伺服器。要探索與被您認識的聯絡人探索,請在下方設定一個。 可探索的電子郵件地址 - 在您新增電子郵件地址後,探索選項將會出現。 - 在您新增電話號碼後,探索選項將會出現。 + 新增電子郵件地址後,就會出現探索選項。 + 您新增電話號碼後,就會出現探索選項。 與您的身分伺服器斷線代表您無法被其他使用者探索,且您將無法透過電子郵件或電話邀請其他人。 可探索的電話號碼 - 我們已傳送電子郵件到 %s,請檢查您的電子郵件並在確認連結上點選 + 我們已傳送電子郵件到 %s,請收信並點擊確認連結 輸入身分伺服器 URL 無法連線到身分伺服器 請輸入身分伺服器 URL 身分伺服器無服務條款 您選擇的身分伺服器沒有任何服務條款。僅在您信任服務擁有者時才繼續 - 文字訊息已傳送給 %s。請輸入其中包含的驗證碼。 + 已傳送簡訊給 %s。請輸入簡訊中的驗證碼。 您目前正在身分伺服器 %1$s 上分享電子郵件地址或電話號碼。您將必須重新連線到 %2$s 以停止分享它們。 - 同意身分伺服器 (%s) 的服務條款以允許您被透過電子郵件地址或電話號碼探索。 + 同意身分伺服器 (%s) 的服務條款以允許您被透過電子郵件地址或電話號碼探索。 啟用詳細紀錄。 詳細紀錄可以協助開發者在您傳送憤怒搖晃時取得更多紀錄。即使啟用這個設定,應用程式依然不會紀錄訊息內容或任何個人資料。 請在您接受您家伺服器的條款與細則前繼續重試。 - 看起來伺服器回應時間似乎太久了,這可能是不良的網路連線或伺服器錯誤所造成。請稍後再試。 + 看起來伺服器回應時間似乎太久了,可能您的網路連線不穩或伺服器發生錯誤所造成。請稍後再試。 傳送附件 開啟導航選單 開啟建立聊天室選單 @@ -976,7 +976,7 @@ 貼圖 無法處理分享資料 垃圾訊息 - 不合適 + 不合適的訊息 自訂回報… 回報此內容 回報此內容的理由 @@ -1000,7 +1000,7 @@ 允許整合 小工具 載入小工具 - 此小工具新增由: + 此小工具新增者: 使用它可能會設定 cookies 並與 %s 分享資料: 使用它可能會與 %s 分享資料: 無法載入小工具。 @@ -1038,76 +1038,76 @@ %1$s 將聊天室設為邀請才可進入。 未讀訊息 這是您的通訊。您才是所有者。 - 直接或在群組中與夥伴們聊天 + 與夥伴們直接,或在群組中聊天 透過加密讓對話保持隱密 擴展並自訂您的體驗 開始 選取伺服器 就像電子郵件,帳號也有一個家,不過您還是可以跟任何人交談 在最大的公開伺服器上免費加入數百萬人之中 - 組織另有專業主機可用 + 組織級需求,另提供專業代管服務 了解更多 其他 自訂與進階設定 繼續 連線到 %1$s - 連線到 Element Matrix 服務 + 連線到 Element Matrix Services 連線到自訂伺服器 登入到 %1$s 註冊 登入 以 SSO 繼續 - Element Matrix 服務位址 + Element Matrix Services 位址 位址 - 組織有專業主機 + 組織用的收費代管服務 輸入 Modular Element 或您想要使用的伺服器位址 - 載入頁面時發生錯誤:%1$s (%2$d) + 載入頁面時發生錯誤:%1$s(%2$d) 應用程式無法登入此家伺服器。家伺服器支援以下登入類型:%1$s。 \n -\n您想要使用網路客戶端登入嗎? +\n您想要使用網頁客戶端登入嗎? 抱歉,此伺服器不接受新帳號。 應用程式無法在此家伺服器上建立帳號。 \n -\n您想要使用網路客戶端註冊嗎? - 此電子郵件地址與任何帳號無關聯。 +\n您想要使用網頁客戶端註冊嗎? + 此電子郵件地址未關聯到任何帳號。 在 %1$s 上重設密碼 - 驗證郵件已傳送到您的收件匣以確認您要設定新密碼。 + 將傳送確認信到您的信箱,以確定您要設定新密碼。 下一步 電子郵件 新密碼 警告! - 變更您的密碼將會重設您所有工作階段中任何的端對端加密金鑰,讓已加密的聊天歷史無法讀取。請在重設您的密碼前從其他工作階段設定金鑰備份或匯出您的聊天室金鑰。 + 變更您的密碼將會重設您所有工作階段中任何的端對端加密金鑰,讓加密聊天紀錄無法讀取。請在重設您的密碼前從其他工作階段設定金鑰備份或匯出聊天室金鑰。 繼續 - 此電子郵件位址未被連結到任何帳號 + 此電子郵件位址未連結到任何帳號 檢查您的收件匣 驗證電子郵件已傳送至 %1$s。 - 輕點連結以確認您的新密碼。在您使用了其中包含的連結後,請點擊下方。 - 我已經驗證了我的電子郵件地址 + 點擊連結即可確認您的新密碼。完成驗證後,請點擊下方。 + 我已經驗證了電子郵件地址 成功! 您的密碼已被重設。 您已登出所有工作階段,且不會再收到推送通知。要重新啟用通知,請在裝置上再次登入。 返回登入 警告 - 您的密碼未變更。 + 您的密碼尚未變更。 \n -\n停止密碼變更流程? +\n要停止密碼變更流程嗎? 設定電子郵件地址 設定電子郵件地址以復原您的帳號。之後您也可以選擇性地讓您認識的人透過此地址找到您。 電子郵件 - 電子郵件(選擇性) + 電子郵件(選填) 下一個 設定電話號碼 設定電話號碼以讓您認識的人找到您。 請使用國際格式。 電話號碼 - 電話號碼(選擇性) + 電話號碼(選填) 下一個 確認電話號碼 - 我們剛傳送了驗證碼給 %1$s。在下方輸入以驗證是您。 + 我們剛傳送了驗證碼給 %1$s。請在下方輸入以驗證您的號碼。 輸入驗證碼 再次傳送 下一個 - 國際電話號碼必須以加號開頭 + 國際電話號碼必須以「+」開頭 電話號碼似乎無效。請檢查 註冊至 %1$s 使用者名稱或電子郵件 @@ -1119,7 +1119,7 @@ 選取 matrix.org 選取 Element Matrix Services 選取自訂的家伺服器 - 請執行 captcha 挑戰 + 請執行 captcha 驗證 接受條款以繼續 請檢查您的電子郵件 我們剛傳送電子郵件給 %1$s。 @@ -1141,7 +1141,7 @@ 再次登入 您已登出 登入 - 您的家伺服器 (%1$s) 管理員已將您的帳號 %2$s (%3$s) 登出。 + 您的家伺服器(%1$s) 管理員已將您的帳號 %2$s(%3$s) 登出。 登入以復原僅儲存在此裝置上的加密金鑰。您在任何裝置上都需要它們來讀取您所有的安全訊息。 登入 密碼 @@ -1228,10 +1228,10 @@ 使用者 %1$s 中的管理員 %1$s 中的主持人 - 自訂 %2$s 中的 (%1$d) + 自訂 %2$s 中的(%1$d) 跳至讀取回條 ${app_name} 無法處理類型為「%1$s」的事件 - 在渲染 id「%1$s」事件的內容時,${app_name} 遇到問題 + 在渲染 ID「%1$s」事件的內容時,${app_name} 遇到問題 取消忽略 此工作階段無法與您其他的工作階段分享此驗證。 \n驗證將會儲存在本機並在未來版本的應用程式中共享。 @@ -1241,14 +1241,14 @@ 訊息編輯器 啟用端對端加密… 要開啟加密嗎? - 一旦啟用,對聊天室的加密就無法停用。傳送到已加密聊天室的訊息無法被伺服器看見,僅有聊天室的參與者可見。啟用加密可能會讓許多聊天機器人與橋接無法運作。 + 啟用後,就無法再停用對聊天室的加密。伺服器無法解讀傳送到加密聊天室的訊息內容,而僅有聊天室的參與者可見。開啟加密可能會讓許多聊天機器人與橋接無法運作。 啟用加密 要確定安全,請透過一次性的代碼驗證 %s。 要確定安全,請面對面進行或使用其他方式來通訊。 比較獨特的表情符號,並確保它們以相同的順序出現。 以其中一方的畫面上顯示的代碼與其他使用者的畫面比較。 與此使用者的訊息是端對端加密的,無法被第三方讀取。 - 您新的工作階段現在已被驗證。其已存取您已加密的訊息,其他使用者也會看到其已受信任。 + 您新的工作階段現在已被驗證。新階段可存取您的加密訊息,其他使用者也會看到其已受信任。 交叉簽署 交叉簽署已啟用 \n私鑰在裝置上。 @@ -1264,12 +1264,12 @@ 登出此工作階段 無可用的密碼學資訊 因為您已驗證此工作階段,所以其在安全通訊上是可受信任的: - 驗證此工作階段以將其標記為受信任並讓其可以存取已加密訊息。如果您並未登入此工作階段,您的帳號可能已被盜用: + 驗證此工作階段以將其標記為受信任並讓其可以存取加密訊息。如果您並未登入此工作階段,您的帳號可能遭到盜用: %d 活躍的工作階段 驗證此裝置 - 使用已存在的工作階段來驗證這個,讓它可以存取已加密的訊息。 + 使用已存在的使用階段來驗證這個階段,讓此階段可以存取加密訊息。 驗證 已驗證 警告 @@ -1282,7 +1282,7 @@ 直到此使用者信任此工作階段為止,傳送到該工作階段與從它傳送的訊息都會標記為警告。或者您可以手動進行驗證。 初始化交叉簽署 重設金鑰 - QR 碼 + QR Code 就快完成了!%s 有顯示打勾嗎? @@ -1299,23 +1299,23 @@ 使用原始大小傳送圖片 確認移除 - 您確定您想要移除(刪除)此活動嗎?注意,如果您刪除聊天室名稱或主題的變更,變更會被撤銷。 + 您確定要刪除此事件嗎?注意,如果您刪除聊天室名稱或主題的變更事件,該變更將被取消。 包含理由 修改原因 - 被使用者刪除的活動,理由:%1$s - 由聊天室管理員管理的活動,理由:%1$s + 使用者刪除事件,理由:%1$s + 聊天室管理員管理了事件,理由:%1$s 金鑰已為最新! ${app_name} Android 金鑰請求 - 解鎖已加密訊息歷史 + 解鎖加密訊息紀錄 重新整理 新登入。是您嗎? - 使用此工作階段來驗證新的,讓它可以存取已加密訊息。 + 使用此使用階段來驗證新的使用階段,讓新階段可以存取加密訊息。 這不是我 您的帳號可能已被盜用 - 如果您取消,您可能無法在此裝置上讀取已加密的訊息,而其他使用者也不會信任它 - 如果您取消,您可能無法在您新的裝置上讀取已加密的訊息,而其他使用者也不會信任它 - 如果您現在取消,您將無法驗證 %1$s (%2$s)。在他們的使用者檔案中重新開始。 + 如果您取消,可能無法在此裝置上讀取加密訊息,而其他使用者也不會信任此階段 + 如果您取消,可能無法在您的新裝置讀取加密訊息,而其他使用者也不會信任此裝置 + 如果您現在取消,您將無法驗證 %1$s(%2$s)。在他們的使用者檔案中重新開始。 下列其中一項可能已被盜用: \n \n- 您的密碼 @@ -1336,15 +1336,15 @@ 把它放在安全的地方 完成 正在發佈已建立的識別金鑰 - 正在從安全密語生成安全金鑰 + 從安全密語產生安全金鑰 正在定義 SSSS 預設金鑰 正在同步主金鑰 正在同步使用者金鑰 正在同步自行簽署金鑰 設定金鑰備份 - 您的 %2$s 與 %1$s 現在設定好了。 + 您的 %2$s 與 %1$s 設定好了。 \n -\n請確保它們的安全!如果您失去所有活躍的工作階段,您將會需要它們來解鎖已加密訊息並保護資訊。 +\n請把它們保管好!如果您失去所有使用中的工作階段,將會需要使用它們來解鎖加密訊息與安全資訊。 列印並將其存放在安全的地方 將其儲存在 USB 隨身碟或備份磁碟上 將其複製到您的私人雲端儲存空間 @@ -1359,7 +1359,7 @@ 無法匯入金鑰 通知設定 訊息包含 @room - 在一對一的聊天中已加密的訊息 + 一對一聊天中的加密訊息 群組聊天中的加密訊息 當聊天室升級時 疑難排解 @@ -1367,17 +1367,17 @@ 不正確的使用者名稱及/或密碼。輸入的密碼以空格開頭或結尾,請檢查。 訊息… 提供加密升級 - 驗證您自己與其他人以保證聊天安全 + 驗證您自己與其他人以確保聊天安全 輸入您的 %s 以繼續 使用檔案 這不是有效的復原金鑰 請輸入復原金鑰 正在檢查備份金鑰 - 正在檢查備份金鑰 (%s) + 正在檢查備份金鑰 (%s) 正在取得曲線金鑰 - 正在從安全密語生成 SSSS 金鑰 - 正在從安全密語生成 SSSS 金鑰 (%s) - 正在從復原金鑰生成 SSSS 金鑰 + 從安全密語產生 SSSS 金鑰 + 從安全密語產生 SSSS 金鑰(%s) + 從復原金鑰產生 SSSS 金鑰 正在 SSSS 中儲存金鑰備份的秘密 輸入您的金鑰備份安全密語以繼續。 使用您的金鑰備份復原金鑰 @@ -1386,15 +1386,15 @@ 避免對應用程式進行螢幕截圖 啟用此設定會新增 FLAG_SECURE 到所有活動。重新啟動應用程式以讓變動生效。 設定新的帳號密碼… - 在您的其他裝置上使用最新的 ${app_name}、${app_name} 網頁版、${app_name} 桌面版、${app_name} iOS、${app_name} 安卓版或其他有交叉簽署功能的 Matrix 客戶端 + 在您的其他裝置上使用最新的 ${app_name}、${app_name} 網頁版、${app_name} 桌面版、${app_name} iOS、${app_name} for Android 或其他有交叉簽署功能的 Matrix 客戶端 ${app_name} 網頁版 \n${app_name} 桌面版 ${app_name} iOS \n${app_name} Android 或其他有交叉簽署功能的 Matrix 客戶端 在您的其他裝置上使用最新的 ${app_name}: - 強制丟棄目前在已加密聊天室中的外發群組工作階段 - 僅在已加密聊天室中支援 + 強制丟棄目前在加密聊天室中的外發群組工作階段 + 僅在加密聊天室中支援 使用您的 %1$s 或使用您的 %2$s 以繼續。 使用復原金鑰 選取您的復原金鑰,或是透過打字或從您的剪貼簿貼上來手動輸入 @@ -1402,7 +1402,7 @@ 透過文字手動驗證 驗證登入 透過表情符號來進行互動驗證 - 從您的其他工作階段驗證此登入以確認您的身分,並授予存取已加密訊息的權限。 + 從您的其他工作階段驗證此登入以確認您的身分,並授予存取加密訊息的權限。 請選擇使用者名稱。 請選擇密碼。 請再次檢查此連結 @@ -1428,12 +1428,12 @@ 訊息已移除 顯示已移除的訊息 為已移除的訊息顯示佔位符 - 我們已傳送電子郵件到 %s,請先檢查您的電子郵件並點擊確認連結 - 驗證代碼不正確。 + 我們已傳送電子郵件到 %s,請先收信並點擊確認連結 + 驗證碼不正確。 媒體 此聊天室中沒有媒體 檔案 - %1$s 在 %2$s + 由 %1$s 於 %2$s 上傳 此聊天室中沒有檔案 使用我的 Matrix 識別符登入 登入 @@ -1454,7 +1454,7 @@ 為了保護您的隱私,${app_name} 僅支援傳送雜湊過的使用者電子郵件地址與電話號碼。 已無法關聯。 目前沒有此識別符的關聯。 - 您的家伺服器 (%1$s) 建議將 %2$s 用於您的身分伺服器 + 您的家伺服器(%1$s) 建議將 %2$s 用於您的身分伺服器 使用 %1$s 或者您可以輸入任何身分伺服器 URL 輸入身分伺服器 URL @@ -1464,7 +1464,7 @@ 複製 成功 通知 - 無法 ${app_name} 呼叫 + ${app_name} 呼叫失敗 無法建立即時連線。 \n請要求您家伺服器的管理員設定 TURN 伺服器以讓通話的運作更可靠。 選取音效裝置 @@ -1477,23 +1477,23 @@ 關閉 HD 開啟 HD - SSL 錯誤:對方的身分未驗證。 + SSL 錯誤:無法驗證對方的身分。 SSL 錯誤。 取消邀請 將您自己降級? - 您將無法復原此變更,因為您要把自己降級,如果您是聊天室中最後一個有此權限的使用者,那將無法重新取得權限。 + 因為您要把自己降級,將無法復原此變更。如果您是聊天室中最後一個有此權限的使用者,那將無法重新取得權限。 降級 忽略使用者 - 忽略此使用者將會從您分享的聊天室移除他們的訊息。 + 忽略此使用者後,將會從你們共同的聊天室中隱藏他的訊息。 \n -\n您隨時都可以在一般設定中撤銷此動作。 +\n您隨時都可以在一般設定中還原此動作。 取消忽略使用者 取消忽略此使用者將再次顯示從他們而來的所有訊息。 取消邀請 - 您確定您想要取消對此使用者的邀請嗎? + 您確定要取消對此使用者的邀請嗎? 移除使用者 移除的理由 - 使用者將會從此聊天空間中被移除。 + 使用者將會從此聊天室中被移除。 \n \n為了防止他們再加入,您應該封鎖他們。 封鎖使用者 @@ -1505,8 +1505,8 @@ 重設安全備份 在此裝置上設定 透過備份加密金鑰到您的伺服器上,以防止失去存取已加密訊息與資料。 - 為您現有的備份生成新的安全金鑰或設定新的安全密語。 - 這將會取代您目前的金鑰或密語。 + 為您現有的備份產生新的安全金鑰或設定新的安全密語。 + 將會取代您目前的金鑰或密語。 整合被停用 在設定中啟用「允許整合」以執行此動作。 @@ -1514,10 +1514,10 @@ 金鑰已成功匯出 檢視 - 活躍的小工具 + 使用中的小工具 復原金鑰已儲存。 安全備份 - 小心不要失去已加密訊息與資料的存取權 + 小心不要失去加密訊息與資料的存取權 設定安全備份 新增專用的未讀通知分頁到主畫面。 新增到我的最愛 @@ -1530,11 +1530,11 @@ 貼圖 管理動作 在 %1$s 中的預設 - 您的伺服器管理員已在私人聊天室與私人訊息中預設停用端到端加密。 + 您的伺服器管理員已在私人聊天室與私人訊息中預設停用端對端加密。 輸入只有您知道的安全密語,用於保護您伺服器上的安全祕密。 - 如果您現在取消,您可能會失去存取已加密訊息與資料,如果您失去存取您的登入。 + 如果您現在取消,當您忘記登入資訊的話,可能會失去存取加密訊息與資料。 \n -\n您也可以在設定中設定安全備份與管理您的金鑰。 +\n您也可以在「設定」中設定安全備份並管理您的金鑰。 您建立並設定了聊天室。 此帳號已被停用。 無法儲存媒體檔案 @@ -1549,9 +1549,9 @@ 確保您能存取加密訊息與資料,請在您的伺服器上備份您的金鑰。 設定 使用安全金鑰 - 生成安全金鑰並儲存在安全的地方,如密碼管理員或保險櫃。 + 產生安全金鑰並儲存在安全的地方,如密碼管理員或保險櫃。 使用安全密語 - 輸入只有您知道的密語,並生成金鑰備份。 + 輸入只有您知道的密語,並產生金鑰備份。 儲存您的安全金鑰 將您的安全金鑰儲存在安全的地方,如密碼管理員或保險櫃。 設定安全密語 @@ -1567,7 +1567,7 @@ 您無法存取此訊息,因為您被傳送者封鎖 您無法存取此訊息,因為您的工作階段未被傳送者所信任 您無法存取此訊息,因為傳送者刻意未傳送金鑰 - 正在等待加密歷史 + 正在等待加密紀錄 Riot 現在是 Element 了! 我們很高興地我們已變更名稱!您的應用程式是最新的,而您也登入了您的帳號。 了解 @@ -1592,26 +1592,26 @@ 要重設您的 PIN 碼,您將需要重新登入並建立新的。 啟用 PIN 碼 如果您想要重設您的 PIN 碼,點擊忘記 PIN 碼以登出並重設。 - 避免意外的通話 + 避免不小心撥出通話 開始通話前要求確認 您沒有在此聊天室中開始會議通話的權限 開始視訊會議 開始語音會議 - 會議使用 Jitsi 安全與權限策略。目前在聊天室中的所有人,在您會議開始時都會看到加入的邀請。 + 會議使用 Jitsi 安全與權限策略。目前在聊天室中的所有人,在會議開始時都會看到加入邀請。 您無法與自己通話 您無法與自己進行通話,請等候參與者接受邀請 無法新增小工具 無法移除小工具 - %1$d/%2$d 金鑰匯入成功。 + 成功匯入 %1$d 把金鑰,共 %2$d 把。 管理整合 - 非活躍中的小工具 + 非使用中的小工具 已建立聊天室,但因為以下理由而未傳送某些邀請: \n \n%s - %1$s, %2$s 與 %3$d 個其他人已讀取 + %1$s、%2$s 與另 %3$d 個人已讀取 錯誤的代碼,還可以嘗試 %d 次 @@ -1628,8 +1628,8 @@ 電子郵件與電話號碼 管理連結到您 Matrix 帳號的電子郵件地址與電話號碼 代碼 - 請使用國際格式(電話號碼必須以 \'+\' 開頭) - 驗證此登入來確認您的身分,以及授予存取已加密訊息的權限。 + 請使用國際格式(以「+」開頭的電話號碼) + 驗證此登入來確認您的身分,以及授予存取加密訊息的權限。 無法開啟封鎖您的聊天室。 找不到此聊天室。請確定它存在。 @@ -1657,7 +1657,7 @@ 顯示您現在可以驗證的 %d 個裝置 - 重新啟動後,歷史紀錄、訊息、已信任的裝置或已信任的使用者將會被清空 + 重新啟動後,將清空所有聊天紀錄、訊息、已信任的裝置或已信任的使用者 如果您重設了所有東西 僅在您沒有其他裝置可以驗證此裝置時才使用這個。 恢復所有設定 @@ -1671,10 +1671,10 @@ \n \n您的訊息已被鎖保護,只有您與收件者有獨特的金鑰可以解鎖。 這裡的訊息沒有端對端加密。 - 此家伺服器正在執行較舊的版本。請要求您的家伺服器管理原升級。您可以繼續,但某些功能可能無法正常運作。 + 此家伺服器執行的是舊版伺服器。請要求您的家伺服器管理員升級。您可以繼續,但某些功能可能無法正常運作。 您讓此變為邀請制。 %1$s 讓此變為邀請制。 - 在已加密的聊天室顯示完整歷史紀錄 + 在加密聊天室顯示完整歷史紀錄 %1$s 與 %2$s %1$s 在 %2$s 與 %3$s @@ -1702,14 +1702,14 @@ 新增圖片從 聊天室設定 主題 - 聊天室主題(選擇性) + 聊天室主題(選填) 聊天室名稱 匯出審核 私人訊息 - 傳送金鑰共享請求歷史 + 傳送金鑰共享請求紀錄 沒有更多結果 - 未掃描 QR 碼! - 無效的 QR 碼(無效的 URI)! + 未掃描 QR Code! + 無效的 QR Code(無效的 URI)! 無法對您自己直接訊息! 透過文字分享 在 Matrix 上搜尋聯絡人 @@ -1718,8 +1718,8 @@ 與夥伴們分享此邀請碼,這樣他們就可以掃描它來加入您並開始聊天。 我的邀請碼 分享我的邀請碼 - 掃描 QR 碼 - 不是有效的 Matrix QR 碼 + 掃描 QR Code + 不是有效的 Matrix QR Code 🔐️ 在 ${app_name} 上加入我 嗨,和我在 ${app_name} 上聊天吧:%s 邀請朋友 @@ -1739,31 +1739,31 @@ 封鎖任何不是 %s 一部分的人加入此聊天室 隱藏進階 顯示進階 - %2$d 中的 %1$d + 第 %1$d 個,共 %2$d 個 給予同意 撤銷我的同意 您已同意傳送電子郵件地址與電話號碼到此身分提供者,以從您的聯絡人中探索其他使用者。 傳送電子郵件或電話號碼 建議 已知的使用者 - QR 碼 - 透過 QR 碼新增 + QR Code + 透過 QR Code 新增 允許存取您聯絡人的權限。 - 要掃描 QR 碼,您必須允許存取相機。 + 要掃描 QR Code,您必須允許存取相機。 開始聊天 變更您目前的 PIN 變更 PIN 無法預覽此聊天室。您想要加入嗎? 目前無法存取此聊天室。 \n請稍後再試,或是詢問聊天室管理員來檢查您是否可以存取。 - 無法擷取目前的聊天室目錄可見度 (%1$s)。 + 無法擷取目前的聊天室目錄可見度(%1$s)。 將此聊天室在 %1$s 的聊天室目錄中公開發佈? 取消發佈此位址 發佈此位址 - 新增本機位址 - 此聊天室沒有本機位址 - 設定此聊天室的位址,這樣使用者就可以透過您的家伺服器 (%1$s) 搜尋此聊天室 - 本機位址 + 新增本地位址 + 此聊天室沒有本地位址 + 設定此聊天室的位址,這樣使用者就可以透過您的家伺服器(%1$s)搜尋此聊天室 + 本地位址 新發佈的位址(例如:#alias:server) 尚無其他已發佈的位址。 尚無其他已發佈的位址,在下面新增一個。 @@ -1778,7 +1778,7 @@ 檢視並管理此聊天室的位址,以及其在聊天室目錄中的可見性。 聊天室位址 聊天室存取權 - 對可讀取歷史紀錄的人的變更,將僅試用於此聊天室中的未來訊息。現有歷史紀錄的可見性將保持不便。 + 對可閱讀歷史訊息的人員的變更,將僅適用於此聊天室的新訊息。現有訊息的可見性將保持不變。 取消發佈 新增 傳送下雪特效 ❄️ @@ -1789,13 +1789,13 @@ 單一登入 使用 %s 登入 使用 %s 註冊 - 繼續 %s + 使用 %s 繼續 使用 /confetti 指令或傳送包含 ❄️ 或 🎉 的訊息 顯示聊天效果 變更主題 升級聊天室 - 傳送 m.room.server_acl 活動 + 傳送 m.room.server_acl 事件 變更權限 變更聊天室名稱 變更歷史紀錄可見性 @@ -1816,7 +1816,7 @@ 權限 檢視並更新聊天室各部份所需的角色。 聊天室權限 - 此聊天室不公開。沒有邀請,您將無法重新加入。 + 此聊天室不公開。需要再次受邀才能重新加入。 系統預設 在訊息編輯器上新增按鈕以開啟表情符號鍵盤 顯示表情符號鍵盤 @@ -1830,7 +1830,7 @@ 轉接 連線 先諮詢 - 通話中 (%1$s) + 通話中(%1$s) 查詢電話號碼時發生錯誤 撥號鍵盤 回撥 @@ -1840,20 +1840,20 @@ %s 保留了通話 保留 繼續 - 活動內容 - 狀態活動已傳送! - 活動已傳送! - 活動格式錯誤 + 事件內容 + 已傳送狀態事件! + 已傳送事件! + 格式錯誤的事件 訊息內容遺失 無內容 - 活動內容 + 事件內容 狀態金鑰 類型 - 傳送自訂狀態活動 + 傳送自訂狀態事件 編輯內容 - 狀態活動 - 傳送狀態活動 - 傳送自訂活動 + 狀態事件 + 傳送狀態事件 + 傳送自訂事件 探索聊天室狀態 開發工具 檢視讀取回條 @@ -1886,7 +1886,7 @@ 伺服器版本 伺服器名稱 聊天室設定 - 離開目前的會議並切換其他的? + 離開目前的會議並切換到另一場會議? 聊天室版本 新值 切換 @@ -1959,18 +1959,18 @@ 您的私人聊天空間 您公開的聊天空間 新增聊天空間 - 離開有指定 id 的聊天室(如果是 null 的話則為目前聊天室) - 使用特定的 id 加入聊天空間 + 離開有指定 ID 的聊天室(如果是 null 的話則為目前聊天室) + 使用特定的 ID 加入聊天空間 建立聊天空間 未檢查 搜尋名稱 - 此聊天空間與聊天室中的任何人都可以找到並加入。但只有此聊天室的管理員可以將其新增到聊天空間中。 + 包含此聊天室的聊天空間中的任何人都可以找到並加入此聊天室。但只有聊天室管理員可以將其新增到聊天空間中。 僅限限聊天空間成員 任何人都可以尋找聊天室並加入 公開 僅被邀請的夥伴可以尋找並加入 私人 - 未知的存取設定 (%s) + 存取設定未知(%s) 任何人都可以要求加入聊天室,成員可以接受或拒絕 允許訪客加入 聊天空間 @@ -2005,10 +2005,10 @@ 您是這裡唯一的人。如果您離開,包含您在內的所有人都將無法加入。 邀請至 %s 給予回饋 - 無法傳送回饋 (%s) + 無法傳送回饋(%s) 謝謝,您的回饋已成功傳送 如果您有任何後續的問題,歡迎聯絡我 - 您正在使用聊天空間的測試版本。您的回饋有助於改善未來的版本。我們將會紀錄您的平台與使用者名稱以協助我們使用您的回饋。 + 您正在使用聊天空間的 Beta 測試版本。您的回饋有助於改善未來的版本。我們將會紀錄您的平台與使用者名稱以協助我們使用您的回饋。 回饋 聊天空間回饋 抱歉,嘗試加入會議時發生錯誤 @@ -2050,18 +2050,18 @@ 使用您的其他裝置掃描條碼或切換並使用此裝置掃描 家伺服器 API URL 缺少權限 - 要執行此動作,請從系統設定中授予「相機」權限。 - 缺少執行此動作的部份權限,請從系統設定中授予權限。 + 要執行此動作,請至系統設定授予「相機」權限。 + 缺少執行此動作的部份權限,請至系統設定授予權限。 - %d 通未接聽視訊通話 + %d 通未接視訊通話 - %d 通未接聽通話 + %d 通未接來電 請注意,升級會讓聊天室變為新的版本。目前的所有訊息都將保留在此被封存的聊天室中。 母聊天空間中的任何人都可以找到並加入此聊天室,不需要手動邀請所有人。您隨時都可以在聊天室設定中變更此設定。 任何在 %s 中的人都可以找到並加入此聊天室,不需要手動邀請所有人。您隨時都可以在聊天室設定中變更此設定。 - 語音訊息 (%1$s) + 語音訊息(%1$s) 語音訊息活躍時無法回覆或編輯 無法錄製語音訊息 無法播放此語音訊息 @@ -2090,15 +2090,15 @@ 聊天室升級 來自聊天機器人的訊息 聊天室邀請 - 已加密的群組訊息 + 加密的群組訊息 群組訊息 - 已加密的私人訊息 + 加密的私人訊息 私人訊息 我的使用者名稱 我的顯示名稱 通知我 其他 - 提及與關鍵字 + 僅有被提及與出現關鍵字時 預設通知 設定中的 %s 可直接在 ${app_name} 中接收邀請。 將此電子郵件地址與您的帳號連結 @@ -2108,7 +2108,7 @@ 顯示 Home 中的所有聊天室 滑動結束通話 %1$s 點擊返回 - 進行中的通話 (%1$s)。 + 進行中的通話(%1$s)。 %1$d 活躍的通話。 @@ -2126,30 +2126,30 @@ 您回絕了此通話 帳號設定 您可以管理 %1$s 中的通知。 - 請注意,行動裝置上已加密聊天室並不提供被提及與關鍵字通知。 + 請注意,行動裝置上的加密聊天室不提供被提及與關鍵字通知。 通知我 您將不會在手機上收到加密聊天室中被提及或關鍵字的通知。 關鍵字 \@room 關鍵字不能包含「%s」 - 關鍵字不能以 \'.\' 開頭 - 新增新的關鍵字 + 關鍵字不能以「.」開頭 + 新增關鍵字 您的關鍵字 - 僅提及與關鍵字 + 僅有被提及與出現關鍵字時 結束通話… - 無回應 - 您要通話的使用者忙碌中。 - 使用者忙碌 - 使用 %s 音訊通話 - 使用 %s 視訊通話 + 未接聽 + 您要通話的使用者忙線中。 + 使用者忙線中 + 與 %s 進行語音通話 + 與 %s 進行視訊通話 通話響鈴中… 聊天空間 新增聊天空間至您管理的任何聊天空間。 新增既有的聊天空間 新增既有的聊天室 您確定您想要離開 %s? - 探索 (%s) + 探索 (%s) 結束設定 透過電子郵件邀請、尋找聯絡人以及更多… 完成探索設定。 @@ -2202,7 +2202,7 @@ 線上 選擇家伺服器 無法存取 URL %s 的家伺服器。請檢查您的連結或手動選擇家伺服器。 - 聆聽通知 + 正在監聽通知 需要至少 %1$s 選項 @@ -2247,7 +2247,7 @@ 取得關於使用 ${app_name} 的說明 說明與支援 說明 - 法律 + 法律資訊 此伺服器並未提供任何政策。 第三方函式庫 您的身分伺服器政策 @@ -2257,9 +2257,9 @@ 我們不會與第三方分享資訊 我們不會記錄或分析任何帳號資料 這裡 - 透過分享匿名使用資料協助我們找出問題並改善 ${app_name}。為了解人們如何使用多裝置,我們將會產生隨機識別字串,在您的裝置間共享。 + 透過分享匿名使用資料協助我們找出問題並改善 ${app_name}。為了解人們如何使用多台裝置,我們將會產生隨機識別字串,在您的裝置間共享。 \n -\n您可以閱讀我們的條款 %s。 +\n您可以在 %s 閱讀我們的服務條款。 協助改善 ${app_name} 啟用 重新啟動應用程式以讓變更生效。 @@ -2274,7 +2274,7 @@ 發生無法解密錯誤時,您的系統將會自動傳送紀錄檔 自動回報解密錯誤。 覆寫顯示名稱色彩 - 我已有一個帳號 + 我已有帳號 安全傳送訊息。 您已掌控了您的資料。 擁有您的對話。 @@ -2321,20 +2321,20 @@ 您已經在檢視此討論串了! 在聊天室中檢視 在討論串中回覆 - 可識別指令「%s」,但在「討論串」中不支援。 + 可識別指令「%s」,但討論串中不支援此指令。 來自討論串 秘訣:長按訊息並使用「%s」。 - 「討論串」可以協助您的對話不離題且易於追蹤。 - 使用「討論串」來讓討論保持有條不紊 - 顯示您參與的所有「討論串」 - 我的「討論串」 - 從目前的聊天室顯示所有「討論串」 - 所有「討論串」 + 「討論串」功能可以協助您的對話不離題且易於追蹤。 + 使用「討論串」功能,讓討論保持有條不紊 + 顯示您參與的所有討論串 + 我的討論串 + 顯示目前聊天室的所有討論串 + 所有討論串 過濾 - 「討論串」 + 討論串 討論串 - 過濾聊天室中的「討論串」 - 複製連結至討論串 + 過濾聊天室中的討論串 + 複製討論串連結 在聊天室中檢視 檢視討論串 聊天室通知 @@ -2345,7 +2345,7 @@ 顯示較少 - %d 伺服器存取控制清單變更 + 改變了伺服器 %d 的存取控制清單 %1$s 與 %2$s %1$s、%2$s 與其他人 @@ -2359,12 +2359,12 @@ 分享我目前的位置 縮放至目前位置 地圖上選定位置的圖釘 - 我們即將要將釋出「討論串」的公開測試版本。 + 「討論串」功能的公開 Beta 測試版即將推出。 \n -\n正當我們為此做準備時,我們需要做出一些變動:先前建立的討論串將會顯示為一般回覆。 +\n正當我們為此做準備時,需要做一些變動:先前建立的討論串將會顯示為一般回覆。 \n -\n這會是單次的過渡做法,因為「討論串」現在已經是 Matrix 規範中的一部分了。 - 「討論串」快要有測試版了 🎉 +\n這只會發生一次,因為「討論串」功能現在已經進入 Matrix 規格了。 + 「討論串」快要有 Beta 測試版了 🎉 正在進行位置分享 ${app_name} 即時位置 家伺服器不接受僅有數字的使用者名稱。 @@ -2380,8 +2380,8 @@ 選擇顯示名稱 您的帳號 %s 已建立 恭喜! - 帶我回首頁 - 個人化檔案 + 帶我回家 + 個人化簡介檔案 停用 正在載入即時位置… 8小時 @@ -2389,7 +2389,7 @@ 15分鐘 分享您的即時位置 (%1$s) - %1$s (%2$s) + %1$s(%2$s) 無法播放 %1$s 暫停 %1$s 播放 %1$s @@ -2397,18 +2397,18 @@ %1$s, %2$s, %3$s 分享了他們的即時位置 ${app_name} 也非常適合工作場所。其受到世界上最安全的組織信任。 - 測試版 + Beta 測試版 「討論串」是一項正在進行中的工作,包含了即將推出令人興奮的新功能(例如改善後的通知)。我們想要聽到您的回饋! - 「討論串」測試版回饋 + 「討論串」功能 Beta 測試回饋 給予回饋 - 測試版 + BETA 測試版 若啟用,即使在使用應用程式時,您也會對其他使用者顯示為離線狀態。 離線模式 出席 - 您的家伺服器目前不支援討論串,所以此功能可能並不可靠。部份已進入「討論串」的訊息,可能無法可靠地使用。%s 您仍想啟用討論串功能嗎? - 「討論串」測試版 - 「討論串」有助於讓您的對話不離題且易於追蹤。%s 啟用討論串將會重新整理應用程式。對於特定帳號可能需要較多的時間。 - 「討論串」測試版 + 您的家伺服器目前不支援討論串,所以此功能可能並不可靠。部份已進入討論串的訊息,可能無法可靠地使用。%s 您仍想啟用討論串功能嗎? + 「討論串」Beta 測試版 + 「討論串」功能有助於讓您的對話不離題且易於追蹤。%s 啟用討論串將會重新整理應用程式。對於特定帳號可能需要較多的時間。 + 討論串 Beta 測試版 取得更多資訊 試試看 正在分享畫面 @@ -2416,17 +2416,17 @@ 停止分享畫面 分享畫面 - 有些使用者已被取消忽略 - ${app_name} 需要執行清除快取以保持最新狀態,原因如下: + ${app_name} 需要清除快取以保持最新狀態,原因如下: \n%s \n -\n注意,此動作將會重新啟動應用程式,並可能需要一些時間。 +\n注意:此動作會重新啟動應用程式,可能需要一些時間。 初始同步請求 顯示所有訊息的最新個人檔案資訊(大頭照與顯示名稱)。 顯示最新的使用者資訊 忙碌 備份具有來自該使用者的有效簽章。 %1$s 前已更新 - 暫時的建置:位置會保留在聊天室歷史紀錄中 + 暫時實作:保留位置資訊在聊天紀錄中 啟用即時位置分享 剩餘 %1$s 即時分享至 %1$s @@ -2443,7 +2443,7 @@ 小時 啟用位置分享 - 請注意:這是使用暫時建置的實驗室功能。這代表了您將無法刪除您的位置歷史紀錄,即使您停止與此聊天室分享您的即時位置,進階使用者也還是能看到您的位置歷史紀錄。 + 請注意:這是使用暫時實作的實驗性功能。這代表您將無法刪除您的位置紀錄,即使您停止與此聊天室分享您的即時位置,進階使用者也還是能看到您的位置紀錄。 即時位置分享 目前閘道:%s 閘道 @@ -2472,7 +2472,7 @@ 端點註冊 下一步 結果將在投票結束時可見 - 在分享歷史的已加密聊天室中邀請時,已加密歷史會是可見的。 + 邀請成員進入分享聊天紀錄的加密聊天室時,加密紀錄會是可見的。 MSC3061:為過去的訊息分享聊天室金鑰 傳送您的第一則訊息以邀請 %s 來聊天 此聊天中的訊息將會是端對端加密。 @@ -2498,11 +2498,11 @@ 確認您的電話號碼 登出所有裝置 重設密碼 - 確認其為 8 個字元或更多。 + 確認長度需有 8 個字元以上。 選擇新密碼 新密碼 - 檢查您的電子郵件。 - %s 將會傳送給您驗證連結 + 請到您的電子郵件信箱收信。 + %s 將會傳送驗證連結給您 驗證碼 電話號碼 %s 必須驗證您的帳號 @@ -2513,7 +2513,7 @@ 請仔細閱讀 %s 的條款與政策 伺服器政策 保持聯絡 - Element Matrix Services(EMS)是一個強大且可靠的主機託管服務,可實現快速、安全且即時的通訊。可在 element.io/ems 上了解如何使用 + Element Matrix Services(EMS)是一套強大且可靠的代管服務,可進行快速、安全且即時的通訊。可到 element.io/ems 了解如何使用 想要架設自己的伺服器? 伺服器 URL 您的伺服器位址是什麼?這就像您所有資料的家 @@ -2523,7 +2523,7 @@ 您的對話將在哪裡進行 必須是 8 個以上字元長 - 其他人可以找到您 %s + 其他人可以透過 %s 找到您 建立您的帳號 使用系統預設值 手動選擇 @@ -2532,17 +2532,17 @@ 自動批准 Element Call 小工具並授予相機/麥克風存取權限 啟用 Element Call 權限捷徑 即時位置 - 這個 QR 碼的格式似乎不正確。請嘗試使用其他方法進行驗證。 - 您將無法存取已加密的訊息歷史紀錄。重設您的安全訊息備份與驗證金鑰以重新開始。 + 這個 QR Code 格式似乎不正確。請使用其他方法進行驗證。 + 您將無法存取加密訊息紀錄。重設您的安全訊息備份與驗證金鑰以重新開始。 無法驗證此裝置 您的伺服器位址是? 您的對話要在哪裡進行 正在更新您的資料… - %1$s 與 %2$d 個其他人 + %1$s 與其他 %2$d 位人員 %1$s 與 %2$s - 電子郵件未驗證,請檢查您的收件匣 + 電子郵件未驗證,請到您的信箱收信驗證 無法載入地圖 \n此家伺服器可能未設定好顯示地圖。 開啟設定 @@ -2648,8 +2648,8 @@ 驗證您目前的工作階段以強化安全通訊。 此工作階段已準備好安全通訊。 您目前的工作階段已準備好安全通訊。 - 僅在第一則訊息上建立直接訊息 - 啟用延期直接訊息 + 僅在第一則訊息上建立私人訊息 + 啟用延期的私人訊息 包含選擇性分頁的簡潔 Element 啟用新佈局 您加入的直接消息與聊天室中的其他使用者,可以檢視您的工作階段的完整清單。 @@ -2672,15 +2672,15 @@ 登出此工作階段 未驗證 · 您目前的工作階段 開始語音廣播 - 此裝置無法保證此已加密訊息的真實性。 - 要求鍵盤不要根據您在對話中輸入的內容更新任何個人化資料(如輸入歷史紀錄與字典等)。請注意,某些鍵盤可能不會遵守此設定。 + 此裝置無法保證此加密訊息的真實性。 + 要求鍵盤不要根據您在對話中輸入的內容更新任何個人化資料(如輸入紀錄與字典等)。請注意,某些鍵盤可能不會遵守此設定。 無痕式鍵盤 將 (╯°□°)╯︵ ┻━┻ 放到純文字訊息之前 語音廣播 開啟開發者工具畫面 - 🔒 您已在「安全」設定中為所有聊天室啟用加密驗證工作階段。 + 🔒 您已在「安全性設定」中為所有聊天室啟用僅傳送加密訊息至已驗證的工作階段。 ⚠ 此聊天室中有未驗證的裝置,它們將無法解密您傳送的訊息。 - 絕不在此聊天室中向未經驗證的工作階段傳送已加密訊息。 + 絕不在此聊天室傳送加密訊息到未驗證的工作階段。 了解 套用底線格式 套用刪除線格式 @@ -2707,49 +2707,49 @@ 授予權限 ${app_name} 需要權限以顯示通知。 \n請授予權限。 - ${app_name} 需要權限才能顯示通知。通知可以顯示您的訊息、您的邀請等等。 + ${app_name} 需要權限才能顯示通知。將在通知中顯示您收到的訊息、邀請等等。 \n -\n請在下一個彈出式視窗允許存取以檢視通知。 +\n請在下個彈跳視窗中允許存取,才能檢視通知。 試用富文字編輯器(純文字模式即將推出) 啟用富文字編輯器 - 請確保您知道此驗證碼的來源。透過連結裝置,您將為某人提供對您帳號的完整存取權限。 + 請確認您知道此驗證碼的來源。連結裝置後,您將為某人提供對您帳號的完整存取權限。 確認 再次嘗試 不相符? 正在將你登入 連線至裝置 - 掃描 QR 碼 - 正在使用行動裝置登入嗎? - 在此裝置顯示 QR 碼 - 選取「掃描 QR 碼」 + 掃描 QR Code + 要登入行動裝置嗎? + 在此裝置顯示 QR Code + 選取「掃描 QR Code」 從登入畫面開始 - 選取「使用 QR 碼登入」 + 選取「使用 QR Code 登入」 從登入畫面開始 - 選取「顯示 QR 碼」 - 到「設定」→「安全與隱私」 - 在您的其他裝置上開啟應用程式 + 選取「顯示 QR Code」 + 到「設定」→「安全性與隱私權」 + 在您的另一台裝置上開啟應用程式 請求在另一台裝置上被拒絕。 連結未在要求的時間內完成。 不支援與其裝置連結。 連線不成功 請檢查您已登入的裝置,應該會顯示以下驗證碼。請確認以下驗證碼與該裝置相符: 已建立安全連線 - 使用您已登出的裝置掃描以下 QR 碼。 - 使用您已登入的裝置來掃描下方的 QR 碼: - 使用 QR 碼登入 - 使用此裝置的相機掃描您其他裝置上顯示的 QR 碼: - 掃描 QR 碼 + 使用您已登出的裝置掃描以下 QR Code。 + 使用您已登入的裝置來掃描下方的 QR Code: + 使用 QR Code 登入 + 使用此裝置的相機掃描您其他裝置上顯示的 QR Code: + 掃描 QR Code 3 2 1 - 您可以使用此裝置透過 QR 碼登入行動裝置或網路裝置。有兩種方法可以作到: - 使用 QR 碼登入 - 掃描 QR 碼 - 家伺服器不支援使用 QR 碼登入。 - 已在其他裝置上取消登入。 - 該 QR 碼無效。 - 其他裝置必須登入。 - 其他裝置已登入。 + 您可以使用此裝置透過 QR Code 登入行動裝置或網路裝置。有兩種方法可以作到: + 使用 QR Code 登入 + 掃描 QR Code + 家伺服器不支援使用 QR Code 登入。 + 已在另一台裝置上取消登入。 + 該 QR Code 無效。 + 另一台裝置必須登入。 + 另一台裝置已登入。 設定安全訊息傳遞時遇到安全問題。以下其中一項可能已被駭入:您的家伺服器;您的網際網路連線;您的裝置; 無法請求。 可以在聊天室時間軸中錄製並傳送語音廣播。 @@ -2783,9 +2783,9 @@ 無法開始新的語音廣播 快轉30秒 快退30秒 - 已驗證的工作階段是您輸入安全密語或透過另一個已驗證工作階段確認您的身分後使用此帳號的任何地方。 + 已驗證的工作階段是您輸入安全密語或透過另一個已驗證工作階段確認您的身分後,使用此帳號的任何地方。 \n -\n這代表您擁有解鎖已加密訊息並向其他使用者確認您信任此工作階段所需的所有金鑰。 +\n這代表您擁有解鎖加密訊息並向其他使用者確認您信任此工作階段所需的所有金鑰。 登出 %1$d 個工作階段 @@ -2804,13 +2804,13 @@ 引用 回覆給 %s 正在編輯 - 在系統分享選單中顯示最近聊天 + 在系統分享選單中顯示最近使用過的聊天室 啟用直接分享 - 請確認您的帳戶安全 + 請確認您的帳號安全 您有未驗證的工作階段 - 無法對此對話進行加密,因此無法驗證。 + 無法對此對話進行加密,因此也無法驗證。 \n -\n您無法進入已加密的聊天室中。 +\n使用此工作階段時無法進入加密聊天室中。 \n \n為了安全與隱私,建議使用支援加密的 Matrix 客戶端。 登出所有其他的工作階段 @@ -2836,7 +2836,7 @@ 過去的投票 此聊天室沒有正在進行的投票 進行中的投票 - 投票歷史紀錄 + 投票紀錄 已結束投票 投票 已結束投票。 From 5763926dfe7ae9868799c57a07aa45c997ad703d Mon Sep 17 00:00:00 2001 From: sonata-chen Date: Sat, 4 Mar 2023 14:26:34 +0000 Subject: [PATCH 146/153] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2607 of 2607 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- library/ui-strings/src/main/res/values-zh-rTW/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 46b6c25ea8..ff0e7dbd40 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -1727,7 +1727,7 @@ 新增夥伴 新增主題 %s 讓人們知道這個聊天室是做什麼用的。 - 這是您與 %s 直接訊息歷史紀錄的開頭。 + 這是您與 %s 私人訊息紀錄的開頭。 這是此對話的開頭。 這是 %s 的開頭。 您沒有在此聊天室中啟用加密的權限。 From 0c5fea20293392e86b57533d00e0f7d8cd6cd208 Mon Sep 17 00:00:00 2001 From: random Date: Mon, 6 Mar 2023 09:40:29 +0000 Subject: [PATCH 147/153] Translated using Weblate (Italian) Currently translated at 100.0% (94 of 94 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/it/ --- fastlane/metadata/android/it-IT/changelogs/40105260.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/it-IT/changelogs/40105260.txt diff --git a/fastlane/metadata/android/it-IT/changelogs/40105260.txt b/fastlane/metadata/android/it-IT/changelogs/40105260.txt new file mode 100644 index 0000000000..538dc33097 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40105260.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: correzioni di errori. +Cronologia completa: https://github.com/vector-im/element-android/releases From 60b19aac65e20d799b78e3277803eba4f4d021ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 12:47:56 +0100 Subject: [PATCH 148/153] Bump com.android.tools.build:gradle from 7.4.1 to 7.4.2 (#8183) Bumps com.android.tools.build:gradle from 7.4.1 to 7.4.2. --- updated-dependencies: - dependency-name: com.android.tools.build:gradle dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 8b6256f792..c5da2876d3 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -6,7 +6,7 @@ ext.versions = [ 'targetCompat' : JavaVersion.VERSION_11, ] -def gradle = "7.4.1" +def gradle = "7.4.2" // Ref: https://kotlinlang.org/releases.html def kotlin = "1.8.10" def kotlinCoroutines = "1.6.4" From 8e89d09b1bf78cc1482bd1f4a93efbc04008e34b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Mar 2023 00:00:10 +0000 Subject: [PATCH 149/153] Bump io.sentry:sentry-android from 6.14.0 to 6.15.0 Bumps [io.sentry:sentry-android](https://github.com/getsentry/sentry-java) from 6.14.0 to 6.15.0. - [Release notes](https://github.com/getsentry/sentry-java/releases) - [Changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-java/compare/6.14.0...6.15.0) --- updated-dependencies: - dependency-name: io.sentry:sentry-android dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index c5da2876d3..9945a847e7 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -27,7 +27,7 @@ def jjwt = "0.11.5" // Temporary version to unblock #6929. Once 0.16.0 is released we should use it, and revert // the whole commit which set version 0.16.0-SNAPSHOT def vanniktechEmoji = "0.16.0-SNAPSHOT" -def sentry = "6.14.0" +def sentry = "6.15.0" // Use 1.6.0 alpha to fix issue with test def fragment = "1.6.0-alpha04" // Testing From 7c23776ea198aed7fe97d48e213b80761e359afa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Mar 2023 15:53:34 +0000 Subject: [PATCH 150/153] Bump org.checkerframework:checker from 3.30.0 to 3.32.0 (#8197) Bumps [org.checkerframework:checker](https://github.com/typetools/checker-framework) from 3.30.0 to 3.32.0. - [Release notes](https://github.com/typetools/checker-framework/releases) - [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md) - [Commits](https://github.com/typetools/checker-framework/compare/checker-framework-3.30.0...checker-framework-3.32.0) --- updated-dependencies: - dependency-name: org.checkerframework:checker dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- vector/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/build.gradle b/vector/build.gradle index 72f38f2928..0f435f1337 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -308,7 +308,7 @@ dependencies { // Fix issue with Jitsi. Inspired from https://github.com/android/android-test/issues/861#issuecomment-872067868 // Error was lots of `Duplicate class org.checkerframework.common.reflection.qual.MethodVal found in modules jetified-checker-3.1 (org.checkerframework:checker:3.1.1) and jetified-checker-qual-3.12.0 (org.checkerframework:checker-qual:3.12.0) //noinspection GradleDependency Cannot use latest 3.15.0 since it required min API 26. - implementation "org.checkerframework:checker:3.30.0" + implementation "org.checkerframework:checker:3.32.0" androidTestImplementation libs.androidx.testCore androidTestImplementation libs.androidx.testRunner From d5f75c6f9af3c88a953263ea3597353aa5edcb62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Mar 2023 10:53:25 +0000 Subject: [PATCH 151/153] Bump appDistribution from 16.0.0-beta05 to 16.0.0-beta06 (#8198) Bumps `appDistribution` from 16.0.0-beta05 to 16.0.0-beta06. Updates `com.google.firebase:firebase-appdistribution-api-ktx` from 16.0.0-beta05 to 16.0.0-beta06 - [Release notes](https://github.com/firebase/firebase-android-sdk/releases) - [Changelog](https://github.com/firebase/firebase-android-sdk/blob/master/docs/make_release_notes.py) - [Commits](https://github.com/firebase/firebase-android-sdk/commits) Updates `com.google.firebase:firebase-appdistribution` from 16.0.0-beta05 to 16.0.0-beta06 - [Release notes](https://github.com/firebase/firebase-android-sdk/releases) - [Changelog](https://github.com/firebase/firebase-android-sdk/blob/master/docs/make_release_notes.py) - [Commits](https://github.com/firebase/firebase-android-sdk/commits) --- updated-dependencies: - dependency-name: com.google.firebase:firebase-appdistribution-api-ktx dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.google.firebase:firebase-appdistribution dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 9945a847e7..93d1d5d5a1 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -12,7 +12,7 @@ def kotlin = "1.8.10" def kotlinCoroutines = "1.6.4" def dagger = "2.45" def firebaseBom = "31.2.2" -def appDistribution = "16.0.0-beta05" +def appDistribution = "16.0.0-beta06" def retrofit = "2.9.0" def markwon = "4.6.2" def moshi = "1.14.0" From 671095fed0824e11cce7a7c3a6936ad7784fac26 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 8 Mar 2023 17:27:22 +0100 Subject: [PATCH 152/153] Changelog for version 1.5.28 --- CHANGES.md | 24 ++++++++++++++++++++++++ changelog.d/6912.misc | 1 - changelog.d/7989.bugfix | 1 - changelog.d/8141.feature | 1 - changelog.d/8157.feature | 1 - changelog.d/8168.bugfix | 1 - changelog.d/8170.bugfix | 1 - changelog.d/8171.bugfix | 1 - changelog.d/8185.feature | 1 - changelog.d/8187.bugfix | 1 - changelog.d/8190.bugfix | 1 - changelog.d/8195.bugfix | 1 - 12 files changed, 24 insertions(+), 11 deletions(-) delete mode 100644 changelog.d/6912.misc delete mode 100644 changelog.d/7989.bugfix delete mode 100644 changelog.d/8141.feature delete mode 100644 changelog.d/8157.feature delete mode 100644 changelog.d/8168.bugfix delete mode 100644 changelog.d/8170.bugfix delete mode 100644 changelog.d/8171.bugfix delete mode 100644 changelog.d/8185.feature delete mode 100644 changelog.d/8187.bugfix delete mode 100644 changelog.d/8190.bugfix delete mode 100644 changelog.d/8195.bugfix diff --git a/CHANGES.md b/CHANGES.md index ae1f10f6c0..59e7c85715 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,27 @@ +Changes in Element v1.5.28 (2023-03-08) +======================================= + +Features ✨ +---------- + - [Poll] Error handling for push rules synchronization ([#8141](https://github.com/vector-im/element-android/issues/8141)) + - Add aggregated unread indicator for spaces in the new layout ([#8157](https://github.com/vector-im/element-android/issues/8157)) + - [Rich text editor] Add ability to insert GIFs from keyboard ([#8185](https://github.com/vector-im/element-android/issues/8185)) + +Bugfixes 🐛 +---------- + - Space setting category doesn't show up ([#7989](https://github.com/vector-im/element-android/issues/7989)) + - Fix timeline loading a wrong room on permalink if a matching event id is found in a different room ([#8168](https://github.com/vector-im/element-android/issues/8168)) + - Reapply local push rules after event decryption ([#8170](https://github.com/vector-im/element-android/issues/8170)) + - [Rich text editor] Fix code appearance ([#8171](https://github.com/vector-im/element-android/issues/8171)) + - Extend workaround for extra new lines in timeline ([#8187](https://github.com/vector-im/element-android/issues/8187)) + - [Poll history] Fixing small issue about font style ([#8190](https://github.com/vector-im/element-android/issues/8190)) + - Update room member shields behavior ([#8195](https://github.com/vector-im/element-android/issues/8195)) + +Other changes +------------- + - Direct Message: Manage encrypted DM in case of invite by email ([#6912](https://github.com/vector-im/element-android/issues/6912)) + + Changes in Element v1.5.26 (2023-02-22) ======================================= diff --git a/changelog.d/6912.misc b/changelog.d/6912.misc deleted file mode 100644 index c43830e902..0000000000 --- a/changelog.d/6912.misc +++ /dev/null @@ -1 +0,0 @@ -Direct Message: Manage encrypted DM in case of invite by email diff --git a/changelog.d/7989.bugfix b/changelog.d/7989.bugfix deleted file mode 100644 index b8ec7cdada..0000000000 --- a/changelog.d/7989.bugfix +++ /dev/null @@ -1 +0,0 @@ -Space setting category doesn't show up diff --git a/changelog.d/8141.feature b/changelog.d/8141.feature deleted file mode 100644 index 8c03af1150..0000000000 --- a/changelog.d/8141.feature +++ /dev/null @@ -1 +0,0 @@ -[Poll] Error handling for push rules synchronization diff --git a/changelog.d/8157.feature b/changelog.d/8157.feature deleted file mode 100644 index 3cab2b600b..0000000000 --- a/changelog.d/8157.feature +++ /dev/null @@ -1 +0,0 @@ -Add aggregated unread indicator for spaces in the new layout diff --git a/changelog.d/8168.bugfix b/changelog.d/8168.bugfix deleted file mode 100644 index 39baa3f60a..0000000000 --- a/changelog.d/8168.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix timeline loading a wrong room on permalink if a matching event id is found in a different room diff --git a/changelog.d/8170.bugfix b/changelog.d/8170.bugfix deleted file mode 100644 index 62ded3b2ca..0000000000 --- a/changelog.d/8170.bugfix +++ /dev/null @@ -1 +0,0 @@ -Reapply local push rules after event decryption diff --git a/changelog.d/8171.bugfix b/changelog.d/8171.bugfix deleted file mode 100644 index 799fecabaf..0000000000 --- a/changelog.d/8171.bugfix +++ /dev/null @@ -1 +0,0 @@ -[Rich text editor] Fix code appearance \ No newline at end of file diff --git a/changelog.d/8185.feature b/changelog.d/8185.feature deleted file mode 100644 index 3e1f10d438..0000000000 --- a/changelog.d/8185.feature +++ /dev/null @@ -1 +0,0 @@ -[Rich text editor] Add ability to insert GIFs from keyboard \ No newline at end of file diff --git a/changelog.d/8187.bugfix b/changelog.d/8187.bugfix deleted file mode 100644 index e0a9dd3a29..0000000000 --- a/changelog.d/8187.bugfix +++ /dev/null @@ -1 +0,0 @@ -Extend workaround for extra new lines in timeline \ No newline at end of file diff --git a/changelog.d/8190.bugfix b/changelog.d/8190.bugfix deleted file mode 100644 index 95790f7c0c..0000000000 --- a/changelog.d/8190.bugfix +++ /dev/null @@ -1 +0,0 @@ -[Poll history] Fixing small issue about font style diff --git a/changelog.d/8195.bugfix b/changelog.d/8195.bugfix deleted file mode 100644 index 72da824aa1..0000000000 --- a/changelog.d/8195.bugfix +++ /dev/null @@ -1 +0,0 @@ -Update room member shields behavior From 7282c30872727e9685a231d5e13288c89cfab444 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 8 Mar 2023 17:28:05 +0100 Subject: [PATCH 153/153] Adding fastlane file for version 1.5.28 --- fastlane/metadata/android/en-US/changelogs/40105280.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/40105280.txt diff --git a/fastlane/metadata/android/en-US/changelogs/40105280.txt b/fastlane/metadata/android/en-US/changelogs/40105280.txt new file mode 100644 index 0000000000..df2e163506 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40105280.txt @@ -0,0 +1,2 @@ +Main changes in this version: Mainly bugfixing. +Full changelog: https://github.com/vector-im/element-android/releases