From d588743d48a8556f49ec4fff35b71e1925acc362 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 5 Jan 2022 07:54:25 +0000 Subject: [PATCH 01/56] Translated using Weblate (Czech) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/ --- vector/src/main/res/values-cs/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 22a566e2ca..7fc8050f17 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -3116,4 +3116,7 @@ \nMůžete si přečíst všechny naše podmínky %s. Pomozte vylepšit Element Povolit + Restartujte aplikaci, aby se změna projevila. + Povolit matematické výrazy LaTeXu + Do této místnosti vám není dovoleno vstoupit \ No newline at end of file From 495f03b177b74576721c819432108909f025bb9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 4 Jan 2022 19:49:20 +0000 Subject: [PATCH 02/56] Translated using Weblate (Estonian) Currently translated at 99.8% (2710 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/et/ --- vector/src/main/res/values-et/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index 43a98881f2..2aa504127d 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -3056,4 +3056,7 @@ \nMeie kasutustingimused leiad siit - %s. Aita Element\'i arendamisel Võta kasutusele + Muudatuste jõustamiseks käivita rakendus uuesti. + Kasuta LaTeX-vorminduses matemaatika märgistust + Sul pole luba selle jututoaga liitumiseks \ No newline at end of file From d9c303508e7197f6a925efe0ddd0e4021bff3d16 Mon Sep 17 00:00:00 2001 From: Linerly Date: Wed, 5 Jan 2022 02:34:09 +0000 Subject: [PATCH 03/56] Translated using Weblate (Indonesian) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/id/ --- vector/src/main/res/values-in/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml index 385e5dcc9e..66f03b12fc 100644 --- a/vector/src/main/res/values-in/strings.xml +++ b/vector/src/main/res/values-in/strings.xml @@ -3002,4 +3002,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. \nAnda dapat membaca semua kebijakan kami %s. Bantu buat Element lebih baik Aktifkan + Mulai ulang aplikasi ini untuk menerapkan perubahan. + Aktifkan matematika LaTeX + Anda tidak diperbolehkan untuk bergabung ke ruangan ini \ No newline at end of file From d8c971c273d34ebaff2242b814c856227b22c4ab Mon Sep 17 00:00:00 2001 From: random Date: Wed, 5 Jan 2022 10:02:25 +0000 Subject: [PATCH 04/56] Translated using Weblate (Italian) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/it/ --- vector/src/main/res/values-it/strings.xml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 43bdfe5f55..26ceaf4aef 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -2002,7 +2002,7 @@ Fine Usa questa %1$s come una rete di salvataggio in caso dimenticassi la tua %2$s. Pubblicazione delle chiavi di identità create - Generazione di una chiave sicura basata sulla Passphrase + Generazione chiave sicura dalla frase di sicurezza Definizione della chiave predefinita SSSS Sincronizzazione della chiave principale Sincronizzazione della chiave utente @@ -2015,9 +2015,9 @@ Salvala in una penna USB o disco di backup Copiala sul Cloud Non puoi farlo dallo smartphone - Impostare una Passphrase di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche. + Impostare una frase di sicurezza di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche. \n -\nSe non vuoi impostare una Password dei messaggi puoi generare una chiave dei messaggi. +\nSe non vuoi impostare una Password dei Messaggi, puoi generare una Chiave dei Messaggi. Impostare una Passphrase di ripristino ti consente di proteggere e sbloccare i messaggi criptati e le verifiche. Crittografia attiva I messaggi in questa stanza sono crittografati E2E. Maggiori info e verifica degli utenti nel loro profilo. @@ -2056,7 +2056,7 @@ %1$s (%2$s) Per continuare inserisci la Passphrase del backup delle chiavi. usare la chiave di ripristino del backup chiavi - Non conosci la Passphrase del backup delle chiavi, puoi %s. + Non conosci la frase di sicurezza del backup delle chiavi, puoi %s. Chiave di ripristino del backup chiavi Impedisci la cattura di schermate dell\'app Attivandolo verrà aggiunto FLAG_SECURE a tutte le attività. Riavvia l\'applicazione per applicare le modifiche. @@ -3047,4 +3047,7 @@ \nPuoi leggere i nostri termini di servizio %s. Aiuta a migliorare Element Attiva + Riavvia l\'applicazione per applicare le modifiche. + Attiva la matematica LaTeX + Non ti è permesso entrare in questa stanza \ No newline at end of file From 4d3dda0b6271282bd88295b8a2536b19aa2cafd0 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Tue, 4 Jan 2022 19:28:44 +0000 Subject: [PATCH 05/56] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/ --- vector/src/main/res/values-pt-rBR/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index f0aa98ca56..5b70294f83 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -3057,4 +3057,7 @@ Nós não compartilhamos informação com terceiros aqui Habilitar + Recomece o aplicativo para a mudançar tomar efeito. + Habilitar matemática LaTeX + Você não é permitida(o) a juntar-se a esta sala \ No newline at end of file From cde91af8555ad05a6d27a4c160b52f652a32ade3 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 4 Jan 2022 19:11:10 +0000 Subject: [PATCH 06/56] Translated using Weblate (Albanian) Currently translated at 99.5% (2700 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sq/ --- vector/src/main/res/values-sq/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index cba5e0f3bb..11eda77784 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -3041,4 +3041,11 @@ \nMund të lexoni krejt kushtet tona %s. Ndihmoni të përmirësohet Element-in Aktivizoje + + S’ka vota të hedhura + %1$d votë e hedhur. Votoni, që të shihni përfundimet + + Që ndryshimi të hyjë në fuqi, rinisni aplikacionin. + Aktivizo elementë LaTeX për matematikë + S’keni leje të hyni në këtë dhomë \ No newline at end of file From e6c5d008a1cd7730aa9d4ac1a1a654166135217a Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 4 Jan 2022 19:53:00 +0000 Subject: [PATCH 07/56] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- vector/src/main/res/values-uk/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 4446edcf00..9517aa7e35 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -3159,4 +3159,7 @@ \nМожете прочитати всі наші умови %s. Допоможіть покращити Element Увімкнути + Перезапустіть застосунок, щоб зміни набули чинності. + Увімкнути підтримку LaTeX + Вам не дозволено приєднуватися до цієї кімнати \ No newline at end of file From aa480bc47031ca220fb09c606e00c1217a5e222f Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 5 Jan 2022 02:23:42 +0000 Subject: [PATCH 08/56] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- vector/src/main/res/values-zh-rTW/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index f45247ed56..37559c5cbf 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -2998,4 +2998,7 @@ \n您可以閱讀我們的條款 %s。 協助改善 Element 啟用 + 重新啟動應用程式以讓變更生效。 + 啟用 LaTeX 數學 + 您無法加入此聊天室 \ No newline at end of file From f7500734a2f4953fbae9cf9498e83639de9bca83 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Tue, 4 Jan 2022 19:30:16 +0000 Subject: [PATCH 09/56] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (43 of 43 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/pt_BR/ --- fastlane/metadata/android/pt-BR/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/pt-BR/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/pt-BR/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40103120.txt diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103100.txt b/fastlane/metadata/android/pt-BR/changelogs/40103100.txt new file mode 100644 index 0000000000..9912e2ccf1 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Adicionar suporte para sondagens (em labs). Novo design de previsualização de URL. +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103110.txt b/fastlane/metadata/android/pt-BR/changelogs/40103110.txt new file mode 100644 index 0000000000..a1f4d11acf --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Consertos de bugs! +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/pt-BR/changelogs/40103120.txt b/fastlane/metadata/android/pt-BR/changelogs/40103120.txt new file mode 100644 index 0000000000..b511348152 --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Consertos de bugs! +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From 8cb52e37dfee67ffb20b5d051eaff39a60fad333 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 4 Jan 2022 19:51:32 +0000 Subject: [PATCH 10/56] Translated using Weblate (Ukrainian) Currently translated at 100.0% (43 of 43 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/ --- fastlane/metadata/android/uk/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/uk/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/uk/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/uk/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/uk/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/uk/changelogs/40103120.txt diff --git a/fastlane/metadata/android/uk/changelogs/40103100.txt b/fastlane/metadata/android/uk/changelogs/40103100.txt new file mode 100644 index 0000000000..99e4be65eb --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Основні зміни в цій версії: Додано підтримку опитувань (в експериментальних). Новий вигляд попереднього перегляду посилань. +Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/uk/changelogs/40103110.txt b/fastlane/metadata/android/uk/changelogs/40103110.txt new file mode 100644 index 0000000000..cc5af09cda --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Основні зміни у цій версії: Виправлення помилок! +Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/uk/changelogs/40103120.txt b/fastlane/metadata/android/uk/changelogs/40103120.txt new file mode 100644 index 0000000000..a37498b4f1 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Основні зміни у цій версії: Виправлення помилок! +Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From 592ec2dc0fd1b57479f1fa70b1fd3d023b1f0912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 4 Jan 2022 19:42:42 +0000 Subject: [PATCH 11/56] Translated using Weblate (Estonian) Currently translated at 100.0% (43 of 43 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/et/ --- fastlane/metadata/android/et/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/et/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/et/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/et/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/et/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/et/changelogs/40103120.txt diff --git a/fastlane/metadata/android/et/changelogs/40103100.txt b/fastlane/metadata/android/et/changelogs/40103100.txt new file mode 100644 index 0000000000..2cb2ae0d88 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: katseline küsitluste tugi ja linkide eelvaate uus visuaal. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/et/changelogs/40103110.txt b/fastlane/metadata/android/et/changelogs/40103110.txt new file mode 100644 index 0000000000..6271372e2b --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: pinu veaparandusi! +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/et/changelogs/40103120.txt b/fastlane/metadata/android/et/changelogs/40103120.txt new file mode 100644 index 0000000000..c1cc3ff696 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: pinu veaparandusi! +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From 51df64d343372f85e9d1a12e6b0fe6e34189a0ea Mon Sep 17 00:00:00 2001 From: random Date: Wed, 5 Jan 2022 10:07:07 +0000 Subject: [PATCH 12/56] Translated using Weblate (Italian) Currently translated at 100.0% (43 of 43 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/40103100.txt | 2 ++ fastlane/metadata/android/it-IT/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/it-IT/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/it-IT/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/it-IT/changelogs/40103120.txt diff --git a/fastlane/metadata/android/it-IT/changelogs/40103100.txt b/fastlane/metadata/android/it-IT/changelogs/40103100.txt new file mode 100644 index 0000000000..d6036ff048 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: aggiunto supporto per i sondaggi (in labs). Nuovo design anteprime URL. +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/it-IT/changelogs/40103110.txt b/fastlane/metadata/android/it-IT/changelogs/40103110.txt new file mode 100644 index 0000000000..2db15676dc --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: correzioni di errori! +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/it-IT/changelogs/40103120.txt b/fastlane/metadata/android/it-IT/changelogs/40103120.txt new file mode 100644 index 0000000000..7756f8f186 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: correzioni di errori! +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From 3f270c704ce7b2d82fdd431e16f9f600cc314608 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 5 Jan 2022 02:22:57 +0000 Subject: [PATCH 13/56] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (43 of 43 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/40103100.txt | 2 ++ fastlane/metadata/android/zh-TW/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/zh-TW/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40103120.txt diff --git a/fastlane/metadata/android/zh-TW/changelogs/40103100.txt b/fastlane/metadata/android/zh-TW/changelogs/40103100.txt new file mode 100644 index 0000000000..70d93e833d --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40103100.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:新增對投票(在實驗室中)的支援。新的 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 new file mode 100644 index 0000000000..d5450f4c6a --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40103110.txt @@ -0,0 +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 new file mode 100644 index 0000000000..0ee60318c1 --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40103120.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:臭蟲修復! +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.3.12 From 7a2d160bde05ea34d7c68d617ca3d40a91e4b1bf Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 5 Jan 2022 08:22:31 +0000 Subject: [PATCH 14/56] Translated using Weblate (Czech) Currently translated at 100.0% (43 of 43 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/40101150.txt | 2 +- fastlane/metadata/android/cs-CZ/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/cs-CZ/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/cs-CZ/changelogs/40103120.txt | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40103120.txt diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt index e82655d352..93093cb1a7 100644 --- a/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt +++ b/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt @@ -1,2 +1,2 @@ -Hlavní změny v této verzi: implementace hlasových zpráv dosupných v rámci laboratoře. +Hlavní změny v této verzi: implementace hlasových zpráv dosupných v experimentálních funkcích. Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103100.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103100.txt new file mode 100644 index 0000000000..02eb5b59ef --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Přidání podpory pro hlasování (v experimentálních funkcích). Nový design náhledu URL. +Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103110.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103110.txt new file mode 100644 index 0000000000..e765e1667d --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Opravy chyb! +Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40103120.txt b/fastlane/metadata/android/cs-CZ/changelogs/40103120.txt new file mode 100644 index 0000000000..81437c716b --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Opravy chyb! +Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From a0df5f88b93d4197440d49b4d1e8dce6d8695b5f Mon Sep 17 00:00:00 2001 From: Linerly Date: Wed, 5 Jan 2022 02:37:52 +0000 Subject: [PATCH 15/56] Translated using Weblate (Indonesian) Currently translated at 100.0% (43 of 43 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/id/ --- fastlane/metadata/android/id/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/id/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/id/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/id/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/id/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/id/changelogs/40103120.txt diff --git a/fastlane/metadata/android/id/changelogs/40103100.txt b/fastlane/metadata/android/id/changelogs/40103100.txt new file mode 100644 index 0000000000..39d127cd93 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Dukungan untuk fitur poll (dalam Uji Coba), dan desain tampilan URL baru. +Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/id/changelogs/40103110.txt b/fastlane/metadata/android/id/changelogs/40103110.txt new file mode 100644 index 0000000000..725e58d957 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Perbaikan bug! +Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/id/changelogs/40103120.txt b/fastlane/metadata/android/id/changelogs/40103120.txt new file mode 100644 index 0000000000..9a5dc8026c --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: Perbaikan bug! +Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From fa306915837346edebb755f00668cd16f0625d0c Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Thu, 16 Dec 2021 15:20:20 +0000 Subject: [PATCH 16/56] adding automatic rotation of the onboarding carousel items - items change every 5 seconds - uses fake dragging to control the page transition speed, by default it's too fast --- .../im/vector/app/core/extensions/Integer.kt | 19 +++++++ .../vector/app/core/extensions/ViewPager2.kt | 57 +++++++++++++++++++ .../FtueAuthSplashCarouselFragment.kt | 19 ++++++- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 vector/src/main/java/im/vector/app/core/extensions/Integer.kt create mode 100644 vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt diff --git a/vector/src/main/java/im/vector/app/core/extensions/Integer.kt b/vector/src/main/java/im/vector/app/core/extensions/Integer.kt new file mode 100644 index 0000000000..70c834af89 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/extensions/Integer.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2021 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.core.extensions + +fun Int.incrementAndWrap(max: Int, min: Int = 0, amount: Int = 1) = if (this == max) min else this + amount diff --git a/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt b/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt new file mode 100644 index 0000000000..b3b54bc192 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021 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.core.extensions + +import android.animation.Animator +import android.animation.TimeInterpolator +import android.animation.ValueAnimator +import android.view.animation.AccelerateDecelerateInterpolator +import androidx.viewpager2.widget.ViewPager2 + +fun ViewPager2.setCurrentItem( + item: Int, + duration: Long, + interpolator: TimeInterpolator = AccelerateDecelerateInterpolator(), + pagePxWidth: Int = width // Default value taken from getWidth() from ViewPager2 view +) { + val pxToDrag: Int = pagePxWidth * (item - currentItem) + val animator = ValueAnimator.ofInt(0, pxToDrag) + var previousValue = 0 + animator.addUpdateListener { valueAnimator -> + val currentValue = valueAnimator.animatedValue as Int + val currentPxToDrag = (currentValue - previousValue).toFloat() + kotlin.runCatching { + fakeDragBy(-currentPxToDrag) + previousValue = currentValue + }.onFailure { animator.cancel() } + } + animator.addListener(object : Animator.AnimatorListener { + override fun onAnimationStart(animation: Animator?) { + beginFakeDrag() + } + + override fun onAnimationEnd(animation: Animator?) { + endFakeDrag() + } + + override fun onAnimationCancel(animation: Animator?) = Unit + override fun onAnimationRepeat(animation: Animator?) = Unit + }) + animator.interpolator = interpolator + animator.duration = duration + animator.start() +} diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt index f89ae36eb6..1520ec45b2 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt @@ -22,20 +22,29 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible +import androidx.lifecycle.lifecycleScope import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayoutMediator import im.vector.app.BuildConfig import im.vector.app.R +import im.vector.app.core.extensions.incrementAndWrap +import im.vector.app.core.extensions.setCurrentItem +import im.vector.app.core.flow.tickerFlow import im.vector.app.databinding.FragmentFtueSplashCarouselBinding import im.vector.app.features.VectorFeatures import im.vector.app.features.onboarding.OnboardingAction import im.vector.app.features.onboarding.OnboardingFlow import im.vector.app.features.settings.VectorPreferences +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.matrix.android.sdk.api.failure.Failure import java.net.UnknownHostException import javax.inject.Inject +private const val CAROUSEL_ROTATION_DELAY_MS = 5000L +private const val CAROUSEL_TRANSITION_TIME_MS = 500L + class FtueAuthSplashCarouselFragment @Inject constructor( private val vectorPreferences: VectorPreferences, private val vectorFeatures: VectorFeatures, @@ -52,7 +61,8 @@ class FtueAuthSplashCarouselFragment @Inject constructor( } private fun setupViews() { - views.splashCarousel.adapter = carouselController.adapter + val carouselAdapter = carouselController.adapter + views.splashCarousel.adapter = carouselAdapter TabLayoutMediator(views.carouselIndicator, views.splashCarousel) { _, _ -> }.attach() carouselController.setData(SplashCarouselState()) @@ -69,6 +79,13 @@ class FtueAuthSplashCarouselFragment @Inject constructor( "Branch: ${BuildConfig.GIT_BRANCH_NAME}" views.loginSplashVersion.debouncedClicks { navigator.openDebug(requireContext()) } } + + views.splashCarousel.apply { + val itemCount = carouselAdapter.itemCount + tickerFlow(lifecycleScope, delayMillis = CAROUSEL_ROTATION_DELAY_MS) + .onEach { setCurrentItem(currentItem.incrementAndWrap(max = itemCount - 1), duration = CAROUSEL_TRANSITION_TIME_MS) } + .launchIn(lifecycleScope) + } } private fun getStarted() { From 486671f385580a6989ad6bab910f8a486e619836 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 5 Jan 2022 10:53:50 +0000 Subject: [PATCH 17/56] making the incrementing helper specific to increments of 1 and incrementing first before returning the minimum value --- .../main/java/im/vector/app/core/extensions/Integer.kt | 9 ++++++++- .../ftueauth/FtueAuthSplashCarouselFragment.kt | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/extensions/Integer.kt b/vector/src/main/java/im/vector/app/core/extensions/Integer.kt index 70c834af89..2940c16fa2 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/Integer.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/Integer.kt @@ -16,4 +16,11 @@ package im.vector.app.core.extensions -fun Int.incrementAndWrap(max: Int, min: Int = 0, amount: Int = 1) = if (this == max) min else this + amount +fun Int.incrementByOneAndWrap(max: Int, min: Int = 0): Int { + val incrementedValue = this + 1 + return if (incrementedValue > max) { + min + } else { + incrementedValue + } +} diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt index 1520ec45b2..5ba7358112 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt @@ -28,7 +28,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayoutMediator import im.vector.app.BuildConfig import im.vector.app.R -import im.vector.app.core.extensions.incrementAndWrap +import im.vector.app.core.extensions.incrementByOneAndWrap import im.vector.app.core.extensions.setCurrentItem import im.vector.app.core.flow.tickerFlow import im.vector.app.databinding.FragmentFtueSplashCarouselBinding @@ -83,7 +83,7 @@ class FtueAuthSplashCarouselFragment @Inject constructor( views.splashCarousel.apply { val itemCount = carouselAdapter.itemCount tickerFlow(lifecycleScope, delayMillis = CAROUSEL_ROTATION_DELAY_MS) - .onEach { setCurrentItem(currentItem.incrementAndWrap(max = itemCount - 1), duration = CAROUSEL_TRANSITION_TIME_MS) } + .onEach { setCurrentItem(currentItem.incrementByOneAndWrap(max = itemCount - 1), duration = CAROUSEL_TRANSITION_TIME_MS) } .launchIn(lifecycleScope) } } From 0d2ad2d85d9a41a1168148871f16528927c24e4d Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Fri, 7 Jan 2022 13:47:14 +0000 Subject: [PATCH 18/56] adding back debug option to enable carousel (was rebased away) --- .../app/features/debug/features/DebugFeaturesStateFactory.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vector/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt b/vector/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt index 87d7e36ed5..6ddbb53134 100644 --- a/vector/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt +++ b/vector/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt @@ -38,6 +38,11 @@ class DebugFeaturesStateFactory @Inject constructor( label = "FTUE Splash - I already have an account", factory = VectorFeatures::isAlreadyHaveAccountSplashEnabled, key = DebugFeatureKeys.alreadyHaveAnAccount + ), + createBooleanFeature( + label = "FTUE Splash - Carousel", + factory = VectorFeatures::isSplashCarouselEnabled, + key = DebugFeatureKeys.splashCarousel ) )) } From 5de76380ad95e79172f8b6103cdcd8897992c9df Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Fri, 7 Jan 2022 14:26:49 +0000 Subject: [PATCH 19/56] supporting rtl dragging in the viewpager setCurrentItem --- .../main/java/im/vector/app/core/extensions/ViewPager2.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt b/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt index b3b54bc192..2054152f91 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt @@ -19,6 +19,7 @@ package im.vector.app.core.extensions import android.animation.Animator import android.animation.TimeInterpolator import android.animation.ValueAnimator +import android.view.View import android.view.animation.AccelerateDecelerateInterpolator import androidx.viewpager2.widget.ViewPager2 @@ -31,11 +32,16 @@ fun ViewPager2.setCurrentItem( val pxToDrag: Int = pagePxWidth * (item - currentItem) val animator = ValueAnimator.ofInt(0, pxToDrag) var previousValue = 0 + val isRtl = this.layoutDirection == View.LAYOUT_DIRECTION_RTL + animator.addUpdateListener { valueAnimator -> val currentValue = valueAnimator.animatedValue as Int val currentPxToDrag = (currentValue - previousValue).toFloat() kotlin.runCatching { - fakeDragBy(-currentPxToDrag) + when { + isRtl -> fakeDragBy(currentPxToDrag) + else -> fakeDragBy(-currentPxToDrag) + } previousValue = currentValue }.onFailure { animator.cancel() } } From bdb41b253dae6dc2f44df4ac758340d04a557c91 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Fri, 7 Jan 2022 14:32:28 +0000 Subject: [PATCH 20/56] flipping the gradient ftue background for rtl locales, fixes the gradient starting from the wrong side --- library/ui-styles/src/main/res/drawable/bg_carousel_page_1.xml | 1 + library/ui-styles/src/main/res/drawable/bg_carousel_page_2.xml | 1 + library/ui-styles/src/main/res/drawable/bg_carousel_page_3.xml | 1 + library/ui-styles/src/main/res/drawable/bg_carousel_page_4.xml | 1 + 4 files changed, 4 insertions(+) diff --git a/library/ui-styles/src/main/res/drawable/bg_carousel_page_1.xml b/library/ui-styles/src/main/res/drawable/bg_carousel_page_1.xml index bff828fb22..fa3aea4cab 100644 --- a/library/ui-styles/src/main/res/drawable/bg_carousel_page_1.xml +++ b/library/ui-styles/src/main/res/drawable/bg_carousel_page_1.xml @@ -1,6 +1,7 @@ \ No newline at end of file diff --git a/library/ui-styles/src/main/res/drawable/bg_carousel_page_2.xml b/library/ui-styles/src/main/res/drawable/bg_carousel_page_2.xml index 54e5286ded..f696823a6e 100644 --- a/library/ui-styles/src/main/res/drawable/bg_carousel_page_2.xml +++ b/library/ui-styles/src/main/res/drawable/bg_carousel_page_2.xml @@ -1,6 +1,7 @@ \ No newline at end of file diff --git a/library/ui-styles/src/main/res/drawable/bg_carousel_page_3.xml b/library/ui-styles/src/main/res/drawable/bg_carousel_page_3.xml index c31c70c078..b114f9c804 100644 --- a/library/ui-styles/src/main/res/drawable/bg_carousel_page_3.xml +++ b/library/ui-styles/src/main/res/drawable/bg_carousel_page_3.xml @@ -1,6 +1,7 @@ \ No newline at end of file diff --git a/library/ui-styles/src/main/res/drawable/bg_carousel_page_4.xml b/library/ui-styles/src/main/res/drawable/bg_carousel_page_4.xml index 56989688af..e8ee364431 100644 --- a/library/ui-styles/src/main/res/drawable/bg_carousel_page_4.xml +++ b/library/ui-styles/src/main/res/drawable/bg_carousel_page_4.xml @@ -1,6 +1,7 @@ \ No newline at end of file From a0bda0282498daeb2ee731dba36a6a982accedc4 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Fri, 7 Jan 2022 15:28:05 +0000 Subject: [PATCH 21/56] disabling user input whilst the automatic animation is taking place, fixes crashes when user input is attempted at the same time --- .../src/main/java/im/vector/app/core/extensions/ViewPager2.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt b/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt index 2054152f91..ff3f02e55c 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/ViewPager2.kt @@ -27,7 +27,7 @@ fun ViewPager2.setCurrentItem( item: Int, duration: Long, interpolator: TimeInterpolator = AccelerateDecelerateInterpolator(), - pagePxWidth: Int = width // Default value taken from getWidth() from ViewPager2 view + pagePxWidth: Int = width, ) { val pxToDrag: Int = pagePxWidth * (item - currentItem) val animator = ValueAnimator.ofInt(0, pxToDrag) @@ -47,10 +47,12 @@ fun ViewPager2.setCurrentItem( } animator.addListener(object : Animator.AnimatorListener { override fun onAnimationStart(animation: Animator?) { + isUserInputEnabled = false beginFakeDrag() } override fun onAnimationEnd(animation: Animator?) { + isUserInputEnabled = true endFakeDrag() } From 70c82443ee235811b4e29a08f7fe20ddf2f42f15 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Fri, 7 Jan 2022 15:51:03 +0000 Subject: [PATCH 22/56] simplifying the automatic transitions and matching iOS by scheduling the next transition once the page settles - means there's always a 5 second delay when manually skipping toa page --- .../FtueAuthSplashCarouselFragment.kt | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt index 5ba7358112..152754f241 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSplashCarouselFragment.kt @@ -23,6 +23,7 @@ import android.view.View import android.view.ViewGroup import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope +import androidx.viewpager2.widget.ViewPager2 import com.airbnb.mvrx.withState import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayoutMediator @@ -30,14 +31,14 @@ import im.vector.app.BuildConfig import im.vector.app.R import im.vector.app.core.extensions.incrementByOneAndWrap import im.vector.app.core.extensions.setCurrentItem -import im.vector.app.core.flow.tickerFlow import im.vector.app.databinding.FragmentFtueSplashCarouselBinding import im.vector.app.features.VectorFeatures import im.vector.app.features.onboarding.OnboardingAction import im.vector.app.features.onboarding.OnboardingFlow import im.vector.app.features.settings.VectorPreferences -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.matrix.android.sdk.api.failure.Failure import java.net.UnknownHostException import javax.inject.Inject @@ -81,10 +82,22 @@ class FtueAuthSplashCarouselFragment @Inject constructor( } views.splashCarousel.apply { - val itemCount = carouselAdapter.itemCount - tickerFlow(lifecycleScope, delayMillis = CAROUSEL_ROTATION_DELAY_MS) - .onEach { setCurrentItem(currentItem.incrementByOneAndWrap(max = itemCount - 1), duration = CAROUSEL_TRANSITION_TIME_MS) } - .launchIn(lifecycleScope) + var scheduledTransition: Job? = null + registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + scheduledTransition?.cancel() + scheduledTransition = scheduleCarouselTransition() + } + }) + scheduledTransition = scheduleCarouselTransition() + } + } + + private fun ViewPager2.scheduleCarouselTransition(): Job { + val itemCount = adapter?.itemCount ?: throw IllegalStateException("An adapter must be set") + return lifecycleScope.launch { + delay(CAROUSEL_ROTATION_DELAY_MS) + setCurrentItem(currentItem.incrementByOneAndWrap(max = itemCount - 1), duration = CAROUSEL_TRANSITION_TIME_MS) } } From 8e855f6dcfc4e42341cbaba101558c1bbcf174b1 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Fri, 7 Jan 2022 07:37:58 +0000 Subject: [PATCH 23/56] Translated using Weblate (Czech) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/ --- vector/src/main/res/values-cs/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 7fc8050f17..19eccc72aa 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -1979,7 +1979,7 @@ Spustit křížové podepsání Resetovat klíče QR kód - Téměř hotovo! Ukazuje %s úspěšné dokončení\? + Už to skoro je! Ukazuje %s úspěšné dokončení\? Ano Ne Spojení k serveru bylo ztraceno @@ -2069,8 +2069,8 @@ Šifrování není zapnuto Šifrování použité v této místnosti není podporováno %s založil a nastavil tuto místnost. - Téměř hotovo! Ukazuje druhé zařízení úspěšné dokončení\? - Téměř hotovo! Čekám na potvrzení… + Už to skoro je! Ukazuje druhé zařízení úspěšné dokončení\? + Už to skoro je! Čekám na potvrzení… Čekám na %s… Import klíčů selhal Konfigurace oznámení From 459c2941471231cacd63e257f3cc513ebbeec314 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Thu, 6 Jan 2022 10:30:42 +0000 Subject: [PATCH 24/56] Translated using Weblate (Persian) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- vector/src/main/res/values-fa/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml index 99573339e8..8ada5d5803 100644 --- a/vector/src/main/res/values-fa/strings.xml +++ b/vector/src/main/res/values-fa/strings.xml @@ -3057,4 +3057,7 @@ این‌جا کمک به بهبود المنت به کار انداختن + برای اثربخشی تغییر، برنامه را دوباره اجرا کنید. + به کار انداختن ریاضیات لاتک + مجاز به پیوستن به این گروه نیستید \ No newline at end of file From 34cd11b4398f2f07fa2c5060a6c4eb2e857a11c6 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 7 Jan 2022 07:36:40 +0000 Subject: [PATCH 25/56] Translated using Weblate (Hungarian) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- vector/src/main/res/values-hu/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 043dc86fbf..0384013c8d 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -3056,4 +3056,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Segíts az Element-et jobbá tenni nyerő válasz Jogi dolgok + A változások életbelépéséhez indítsd újra az alkalmazást. + LaTeX matematikai szintaxis engedélyezése + Nem léphetsz be ebbe a szobába \ No newline at end of file From 7bea20318705ee892d92c412f99a5a3067b638ef Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Fri, 7 Jan 2022 21:44:13 +0000 Subject: [PATCH 26/56] Translated using Weblate (Slovak) Currently translated at 67.7% (1839 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- vector/src/main/res/values-sk/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index 138cf6af07..e77cebf093 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -2080,4 +2080,10 @@ %1$d osoby %1$d osôb + Zistené otrasy! + Vybrať matrix.org + Obsah nahlásený + Zásady + Pokračovať + Zúrivé trasenie \ No newline at end of file From 804edd40053a155392da493c2dc186435613ac41 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 7 Jan 2022 07:39:07 +0000 Subject: [PATCH 27/56] Translated using Weblate (Hungarian) Currently translated at 100.0% (43 of 43 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/40103100.txt | 2 ++ fastlane/metadata/android/hu-HU/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/hu-HU/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40103120.txt diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103100.txt b/fastlane/metadata/android/hu-HU/changelogs/40103100.txt new file mode 100644 index 0000000000..9e3cb21611 --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Szavazások támogatása (a laborok között). Új URL előnézet. +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103110.txt b/fastlane/metadata/android/hu-HU/changelogs/40103110.txt new file mode 100644 index 0000000000..86cb418a6c --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Hibajavítások! +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/hu-HU/changelogs/40103120.txt b/fastlane/metadata/android/hu-HU/changelogs/40103120.txt new file mode 100644 index 0000000000..33fa44248d --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Hibajavítások! +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From 1a43eb24bc0e83440fa1367accf0bfddae8ccae1 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Thu, 6 Jan 2022 10:33:01 +0000 Subject: [PATCH 28/56] Translated using Weblate (Persian) Currently translated at 100.0% (43 of 43 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/ --- fastlane/metadata/android/fa/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/fa/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/fa/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/fa/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/fa/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/fa/changelogs/40103120.txt diff --git a/fastlane/metadata/android/fa/changelogs/40103100.txt b/fastlane/metadata/android/fa/changelogs/40103100.txt new file mode 100644 index 0000000000..99c4e3faec --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40103100.txt @@ -0,0 +1,2 @@ +تغییرات عمده در این نگارش:‌ افزودن پشتیبانی نظرسنجی‌ها (در آزمایشگاه‌ها). طرّاحی جدید پیش‌نمای نشانی. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/fa/changelogs/40103110.txt b/fastlane/metadata/android/fa/changelogs/40103110.txt new file mode 100644 index 0000000000..56d8ba6b91 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40103110.txt @@ -0,0 +1,2 @@ +تغییرات عمده در این نگارش:‌ تعمیر مشکلات! +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/fa/changelogs/40103120.txt b/fastlane/metadata/android/fa/changelogs/40103120.txt new file mode 100644 index 0000000000..67976a2024 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40103120.txt @@ -0,0 +1,2 @@ +تغییرات عمده در این نگارش:‌ تعمیر مشکلات! +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From 31dcd9ab3ff2ff2e06acd8f31f46bfdab018137f Mon Sep 17 00:00:00 2001 From: Johan Smits Date: Sat, 8 Jan 2022 12:05:02 +0000 Subject: [PATCH 29/56] Translated using Weblate (Dutch) Currently translated at 76.9% (2089 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/nl/ --- vector/src/main/res/values-nl/strings.xml | 542 +++++++++++++++++++--- 1 file changed, 474 insertions(+), 68 deletions(-) diff --git a/vector/src/main/res/values-nl/strings.xml b/vector/src/main/res/values-nl/strings.xml index cdbb031833..e1b0481913 100644 --- a/vector/src/main/res/values-nl/strings.xml +++ b/vector/src/main/res/values-nl/strings.xml @@ -68,7 +68,8 @@ Initiële synchronisatie: \nGesprekken worden geïmporteerd Initiële synchronisatie: -\nDeelgenomen gesprekken worden geïmporteerd +\nDeelgenomen gesprekken worden geïmporteerd +\nDit kan enige tijd in beslag nemen Initiële synchronisatie: \nUitgenodigde gesprekken worden geïmporteerd Initiële synchronisatie: @@ -842,7 +843,7 @@ Stel het machtsniveau van een gebruiker in Neemt rechten van gebruiker met gegeven ID af Nodigt gebruiker met gegeven ID uit in het huidige gesprek - Treedt toe tot gesprek met gegeven bijnaam + Voegt een kamer toe met het opgegeven adres Gesprek verlaten Onderwerp van het gesprek instellen Stuurt gebruiker met gegeven ID eruit @@ -1016,7 +1017,7 @@ ${app_name} wordt niet beperkt door accuoptimalisatie. Als een gebruiker een apparaat los van de oplader een tijd laat stilliggen, met het scherm uitgeschakeld, gaat het apparaat in slaapmodus. Dit verhindert apps de toegang tot het netwerk, en stelt hun taken, synchronisaties en standaardalarmen uit. Optimalisatie negeren - De app heeft geen verbinding met de homeserver nodig in de achtergrond, dit zou het gebruik van de batterij moeten verlagen + De app heeft geen verbinding met de thuisserver nodig in de achtergrond, dit zou het gebruik van de batterij moeten verlagen Lawaaiierige meldingen configureren Oproepmeldingen configureren Stille meldingen configureren @@ -1324,21 +1325,21 @@ U bent afgemeld vanwege onjuiste of verlopen gebruikersreferenties. U gebruikt geen identiteitsserver Er is geen identiteitsserver geconfigureerd. Dit is vereist om uw wachtwoord opnieuw in te stellen. - Het lijkt er op dat je probeert verbinding te maken met een andere thuisserver. Wil je uitloggen\? + Het lijkt er op dat u probeert verbinding te maken met een andere thuisserver. Wil je uitloggen\? Bewerken Beantwoorden Opnieuw proberen Betreed een kamer om de applicatie te gebruiken. - Heeft je een uitnodiging gestuurd + Heeft u een uitnodiging gestuurd Uitgenodigd door %s - Je bent helemaal bij! - Je hebt geen ongelezen berichten meer + U bent helemaal bij! + U hebt geen ongelezen berichten meer Welkom thuis! Ongelezen berichten inhalen Gesprekken - Je directe gesprekken zullen hier worden weergegeven. Gebruik de + knop om een gesprek te starten. + Uw directe gesprekken zullen hier worden weergegeven. Gebruik de + knop om een gesprek te starten. Kamers - Je kamers zullen hier worden weergegeven. Gebruik de + knop rechtsonder om een bestaande kamer te openen of een nieuwe aan te maken. + Uw kamers zullen hier worden weergegeven. Gebruik de + knop rechtsonder om een bestaande kamer te openen of een nieuwe aan te maken. Reacties Bevestigen Leuk vinden @@ -1367,7 +1368,7 @@ Pauzeren Afspelen U heeft het hoofdadres voor dit gesprek verwijderd. - Je hebt %1$s uitgenodigd. Reden: %2$s + U heeft %1$s uitgenodigd. Reden: %2$s Jouw uitnodiging. Reden: %1$s Bericht verstuurd Initiële synchronisatie: @@ -1376,7 +1377,7 @@ \nAan het wachten op een antwoord van de server… Lege kamer (was %s) Moderator - Je hebt %1$s uitgenodigd + U heeft %1$s uitgenodigd %1$s nodigde %2$s uit Geen verandering. U heeft eind-tot-eind-versleuteling ingeschakeld (%1$s) @@ -1460,19 +1461,19 @@ %1$s sluit aan U heeft de kamer betreden U heeft een sticker verzonden. - Druk op je opname om te stoppen of om te luisteren + Druk op uw opname om te stoppen of om te luisteren Houd ingedrukt om op te nemen, laat los om te verzenden - Verwijder opgenomen stembericht + Verwijder opname Stembericht aan het opnemen Pauzeer stembericht Speel stembericht af - Iedereen in %s kan de ruimte vinden en betreden - het is niet nodig om iedereen handmatig uit te nodigen. Je kan dit op elk moment aanpassen in de ruimte-instellingen. + Iedereen in %s kan de ruimte vinden en betreden - het is niet nodig om iedereen handmatig uit te nodigen. U kunt dit op elk moment aanpassen in de ruimte-instellingen. Stembericht (%1$s) Kan niet antwoorden of aanpassen als stembericht actief is Kan stembericht niet opnemen Kan stembericht niet afspelen - Je hebt je profiel geüpdatet %1$s - Je hebt een VoIP-vergadering aangevraagd + U heeft uw profiel geüpdatet %1$s + U heeft een VoIP-vergadering aangevraagd U heeft gasten de toegang tot dit gesprek verleend. U heeft het hoofdadres voor dit gesprek ingesteld op %1$s. U heeft %1$s als gespreksadres toegevoegd en %2$s verwijderd. @@ -1505,7 +1506,7 @@ • Servers die overeenkomen met %s zijn verbannen. U heeft hier geüpgraded. %s heeft hier geüpgraded. - Je hebt toekomstige gespreksgeschiedenis zichtbaar gemaakt voor %1$s + U heeft toekomstige gespreksgeschiedenis zichtbaar gemaakt voor %1$s %1$ds over %s is toegetreden. Conclusie Bevestiging @@ -1543,7 +1544,7 @@ %1$s gebruiken Huidige taal Gebruikers Uitnodigen - Gebruikers uitnodigen + Gebruikers uitnodigen… Leden toevoegen Login bevestigen %1$s (%2$s) @@ -1561,7 +1562,7 @@ Sleutelverzoeken Verwijderen Bevestigen Accountgegevens - Dev Tools + Ontwikkel Gereedschap QR-code Sleutels herstellen Gekruist Ondertekenen Initialiseren @@ -1591,7 +1592,7 @@ %s heeft geannuleerd Jij hebt geaccepteerd %s heeft geaccepteerd - Je hebt geannuleerd + U heeft geannuleerd Niet beveiligd Ze komen overeen Versleuteling inschakelen @@ -1601,14 +1602,14 @@ Gevoeligheidsdrempel Ontwikkelaarsmodus Geavanceerde instellingen - Initiële synchronisatie + Initiële synchronisatie… Data wissen Data wissen Inloggen Inloggen Gezien door Matrix-ID - Verouderde homeserver + Verouderde thuisserver Selecteer matrix.org Opnieuw verzenden Code invoeren @@ -1633,7 +1634,7 @@ Gebruiker negeren Inhoud gerapporteerd GEBRUIKER NEGEREN - Aangepaste rapportage + Aangepast rapport… Dit is ongepast Dit is spam Gelezen door %s @@ -1643,12 +1644,12 @@ Identiteitsserver Gelezen om Voorwaarden Herzien - Gesprek binnengaan - Gesprek aanmaken - Gesprekken filteren + Kamer binnengaan… + Kamer aanmaken… + Gesprekken filteren… Berichtwijzigingen - Bestand versleutelen - Thumbnail versleutelen + Bestand versleutelen… + Miniatuur versleutelen… Directe Berichten Feedback Token registreren @@ -1666,7 +1667,7 @@ Overige Geen Gebruiker negeren - Jezelf degraderen\? + Uzelf degraderen\? Uitnodiging annuleren In de wacht zetten SSL-fout. @@ -1718,11 +1719,11 @@ Versturen UITNODIGEN Onversleuteld - Bericht + Bericht… Problemen oplossen Beëindigen Verversen - Verwijderen + Verwijderen… Waarschuwing: Nee Ja @@ -1744,7 +1745,7 @@ Meer Beveiliging Jij - Wachten + Wachten… Sticker Bestand Geluid @@ -1788,8 +1789,8 @@ Wachten… Formaat: Url: - session_name: - app_display_name: + sessie_naam: + app_weergave_naam: push_key: app_id: Expert @@ -1814,30 +1815,30 @@ Herstellen Afwijzen Systeemstandaard - Je hebt eind-tot-eindversleuteling ingeschakeld (onbekend algoritme %1$s). - Je hebt eind-tot-eindversleuteling ingeschakeld. - Je hebt gasten de toegang tot het gesprek verhinderd. + U heeft eind-tot-eindversleuteling ingeschakeld (onbekend algoritme %1$s). + U heeft eind-tot-eindversleuteling ingeschakeld. + U heeft gasten de toegang tot het gesprek verhinderd. %1$s heeft gasten de toegang tot het gesprek verhinderd. - Je hebt gasten de toegang tot het gesprek verhinderd. - Je hebt hier gasten toegelaten. + U heeft gasten de toegang tot het gesprek verhinderd. + U heeft hier gasten toegelaten. %1$s heeft hier gasten toegelaten. - Je hebt het gespreksadres gewijzigd. + U heeft het gespreksadres gewijzigd. %1$s heeft het gespreksadres gewijzigd. - Je hebt het hoofdadres en alternatieve gespreksadres gewijzigd. + U heeft het hoofdadres en alternatieve gespreksadres gewijzigd. %1$s heeft het hoofdadres en alternatieve gespreksadres gewijzigd. - Je hebt het alternatieve gespreksadres gewijzigd. + U heeft het alternatieve gespreksadres gewijzigd. %1$s heeft het alternatieve gespreksadres gewijzigd. - Je hebt alternatief gespreksadres %1$s verwijderd. - Je hebt alternatieve gespreksadressen %1$s verwijderd. + U heeft alternatief gespreksadres %1$s verwijderd. + U heeft alternatieve gespreksadressen %1$s verwijderd. %1$s heeft %2$s als alternatief gespreksadres verwijderd. %1$s heeft %2$s als alternatieve gespreksadressen verwijderd. - Je hebt %1$s als alternatief gespreksadres toegevoegd. - Je hebt %1$s als alternatieve gespreksadressen toegevoegd. + U heeft %1$s als alternatief gespreksadres toegevoegd. + U heeft %1$s als alternatieve gespreksadressen toegevoegd. %1$s heeft %2$s als alternatief gespreksadres toegevoegd. @@ -1852,26 +1853,26 @@ Reden voor verbanning door deze gebruiker de verwijderen zal hij/zij niet meer in deze space zitten. \n -\nOm te voorkomen dat hij/zij opnieuw toetreedt, kun je hem/haar ook verbannen. +\nOm te voorkomen dat hij/zij opnieuw toetreedt, kunt u hem/haar ook verbannen. door deze gebruiker te verwijderen zal hij/zij niet meer in dit gesprek zitten. \n \nOm te voorkomen dat hij/zij opnieuw toetreedt, kun je hem/haar ook verbannen. Reden voor verwijdering - Weet je zeker dat je uitnodiging voor deze gebruiker wilt annuleren\? + Weet u zeker dat u uitnodiging voor deze gebruiker wilt annuleren\? Het niet meer negeren van deze gebruiker zal al zijn/haar berichten opnieuw doen weergeven. Door deze gebruiker te negeren worden zijn/haar berichten verwijderd uit gesprekken die jullie delen. \n -\nJe kunt deze actie op elk moment ongedaan maken in de algemene instellingen. - Je kunt deze wijziging niet ongedaan maken omdat je jezelf degradeert, als je de laatste gebruiker met rechten bent in het gesprek zal het onmogelijk zijn om opnieuw rechten te krijgen. - Dit gesprek is niet publiek. Je kunt niet opnieuw toetreden zonder uitnodiging. +\nU kunt deze actie op elk moment ongedaan maken in de algemene instellingen. + U kunt deze wijziging niet ongedaan maken omdat uzelf degradeert, als u de laatste gebruiker met rechten bent in het gesprek zal het onmogelijk zijn om opnieuw rechten te krijgen. + Dit gesprek is niet publiek. U kunt niet opnieuw toetreden zonder uitnodiging. Toch Doorgaan - Toegang verlenen tot je contactpersonen. - Om de QR-code te scannen moet je toegang verlenen tot de camera. - Oproep beëindigen + Toegang verlenen tot uw contactpersonen. + Om de QR-code te scannen moet u toegang verlenen tot de camera. + Oproep beëindigen… Geen antwoord - De gebruiker die je hebt gebeld is bezig. + De gebruiker die u heeft gebeld is bezig. Gebruiker bezig - Je hebt de oproep in de wacht gezet + U heeft de oproep in de wacht gezet %s heeft de oproep in de wacht gezet Teruggaan naar oproep Actieve Oproep (%s) @@ -1883,12 +1884,12 @@ Gemiste stemoproep - gemiste stemoproepen + %d gemiste stemoproepen Gaat over… Bevestiging vragen voor het starten van een oproep Onbedoelde oproep voorkomen - Niet geautoriseerd, geldige authenticatiegegevens ontbreken. + Niet geautoriseerd, geldige authenticatiegegevens ontbreken SSL-fout: de identiteit van de ander is niet bevestigd. Dit telefoonnummer is al gedefinieerd. Gebruik als standaard en niet opnieuw vragen @@ -1896,9 +1897,10 @@ HD inschakelen HD uitschakelen Geluidsapparaat Selecteren - Live verbinding opzetten mislukt.Vraag de administrator van je homeserver om een TURN-server te configureren zodat oproepen betrouwbaar werken. + Kan geen realtime verbinding tot stand brengen. +\nVraag de beheerder van uw thuisserver om een TURN-server te configureren om gesprekken betrouwbaar te laten werken. ${app_name} Oproep Mislukt - Homeserver API URL + Thuisserver API URL Sleutel deelverzoekgeschiedenis verzenden Alle gesprekken in de lijst tonen, waaronder gesprekken met expliciete inhoud. Gesprekken tonen met expliciete inhoud @@ -1908,19 +1910,423 @@ Nieuwe waarde Widget verwijderen mislukt Widget toevoegen mislukt - Je kunt jezelf niet bellen, wacht totdat deelnemers de uitnodiging accepteren - Je kunt jezelf niet bellen - Vergaderingen gebruiken beveiligings- en toestemmingsbeleid van Jitsi. Alle huidige personen in het gesprek zullen een uitnodiging zien terwijl je vergadering bezig is. + U kunt uzelf niet bellen, wacht totdat deelnemers de uitnodiging accepteren + U kunt niet met uzelf bellen + Vergaderingen gebruiken beveiligings- en toestemmingsbeleid van Jitsi. Alle huidige personen in het gesprek zullen een uitnodiging zien terwijl uw vergadering bezig is. Geluidsvergadering starten Videoconferentie starten Er is al een vergadering aan de gang! - Je mist het recht om een oproep te starten - Je mist het recht om een oproep in dit gesprek te starten - Je mist het recht om een vergadering te starten - Je mist het recht om een vergadering in dit gesprek te starten + U mist de rechten om een oproep te starten + U mist de rechten om een oproep in dit gesprek te starten + U mist de rechten om een vergadering te starten + U mist de rechten om een vergadering in dit gesprek te starten Ontbrekende rechten Geef toestemming om de microfoon te gebruiken om stemberichten te versturen. Alles herstellen - Je bent toegetreden. + U bent toegetreden. Stemberichten inschakelen + Er is een verificatie e-mail verzonden naar %1$s. + Controleer je inbox + Dit e-mailadres is niet aan een account gekoppeld + Als u uw wachtwoord wijzigt, worden alle end-to-end-coderingssleutels voor al uw sessies opnieuw ingesteld, waardoor de gecodeerde chatgeschiedenis onleesbaar wordt. Stel een back-up sleutel in of exporteer uw kamersleutels uit een andere sessie voordat u uw wachtwoord opnieuw instelt. + Er wordt een verificatie-e-mail naar uw inbox gestuurd om het instellen van uw nieuwe wachtwoord te bevestigen. + Wachtwoord opnieuw instellen op %1$s + Dit e-mailadres is niet gekoppeld aan een account. + De applicatie kan geen account aanmaken op deze thuisserver. +\n +\nWilt u zich aanmelden met een webclient\? + Sorry, deze server accepteert geen nieuwe accounts. + De applicatie kan niet inloggen op deze thuisserver. De thuisserver ondersteunt de volgende aanmeldingstype(s): %1$s. +\n +\nWil je inloggen met een webclient\? + Er is een fout opgetreden bij het laden van de pagina: %1$s (%2$d) + Voer het adres in van de server die u wilt gebruiken + Voer het adres in van de Modular Element of de server die u wilt gebruiken + Premium hosting voor organisaties + Element Matrix Services-adres + Geschiedenis wissen + Doorgaan met eenmalig inloggen + Log in met %s + Log in bij %1$s + Verbinding maken met een aangepaste server + Verbinding maken met Element Matrix Services + Maak verbinding met %1$s + eenmalig inloggen + Meld je aan met %s + Ga verder met %s + Aangepaste en geavanceerde instellingen + Premium hosting voor organisaties + Word gratis lid met miljoenen anderen op de grootste openbare server + Net als e-mail hebben accounts één thuis, hoewel je met iedereen kunt praten + Selecteer een server + Breid en pas uw ervaring aan + Houd gesprekken privé met versleuteling + Chat direct met mensen of in groepen + Het is jouw gesprek. Bezet het. + U heeft deze op enkel uitnodiging gemaakt. + %1$s heeft dit alleen op uitnodiging gemaakt. + Je hebt de kamer alleen op uitnodiging gemaakt. + %1$s heeft de kamer alleen voor uitnodigingen ingesteld. + U heeft de ruimte openbaar gemaakt voor iedereen die de link kent. + U negeert geen enkele gebruiker + %1$s heeft de ruimte openbaar gemaakt voor iedereen die de link kent. + Klik lang op een kamer om meer opties te zien + Schrijf trefwoorden om een reactie te vinden. + Stuurt het gegeven bericht als een spoiler + U heeft geen wijzigingen aangebracht + %1$s heeft geen wijzigingen aangebracht + Kamer instellingen + Verlaat de kamer + Verwijderen van lage prioriteit + Toevoegen aan lage prioriteit + Verwijder van favorieten + Toevoegen aan favorieten + Alle berichten (luidruchtig) + Er is momenteel geen netwerkverbinding + ${app_name} heeft toestemming nodig om uw E2E-sleutels op schijf op te slaan. +\n +\nGeef toegang in de volgende pop-up om uw sleutels handmatig te kunnen exporteren. + Deze inhoud is als ongepast gerapporteerd. +\n +\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen. + Gemeld als ongepast + Deze inhoud is gerapporteerd als spam. +\n +\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen. + Gerapporteerd als spam + Deze inhoud is gemeld. +\n +\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen. + Reden voor het rapporteren van deze inhoud + Deze inhoud rapporteren + Er zijn geen bestanden in deze kamer + %1$s op %2$s + Er zijn geen media in deze kamer + %1$d van %2$d + Kan gegevens delen niet aan + Roteren en bijsnijden + Opiniepeiling + Afbeelding toevoegen van + Er is een fout opgetreden bij het ophalen van de bijlage. + Het bestand \'%1$s\' (%2$s) is te groot om te uploaden. Het limiet is %3$s. + Het bestand is te groot om te uploaden. + + %d gebruiker gelezen + %d gebruikers gelezen + + %1$s en %2$s gelezen + %1$s, %2$s en %3$s gelezen + + %1$s, %2$s en %3$d andere gelezen + %1$s, %2$s en %3$d anderen lezen + + Deze functie is in bèta + Naar beneden springen + Sluit sleutels back-up banner + Maak een nieuwe kamer aan + Creëer een nieuw direct gesprek door een QR-code te scannen + Maak een nieuw direct gesprek aan met Matrix ID + Een nieuw direct gesprek maken + Sluit het menu ruimte maken… + Open het menu ruimte maken + Open de navigatielade + Het lijkt erop dat de server er te lang over doet om te reageren. Dit kan worden veroorzaakt door een slechte verbinding of een fout met de server. Probeer het over een tijdje opnieuw. + Probeer het opnieuw zodra u de algemene voorwaarden van uw homeserver hebt geaccepteerd. + Uitgebreide logboeken helpen ontwikkelaars door meer logboeken te verstrekken wanneer u een RageShake verzendt. Zelfs wanneer ingeschakeld, registreert de toepassing geen berichtinhoud of andere privégegevens. + Uitgebreide logboeken inschakelen. + Ga akkoord met de servicevoorwaarden van de identiteitsserver (%s), zodat u vindbaar bent op e-mailadres of telefoonnummer. + U deelt momenteel e-mailadressen of telefoonnummers op de identiteitsserver %1$s. U moet opnieuw verbinding maken met %2$s om ze niet meer te delen. + De verificatiecode is niet correct. + Er is een sms-bericht verzonden naar %s. Voer de verificatiecode in die deze bevat. + De door u gekozen identiteitsserver heeft geen servicevoorwaarden. Ga alleen verder als je de eigenaar van de service vertrouwt + Identiteitsserver heeft geen servicevoorwaarden + Voer de URL van de identiteitsserver in + Kan geen verbinding maken met identiteitsserver + Voer een identiteitsserver URL in + Beleid + Gaat u akkoord met het verzenden van deze informatie\? + Om bestaande contacten te ontdekken, moet u contactgegevens (e-mailadressen en telefoonnummers) naar uw identiteitsserver sturen. We hashen uw gegevens voordat ze worden verzonden vanwege privacy. + Om bestaande contacten te ontdekken, moet u contactgegevens naar uw identiteitsserver sturen. +\n +\nWe hashen uw gegevens voordat ze worden verzonden vanwege privacy. Gaat u akkoord met het verzenden van deze informatie\? + Accepteert u om uw contactgegevens (telefoonnummers en/of e-mailadressen) naar de geconfigureerde identiteitsserver (%1$s) te sturen om bestaande contacten die u kent te ontdekken\? +\n +\nVoor meer privacy worden de verzonden gegevens gehasht voordat ze worden verzonden. + E-mailadressen en telefoonnummers verzenden + Stuur e-mailadressen en telefoonnummers naar %s + Toestemming geven + Mijn toestemming intrekken + Uw thuisserver-beleid + Kan geen thuisserver bereiken op de URL %s. Controleer uw link of kies handmatig een thuisserver. + Uw contacten zijn privé. Om gebruikers van uw contacten te ontdekken, hebben we uw toestemming nodig om contactgegevens naar uw identiteitsserver te sturen. + We hebben u een bevestigingsmail gestuurd naar %s, controleer eerst uw e-mail en klik op de bevestigingslink + We hebben u een bevestigingsmail gestuurd naar %s, controleer uw e-mail en klik op de bevestigingslink + Ontdekkingsopties verschijnen zodra u een e-mail heeft toegevoegd. + U gebruikt momenteel %1$s om te ontdekken en vindbaar te zijn voor bestaande contacten die u kent. + U bekijkt deze kamer al! + Er kan geen voorbeeld van deze kamer worden bekeken. Wilt u deelnemen\? + Deze kamer is op dit moment niet toegankelijk. +\nProbeer het later opnieuw of vraag een ruimtebeheerder om te controleren of u toegang heeft. + Verander uw avatar alleen in deze huidige kamer + Verander uw schermnaam alleen in de huidige kamer + Andere spaces of kamers die u misschien niet kent + Space die u kent die deze kamer bevat + Stel adressen in voor deze kamer zodat gebruikers deze kamer kunnen vinden via uw thuisserver (%1$s) + U kunt dit op elk moment uitschakelen in de instellingen + U krijgt geen meldingen voor vermeldingen en trefwoorden in versleutelde kamers op uw mobiel. + Zorg ervoor dat u op de link heeft geklikt in de e-mail die we u hebben gestuurd. + U heeft geen toestemming gegeven om e-mails en telefoonnummers naar deze identiteitsserver te sturen om andere gebruikers van uw contacten te ontdekken. + U hebt uw toestemming gegeven om e-mails en telefoonnummers naar deze identiteitsserver te sturen om andere gebruikers van uw contacten te ontdekken. + E-mails en telefoonnummers verzenden + Vindbare telefoonnummers + Als u de verbinding met uw identiteitsserver verbreekt, betekent dit dat u niet door andere gebruikers kan worden gevonden en dat u anderen niet per e-mail of telefoon kunt uitnodigen. + Ontdekkingsopties verschijnen zodra u een telefoonnummer heeft toegevoegd. + Vindbare e-mailadressen + U gebruikt momenteel geen identiteitsserver. Om te ontdekken en vindbaar te zijn door bestaande contacten die u kent, configureert u er een hieronder. + Geen beleid geleverd door de identiteitsserver + Identiteitsserverbeleid verbergen + Identiteitsserverbeleid weergeven + Identiteitsserver wijzigen + Ontdekkingsinstellingen openen + Identiteitsserver configureren + Identiteitsserver ontkoppelen + Gebruik bots, bruggen, widgets en stickerpakketten + Vindbaar zijn voor anderen + Servicevoorwaarden + Bekijken Bewerken Geschiedenis + Bekende gebruikers + Filter op gebruikersnaam of ID… + Begin met typen om resultaten te krijgen + Geen resultaat gevonden, gebruik Toevoegen via matrix-ID om op de server te zoeken. + Toevoegen via matrix ID + QR-code + Toevoegen via QR-code + Link gekopieerd naar klembord + Voeg een speciaal tabblad toe voor ongelezen meldingen op het hoofdscherm. + Schakel vegen in om te antwoorden in de tijdlijn + Zoeknaam + Zoeken op naam, ID of e-mail + Naam of ID (#voorbeeld:matrix.org) + Bekijk de kamer directory + Een nieuw privébericht verzenden + Creëer een nieuwe kamer + Kunt u niet vinden wat u zoekt\? + Geen bewerkingen gevonden + Bestand %1$s is gedownload! + Bestand %1$s downloaden… + Video comprimeren %d%% + Afbeelding comprimeren… + Bestand verzenden (%1$s / %2$s) + Miniatuur verzenden (%1$s / %2$s) + Toon volledige geschiedenis in versleutelde kamers + Toon verborgen gebeurtenissen op de tijdlijn + Geef feedback + De feedback kan niet worden verzonden (%s) + Bedankt, uw feedback is succesvol verzonden + U kunt contact met mij opnemen als u vervolgvragen heeft + U gebruikt een bètaversie van spaces. Uw feedback zal helpen bij het informeren van de volgende versies. Uw platform en gebruikersnaam worden genoteerd om ons te helpen uw feedback zoveel mogelijk te gebruiken. + Spaces feedback + De suggestie kan niet worden verzonden (%s) + Bedankt, de suggestie is succesvol verzonden + Beschrijf hier uw suggestie + Schrijf hieronder uw suggestie. + Doe een suggestie + Systeem instellingen + Versies + Hulp bij het gebruik van Element + Hulp en ondersteuning + Hulp + Juridisch + Hulp & Over + Spraak en video + Geen geregistreerde push-gateways + Geen push-regels gedefinieerd + Beveiliging en privacy + Andere kennisgevingen van derden + Matrix SDK Versie + Importeer e2e-sleutels uit bestand \"%1$s\". + Er is een fout opgetreden bij het ophalen van back-upgegevens van sleutels + Er is een fout opgetreden bij het ophalen van vertrouwensinformatie + De kamer is aangemaakt, maar sommige uitnodigingen zijn om de volgende reden niet verzonden: +\n +\n%s + Publiceer deze kamer in de kamerdirectory + Kameronderwerp (optioneel) + Creëer nieuwe Space + Toon een aanduiding voor verwijderde berichten + Toon verwijderde berichten + Beveiligde back-up instellen + Beveiliging tegen verlies van toegang tot versleutelde berichten en gegevens + De herstelsleutel is opgeslagen. + Toont informatie over een gebruiker + Verandert de avatar van de huidige kamer + Stelt de kamernaam in + Stopt met het negeren van een gebruiker, toon hun berichten in de toekomst + Negeer een gebruiker en verberg hun berichten voor jou + Geen actieve widgets + De huidige conferentie verlaten en naar de andere overschakelen\? + Sorry, er is een fout opgetreden bij het deelnemen aan de conferentie + %1$s: %2$s %3$s + %1$s en %2$s + %1$s in %2$s en %3$s + Deze server is al aanwezig in de lijst + Kan deze server of de kamerlijst niet vinden + Voer de naam in van een nieuwe server die u wilt verkennen. + Een nieuwe server toevoegen + Uw server + + Sleutel %1$d/%2$d geïmporteerd met succes. + %1$d/%2$d sleutels met succes geïmporteerd. + + Sleutels succesvol geëxporteerd + Kamer versie + + %d verbannen gebruiker + %d verbannen gebruikers + + Bepaal wie deze ruimte kan vinden en er lid van kan worden. + Tik om spaces te bewerken + Selecteer spaces + Bepaal welke spaces toegang hebben tot deze ruimte. Als een spaces is geselecteerd, kunnen de leden de naam van de ruimte vinden en er lid van worden. + Spaces die toegang hebben + Sta leden van de ruimte toe om te vinden en toegang te krijgen. + Leden van Space %s kunnen vinden, bekijken en lid worden. + Iedereen in een space met deze ruimte kan de ruimte vinden en eraan deelnemen. Alleen beheerders van deze ruimte kunnen deze toevoegen aan een space. + Alleen spaceleden + Iedereen kan de space vinden en meedoen + Iedereen kan de kamer vinden en meedoen + Alleen uitgenodigde mensen kunnen vinden en deelnemen + Privé (alleen op uitnodiging) + Onbekende toegangsinstelling (%s) + Iedereen kan bij deze kamer aankloppen, leden kunnen dan accepteren of weigeren + Kan de zichtbaarheid van de huidige kamerdirectory niet ophalen (%1$s). + Deze kamer openbaar publiceren in de kamerdirectory van %1$s\? + Publicatie van dit adres ongedaan maken + Dit adres publiceren + Voeg een lokaal adres toe + Deze kamer heeft geen lokale adressen + Lokale adressen + Nieuw gepubliceerd adres (bijv. #alias:server) + Nog geen andere gepubliceerde adressen. + Nog geen andere gepubliceerde adressen, voeg er hieronder een toe. + Deze kamer openbaar publiceren in de kamerdirectory van %1$s\? + Het adres \"%1$s\" verwijderen\? + De publicatie van het adres \"%1$s\" ongedaan maken\? + Een nieuw adres handmatig publiceren + Andere gepubliceerde adressen: + Hoofdadres + Dit is het hoofdadres + Gepubliceerde adressen kunnen door iedereen op elke server worden gebruikt om lid te worden van uw kamer. Om een adres te publiceren, moet het eerst als lokaal adres worden ingesteld. + Gepubliceerde adressen + Kameradressen + Adressen van deze ruimte bekijken en beheren. + Spaceadressen + Bekijk en beheer de adressen van deze kamer en de zichtbaarheid ervan in de kamerdirectory. + Kameradressen + Sta toe om gasten te laten deelnemen + Space toegang + Kamer toegang + Wie heeft toegang\? + Wijzigingen in wie geschiedenis kan lezen, zijn alleen van toepassing op toekomstige berichten in deze chatruimte. De zichtbaarheid van de bestaande historie blijft ongewijzigd. + Account instellingen + U kunt meldingen beheren in %1$s. + Houd er rekening mee dat vermeldingen en trefwoordmeldingen niet beschikbaar zijn in versleutelde kamers op mobiel. + Informeer mij voor + Beheer e-mailadressen en telefoonnummers die aan uw Matrix-account zijn gekoppeld + E-mailadressen en telefoonnummers + Schakel hiervoor \'Integraties toestaan\' in bij Instellingen. + Integraties zijn uitgeschakeld + Deze server biedt geen beleid. + Bibliotheken van derden + Uw identiteitsserverbeleid + ${app_name} beleid + We delen geen informatie met derden + We registreren of profileren geen accountgegevens + hier + Help ons problemen te identificeren en Element te verbeteren door anonieme gebruiksgegevens te delen. Om inzicht te krijgen in hoe mensen meerdere apparaten gebruiken, genereren we een willekeurige identificatie die door uw apparaten wordt gedeeld. +\n +\nU kunt al onze voorwaarden %s lezen. + Help Element verbeteren + Dit zal uw huidige sleutel of zin vervangen. + Genereer een nieuwe beveiligingssleutel of stel een nieuwe beveiligingszin in voor uw bestaande back-up. + Bescherm uzelf tegen verlies van toegang tot versleutelde berichten en gegevens door een back-up te maken van versleutelingssleutels op uw server. + Instellen op dit apparaat + Beveiligde back-up resetten + Beveiligde back-up instellen + Voeg een knop toe aan de invoerveld om het emoji-toetsenbord te openen + Emoji-toetsenbord weergeven + Inclusief uitnodiging/deelnemen/links/kick/ban-evenementen en wijzigingen van avatar/weergavenaam. + Gebruik /confetti commando of stuur een bericht met ❄️ of 🎉 + Toon chateffecten + Toon kamer deelnemers event status + Kamer upgrades + Berichten door bot + Kameruitnodigingen + Versleutelde groepsberichten + Groepsberichten + Versleutelde directe berichten + Directe berichten + Mijn gebruikersnaam + Mijn weergavenaam + Berichten bevatten @room + Wanneer kamers worden opgewaardeerd + Versleutelde berichten in groepsgesprekken + Versleutelde berichten in één-op-één gesprekken + Er is op de melding geklikt! + Klik op de melding. Als u de melding niet ziet, controleer dan de systeeminstellingen. + U bekijkt de melding! Klik hier! + Kan push niet ontvangen. Oplossing zou kunnen zijn om de applicatie opnieuw te installeren. + De applicatie ontvangt PUSH + De applicatie wacht op de PUSH + Trefwoorden mogen \'%s\' niet bevatten + Trefwoorden mogen niet beginnen met \'.\' + Nieuw trefwoord toevoegen + Uw trefwoorden + Breng me op de hoogte voor + Vermeldingen en trefwoorden + Standaardmeldingen + E-mailmeldingen inschakelen voor %s + Om e-mail met melding te ontvangen, koppelt u een e-mail aan uw Matrix-account + E-mail notificatie + Er is geen e-mailadres toegevoegd aan uw account + Er is geen telefoonnummer toegevoegd aan uw account + De sessie is afgemeld! + De kamer is verlaten! + Alleen vermeldingen en trefwoorden + Zoeken in versleutelde kamers wordt nog niet ondersteund. + Filter verbannen gebruikers + Verander onderwerp + Space upgraden + Ruimte upgraden + Verstuur m.room.server_acl berichten + Rechten wijzigen + Space naam wijzigen + Kamer naam wijzigen + Zichtbaarheid van geschiedenis wijzigen + Spaceversleuteling inschakelen + Kamerversleuteling inschakelen + Wijzig hoofdadres van de space + Wijzig hoofdadres van de kamer + Ruimte afbeelding verwijderen + Kamer afbeelding veranderen + Widgets wijzigen + Iedereen informeren + Berichten verwijderen die door anderen zijn verzonden + Gebruikers verbannen + Kick gebruikers + Instellingen veranderen + Gebruikers uitnodigen + Berichten sturen + Standaardrol + U bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van deze ruimte te wijzigen + U bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van de ruimte te wijzigen + Selecteer de rollen die nodig zijn om verschillende delen van deze ruimte te wijzigen + Selecteer de rollen die nodig zijn om verschillende delen van de kamer te veranderen + Bekijk en update de rollen die nodig zijn om verschillende delen van de ruimte te veranderen. + Bekijk en update de rollen die nodig zijn om verschillende delen van de ruimte te veranderen. + Kies thuisserver + Niet nu + Inschakelen + Luisteren naar notificaties + U mag niet deelnemen aan deze kamer \ No newline at end of file From b9b2dd420fdcf692c04034ab1d6927e1622cc9bb Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Sat, 8 Jan 2022 21:39:39 +0000 Subject: [PATCH 30/56] Translated using Weblate (Slovak) Currently translated at 67.8% (1842 of 2713 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- vector/src/main/res/values-sk/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index e77cebf093..0b5bd00e15 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -2086,4 +2086,7 @@ Zásady Pokračovať Zúrivé trasenie + Iba ja + Riot je teraz Element! + Skontrolujte prosím svoj e-mail \ No newline at end of file From 636ed10d6e9973275c588b25ba2d3db08470975e Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Sat, 8 Jan 2022 13:21:43 +0000 Subject: [PATCH 31/56] Translated using Weblate (Slovak) Currently translated at 100.0% (43 of 43 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sk/ --- fastlane/metadata/android/sk/changelogs/40101000.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101010.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101020.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101030.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101040.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101050.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101060.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101070.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101080.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101090.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101100.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101110.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101120.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101130.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101140.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101150.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40101160.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40102000.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40102010.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103000.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103010.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103020.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103030.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103040.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103050.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/sk/changelogs/40103120.txt | 2 ++ 28 files changed, 56 insertions(+) create mode 100644 fastlane/metadata/android/sk/changelogs/40101000.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101010.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101020.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101030.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101040.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101050.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101060.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101070.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101080.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101090.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101100.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101110.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101120.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101130.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101140.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101150.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40101160.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40102000.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40102010.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103000.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103010.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103020.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103030.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103040.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103050.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/sk/changelogs/40103120.txt diff --git a/fastlane/metadata/android/sk/changelogs/40101000.txt b/fastlane/metadata/android/sk/changelogs/40101000.txt new file mode 100644 index 0000000000..5d267bd7dc --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Vylepšenie VoIP (audio a video hovory v priamych správach) a opravy chýb! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/sk/changelogs/40101010.txt b/fastlane/metadata/android/sk/changelogs/40101010.txt new file mode 100644 index 0000000000..164166fba8 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101010.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: zlepšenie výkonu a opravy chýb! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.1 diff --git a/fastlane/metadata/android/sk/changelogs/40101020.txt b/fastlane/metadata/android/sk/changelogs/40101020.txt new file mode 100644 index 0000000000..379db42cca --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101020.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: zlepšenie výkonu a opravy chýb! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.2 diff --git a/fastlane/metadata/android/sk/changelogs/40101030.txt b/fastlane/metadata/android/sk/changelogs/40101030.txt new file mode 100644 index 0000000000..b99ebb9e99 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101030.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: zlepšenie výkonu a opravy chýb! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.3 diff --git a/fastlane/metadata/android/sk/changelogs/40101040.txt b/fastlane/metadata/android/sk/changelogs/40101040.txt new file mode 100644 index 0000000000..884305c478 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101040.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: zlepšenie výkonu a opravy chýb! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.4 diff --git a/fastlane/metadata/android/sk/changelogs/40101050.txt b/fastlane/metadata/android/sk/changelogs/40101050.txt new file mode 100644 index 0000000000..22dc095371 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101050.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: rýchle opravy pre verziu 1.1.4 +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.5 diff --git a/fastlane/metadata/android/sk/changelogs/40101060.txt b/fastlane/metadata/android/sk/changelogs/40101060.txt new file mode 100644 index 0000000000..70ac5cad57 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101060.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: rýchle opravy pre verziu 1.1.5 +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.6 diff --git a/fastlane/metadata/android/sk/changelogs/40101070.txt b/fastlane/metadata/android/sk/changelogs/40101070.txt new file mode 100644 index 0000000000..87eccd8f45 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101070.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: beta podpora pre priestory Spaces. Kompresia videa pred odoslaním. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.7 diff --git a/fastlane/metadata/android/sk/changelogs/40101080.txt b/fastlane/metadata/android/sk/changelogs/40101080.txt new file mode 100644 index 0000000000..9484062b47 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101080.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: vylepšenie pre Priestory. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.8 diff --git a/fastlane/metadata/android/sk/changelogs/40101090.txt b/fastlane/metadata/android/sk/changelogs/40101090.txt new file mode 100644 index 0000000000..5778db23a9 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101090.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: pridanie podpory pre sieť gitter.im. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.9 diff --git a/fastlane/metadata/android/sk/changelogs/40101100.txt b/fastlane/metadata/android/sk/changelogs/40101100.txt new file mode 100644 index 0000000000..a23198c88b --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101100.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: aktualizácia témy a štýlu a nové funkcie pre priestory. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.10 diff --git a/fastlane/metadata/android/sk/changelogs/40101110.txt b/fastlane/metadata/android/sk/changelogs/40101110.txt new file mode 100644 index 0000000000..45a095f0a8 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101110.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: aktualizácia témy a štýlu a nové funkcie pre priestory (oprava chyby pre verziu 1.1.10) +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.11 diff --git a/fastlane/metadata/android/sk/changelogs/40101120.txt b/fastlane/metadata/android/sk/changelogs/40101120.txt new file mode 100644 index 0000000000..ba345c3150 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101120.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: aktualizácia témy a štýlu a oprava pádu po videohovore +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.12 diff --git a/fastlane/metadata/android/sk/changelogs/40101130.txt b/fastlane/metadata/android/sk/changelogs/40101130.txt new file mode 100644 index 0000000000..6daf3e789b --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101130.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: hlavne aktualizácia stability a opravy chýb. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.13 diff --git a/fastlane/metadata/android/sk/changelogs/40101140.txt b/fastlane/metadata/android/sk/changelogs/40101140.txt new file mode 100644 index 0000000000..c93fe1bb15 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101140.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: oprava problému so šifrovanými správami. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.14 diff --git a/fastlane/metadata/android/sk/changelogs/40101150.txt b/fastlane/metadata/android/sk/changelogs/40101150.txt new file mode 100644 index 0000000000..87256269ab --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101150.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: implementácia hlasových správ v rámci nastavení laboratórií. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/fastlane/metadata/android/sk/changelogs/40101160.txt b/fastlane/metadata/android/sk/changelogs/40101160.txt new file mode 100644 index 0000000000..5e12aab282 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40101160.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Oprava chyby pri odosielaní zašifrovanej správy, ak sa niekto v miestnosti odhlási. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.1.16 diff --git a/fastlane/metadata/android/sk/changelogs/40102000.txt b/fastlane/metadata/android/sk/changelogs/40102000.txt new file mode 100644 index 0000000000..4d0093469b --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Hlasová správa je predvolene povolená. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.2.0 diff --git a/fastlane/metadata/android/sk/changelogs/40102010.txt b/fastlane/metadata/android/sk/changelogs/40102010.txt new file mode 100644 index 0000000000..ac1cbc4509 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40102010.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Mnohé vylepšenia v oblasti VoIP a Priestorov (stále v beta verzii). +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.2.1 diff --git a/fastlane/metadata/android/sk/changelogs/40103000.txt b/fastlane/metadata/android/sk/changelogs/40103000.txt new file mode 100644 index 0000000000..2a669aa744 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103000.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Usporiadajte svoje miestnosti pomocou Priestorov! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.0 diff --git a/fastlane/metadata/android/sk/changelogs/40103010.txt b/fastlane/metadata/android/sk/changelogs/40103010.txt new file mode 100644 index 0000000000..3a12a5910e --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103010.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Usporiadajte svoje miestnosti pomocou Priestorov! Verzia v1.3.1 opravuje pád, ktorý sa môže vyskytnúť vo verzii v1.3.0. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.1 diff --git a/fastlane/metadata/android/sk/changelogs/40103020.txt b/fastlane/metadata/android/sk/changelogs/40103020.txt new file mode 100644 index 0000000000..96cefe73ed --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103020.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Pridanie podpory pre Android Auto. Množstvo opráv chýb! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.2 diff --git a/fastlane/metadata/android/sk/changelogs/40103030.txt b/fastlane/metadata/android/sk/changelogs/40103030.txt new file mode 100644 index 0000000000..a14dba2c9d --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103030.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Zviditeľnite zásad servera totožností v nastaveniach. Dočasne odstránenie podpory Android Auto. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.3 diff --git a/fastlane/metadata/android/sk/changelogs/40103040.txt b/fastlane/metadata/android/sk/changelogs/40103040.txt new file mode 100644 index 0000000000..e2e6a98b07 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103040.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Pridanie podpory prítomnosti pre miestnosť s priamymi správami (poznámka: prítomnosť je na matrix.org vypnutá). Opätovné pridanie podpory Android Auto. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.4 diff --git a/fastlane/metadata/android/sk/changelogs/40103050.txt b/fastlane/metadata/android/sk/changelogs/40103050.txt new file mode 100644 index 0000000000..f5cc73a4e2 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103050.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Pridanie podpory prítomnosti pre miestnosť s priamymi správami (poznámka: prítomnosť je na matrix.org vypnutá). Opätovné pridanie podpory Android Auto. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.5 diff --git a/fastlane/metadata/android/sk/changelogs/40103100.txt b/fastlane/metadata/android/sk/changelogs/40103100.txt new file mode 100644 index 0000000000..14a667c78d --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Pridanie podpory pre ankety (v laboratóriách). Nový dizajn náhľadu URL. +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/sk/changelogs/40103110.txt b/fastlane/metadata/android/sk/changelogs/40103110.txt new file mode 100644 index 0000000000..2c2ee1aa6d --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Opravy chýb! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/sk/changelogs/40103120.txt b/fastlane/metadata/android/sk/changelogs/40103120.txt new file mode 100644 index 0000000000..363e4aef24 --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Hlavné zmeny v tejto verzii: Opravy chýb! +Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From d373af6e5949ae32248597d44831f3b38f4540c0 Mon Sep 17 00:00:00 2001 From: Johan Smits Date: Sat, 8 Jan 2022 10:41:39 +0000 Subject: [PATCH 32/56] Translated using Weblate (Dutch) Currently translated at 18.6% (8 of 43 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/nl/ --- fastlane/metadata/android/nl/changelogs/40103070.txt | 2 ++ fastlane/metadata/android/nl/changelogs/40103080.txt | 2 ++ fastlane/metadata/android/nl/changelogs/40103090.txt | 2 ++ fastlane/metadata/android/nl/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/nl/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/nl/changelogs/40103120.txt | 2 ++ fastlane/metadata/android/nl/short_description.txt | 1 + fastlane/metadata/android/nl/title.txt | 1 + 8 files changed, 14 insertions(+) create mode 100644 fastlane/metadata/android/nl/changelogs/40103070.txt create mode 100644 fastlane/metadata/android/nl/changelogs/40103080.txt create mode 100644 fastlane/metadata/android/nl/changelogs/40103090.txt create mode 100644 fastlane/metadata/android/nl/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/nl/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/nl/changelogs/40103120.txt create mode 100644 fastlane/metadata/android/nl/short_description.txt create mode 100644 fastlane/metadata/android/nl/title.txt diff --git a/fastlane/metadata/android/nl/changelogs/40103070.txt b/fastlane/metadata/android/nl/changelogs/40103070.txt new file mode 100644 index 0000000000..c2496fa34d --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/40103070.txt @@ -0,0 +1,2 @@ +Belangrijkste wijzigingen in deze versie: Bugfixes voornamelijk met betrekking tot de meldingen. +Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.7-RC2 diff --git a/fastlane/metadata/android/nl/changelogs/40103080.txt b/fastlane/metadata/android/nl/changelogs/40103080.txt new file mode 100644 index 0000000000..8ed093a460 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/40103080.txt @@ -0,0 +1,2 @@ +Belangrijkste wijzigingen in deze versie: Bugfixes! +Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.8 diff --git a/fastlane/metadata/android/nl/changelogs/40103090.txt b/fastlane/metadata/android/nl/changelogs/40103090.txt new file mode 100644 index 0000000000..e4a7f63089 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/40103090.txt @@ -0,0 +1,2 @@ +Belangrijkste wijzigingen in deze versie: Ondersteuning toevoegen voor spraakberichtconcept. Veel bugfixes! +Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.9 diff --git a/fastlane/metadata/android/nl/changelogs/40103100.txt b/fastlane/metadata/android/nl/changelogs/40103100.txt new file mode 100644 index 0000000000..883c656577 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Belangrijkste wijzigingen in deze versie: Ondersteuning toevoegen voor polls (in labs). Nieuw URL-voorbeeldontwerp. +Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/nl/changelogs/40103110.txt b/fastlane/metadata/android/nl/changelogs/40103110.txt new file mode 100644 index 0000000000..ae1685270b --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Belangrijkste wijzigingen in deze versie: Bugfixes! +Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/nl/changelogs/40103120.txt b/fastlane/metadata/android/nl/changelogs/40103120.txt new file mode 100644 index 0000000000..39d3f5fb43 --- /dev/null +++ b/fastlane/metadata/android/nl/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Belangrijkste wijzigingen in deze versie: Bugfixes! +Volledige changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.12 diff --git a/fastlane/metadata/android/nl/short_description.txt b/fastlane/metadata/android/nl/short_description.txt new file mode 100644 index 0000000000..107e30f48d --- /dev/null +++ b/fastlane/metadata/android/nl/short_description.txt @@ -0,0 +1 @@ +Groepsberichten - versleutelde berichten, groepschat en videogesprekken diff --git a/fastlane/metadata/android/nl/title.txt b/fastlane/metadata/android/nl/title.txt new file mode 100644 index 0000000000..7b5a887213 --- /dev/null +++ b/fastlane/metadata/android/nl/title.txt @@ -0,0 +1 @@ +Element - Veilige Berichten From 6a34b999f2879c9f4ef8ba61caf349d9521687ff Mon Sep 17 00:00:00 2001 From: Valere Date: Fri, 22 Oct 2021 18:09:11 +0200 Subject: [PATCH 33/56] New SDK Api for to device and event stream listener --- .../sdk/api/session/EventStreamService.kt | 24 ++++ .../sdk/api/session/LiveEventListener.kt | 35 ++++++ .../matrix/android/sdk/api/session/Session.kt | 4 +- .../sdk/api/session/ToDeviceService.kt | 37 +++++++ .../internal/crypto/DefaultCryptoService.kt | 5 +- .../algorithms/megolm/MXMegolmDecryption.kt | 10 +- .../megolm/MXMegolmDecryptionFactory.kt | 8 +- .../session/DefaultEventStreamService.kt | 34 ++++++ .../sdk/internal/session/DefaultSession.kt | 8 +- .../session/DefaultToDeviceService.kt | 74 +++++++++++++ .../sdk/internal/session/SessionModule.kt | 8 ++ .../internal/session/StreamEventsManager.kt | 103 ++++++++++++++++++ .../room/timeline/TokenChunkEventPersistor.kt | 9 +- .../sync/handler/room/RoomSyncHandler.kt | 6 +- 14 files changed, 354 insertions(+), 11 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/EventStreamService.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/LiveEventListener.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/ToDeviceService.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultEventStreamService.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/EventStreamService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/EventStreamService.kt new file mode 100644 index 0000000000..a1316a5444 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/EventStreamService.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.api.session + +interface EventStreamService { + + fun addEventStreamListener(streamListener: LiveEventListener) + + fun removeEventStreamListener(streamListener: LiveEventListener) +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/LiveEventListener.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/LiveEventListener.kt new file mode 100644 index 0000000000..6fda65953a --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/LiveEventListener.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.api.session + +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.util.JsonDict + +interface LiveEventListener { + + fun onLiveEvent(roomId: String, event: Event) + + fun onPaginatedEvent(roomId: String, event: Event) + + fun onEventDecrypted(eventId: String, roomId: String, clearEvent: JsonDict) + + fun onEventDecryptionError(eventId: String, roomId: String, throwable: Throwable) + + fun onLiveToDeviceEvent(event: Event) + + // Maybe later add more, like onJoin, onLeave.. +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt index 3f817ec4d2..36ab007314 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt @@ -84,7 +84,9 @@ interface Session : SyncStatusService, HomeServerCapabilitiesService, SecureStorageService, - AccountService { + AccountService, + ToDeviceService, + EventStreamService { val coroutineDispatchers: MatrixCoroutineDispatchers diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/ToDeviceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/ToDeviceService.kt new file mode 100644 index 0000000000..45fd39fa95 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/ToDeviceService.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.api.session + +import org.matrix.android.sdk.api.session.events.model.Content +import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap +import java.util.UUID + +interface ToDeviceService { + + /** + * Send an event to a specific list of devices + */ + suspend fun sendToDevice(eventType: String, contentMap: MXUsersDevicesMap, txnId: String? = UUID.randomUUID().toString()) + + suspend fun sendToDevice(eventType: String, userId: String, deviceId: String, content: Content, txnId: String? = UUID.randomUUID().toString()) { + sendToDevice(eventType, mapOf(userId to listOf(deviceId)), content, txnId) + } + + suspend fun sendToDevice(eventType: String, targets: Map>, content: Content, txnId: String? = UUID.randomUUID().toString()) + + suspend fun sendEncryptedToDevice(eventType: String, targets: Map>, content: Content, txnId: String? = UUID.randomUUID().toString()) +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt index 9dd369f426..00cd278921 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt @@ -90,6 +90,7 @@ import org.matrix.android.sdk.internal.di.MoshiProvider import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.extensions.foldToCallback import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.session.StreamEventsManager import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.TaskThread @@ -168,7 +169,8 @@ internal class DefaultCryptoService @Inject constructor( private val coroutineDispatchers: MatrixCoroutineDispatchers, private val taskExecutor: TaskExecutor, private val cryptoCoroutineScope: CoroutineScope, - private val eventDecryptor: EventDecryptor + private val eventDecryptor: EventDecryptor, + private val liveEventManager: Lazy ) : CryptoService { private val isStarting = AtomicBoolean(false) @@ -782,6 +784,7 @@ internal class DefaultCryptoService @Inject constructor( } } } + liveEventManager.get().dispatchOnLiveToDevice(event) } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt index ceceedc802..2ee24dfbb0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryption.kt @@ -16,6 +16,7 @@ package org.matrix.android.sdk.internal.crypto.algorithms.megolm +import dagger.Lazy import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.matrix.android.sdk.api.MatrixCoroutineDispatchers @@ -43,6 +44,7 @@ import org.matrix.android.sdk.internal.crypto.model.rest.ForwardedRoomKeyContent import org.matrix.android.sdk.internal.crypto.model.rest.RoomKeyRequestBody import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask +import org.matrix.android.sdk.internal.session.StreamEventsManager import timber.log.Timber private val loggerTag = LoggerTag("MXMegolmDecryption", LoggerTag.CRYPTO) @@ -56,7 +58,8 @@ internal class MXMegolmDecryption(private val userId: String, private val cryptoStore: IMXCryptoStore, private val sendToDeviceTask: SendToDeviceTask, private val coroutineDispatchers: MatrixCoroutineDispatchers, - private val cryptoCoroutineScope: CoroutineScope + private val cryptoCoroutineScope: CoroutineScope, + private val liveEventManager: Lazy ) : IMXDecrypting, IMXWithHeldExtension { var newSessionListener: NewSessionListener? = null @@ -108,12 +111,15 @@ internal class MXMegolmDecryption(private val userId: String, claimedEd25519Key = olmDecryptionResult.keysClaimed?.get("ed25519"), forwardingCurve25519KeyChain = olmDecryptionResult.forwardingCurve25519KeyChain .orEmpty() - ) + ).also { + liveEventManager.get().dispatchLiveEventDecrypted(event, it) + } } else { throw MXCryptoError.Base(MXCryptoError.ErrorType.MISSING_FIELDS, MXCryptoError.MISSING_FIELDS_REASON) } }, { throwable -> + liveEventManager.get().dispatchLiveEventDecryptionFailed(event, throwable) if (throwable is MXCryptoError.OlmError) { // TODO Check the value of .message if (throwable.olmException.message == "UNKNOWN_MESSAGE_INDEX") { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryptionFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryptionFactory.kt index 29f9d193f8..3eba04b9f1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryptionFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmDecryptionFactory.kt @@ -16,6 +16,7 @@ package org.matrix.android.sdk.internal.crypto.algorithms.megolm +import dagger.Lazy import kotlinx.coroutines.CoroutineScope import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.internal.crypto.DeviceListManager @@ -26,6 +27,7 @@ import org.matrix.android.sdk.internal.crypto.actions.MessageEncrypter import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask import org.matrix.android.sdk.internal.di.UserId +import org.matrix.android.sdk.internal.session.StreamEventsManager import javax.inject.Inject internal class MXMegolmDecryptionFactory @Inject constructor( @@ -38,7 +40,8 @@ internal class MXMegolmDecryptionFactory @Inject constructor( private val cryptoStore: IMXCryptoStore, private val sendToDeviceTask: SendToDeviceTask, private val coroutineDispatchers: MatrixCoroutineDispatchers, - private val cryptoCoroutineScope: CoroutineScope + private val cryptoCoroutineScope: CoroutineScope, + private val eventsManager: Lazy ) { fun create(): MXMegolmDecryption { @@ -52,6 +55,7 @@ internal class MXMegolmDecryptionFactory @Inject constructor( cryptoStore, sendToDeviceTask, coroutineDispatchers, - cryptoCoroutineScope) + cryptoCoroutineScope, + eventsManager) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultEventStreamService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultEventStreamService.kt new file mode 100644 index 0000000000..ed21e9f1c6 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultEventStreamService.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session + +import org.matrix.android.sdk.api.session.EventStreamService +import org.matrix.android.sdk.api.session.LiveEventListener +import javax.inject.Inject + +internal class DefaultEventStreamService @Inject constructor( + private val streamEventsManager: StreamEventsManager +) : EventStreamService { + + override fun addEventStreamListener(streamListener: LiveEventListener) { + streamEventsManager.addLiveEventListener(streamListener) + } + + override fun removeEventStreamListener(streamListener: LiveEventListener) { + streamEventsManager.removeLiveEventListener(streamListener) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index c07ff48cf4..1e533158a7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -27,8 +27,10 @@ import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.failure.GlobalError import org.matrix.android.sdk.api.federation.FederationService import org.matrix.android.sdk.api.pushrules.PushRuleService +import org.matrix.android.sdk.api.session.EventStreamService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.SessionLifecycleObserver +import org.matrix.android.sdk.api.session.ToDeviceService import org.matrix.android.sdk.api.session.account.AccountService import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.cache.CacheService @@ -133,6 +135,8 @@ internal class DefaultSession @Inject constructor( private val spaceService: Lazy, private val openIdService: Lazy, private val presenceService: Lazy, + private val toDeviceService: Lazy, + private val eventStreamService: Lazy, @UnauthenticatedWithCertificate private val unauthenticatedWithCertificateOkHttpClient: Lazy ) : Session, @@ -152,7 +156,9 @@ internal class DefaultSession @Inject constructor( HomeServerCapabilitiesService by homeServerCapabilitiesService.get(), ProfileService by profileService.get(), PresenceService by presenceService.get(), - AccountService by accountService.get() { + AccountService by accountService.get(), + ToDeviceService by toDeviceService.get(), + EventStreamService by eventStreamService.get() { override val sharedSecretStorageService: SharedSecretStorageService get() = _sharedSecretStorageService.get() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt new file mode 100644 index 0000000000..5bdb969113 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session + +import org.matrix.android.sdk.api.session.ToDeviceService +import org.matrix.android.sdk.api.session.events.model.Content +import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.internal.crypto.actions.MessageEncrypter +import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap +import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore +import org.matrix.android.sdk.internal.crypto.tasks.DefaultSendToDeviceTask +import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask +import javax.inject.Inject + +internal class DefaultToDeviceService @Inject constructor( + private val sendToDeviceTask: DefaultSendToDeviceTask, + private val messageEncrypter: MessageEncrypter, + private val cryptoStore: IMXCryptoStore +) : ToDeviceService { + + override suspend fun sendToDevice(eventType: String, targets: Map>, content: Content, txnId: String?) { + val sendToDeviceMap = MXUsersDevicesMap() + targets.forEach { (userId, deviceIdList) -> + deviceIdList.forEach { deviceId -> + sendToDeviceMap.setObject(userId, deviceId, content) + } + } + sendToDevice(eventType, sendToDeviceMap, txnId) + } + + override suspend fun sendToDevice(eventType: String, contentMap: MXUsersDevicesMap, txnId: String?) { + sendToDeviceTask.executeRetry( + SendToDeviceTask.Params( + eventType = eventType, + contentMap = contentMap, + transactionId = txnId + ), + 3 + ) + } + + override suspend fun sendEncryptedToDevice(eventType: String, targets: Map>, content: Content, txnId: String?) { + val payloadJson = mapOf( + "type" to eventType, + "content" to content + ) + val sendToDeviceMap = MXUsersDevicesMap() + + // Should I do an ensure olm session? + targets.forEach { (userId, deviceIdList) -> + deviceIdList.forEach { deviceId -> + cryptoStore.getUserDevice(userId, deviceId)?.let { deviceInfo -> + sendToDeviceMap.setObject(userId, deviceId, messageEncrypter.encryptMessage(payloadJson, listOf(deviceInfo))) + } + } + } + + sendToDevice(EventType.ENCRYPTED, sendToDeviceMap, txnId) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt index e2cfea479d..cf6ff4a872 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt @@ -32,8 +32,10 @@ import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.auth.data.sessionId import org.matrix.android.sdk.api.crypto.MXCryptoConfig +import org.matrix.android.sdk.api.session.EventStreamService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.SessionLifecycleObserver +import org.matrix.android.sdk.api.session.ToDeviceService import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService import org.matrix.android.sdk.api.session.events.EventService import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService @@ -382,4 +384,10 @@ internal abstract class SessionModule { @Binds abstract fun bindEventSenderProcessor(processor: EventSenderProcessorCoroutine): EventSenderProcessor + + @Binds + abstract fun bindToDeviceService(deviceService: DefaultToDeviceService): ToDeviceService + + @Binds + abstract fun bindEventStreamService(deviceService: DefaultEventStreamService): EventStreamService } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt new file mode 100644 index 0000000000..c39f5fded8 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt @@ -0,0 +1,103 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * 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 org.matrix.android.sdk.internal.session + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.session.LiveEventListener +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.internal.crypto.MXEventDecryptionResult +import timber.log.Timber +import javax.inject.Inject + +@SessionScope +internal class StreamEventsManager @Inject constructor() { + + private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + + private val listeners = mutableListOf() + + fun addLiveEventListener(listener: LiveEventListener) { + Timber.v("## VALR: addLiveEventListener") + listeners.add(listener) + } + + fun removeLiveEventListener(listener: LiveEventListener) { + Timber.v("## VALR: removeLiveEventListener") + listeners.remove(listener) + } + + fun dispatchLiveEventReceived(event: Event, roomId: String, initialSync: Boolean) { + Timber.v("## VALR: dispatchLiveEventReceived ${event.eventId}") + coroutineScope.launch { + if (!initialSync) { + listeners.forEach { + tryOrNull { + it.onLiveEvent(roomId, event) + } + } + } + } + } + + fun dispatchPaginatedEventReceived(event: Event, roomId: String) { + Timber.v("## VALR: dispatchPaginatedEventReceived ${event.eventId}") + coroutineScope.launch { + listeners.forEach { + tryOrNull { + it.onPaginatedEvent(roomId, event) + } + } + } + } + + fun dispatchLiveEventDecrypted(event: Event, result: MXEventDecryptionResult) { + Timber.v("## VALR: dispatchLiveEventDecrypted ${event.eventId}") + coroutineScope.launch { + listeners.forEach { + tryOrNull { + it.onEventDecrypted(event.eventId ?: "", event.roomId ?: "", result.clearEvent) + } + } + } + } + + fun dispatchLiveEventDecryptionFailed(event: Event, error: Throwable) { + Timber.v("## VALR: dispatchLiveEventDecryptionFailed ${event.eventId}") + coroutineScope.launch { + listeners.forEach { + tryOrNull { + it.onEventDecryptionError(event.eventId ?: "", event.roomId ?: "", error) + } + } + } + } + + fun dispatchOnLiveToDevice(event: Event) { + Timber.v("## VALR: dispatchOnLiveToDevice ${event.eventId}") + coroutineScope.launch { + listeners.forEach { + tryOrNull { + it.onLiveToDeviceEvent(event) + } + } + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt index 4625155c0a..62e3896ac5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt @@ -17,12 +17,12 @@ package org.matrix.android.sdk.internal.session.room.timeline import com.zhuinden.monarchy.Monarchy +import dagger.Lazy import io.realm.Realm import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.api.session.room.send.SendState -import org.matrix.android.sdk.internal.database.helper.addIfNecessary import org.matrix.android.sdk.internal.database.helper.addStateEvent import org.matrix.android.sdk.internal.database.helper.addTimelineEvent import org.matrix.android.sdk.internal.database.mapper.toEntity @@ -35,14 +35,16 @@ import org.matrix.android.sdk.internal.database.query.create import org.matrix.android.sdk.internal.database.query.find import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.di.SessionDatabase -import org.matrix.android.sdk.internal.util.awaitTransaction +import org.matrix.android.sdk.internal.session.StreamEventsManager import timber.log.Timber import javax.inject.Inject /** * Insert Chunk in DB, and eventually link next and previous chunk in db. */ -internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase private val monarchy: Monarchy) { +internal class TokenChunkEventPersistor @Inject constructor( + @SessionDatabase private val monarchy: Monarchy, + private val liveEventManager: Lazy) { enum class Result { SHOULD_FETCH_MORE, @@ -170,6 +172,7 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri } roomMemberContentsByUser[event.stateKey] = contentToUse.toModel() } + liveEventManager.get().dispatchPaginatedEventReceived(event, roomId) currentChunk.addTimelineEvent(roomId, eventEntity, direction, roomMemberContentsByUser) } } 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 f090975cad..3fdfb473db 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 @@ -16,6 +16,7 @@ package org.matrix.android.sdk.internal.session.sync.handler.room +import dagger.Lazy import io.realm.Realm import io.realm.kotlin.createObject import org.matrix.android.sdk.api.session.crypto.MXCryptoError @@ -52,6 +53,7 @@ import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.di.MoshiProvider import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.extensions.clearWith +import org.matrix.android.sdk.internal.session.StreamEventsManager import org.matrix.android.sdk.internal.session.events.getFixedRoomMemberContent import org.matrix.android.sdk.internal.session.initsync.ProgressReporter import org.matrix.android.sdk.internal.session.initsync.mapWithProgress @@ -79,7 +81,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle private val threadsAwarenessHandler: ThreadsAwarenessHandler, private val roomChangeMembershipStateDataSource: RoomChangeMembershipStateDataSource, @UserId private val userId: String, - private val timelineInput: TimelineInput) { + private val timelineInput: TimelineInput, + private val liveEventService: Lazy) { sealed class HandlingStrategy { data class JOINED(val data: Map) : HandlingStrategy() @@ -364,6 +367,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle continue } eventIds.add(event.eventId) + liveEventService.get().dispatchLiveEventReceived(event, roomId, insertType == EventInsertType.INITIAL_SYNC) val isInitialSync = insertType == EventInsertType.INITIAL_SYNC From be119ea161c96567fc01d679a1a8a88097d461c5 Mon Sep 17 00:00:00 2001 From: Valere Date: Fri, 22 Oct 2021 18:10:27 +0200 Subject: [PATCH 34/56] Support for lab auto rageshake UISI --- .idea/dictionaries/bmarty.xml | 1 + .../main/java/im/vector/app/AutoRageShaker.kt | 204 ++++++++++++++++++ .../main/java/im/vector/app/UISIDetector.kt | 153 +++++++++++++ .../java/im/vector/app/VectorApplication.kt | 2 + .../features/rageshake/BugReportActivity.kt | 3 +- .../app/features/rageshake/BugReporter.kt | 40 +++- .../app/features/rageshake/ReportType.kt | 4 +- .../features/settings/VectorPreferences.kt | 7 +- .../settings/VectorSettingsLabsFragment.kt | 17 +- vector/src/main/res/values/strings.xml | 5 + .../src/main/res/xml/vector_settings_labs.xml | 11 +- 11 files changed, 430 insertions(+), 17 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/AutoRageShaker.kt create mode 100644 vector/src/main/java/im/vector/app/UISIDetector.kt diff --git a/.idea/dictionaries/bmarty.xml b/.idea/dictionaries/bmarty.xml index a2e408b50d..f99842f067 100644 --- a/.idea/dictionaries/bmarty.xml +++ b/.idea/dictionaries/bmarty.xml @@ -36,6 +36,7 @@ ssss sygnal threepid + uisi unpublish unwedging vctr diff --git a/vector/src/main/java/im/vector/app/AutoRageShaker.kt b/vector/src/main/java/im/vector/app/AutoRageShaker.kt new file mode 100644 index 0000000000..d11a24e38c --- /dev/null +++ b/vector/src/main/java/im/vector/app/AutoRageShaker.kt @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2021 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 + +import android.content.Context +import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.features.rageshake.BugReporter +import im.vector.app.features.rageshake.ReportType +import io.reactivex.disposables.Disposable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.events.model.toContent +import timber.log.Timber +import javax.inject.Inject +import javax.inject.Singleton + +const val AUTO_RS_REQUEST = "im.vector.auto_rs_request" + +@Singleton +class AutoRageShaker @Inject constructor( + private val sessionDataSource: ActiveSessionDataSource, + private val activeSessionHolder: ActiveSessionHolder, + private val bugReporter: BugReporter, + private val context: Context +) : Session.Listener { + + private lateinit var activeSessionDisposable: Disposable + private val activeSessionIds = mutableSetOf() + private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + private val uisiDetectors = mutableMapOf() + private var currentActiveSessionId: String? = null + + fun initialize() { + observeActiveSession() + } + + var _enabled = false + fun enable(enabled: Boolean) { + uisiDetectors.forEach { it.value.enabled = enabled } + } + + private fun observeActiveSession() { + activeSessionDisposable = sessionDataSource.observe() + .distinctUntilChanged() + .subscribe { + it.orNull()?.let { session -> + onSessionActive(session) + } + } + } + + fun decryptionErrorDetected(target: E2EMessageDetected) { + if (target.source == UISIEventSource.INITIAL_SYNC) return + if (activeSessionHolder.getSafeActiveSession()?.sessionId != currentActiveSessionId) return + coroutineScope.launch { + bugReporter.sendBugReport( + context = context, + reportType = ReportType.AUTO_UISI, + withDevicesLogs = true, + withCrashLogs = true, + withKeyRequestHistory = true, + withScreenshot = false, + theBugDescription = "UISI detected", + serverVersion = "", + canContact = false, + customFields = mapOf("auto-uisi" to buildString { + append("\neventId: ${target.eventId}") + append("\nroomId: ${target.roomId}") + append("\nsenderKey: ${target.senderKey}") + append("\nsource: ${target.source}") + append("\ndeviceId: ${target.senderDeviceId}") + append("\nuserId: ${target.senderUserId}") + append("\nsessionId: ${target.sessionId}") + }), + listener = object : BugReporter.IMXBugReportListener { + override fun onUploadCancelled() { + } + + override fun onUploadFailed(reason: String?) { + } + + override fun onProgress(progress: Int) { + } + + override fun onUploadSucceed(reportUrl: String?) { + Timber.w("## VALR Report URL is $reportUrl") + // we need to send the toDevice message to the sender + + coroutineScope.launch { + try { + activeSessionHolder.getSafeActiveSession()?.sendToDevice( + eventType = AUTO_RS_REQUEST, + userId = target.senderUserId, + deviceId = target.senderDeviceId, + content = mapOf( + "event_id" to target.eventId, + "room_id" to target.roomId, + "session_id" to target.sessionId, + "device_id" to target.senderDeviceId, + "user_id" to target.senderUserId, + "sender_key" to target.senderKey, + "matching_issue" to reportUrl + ).toContent() + ) + } catch (failure: Throwable) { + Timber.w("## VALR : failed to send auto-uisi to device") + } + } + } + }) + } + } + + fun remoteAutoUISIRequest(event: Event) { + if (event.type != AUTO_RS_REQUEST) return + if (activeSessionHolder.getSafeActiveSession()?.sessionId != currentActiveSessionId) return + + coroutineScope.launch { + val eventId = event.content?.get("event_id") + val roomId = event.content?.get("room_id") + val sessionId = event.content?.get("session_id") + val deviceId = event.content?.get("device_id") + val userId = event.content?.get("user_id") + val senderKey = event.content?.get("sender_key") + val matchingIssue = event.content?.get("matching_issue")?.toString() ?: "" + + bugReporter.sendBugReport( + context = context, + reportType = ReportType.AUTO_UISI_SENDER, + withDevicesLogs = true, + withCrashLogs = true, + withKeyRequestHistory = true, + withScreenshot = false, + theBugDescription = "UISI detected $matchingIssue", + serverVersion = "", + canContact = false, + customFields = mapOf( + "auto-uisi" to buildString { + append("\neventId: $eventId") + append("\nroomId: $roomId") + append("\nsenderKey: $senderKey") + append("\ndeviceId: $deviceId") + append("\nuserId: $userId") + append("\nsessionId: $sessionId") + }, + "matching_issue" to matchingIssue + ), + listener = null + ) + } + } + + private val detector = UISIDetector().apply { + callback = object : UISIDetector.UISIDetectorCallback { + override val reciprocateToDeviceEventType: String + get() = AUTO_RS_REQUEST + + override fun uisiDetected(source: E2EMessageDetected) { + decryptionErrorDetected(source) + } + + override fun uisiReciprocateRequest(source: Event) { + remoteAutoUISIRequest(source) + } + } + } + + fun onSessionActive(session: Session) { + val sessionId = session.sessionId + if (sessionId == currentActiveSessionId) { + return + } + this.currentActiveSessionId = sessionId + this.detector.enabled = _enabled + activeSessionIds.add(sessionId) + session.addListener(this) + session.addEventStreamListener(detector) + } + + override fun onSessionStopped(session: Session) { + uisiDetectors.get(session.sessionId)?.let { + session.removeEventStreamListener(it) + } + activeSessionIds.remove(session.sessionId) + } +} diff --git a/vector/src/main/java/im/vector/app/UISIDetector.kt b/vector/src/main/java/im/vector/app/UISIDetector.kt new file mode 100644 index 0000000000..e12bd7adeb --- /dev/null +++ b/vector/src/main/java/im/vector/app/UISIDetector.kt @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2021 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 + +import org.matrix.android.sdk.api.session.LiveEventListener +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.util.JsonDict +import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent +import timber.log.Timber +import java.util.Timer +import java.util.TimerTask +import java.util.concurrent.Executors + +enum class UISIEventSource { + INITIAL_SYNC, + INCREMENTAL_SYNC, + PAGINATION +} + +data class E2EMessageDetected( + val eventId: String, + val roomId: String, + val senderUserId: String, + val senderDeviceId: String, + val senderKey: String, + val sessionId: String, + val source: UISIEventSource) { + + companion object { + fun fromEvent(event: Event, roomId: String, source: UISIEventSource): E2EMessageDetected { + val encryptedContent = event.content.toModel() + + return E2EMessageDetected( + eventId = event.eventId ?: "", + roomId = roomId, + senderUserId = event.senderId ?: "", + senderDeviceId = encryptedContent?.deviceId ?: "", + senderKey = encryptedContent?.senderKey ?: "", + sessionId = encryptedContent?.sessionId ?: "", + source = source + ) + } + } +} + +class UISIDetector : LiveEventListener { + + interface UISIDetectorCallback { + val reciprocateToDeviceEventType: String + fun uisiDetected(source: E2EMessageDetected) + fun uisiReciprocateRequest(source: Event) + } + + var callback: UISIDetectorCallback? = null + + private val trackedEvents = mutableListOf>() + private val executor = Executors.newSingleThreadExecutor() + private val timer = Timer() + private val timeoutMillis = 30_000L + var enabled = false + + override fun onLiveEvent(roomId: String, event: Event) { + if (!event.isEncrypted()) return + executor.execute { + handleEventReceived(E2EMessageDetected.fromEvent(event, roomId, UISIEventSource.INCREMENTAL_SYNC)) + } + } + + override fun onPaginatedEvent(roomId: String, event: Event) { + if (!event.isEncrypted()) return + executor.execute { + handleEventReceived(E2EMessageDetected.fromEvent(event, roomId, UISIEventSource.PAGINATION)) + } + } + + override fun onEventDecrypted(eventId: String, roomId: String, clearEvent: JsonDict) { + executor.execute { + unTrack(eventId, roomId) + } + } + + override fun onLiveToDeviceEvent(event: Event) { + if (event.type == callback?.reciprocateToDeviceEventType) { + callback?.uisiReciprocateRequest(event) + } + } + + override fun onEventDecryptionError(eventId: String, roomId: String, throwable: Throwable) { + executor.execute { + unTrack(eventId, roomId)?.let { + triggerUISI(it) + } +// if (throwable is MXCryptoError.OlmError) { +// if (throwable.olmException.message == "UNKNOWN_MESSAGE_INDEX") { +// unTrack(eventId, roomId)?.let { +// triggerUISI(it) +// } +// } +// } + } + } + + private fun handleEventReceived(detectorEvent: E2EMessageDetected) { + if (trackedEvents.any { it.first == detectorEvent }) { + Timber.w("## UISIDetector: Event ${detectorEvent.eventId} is already tracked") + } else { + // track it and start timer + val timeoutTask = object : TimerTask() { + override fun run() { + executor.execute { + unTrack(detectorEvent.eventId, detectorEvent.roomId) + Timber.v("## UISIDetector: Timeout on ${detectorEvent.eventId} ") + triggerUISI(detectorEvent) + } + } + } + trackedEvents.add(detectorEvent to timeoutTask) + timer.schedule(timeoutTask, timeoutMillis) + } + } + + private fun triggerUISI(source: E2EMessageDetected) { + Timber.i("## UISIDetector: Unable To Decrypt $source") + callback?.uisiDetected(source) + } + + private fun unTrack(eventId: String, roomId: String): E2EMessageDetected? { + val index = trackedEvents.indexOfFirst { it.first.eventId == eventId && it.first.roomId == roomId } + return if (index != -1) { + trackedEvents.removeAt(index).let { + it.second.cancel() + it.first + } + } else { + null + } + } +} diff --git a/vector/src/main/java/im/vector/app/VectorApplication.kt b/vector/src/main/java/im/vector/app/VectorApplication.kt index 400fb7eb89..05d20662c7 100644 --- a/vector/src/main/java/im/vector/app/VectorApplication.kt +++ b/vector/src/main/java/im/vector/app/VectorApplication.kt @@ -96,6 +96,7 @@ class VectorApplication : @Inject lateinit var pinLocker: PinLocker @Inject lateinit var callManager: WebRtcCallManager @Inject lateinit var invitesAcceptor: InvitesAcceptor + @Inject lateinit var autoRageShaker: AutoRageShaker @Inject lateinit var vectorFileLogger: VectorFileLogger @Inject lateinit var vectorAnalytics: VectorAnalytics @@ -117,6 +118,7 @@ class VectorApplication : appContext = this vectorAnalytics.init() invitesAcceptor.initialize() + autoRageShaker.initialize() vectorUncaughtExceptionHandler.activate(this) // Remove Log handler statically added by Jitsi diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt index b27c2e9818..7455a0e5bd 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt @@ -156,6 +156,7 @@ class BugReportActivity : VectorBaseActivity() { views.bugReportEditText.text.toString(), state.serverVersion, views.bugReportButtonContactMe.isChecked, + null, object : BugReporter.IMXBugReportListener { override fun onUploadFailed(reason: String?) { try { @@ -198,7 +199,7 @@ class BugReportActivity : VectorBaseActivity() { views.bugReportProgressTextView.text = getString(R.string.send_bug_report_progress, myProgress.toString()) } - override fun onUploadSucceed() { + override fun onUploadSucceed(reportUrl: String?) { try { when (reportType) { ReportType.BUG_REPORT -> { diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt index 5b3d194d33..0ec36e43cc 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt @@ -24,6 +24,7 @@ import android.os.Build import android.view.View import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentActivity +import com.squareup.moshi.Types import im.vector.app.BuildConfig import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder @@ -49,7 +50,9 @@ import okhttp3.Response import org.json.JSONException import org.json.JSONObject import org.matrix.android.sdk.api.Matrix +import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.api.util.MimeTypes +import org.matrix.android.sdk.internal.di.MoshiProvider import timber.log.Timber import java.io.File import java.io.IOException @@ -93,6 +96,9 @@ class BugReporter @Inject constructor( // boolean to cancel the bug report private val mIsCancelled = false + val adapter = MoshiProvider.providesMoshi() + .adapter(Types.newParameterizedType(Map::class.java, String::class.java, Any::class.java)) + /** * Get current Screenshot * @@ -141,7 +147,7 @@ class BugReporter @Inject constructor( /** * The bug report upload succeeded. */ - fun onUploadSucceed() + fun onUploadSucceed(reportUrl: String?) } /** @@ -166,12 +172,14 @@ class BugReporter @Inject constructor( theBugDescription: String, serverVersion: String, canContact: Boolean = false, + customFields: Map? = null, listener: IMXBugReportListener?) { // enumerate files to delete val mBugReportFiles: MutableList = ArrayList() coroutineScope.launch { var serverError: String? = null + var reportURL: String? = null withContext(Dispatchers.IO) { var bugDescription = theBugDescription val crashCallStack = getCrashDescription(context) @@ -247,9 +255,11 @@ class BugReporter @Inject constructor( if (!mIsCancelled) { val text = when (reportType) { - ReportType.BUG_REPORT -> "[Element] $bugDescription" - ReportType.SUGGESTION -> "[Element] [Suggestion] $bugDescription" + ReportType.BUG_REPORT -> "[Element] $bugDescription" + ReportType.SUGGESTION -> "[Element] [Suggestion] $bugDescription" ReportType.SPACE_BETA_FEEDBACK -> "[Element] [spaces-feedback] $bugDescription" + ReportType.AUTO_UISI_SENDER, + ReportType.AUTO_UISI -> "[AutoUISI] $bugDescription" } // build the multi part request @@ -273,7 +283,11 @@ class BugReporter @Inject constructor( .addFormDataPart("app_language", VectorLocale.applicationLocale.toString()) .addFormDataPart("default_app_language", systemLocaleProvider.getSystemLocale().toString()) .addFormDataPart("theme", ThemeUtils.getApplicationTheme(context)) - .addFormDataPart("server_version", serverVersion) + .addFormDataPart("server_version", serverVersion).apply { + customFields?.forEach { (name, value) -> + addFormDataPart(name, value) + } + } val buildNumber = context.getString(R.string.build_number) if (buildNumber.isNotEmpty() && buildNumber != "0") { @@ -321,11 +335,19 @@ class BugReporter @Inject constructor( builder.addFormDataPart("label", "[Element]") when (reportType) { - ReportType.BUG_REPORT -> { + ReportType.BUG_REPORT -> { /* nop */ } - ReportType.SUGGESTION -> builder.addFormDataPart("label", "[Suggestion]") + ReportType.SUGGESTION -> builder.addFormDataPart("label", "[Suggestion]") ReportType.SPACE_BETA_FEEDBACK -> builder.addFormDataPart("label", "spaces-feedback") + ReportType.AUTO_UISI -> { + builder.addFormDataPart("label", "auto-uisis-receiver") + builder.addFormDataPart("label", "auto-uisis") + } + ReportType.AUTO_UISI_SENDER -> { + builder.addFormDataPart("label", "auto-uisis-sender") + builder.addFormDataPart("label", "auto-uisis") + } } if (getCrashFile(context).exists()) { @@ -417,6 +439,10 @@ class BugReporter @Inject constructor( Timber.e(e, "## sendBugReport() : failed to parse error") } } + } else { + reportURL = response?.body?.string()?.let { stringBody -> + adapter.fromJson(stringBody)?.get("report_url")?.toString() + } } } } @@ -434,7 +460,7 @@ class BugReporter @Inject constructor( if (mIsCancelled) { listener.onUploadCancelled() } else if (null == serverError) { - listener.onUploadSucceed() + listener.onUploadSucceed(reportURL) } else { listener.onUploadFailed(serverError) } diff --git a/vector/src/main/java/im/vector/app/features/rageshake/ReportType.kt b/vector/src/main/java/im/vector/app/features/rageshake/ReportType.kt index 44682efb40..f9dc628914 100644 --- a/vector/src/main/java/im/vector/app/features/rageshake/ReportType.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/ReportType.kt @@ -19,5 +19,7 @@ package im.vector.app.features.rageshake enum class ReportType { BUG_REPORT, SUGGESTION, - SPACE_BETA_FEEDBACK + SPACE_BETA_FEEDBACK, + AUTO_UISI, + AUTO_UISI_SENDER, } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index 3f423696ae..7c2b983859 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -152,6 +152,7 @@ class VectorPreferences @Inject constructor(private val context: Context) { const val SETTINGS_LABS_ALLOW_EXTENDED_LOGS = "SETTINGS_LABS_ALLOW_EXTENDED_LOGS" const val SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE = "SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE" const val SETTINGS_LABS_SPACES_HOME_AS_ORPHAN = "SETTINGS_LABS_SPACES_HOME_AS_ORPHAN" + const val SETTINGS_LABS_AUTO_REPORT_UISI = "SETTINGS_LABS_AUTO_REPORT_UISI" const val SETTINGS_PREF_SPACE_SHOW_ALL_ROOM_IN_HOME = "SETTINGS_PREF_SPACE_SHOW_ALL_ROOM_IN_HOME" private const val SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY = "SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY" @@ -245,7 +246,7 @@ class VectorPreferences @Inject constructor(private val context: Context) { SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY, SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY, SETTINGS_LABS_ALLOW_EXTENDED_LOGS, - SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE, +// SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE, SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY, SETTINGS_USE_RAGE_SHAKE_KEY, @@ -974,6 +975,10 @@ class VectorPreferences @Inject constructor(private val context: Context) { return defaultPrefs.getBoolean(SETTINGS_LABS_SPACES_HOME_AS_ORPHAN, false) } + fun labsAutoReportUISI(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_LABS_AUTO_REPORT_UISI, false) + } + fun prefSpacesShowAllRoomInHome(): Boolean { return defaultPrefs.getBoolean(SETTINGS_PREF_SPACE_SHOW_ALL_ROOM_IN_HOME, // migration of old property diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt index f457980403..76f457b5ad 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt @@ -16,13 +16,26 @@ package im.vector.app.features.settings +// import im.vector.app.AutoRageShaker import im.vector.app.R +import im.vector.app.core.preference.VectorSwitchPreference import javax.inject.Inject -class VectorSettingsLabsFragment @Inject constructor() : VectorSettingsBaseFragment() { +class VectorSettingsLabsFragment @Inject constructor( + private val vectorPreferences: VectorPreferences, +// private val autoRageShaker: AutoRageShaker +) : VectorSettingsBaseFragment() { override var titleRes = R.string.room_settings_labs_pref_title override val preferenceXmlRes = R.xml.vector_settings_labs - override fun bindPref() {} + override fun bindPref() { + findPreference(VectorPreferences.SETTINGS_LABS_AUTO_REPORT_UISI)?.let { pref -> + pref.isChecked = vectorPreferences.labsAutoReportUISI() + pref.setOnPreferenceChangeListener { _, isChecked -> +// autoRageShaker.enable(isChecked as Boolean) + true + } + } + } } diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 1816e0d1fa..d77e04a6f1 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -3565,6 +3565,11 @@ Experimental Space - Restricted Room. Warning requires server support and experimental room version + + + Auto Report Decryption Errors. + Your system will automatically send logs when an unable to decrypt error occurs + %s invites you Looking for someone not in %s? diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index f394d1923e..0d240fd709 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -44,11 +44,6 @@ android:key="SETTINGS_LABS_UNREAD_NOTIFICATIONS_AS_TAB" android:title="@string/labs_show_unread_notifications_as_tab" /> - + + \ No newline at end of file From cf026b22b81190522a62272da082943e24545f56 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 25 Oct 2021 12:27:41 +0200 Subject: [PATCH 35/56] Fix UISIS preference listener --- .../src/main/java/im/vector/app/AutoRageShaker.kt | 15 +++++++++++++-- .../src/main/java/im/vector/app/UISIDetector.kt | 7 +++++++ .../app/features/rageshake/BugReportActivity.kt | 13 +++++++++++-- .../settings/VectorSettingsLabsFragment.kt | 9 ++------- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/vector/src/main/java/im/vector/app/AutoRageShaker.kt b/vector/src/main/java/im/vector/app/AutoRageShaker.kt index d11a24e38c..7c802e93fb 100644 --- a/vector/src/main/java/im/vector/app/AutoRageShaker.kt +++ b/vector/src/main/java/im/vector/app/AutoRageShaker.kt @@ -17,9 +17,11 @@ package im.vector.app import android.content.Context +import android.content.SharedPreferences import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.rageshake.BugReporter import im.vector.app.features.rageshake.ReportType +import im.vector.app.features.settings.VectorPreferences import io.reactivex.disposables.Disposable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -39,8 +41,9 @@ class AutoRageShaker @Inject constructor( private val sessionDataSource: ActiveSessionDataSource, private val activeSessionHolder: ActiveSessionHolder, private val bugReporter: BugReporter, - private val context: Context -) : Session.Listener { + private val context: Context, + private val vectorPreferences: VectorPreferences +) : Session.Listener, SharedPreferences.OnSharedPreferenceChangeListener { private lateinit var activeSessionDisposable: Disposable private val activeSessionIds = mutableSetOf() @@ -50,10 +53,18 @@ class AutoRageShaker @Inject constructor( fun initialize() { observeActiveSession() + // It's a singleton... + vectorPreferences.subscribeToChanges(this) + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + enable(vectorPreferences.labsAutoReportUISI()) } var _enabled = false fun enable(enabled: Boolean) { + if (enabled == _enabled) return + _enabled = enabled uisiDetectors.forEach { it.value.enabled = enabled } } diff --git a/vector/src/main/java/im/vector/app/UISIDetector.kt b/vector/src/main/java/im/vector/app/UISIDetector.kt index e12bd7adeb..d6a4805e78 100644 --- a/vector/src/main/java/im/vector/app/UISIDetector.kt +++ b/vector/src/main/java/im/vector/app/UISIDetector.kt @@ -75,6 +75,7 @@ class UISIDetector : LiveEventListener { var enabled = false override fun onLiveEvent(roomId: String, event: Event) { + if (!enabled) return if (!event.isEncrypted()) return executor.execute { handleEventReceived(E2EMessageDetected.fromEvent(event, roomId, UISIEventSource.INCREMENTAL_SYNC)) @@ -82,6 +83,7 @@ class UISIDetector : LiveEventListener { } override fun onPaginatedEvent(roomId: String, event: Event) { + if (!enabled) return if (!event.isEncrypted()) return executor.execute { handleEventReceived(E2EMessageDetected.fromEvent(event, roomId, UISIEventSource.PAGINATION)) @@ -89,18 +91,21 @@ class UISIDetector : LiveEventListener { } override fun onEventDecrypted(eventId: String, roomId: String, clearEvent: JsonDict) { + if (!enabled) return executor.execute { unTrack(eventId, roomId) } } override fun onLiveToDeviceEvent(event: Event) { + if (!enabled) return if (event.type == callback?.reciprocateToDeviceEventType) { callback?.uisiReciprocateRequest(event) } } override fun onEventDecryptionError(eventId: String, roomId: String, throwable: Throwable) { + if (!enabled) return executor.execute { unTrack(eventId, roomId)?.let { triggerUISI(it) @@ -116,6 +121,7 @@ class UISIDetector : LiveEventListener { } private fun handleEventReceived(detectorEvent: E2EMessageDetected) { + if (!enabled) return if (trackedEvents.any { it.first == detectorEvent }) { Timber.w("## UISIDetector: Event ${detectorEvent.eventId} is already tracked") } else { @@ -135,6 +141,7 @@ class UISIDetector : LiveEventListener { } private fun triggerUISI(source: E2EMessageDetected) { + if (!enabled) return Timber.i("## UISIDetector: Unable To Decrypt $source") callback?.uisiDetected(source) } diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt index 7455a0e5bd..02df86e14b 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt @@ -62,11 +62,11 @@ class BugReportActivity : VectorBaseActivity() { // Default screen is for bug report, so modify it for suggestion when (reportType) { - ReportType.BUG_REPORT -> { + ReportType.BUG_REPORT -> { supportActionBar?.setTitle(R.string.title_activity_bug_report) views.bugReportButtonContactMe.isVisible = true } - ReportType.SUGGESTION -> { + ReportType.SUGGESTION -> { supportActionBar?.setTitle(R.string.send_suggestion) views.bugReportFirstText.setText(R.string.send_suggestion_content) @@ -84,6 +84,9 @@ class BugReportActivity : VectorBaseActivity() { hideBugReportOptions() } + else -> { + // other types not supported here + } } } @@ -174,6 +177,9 @@ class BugReportActivity : VectorBaseActivity() { Toast.makeText(this@BugReportActivity, getString(R.string.feedback_failed, reason), Toast.LENGTH_LONG).show() } + else -> { + // nop + } } } } catch (e: Exception) { @@ -211,6 +217,9 @@ class BugReportActivity : VectorBaseActivity() { ReportType.SPACE_BETA_FEEDBACK -> { Toast.makeText(this@BugReportActivity, R.string.feedback_sent, Toast.LENGTH_LONG).show() } + else -> { + // nop + } } } catch (e: Exception) { Timber.e(e, "## onUploadSucceed() : failed to dismiss the toast") diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt index 76f457b5ad..a83b4c33f4 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsLabsFragment.kt @@ -16,14 +16,12 @@ package im.vector.app.features.settings -// import im.vector.app.AutoRageShaker import im.vector.app.R import im.vector.app.core.preference.VectorSwitchPreference import javax.inject.Inject class VectorSettingsLabsFragment @Inject constructor( - private val vectorPreferences: VectorPreferences, -// private val autoRageShaker: AutoRageShaker + private val vectorPreferences: VectorPreferences ) : VectorSettingsBaseFragment() { override var titleRes = R.string.room_settings_labs_pref_title @@ -31,11 +29,8 @@ class VectorSettingsLabsFragment @Inject constructor( override fun bindPref() { findPreference(VectorPreferences.SETTINGS_LABS_AUTO_REPORT_UISI)?.let { pref -> + // ensure correct default pref.isChecked = vectorPreferences.labsAutoReportUISI() - pref.setOnPreferenceChangeListener { _, isChecked -> -// autoRageShaker.enable(isChecked as Boolean) - true - } } } } From 401e8e671246a6410422faef7014fc299cdc0a66 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 6 Dec 2021 09:59:53 +0100 Subject: [PATCH 36/56] use flow instead of reactivex --- vector/src/main/java/im/vector/app/AutoRageShaker.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/vector/src/main/java/im/vector/app/AutoRageShaker.kt b/vector/src/main/java/im/vector/app/AutoRageShaker.kt index 7c802e93fb..5837246fdc 100644 --- a/vector/src/main/java/im/vector/app/AutoRageShaker.kt +++ b/vector/src/main/java/im/vector/app/AutoRageShaker.kt @@ -22,10 +22,12 @@ import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.rageshake.BugReporter import im.vector.app.features.rageshake.ReportType import im.vector.app.features.settings.VectorPreferences -import io.reactivex.disposables.Disposable import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.Event @@ -45,7 +47,6 @@ class AutoRageShaker @Inject constructor( private val vectorPreferences: VectorPreferences ) : Session.Listener, SharedPreferences.OnSharedPreferenceChangeListener { - private lateinit var activeSessionDisposable: Disposable private val activeSessionIds = mutableSetOf() private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) private val uisiDetectors = mutableMapOf() @@ -69,13 +70,14 @@ class AutoRageShaker @Inject constructor( } private fun observeActiveSession() { - activeSessionDisposable = sessionDataSource.observe() + sessionDataSource.stream() .distinctUntilChanged() - .subscribe { + .onEach { it.orNull()?.let { session -> onSessionActive(session) } } + .launchIn(coroutineScope) } fun decryptionErrorDetected(target: E2EMessageDetected) { @@ -163,7 +165,7 @@ class AutoRageShaker @Inject constructor( theBugDescription = "UISI detected $matchingIssue", serverVersion = "", canContact = false, - customFields = mapOf( + customFields = mapOf( "auto-uisi" to buildString { append("\neventId: $eventId") append("\nroomId: $roomId") From 56dac76ca8b416748e1ca285035c70f3945cd718 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 6 Dec 2021 11:42:19 +0100 Subject: [PATCH 37/56] Simple rate limiting of RS sending --- .../main/java/im/vector/app/AutoRageShaker.kt | 220 +++++++++++------- 1 file changed, 140 insertions(+), 80 deletions(-) diff --git a/vector/src/main/java/im/vector/app/AutoRageShaker.kt b/vector/src/main/java/im/vector/app/AutoRageShaker.kt index 5837246fdc..1bcd27e7bb 100644 --- a/vector/src/main/java/im/vector/app/AutoRageShaker.kt +++ b/vector/src/main/java/im/vector/app/AutoRageShaker.kt @@ -25,6 +25,9 @@ import im.vector.app.features.settings.VectorPreferences import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -52,10 +55,43 @@ class AutoRageShaker @Inject constructor( private val uisiDetectors = mutableMapOf() private var currentActiveSessionId: String? = null + // Simple in memory cache of already sent report + private data class ReportInfo( + val roomId: String, + val sessionId: String + ) + + private val alreadyReportedUisi = mutableListOf() + + private val e2eDetectedFlow = MutableSharedFlow(replay = 0) + private val matchingRSRequestFlow = MutableSharedFlow(replay = 0) + fun initialize() { observeActiveSession() // It's a singleton... vectorPreferences.subscribeToChanges(this) + + // Simple rate limit, notice that order is not + // necessarily preserved + e2eDetectedFlow + .onEach { + sendRageShake(it) + delay(2_000) + } + .catch { cause -> + Timber.w(cause, "Failed to RS") + } + .launchIn(coroutineScope) + + matchingRSRequestFlow + .onEach { + sendMatchingRageShake(it) + delay(2_000) + } + .catch { cause -> + Timber.w(cause, "Failed to send matching rageshake") + } + .launchIn(coroutineScope) } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { @@ -83,63 +119,83 @@ class AutoRageShaker @Inject constructor( fun decryptionErrorDetected(target: E2EMessageDetected) { if (target.source == UISIEventSource.INITIAL_SYNC) return if (activeSessionHolder.getSafeActiveSession()?.sessionId != currentActiveSessionId) return - coroutineScope.launch { - bugReporter.sendBugReport( - context = context, - reportType = ReportType.AUTO_UISI, - withDevicesLogs = true, - withCrashLogs = true, - withKeyRequestHistory = true, - withScreenshot = false, - theBugDescription = "UISI detected", - serverVersion = "", - canContact = false, - customFields = mapOf("auto-uisi" to buildString { - append("\neventId: ${target.eventId}") - append("\nroomId: ${target.roomId}") - append("\nsenderKey: ${target.senderKey}") - append("\nsource: ${target.source}") - append("\ndeviceId: ${target.senderDeviceId}") - append("\nuserId: ${target.senderUserId}") - append("\nsessionId: ${target.sessionId}") - }), - listener = object : BugReporter.IMXBugReportListener { - override fun onUploadCancelled() { + val shouldSendRS = synchronized(alreadyReportedUisi) { + val reportInfo = ReportInfo(target.roomId, target.sessionId) + val alreadySent = alreadyReportedUisi.contains(reportInfo) + if (!alreadySent) { + alreadyReportedUisi.add(reportInfo) + } + !alreadySent + } + if (shouldSendRS) { + coroutineScope.launch { + e2eDetectedFlow.emit(target) + } + } + } + + private fun sendRageShake(target: E2EMessageDetected) { + bugReporter.sendBugReport( + context = context, + reportType = ReportType.AUTO_UISI, + withDevicesLogs = true, + withCrashLogs = true, + withKeyRequestHistory = true, + withScreenshot = false, + theBugDescription = "UISI detected", + serverVersion = "", + canContact = false, + customFields = mapOf("auto-uisi" to buildString { + append("\neventId: ${target.eventId}") + append("\nroomId: ${target.roomId}") + append("\nsenderKey: ${target.senderKey}") + append("\nsource: ${target.source}") + append("\ndeviceId: ${target.senderDeviceId}") + append("\nuserId: ${target.senderUserId}") + append("\nsessionId: ${target.sessionId}") + }), + listener = object : BugReporter.IMXBugReportListener { + override fun onUploadCancelled() { + synchronized(alreadyReportedUisi) { + alreadyReportedUisi.remove(ReportInfo(target.roomId, target.sessionId)) } + } - override fun onUploadFailed(reason: String?) { + override fun onUploadFailed(reason: String?) { + synchronized(alreadyReportedUisi) { + alreadyReportedUisi.remove(ReportInfo(target.roomId, target.sessionId)) } + } - override fun onProgress(progress: Int) { - } + override fun onProgress(progress: Int) { + } - override fun onUploadSucceed(reportUrl: String?) { - Timber.w("## VALR Report URL is $reportUrl") - // we need to send the toDevice message to the sender + override fun onUploadSucceed(reportUrl: String?) { + Timber.w("## VALR Report URL is $reportUrl") + // we need to send the toDevice message to the sender - coroutineScope.launch { - try { - activeSessionHolder.getSafeActiveSession()?.sendToDevice( - eventType = AUTO_RS_REQUEST, - userId = target.senderUserId, - deviceId = target.senderDeviceId, - content = mapOf( - "event_id" to target.eventId, - "room_id" to target.roomId, - "session_id" to target.sessionId, - "device_id" to target.senderDeviceId, - "user_id" to target.senderUserId, - "sender_key" to target.senderKey, - "matching_issue" to reportUrl - ).toContent() - ) - } catch (failure: Throwable) { - Timber.w("## VALR : failed to send auto-uisi to device") - } + coroutineScope.launch { + try { + activeSessionHolder.getSafeActiveSession()?.sendToDevice( + eventType = AUTO_RS_REQUEST, + userId = target.senderUserId, + deviceId = target.senderDeviceId, + content = mapOf( + "event_id" to target.eventId, + "room_id" to target.roomId, + "session_id" to target.sessionId, + "device_id" to target.senderDeviceId, + "user_id" to target.senderUserId, + "sender_key" to target.senderKey, + "matching_issue" to reportUrl + ).toContent() + ) + } catch (failure: Throwable) { + Timber.w("## VALR : failed to send auto-uisi to device") } } - }) - } + } + }) } fun remoteAutoUISIRequest(event: Event) { @@ -147,40 +203,44 @@ class AutoRageShaker @Inject constructor( if (activeSessionHolder.getSafeActiveSession()?.sessionId != currentActiveSessionId) return coroutineScope.launch { - val eventId = event.content?.get("event_id") - val roomId = event.content?.get("room_id") - val sessionId = event.content?.get("session_id") - val deviceId = event.content?.get("device_id") - val userId = event.content?.get("user_id") - val senderKey = event.content?.get("sender_key") - val matchingIssue = event.content?.get("matching_issue")?.toString() ?: "" - - bugReporter.sendBugReport( - context = context, - reportType = ReportType.AUTO_UISI_SENDER, - withDevicesLogs = true, - withCrashLogs = true, - withKeyRequestHistory = true, - withScreenshot = false, - theBugDescription = "UISI detected $matchingIssue", - serverVersion = "", - canContact = false, - customFields = mapOf( - "auto-uisi" to buildString { - append("\neventId: $eventId") - append("\nroomId: $roomId") - append("\nsenderKey: $senderKey") - append("\ndeviceId: $deviceId") - append("\nuserId: $userId") - append("\nsessionId: $sessionId") - }, - "matching_issue" to matchingIssue - ), - listener = null - ) + matchingRSRequestFlow.emit(event) } } + private fun sendMatchingRageShake(event: Event) { + val eventId = event.content?.get("event_id") + val roomId = event.content?.get("room_id") + val sessionId = event.content?.get("session_id") + val deviceId = event.content?.get("device_id") + val userId = event.content?.get("user_id") + val senderKey = event.content?.get("sender_key") + val matchingIssue = event.content?.get("matching_issue")?.toString() ?: "" + + bugReporter.sendBugReport( + context = context, + reportType = ReportType.AUTO_UISI_SENDER, + withDevicesLogs = true, + withCrashLogs = true, + withKeyRequestHistory = true, + withScreenshot = false, + theBugDescription = "UISI detected $matchingIssue", + serverVersion = "", + canContact = false, + customFields = mapOf( + "auto-uisi" to buildString { + append("\neventId: $eventId") + append("\nroomId: $roomId") + append("\nsenderKey: $senderKey") + append("\ndeviceId: $deviceId") + append("\nuserId: $userId") + append("\nsessionId: $sessionId") + }, + "matching_issue" to matchingIssue + ), + listener = null + ) + } + private val detector = UISIDetector().apply { callback = object : UISIDetector.UISIDetectorCallback { override val reciprocateToDeviceEventType: String From aa89e721aa5cb27b946b2dffee28be9168a8faf3 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 6 Dec 2021 12:15:17 +0100 Subject: [PATCH 38/56] Fix enabling was broken --- vector/src/main/java/im/vector/app/AutoRageShaker.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/vector/src/main/java/im/vector/app/AutoRageShaker.kt b/vector/src/main/java/im/vector/app/AutoRageShaker.kt index 1bcd27e7bb..38840b8df8 100644 --- a/vector/src/main/java/im/vector/app/AutoRageShaker.kt +++ b/vector/src/main/java/im/vector/app/AutoRageShaker.kt @@ -52,7 +52,6 @@ class AutoRageShaker @Inject constructor( private val activeSessionIds = mutableSetOf() private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) - private val uisiDetectors = mutableMapOf() private var currentActiveSessionId: String? = null // Simple in memory cache of already sent report @@ -102,7 +101,7 @@ class AutoRageShaker @Inject constructor( fun enable(enabled: Boolean) { if (enabled == _enabled) return _enabled = enabled - uisiDetectors.forEach { it.value.enabled = enabled } + detector.enabled = enabled } private fun observeActiveSession() { @@ -269,9 +268,7 @@ class AutoRageShaker @Inject constructor( } override fun onSessionStopped(session: Session) { - uisiDetectors.get(session.sessionId)?.let { - session.removeEventStreamListener(it) - } + session.removeEventStreamListener(detector) activeSessionIds.remove(session.sessionId) } } From de08afdfad10813fe2dbcda7dc7d83ec09aefb3f Mon Sep 17 00:00:00 2001 From: Valere Date: Fri, 17 Dec 2021 16:43:52 +0100 Subject: [PATCH 39/56] code review --- .../sdk/internal/session/DefaultToDeviceService.kt | 3 +-- .../android/sdk/internal/session/SessionModule.kt | 12 ++++++------ .../sdk/internal/session/StreamEventsManager.kt | 12 +++++------- .../room/timeline/TokenChunkEventPersistor.kt | 2 ++ vector/src/main/java/im/vector/app/AutoRageShaker.kt | 3 +-- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt index 5bdb969113..1615b8eef9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultToDeviceService.kt @@ -22,12 +22,11 @@ import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.internal.crypto.actions.MessageEncrypter import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore -import org.matrix.android.sdk.internal.crypto.tasks.DefaultSendToDeviceTask import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask import javax.inject.Inject internal class DefaultToDeviceService @Inject constructor( - private val sendToDeviceTask: DefaultSendToDeviceTask, + private val sendToDeviceTask: SendToDeviceTask, private val messageEncrypter: MessageEncrypter, private val cryptoStore: IMXCryptoStore ) : ToDeviceService { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt index cf6ff4a872..531dea1d5a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt @@ -376,6 +376,12 @@ internal abstract class SessionModule { @Binds abstract fun bindOpenIdTokenService(service: DefaultOpenIdService): OpenIdService + @Binds + abstract fun bindToDeviceService(service: DefaultToDeviceService): ToDeviceService + + @Binds + abstract fun bindEventStreamService(service: DefaultEventStreamService): EventStreamService + @Binds abstract fun bindTypingUsersTracker(tracker: DefaultTypingUsersTracker): TypingUsersTracker @@ -384,10 +390,4 @@ internal abstract class SessionModule { @Binds abstract fun bindEventSenderProcessor(processor: EventSenderProcessorCoroutine): EventSenderProcessor - - @Binds - abstract fun bindToDeviceService(deviceService: DefaultToDeviceService): ToDeviceService - - @Binds - abstract fun bindEventStreamService(deviceService: DefaultEventStreamService): EventStreamService } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt index c39f5fded8..bb0ca11445 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/StreamEventsManager.kt @@ -35,17 +35,15 @@ internal class StreamEventsManager @Inject constructor() { private val listeners = mutableListOf() fun addLiveEventListener(listener: LiveEventListener) { - Timber.v("## VALR: addLiveEventListener") listeners.add(listener) } fun removeLiveEventListener(listener: LiveEventListener) { - Timber.v("## VALR: removeLiveEventListener") listeners.remove(listener) } fun dispatchLiveEventReceived(event: Event, roomId: String, initialSync: Boolean) { - Timber.v("## VALR: dispatchLiveEventReceived ${event.eventId}") + Timber.v("## dispatchLiveEventReceived ${event.eventId}") coroutineScope.launch { if (!initialSync) { listeners.forEach { @@ -58,7 +56,7 @@ internal class StreamEventsManager @Inject constructor() { } fun dispatchPaginatedEventReceived(event: Event, roomId: String) { - Timber.v("## VALR: dispatchPaginatedEventReceived ${event.eventId}") + Timber.v("## dispatchPaginatedEventReceived ${event.eventId}") coroutineScope.launch { listeners.forEach { tryOrNull { @@ -69,7 +67,7 @@ internal class StreamEventsManager @Inject constructor() { } fun dispatchLiveEventDecrypted(event: Event, result: MXEventDecryptionResult) { - Timber.v("## VALR: dispatchLiveEventDecrypted ${event.eventId}") + Timber.v("## dispatchLiveEventDecrypted ${event.eventId}") coroutineScope.launch { listeners.forEach { tryOrNull { @@ -80,7 +78,7 @@ internal class StreamEventsManager @Inject constructor() { } fun dispatchLiveEventDecryptionFailed(event: Event, error: Throwable) { - Timber.v("## VALR: dispatchLiveEventDecryptionFailed ${event.eventId}") + Timber.v("## dispatchLiveEventDecryptionFailed ${event.eventId}") coroutineScope.launch { listeners.forEach { tryOrNull { @@ -91,7 +89,7 @@ internal class StreamEventsManager @Inject constructor() { } fun dispatchOnLiveToDevice(event: Event) { - Timber.v("## VALR: dispatchOnLiveToDevice ${event.eventId}") + Timber.v("## dispatchOnLiveToDevice ${event.eventId}") coroutineScope.launch { listeners.forEach { tryOrNull { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt index 62e3896ac5..a85f0dbdc9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt @@ -23,6 +23,7 @@ import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.api.session.room.send.SendState +import org.matrix.android.sdk.internal.database.helper.addIfNecessary import org.matrix.android.sdk.internal.database.helper.addStateEvent import org.matrix.android.sdk.internal.database.helper.addTimelineEvent import org.matrix.android.sdk.internal.database.mapper.toEntity @@ -36,6 +37,7 @@ import org.matrix.android.sdk.internal.database.query.find import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.session.StreamEventsManager +import org.matrix.android.sdk.internal.util.awaitTransaction import timber.log.Timber import javax.inject.Inject diff --git a/vector/src/main/java/im/vector/app/AutoRageShaker.kt b/vector/src/main/java/im/vector/app/AutoRageShaker.kt index 38840b8df8..7479b0421c 100644 --- a/vector/src/main/java/im/vector/app/AutoRageShaker.kt +++ b/vector/src/main/java/im/vector/app/AutoRageShaker.kt @@ -170,7 +170,6 @@ class AutoRageShaker @Inject constructor( } override fun onUploadSucceed(reportUrl: String?) { - Timber.w("## VALR Report URL is $reportUrl") // we need to send the toDevice message to the sender coroutineScope.launch { @@ -190,7 +189,7 @@ class AutoRageShaker @Inject constructor( ).toContent() ) } catch (failure: Throwable) { - Timber.w("## VALR : failed to send auto-uisi to device") + Timber.w("failed to send auto-uisi to device") } } } From 258d7311024ddf26b043929d9ea3d79ac4631be9 Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 6 Jan 2022 15:50:41 +0100 Subject: [PATCH 40/56] Change autoUisi label + rename matching_issue --- vector/src/main/java/im/vector/app/AutoRageShaker.kt | 6 +++--- .../java/im/vector/app/features/rageshake/BugReporter.kt | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/AutoRageShaker.kt b/vector/src/main/java/im/vector/app/AutoRageShaker.kt index 7479b0421c..ca91f728cb 100644 --- a/vector/src/main/java/im/vector/app/AutoRageShaker.kt +++ b/vector/src/main/java/im/vector/app/AutoRageShaker.kt @@ -185,7 +185,7 @@ class AutoRageShaker @Inject constructor( "device_id" to target.senderDeviceId, "user_id" to target.senderUserId, "sender_key" to target.senderKey, - "matching_issue" to reportUrl + "recipient_rageshake" to reportUrl ).toContent() ) } catch (failure: Throwable) { @@ -212,7 +212,7 @@ class AutoRageShaker @Inject constructor( val deviceId = event.content?.get("device_id") val userId = event.content?.get("user_id") val senderKey = event.content?.get("sender_key") - val matchingIssue = event.content?.get("matching_issue")?.toString() ?: "" + val matchingIssue = event.content?.get("recipient_rageshake")?.toString() ?: "" bugReporter.sendBugReport( context = context, @@ -233,7 +233,7 @@ class AutoRageShaker @Inject constructor( append("\nuserId: $userId") append("\nsessionId: $sessionId") }, - "matching_issue" to matchingIssue + "recipient_rageshake" to matchingIssue ), listener = null ) diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt index 0ec36e43cc..26e9cabccb 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt @@ -340,13 +340,9 @@ class BugReporter @Inject constructor( } ReportType.SUGGESTION -> builder.addFormDataPart("label", "[Suggestion]") ReportType.SPACE_BETA_FEEDBACK -> builder.addFormDataPart("label", "spaces-feedback") - ReportType.AUTO_UISI -> { - builder.addFormDataPart("label", "auto-uisis-receiver") - builder.addFormDataPart("label", "auto-uisis") - } + ReportType.AUTO_UISI, ReportType.AUTO_UISI_SENDER -> { - builder.addFormDataPart("label", "auto-uisis-sender") - builder.addFormDataPart("label", "auto-uisis") + builder.addFormDataPart("label", "Z-UISI") } } From 3f0122be01b9d16261ae3bbd52a435e2354a40e5 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 10 Jan 2022 09:44:11 +0100 Subject: [PATCH 41/56] Update nb of enum classes --- tools/check/forbidden_strings_in_code.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/check/forbidden_strings_in_code.txt b/tools/check/forbidden_strings_in_code.txt index 9db73230ee..293e0b2a58 100644 --- a/tools/check/forbidden_strings_in_code.txt +++ b/tools/check/forbidden_strings_in_code.txt @@ -160,7 +160,7 @@ Formatter\.formatShortFileSize===1 # android\.text\.TextUtils ### This is not a rule, but a warning: the number of "enum class" has changed. For Json classes, it is mandatory that they have `@JsonClass(generateAdapter = false)`. If the enum is not used as a Json class, change the value in file forbidden_strings_in_code.txt -enum class===118 +enum class===119 ### Do not import temporary legacy classes import org.matrix.android.sdk.internal.legacy.riot===3 From a047bcbabe25a1f9cc20348125511ed2760b8910 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 10 Jan 2022 09:46:11 +0100 Subject: [PATCH 42/56] restore deprecated lab preference --- vector/src/main/res/xml/vector_settings_labs.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index 0d240fd709..96d5588ee6 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -44,6 +44,11 @@ android:key="SETTINGS_LABS_UNREAD_NOTIFICATIONS_AS_TAB" android:title="@string/labs_show_unread_notifications_as_tab" /> + Date: Mon, 10 Jan 2022 11:38:08 +0200 Subject: [PATCH 43/56] - Do not add GitHub comments on successful ktlint runs - Remove already existing comments when ktlint succeed --- .github/workflows/quality.yml | 25 ++++++++++++++++++------- changelog.d/4888.misc | 1 + 2 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 changelog.d/4888.misc diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 26ee3cf460..7eff52cc9f 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -32,13 +32,13 @@ jobs: */build/reports/ktlint/ktlint*/ktlint*.txt - name: Handle Results if: always() - id: get-comment-body + id: ktlint-results run: | results="$(cat */*/build/reports/ktlint/ktlint*/ktlint*.txt */build/reports/ktlint/ktlint*/ktlint*.txt | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g")" if [ -z "$results" ]; then - body="👍 ✅ 👍" + echo "::set-output name=add_comment::false" else - body="👎 ❌ 👎 \`Failed${results}\`" + body="👎\`Failed${results}\`" body="${body//'%'/'%25'}" body="${body//$'\n'/'%0A'}" body="${body//$'\r'/'%0D'}" @@ -50,8 +50,9 @@ jobs: body="$( echo $body | sed 's/im\/vector\/lib\///g')" body="$( echo $body | sed 's/org\/matrix\/android\/sdk\///g')" body="$( echo $body | sed 's/\/src\/androidTest\/java\// 🔸 /g')" + echo "::set-output name=add_comment::true" + echo "::set-output name=body::$body" fi - echo "::set-output name=body::$body" - name: Find Comment if: always() uses: peter-evans/find-comment@v1 @@ -60,8 +61,8 @@ jobs: issue-number: ${{ github.event.pull_request.number }} comment-author: 'github-actions[bot]' body-includes: Ktlint Results - - name: Publish ktlint results to PR - if: always() + - name: Add comment if needed + if: always() && steps.ktlint-results.outputs.add_comment == 'true' uses: peter-evans/create-or-update-comment@v1 with: comment-id: ${{ steps.fc.outputs.comment-id }} @@ -69,8 +70,18 @@ jobs: body: | ### Ktlint Results - ${{ steps.get-comment-body.outputs.body }} + ${{ steps.ktlint-results.outputs.body }} edit-mode: replace + - name: Delete comment if needed + if: always() && steps.fc.outputs.comment-id != '' && steps.ktlint-results.outputs.add_comment == 'false' + uses: actions/github-script@v3 + with: + script: | + github.issues.deleteComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: ${{ steps.fc.outputs.comment-id }} + }) # Lint for main module android-lint: diff --git a/changelog.d/4888.misc b/changelog.d/4888.misc new file mode 100644 index 0000000000..3b948c9857 --- /dev/null +++ b/changelog.d/4888.misc @@ -0,0 +1 @@ +Add ktlint results on github as a comment only on fail From 6f348813a2cda91e299e13a124e54a8f77adecca Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Jan 2022 13:45:02 +0100 Subject: [PATCH 44/56] Revert "Disable automatic opt-in screen display." This reverts commit 08def813cc8e0dcadb68330692e358c5dea7a71a. --- .../im/vector/app/features/home/HomeActivityViewModel.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt index 4bc2b41845..35c112b63a 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt @@ -83,12 +83,9 @@ class HomeActivityViewModel @AssistedInject constructor( observeInitialSync() checkSessionPushIsOn() observeCrossSigningReset() - // Disable Analytics opt-in automatic display - // Waiting for translation and for analytic events to be actually sent - // observeAnalytics() + observeAnalytics() } - @Suppress("unused") private fun observeAnalytics() { if (analyticsConfig.isEnabled) { analyticsStore.didAskUserConsentFlow From 67c2f9ac51b541c9d14e460e44bdd4e7f1aab07a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Jan 2022 14:16:03 +0100 Subject: [PATCH 45/56] Cleanup --- .../java/im/vector/app/espresso/tools/WaitActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/vector/src/androidTest/java/im/vector/app/espresso/tools/WaitActivity.kt b/vector/src/androidTest/java/im/vector/app/espresso/tools/WaitActivity.kt index 05f1ca2815..0c03f78bb4 100644 --- a/vector/src/androidTest/java/im/vector/app/espresso/tools/WaitActivity.kt +++ b/vector/src/androidTest/java/im/vector/app/espresso/tools/WaitActivity.kt @@ -26,7 +26,6 @@ import im.vector.app.activityIdlingResource import im.vector.app.waitForView import im.vector.app.withIdlingResource import org.hamcrest.Matcher -import org.hamcrest.Matchers.not inline fun waitUntilActivityVisible(noinline block: (() -> Unit) = {}) { withIdlingResource(activityIdlingResource(T::class.java), block) From a552be040d2bfe0d7ec88087473ae108561c3c0a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Jan 2022 14:16:58 +0100 Subject: [PATCH 46/56] Test: Analytics opt-in --- .../im/vector/app/ui/robot/AnalyticsRobot.kt | 48 +++++++++++++++++++ .../im/vector/app/ui/robot/ElementRobot.kt | 2 + 2 files changed, 50 insertions(+) create mode 100644 vector/src/androidTest/java/im/vector/app/ui/robot/AnalyticsRobot.kt diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/AnalyticsRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/AnalyticsRobot.kt new file mode 100644 index 0000000000..86b110ce87 --- /dev/null +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/AnalyticsRobot.kt @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022 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.ui.robot + +import androidx.test.espresso.matcher.ViewMatchers.withId +import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions.assertDisplayed +import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn +import im.vector.app.R +import im.vector.app.espresso.tools.waitUntilActivityVisible +import im.vector.app.espresso.tools.waitUntilViewVisible +import im.vector.app.features.analytics.ui.consent.AnalyticsOptInActivity + +class AnalyticsRobot { + + fun optIn() { + answerOptIn(true) + } + + fun optOut() { + answerOptIn(false) + } + + private fun answerOptIn(optIn: Boolean) { + waitUntilActivityVisible { + waitUntilViewVisible(withId(R.id.title)) + } + assertDisplayed(R.id.title, R.string.analytics_opt_in_title) + if (optIn) { + clickOn(R.id.submit) + } else { + clickOn(R.id.later) + } + } +} diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt index 74e4478635..a9fed81bd5 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt @@ -43,6 +43,8 @@ class ElementRobot { fun signUp(userId: String) { val onboardingRobot = OnboardingRobot() onboardingRobot.createAccount(userId = userId) + val analyticsRobot = AnalyticsRobot() + analyticsRobot.optOut() waitForHome() } From d5968e442cdd3b49b8e97a3d39872b58a7f7cdc1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Jan 2022 14:31:29 +0100 Subject: [PATCH 47/56] Test: Fix test after change on OnBoarding screens --- .../im/vector/app/ui/robot/ElementRobot.kt | 4 ++-- .../im/vector/app/ui/robot/OnboardingRobot.kt | 18 ++++++------------ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt index a9fed81bd5..22a5a0790b 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt @@ -32,7 +32,7 @@ import im.vector.app.espresso.tools.waitUntilDialogVisible import im.vector.app.espresso.tools.waitUntilViewVisible import im.vector.app.features.createdirect.CreateDirectRoomActivity import im.vector.app.features.home.HomeActivity -import im.vector.app.features.login.LoginActivity +import im.vector.app.features.onboarding.OnboardingActivity import im.vector.app.initialSyncIdlingResource import im.vector.app.ui.robot.settings.SettingsRobot import im.vector.app.withIdlingResource @@ -123,7 +123,7 @@ class ElementRobot { clickDialogPositiveButton() } - waitUntilActivityVisible { + waitUntilActivityVisible { assertDisplayed(R.id.loginSplashLogo) } } diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt index 8b87abadab..633d3cceab 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt @@ -45,7 +45,11 @@ class OnboardingRobot { homeServerUrl: String) { waitUntilViewVisible(withId(R.id.loginSplashSubmit)) assertDisplayed(R.id.loginSplashSubmit, R.string.login_splash_submit) - clickOn(R.id.loginSplashSubmit) + if (createAccount) { + clickOn(R.id.loginSplashSubmit) + } else { + clickOn(R.id.loginSplashAlreadyHaveAccount) + } assertDisplayed(R.id.loginServerTitle, R.string.login_server_title) // Chose custom server clickOn(R.id.loginServerChoiceOther) @@ -54,17 +58,7 @@ class OnboardingRobot { assertEnabled(R.id.loginServerUrlFormSubmit) closeSoftKeyboard() clickOn(R.id.loginServerUrlFormSubmit) - onView(isRoot()).perform(waitForView(withId(R.id.loginSignupSigninSubmit))) - - if (createAccount) { - // Click on the signup button - assertDisplayed(R.id.loginSignupSigninSubmit) - clickOn(R.id.loginSignupSigninSubmit) - } else { - // Click on the signin button - assertDisplayed(R.id.loginSignupSigninSignIn) - clickOn(R.id.loginSignupSigninSignIn) - } + onView(isRoot()).perform(waitForView(withId(R.id.loginField))) // Ensure password flow supported assertDisplayed(R.id.loginField) From 5d70aa99472e82df200e6a761f678e1b29a7413b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Jan 2022 14:33:47 +0100 Subject: [PATCH 48/56] Changelog --- changelog.d/4892.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/4892.feature diff --git a/changelog.d/4892.feature b/changelog.d/4892.feature new file mode 100644 index 0000000000..1d66367999 --- /dev/null +++ b/changelog.d/4892.feature @@ -0,0 +1 @@ +Display Analytics opt-in screen at first start-up of the app \ No newline at end of file From ae8d1d1429fb24f327434a05f4d6162794c07b95 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Jan 2022 19:56:55 +0100 Subject: [PATCH 49/56] Olm lib is now hosted in MavenCentral. Upgrade to 3.2.10 --- build.gradle | 8 -------- changelog.d/4882.misc | 1 + dependencies_groups.gradle | 8 +------- matrix-sdk-android/build.gradle | 4 ++-- 4 files changed, 4 insertions(+), 17 deletions(-) create mode 100644 changelog.d/4882.misc diff --git a/build.gradle b/build.gradle index 255d9da849..b7299b01f7 100644 --- a/build.gradle +++ b/build.gradle @@ -36,14 +36,6 @@ allprojects { apply plugin: "org.jlleitschuh.gradle.ktlint" repositories { - // For olm library. - maven { - url 'https://gitlab.matrix.org/api/v4/projects/27/packages/maven' - content { - groups.olm.regex.each { includeGroupByRegex it } - groups.olm.group.each { includeGroup it } - } - } maven { url 'https://jitpack.io' content { diff --git a/changelog.d/4882.misc b/changelog.d/4882.misc new file mode 100644 index 0000000000..46c5ec0bb7 --- /dev/null +++ b/changelog.d/4882.misc @@ -0,0 +1 @@ + Olm lib is now hosted in MavenCentral - upgrade to 3.2.10 \ No newline at end of file diff --git a/dependencies_groups.gradle b/dependencies_groups.gradle index 7edf54fb50..3853919bcb 100644 --- a/dependencies_groups.gradle +++ b/dependencies_groups.gradle @@ -14,13 +14,6 @@ ext.groups = [ 'com.github.Zhuinden', ] ], - olm : [ - regex: [ - ], - group: [ - 'org.matrix.android', - ] - ], jitsi : [ regex: [ ], @@ -166,6 +159,7 @@ ext.groups = [ 'org.junit.jupiter', 'org.junit.platform', 'org.jvnet.staxex', + 'org.matrix.android', 'org.mockito', 'org.mongodb', 'org.objenesis', diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index 44b002697d..936609c1d7 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -140,8 +140,8 @@ dependencies { implementation libs.arrow.core implementation libs.arrow.instances - // olm lib is now hosted by maven at https://gitlab.matrix.org/api/v4/projects/27/packages/maven - implementation 'org.matrix.android:olm:3.2.7' + // olm lib is now hosted in MavenCentral + implementation 'org.matrix.android:olm-sdk:3.2.10' // DI implementation libs.dagger.dagger From 5feafbdbf13c5ed8ef16782f5950b8d43896a436 Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Mon, 10 Jan 2022 17:28:07 +0300 Subject: [PATCH 50/56] Workaround to not to reuse poll option cells. --- changelog.d/4735.bugfix | 1 + .../im/vector/app/features/poll/create/CreatePollFragment.kt | 2 ++ .../im/vector/app/features/poll/create/CreatePollViewModel.kt | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 changelog.d/4735.bugfix diff --git a/changelog.d/4735.bugfix b/changelog.d/4735.bugfix new file mode 100644 index 0000000000..cf6cca33fd --- /dev/null +++ b/changelog.d/4735.bugfix @@ -0,0 +1 @@ +Polls: unable to create a poll with more than 10 answers \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/poll/create/CreatePollFragment.kt b/vector/src/main/java/im/vector/app/features/poll/create/CreatePollFragment.kt index dc82579f15..3ea44562c5 100644 --- a/vector/src/main/java/im/vector/app/features/poll/create/CreatePollFragment.kt +++ b/vector/src/main/java/im/vector/app/features/poll/create/CreatePollFragment.kt @@ -28,6 +28,7 @@ import im.vector.app.R import im.vector.app.core.extensions.configureWith import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentCreatePollBinding +import im.vector.app.features.poll.create.CreatePollViewModel.Companion.MAX_OPTIONS_COUNT import kotlinx.parcelize.Parcelize import javax.inject.Inject @@ -51,6 +52,7 @@ class CreatePollFragment @Inject constructor( vectorBaseActivity.setSupportActionBar(views.createPollToolbar) views.createPollRecyclerView.configureWith(controller, disableItemAnimation = true) + views.createPollRecyclerView.setItemViewCacheSize(MAX_OPTIONS_COUNT + 4) controller.callback = this views.createPollClose.debouncedClicks { diff --git a/vector/src/main/java/im/vector/app/features/poll/create/CreatePollViewModel.kt b/vector/src/main/java/im/vector/app/features/poll/create/CreatePollViewModel.kt index 81581b2179..b5e66ae682 100644 --- a/vector/src/main/java/im/vector/app/features/poll/create/CreatePollViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/poll/create/CreatePollViewModel.kt @@ -40,7 +40,7 @@ class CreatePollViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() { const val MIN_OPTIONS_COUNT = 2 - private const val MAX_OPTIONS_COUNT = 20 + const val MAX_OPTIONS_COUNT = 20 } init { From 75541e0296ec3a8b8b0de0efd185585246988150 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 10 Jan 2022 18:22:30 +0100 Subject: [PATCH 51/56] Add some missing language in the change language screen --- vector/src/main/res/values-fr-rCA/strings_no_weblate.xml | 8 ++++++++ vector/src/main/res/values-ml/strings_no_weblate.xml | 8 ++++++++ vector/src/main/res/values-pa/strings_no_weblate.xml | 8 ++++++++ 3 files changed, 24 insertions(+) create mode 100644 vector/src/main/res/values-fr-rCA/strings_no_weblate.xml create mode 100644 vector/src/main/res/values-ml/strings_no_weblate.xml create mode 100644 vector/src/main/res/values-pa/strings_no_weblate.xml diff --git a/vector/src/main/res/values-fr-rCA/strings_no_weblate.xml b/vector/src/main/res/values-fr-rCA/strings_no_weblate.xml new file mode 100644 index 0000000000..4d2469f824 --- /dev/null +++ b/vector/src/main/res/values-fr-rCA/strings_no_weblate.xml @@ -0,0 +1,8 @@ + + + + fr + CA + Latn + + \ No newline at end of file diff --git a/vector/src/main/res/values-ml/strings_no_weblate.xml b/vector/src/main/res/values-ml/strings_no_weblate.xml new file mode 100644 index 0000000000..7d128b9e64 --- /dev/null +++ b/vector/src/main/res/values-ml/strings_no_weblate.xml @@ -0,0 +1,8 @@ + + + + ml + IN + Mlym + + \ No newline at end of file diff --git a/vector/src/main/res/values-pa/strings_no_weblate.xml b/vector/src/main/res/values-pa/strings_no_weblate.xml new file mode 100644 index 0000000000..deb30879dd --- /dev/null +++ b/vector/src/main/res/values-pa/strings_no_weblate.xml @@ -0,0 +1,8 @@ + + + + pa + PK + Zyyy + + \ No newline at end of file From 48944eabccd4028a84713160a202e45f8918b24f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 23:03:21 +0000 Subject: [PATCH 52/56] Bump actions/github-script from 3 to 5.1.0 Bumps [actions/github-script](https://github.com/actions/github-script) from 3 to 5.1.0. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v3...v5.1.0) --- updated-dependencies: - dependency-name: actions/github-script dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/quality.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 7eff52cc9f..483e8819f3 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -74,7 +74,7 @@ jobs: edit-mode: replace - name: Delete comment if needed if: always() && steps.fc.outputs.comment-id != '' && steps.ktlint-results.outputs.add_comment == 'false' - uses: actions/github-script@v3 + uses: actions/github-script@v5.1.0 with: script: | github.issues.deleteComment({ From 25a88fed2e3847c794bc182e0b97115b0572ef0c Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 10 Jan 2022 19:43:51 +0000 Subject: [PATCH 53/56] Translated using Weblate (Swedish) Currently translated at 100.0% (43 of 43 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/40103100.txt | 2 ++ fastlane/metadata/android/sv-SE/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/sv-SE/changelogs/40103120.txt | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40103120.txt diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103100.txt b/fastlane/metadata/android/sv-SE/changelogs/40103100.txt new file mode 100644 index 0000000000..d2ea16da98 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40103100.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Lägg till stöd för omröstningar (i experiment). Ny design för URL-förhandsgranskning. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.10 diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103110.txt b/fastlane/metadata/android/sv-SE/changelogs/40103110.txt new file mode 100644 index 0000000000..ae1fcddda9 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40103110.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Buggfixar! +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.11 diff --git a/fastlane/metadata/android/sv-SE/changelogs/40103120.txt b/fastlane/metadata/android/sv-SE/changelogs/40103120.txt new file mode 100644 index 0000000000..b9d73b692b --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40103120.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Buggfixar! +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.12 From bf447afa5a4046a76356d65c593e2d3f5ff9d2e0 Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 11 Jan 2022 10:01:37 +0100 Subject: [PATCH 54/56] Remove deprecated restricted lab option (#4889) Remove deprecated restricted lab option --- changelog.d/4889.removal | 1 + .../roomdirectory/createroom/CreateRoomViewModel.kt | 10 ++-------- .../roomprofile/settings/RoomSettingsViewModel.kt | 6 +----- .../advanced/RoomJoinRuleChooseRestrictedViewModel.kt | 6 +----- .../vector/app/features/settings/VectorPreferences.kt | 6 ------ .../features/spaces/create/CreateSpaceViewModelTask.kt | 6 +----- vector/src/main/res/values/strings.xml | 4 ++-- vector/src/main/res/xml/vector_settings_labs.xml | 6 ------ 8 files changed, 8 insertions(+), 37 deletions(-) create mode 100644 changelog.d/4889.removal diff --git a/changelog.d/4889.removal b/changelog.d/4889.removal new file mode 100644 index 0000000000..2b631deb69 --- /dev/null +++ b/changelog.d/4889.removal @@ -0,0 +1 @@ +Remove deprecated experimental restricted space lab option \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt index e0ffdc7a52..4835cfecbe 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -31,7 +31,6 @@ import im.vector.app.core.extensions.exhaustive import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.raw.wellknown.getElementWellknown import im.vector.app.features.raw.wellknown.isE2EByDefault -import im.vector.app.features.settings.VectorPreferences import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.matrix.android.sdk.api.MatrixPatterns.getDomain @@ -54,8 +53,7 @@ import timber.log.Timber class CreateRoomViewModel @AssistedInject constructor(@Assisted private val initialState: CreateRoomViewState, private val session: Session, - private val rawService: RawService, - vectorPreferences: VectorPreferences + private val rawService: RawService ) : VectorViewModel(initialState) { @AssistedFactory @@ -70,11 +68,7 @@ class CreateRoomViewModel @AssistedInject constructor(@Assisted private val init initAdminE2eByDefault() val restrictedSupport = session.getHomeServerCapabilities().isFeatureSupported(HomeServerCapabilities.ROOM_CAP_RESTRICTED) - val createRestricted = when (restrictedSupport) { - HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED -> true - HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED_UNSTABLE -> vectorPreferences.labsUseExperimentalRestricted() - else -> false - } + val createRestricted = restrictedSupport == HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED val defaultJoinRules = if (initialState.parentSpaceId != null && createRestricted) { RoomJoinRules.RESTRICTED diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsViewModel.kt index 1e3cd053b1..a0325cfc2b 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsViewModel.kt @@ -73,11 +73,7 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState: .isFeatureSupported(HomeServerCapabilities.ROOM_CAP_RESTRICTED, room.getRoomVersion()) val restrictedSupport = homeServerCapabilities.isFeatureSupported(HomeServerCapabilities.ROOM_CAP_RESTRICTED) - val couldUpgradeToRestricted = when (restrictedSupport) { - HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED -> true - HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED_UNSTABLE -> vectorPreferences.labsUseExperimentalRestricted() - else -> false - } + val couldUpgradeToRestricted = restrictedSupport == HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED setState { copy( diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/settings/joinrule/advanced/RoomJoinRuleChooseRestrictedViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/settings/joinrule/advanced/RoomJoinRuleChooseRestrictedViewModel.kt index 7328b1f9f0..548ec9cfe4 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/settings/joinrule/advanced/RoomJoinRuleChooseRestrictedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/settings/joinrule/advanced/RoomJoinRuleChooseRestrictedViewModel.kt @@ -109,11 +109,7 @@ class RoomJoinRuleChooseRestrictedViewModel @AssistedInject constructor( } val restrictedSupport = homeServerCapabilities.isFeatureSupported(HomeServerCapabilities.ROOM_CAP_RESTRICTED) - val couldUpgradeToRestricted = when (restrictedSupport) { - HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED -> true - HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED_UNSTABLE -> vectorPreferences.labsUseExperimentalRestricted() - else -> false - } + val couldUpgradeToRestricted = restrictedSupport == HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED val choices = if (restrictedSupportedByThisVersion || couldUpgradeToRestricted) { listOf( diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index 7c2b983859..f46ab86c7c 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -150,7 +150,6 @@ class VectorPreferences @Inject constructor(private val context: Context) { private const val SETTINGS_ENABLE_SEND_VOICE_FEATURE_PREFERENCE_KEY = "SETTINGS_ENABLE_SEND_VOICE_FEATURE_PREFERENCE_KEY" const val SETTINGS_LABS_ALLOW_EXTENDED_LOGS = "SETTINGS_LABS_ALLOW_EXTENDED_LOGS" - const val SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE = "SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE" const val SETTINGS_LABS_SPACES_HOME_AS_ORPHAN = "SETTINGS_LABS_SPACES_HOME_AS_ORPHAN" const val SETTINGS_LABS_AUTO_REPORT_UISI = "SETTINGS_LABS_AUTO_REPORT_UISI" const val SETTINGS_PREF_SPACE_SHOW_ALL_ROOM_IN_HOME = "SETTINGS_PREF_SPACE_SHOW_ALL_ROOM_IN_HOME" @@ -246,7 +245,6 @@ class VectorPreferences @Inject constructor(private val context: Context) { SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY, SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY, SETTINGS_LABS_ALLOW_EXTENDED_LOGS, -// SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE, SETTINGS_DEVELOPER_MODE_FAIL_FAST_PREFERENCE_KEY, SETTINGS_USE_RAGE_SHAKE_KEY, @@ -967,10 +965,6 @@ class VectorPreferences @Inject constructor(private val context: Context) { } } - fun labsUseExperimentalRestricted(): Boolean { - return defaultPrefs.getBoolean(SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE, false) - } - private fun labsSpacesOnlyOrphansInHome(): Boolean { return defaultPrefs.getBoolean(SETTINGS_LABS_SPACES_HOME_AS_ORPHAN, false) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt index 00b4b64296..d9c18db01d 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt @@ -125,11 +125,7 @@ class CreateSpaceViewModelTask @Inject constructor( val restrictedSupport = homeServerCapabilities .isFeatureSupported(HomeServerCapabilities.ROOM_CAP_RESTRICTED) - val createRestricted = when (restrictedSupport) { - HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED -> true - HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED_UNSTABLE -> vectorPreferences.labsUseExperimentalRestricted() - else -> false - } + val createRestricted = restrictedSupport == HomeServerCapabilities.RoomCapabilitySupport.SUPPORTED if (createRestricted) { session.createRoom(CreateRoomParams().apply { this.name = roomName diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index d77e04a6f1..9661127147 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -3562,11 +3562,11 @@ Spaces are a new way to group rooms and people. You are invited - + Experimental Space - Restricted Room. + Warning requires server support and experimental room version - Auto Report Decryption Errors. Your system will automatically send logs when an unable to decrypt error occurs diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index 96d5588ee6..d2e9df4985 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -44,12 +44,6 @@ android:key="SETTINGS_LABS_UNREAD_NOTIFICATIONS_AS_TAB" android:title="@string/labs_show_unread_notifications_as_tab" /> - - Date: Tue, 11 Jan 2022 10:03:30 +0100 Subject: [PATCH 55/56] Add a comment about the workaround --- .../im/vector/app/features/poll/create/CreatePollFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/java/im/vector/app/features/poll/create/CreatePollFragment.kt b/vector/src/main/java/im/vector/app/features/poll/create/CreatePollFragment.kt index 3ea44562c5..1d807654e8 100644 --- a/vector/src/main/java/im/vector/app/features/poll/create/CreatePollFragment.kt +++ b/vector/src/main/java/im/vector/app/features/poll/create/CreatePollFragment.kt @@ -52,6 +52,7 @@ class CreatePollFragment @Inject constructor( vectorBaseActivity.setSupportActionBar(views.createPollToolbar) views.createPollRecyclerView.configureWith(controller, disableItemAnimation = true) + // workaround for https://github.com/vector-im/element-android/issues/4735 views.createPollRecyclerView.setItemViewCacheSize(MAX_OPTIONS_COUNT + 4) controller.callback = this From 71eaac39aa0de69612210c80c74ca006a01bcd19 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 11 Jan 2022 11:06:29 +0000 Subject: [PATCH 56/56] fixing typo in carousel title --- vector/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 9661127147..9567f0beba 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -2517,7 +2517,7 @@ Unread messages - Own your conversions. + Own your conversations. End-to-end encrypted messaging for secure and independent communication, connected via Matrix. You\'re in control. Element lets you choose where you messages are stored, keeping you in control of your data.