From 985007a1c18241efb96b956a5b9e0f56ad70eeba Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sat, 26 Feb 2022 10:46:51 +0000 Subject: [PATCH 001/126] Translated using Weblate (Czech) Currently translated at 100.0% (2157 of 2157 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 | 43 ++--------------------- 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 9d0220f3a6..cf022172c2 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -38,7 +38,6 @@ Telefonní číslo Pozvání do místnosti %1$s a %2$s - Prázdná místnost %s povýšili tuto místnost. %1$s zrušili pozvánku do místnosti pro %2$s @@ -260,7 +259,6 @@ Trvalý odkaz Zobrazit dešifrovaný zdroj Nahlásit obsah - Odhlásit Hlasový hovor Video hovor @@ -281,7 +279,6 @@ Pouze kontakty Matrix Žádné výsledky Místnosti - Komunity Odeslat záznamy Odeslat záznamy zřícení @@ -334,8 +331,6 @@ \nPřejete si nějaké přidat nyní\? Omlouváme se, ale nebyla nalezena žádná externí aplikace pro dokončení této akce. Šifrovaná zpráva - - Prosím, přečtěte si a souhlaste s pravidly tohoto serveru: Neobsahuje platný JSON Znovu požádat o šifrovací klíče z vašich ostatních relací. @@ -360,10 +355,7 @@ Hovor probíhá… Protější strana hovor nepřijala. Informace - - ${app_name} potřebuje oprávnění pro přístup k Vašemu mikrofonu pro uskutečnění hlasových hovorů. - ANO NE Pokračovat @@ -373,16 +365,11 @@ Odmítnout Zobrazit členy Přejít na nepřečtené - %d člen %d členové %d členů - - - - Opustit místnost Opravdu chcete opustit tuto místnost\? PŘÍMÉ KONVERZACE @@ -431,8 +418,6 @@ ${app_name} potřebuje oprávnění pro přístup k Vaší kameře a mikrofonu pro uskutečnění video hovoru. \n \nProsím, povolte přístup na následující hlášce abyste mohli uskutečnit hovor. - - Tuto změnu nelze zvrátit, protože povyšujete uživatele na stejnou úroveň, jakou máte vy. \nOpravdu to chcete udělat\? Toto by mohlo znamenat, že někdo škodlivě zachytává Vaši komunikaci nebo že Váš telefon nedůvěřuje certifikátu poskytnutému vzdáleným serverem. @@ -440,12 +425,9 @@ Certifikát se změnil z toho, kterému Váš telefon důvěřoval. Toto je VELMI NEOBVYKLÉ. Je doporučeno, abyste NEPŘIJALI tento nový certifikát. Certifikát se změnil z původně důvěryhodného na nyní nedůvěryhodný. Server patrně obnovil svůj certifikát. Kontaktujte administrátora kvůli očekávanému otisku. Přijměte certifikát pouze pokud administrátor serveru publikoval otisk, který odpovídá tomu uvedenému výše. - Vyhledat Filtrovat členy místnosti Žádné výsledky - - Všechny zprávy Přidat na domovskou obrazovku Obrázek profilu @@ -462,7 +444,6 @@ Označit za přečtené Žádný Zrušit - Přihlásit se se single sign-on To není platná adresa Matrix serveru Domovský server není dostupný na této adrese, zkontrolujte ji prosím @@ -553,7 +534,6 @@ Neobdržíte oznámení o příchozích zprávách, je-li aplikace na pozadí. Start při zavádění Čas požadavku na sync vypršel - Prodleva mezi jednotlivými syncy Verze Verze olm @@ -603,7 +583,6 @@ Deaktivovat můj účet Objevování Správa Vašich nastavení pro objevování. - Analýza Odeslat analytická data ${app_name} sbírá anonymní analytická data pro vylepšení aplikace. @@ -612,7 +591,6 @@ Aktualizovat veřejné jméno Viděn naposledy %1$s @ %2$s - Ověření Přihlášen jako Domovský server @@ -661,7 +639,6 @@ Toto jsou experimentální funkce, které mohou selhat neočekávanými způsoby. Použijte obezřetně. Nastavit jako hlavní adresu Odebrat jako hlavní adresu - Motiv vzhledu Chyba dešifrování Veřejné jméno @@ -672,7 +649,6 @@ Export klíčů do místního souboru Export Prosím, vytvořte frázi k zašifrování exportovaných klíčů. Pro import klíčů budete muset zadat stejnou přístupovou frázi. - Obnovení zašifrovaných zpráv Správa zálohy klíčů Import E2E klíčů místností @@ -721,7 +697,6 @@ Importovat e2e klíče ze souboru \"%1$s\". Potvrďte porovnáním následujícího s nastavením uživatele ve svých dalších relacích: Pokud se neshodují, zabezpečení Vaší komunikace může být ohroženo. - Vybrat adresář místností Název serveru Všechny místnosti na serveru %s @@ -731,7 +706,6 @@ %d nepřečtené oznámené zprávy %d nepřečtených oznámených zpráv - %d místnost %d místnosti @@ -834,8 +808,6 @@ Úvod Místnosti Pozvaní - - %2$s Vás vykopnul z %1$s %2$s Vám zakázal %1$s Důvod: %1$s @@ -899,7 +871,6 @@ Uložit klíč obnovy Sdílet Uložit jako soubor - Záloha již existuje na Vašem domovském serveru Vypadá to, že jste již nastavili zálohu klíče z jiné relace. Chcete ji nahradit zálohou, již právě provádíte\? Nahradit @@ -942,7 +913,6 @@ Kontroluji stav zálohy Smazat zálohu Smazat Vaše zálohované šifrovací klíče ze serveru\? Ke čtení šifrované historie zpráv již nebude moci použít klíč obnovy. - Nikdy neztraťte šifrované zprávy Použíjte zálohu klíče Nový bezpečný klíč zpráv @@ -950,11 +920,8 @@ Verze Algoritmus Podpis - Ověřeno! Rozumím - - Žádost na ověření %s chce ověřit Vaši relaci Neznámá chyba @@ -1107,7 +1074,6 @@ Obsah byl nahlášen jako nepatřičný. \n \nPokud si dále nepřejete vidět obsah tohoto uživatele, můžete jej ignorovat a tím skrýt jejich zprávy. - Ignorovat uživatele Všechny zprávy (hlučné) Všechny zprávy @@ -1295,7 +1261,6 @@ Ověřit %s Ověřeno %s Čekám na %s… - Zprávy v této místnosti nejsou koncově šifrovány. Zprávy v této místnosti jsou koncově šifrovány. \n @@ -1443,7 +1408,6 @@ Vytiskněte a uložte na bezpečném místě Uložte je na USB nebo zálohový disk Nahrajte do svého osobního úložiště v cloudu - Šifrování zapnuto Zprávy v této místnosti jsou koncově šifrovány. Zjistěte více a ověřte uživatele v jejich profilech. Šifrování není zapnuto @@ -1855,7 +1819,6 @@ Skrýt pokročilé Ukázat pokročilé %1$d z %2$d - Udělit souhlas Zrušit můj souhlas Udělili jste souhlas pro odeslání emailových adres a telefonních čísel na tento server pro identity za účelem nalezení dalších uživatelů podle svých kontaktů. @@ -1948,8 +1911,6 @@ Při přepojování hovoru došlo k chybě Připojit Nejprve se poraďte - - Probíhající hovor (%1$s) Při vyhledávání telefonního čísla došlo k chybě Číselník @@ -2149,7 +2110,6 @@ Zadejte název nového serveru, který chcete prozkoumat. Přidat nový server Váš server - Omlouváme se, došlo k chybě během pokusu o přistoupení: %s Adresa prostoru Prohlédnout a spravovat adresy tohoto prostoru. @@ -2354,7 +2314,6 @@ Otázka nebo téma hlasování Vytvořit hlasování Hlasování - Odeslat e-maily a telefonní čísla na %s Vaše kontakty jsou soukromé. Pro zjištění uživatelů z vašich kontaktů, potřebujeme vaše svolení k odeslání informací o kontaktech na váš server identit. Relace byla odhlášena! @@ -2505,4 +2464,6 @@ %1$d dalších Zobrazit méně + %1$s, %2$s a další + %1$s a %2$s \ No newline at end of file From f507c6c4a9a4e07a9a0760abbd7f32398d8c29b7 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Sat, 26 Feb 2022 10:36:50 +0000 Subject: [PATCH 002/126] Translated using Weblate (Hungarian) Currently translated at 100.0% (2157 of 2157 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 | 41 ++--------------------- 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 40121e2d1a..000da846b8 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -39,7 +39,6 @@ Meghívó egy szobába %1$s és %2$s Üres szoba - Induló szinkronizáció: \nFiók betöltése… Induló szinkronizáció: @@ -179,7 +178,6 @@ Törlés Átnevezés Tartalom Bejelentése - vagy Meghívás Kijelentkezés @@ -202,7 +200,6 @@ Csak Matrix névjegyek Nincs találat Szobák - Naplófájlok küldése Összeomlásnaplók küldése Képernyőkép küldése @@ -230,11 +227,9 @@ Ez nem tűnik érvényes e-mail címnek Ez az e-mail cím már használatban van. Elfelejtetted a jelszavad? - A Matrix-kiszolgáló szeretné ellenőrizni, hogy nem vagy robot Meg kell adnod a fiókodhoz tartozó e-mail-címet. Az e-mail-címed ellenőrzés sikertelen: győződj meg róla, hogy rákattintottál az e-mailben található hivatkozásra - Adj meg egy érvényes URL-t Hibás JSON Nem tartalmazott érvényes JSON-t @@ -250,14 +245,10 @@ Hívás folyamatban… A hívott fél nem vette fel. Információ - - A ${app_name}nek engedélyre van szüksége a mikrofon eléréséhez, hogy hanghívás tudjon indítani. - A ${app_name}nek engedélyre van szüksége a mikrofonod és kamerád eléréséhez, hogy videohívást tudj indítani. \n \nEngedélyezd a hozzáférést a következő felugró ablakon, hogy hívást tudj indítani. - IGEN NEM Folytatás @@ -265,7 +256,6 @@ Csatlakozás Elutasítás Ugrás az olvasatlanra - Szoba elhagyása Biztos el akarod hagyni a szobát? KÖZVETLEN CSEVEGÉSEK @@ -292,7 +282,6 @@ A tanúsítvány eltér attól, amit a telefonoddal megbízhatónak jelöltél. Ez RENDKÍVÜL SZOKATLAN. Javasoljuk, hogy NE FOGADD EL ezt az új tanúsítványt. Egy korábban megbízhatónak jelölt tanúsítvány megváltozott. Lehet, hogy a szerver frissítette a tanúsítványát. Lépj kapcsolatba a szerver adminisztrátorával és egyeztesd az ujjlenyomatot. Csak akkor fogadd el a tanúsítványt, ha a szerver adminisztrátortól kapott ujjlenyomat megegyezik a fentivel. - Keresés Szobatagok szűrése Nincs találat @@ -337,7 +326,6 @@ Nyilvános Név frissítése Legutóbb láttuk %1$s @ %2$s - Azonosítás Bejelentkezve mint Matrix szerver @@ -366,7 +354,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< Ezek kísérleti funkciók, ezek elromolhatnak nem számított módokon. Használd elővigyázatossággal. Fő címnek állítás Kiszedés fő címek közül - Visszafejtés hiba Nyilvános név Munkamenet-azonosító @@ -377,7 +364,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< Exportálás Írj be jelmondatot Ellenőrizd a jelmondatot - E2E szoba kulcsok importálása Szoba kulcsok importálása Kulcsok importálás helyi fájlból @@ -389,7 +375,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< Hitelesítés Hogy ellenőrizni lehessen, hogy ez a munkamenet megbízható, kérlek használj más kommunikáció módot a tulajdonossal (pl.: személyesen vagy telefonon keresztül) és kérdezd meg hogy a kulcs amit lát a Felhasználói Beállítások alatt megegyezik-e az alábbi kulccsal: Ha nem egyeznek, akkor a kommunikáció biztonsága kompromittálva lehet. A jövőben ez a hitelesítési mód kényelmesebbé lesz téve. - Válassz egy szoba könyvtárat Szerver neve Összes szoba a %s szerveren @@ -473,7 +458,6 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< %d tagság változás Tagok listázása - %d tag %d tag @@ -482,13 +466,10 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."< %d új üzenet %d új üzenet - - %d olvasatlan üzenet %d olvasatlan üzenet - %d szoba %d szoba @@ -544,16 +525,10 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés A beszélgetés itt folytatódik Ez a szoba egy másik beszélgetés folytatása Régebbi üzenetek megjelenítéséhez kattints ide - - - - %d kiválasztva %d kiválasztva - - Rendszerriasztások vedd fel a kapcsolatot a szolgáltatás adminisztrátorával Ez a Matrix szerver túllépte valamely erőforrás korlátot így néhány felhasználó nem tud majd bejelentkezni. @@ -680,7 +655,6 @@ Helyezd biztonságba a kulcsokat, hogy ne vesszenek el. Kész Visszaállítási Kulcs mentése Mentés fájlba - Kérlek, készíts egy másolatot! Visszaállítási Kulcs megosztása… Visszaállítási Kulcs készítése jelmondatból, ez néhány másodpercet igénybe vehet. @@ -774,7 +748,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Üzenet küldése Enter billentyűvel Az Enter billentyű a virtuális billentyűzeten elküldi az üzenetet és nem új sort szúr be A jelszó nem érvényes - Média Alapértelmezett tömörítés Válassz @@ -811,8 +784,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Mellőz Ellenőrizve! Értem - - Ellenőrzési kérés %s szeretné ellenőrizni a munkamenetedet Ismeretlen Hiba @@ -909,7 +880,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Nincs Visszavonás Bontás - Nem érhető el Matrix-kiszolgáló ezen a címen, ellenőrizd Háttér Szinkronizálási Mód Optimalizált akkumulátor használat @@ -920,7 +890,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze \nEz befolyásolja a rádió és az akkumulátor használatot, és folyamatosan egy értesítés fog megjelenni arról, hogy a ${app_name} figyel a neki küldött eseményekre. Nincs szinkroniziálás a háttérben Nem leszel értesítve az érkező üzenetekről, ha az alkalmazás csak a háttérben fut. - Felderítés Felderítési beállítások megváltoztatása. Nem használsz Azonosítási Szervert @@ -990,7 +959,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Ez a tartalom nem idevalónak lett bejelentve. \n \n Ha nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra. - Integrációk Botok, hidak, kisalkalmazások és matrica csomagok kezeléséhez használj Integrációs Menedzsert. \n @@ -1207,7 +1175,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Ellenőrzés: %s Ellenőrizve: %s Várakozás %s felhasználóra… - Az üzenetek a szobában nincsenek végponttól végpontig titkosítva. A szobában az üzenetek végponttól végpontig titkosítva vannak. \n @@ -1353,7 +1320,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Nyomtasd ki és tárold valahol biztonságos helyen Mentsd el egy USB kulcsra vagy mentő eszközre Másold fel a személyes felhő tárhelyedre - Titkosítás bekapcsolva Ebben a szobában az üzenetek végpontok között titkosítottak. További információkért és ellenőrzéshez nyisd meg a felhasználók profiljait! Titkosítás nincs engedélyezve @@ -1674,7 +1640,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze QR kód Meghívás QR kóddal A QR kód beolvasásához szükség van kamera hozzáférésre. - Elutasítás Fogadás Nincsen jogosultságod konferenciahívás indításához @@ -1939,8 +1904,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Átadás Kapcsolódás Először tájékozódj - - Aktív hívás (%1$s) A telefonszám megkeresésekor hiba történt Tárcsázó számlap @@ -2110,7 +2073,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Add meg a felfedezni kívánt új szerver nevét. Új szerver hozzáadása Matrix szervered - Bocsánat, hiba történt a csatlakozáskor ide: %s Tér cím Tér címek megjelenítése és kezelése. @@ -2298,7 +2260,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Matrix szerver kiválasztása A matrix szervert nem sikerül elérni ezen az URL-en: %s. Ellenőrizd a kapcsolatodat vagy add meg a matrix szervert kézzel. Értesítések figyelése - A névjegyeid személyes adatok. Ahhoz, hogy a névjegyzéked alapján megtalálhass felhasználókat, szükségünk van az engedélyedre, hogy a névjegy adatokat elküldhessük az azonosítási szolgáltatásnak. Legalább %1$s válasz szükséges @@ -2456,4 +2417,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze %d szerver jogosultság változott %d szerver jogosultság változott + %1$s, %2$s és még mások + %1$s és %2$s \ No newline at end of file From ff08ed322fa892a024c877c0f73c0c160f94fde0 Mon Sep 17 00:00:00 2001 From: Linerly Date: Sat, 26 Feb 2022 00:00:43 +0000 Subject: [PATCH 003/126] Translated using Weblate (Indonesian) Currently translated at 100.0% (2157 of 2157 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 | 45 +---------------------- 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml index 097efda7a6..d7856089e8 100644 --- a/vector/src/main/res/values-in/strings.xml +++ b/vector/src/main/res/values-in/strings.xml @@ -3,7 +3,6 @@ Undangan Ruangan %1$s dan %2$s Ruangan kosong - Pengaturan OK Batal @@ -85,9 +84,7 @@ Nama server Pilih direktori ruang Terverifikasi - Gandakan ke clipboard - Kirim tampilan layar Mohon uraikan kutu tersebut. Apa yang Anda lakukan\? Apa yang Anda harapkan terjadi\? Apa yang sebenarnya terjadi\? Catat dari klien akan dikirim bersama laporan gangguan ini untuk mendalami kendala yang Anda temukan. Laporan gangguan ini, termasuk catat dan tangkapan layar, tidak akan terlihat secara umum. Jika Anda hanya ingin mengirimkan tulisan di atas, silakan hapus centang: @@ -96,20 +93,15 @@ Kemajuan (%s%%) Nama Pengguna Nama pengguna dan/atau kata sandi salah - Anda perlu memasukkan alamat email yang tertaut pada akun. Verifikasi alamat email gagal: pastikan tautan yang termuat di email telah diklik - JSON amburadul Tidak berisi JSON yang sah Pengajuan yang dikirimkan terlalu banyak Panggilan Video Masuk Panggilan Suara Masuk Panggilan Sedang Berlangsung… - - ${app_name} membutuhkan permisi atas akses mikrofon Anda untuk melakukan panggilan audio. - ${app_name} membutuhkan izin untuk mengakses kamera dan mikrofon Anda untuk melakukan panggilan video. \n \nHarap berikan akses pada halaman berikut ini untuk melakukan panggilan. @@ -142,19 +134,11 @@ %d perubahan keanggotaan Panggilan - - Daftar Anggota Arahkan ke pesan yang belum dibaca - - %d anggota - - - - Tinggalkan ruang Apa benar Anda ingin meninggalkan ruangan ini\? PERCAKAPAN LANGSUNG @@ -189,12 +173,9 @@ %d terpilih - Cari Saring anggota ruang Tidak ada hasil - - Semua pesan Tambahkan ke Layar Utama Gambar Profil @@ -263,8 +244,6 @@ Beranda Ruangan Telah Diundang - - Anda telah dikeluarkan dari %1$s oleh %2$s Anda telah dicekal dari %1$s oleh %2$s Alasan: %1$s @@ -303,13 +282,11 @@ Apabila cocok, tekan tombol verifikasi berikut. Apabila tidak, seseorang sedang menyadap perangkat ini dan mungkin perlu diblokir. Di masa mendatang proses verifikasi ini akan dimutakhirkan. - Semua ruangan dalam server %s Semua ruangan bawaan %s %d pesan pemberitahuan yang belum dibaca - Singkapan Riwayat Ruangan Siapa yang dapat membaca riwayat\? Siapapun @@ -323,7 +300,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Ini adalah fitur uji coba dan mungkin rusak tanpa terduga. Hati-hati menggunakannya. Tentukan sebagai alamat utama Tidak tentukan sebagai alamat utama - Tema Kesalahan dekripsi Nama perangkat @@ -335,7 +311,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Ekspor Masukkan kata sandi Tegaskan kata sandi - Mendengarkan peristiwa Pemberitahuan pihak ketiga Hak cipta @@ -371,7 +346,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Nama Perangkat Terakhir terlihat %1$s @ %2$s - Otentikasi Masuk sebagai Homeserver @@ -663,7 +637,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Gagal membuat koneksi real-time. \nSilakan minta administrator homeserver Anda untuk mengkonfigurasi server TURN agar panggilan untuk bekerja dengan andal. ${app_name} Panggilan Gagal - URL API homeserver Kirim riwayat permintaan pemberian kunci Space @@ -1011,7 +984,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Integrasi dinonaktifkan Pengelola integrasi Izinkan integrasi - Ini akan menggantikan Kunci atau Frasa Anda saat ini. Buat Kunci Keamanan baru atau atur Frasa Keamanan baru untuk cadangan yang ada. Lindungi dari kehilangan akses ke pesan & data terenkripsi dengan mencadangkan kunci enkripsi di server Anda. @@ -1032,7 +1004,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. %d detik - Anda tidak akan diberitahu tentang pesan masuk saat aplikasi berada di latar belakang. Tidak ada sinkronisasi latar belakang ${app_name} akan disinkronkan di latar belakang secara berkala pada waktu yang tepat (dapat dikonfigurasi). @@ -1076,7 +1047,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Memutuskan sambungan dari server identitas Anda akan membuat Anda tidak dapat ditemukan oleh pengguna lain dan Anda tidak akan dapat mengundang orang lain melalui email atau nomor telepon. Kirim email dan nomor telepon Anda telah memberikan persetujuan untuk mengirim email dan nomor telepon ke server identitas ini untuk menemukan pengguna lain dari kontak Anda. - Anda sedang berbagi email atau nomor telepon di server identitas %1$s. Anda harus menyambungkan kembali ke %2$s untuk berhenti membagikannya. Setujui Persyaratan Layanan server identitas (%s) agar Anda dapat ditemukan melalui email atau nomor telepon. Kami mengirimi Anda email konfirmasi ke %s, periksa email Anda dan klik tautan konfirmasi @@ -1147,7 +1117,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Semua pesan Semua pesan (brisik) Abaikan pengguna - Konten ini telah dilaporkan sebagai tidak pantas. \n \nJika Anda tidak ingin melihat konten dari pengguna ini, Anda dapat mengabaikan pengguna itu untuk menyembunyikan pesan dari pengguna. @@ -1295,11 +1264,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Kesalahan Tidak Diketahui %s ingin memverifikasi sesi Anda Permintaan Verifikasi - - Saya mengerti Terverifikasi! - Tanda Tangan Algoritma Versi @@ -1316,7 +1282,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Jangan kehilangan pesan terenkripsi Lindungi dari kehilangan akses ke pesan & data terenkripsi Cadangan Aman - Hapus kunci enkripsi yang sudah dicadangkan dari server\? Anda akan tidak dapat menggunakan kunci pemulihan untuk membaca riwayat pesan terenkripsi. Hapus Cadangan Memeriksa status cadangan @@ -1364,7 +1329,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Sepertinya Anda telah menyiapkan cadangan kunci dari sesi lain. Apakah Anda ingin menggantinya dengan yang Anda buat\? Cadangan sudah ada di homeserver Anda Kunci pemulihan telah disimpan. - Simpan sebagai File Bagikan Simpan Kunci Pemulihan @@ -1543,7 +1507,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. \nPesan Anda diamankan dengan kunci dan hanya Anda dan penerima memiliki kunci unik untuk mengakses mereka. Pesan ini tidak terenkripsi secara ujung-ke-ujung. Pesan di ruangan ini tidak terenkripsi secara ujung-ke-ujung. - Menunggu untuk %s… Diverifikasi %s Verifikasi %s @@ -1733,7 +1696,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Tingkatkan Mohon sabar, ini mungkin membutuhkan waktu yang lama. Bergabung ke ruangan yang diganti - Ruangan Tanpa Nama Beberapa ruangan mungkin disembunyikan karena mereka privat dan Anda membutuhkan undangan. Beberapa ruangan mungkin disembunyikan karena mereka privat dan Anda membutuhkan undangan. @@ -2086,7 +2048,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Jika Anda batalkan, Anda mungkin kehilangan pesan terenkripsi dan data Anda jika Anda kehilangan akses ke login Anda. \n \nAnda juga dapat mengatur Cadangan Aman dan kelola kunci Anda di Pengaturan. - Salin ke penyimpanan awan pribadi Anda Simpan di flashdisk atau penyimpanan cadangan Cetak dan simpan di tempat yang aman @@ -2179,8 +2140,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. %1$d panggilan aktif · - - Panggilan aktif (%1$s) Ada sebuah kesalahan saat mencari nomor telepon Tombol penyetel @@ -2275,7 +2234,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Pertanyaan atau topik poll Buat Poll Poll - Kirim email dan nomor telepon ke %s Kontak Anda privat. Untuk menemukan pengguna dari kontak Anda, kami membutuhkan izin untuk mengirim info kontak ke server identitas Anda. Sesinya telah dikeluarkan! @@ -2321,7 +2279,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. di sini Bantu kami mengidentifikasi masalah-masalah dan membuat ${app_name} lebih baik dengan membagikan data penggunaan anonim. Untuk memahami bagaimana orang-orang menggunakan beberapa perangkat-perangkat, kami akan membuat pengenal acak, yang dibagikan oleh perangkat Anda. \n -\n \nAnda dapat membaca semua kebijakan kami %s. Bantu buat ${app_name} lebih baik Aktifkan @@ -2415,4 +2372,6 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. %d perubahan ACL server + %1$s, %2$s dan lainnya + %1$s dan %2$s \ No newline at end of file From 91418493a6501b115decb219cf80276662a44807 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sun, 27 Feb 2022 07:09:54 +0000 Subject: [PATCH 004/126] Translated using Weblate (Japanese) Currently translated at 97.4% (2103 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- vector/src/main/res/values-ja/strings.xml | 138 +++++++++++++++------- 1 file changed, 97 insertions(+), 41 deletions(-) diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index d249aeb745..0d35cc8c99 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -23,7 +23,6 @@ ルームへの招待 %1$sと%2$s 空のルーム - %1$sが今後のルーム履歴を%2$sに見えるように設定しました。 ルームのメンバー全員(招待された時点から) ルームのメンバー全員(参加した時点から) @@ -86,7 +85,6 @@ 招待中 低優先度 会話 - 不具合を報告 不具合の内容と状況の説明をお願いします。何をしましたか?何が起こるべきでしたか?実際に起こった事象は何でしょうか? ここに不具合の内容を記述 @@ -173,7 +171,6 @@ 最後のオンライン日時 %1$s @ %2$s 認証 - ログイン中のアカウント 言語を選択 言語 @@ -220,11 +217,9 @@ ルーム サインアウト 送信 - このホームサーバーは、あなたがロボットではないことの確認を求めています アカウントに登録されたメールアドレスの入力が必要です。 メールアドレスの確認に失敗しました:電子メールのリンクをクリックしたことを確認してください - 不正な形式のJSON 有効なJSONを含んでいませんでした ログイン要求が多すぎます @@ -256,7 +251,6 @@ %sの全てのメッセージを表示しますか? \n \nこの操作はアプリを再起動するため、時間がかかる場合があります。 - 外観 公開端末名 ルームのエンドツーエンド暗号鍵をエクスポート @@ -272,14 +266,10 @@ Matrixの連絡先のみ 通信先が通話の受取に失敗しました。 情報 - - ${app_name}は、音声通話を実行するためにマイクへアクセスするための許可を必要としています。 - ${app_name}はビデオ通話を行うためにカメラとマイクにアクセスする許可を必要としています。 \n \n通話をするためには、次のポップアップでアクセスを許可してください。 - 発言を通報 写真を撮影 動画を撮影 @@ -289,7 +279,6 @@ リクエストの送信に失敗しました。 ウィジェットを作成できません。 ウィジェットをこのルームから削除してもよろしいですか? - 一致していない場合は、あなたのコミュニケーションの安全性が損なわれている可能性があります。 このセッションでは、未検証のセッションに対して暗号化されたメッセージを送信しない。 認証済のセッションに対してのみ暗号化 @@ -306,7 +295,6 @@ 通知あり(音量大) 通知あり(サイレント) 不具合の報告 - このユーザーにあなたと同じ権限を与えます。この変更は取り消せません。 \nよろしいですか? 信用する @@ -318,7 +306,6 @@ 証明書はあなたの電話により信頼されていたものから変更されています。これはきわめて異常な事態です。この新しい証明書を承認しないことを強く推奨します。 証明書は以前信頼されていたものから信頼されていないものへと変更されています。サーバーがその証明書を更新した可能性があります。サーバーの管理者に連絡して、適切なフィンガープリントを確認してください。 サーバーの管理者が上のフィンガープリントと一致するものを発行した場合に限り、証明書を承認してください。 - 検索 このアプリの情報をシステム設定で表示。 アプリの情報 @@ -355,7 +342,6 @@ ホーム画面にショートカットを作成 インラインURLプレビュー コミュニティーのアバター - 暗号鍵を要求している新しいセッション \'%s\' を追加しました。 未認証のセッション \'%s\' が暗号鍵を要求しています。 作成 @@ -370,15 +356,12 @@ %d個のメンバーシップの変更 メンバーを表示 - %d名のメンバー %d件の新しいメッセージ - - アバター スタンプを送る ダウンロード @@ -392,10 +375,6 @@ 申し訳ありません、この操作を完了するための外部アプリが見つかりません。 あなたの他のセッションに暗号鍵を再要求する。 鍵をこのセッションに送信できるように、メッセージを復号化できる他の端末で${app_name}を起動してください。 - - - - %d個選択済 @@ -408,7 +387,6 @@ %d件の通知された未読メッセージ - %d個のルーム @@ -430,8 +408,6 @@ 表示するニックネームを変更 Markdown書式の入/切 Matrixアプリの管理を修正するには - - %1$sのホームサーバーの使用を継続するには、利用規約を確認し、同意する必要があります。 エラー 今すぐ確認 @@ -472,13 +448,11 @@ 会話から追放 鍵のバックアップ 鍵のバックアップを使用 - 詳細な通知設定 バックグラウンド同期モード バッテリーを考慮して最適化 リアルタイム性を重視して最適化 バックグラウンド同期を行わない - 入力中通知を送信 文字入力中であることを他のメンバーに伝えます。 開封確認メッセージを表示 @@ -732,7 +706,7 @@ QRコード QRコードによる追加 コードを共有 - ${app_name} で会話しましょう:%s + ${app_name}で話しましょう:%s 友達を招待 既知のユーザー 無効なQRコード(無効なURI)! @@ -812,7 +786,6 @@ ビデオ通話が行われています… 有効な認証情報がないため、権限がありません ${app_name} 呼び出し失敗 - ルームディレクトリの全てのルームを表示(露骨なコンテンツのあるルームを含む)する。 露骨なコンテンツのあるルームを表示 ルームディレクトリ @@ -970,7 +943,6 @@ %1$sがルームのアバターを削除しました ルームの説明を削除しました ルーム名を削除しました - ディスカバリー設定を管理します。 ディスカバリー(発見) これにより、現在のキーまたはフレーズが置き換えられます。 @@ -1101,7 +1073,6 @@ 鍵のバックアップで管理 鍵のバックアップを使用 暗号化されたメッセージとデータへのアクセスが失われるのを防ぎましょう - バックアップされた暗号鍵をサーバーから削除しますか?今後、現在のリカバリーキーを使って、暗号化されたメッセージの履歴を読むことができなくなります。 バックアップを削除 バックアップの状態を確認しています @@ -1151,7 +1122,6 @@ 別のセッションで鍵のバックアップを既に設定しているようです。上書きしますか? ホームサーバーにバックアップが存在しています リカバリーキーが保存されました。 - リカバリーキーを保存 コピーをしました リカバリーキーはパスワードマネージャー(もしくは金庫)のような、非常に安全な場所で保管してください @@ -1363,11 +1333,8 @@ 不明なエラー このルームを含む参加済のスペース このルームにアクセスできるスペースを決定します。スペースが選択されると、そのメンバーはルーム名を見つけて参加できます。 - - 了解 完了しました! - メッセージの新しい鍵 暗号化されたメッセージを決して失わないために セキュアバックアップ @@ -1418,7 +1385,6 @@ この操作を実行するための権限がありません。システム設定から権限を付与してください。 IDサーバーに接続できませんでした IDサーバーのURLを入力 - 同意する 同意を撤回 あなたの連絡先から他のユーザーを発見するために、メールアドレスや電話番号をこのIDサーバーに送信することに同意しています。 @@ -1642,7 +1608,7 @@ あなたの非公開スペース あなたの公開スペース 自分のみ - スレッドでディスカッションを整理して管理 + スレッドで議論を整理して管理 %sを待機しています… この端末でスキャン 認証を送信済 @@ -1744,7 +1710,6 @@ このファイルは大きすぎてアップロードできません。 この情報の送信に同意しますか? 連絡先を発見するには、連絡先のデータ(電話番号や電子メール)をあなたのIDサーバーに送信する必要があります。プライバシーの保護のため、データは送信前にハッシュ化されます。 - メールアドレスと電話番号を%sに送信 このIDサーバーはポリシーを提供していません IDサーバーのポリシーを隠す @@ -1886,7 +1851,6 @@ 自分の会話は、自分のもの。 %1$sがこのルームを「招待者のみ参加可能」に設定しました。 選択したメッセージをネタバレとして送信 - %1$sはこのルームを「リンクを知っている人が参加可能」に設定しました。 初めに設定画面でIDサーバーの利用規約を承認してください。 初めにIDサーバーを設定してください。 @@ -1910,7 +1874,7 @@ \nアップグレードは通常、ルームがサーバー上で処理される仕方にだけ影響します。 一度有効にしたルームの暗号化は無効にすることはできません。暗号化されたルームで送信されたメッセージは、サーバーからは見ることができず、そのルームのメンバーだけが見ることができます。暗号化を有効にすると、多くのボットやブリッジが正常に動作しなくなる場合があります。 %sして、このルームを皆に紹介しましょう。 - このコードを皆と共有し、スキャンして追加してもらい、会話を始めましょう。 + このコードを共有し、スキャンして追加してもらい、会話を始めましょう。 正当な参加者が%sにアクセスできることを確認してください。 参加者を追加 @@ -2183,7 +2147,6 @@ 暗号化されたメッセージにアクセスするには、あなたの他のセッションからログインを検証し、本人確認を行う必要があります。 詳しく知る セキュリティーを高めるために、使い捨てコードが一致しているのを確認して、%sを検証しましょう。 - 暗号化の設定が正しくありません。 暗号化を復元 暗号化を有効な状態に取り戻すために、管理者に連絡してください。 @@ -2228,7 +2191,7 @@ %1$sの権限レベルを変更しました。 誰と使いますか? どんなスペースを作りますか? - あなたとチームメイトの非公開のスペース + 自分と仲間の非公開のスペース ルームを整理するためのプライベートスペース ここが会話のスタート地点です。 ここが%sのスタート地点です。 @@ -2266,4 +2229,97 @@ 全てリセット 連絡先 検証がキャンセルされました。再び検証を開始することができます。 + 押し続けて録音し、離すと送信 + セキュリティー向上のため、PINコードを選択してください + + %d個のサーバーアクセス制御リストの変更 + + 置き換えられたルームに参加 + このルームが発見できません。存在することを確認してください。 + 指紋や顔画像など、端末に固有の生体認証を有効にしてください。 + 絵文字で検証 + テキストで検証 + すべてのセッションを検証し、アカウントとメッセージが安全であることを確認してください + ログインしている場所を確認 + 復旧用の手段を全て無くしてしまいましたか?全てリセットする + 、あるいはクロス署名に対応した他のMatrixのクライアント + どのような議論を%sで行いたいですか? + クロス署名の設定に失敗しました + 履歴とメッセージが消去され、信頼済の端末、信頼済のユーザーが取り消されます + 全てをリセットすると + 最新の${app_name}を他の端末で、${app_name} ウェブ版、${app_name} デスクトップ版、${app_name} iOS、${app_name} Android、あるいはクロス署名に対応した他のMatrixのクライアントでご使用ください + スライドして通話を終了 + 電話番号を検索する際にエラーが発生しました + 着信を拒否しました + それぞれにルームを作りましょう。後から追加することもできます(既にあるルームも追加できます)。 + 分かるように特徴を記入してください。これはいつでも変更できます。 + 目立つように特徴を記入してください。これはいつでも変更できます。 + 未読のメッセージ数のみを通知に表示。 + 2分間${app_name}を使用しないと、PINコードが要求されます。 + 🔐️ ${app_name}で話しましょう + 個人情報保護の観点から、${app_name}はハッシュ化されたメールアドレスと電話番号の送信のみをサポートしています。 + アプリの名前を変更しました!アプリは最新版で、アカウントにはログイン済です。 + ステートイベントを送信 + ステートイベント + カスタムのステートイベントを送信 + ステートイベントを送信しました! + 続行するには名前を付けてください。 + どんな作業に取り組みますか? + + あと%1$d件 + + Matrix上の連絡先を検索 + 通話の転送中にエラーが発生しました + 2分後にPINコードを要求 + ルーム名やメッセージの内容などの詳細を表示。 + エラーが多すぎます。ログアウトしました + 警告!もう一度誤ったコードを入力すると、ログアウトします! + + コードが誤っています。残りの試行回数は%d回です + + プッシュ通知を有効にするには、設定を確認してください + リンク %1$s は別のサイトに移動します:%2$s +\n +\n続行してよろしいですか? + このリンクを再確認してください + ログインを検証してください:%1$s + 機密ストレージのアクセスに失敗しました + この設定を有効にすると、全てのアクティビティーにFLAG_SECUREを追加します。変更を有効にするにはアプリケーションの再起動が必要です。 + このアカウントは無効化されています。 + 個人のクラウドストレージにコピーしましょう + 印刷して安全な場所に保管しましょう + %2$sと%1$sが設定されました。 +\n +\n安全な場所で保管してください!それらは、アクティブなセッションを全て失ってしまった際、暗号化されたメッセージや安全な情報のロックを解除するために必要となります。 + 作成したアイデンティティーキーを公開しています + アプリケーションのスクリーンショットを防ぐ + 続行するには%1$sか%2$sを使用してください。 + エラーのためメッセージが送信されませんでした + %sにいない人を探していますか? + 直接${app_name}で招待を受け取るには、設定画面から%sしてください。 + PINコードを入力しなければ${app_name}のロックを解除することはできません。 + ${app_name}を開く際にはPINコードの入力が必要です。 + あなたがブロックされているルームを開くことはできません。 + PINコードの検証に失敗しました。新しいコードを入力してください。 + 端末の連絡先がありません + 暗号化の履歴を待機しています + 送信者があなたのセッションを信頼していないため、このメッセージにアクセスすることができません + 送信者によりブロックされているため、このメッセージにアクセスすることができません + このメッセージを待機しています。時間がかかる可能性があります + ルームの設定の変更に成功しました + 確認のため、セキュリティーフレーズを再入力してください。 + ホームサーバー(%1$s)が、IDサーバーに%2$sを設定するよう提案しています + IDサーバー %s から切断しますか? + ダイレクトメッセージを作成できませんでした。招待したユーザーを確認し、もう一度やり直してください。 + セキュリティーフレーズ + 自分と仲間 + メッセージの種類がありません + 絵文字の一覧を閉じる + 絵文字の一覧を開く + 認証に失敗しました + 復旧を設定しています。 + このセッションは、他のセッションと検証を共有することができません。 +\n検証は端末に保存され、新しいバージョンのアプリで共有されます。 + %1$s、%2$s他 + %1$sと%2$s \ No newline at end of file From a4d9b4d5a80046d35ee7e71cb24aee3e14059b34 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Sat, 26 Feb 2022 00:11:55 +0000 Subject: [PATCH 005/126] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2157 of 2157 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 | 43 +------------------ 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index b603364d4e..b9e2fa3791 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -39,7 +39,6 @@ Convite de Sala %1$s e %2$s Sala vazia - Seu convite %1$s criou a sala Você criou a sala @@ -244,7 +243,6 @@ Deletar Renomear Reportar Conteúdo - ou Convidar Fazer signout @@ -267,7 +265,6 @@ Contatos de Matrix somente Nenhum resultado Salas - Enviar logs Enviar crash logs Enviar screenshot @@ -295,11 +292,9 @@ Isto não parece com um endereço de email válido Este endereço de email já está definido. Esqueceu senha\? - Este servidorcasa gostaria de assegurar que você não é um robô O endereço de email linkado a sua conta deve ser entrado. Falha para verificar endereço de email: assegure-se que clicou no link no email - Por favor entre um URL válido JSON malformado Não continha JSON válido @@ -315,14 +310,10 @@ Chamada Em Progresso… O lado remoto falhou para atender. Informação - - ${app_name} precisa de permissão para acessar seu microfone para performar chamadas de áudio. - ${app_name} precisa de permissão para acessar sua câmera e seu microfone para performar chamadas de vídeo. \n \nPor favor permita acesso no próximo pop-up para ser capaz de fazer a chamada. - SIM NÃO Continuar @@ -330,7 +321,6 @@ Juntar-se Rejeitar Pular para não-lida(s) - Sair de sala Você tem certeza que você quer sair da sala\? Mensagens Diretas @@ -357,7 +347,6 @@ O certificado tem mudado de um que era confiado por seu telefone. Isto é ALTAMENTE INCOMUM. É recomendado que você NÃO ACEITE este novo certificado. O certificado tem mudado de um previamente confiado para um que não é confiado. O servidor pode ter renovado seu certificado. Contacte o/a administrador(a) de servidor para a impressão digital esperada. Somente aceite o certificado se o/a administrador(a) de servidor tem publicado uma impressão digital que corresponde com a acima. - Pesquisar Filtrar membros de sala Nenhum resultado @@ -402,7 +391,6 @@ Atualizar Nome Público Visto por último %1$s @ %2$s - Autenticação Feito login como Servidorcasa @@ -433,7 +421,6 @@ Estes são recursos experimentais que podem quebrar de maneiras inesperadas. Use com cuidado. Definir como endereço principal Des-definir como endereço principal - Erro de decriptação Nome público ID de sessão @@ -444,7 +431,6 @@ Exportar Entrar frasepasse Confirmar frasepasse - Importar chaves de sala E2E Importar chaves de sala Importar as chaves de um arquivo local @@ -456,7 +442,6 @@ Verificar Confirme ao comparar o seguinte com as Configurações de Usuária(o) em sua outra sessão: Se não correspondem, a segurança de sua comunicação pode estar comprometida. - Selecionar um diretório de salas Nome de servidor Todas as salas em servidor %s @@ -532,7 +517,6 @@ Você foi expulsa(o) de %1$s por %2$s Você foi banida(o) de %1$s por %2$s Razão: %1$s - %d membro %d membros @@ -541,8 +525,6 @@ %d nova mensagem %d novas mensagens - - %d mudança de filiação %d mudanças de filiação @@ -552,7 +534,6 @@ %d mensagem notificada não-lida %d mensagens notificadas não-lidas - %d sala %d salas @@ -576,10 +557,6 @@ Desculpe, nenhum aplicativo externo tem sido encontrado para completar esta ação. Re-requisitar chaves de encriptação de suas outras sessões. Por favor lance ${app_name} num outro dispositivo que possa decriptar a mensagem para que ele possa enviar as chaves para esta sessão. - - - - %d selecionada %d selecionadas @@ -603,8 +580,6 @@ Muda seu apelido de exibição Ativar/Desativar markdown Para consertar gerenciamento de Apps Matrix - - Para continuar usando o servidorcasa %1$s você deve revisar e aceitar os termos e condições. Revisar agora Desativar Conta @@ -690,7 +665,6 @@ Convites, remoções e bans são desafetados. Mostrar eventos de conta Inclui mudanças de avatar e nome de exibição. - Restrições de background estão desabilitadas para ${app_name}. Este teste devia ser rodado usando dados móveis (sem Wi-Fi). \n%1$s Restrições de background estão habilitadas para ${app_name}. @@ -757,7 +731,6 @@ Copiar Sucesso Notificações - Chamada ${app_name} Falhou Falha para estabelecer conexão em tempo real. \nPor favor peça ao/à administrador(a) de seu servidorcasa para configurar um servidor TURN a fim que chamadas funcionem confiavelmente. @@ -805,7 +778,6 @@ \nIsto vai impactar uso de rádio e bateria, vai ter uma notificação permanente exibida declarando que ${app_name} está à escuta por eventos. Sem sinc em background Você não vai ser notificada(o) sobre mensagens entrantes quando o app está em background. - Integrações Use um gerenciador de integrações para gerenciar bots, bridges, widgets e pacotes de stickers. \nGerenciadores de integrações recebem dados de configuração, e podem modificar widgets, enviar convites de sala e definir níveis de poder em seu nome. @@ -921,7 +893,6 @@ Salvar Chave de Recuperação Compartilhar Salvar como Arquivo - A chave de recuperação tem sido salva. Um backup já existe em seu servidorcasa Parece que você já tem configurado backup de chave de uma outra sessão. Você quer substituí-lo pelo que você está criando\? @@ -975,7 +946,6 @@ Checando estado de backup Deletar Backup Deletar suas chaves de encriptação, das quais foi feito backup, do servidor\? Você não vai ser mais capaz de usar sua chave de recuperação para ler histórico de mensagens encriptadas. - Backup Seguro Salvaguardar-se contra perda de acesso a mensagens & dados encriptados Nunca perca mensagens encriptadas @@ -991,11 +961,8 @@ Versão Algoritmo - Verificada(o)! Entendido - - Requisição de Verificação %s quer verificar sua sessão Erro Desconhecido @@ -1159,7 +1126,6 @@ Este conteúdo foi reportado como inapropriado. \n \nSe você não quer ver mais nada de conteúdo desta(e) usuária(o), você pode ignorá-la(o) para esconder mensagens dela(e). - Ignorar usuária(o) Todas as mensagens (barulhento) Todas as mensagens @@ -1363,7 +1329,6 @@ Verificar %s Verificou %s Esperando por %s… - Mensagens nesta sala não são encriptadas ponta-a-ponta. Mensagens nesta sala são encriptadas ponta-a-ponta. \n @@ -1521,7 +1486,6 @@ Mensagem… Usar Arquivo Checando Chave de backup - Se você cancelar agora, você pode perder mensagens & dados encriptados se você perder acesso a seus logins. \n \nVocê também pode configurar Backup Seguro & gerenciar suas chaves em Configurações. @@ -1823,7 +1787,6 @@ Você poderia habilitar isto se a sala vai somente ser usada para colaborar com times internos em seu servidorcasa. Isto não poder ser mudado mais tarde. Bloquear qualquer pessoa que não é parte de %s de jamais se juntar a esta sala %1$d de %2$d - Dar consentimento Revogar meu consentimento Você tem dado seu consentimento para enviar emails e números de telefone para este servidor de identidade para descobrir outras(os) usuárias(os) de seus contatos. @@ -1913,8 +1876,6 @@ Transferir Conectar Consultar primeiro - - Chamada ativa (%1$s) Houve um erro ao procurar o número de telefone Pad de disco @@ -2112,7 +2073,6 @@ Enviar vídeo com o tamanho original Enviar vídeos com o tamanho original - Desculpe, um erro ocorreu enquanto tentando se juntar: %s Endereço de espaço Ver e gerenciar endereços deste espaço. @@ -2313,7 +2273,6 @@ Sondar pergunta ou tópico Criar Sondagem Sondagem - Enviar emails e números de telefone para %s Seus contatos são privados. Para descobrir usuárias(os) de seus contatos, você precisa de permissão para enviar info de contato a seu servidor de identidade. O signout desta sessão tem sido feito! @@ -2458,4 +2417,6 @@ %d mudança de ACLs de servidor %d mudanças de ACLs de servidor + %1$s, %2$s e outras(os) + %1$s e %2$s \ No newline at end of file From 8597d1144239ea11ed55fb3f8bb40f02274e8b20 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Fri, 25 Feb 2022 19:15:18 +0000 Subject: [PATCH 006/126] Translated using Weblate (Slovak) Currently translated at 98.8% (2132 of 2157 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 | 43 ++--------------------- 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index d9d9c7b1cd..18af56a598 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -39,7 +39,6 @@ Pozvanie do miestnosti %1$s a %2$s Prázdna miestnosť - %s aktualizoval/a túto miestnosť. Úvodná synchronizácia: \nPrebieha import účtu… @@ -197,7 +196,6 @@ Vymazať Premenovať Nahlásiť obsah - alebo Pozvať Odhlásiť sa @@ -220,7 +218,6 @@ Len Matrix kontakty Žiadne výsledky Miestnosti - Odoslať záznamy Odoslať záznamy o zlyhaní Odoslať snímku obrazovky @@ -248,11 +245,9 @@ Zdá sa, že toto nie je platná emailová adresa Táto emailová adresa sa už používa. Zabudli ste heslo? - Tento domovský server by sa rád uistil, že nieste robot Musíte zadať emailovú adresu prepojenú s vašim účtom. Nepodarilo sa overiť emailovú adresu: Uistite sa, že ste správne klikli na odkaz v emailovej správe - Zadajte platnú adresu URL Chybné údaje vo formáte JSON Neplatné údaje vo formáte JSON @@ -269,14 +264,10 @@ Prebiehajúci hovor… Vzdialenej strane sa nepodarilo prijať hovor. Informácia - - Aby ste mohli uskutočňovať audio hovory, ${app_name} potrebuje prístup k mikrofónu vašeho zariadenia. - ${app_name} potrebuje povolenie na prístup k vašej kamere a mikrofónu na uskutočňovanie videohovorov. \n \nPovoľte prístup v ďalších vyskakovacích oknách, aby ste mohli uskutočniť hovor. - ÁNO NIE Pokračovať @@ -284,7 +275,6 @@ Vstúpiť Odmietnuť Preskočiť na neprečítanú správu - Opustiť miestnosť Ste si istí, že chcete opustiť miestnosť? PRIAME KONVERZÁCIE @@ -311,7 +301,6 @@ Certifikát sa zmenil na iný, ktorému tento telefón dôveroval. Toto je VEĽMI NEZVYČAJNÉ. Odporúča sa, aby ste tento nový certifikát NEPRIJALI. Certifikát sa zmenil z predtým dôveryhodného na nedôveryhodný. Server mohol obnoviť svoj certifikát. Obráťte sa na správcu servera, aby vám poskytol očakávaný odtlačok. Dôverujte certifikátu len v prípade, že správca servera zverejnil odtlačok zhodný s odtlačkom zobrazeným vyššie. - Hľadať Filtrovať členov v miestnosti Žiadne výsledky @@ -364,7 +353,6 @@ Aktualizovať verejné meno Naposledy videné %1$s @ %2$s - Overenie Prihlásený ako Domovský server @@ -402,7 +390,6 @@ Tieto funkcie sú experimentálne a môžu sa nečakane pokaziť. Pri používaní buďte opatrní. Nastaviť ako hlavnú adresu Zrušiť nastavenie ako hlavnej adresy - Vzhľad Chyba dešifrovania Verejné meno @@ -414,7 +401,6 @@ Exportovať Zadajte prístupovú frázu Potvrďte prístupovú frázu - Importovať šifrovacie kľúče miestnosti Importovať kľúče miestnosti Importovať kľúče z lokálneho súboru @@ -426,7 +412,6 @@ Overiť Ak chcete overiť, či táto relácia je skutočne dôveryhodná, kontaktujte jeho vlastníka iným spôsobom (napr. osobne alebo cez telefón) a opýtajte sa ho, či kľúč, ktorý má zobrazený v Nastaveniach, sa zhoduje s kľúčom zobrazeným nižšie: Ak sa kľúče zhodujú, stlačte tlačidlo Overiť nižšie. Ak sa nezhodujú, niekto ďalší odpočúva toto zariadenie a mali by ste ho pridať na čiernu listinu. - Vyberte adresár miestností Názov servera Všetky miestnosti na serveri %s @@ -488,7 +473,6 @@ %d zmien členstva Zobraziť členov - 1 člen %d členovia @@ -499,14 +483,11 @@ %d nové správy %d nových správ - - 1 neprečítaná správa %d neprečítané správy %d neprečítaných správ - 1 miestnosť %d miestnosti @@ -546,10 +527,6 @@ Nebola nájdená žiadna vhodná aplikácia na dokončenie tejto akcie. Prosím, vložte svoje heslo. Ak je to možné, prosím popis napíšte v angličtine. - - - - 1 vybratý %d vybratí @@ -569,8 +546,6 @@ Mení vaše zobrazované meno / prezývku Zapnutie/vypnutie formátovanie textu markdown Užitočné na opravu spravovania Matrix aplikácií - - Táto miestnosť bola nahradená inou a nie je viac aktívna. Konverzácia pokračuje tu Táto miestnosť je pokračovaním predchádzajúcej konverzácii @@ -662,7 +637,6 @@ Pozvania, odstránenia a zákazy nie sú ovplyvnené. Zobrazovať udalosti účtu Zahŕňa zmeny zobrazovaného mena a obrázka v profile. - Heslo Spustiť predvolený fotoaparát v systéme namiesto zobrazenia vlastnej vstavanej obrazovky. Príkaz \"%s\" vyžaduje viac argumentov, alebo nie sú všetky zadané správne. @@ -735,7 +709,6 @@ Zrušiť Odpojiť sa Odmietnuť - Toto nie je platná adresa Matrix serveru Domovský server je nedostupný na tejto URL adrese, preverte to prosím Relácie @@ -799,7 +772,6 @@ \nBude to mať vplyv na používanie rádia a batérie, bude sa zobrazovať trvalé oznámenie, že ${app_name} počúva udalosti. Žiadna synchronizácia na pozadí Nebudete dostávať oznámenia o prichádzajúcich správach, keď aplikácia pracuje na pozadí. - Integrácie Použite správcu integrácií na nastavenie botov, premostení, widgetov a balíčkov s nálepkami. \nSprávcovia integrácie dostávajú konfiguračné údaje a môžu vo vašom mene upravovať widgety, posielať pozvánky do miestnosti a nastavovať úrovne oprávnení. @@ -897,7 +869,6 @@ Uložiť kľúč obnovenia Zdieľať Uložiť ako súbor - Kľúč obnovenia bol uložený. Záloha už existuje na vašom domovskom serveri Zdá sa, že ste si už zálohovanie kľúčov nastavili z inej relácie. Chcete ho nahradiť zálohou, ktorú vytvárate teraz\? @@ -953,7 +924,6 @@ Zisťovanie stavu zálohovania Vymazať zálohu Vymazať vaše zálohované šifrovacie kľúče z domovského servera\? Na čítanie histórie zašifrovaných správ už nebudete môcť použiť kľúč na obnovenie. - Bezpečné zálohovanie Zabezpečte sa proti strate šifrovaných správ a údajov Nikdy neprídete o šifrované správy @@ -971,11 +941,8 @@ Verzia Algoritmus Podpis - Overené! Rozumiem - - Žiadosť o overenie %s chce overiť vašu reláciu Neznáma chyba @@ -1381,7 +1348,6 @@ Nastavenia miestnosti Verzia miestnosti Nová hodnota - Číselník Zavolať späť Vyčistiť históriu @@ -1680,7 +1646,6 @@ Otvoriť ponuku vytvorenia miestnosti Zdá sa, že serveru trvá príliš dlho, kým odpovie, čo môže byť spôsobené buď zlým pripojením, alebo chybou servera. Skúste to o chvíľu znova. Súhlasíte so zaslaním týchto informácií\? - Preskočiť na potvrdenie o prečítaní Vlastné (%1$d) v %2$s Predvolené v %1$s @@ -1783,7 +1748,6 @@ Žiadna odpoveď Podržali ste hovor Automaticky aktualizovať nadradený priestor - Niektoré miestnosti môžu byť skryté, pretože sú súkromné a potrebujete pozvánku. Tento priestor nemá žiadne miestnosti Pre viac informácií sa obráťte na správcu domovského servera @@ -1906,7 +1870,6 @@ Zmienky a kľúčové slová Iba zmienky a kľúčové slová Medzinárodné telefónne čísla musia začínať znakom \"+\" - Ak chcete zistiť existujúce kontakty, potrebujete odoslať kontaktné informácie (e-maily a telefónne čísla) na server totožností. Pred odoslaním vaše údaje zahašujeme kvôli ochrane osobných údajov. Odoslať e-maily a telefónne čísla na %s Dali ste súhlas na odosielanie e-mailov a telefónnych čísel na tento server totožností na objavenie ďalších používateľov z vašich kontaktov. @@ -1965,7 +1928,6 @@ \n \nZastaviť proces zmeny hesla\? Zabudli ste alebo ste stratili všetky možnosti obnovy\? Obnovte všetko - Použite prístupovú frázu na obnovenie alebo kľúč Použite najnovšiu aplikáciu ${app_name} na svojich ostatných zariadeniach: Použite najnovšiu aplikáciu ${app_name} na svojich ostatných zariadeniach, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} pre Android alebo iného klienta Matrix podporujúceho krížové podpisovanie @@ -1994,7 +1956,6 @@ %1$d aktívne hovory · %1$d aktívnych hovorov · - Prebiehajúci hovor (%1$s) Pri vyhľadávaní telefónneho čísla došlo k chybe Žiadna odpoveď @@ -2164,7 +2125,6 @@ Táto relácia nemôže zdieľať toto overenie s vašimi ostatnými reláciami. \nOverenie bude uložené lokálne a zdieľané v budúcej verzii aplikácie. Akcie správcu - Zobrazujú sa len prvé výsledky, zadajte ďalšie písmená… Zatraste telefónom a otestujte prah detekcie Prahová hodnota detekcie @@ -2184,7 +2144,6 @@ Zadajte kľúčové slová pre vyhľadanie reakcie. Odobrať z nízkej priority Pridať k nízkej priorite - Na pokračovanie použite %1$s alebo %2$s. Ak chcete pokračovať, zadajte prístupovú frázu pre zálohovanie kľúčov. Generovanie kľúča SSSS z prístupovej frázy %s @@ -2476,4 +2435,6 @@ %d zmeny ACL servera %d zmien ACL servera + %1$s, %2$s a ďalší + %1$s a %2$s \ No newline at end of file From 8c6b15a1ede171c2438f37b56f0d674914e07454 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 25 Feb 2022 20:26:59 +0000 Subject: [PATCH 007/126] Translated using Weblate (Swedish) Currently translated at 100.0% (2157 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sv/ --- vector/src/main/res/values-sv/strings.xml | 57 ++++++----------------- 1 file changed, 15 insertions(+), 42 deletions(-) diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 38f7a60928..69c25ebba3 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -88,7 +88,6 @@ Telefonnummer Rumsinbjudan %1$s och %2$s - Tomt rum Inledande synk: \nImporterar konto… @@ -264,7 +263,6 @@ Återkalla Koppla ifrån Rapportera innehåll - eller Bjud in Godkänn @@ -296,7 +294,6 @@ Bara Matrix-kontakter Inga resultat Rum - Gemenskaper Skicka loggar Skicka kraschloggar @@ -322,7 +319,6 @@ Skicka röst Är du säker på att du vill starta ett röstsamtal\? Är du säker på att du vill skapa ett videosamtal\? - Skicka filer Skicka dekal Ta foto eller video @@ -339,11 +335,9 @@ Det här ser inte ut som en giltig e-postadress Den här e-postadressen är redan definierad. Glömt lösenordet\? - Denna hemserver skulle vilja verifiera att du inte är en robot Du måste skriva in e-postadressen länkad till ditt konto. Misslyckades att verifiera e-postadressen: se till att du klickade på länken i e-brevet - Vänligen granska och acceptera villkoren för denna hemserver: Vänligen skriv in en giltig URL Det här är inte en giltig Matrixserveradress @@ -374,14 +368,10 @@ Videosamtal pågår… Den andra parten svarade inte. Information - - ${app_name} behöver tillstånd att komma åt din mikrofon för hålla röstsamtal. - ${app_name} behöver tillstånd att komma åt din kamera och mikrofon för att kunna utföra videosamtal. \n \nVänligen ge tillstånd i nästa popup för att kunna utföra samtalet. - JA NEJ Fortsätt @@ -390,16 +380,10 @@ Avslå Lista medlemmar Hoppa till oläst - - %d medlem %d medlemmar - - - - Lämna rum Är du säker på att du vill lämna rummet\? DIREKTCHATT @@ -409,8 +393,6 @@ Kicka Ignorera Filtrera rumsmedlemmar - - Fäst rum med missade aviseringar Fäst rum med olästa meddelanden Alla rum på %s-servern @@ -420,7 +402,6 @@ %d rum Rum - Detta kommer att göra ditt konto permanent oanvändbart. Du kommer inte kunna logga in, och ingen kommer kunna registrera sig med samma användar-ID. Detta kommer att få ditt konto att lämna alla rum det är med i, och det kommer att ta bort din kontoinformation från din identitetsserver. Den här handlingen går inte att ångra. \n \nAtt inaktivera ditt konto får oss normalt inte att glömma meddelanden du har skickat. Om du skulle vilja att vi glömmer dina meddelanden, markera rutan nedan. @@ -456,7 +437,6 @@ Meddelanden som innehåller mitt visningsnamn Användarinställningar Innehåller byten av avatar eller visningsnamn. - Lösenord Byt lösenord Nuvarande lösenord @@ -473,7 +453,6 @@ Din återställningsnyckel är ett skyddsnät - du kan använda den för att återfå åtkomst till dina krypterade meddelanden om du skulle glömma din lösenfras. \nLagra din återställningsnyckel på något säkert ställe, t.ex. en lösenordshanterare (eller ett kassaskåp) Lagra din återställningsnyckel på något säkert ställe, t.ex. en lösenordshanterare (eller ett kassaskåp) - Byt nätverk Alla gemenskaper Allmänt @@ -483,7 +462,6 @@ Meddelanden i det här rummet är totalsträckskrypterade. Lär dig mer och verifiera användare i deras profiler. Avignorera Kunde inte verifiera den externa serverns identitet. - Alla meddelanden Lägg till e-postadress Lägg till telefonnummer @@ -541,7 +519,6 @@ Inaktivera mitt konto Upptäckbarhet Hantera dina upptäckbarhetsinställningar. - Inloggad som Hemserver Identitetsserver @@ -714,7 +691,6 @@ Använd den här sessionen för att verifiera din nya och ge den tillgång till krypterade meddelanden. Om du avbryter så kommer du inte kunna läsa krypterade meddelanden på den här enheten, och andra användare kommer inte att lita på den Om du avbryter så kommer du inte kunna läsa krypterade meddelanden på din nya enhet, och andra användare kommer inte att lita på den - När jag bjuds in till ett rum Samtalsinbjudningar Meddelanden skickade av en bott @@ -755,15 +731,12 @@ Integrationer är avstängda Aktivera \'Tillåt integrationer\' I inställningarna för att göra detta. Exportera nycklarna till en lokal fil - Importera nycklarna från en lokal fil - Välj en rumskatalog %d oläst aviserat meddelande %d olästa aviserade meddelanden - %1$s: %2$d meddelande %1$s: %2$d meddelanden @@ -783,7 +756,6 @@ Krypterat meddelande kontakta din tjänstadministratör Spara som fil - Radera dina säkerhetskopierade krypteringsnycklar från servern\? Du kommer inte längre kunna använda din återställningsnyckel för att läsa krypterad meddelandehistorik. Skydda dig mot att tappa åtkomst till krypterade meddelanden och data Nya säkra meddelandenycklar @@ -1013,7 +985,6 @@ Sätt upp säker säkerhetskopiering Alla nycklar säkerhetskopierade Algoritm - %s vill verifiera din session Visa borttagna meddelanden Visa en platshållare för borttagna meddelanden @@ -1029,7 +1000,6 @@ %1$s, %2$s och %3$d annan har läst %1$s, %2$s och %3$d andra har läst - Du ignorerar inga användare Annan Om du har skapat ett konto på en hemserver så kan du använda ditt Matrix-ID (t.ex. @användare:domän.com) och lösenord nedan. @@ -1124,7 +1094,6 @@ Du kommer inte att bli aviserad om inkommande meddelanden när appen är i bakgrunden. Starta vid boot Timeout för synkbegäran - Fördröjning mellan varje synkronisering Lokala kontakter Kontaktbehörighet @@ -1172,7 +1141,6 @@ Rummets interna ID Sätt som huvudadress Avsätt som huvudadress - Avkrypteringsfel Publikt namn Nycklar framgångsrikt importerade @@ -1253,7 +1221,6 @@ Skapa Hem Bjöd in - Du har blivit utsparkad från %1$s av %2$s Du har blivit bannad från %1$s av %2$s Orsak: %1$s @@ -1319,10 +1286,8 @@ Säkerhetskopierar %d nycklar… Signatur - Verifierad! Jag förstår - Verifieringsbegäran Okänt fel Det verkar som att du försöker ansluta till en annan hemserver. Vill du logga ut\? @@ -1525,7 +1490,6 @@ Verifiera %s Verifierade %s Väntar på %s… - Säkerhet Adminhandlingar Lämnar rummet… @@ -1830,7 +1794,6 @@ Dölj avancerat Visa avancerat %1$d av %2$d - Ge samtycke Återkalla mitt samtycke Du har gett samtycke att skicka e-postadresser och telefonnummer till den här identitetsservern för att upptäcka andra användare baserat på dina kontakter. @@ -1914,8 +1877,6 @@ Flytta Anslut Rådfråga först - - Aktivt samtal (%1$s) Ett fel inträffade när telefonnumret slogs upp Knappsats @@ -2003,7 +1964,7 @@ Jag och mina teamkamrater Att privat utrymme för att organisera dina rum Bara jag - Det till att rätt personer har åtkomst till %s. Du kan ändra detta senare. + Det till att rätt personer har åtkomst till %s. Vem jobbar du med\? För att gå med i ett existerande utrymme så behöver du en inbjudan. Detta kan ändras senare @@ -2112,7 +2073,6 @@ Ange namnet för en ny server du vill utforska. Lägg till en ny server Din server - För att utföra detta, vänligen ge kameraåtkomst från systeminställningarna. Vissa behörigheter saknas för att utföra detta, vänligen ge behörighet från systeminställningarna. Observera att uppgradering kommer att göra en ny version av rummet. Alla nuvarande meddelanden kommer att vara kvar i det här arkiverade rummet. @@ -2313,7 +2273,6 @@ Omröstningens fråga eller ämne Skapa omröstning Omröstning - Skicka e-postadresser och telefonnummer till %s Dina kontakter är privata. För att upptäcka användare från dina kontakter så behöver vi ditt tillstånd att skicka kontaktinfo till din identitetsserver. Sessionen har loggats ut! @@ -2446,4 +2405,18 @@ Kopiera länk till tråd Visa i rum Visa trådar + Rumsaviseringar + Användare + Avisera hela rummet + + %1$d till + %1$d till + + Visa mindre + %1$s, %2$s och fler + %1$s och %2$s + + %d server-ACL-ändring + %d server-ACL-ändringar + \ No newline at end of file From a4f04b704fbae4796c1592c678a9b3f19bae88c8 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 25 Feb 2022 22:42:34 +0000 Subject: [PATCH 008/126] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2157 of 2157 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 | 35 ++--------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 066a40fdf4..2f34fc66fb 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -39,7 +39,6 @@ Помилка Matrix Адреса електронної пошти Номер телефону - %s оновлює цю кімнату. Початкове налаштування: \nІмпортування даних облікового запису @@ -164,7 +163,6 @@ Видалити Перейменувати Поскаржитись на вміст - або Запрошення Вийти з облікового запису @@ -187,7 +185,6 @@ Лише Matrix-контакти Немає результатів Кімнати - Надіслати журнали Надіслати журнали помилок Надіслати знімок екрана @@ -235,7 +232,6 @@ Інформація Для здійснення аудіодзвінків потрібен доступ до мікрофону. Для здійснення відеодзвінків потрібен доступ до камери та мікрофону.\n\nБудь ласка, надайте його у наступних виринаючих вікнах, щоб мати змогу їх здійснити. - ТАК НІ Продовжити @@ -269,7 +265,6 @@ Сертифікат почав відрізнятися від того, якому довіряв ваш телефон. Це ДУЖЕ НЕЗВИЧНО. Наполегливо радимо НЕ ПРИЙМАТИ цей новий сертифікат. Сертифікат змінився з довіреного на недовірений. Сервер міг оновити свій сертифікат. Зв\'яжіться з адміністратором сервера, щоб отримати дійсний відбиток. Приймайте сертифікат лише у випадку збігу відбитку вище з відбитком, оприлюдненим адміністратором сервера. - Пошук Фільтр переліку користувачів Тут порожньо @@ -370,7 +365,6 @@ Експорт Введіть парольну фразу Підтвердіть парольну фразу - Імпортувати E2E ключі кімнати Імпортувати ключі кімнати Імпортувати ключі з локального файлу @@ -382,7 +376,6 @@ Звірити Підтвердьте, порівнявши вказане за допомогою налаштувань користувача в іншому сеансі: Якщо вони відрізняються, безпека вашого зв\'язку може бути під загрозою. - Вибір каталогу кімнат Ім\'я сервера Всі кімнати на сервері %s @@ -439,7 +432,6 @@ У вас поки що не має наліпок. \n \nДодати зараз\? - %d учасник %d учасники @@ -466,18 +458,12 @@ Помилка Системні сповіщення Якщо можливо, будь ласка, напишіть опис англійською. - - - - %d вибрано %d вибрано %d вибрано %d вибрано - - Попередній перегляд посилань Попередній перегляд медіа перед надсиланням ${app_name} збирає анонімну аналітику, щоб ми могли вдосконалювати цей додаток. @@ -490,7 +476,6 @@ %d непрочитаних сповіщень - %d кімната %d кімнати @@ -522,8 +507,6 @@ Домівка Кімнати Запрошено - - %2$s вилучає вас із %1$s %2$s блокує вас у %1$s Причина: %1$s @@ -753,7 +736,6 @@ Не вдалося встановити зв’язок у режимі реального часу. \nПопросіть адміністратора вашого домашнього сервера налаштувати сервер TURN для надійної роботи викликів. ${app_name} не вдалося здійснити виклик - Більше немає результатів Відкликати публікування Додати @@ -784,7 +766,6 @@ Схоже у вас вже є резервна копія ключа налаштування з іншого сеансу. Хочете замінити його тим, який ви створюєте\? Резервна копія вже існує на вашому homeserver Ключ відновлення збережено. - Зберегти як файл Поділитися Зберегти ключ відновлення @@ -932,7 +913,6 @@ Інтеграцію вимкнено Керування інтеграцією Дозволити інтеграції - Це замінить ваш поточний ключ або фразу. Створіть новий ключ безпеки або встановіть нову фразу безпеки для наявної резервної копії. Захистіться від втрати доступу до зашифрованих повідомлень і даних створенням резервної копії ключів шифрування на своєму сервері. @@ -950,7 +930,6 @@ %d секунд %d секунд - Ви не отримуватимете сповіщення про вхідні повідомлення, коли програма перебуває у фоновому режимі. Немає фонової синхронізації ${app_name} періодично синхронізуватиметься у фоновому режимі в певний час (налаштовується). @@ -1273,9 +1252,7 @@ Ви утримали виклик %s утримали виклик Утримати - Активний виклик (%1$s) - Змінити мережу Змінити Push-сповіщення вимкнено @@ -1372,7 +1349,6 @@ Зазначте адресу сервера ідентифікації Неможливо під\'єднатись до сервера ідентифікації Зазначте адресу сервера ідентифікації - Повторити Від\'єднання від вашого сервера ідентифікації означатиме, що ви не будете виявними для інших користувачів та не зможете запрошувати інших через електронну пошту або номер телефону. Ви наразі не використовуєте жодного сервера ідентифікації. Для того, щоб виявляти інших та бути виявним для знайомих вам наявних контактів, налаштуйте такий сервер нижче. @@ -1786,8 +1762,6 @@ %s хоче звірити ваш сеанс Запит перевірки Запит перевірки - - Зрозуміло Резервні копії всіх ключів створено Резервне копіювання ключів. Це може тривати кілька хвилин… @@ -1823,14 +1797,12 @@ Перегляд реакцій Тут буде показано ваші кімнати. Натисніть + унизу праворуч, щоб знайти наявні або створити власні. Схоже, ви намагаєтесь під\'єднатися до іншого домашнього сервера. Бажаєте вийти\? - Резервне копіювання %d ключа… Резервне копіювання %d ключів… Резервне копіювання %d ключів… Резервне копіювання %d ключів… - Додати наявну кімнату до простору Створити простір Лише я @@ -1844,7 +1816,6 @@ Сталася помилка пошуку номера телефона Ви відхилили цей виклик Ваша книга контактів порожня - Закрити нагадування про резервне копіювання ключів Схоже, що відповідь сервера надто тривала, це може бути спричинено або поганим з’єднанням, або помилкою сервера. Повторіть спробу через деякий час. Повторіть спробу, коли погодитесь з умовами свого домашнього сервера. @@ -2285,7 +2256,6 @@ \n \nБажаєте зайти через вебклієнт\? Щоб знайти наявні контакти, надішліть дані контактів (е-пошти й номери телефонів) серверу ідентифікації. Ми хешуємо ваші дані перед надсиланням для приватності. - Ваші контакти приватні. Щоб дізнаватись про користувачів, відповідних вашим контактам, дозвольте нам надсилати дані ваших контактів серверу ідентифікації. Надіслати електронні адреси та номери телефонів %s Сеанс завершено! @@ -2337,7 +2307,6 @@ Кімната — версії %s, яку домашній сервер позначив нестабільною. Поліпшення кімнати — серйозна операція. Її зазвичай радять, коли кімната нестабільна через вади, брак функціоналу чи вразливості безпеки. \nЗазвичай це впливає лише на деталі опрацювання кімнати сервером. - Деяких кімнат може бути не видно, бо вони закриті й потребують запрошення. Деяких кімнат може бути не видно, бо вони закриті й потребують запрошення. \nУ вас нема дозволу додавати кімнати. @@ -2382,14 +2351,12 @@ Якщо скасуєте це й загубите пристрій, то втратите зашифровані повідомлення й дані. \n \nВвімкнути захищене резервне копіювання й керувати своїми ключами можна в налаштуваннях. - Скасування залишить %1$s (%2$s) без звірки. У їхньому користувацькому профілі можна почати заново. Звірте цим сеансом свій новий. Це надасть йому доступ до зашифрованих повідомлень. Надіслані цьому сеансу й цим сеансом повідомлення позначатимуться застереженнями, поки цей користувач йому не довірить. Або ви можете власноруч звірити сеанс. Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. Не вдалося поширити звірку цього сеансу з вашими іншими. \nЗвірка збережеться локально, її поширить майбутня версія застосунку. - Можете ввімкнути це, якщо в кімнаті співпрацюватимуть лише внутрішні команди на вашому домашньому сервері. Цього більше не можна буде змінити. Цей сеанс — користувача %1$s, а ви надаєте облікові дані користувача %2$s. Це не підтримується в ${app_name}. \nБудь ласка, спершу очистіть дані, а тоді ввійдіть в інший обліковий запис. @@ -2542,4 +2509,6 @@ І ще %1$d Згорнути + %1$s, %2$s та інші + %1$s і %2$s \ No newline at end of file From 1f6275762ecf8507a7413acbf9f37cddb7d1c1f0 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 25 Feb 2022 20:29:56 +0000 Subject: [PATCH 009/126] Translated using Weblate (Swedish) Currently translated at 100.0% (51 of 51 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/40104000.txt | 2 ++ fastlane/metadata/android/sv-SE/changelogs/40104020.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40104000.txt create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40104020.txt diff --git a/fastlane/metadata/android/sv-SE/changelogs/40104000.txt b/fastlane/metadata/android/sv-SE/changelogs/40104000.txt new file mode 100644 index 0000000000..6bce52ba36 --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40104000.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Initial implementation av trådmeddelanden. Meddelandebubblor. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.4.0 diff --git a/fastlane/metadata/android/sv-SE/changelogs/40104020.txt b/fastlane/metadata/android/sv-SE/changelogs/40104020.txt new file mode 100644 index 0000000000..e3b5d4cd1c --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40104020.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: lägg till stöd för @room och slutna omröstningar, och många andra små ändringar. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.4.2 From 329ce7736ca0d3572ff9f0a64929e5cf57511236 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sat, 26 Feb 2022 08:39:52 +0000 Subject: [PATCH 010/126] Translated using Weblate (Japanese) Currently translated at 54.9% (28 of 51 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/ja/ --- fastlane/metadata/android/ja-JP/changelogs/40101040.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40101100.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103070.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103080.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103100.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103110.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40103120.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40104000.txt | 2 ++ fastlane/metadata/android/ja-JP/changelogs/40104020.txt | 2 ++ 9 files changed, 18 insertions(+) create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40101040.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40101100.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103070.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103080.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103100.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103110.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103120.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40104000.txt create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40104020.txt diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101040.txt b/fastlane/metadata/android/ja-JP/changelogs/40101040.txt new file mode 100644 index 0000000000..2dc1cdb781 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40101040.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:パフォーマンスの向上と不具合の修正 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.4 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101100.txt b/fastlane/metadata/android/ja-JP/changelogs/40101100.txt new file mode 100644 index 0000000000..2f720498ec --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40101100.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:テーマ、スタイルの更新と、スペースに関する新機能。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.10 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103070.txt b/fastlane/metadata/android/ja-JP/changelogs/40103070.txt new file mode 100644 index 0000000000..09c44e990d --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40103070.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:主に通知に関する不具合の修正。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.7-RC2 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103080.txt b/fastlane/metadata/android/ja-JP/changelogs/40103080.txt new file mode 100644 index 0000000000..7c37f5a756 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40103080.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:不具合の修正 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.8 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103100.txt b/fastlane/metadata/android/ja-JP/changelogs/40103100.txt new file mode 100644 index 0000000000..76c28cdd90 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/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/ja-JP/changelogs/40103110.txt b/fastlane/metadata/android/ja-JP/changelogs/40103110.txt new file mode 100644 index 0000000000..5295af5833 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/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/ja-JP/changelogs/40103120.txt b/fastlane/metadata/android/ja-JP/changelogs/40103120.txt new file mode 100644 index 0000000000..3859bee8d5 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40103120.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:不具合の修正 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.12 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40104000.txt b/fastlane/metadata/android/ja-JP/changelogs/40104000.txt new file mode 100644 index 0000000000..22a205dc37 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40104000.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:スレッド機能の実装、吹き出しメッセージ。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.4.0 diff --git a/fastlane/metadata/android/ja-JP/changelogs/40104020.txt b/fastlane/metadata/android/ja-JP/changelogs/40104020.txt new file mode 100644 index 0000000000..e792008faf --- /dev/null +++ b/fastlane/metadata/android/ja-JP/changelogs/40104020.txt @@ -0,0 +1,2 @@ +このバージョンの主な変更点:@roomの対応、非公開の投票など。 +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.4.2 From 12ea262ebc3d9e960a0dd8ee97468bedd3629c0b Mon Sep 17 00:00:00 2001 From: oksya8and8 Date: Mon, 28 Feb 2022 20:45:22 +0000 Subject: [PATCH 011/126] Translated using Weblate (Japanese) Currently translated at 98.0% (2116 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- vector/src/main/res/values-ja/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index 0d35cc8c99..2c17a90df8 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -2322,4 +2322,5 @@ \n検証は端末に保存され、新しいバージョンのアプリで共有されます。 %1$s、%2$s他 %1$sと%2$s + 自分と相手を認証してチャットを安全に保ちます \ No newline at end of file From 2673f6715a317fef69cc115119e288a3ce7530db Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Mon, 28 Feb 2022 20:44:45 +0000 Subject: [PATCH 012/126] Translated using Weblate (Japanese) Currently translated at 98.0% (2116 of 2157 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- vector/src/main/res/values-ja/strings.xml | 68 +++++++++++++---------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index 2c17a90df8..fe125881f4 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -79,7 +79,7 @@ クリップボードへコピー 警告 お気に入り - 知人 + メンバー ルーム ルーム名で絞り込む 招待中 @@ -713,7 +713,7 @@ これを行うには設定から「インテグレーションを許可」を有効にしてください。 インテグレーションが無効になっています インテグレーションマネージャー - インテグレーション(統合)を許可 + インテグレーションを許可 FCMトークンが正常に取得されました: \n%1$s Firebaseトークン @@ -957,8 +957,8 @@ /confettiコマンドを使用するか、❄️または🎉を含むメッセージを送信 チャットでエフェクトを表示 ホームサーバーがこの機能をサポートしている場合は、チャット内のリンクをプレビューします。 - ボット、ブリッジ、ウィジェット、ステッカーパックの管理をします。 -\nインテグレーションマネージャーは、構成データを受信し、ユーザーに代わってウィジェットの変更、ルーム招待の送信、権限の設定などを行うことができます。 + ボット、ブリッジ、ウィジェット、ステッカーパックを管理します。 +\nインテグレーションマネージャーは、構成データを受信し、ユーザーに代わってウィジェットの変更や、ルーム招待の送信、権限の設定などを行うことができます。 インテグレーション(統合) アプリがバックグラウンドにある場合、着信メッセージは通知されません。 ${app_name}は正確な時間に定期的にバックグラウンドで同期します(構成可能)。 @@ -1296,7 +1296,7 @@ プッシュ通知に関するルール あなたは既にこのルームを見ています! その他のサードパーティーの使用に関する掲示 - Matrix SDKバージョン + Matrix SDKのバージョン ファイル\"%1$s\"からエンドツーエンド暗号鍵をインポートします。 鍵のバックアップデータの取得中にエラーが発生しました 信頼情報の取得中にエラーが発生しました @@ -1314,7 +1314,7 @@ お待ち下さい… ネットワークがありません。インターネット接続を確認してください。 不正な形式のイベントです。表示できません - ルーム管理者によってモデレートされたイベント + ルームの管理者によってモデレートされたイベント リアクション リアクションを見る リアクションを追加 @@ -1463,7 +1463,7 @@ コンテンツが報告されました ヘルプとサポート ヘルプ - ${app_name}のポリシー + ${app_name}の運営方針 ここ キーワードを追加 自分のスレッド @@ -1564,7 +1564,7 @@ 応答がありません スレッドへのリンクをコピー 有効にする - あなたのIDサーバーのポリシー + あなたのIDサーバーの運営方針 新しいルームを作成 認証コードが正しくありません。 IDサーバーのURLを入力してください @@ -1602,7 +1602,7 @@ 添付ファイルの取得中にエラーが発生しました。 鍵のバックアップのバナーを閉じる キーワードに「%s」を含めることはできません - %s へのメール通知を有効にする + %sへのメール通知を有効にする ヒント:メッセージを長押しして「%s」を選択。 スレッドを用いると、会話のテーマを保ったり、会話を追跡したりするのが容易になります。 あなたの非公開スペース @@ -1646,7 +1646,7 @@ 音声メッセージ(%1$s) 推奨のルームバージョンへとアップグレード 音声メッセージを録音 - あなたのホームサーバーのポリシー + あなたのホームサーバーの運営方針 一番下に移動 %sが読みました %1$sと%2$sが読みました @@ -1698,7 +1698,7 @@ %d人のユーザーが読みました スペースへのアクセス - このサーバーはポリシーを提供していません。 + このサーバーは運営方針を提供していません。 数秒かかるかもしれません。少々お待ちください。 利用可能な言語を読み込んでいます… ユーザーを招待 @@ -1706,14 +1706,14 @@ パスワードを選択してください。 メンバーを追加 ログインを検証 - メッセージ… + メッセージを送る… このファイルは大きすぎてアップロードできません。 この情報の送信に同意しますか? 連絡先を発見するには、連絡先のデータ(電話番号や電子メール)をあなたのIDサーバーに送信する必要があります。プライバシーの保護のため、データは送信前にハッシュ化されます。 メールアドレスと電話番号を%sに送信 - このIDサーバーはポリシーを提供していません - IDサーバーのポリシーを隠す - IDサーバーのポリシーを表示 + このIDサーバーは運営方針を提供していません + IDサーバーの運営方針を隠す + IDサーバーの運営方針を表示 アカウントの新しいパスワードを設定… シェイクを検出しました! 電話を振って、しきい値を試してください @@ -1888,7 +1888,7 @@ スペースは、ルームや連絡先をグループ化する新しい方法です。 招待されています 新しいスペースを、あなたが管理するスペースに追加。 - 注意:アプリケーションは再起動します + 注意:アプリケーションが再起動します ホームサーバーの管理者にお問い合わせください あなたが参加している全てのルームがホームに表示されます。 親のスペースを自動的に更新 @@ -1932,7 +1932,7 @@ メッセージを送信できませんでした ウィジェットを開く %1$sに転送 - 通話は終了しました + 通話が終了しました 自分自身にダイレクトメッセージを送信することはできません! 電話番号(任意) 電話番号を確認 @@ -2038,7 +2038,7 @@ 位置情報を共有しました %sでリアクションしました 検証終了 - 次のいずれかのセキュリティが破られている可能性があります。 + 次のいずれかのセキュリティーが破られている可能性があります。 \n \n - あなたのホームサーバー \n - 検証している相手のホームサーバー @@ -2091,7 +2091,7 @@ ユーザーを招待できませんでした。招待したいユーザーを確認して、もう一度試してください。 %sの利用規約を開く ユーザーによる同意は与えられていません。 - 代わりに、他のIDサーバーのURLを入力できます + または、他のIDサーバーのURLを入力できます サーバー上の暗号鍵をバックアップして、暗号化されたメッセージとデータへのアクセスが失われるのを防ぎましょう。 いまキャンセルすると、ログインできなくなった際に、暗号化されたメッセージとデータを失ってしまう可能性があります。 \n @@ -2200,7 +2200,7 @@ %sを待機しています… このユーザーがこのセッションを検証するまで、送受信されるメッセージには警告マークが付きます。手動で検証することも可能です。 セッションの取得に失敗しました - チームメイトは誰ですか? + 誰がチームの仲間ですか? %sを探索できるようになります 私のスペース %1$s %2$s に参加してください スキップ @@ -2228,21 +2228,21 @@ 再認証が必要です 全てリセット 連絡先 - 検証がキャンセルされました。再び検証を開始することができます。 + 検証をキャンセルしました。あらためて開始してください。 押し続けて録音し、離すと送信 - セキュリティー向上のため、PINコードを選択してください + PINコードを設定してください %d個のサーバーアクセス制御リストの変更 置き換えられたルームに参加 このルームが発見できません。存在することを確認してください。 - 指紋や顔画像など、端末に固有の生体認証を有効にしてください。 + 指紋や顔画像など、端末に固有の生体認証を有効にする。 絵文字で検証 テキストで検証 すべてのセッションを検証し、アカウントとメッセージが安全であることを確認してください ログインしている場所を確認 復旧用の手段を全て無くしてしまいましたか?全てリセットする - 、あるいはクロス署名に対応した他のMatrixのクライアント + クロス署名に対応した他のMatrixのクライアントでも使用できます。 どのような議論を%sで行いたいですか? クロス署名の設定に失敗しました 履歴とメッセージが消去され、信頼済の端末、信頼済のユーザーが取り消されます @@ -2252,7 +2252,7 @@ 電話番号を検索する際にエラーが発生しました 着信を拒否しました それぞれにルームを作りましょう。後から追加することもできます(既にあるルームも追加できます)。 - 分かるように特徴を記入してください。これはいつでも変更できます。 + このスペースを特定できるような特徴を記入してください。これはいつでも変更できます。 目立つように特徴を記入してください。これはいつでも変更できます。 未読のメッセージ数のみを通知に表示。 2分間${app_name}を使用しないと、PINコードが要求されます。 @@ -2297,8 +2297,8 @@ エラーのためメッセージが送信されませんでした %sにいない人を探していますか? 直接${app_name}で招待を受け取るには、設定画面から%sしてください。 - PINコードを入力しなければ${app_name}のロックを解除することはできません。 - ${app_name}を開く際にはPINコードの入力が必要です。 + PINコードでしか${app_name}のロックを解除することはできません。 + ${app_name}を開く際には、毎回PINコードの入力が必要です。 あなたがブロックされているルームを開くことはできません。 PINコードの検証に失敗しました。新しいコードを入力してください。 端末の連絡先がありません @@ -2308,7 +2308,7 @@ このメッセージを待機しています。時間がかかる可能性があります ルームの設定の変更に成功しました 確認のため、セキュリティーフレーズを再入力してください。 - ホームサーバー(%1$s)が、IDサーバーに%2$sを設定するよう提案しています + ホームサーバー(%1$s)は、IDサーバーに%2$sを設定するように提案しています IDサーバー %s から切断しますか? ダイレクトメッセージを作成できませんでした。招待したユーザーを確認し、もう一度やり直してください。 セキュリティーフレーズ @@ -2323,4 +2323,16 @@ %1$s、%2$s他 %1$sと%2$s 自分と相手を認証してチャットを安全に保ちます + あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。 + 監査結果をエクスポート + ストレージから機密情報を発見できません + 操作を実行できません。ホームサーバーは最新のバージョンではありません。 + ビデオ通話が拒否されました + 音声通話が拒否されました + %1$sは通話を拒否しました + このデバイスを認証可能な他の端末が全くない場合にのみ、続行してください。 + このセッションを信頼済として検証すると、暗号化されたメッセージにアクセスすることができます。このアカウントにサインインしなかった場合は、あなたのアカウントのセキュリティーが破られている可能性があります: + アカウントのセキュリティーが破られている可能性があります + 選択したスペースに追加 + 最新の${app_name}は他のデバイスでも使用できます: \ No newline at end of file From ab2001cd7f8f97440a57a7f85e28723c32bc20a2 Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Wed, 2 Mar 2022 17:45:27 +0300 Subject: [PATCH 013/126] Create a custom audio waveform view. --- .../main/res/values/styles_voice_message.xml | 16 +- .../detail/composer/VoiceMessageHelper.kt | 4 +- .../composer/voice/VoiceMessageViews.kt | 12 +- .../timeline/factory/MessageItemFactory.kt | 4 +- .../helper/VoiceMessagePlaybackTracker.kt | 23 +- .../detail/timeline/item/MessageVoiceItem.kt | 40 ++-- .../app/features/voice/AudioWaveformView.kt | 199 ++++++++++++++++++ .../layout/item_timeline_event_voice_stub.xml | 2 +- .../layout/view_voice_message_recorder.xml | 2 +- .../main/res/values/audio_waveform_attr.xml | 22 ++ 10 files changed, 287 insertions(+), 37 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt create mode 100644 vector/src/main/res/values/audio_waveform_attr.xml diff --git a/library/ui-styles/src/main/res/values/styles_voice_message.xml b/library/ui-styles/src/main/res/values/styles_voice_message.xml index 2e87353303..81d2e7581d 100644 --- a/library/ui-styles/src/main/res/values/styles_voice_message.xml +++ b/library/ui-styles/src/main/res/values/styles_voice_message.xml @@ -2,14 +2,14 @@ \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt index 735d356476..f9dfecd1f5 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt @@ -221,7 +221,9 @@ class VoiceMessageHelper @Inject constructor( private fun onPlaybackTick(id: String) { if (mediaPlayer?.isPlaying.orFalse()) { val currentPosition = mediaPlayer?.currentPosition ?: 0 - playbackTracker.updateCurrentPlaybackTime(id, currentPosition) + val totalDuration = mediaPlayer?.duration ?: 0 + val percentage = currentPosition.toFloat() / totalDuration + playbackTracker.updateCurrentPlaybackTime(id, currentPosition, percentage) } else { playbackTracker.stopPlayback(id) stopPlaybackTicker() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt index 09284ea5fc..8adecaad6e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt @@ -27,7 +27,6 @@ import androidx.core.view.doOnLayout import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams -import com.visualizer.amplitude.AudioRecordView import im.vector.app.R import im.vector.app.core.extensions.setAttributeBackground import im.vector.app.core.extensions.setAttributeTintedBackground @@ -37,6 +36,8 @@ import im.vector.app.databinding.ViewVoiceMessageRecorderBinding import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView.DraggingState import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView.RecordingUiState import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker +import im.vector.app.features.themes.ThemeUtils +import im.vector.app.features.voice.AudioWaveformView class VoiceMessageViews( private val resources: Resources, @@ -284,7 +285,7 @@ class VoiceMessageViews( hideRecordingViews(RecordingUiState.Idle) views.voiceMessageMicButton.isVisible = true views.voiceMessageSendButton.isVisible = false - views.voicePlaybackWaveform.post { views.voicePlaybackWaveform.recreate() } + views.voicePlaybackWaveform.post { views.voicePlaybackWaveform.clear() } } fun renderPlaying(state: VoiceMessagePlaybackTracker.Listener.State.Playing) { @@ -292,11 +293,15 @@ class VoiceMessageViews( views.voicePlaybackControlButton.contentDescription = resources.getString(R.string.a11y_pause_voice_message) val formattedTimerText = DateUtils.formatElapsedTime((state.playbackTime / 1000).toLong()) views.voicePlaybackTime.text = formattedTimerText + val waveformColorIdle = ThemeUtils.getColor(views.voicePlaybackWaveform.context, R.attr.vctr_content_quaternary) + val waveformColorPlayed = ThemeUtils.getColor(views.voicePlaybackWaveform.context, R.attr.vctr_content_secondary) + views.voicePlaybackWaveform.updateColors(state.percentage, waveformColorPlayed, waveformColorIdle) } fun renderIdle() { views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) views.voicePlaybackControlButton.contentDescription = resources.getString(R.string.a11y_play_voice_message) + views.voicePlaybackWaveform.summarize() } fun renderToast(message: String) { @@ -327,8 +332,9 @@ class VoiceMessageViews( fun renderRecordingWaveform(amplitudeList: Array) { views.voicePlaybackWaveform.doOnLayout { waveFormView -> + val waveformColor = ThemeUtils.getColor(waveFormView.context, R.attr.vctr_content_secondary) amplitudeList.iterator().forEach { - (waveFormView as AudioRecordView).update(it) + (waveFormView as AudioWaveformView).add(AudioWaveformView.FFT(it.toFloat(), waveformColor)) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index 0c836748c8..da97cf6984 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -73,6 +73,7 @@ import im.vector.app.features.location.toLocationData import im.vector.app.features.media.ImageContentRenderer import im.vector.app.features.media.VideoContentRenderer import im.vector.app.features.settings.VectorPreferences +import im.vector.app.features.voice.AudioWaveformView import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence import me.gujun.android.span.span import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl @@ -688,8 +689,7 @@ class MessageItemFactory @Inject constructor( return this ?.filterNotNull() ?.map { - // Value comes from AudioRecordView.maxReportableAmp, and 1024 is the max value in the Matrix spec - it * 22760 / 1024 + it * AudioWaveformView.MAX_FFT / 1024 } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt index c6204bff1c..076c05b9c4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt @@ -70,7 +70,8 @@ class VoiceMessagePlaybackTracker @Inject constructor() { fun startPlayback(id: String) { val currentPlaybackTime = getPlaybackTime(id) - val currentState = Listener.State.Playing(currentPlaybackTime) + val currentPercentage = getPercentage(id) + val currentState = Listener.State.Playing(currentPlaybackTime, currentPercentage) setState(id, currentState) // Pause any active playback states @@ -87,15 +88,16 @@ class VoiceMessagePlaybackTracker @Inject constructor() { fun pausePlayback(id: String) { val currentPlaybackTime = getPlaybackTime(id) - setState(id, Listener.State.Paused(currentPlaybackTime)) + val currentPercentage = getPercentage(id) + setState(id, Listener.State.Paused(currentPlaybackTime, currentPercentage)) } fun stopPlayback(id: String) { setState(id, Listener.State.Idle) } - fun updateCurrentPlaybackTime(id: String, time: Int) { - setState(id, Listener.State.Playing(time)) + fun updateCurrentPlaybackTime(id: String, time: Int, percentage: Float) { + setState(id, Listener.State.Playing(time, percentage)) } fun updateCurrentRecording(id: String, amplitudeList: List) { @@ -113,6 +115,15 @@ class VoiceMessagePlaybackTracker @Inject constructor() { } } + fun getPercentage(id: String): Float { + return when (val state = states[id]) { + is Listener.State.Playing -> state.percentage + is Listener.State.Paused -> state.percentage + /* Listener.State.Idle, */ + else -> 0f + } + } + fun clear() { listeners.forEach { it.value.onUpdate(Listener.State.Idle) @@ -131,8 +142,8 @@ class VoiceMessagePlaybackTracker @Inject constructor() { sealed class State { object Idle : State() - data class Playing(val playbackTime: Int) : State() - data class Paused(val playbackTime: Int) : State() + data class Playing(val playbackTime: Int, val percentage: Float) : State() + data class Paused(val playbackTime: Int, val percentage: Float) : State() data class Recording(val amplitudeList: List) : State() } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt index e9f728d976..82400a431d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt @@ -26,7 +26,6 @@ import android.widget.TextView import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass -import com.visualizer.amplitude.AudioRecordView import im.vector.app.R import im.vector.app.core.epoxy.ClickListener import im.vector.app.features.home.room.detail.timeline.helper.ContentDownloadStateTrackerBinder @@ -34,6 +33,7 @@ import im.vector.app.features.home.room.detail.timeline.helper.ContentUploadStat import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker import im.vector.app.features.home.room.detail.timeline.style.TimelineMessageLayout import im.vector.app.features.themes.ThemeUtils +import im.vector.app.features.voice.AudioWaveformView @EpoxyModelClass(layout = R.layout.item_timeline_event_base) abstract class MessageVoiceItem : AbsMessageItem() { @@ -78,11 +78,15 @@ abstract class MessageVoiceItem : AbsMessageItem() { holder.voicePlaybackWaveform.setOnLongClickListener(attributes.itemLongClickListener) + val waveformColorIdle = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_quaternary) + val waveformColorPlayed = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary) + holder.voicePlaybackWaveform.post { - holder.voicePlaybackWaveform.recreate() + holder.voicePlaybackWaveform.clear() waveform.forEach { amplitude -> - holder.voicePlaybackWaveform.update(amplitude) + holder.voicePlaybackWaveform.add(AudioWaveformView.FFT(amplitude.toFloat(), waveformColorIdle)) } + holder.voicePlaybackWaveform.summarize() } val backgroundTint = if (attributes.informationData.messageLayout is TimelineMessageLayout.Bubble) { @@ -93,33 +97,39 @@ abstract class MessageVoiceItem : AbsMessageItem() { holder.voicePlaybackLayout.backgroundTintList = ColorStateList.valueOf(backgroundTint) holder.voicePlaybackControlButton.setOnClickListener { playbackControlButtonClickListener?.invoke(it) } - voiceMessagePlaybackTracker.track(attributes.informationData.eventId, object : VoiceMessagePlaybackTracker.Listener { - override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) { - when (state) { - is VoiceMessagePlaybackTracker.Listener.State.Idle -> renderIdleState(holder) - is VoiceMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state) - is VoiceMessagePlaybackTracker.Listener.State.Paused -> renderPausedState(holder, state) + // Don't track and don't try to update UI before view is present + holder.view.post { + voiceMessagePlaybackTracker.track(attributes.informationData.eventId, object : VoiceMessagePlaybackTracker.Listener { + override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) { + when (state) { + is VoiceMessagePlaybackTracker.Listener.State.Idle -> renderIdleState(holder, waveformColorIdle, waveformColorPlayed) + is VoiceMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state, waveformColorIdle, waveformColorPlayed) + is VoiceMessagePlaybackTracker.Listener.State.Paused -> renderPausedState(holder, state, waveformColorIdle, waveformColorPlayed) + } } - } - }) + }) + } } - private fun renderIdleState(holder: Holder) { + private fun renderIdleState(holder: Holder, idleColor: Int, playedColor: Int) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(duration) + holder.voicePlaybackWaveform.updateColors(0f, playedColor, idleColor) } - private fun renderPlayingState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Playing) { + private fun renderPlayingState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Playing, idleColor: Int, playedColor: Int) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause) holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_pause_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime) + holder.voicePlaybackWaveform.updateColors(state.percentage, playedColor, idleColor) } - private fun renderPausedState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Paused) { + private fun renderPausedState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Paused, idleColor: Int, playedColor: Int) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime) + holder.voicePlaybackWaveform.updateColors(state.percentage, playedColor, idleColor) } private fun formatPlaybackTime(time: Int) = DateUtils.formatElapsedTime((time / 1000).toLong()) @@ -138,7 +148,7 @@ abstract class MessageVoiceItem : AbsMessageItem() { val voiceLayout by bind(R.id.voiceLayout) val voicePlaybackControlButton by bind(R.id.voicePlaybackControlButton) val voicePlaybackTime by bind(R.id.voicePlaybackTime) - val voicePlaybackWaveform by bind(R.id.voicePlaybackWaveform) + val voicePlaybackWaveform by bind(R.id.voicePlaybackWaveform) val progressLayout by bind(R.id.messageFileUploadProgressLayout) } diff --git a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt new file mode 100644 index 0000000000..9ba7597e60 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt @@ -0,0 +1,199 @@ +/* + * 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.features.voice + +import android.content.Context +import android.content.res.Resources +import android.graphics.Canvas +import android.graphics.Paint +import android.util.AttributeSet +import android.view.View +import im.vector.app.R +import kotlin.math.max +import kotlin.random.Random + +class AudioWaveformView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : View(context, attrs, defStyleAttr) { + + private enum class Alignment(var value: Int) { + CENTER(0), + BOTTOM(1), + TOP(2) + } + + private enum class Flow(var value: Int) { + LTR(0), + RTL(1) + } + + data class FFT(val value: Float, var color: Int) + + private fun Int.dp() = this * Resources.getSystem().displayMetrics.density + + // Configuration fields + private var alignment = Alignment.CENTER + private var flow = Flow.LTR + private var verticalPadding = 4.dp() + private var horizontalPadding = 4.dp() + private var barWidth = 2.dp() + private var barSpace = 1.dp() + private var barMinHeight = 1.dp() + private var isBarRounded = true + + private val rawFftList = mutableListOf() + private var visibleBarHeights = mutableListOf() + + private val barPaint = Paint() + + init { + attrs?.let { + context + .theme + .obtainStyledAttributes( + attrs, + R.styleable.AudioWaveformView, + 0, + 0 + ) + .apply { + alignment = Alignment.values().find { it.value == getInt(R.styleable.AudioWaveformView_alignment, alignment.value) }!! + flow = Flow.values().find { it.value == getInt(R.styleable.AudioWaveformView_flow, alignment.value) }!! + verticalPadding = getDimension(R.styleable.AudioWaveformView_verticalPadding, verticalPadding) + horizontalPadding = getDimension(R.styleable.AudioWaveformView_horizontalPadding, horizontalPadding) + barWidth = getDimension(R.styleable.AudioWaveformView_barWidth, barWidth) + barSpace = getDimension(R.styleable.AudioWaveformView_barSpace, barSpace) + barMinHeight = getDimension(R.styleable.AudioWaveformView_barMinHeight, barMinHeight) + isBarRounded = getBoolean(R.styleable.AudioWaveformView_isBarRounded, isBarRounded) + setWillNotDraw(false) + barPaint.isAntiAlias = true + } + .apply { recycle() } + .also { + barPaint.strokeWidth = barWidth + barPaint.strokeCap = if (isBarRounded) Paint.Cap.ROUND else Paint.Cap.BUTT + } + } + } + + fun initialize(fftList: List) { + handleNewFftList(fftList) + invalidate() + } + + fun add(fft: FFT) { + handleNewFftList(listOf(fft)) + invalidate() + } + + fun summarize() { + if (rawFftList.isEmpty()) return + + val maxVisibleBarCount = getMaxVisibleBarCount() + val summarizedFftList = rawFftList.summarize(maxVisibleBarCount) + clear() + handleNewFftList(summarizedFftList) + invalidate() + } + + fun updateColors(limitPercentage: Float, colorBefore: Int, colorAfter: Int) { + val size = visibleBarHeights.size + val limitIndex = (size * limitPercentage).toInt() + visibleBarHeights.forEachIndexed { index, fft -> + fft.color = if (index < limitIndex) { + colorBefore + } else { + colorAfter + } + } + invalidate() + } + + fun clear() { + rawFftList.clear() + visibleBarHeights.clear() + } + + private fun List.summarize(target: Int): List { + val result = mutableListOf() + if (size <= target) { + result.addAll(this) + val missingItemCount = target - size + repeat(missingItemCount) { + val index = Random.nextInt(result.size) + result.add(index, result[index]) + } + } else { + val step = (size.toDouble() - 1) / (target - 1) + var index = 0.0 + while (index < size) { + result.add(get(index.toInt())) + index += step + } + } + return result + } + + private fun handleNewFftList(fftList: List) { + val maxVisibleBarCount = getMaxVisibleBarCount() + fftList.forEach { fft -> + rawFftList.add(fft) + val barHeight = max(fft.value / MAX_FFT * (height - verticalPadding * 2), barMinHeight) + visibleBarHeights.add(FFT(barHeight, fft.color)) + if (visibleBarHeights.size > maxVisibleBarCount) { + visibleBarHeights = visibleBarHeights.subList(visibleBarHeights.size - maxVisibleBarCount, visibleBarHeights.size) + } + } + } + + private fun getMaxVisibleBarCount() = ((width - horizontalPadding * 2) / (barWidth + barSpace)).toInt() + + private fun drawBars(canvas: Canvas) { + var currentX = horizontalPadding + visibleBarHeights.forEach { + barPaint.color = it.color + // TODO. Support flow + when (alignment) { + Alignment.BOTTOM -> { + val startY = height - verticalPadding + val stopY = startY - it.value + canvas.drawLine(currentX, startY, currentX, stopY, barPaint) + } + Alignment.CENTER -> { + val startY = (height - it.value) / 2 + val stopY = startY + it.value + canvas.drawLine(currentX, startY, currentX, stopY, barPaint) + } + Alignment.TOP -> { + val startY = verticalPadding + val stopY = startY + it.value + canvas.drawLine(currentX, startY, currentX, stopY, barPaint) + } + } + currentX += barWidth + barSpace + } + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + drawBars(canvas) + } + + companion object { + private const val MAX_FFT = 32760f + } +} diff --git a/vector/src/main/res/layout/item_timeline_event_voice_stub.xml b/vector/src/main/res/layout/item_timeline_event_voice_stub.xml index a180afbf8e..0fad714bd4 100644 --- a/vector/src/main/res/layout/item_timeline_event_voice_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_voice_stub.xml @@ -40,7 +40,7 @@ app:layout_constraintTop_toTopOf="@id/voicePlaybackControlButton" tools:text="0:23" /> - - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 243a714586b13afeaa2432344687bddbf9c25658 Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Wed, 2 Mar 2022 17:46:09 +0300 Subject: [PATCH 014/126] Remove 3rd party waveform library. --- library/ui-styles/build.gradle | 2 -- vector/build.gradle | 1 - vector/src/main/assets/open_source_licenses.html | 5 ----- .../java/im/vector/app/features/voice/AudioWaveformView.kt | 2 +- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/library/ui-styles/build.gradle b/library/ui-styles/build.gradle index cee58414c7..0ac513b252 100644 --- a/library/ui-styles/build.gradle +++ b/library/ui-styles/build.gradle @@ -60,6 +60,4 @@ dependencies { implementation 'com.github.vector-im:PFLockScreen-Android:1.0.0-beta12' // dialpad dimen implementation 'im.dlg:android-dialer:1.2.5' - // AudioRecordView attr - implementation 'com.github.Armen101:AudioRecordView:1.0.5' } \ No newline at end of file diff --git a/vector/build.gradle b/vector/build.gradle index c6a2636acf..d58118eb24 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -416,7 +416,6 @@ dependencies { implementation 'jp.wasabeef:glide-transformations:4.3.0' implementation 'com.github.vector-im:PFLockScreen-Android:1.0.0-beta12' implementation 'com.github.hyuwah:DraggableView:1.0.0' - implementation 'com.github.Armen101:AudioRecordView:1.0.5' // Custom Tab implementation 'androidx.browser:browser:1.4.0' diff --git a/vector/src/main/assets/open_source_licenses.html b/vector/src/main/assets/open_source_licenses.html index 2c25606f57..0bead1f826 100755 --- a/vector/src/main/assets/open_source_licenses.html +++ b/vector/src/main/assets/open_source_licenses.html @@ -437,11 +437,6 @@ THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Copyright (c) 2017-present, dialog LLC <info@dlg.im> -
  • - Armen101 / AudioRecordView -
    - Copyright 2019 Armen Gevorgyan -
  •  Apache License
    diff --git a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    index 9ba7597e60..768635b2f7 100644
    --- a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    +++ b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    @@ -194,6 +194,6 @@ class AudioWaveformView @JvmOverloads constructor(
         }
     
         companion object {
    -        private const val MAX_FFT = 32760f
    +        const val MAX_FFT = 32760
         }
     }
    
    From 4ca2a4e8b14b59cc3db02bf8fa9591ca1ef21aab Mon Sep 17 00:00:00 2001
    From: libexus 
    Date: Tue, 1 Mar 2022 15:38:06 +0000
    Subject: [PATCH 015/126] Translated using Weblate (German)
    
    Currently translated at 99.8% (2153 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
    ---
     vector/src/main/res/values-de/strings.xml | 78 +++++++----------------
     1 file changed, 23 insertions(+), 55 deletions(-)
    
    diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
    index bf72827085..7a8ac9c71b 100644
    --- a/vector/src/main/res/values-de/strings.xml
    +++ b/vector/src/main/res/values-de/strings.xml
    @@ -39,7 +39,6 @@
         Raumeinladung
         %1$s und %2$s
         Leerer Raum
    -
         %s hat diesen Raum aufgewertet.
         Sende eine Nachricht…
         Erste Synchronisation:
    @@ -244,7 +243,6 @@
         Löschen
         Umbenennen
         Inhalt melden
    -
         oder
         Einladen
         Abmelden
    @@ -267,7 +265,6 @@
         Nur Matrix-Kontakte
         Keine Ergebnisse
         Räume
    -
         Logdateien übermitteln
         Absturzberichte übermitteln
         Screenshot übermitteln
    @@ -298,7 +295,6 @@
         Dieser Homeserver möchte sicherstellen, dass du kein Roboter bist
         Die E-Mail-Adresse, die mit deinem Account verknüpft ist, muss eingegeben werden.
         Verifizierung der E-Mail-Adresse ist fehlgeschlagen. Stelle sicher, dass du den Link in der E-Mail geöffnet hast
    -
         Bitte eine gültige URL eingeben
         Fehlerhaftes JSON
         Enthielt kein gültiges JSON
    @@ -314,13 +310,10 @@
         Anruf aktiv…
         Die Gegenseite hat den Anruf nicht angenommen.
         Information
    -
         ${app_name} benötigt die Berechtigung, auf dein Mikrofon zugreifen zu können, um (Sprach-)Anrufe tätigen zu können.
    -
         ${app_name} benötigt die Berechtigung, auf Kamera und Mikrofon zu zugreifen, um Video-Anrufe durchzuführen.
     \n
     \nBitte erlaube den Zugriff im nächsten Dialog, um den Anruf durchzuführen.
    -
         Ja
         Nein
         Fortsetzen
    @@ -328,7 +321,6 @@
         Betreten
         Ablehnen
         Zu ungelesenen Nachrichten springen
    -
         Raum verlassen
         Raum wirklich verlassen\?
         DIREKT-CHATS
    @@ -341,8 +333,8 @@
         Du wirst diese Änderung nicht rückgängig machen können, da die Person dieselbe Berechtigungsstufe wie du erhalten wird.
     \nBist du sicher\?
         %s schreibt…
    -    %1$s & %2$s schreiben…
    -    %1$s, %2$s & andere schreiben…
    +    %1$s und %2$s schreiben…
    +    %1$s, %2$s und andere schreiben…
         Du bist nicht berechtigt, in diesen Raum zu schreiben.
         Vertrauen
         Nicht vertrauen
    @@ -355,7 +347,6 @@
         Das Zertifikat unterscheidet sich von dem Zertifikat, dem dein Gerät ursprünglich vertraut hat. Dies ist SEHR UNGEWÖHNLICH. Es wird empfohlen, dass du dieses neue Zertifikat NICHT AKZEPTIERST.
         Das Zertifikat hat sich von einem ursprünglich vertrauenswürdigem Zertifikat in ein nicht vertrauenswürdiges Zertifikat geändert. Eventuell wurde das Zertifikat des Servers erneuert. Bitte erkundige dich beim Server-Administrator, welcher Fingerprint als vertrauenswürdig gilt.
         Akzeptiere das Zertifikat nur dann, wenn der Server-Administrator einen Fingerprint veröffentlicht hat, der mit dem obigen übereinstimmt.
    -
         Suchen
         Raummitglieder filtern
         Keine Suchergebnisse
    @@ -400,7 +391,6 @@
         Öffentlichen Namen aktualisieren
         Zuletzt gesehen
         %1$s @ %2$s
    -
         Authentifizierung
         Angemeldet als
         Heimserver
    @@ -441,7 +431,6 @@
         Exportieren
         Passphrase eingeben
         Passphrase bestätigen
    -
         Ende-zu-Ende-Raumschlüssel importieren
         Raumschlüssel importieren
         Schlüssel aus lokaler Datei importieren
    @@ -453,7 +442,6 @@
         Bestätigen
         Vergleiche die folgenden Zeichen mit den Einstellungen in der Sitzung des anderen Nutzers und bestätige:
         Falls sie nicht übereinstimmen, wurde die Kommunikation vielleicht kompromittiert.
    -
         Raumverzeichnis auswählen
         Server-Name
         Alle Räume auf dem %s-Server
    @@ -531,7 +519,6 @@
         Community-Avatare
         Schütteln, um einen Fehler zu melden
         Mitglieder auflisten
    -
         
             %d Mitglied
             %d Mitglieder
    @@ -540,13 +527,10 @@
             %d neue Nachricht
             %d neue Nachrichten
         
    -
    -
         
             %d ungelesene Nachricht
             %d ungelesene Nachrichten
         
    -
         
             %d Raum
             %d Räume
    @@ -606,16 +590,10 @@
         Die Konversation wird hier fortgesetzt
         Dieser Raum ist die Fortsetzung einer anderen Konversation
         Klicke hier um die älteren Nachrichten zu sehen
    -
    -
    -
    -
         
             %d ausgewählt
             %d ausgewählt
         
    -
    -
         Systembenachrichtigungen
         kontaktiere deinen Service-Administrator
         Dieser Homeserver hat eine seiner Ressourcen-Grenzen erreicht, sodass einige Nutzer sich nicht anmelden können.
    @@ -707,7 +685,6 @@
         Token-Registrierung
         Wenn ein Benutzer ein abgestecktes Gerät mit ausgeschaltetem Bildschirm eine Weile nicht bewegt, wechselt es in den Bereitschaftsmodus. Dies hindert Apps daran, auf das Netzwerk zuzugreifen und verzögert die Ausführung von Aufgaben, Synchronisierungen und Standard-Alarmen.
         Ignoriere Optimierungen
    -
         Keine validen Google-Play-Dienste gefunden. Benachrichtigungen könnten nicht richtig funktionieren.
         Videogespräch aktiv…
         Schlüsselsicherung
    @@ -756,7 +733,6 @@
         Nachrichten in verschlüsselten Räumen sind mit Ende-zu-Ende-Verschlüsselung gesichert. Nur du und der Empfänger haben die Schlüssel um diese Nachrichten zu lesen.
     \n
     \nSichere deine Schlüssel, um sie nicht zu verlieren.
    -
         Wiederherstellungsschlüssel aus Passphrase generieren. Dies kann mehrere Sekunden brauchen.
         Du verlierst möglicherweise den Zugang zu deinen Nachrichten, wenn du dich abmeldest oder das Gerät verlierst.
         Rufe Backup-Version ab…
    @@ -817,7 +793,6 @@
         Bewahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort auf, wie z.B. einem Passwortmanager (oder Tresor) auf
         Ich habe eine Kopie angefertigt
         Teilen
    -
         Verliere nie wieder verschlüsselte Nachrichten
         Benutze Schlüsselsicherung
         Neue sichere Schlüssel für Nachrichten
    @@ -839,7 +814,6 @@
         Nachricht mit Eingabetaste senden
         Eingabetaste der Bildschirmtastatur schickt die Nachricht ab, statt einen Zeilenumbruch zu erzeugen
         Das Passwort ist ungültig
    -
         Medien
         Standard-Komprimierung
         Wählen
    @@ -879,7 +853,6 @@
         Überprüfe Sicherungsstatus
         Verifiziert!
         Verstanden
    -
         Verifizierungsanfrage
         %s möchte deine Sitzung verifizieren
         Unbekannter Fehler
    @@ -949,7 +922,6 @@
         Link in die Zwischenablage kopiert
         Raum erstellen…
         Bearbeitungsverlauf anzeigen
    -
         E2E-Schlüssel aus der Datei \"%1$s\" importieren.
         Vielen Dank, der Vorschlag wurde erfolgreich gesendet
         Der Vorschlag konnte nicht gesendet werden (%s)
    @@ -986,7 +958,6 @@
         Erkennungsoptionen werden angezeigt, sobald du eine E-Mail hinzugefügt hast.
         Gib einen neuen Identitätsserver ein
         Konnte keine Verbindung zum Homeserver herstellen
    -
         Dies ist keine Adresse eines Matrixservers
         Kann Homeserver nicht unter dieser URL erreichen. Bitte überprüfen
         Hintergrund-Synchronisierungsmodus
    @@ -994,7 +965,6 @@
     \nAbhängig vom Ressourcen-Status deines Geräts kann dein System die Synchronisierung verschieben.
         ${app_name} wird sich im Hintergrund periodisch zu einem bestimmten Zeitpunkt synchronisieren (konfigurierbar).
     \nDies wird Funk- und Akkunutzung beeinflussen. Es wird eine permanente Benachrichtigung geben, die sagt, dass ${app_name} auf Ereignisse lauscht.
    -
         Integrationen
         Benutze einen Integrationsmanager um Bots, Brücken, Widgets und Stickerpakete zu verwalten.
     \nIntegrationsmanager erhalten Rauminformationen und können so Widgets verändern, Einladungen senden und in deinem Namen Berechtigungslevel setzen.
    @@ -1078,7 +1048,6 @@
         Dieser Inhalt wurde als unangebracht gemeldet.
     \n
     \nWenn du keine weiteren Inhalte dieses Nutzers sehen möchtest, kannst ihn ignorieren, um jene Nachrichten auszublenden.
    -
         Nutzer ignorieren
         Alle Nachrichten (laut)
         Alle Nachrichten
    @@ -1101,13 +1070,13 @@
         Premium-Hosting für Organisationen
         Mehr erfahren
         Andere
    -    Benutzerdefinierte & erweiterte Einstellungen
    +    Benutzerdefinierte und erweiterte Einstellungen
         Fortfahren
         Eine Trennung von deinem Identitätsserver würde bedeuten, dass du weder von anderen Nutzern gefunden werden, noch diese per E-Mail oder Telefonnummer einladen kannst.
         Du teilst deine E-Mail-Adressen oder Telefonnummern momentan auf dem Identitätsserver %1$s. Du wirst dich erneut mit %2$s verbinden müssen, um mit dem Teilen aufzuhören.
         Stimme den Nutzungsbedingungen des Identitätsservers (%s) zu, um zu erlauben per E-Mail oder Telefonnummer gefunden zu werden.
         Zu teilende Daten nicht verarbeitbar
    -    Erweitere & individualisiere dein Benutzererlebnis
    +    Erweitere und individualisiere dein Benutzererlebnis
         Mit %1$s verbinden
         Mit Element Matrix Services verbinden
         Mit einem individuellen Server verbinden
    @@ -1271,7 +1240,6 @@
         %s verifizieren
         %s verifiziert
         Warte auf %s…
    -
         Nachrichten in diesem Raum sind nicht Ende-zu-Ende-verschlüsselt.
         Nachrichten in diesem Raum sind Ende-zu-Ende-verschlüsselt.
     \n
    @@ -1295,7 +1263,7 @@
         Nutzer
         Admin in %1$s
         Moderation in %1$s
    -    Springen & als gelesen markieren
    +    Springen und als gelesen markieren
         ${app_name} kann keine Ereignisse vom Typ \'%1$s\'
         ${app_name} ist beim Verarbeiten des Ereignisinhalts mit der ID \'%1$s\' auf ein Problem gestoßen
         Nicht ignorieren
    @@ -1392,7 +1360,7 @@
     \n- Dieses Gerät, oder das andere Gerät
     \n- Die Internetverbindung, die von den Geräten genutzt wird
     \n
    -\nWir empfehlen dir dein Passwort & Wiederherstellungsschlüssel in den Einstellungen sofort zu ändern.
    +\nWir empfehlen dir dein Passwort und den Wiederherstellungsschlüssel in den Einstellungen sofort zu ändern.
         Verifizierung abgebrochen. Du kannst sie erneut starten.
         Verifizierung abgebrochen
         Gib dein %s ein um fortzufahren.
    @@ -1409,7 +1377,7 @@
         Synchronisiere Benutzerschlüssel
         Synchronisiere selbstsignierenden Schlüssel
         Richte Schlüsselbackup ein
    -    Deine %2$s & %1$s sind nun eingerichtet.
    +    Deine %2$s und %1$s sind nun eingerichtet.
     \n
     \nBewahre sie sicher auf! Du wirst sie benötigen, um verschlüsselte Nachrichten und sichere Informationen freizuschalten, wenn du alle deine aktive Sitzungen verlierst.
         Speichere ihn auf einem USB-Stick oder auf einem Sicherungslaufwerk
    @@ -1426,7 +1394,7 @@
         Verschlüsselung ist nicht aktiviert
         Raumupgrades
         Verschlüsselung aktiviert
    -    Nachrichten in diesem Raum sind Ende-zu-Ende-verschlüsselt. Erfahre mehr & verifiziere Benutzer in deren Profil.
    +    Nachrichten in diesem Raum sind Ende-zu-Ende-verschlüsselt. Erfahre mehr und verifiziere Benutzer in deren Profil.
         Die Verschlüsselung in diesem Raum wird nicht unterstützt
         Warte auf %s…
         Fehlerbehebung
    @@ -1435,12 +1403,11 @@
         Fast geschafft! Warte auf Bestätigung…
         Verschlüsselte Direktnachrichten
         Nachricht…
    -    Verifiziere dich & andere, um eure Chats zu schützen
    +    Verifiziere dich und andere, um eure Chats zu schützen
         Gib zum Fortfahren deinen %s ein
         Datei benutzen
         Dies ist kein gültiger Wiederherstellungsschlüssel
         Bitte gib deinen Wiederherstellungsschlüssel ein
    -
         Verschlüsselungsupgrade verfügbar
         Überprüfe Wiederherstellungsschlüssel
         Überprüfe Sicherungsstatus (%s)
    @@ -1472,7 +1439,7 @@
         Unverschlüsselt
         Verschlüsselt von einem unbekannten Gerät
         Überprüfe, wo du angemeldet bist
    -    Verifiziere alle deine Sitzungen, um sicherzustellen, dass dein Konto & deine Nachrichten sicher sind
    +    Verifiziere alle deine Sitzungen, um sicherzustellen, dass dein Konto und deine Nachrichten sicher sind
         Bestätige neue Anmeldung zu deinem Konto: %1$s
         Verifiziere manuell mit einem Text
         Anmeldung verifizieren
    @@ -1543,7 +1510,7 @@
         Backup einrichten
         Backup zurücksetzen
         Auf diesem Gerät einrichten
    -    Verlust verschlüsselter Nachrichten & Daten verhindern, indem die Schlüssel für die Entschlüsselung auf dem Server gesichert werden.
    +    Verlust verschlüsselter Nachrichten und Daten verhindern, indem die Schlüssel für die Entschlüsselung auf dem Server gesichert werden.
         Generiere einen neuen Sicherheitsschlüssel oder setze eine neue Sicherheitspassphrase für dein existierendes Backup.
         Dieses wird deinen aktuellen Schlüssel oder deine aktuelle Phrase ersetzen.
         Integrationen sind deaktiviert
    @@ -1589,9 +1556,9 @@
         Dein Serveradministrator hat in privaten Räumen und Direktnachrichten Ende-zu-Ende-Verschlüsselung standardmäßig deaktiviert.
         Flugzeugmodus ist aktiv
         Gib eine Sicherheitsphrase ein, die nur du kennst. Diese wird benutzt um deine Daten auf dem Server geheim zu halten.
    -    Wenn du jetzt abbrichst und den Zugriff zu deinen Sitzungen verlierst, kannst du verschlüsselte Nachrichten & Daten verlieren.
    +    Wenn du jetzt abbrichst und den Zugriff zu deinen Sitzungen verlierst, kannst du verschlüsselte Nachrichten und Daten verlieren.
     \n
    -\nDu kannst auch ein Backup einrichten & deine Schlüssel in den Einstellungen verwalten.
    +\nDu kannst auch ein Backup einrichten und deine Schlüssel in den Einstellungen verwalten.
         Du hast den Raum erstellt und konfiguriert.
         Dieser Account ist deaktiviert worden.
         Konnte Mediendatei nicht speichern
    @@ -1620,7 +1587,7 @@
         Stoppe Kamera
         Starte Kamera
         Backup
    -    Verlust verschlüsselter Nachrichten & Daten verhindern, indem die Schlüssel für die Entschlüsselung am Server gesichert werden.
    +    Verlust verschlüsselter Nachrichten und Daten verhindern, indem die Schlüssel für die Entschlüsselung am Server gesichert werden.
         Sicherheitsschlüssel benutzen
         Generiere einen Sicherheitsschlüssel, welcher z.B. in einem Passwortmanager oder in einem Tresor sicher aufbewahrt werden sollte.
         Eine Sicherheitsphrase benutzen
    @@ -1786,7 +1753,7 @@
         Raumname
         Prüfung exportieren
         Direktnachricht
    -    Geschichte der Anfragen von Schlüsselfreigaben senden
    +    Verlauf der Anfragen von Schlüsselfreigaben senden
         Keine weiteren Ergebnisse
         Starte die Diskussion
         Autorisieren
    @@ -1841,7 +1808,6 @@
         Aktivieren, wenn der Raum nur von Mitgliedern deines Homeservers zur internen Kommunikation verwendet wird. Das kann später nicht mehr geändert werden.
         Begrenze Zugang zu diesem Raum (für immer!) auf Mitglieder von %s
         %1$d von %2$d
    -
         Keine Vorschau für diesen Raum verfügbar. Willst du direkt beitreten\?
         Der Raum ist gerade nicht zugänglich.
     \nVersuche es später nochmal, oder bitte einen Raum-Admin um Hilfe.
    @@ -1910,8 +1876,6 @@
         Beim Weiterleiten des Anrufs ist ein Fehler aufgetreten
         Weiterleiten
         Verbinden
    -
    -
         Aktiver Anruf (%1$s)
         Beim Suchen der Telefonnummer ist ein Fehler aufgetreten
         Wähltastatur
    @@ -2106,7 +2070,6 @@
         Spaces Feedback
         Dieser Server ist schon in der Liste vorhanden
         Server oder Raumliste kann nicht gefunden werden
    -
         Bei %1$s anfragen
         Zu %1$s weiterleiten
         Space-Adressen
    @@ -2187,7 +2150,7 @@
         Alle im übergeordneten Space haben Zugriff auf den Raum - es ist nicht nötig jeden einzeln einzuladen. Du kannst dies in den Raumeinstellungen jederzeit ändern.
         Andere Spaces oder Räume die du kennst
         Spaces mit diesem Raum und dir als Mitglied
    -    Nur Erwähnungen & Schlüsselwörter
    +    Nur Erwähnungen und Schlüsselwörter
         Auflegen…
         Sprachanruf mit %s
         Videoanruf mit %s
    @@ -2353,7 +2316,6 @@
         Sichere Nachrichtenübertragung.
         Besitze deine Konversationen.
         Um bestehende Kontakte ermitteln zu können, müsst du Kontaktinformationen (E-Mails und Telefonnummern) an Ihren Identitätsserver senden. Wir verschlüsseln deine Daten vor dem Senden, um den Datenschutz zu gewährleisten.
    -
         Deine Kontakte sind privat. Um in deinen Kontakten Benutzer erkennen zu können, benötigen wir deine Erlaubnis, Kontaktinformationen an deinen Identitätsserver zu senden.
         Dieser Server stellt keine Richtlinie bereit.
         Deine Identitätsserver-Richtlinie
    @@ -2430,7 +2392,7 @@
         Hinweis: App wird neugestartet
         diese Frage überspringen
         Noch nicht sicher\? Du kannst %s
    -    Freundschaften und Familie
    +    Freunde und Familie
         In Thread antworten
         Aus einem Thread
         Filter
    @@ -2450,4 +2412,10 @@
             %1$d mehr
         
         Weniger anzeigen
    +    %1$s und %2$s
    +    %1$s, %2$s und andere
    +    
    +        %d Server-ACL geändert
    +        %d Server-ACLs geändert
    +    
     
    \ No newline at end of file
    
    From a71cc5a942ce79ad557c728cb636153c9b999fa5 Mon Sep 17 00:00:00 2001
    From: random 
    Date: Mon, 28 Feb 2022 10:07:30 +0000
    Subject: [PATCH 016/126] Translated using Weblate (Italian)
    
    Currently translated at 100.0% (2157 of 2157 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 | 42 ++---------------------
     1 file changed, 2 insertions(+), 40 deletions(-)
    
    diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml
    index 849a4e92a4..492d8af526 100644
    --- a/vector/src/main/res/values-it/strings.xml
    +++ b/vector/src/main/res/values-it/strings.xml
    @@ -39,7 +39,6 @@
         Invito nella stanza
         %1$s e %2$s
         Stanza vuota
    -
         Sincronizzazione iniziale:
     \nImportazione account…
         Sincronizzazione iniziale:
    @@ -241,7 +240,6 @@
         Elimina
         Rinomina
         Segnala contenuto
    -
         o
         Invita
         Disconnetti
    @@ -264,7 +262,6 @@
         Mostra solo i contatti Matrix
         Nessun risultato
         Stanze
    -
         Invia i registri
         Invia i registri di crash
         Invia schermata
    @@ -295,11 +292,9 @@
         Questo indirizzo email non sembra corretto
         L\'indirizzo email è già stato impostato.
         Hai dimenticato la password\?
    -
         Questo homeserver vuole assicurarsi che tu non sia un robot
         Va inserito l\'indirizzo email associato al tuo account.
         La verifica del tuo indirizzo email è fallita: assicurati di aver cliccato sul link contenuto nella mail
    -
         Inserisci un URL valido
         JSON malformato
         Non conteneva un JSON valido
    @@ -315,14 +310,10 @@
         Chiamata in corso…
         Ricezione fallita da parte del destinatario.
         Informazione
    -
    -
         ${app_name} deve essere autorizzato ad accedere al microfono e poter così fare chiamate audio.
    -
         ${app_name} deve essere autorizzato ad accedere a fotocamera e microfono per poter fare chiamate video.
     \n
     \nNel prossimo pop-up concedi le autorizzazioni per poter fare la chiamata.
    -
         
         NO
         Continua
    @@ -330,7 +321,6 @@
         Entra
         Rifiuta
         Vai ai non letti
    -
         Esci dalla stanza
         Sei sicuro di voler uscire dalla stanza?
         CHAT DIRETTE
    @@ -357,7 +347,6 @@
         Il certificato è diverso da quello precedentemente contrassegnato sul tuo telefono come \"affidabile\". Questa cosa è MOLTO INSOLITA. Si raccomanda di NON ACCETTARE questo nuovo certificato.
         Il certificato del server è cambiato: quello precedente era stato contrassegnato come affidabile ma quello attuale no. Può darsi che il certificato precedente sia scaduto e sia stato semplicemente sostituito con uno nuovo. Contatta l\'amministratore del server per verificare l\'impronta digitale in uso.
         Contrassegna il certificato come affidabile solo se l\'mpronta digitale comunicata dall\'amministratore del server corrisponde a quella qua sopra.
    -
         Cerca
         Cerca tra i membri della stanza
         Nessun risultato
    @@ -443,7 +432,6 @@
         Queste sono caratteristiche sperimentali che potrebbero dare risultati inattesi. Usali con cautela.
         Imposta come indirizzo principale
         Non usare più come indirizzo principale
    -
         Tema
         Errore di decriptazione
         Nome pubblico
    @@ -455,7 +443,6 @@
         Esporta
         Inserisci la Passphrase
         Conferma la Passphrase
    -
         Importa le chiavi di crittografia E2E della stanza
         Importa le chiavi della stanza
         Importa le chiavi da un file locale
    @@ -467,7 +454,6 @@
         Conferma
         Conferma confrontando la seguente con le impostazioni utente della tua altra sessione:
         Se non corrispondono, la sicurezza delle tue comunicazioni potrebbe essere compromessa.
    -
         Scegli un elenco di stanze
         Nome del server
         Tutte le stanze sull\'Home Server %s
    @@ -509,7 +495,6 @@
         Sicuro di voler fare una chiamata audio\?
         Sicuro di voler fare una videochiamata\?
         Elenco dei membri
    -
         
             %d utente
             %d utenti
    @@ -519,8 +504,6 @@
             %d nuovo messaggio
             %d nuovi messaggi
         
    -
    -
         Tutti i messaggi
         Aggiungi alla schermata iniziale
         Anteprima degli URL
    @@ -530,7 +513,6 @@
             %d messaggio notificato non letto
             %d messaggi notificati non letti
         
    -
         
             %d stanza
             %d stanze
    @@ -608,16 +590,10 @@
         La conversazione continua qui
         Questa stanza contiene una conversazione cominciata altrove
         Clicca qui per vedere i messaggi precedenti
    -
    -
    -
    -
         
             %d selezionato
             %d selezionati
         
    -
    -
         Avvisi di sistema
         contatta l\'amministratore del servizio
         L\'Home Server ha superato uno dei limiti delle risorse, pertanto alcuni utenti non potranno accedere.
    @@ -708,7 +684,6 @@
         ${app_name} non è influenzato dall\'ottimizzazione della batteria.
         Se si lascia un dispositivo scollegato, fermo e con lo schermo spento, dopo un certo tempo questo entra in modalità Doze. Ciò impedisce alle App di accedere alla rete e ritarda le attività, le sincronizzazioni e la ricezione dei normali allarmi.
         Ignora l\'ottimizzazione
    -
         Non è stato trovato nessun APK Google Play Services valido. Le notifiche non funzioneranno correttamente.
         Chiamata video in corso…
         Backup delle chiavi
    @@ -778,7 +753,6 @@
         Salva il codice di recupero
         Condividi
         Salva come file
    -
         Si prega di farne una copia
         Condividi il codice di recupero con…
         Generazione del codice di recupero basato sulla Passphrase. Questo processo può durare alcuni secondi.
    @@ -826,7 +800,6 @@
         Eliminazione Backup…
         Elimina Backup
         Eliminare il Backup delle chiavi crittografiche dall\'Home Server\? Non potrai più usare il codice di recupero per leggere i messaggi cifrati.
    -
         Non perdere mai i messaggi cifrati
         Usa il Backup delle chiavi
         Nuove chiavi per messaggi sicuri
    @@ -840,7 +813,6 @@
         Versione
         Algoritmo
         Firma
    -
         Multimedia
         Compressione predefinita
         Scegli
    @@ -874,8 +846,6 @@
         Ignora
         Verificato!
         Capito
    -
    -
         Richiesta di verifica
         %s vuole verificare la tua sessione
         Errore sconosciuto
    @@ -972,7 +942,6 @@
         Nessuno
         Revoca
         Disconnetti
    -
         Non è stato trovato alcun Home Server seguendo questo URL. Per favore, controllalo
         Modalità sync in background
         Ottimizzato per la batteria
    @@ -983,7 +952,6 @@
     \nCiò avrà un certo impatto sulla quantità di dati e batteria utilizzati. Una notifica sempre accesa comunicherà che ${app_name} è attivo.
         Nessuna sincronizzazione in background
         Quando l\'App è in background non ti verranno notificati i messaggi in arrivo.
    -
         Farsi trovare
         Gestisci le impostazioni per farsi trovare.
         Non stai usando alcun server di identità
    @@ -1053,7 +1021,6 @@
         Questo contenuto è stato segnalato come inappropriato.
     \n
     \nSe non vuoi più vedere i contenuti di questo utente puoi ignorarlo. Ciò nasconderà i suoi messaggi dalla tua vista.
    -
         Integrazioni
         Usa un gestore di integrazioni per gestire bot, bridge, widget e pacchetti di sticker.
     \nI gestori di integrazioni possono ricevere dati di configurazione, modificare widget, mandare inviti alle stanze e modificare permessi a tuo nome.
    @@ -1264,7 +1231,6 @@
         Verifica %s
         %s verificato
         In attesa di %s…
    -
         I messaggi in questa stanza non sono cifrati E2E.
         I messaggi in questa stanza sono cifrati E2E.
     \n
    @@ -1410,7 +1376,6 @@
         Stampala e conservala in un posto sicuro
         Salvala in una penna USB o disco di backup
         Copiala sul Cloud
    -
         Crittografia attiva
         I messaggi in questa stanza sono crittografati E2E. Maggiori info e verifica degli utenti nel loro profilo.
         Crittografia non attiva
    @@ -1813,7 +1778,6 @@
         Nascondi avanzate
         Mostra avanzate
         %1$d di %2$d
    -
         Dai il consenso
         Revoca il mio consenso
         Hai acconsentito ad inviare email e numeri di telefono a questo server d\'identità per poter rintracciare altri utenti tra i tuoi contatti.
    @@ -1902,8 +1866,6 @@
         Trasferisci
         Connetti
         Prima consulta
    -
    -
         Chiamata attiva (%1$s)
         Si è verificato un errore cercando il numero di telefono
         Tastierino numerico
    @@ -2102,7 +2064,6 @@
         Inserisci il nome di un nuovo server che vuoi esplorare.
         Aggiungi un nuovo server
         Il tuo server
    -
         Spiacenti, si è verificato un errore tentando di entrare: %s
         Indirizzo dello spazio
         Vedi e gestisci gli indirizzi di questo spazio.
    @@ -2303,7 +2264,6 @@
         Domanda o argomento del sondaggio
         Crea sondaggio
         Sondaggio
    -
         Invia email e numeri di telefono a %s
         I tuoi contatti sono privati. Per trovare utenti dai tuoi contatti, ci serve l\'autorizzazione per inviare le informazioni dei contatti al tuo server d\'identità.
         La sessione è stata disconnessa!
    @@ -2448,4 +2408,6 @@
             %d modifica delle ACL del server
             %d modifiche delle ACL del server
         
    +    %1$s e %2$s
    +    %1$s, %2$s e altri
     
    \ No newline at end of file
    
    From 8f1cd11bbbef8c96defac371a4a8a55a57c75699 Mon Sep 17 00:00:00 2001
    From: Suguru Hirahara 
    Date: Wed, 2 Mar 2022 16:21:58 +0000
    Subject: [PATCH 017/126] Translated using Weblate (Japanese)
    
    Currently translated at 98.3% (2121 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/
    ---
     vector/src/main/res/values-ja/strings.xml | 9 +++++++--
     1 file changed, 7 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml
    index fe125881f4..fbd6540dd6 100644
    --- a/vector/src/main/res/values-ja/strings.xml
    +++ b/vector/src/main/res/values-ja/strings.xml
    @@ -1974,7 +1974,7 @@
         国際電話番号は「+」から始まる必要があります
         コードを%1$sに送信しました。以下に入力して認証してください。
         このメールアドレスはどのアカウントにも登録されていません
    -    パスワードを変更すると、すべてのセッションでのエンドツーエンド暗号鍵がリセットされ、暗号化されたメッセージ履歴が読めなくなります。パスワードを再設定する前に、鍵のバックアップを設定するか、他のセッションから鍵をエクスポートしておいてください。
    +    パスワードを変更すると、全てのセッションでのエンドツーエンド暗号鍵がリセットされ、暗号化されたメッセージ履歴が読めなくなります。パスワードを再設定する前に、鍵のバックアップを設定するか、他のセッションからルームの鍵をエクスポートしておいてください。
         パスワードの再設定を確認するために認証メールを送信します。
         このメールアドレスはどのアカウントにも属していません。
         このアプリではこのホームサーバーにアカウントを作成できません。
    @@ -2322,7 +2322,7 @@
     \n検証は端末に保存され、新しいバージョンのアプリで共有されます。
         %1$s、%2$s他
         %1$sと%2$s
    -    自分と相手を認証してチャットを安全に保ちます
    +    自分と相手を認証して、チャットを安全に保ちましょう
         あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。
         監査結果をエクスポート
         ストレージから機密情報を発見できません
    @@ -2335,4 +2335,9 @@
         アカウントのセキュリティーが破られている可能性があります
         選択したスペースに追加
         最新の${app_name}は他のデバイスでも使用できます:
    +    音声通話が終了しました・%1$s
    +    ビデオ通話が終了しました・%1$s
    +    メールアドレスで招待したり、連絡先を検索したりできます…
    +    鍵のバックアップの機密情報をSSSSに保存しています
    +    あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。
     
    \ No newline at end of file
    
    From 84a27d23fdbd8bf8ba093eb68ff8c6f34a7eb796 Mon Sep 17 00:00:00 2001
    From: Arusekk 
    Date: Wed, 2 Mar 2022 20:59:53 +0000
    Subject: [PATCH 018/126] Translated using Weblate (Polish)
    
    Currently translated at 93.8% (2025 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
    ---
     vector/src/main/res/values-pl/strings.xml | 75 +++++------------------
     1 file changed, 17 insertions(+), 58 deletions(-)
    
    diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
    index 408fc207f5..fe98d6b6a1 100644
    --- a/vector/src/main/res/values-pl/strings.xml
    +++ b/vector/src/main/res/values-pl/strings.xml
    @@ -30,7 +30,6 @@
         Zaproszenie do pokoju
         %1$s i %2$s
         Pusty pokój
    -
         ** Nie można odszyfrować: %s **
         %s wykonał(a) rozmowę wideo.
         %s wykonał(a) połączenie głosowe.
    @@ -46,14 +45,14 @@
         Wstępna synchronizacja:
     \nImportowanie kryptografii
         Wstępna synchronizacja:
    -\nImportowanie pokoi
    +\nImportowanie pokojów
         Wstępna synchronizacja:
     \nImportowanie Twoich konwersacji
    -\nJeśli dołączyłeś(aś) do wielu pokoi, może to zająć dłuższą chwilę
    +\nJeśli dołączyłeś(aś) do wielu pokojów, może to zająć dłuższą chwilę
         Wstępna synchronizacja:
    -\nImportowanie zaproszonych pokoi
    +\nImportowanie zaproszonych pokojów
         Wstępna synchronizacja:
    -\nImportowanie opuszczonych pokoi
    +\nImportowanie opuszczonych pokojów
         Wstępna synchronizacja:
     \nImportowanie grup
         Wstępna synchronizacja:
    @@ -74,7 +73,6 @@
         Usuń
         Zmień nazwę
         Zgłoś treść
    -
         i
         Zaproś
         Wyloguj się
    @@ -97,7 +95,6 @@
         Tylko kontakty Matrixa
         Brak wyników
         Pokoje
    -
         Wyślij dzienniki
         Wyślij dzienniki awarii
         Wyślij zrzut ekranu
    @@ -141,7 +138,6 @@
         Przychodzące połączenie głosowe
         W trakcie połączenia…
         Informacja
    -
         ${app_name} wymaga uprawnienia, aby przeprowadzić połączenie audio.
         TAK
         NIE
    @@ -169,7 +165,6 @@
         Ignoruj
         Odcisk palca (%s):
         Nie można zweryfikować tożsamości serwera.
    -
         Szukaj
         Filtruj członków pokoju
         Brak wyników
    @@ -209,7 +204,6 @@
         Zaaktualizuj nazwę publiczną
         Ostatnio widziany(-a)
         %1$s @ %2$s
    -
         Uwierzytelnianie
         Zalogowany jako
         Interfejs użytkownika
    @@ -240,7 +234,6 @@
         Laboratorium
         Znajdują się tu eksperymentalne funkcje, których należy używać z ostrożnością.
         Ustaw jako główny adres
    -
         Motyw
         Nazwa publiczna
         ID sesji
    @@ -283,8 +276,6 @@
         Czy jesteś pewien, że chcesz rozpocząć wideorozmowę?
         Zrób zdjęcie
         Nagraj film
    -
    -
         Uszkodzony JSON
         
             %d zmiana członkostwa
    @@ -293,15 +284,10 @@
             
         
         Rozmówca nie połączył się.
    -
    -
         ${app_name} wymaga dostępu do kamery i mikrofonu, aby przeprowadzać rozmowy wideo.
     \n
     \nPrzyznaj dostęp w następnym oknie.
    -
         Lista uczestników
    -
    -
         
             1 członek
             kilku członków
    @@ -323,8 +309,6 @@
         Certyfikat różni się od tego zaufanego w twoim telefonie. Serwer mógł odnowić certyfikat. Skontaktuj się z administratorem serwera w celu weryfikacji odcisku palca.
         Certyfikat zmienił stan z zaufanego na niezaufany. jest to NIEZWYKLE RZADKIE. Rekomendowane jest NIE AKCEPTOWANIE nowego certyfikatu.
         Akceptuj certyfikat tylko wtedy gdy administrator opublikował odcisk palca pasujący do tego powyżej.
    -
    -
         Wszystkie wiadomości
         Dodaj do ekranu domowego
         Pokaż informacje o aplikacji w ustawieniach systemu.
    @@ -363,7 +347,6 @@
         Wysyłaj dane analityczne
         ${app_name} zbiera anonimowe informacje które pozwolą ulepszyć aplikację.
         Eksportuj klucze E2E pokoju
    -
         Importuj klucze E2E pokoju
         Importuj klucze pokoju
         Importuj klucze z lokalnego pliku
    @@ -372,14 +355,13 @@
         Nigdy nie wysyłaj zaszyfrowanych wiadomości do niezweryfikowanych sesji w tym pokoju z tej sesji.
         Aby sprawdzić czy ta sesja jest zaufana, skontaktuj się z jej właścicielem używając innych form (np. osobiście lub telefonicznie) i zapytaj czy klucz, który widzą w ustawieniach użytkownika dla tego urządzenia pasuje do klucza poniżej:
         Jeśli klucz pasuje, potwierdź to przyciskiem poniżej. Jeśli nie, to ktoś inny najprawdopodobniej przejmuje lub podszywa się pod tą sesję i powinieneś dodać tę sesję do czarnej listy. W przyszłości proces weryfikacji będzie bardziej skomplikowany.
    -
         Wyślij naklejkę
         Niestety, nie znaleziono zewnętrznej aplikacji, która ukończy to działanie.
         
             1 pokój
             %d pokoje
    -        %d pokoi
    -        
    +        %d pokojów
    +        %d pokojów
         
         
             1 aktywny widżet
    @@ -399,7 +381,6 @@
             %d nieprzeczytanych wiadomości powiadomienia
             
         
    -
         %1$s w %2$s
         Czy na pewno chcesz usunąć widżet z tego pokoju?
         Nie można utworzyć widżetu.
    @@ -436,16 +417,10 @@
         Błąd
         Opuszcza pokój
         Włącza/Wyłącza markdown
    -
    -
         Kliknij tutaj, aby zobaczyć starsze wiadomości
         Przepraszamy, wystąpił błąd
         Alerty systemowe
         Jeżeli to możliwe, proszę napisz opis w języku angielskim.
    -
    -
    -
    -
         
             1 zaznaczone
             %d zaznaczone
    @@ -603,7 +578,6 @@
         Jeżeli nie pamiętasz swoich danych odzystkiwania, możesz %s.
         Zgubiłeś (-łaś) swój klucz odzyskiwania\? Możesz ustawić nowy w ustawieniach.
         Kopia zapasowa posiada poprawną sygnaturę z niezweryfikowanej sesji %s
    -
         Jesteś na bieżąco!
         Unieważnij
         Rozłącz
    @@ -652,7 +626,6 @@
         Niepowodzenie przy pobieraniu wersji kluczy (%s).
         Usuwanie kopii zapasowej…
         Sprawdzanie stanu kopii zapasowej
    -
         Reakcje
         Brak sieci. Sprawdź swoje połączenie z Internetem.
         Proszę czekać…
    @@ -682,7 +655,6 @@
         IGNORUJ UŻYTKOWNIKA
         Treść zgłoszona
         Zgłoszone jako spam
    -
         Proszę napisz swoją sugestię poniżej.
         Opisz swoją sugestię tutaj
         Utwórz nową rozmowę bezpośrednią
    @@ -712,7 +684,6 @@
         Opuść pokój
         Włącz szyfrowanie end-to-end…
         Brak
    -
         Nie udało się połączyć z serwerem o podanym adresie URL, upewnij się, że wpisano go poprawnie
         Niektóre rodzaje wiadomości będą ciche (wygenerują powiadomienie bez dźwięku).
         Weryfikacja Usług Google
    @@ -761,9 +732,8 @@
     \nWpłynie to na użycie baterii i sieci, na panelu powiadomień pozostanie wyświetlone stałe powiadomiene o nasłuchiwaniu zdarzeń.
         Brak synchronizacji w tle
         Nie będziesz otrzymywać powiadomień o przychodzących wiadomościach gdy aplikacja będzie działać w tle.
    -
         Użyj menedżera integracji aby zarządzać botami, mostami, widżetami i pakietami naklejek.
    -\nMenedżerzy integracji odbierają dane konfiguracji, modyfikują widżety, wysyłają zaproszenia do pokoi i ustawiają poziomy uprawnień na Twe żądanie.
    +\nMenedżerzy integracji odbierają dane konfiguracji, modyfikują widżety, wysyłają zaproszenia do pokojów i ustawiają poziomy uprawnień w Twoim imieniu.
         Pokaż podgląd linków wewnątrz czatu jeśli twój serwer wspiera tę funkcję.
         Formatuj wiadomości używając składni Markdown zanim zostaną wysłane. Pozwala to na zaawansowane formatowanie takie jak używanie asterysków do wyświetlania tekstu w kursywie.
         Nie wpływa to na zaproszenia, wyrzucenia oraz bany.
    @@ -771,7 +741,6 @@
         Przycisk enter na klawiaturze programowej wyśle wiadomość zamiast wprowadzania łamanania linii
         Znajdź
         Zarządzaj ustawieniami wyszukiwania.
    -
         Media
         Domyślne źródło mediów
         Odzyskiwanie zaszyforwanych wiadomości
    @@ -832,7 +801,6 @@
         Zrobiłem kopię
         Zapisz Klucz Odzyskiwania
         Zapisz jako plik
    -
         Kopia zapasowa istnieje już na Twoim serwerze domowym
         Wygląda na to, iż kopia zapasowa kluczy została skonfigurowana za pomocą innej sesji. Czy chcesz zastąpić ją tą, którą tworzysz\?
         Generowanie Klucza Odzyskiwania używając hasła, proces może zająć kilka sekund.
    @@ -861,7 +829,6 @@
             Kopiowanie %d kluczy…
             
         
    -
         Niektóre powiadomienia są wyłączone w osobistej konfiguracji.
         Usługi Google Play są aktualne.
         Rozumiem
    @@ -930,7 +897,6 @@
         Zawartość została zgłoszona jako niewłaściwa.
     \n
     \nJeżeli nie chcesz widzieć treści od tego użytkownika, możesz go zablokować aby ukryć jego wiadomości.
    -
         Opuść pokój
         %1$s nie dokona(-ła) zmian
         Wysyła wiadomość jako spoiler
    @@ -1109,7 +1075,6 @@
         Zweryfikuj %s
         Zweryfikowano %s
         Oczekiwanie na %s…
    -
         Wiadomości w tym pokoju są zaszyfrowane end-to-end.
     \n
     \nTwoje wiadomości są zabezpieczone zamkami i jedynie Ty oraz Twój odbiorca posiadacie klucze, aby je odblokować.
    @@ -1222,7 +1187,7 @@
         Szyfrowanie miniatury…
         Nie możesz czegoś odnaleźć\?
         Utwórz nowy pokój
    -    Otwórz katalog pokoi
    +    Otwórz katalog pokojów
         Nazwa lub ID (#przykład:matrix.org)
         Serwer toższamości
         Odłącz od serwera tożsamości
    @@ -1345,7 +1310,6 @@
         Jeżeli teraz przerwiesz, możesz utracić zaszyfrowane wiadomości oraz dane jeżeli utracisz dostęp do zalogowanych sesji. 
     \n
     \nMożesz także ustawić Secure Backup i zarządzać swoimi kluczami w Ustawieniach.
    -
         Wydrukuj go i schowaj w bezpiecznym miejscu
         Twój %2$s i %1$s są teraz ustawione.
     \n
    @@ -1457,7 +1421,6 @@
         Dodaj obraz z
         Niepoprawny kod weryfikacyjny.
         Kod
    -
         Udziel zgody
         Wycofaj moją zgodę
         Udzieliłeś zgody na wysłanie adresów e-mail oraz numerów telefonów do tego serwera tożsamości w celu odkrycia innych użytkowników z Twoich kontaktów.
    @@ -1508,7 +1471,7 @@
             %d zablokowanych użytkowników
             %d zablokowanych użytkowników
         
    -    Opublikować ten pokój dla wszystkich w katalogu pokoi %1$s\?
    +    Opublikować ten pokój dla wszystkich w katalogu pokojów %1$s\?
         Cofnij publikację tego adresu
         Opublikuj ten adres
         Dodaj adres lokalny
    @@ -1526,7 +1489,7 @@
         To jest główny adres
         Opublikowane adresy mogą zostać wykorzystane przez kogokolwiek na dowolnym serwerze do dołączenia do Twojego pokoju. Żeby opublikować adres musi być on najpierw ustawiony jako adres lokalny.
         Opublikowane adresy
    -    Obejrzyj i zarządzaj adresami tego pokoju oraz jego widocznością w katalogu pokoi.
    +    Obejrzyj i zarządzaj adresami tego pokoju oraz jego widocznością w katalogu pokojów.
         Adres pokoju
         Dostęp do pokoju
         Zmiany dotyczące tego kto może czytać historię zostaną zastosowane wyłącznie do przyszłych wiadomości w tym pokoju. Widoczności już istniejącej historii pozostanie niezmieniona.
    @@ -1557,7 +1520,7 @@
         Anuluj zaproszenie
         Zaprzestanie ignorowania użytkownika spowoduje ponowne wyświetlanie wszystkich jego wiadomości.
         Przestań ignorować użytkownika
    -    Zignorowanie tego użytkownika usunie wszystkie jego wiadomości z pokoi, które współdzielicie.
    +    Zignorowanie tego użytkownika usunie wszystkie jego wiadomości z pokojów, które współdzielicie.
     \n
     \nOperacja ta może zostać cofnięta w dowolnej chwili poprzez ustawienia ogólne.
         Ignoruj użytkownika
    @@ -1895,7 +1858,7 @@
         Adres URL serwera domowego
         Wyślij historię żądań udostępnienia klucza
         Przestrzenie
    -    Katalog pokoi
    +    Katalog pokojów
         Sugerowane pokoje
         Nowa wartość
         Przełącz
    @@ -1984,7 +1947,7 @@
         Niektóre pokoje mogą być ukryte, gdyż są prywatne i wymagają od Ciebie zaproszenia.
         Niektóre pokoje mogą być ukryte, gdyż są prywatne i wymagają od Ciebie zaproszenia. 
     \nNie masz uprawnień aby dodawać pokoje.
    -    W tej Przestrzeni nie ma żadnych pokoi
    +    W tej Przestrzeni nie ma żadnych pokojów
         Proszę skontaktować się z administratorem Twojego serwera domowego aby uzyskać więcej informacji
         Wygląda na to, że Twój serwer domowy jeszcze nie obsługuje Przestrzeni
         Lubisz eksperymentować\?
    @@ -2006,7 +1969,7 @@
         Dodaj istniejące pokoje i przestrzenie
         Wybierz aby opuścić
         Opuść wybrane pokoje i przestrzenie…
    -    Nie opuszczaj żadnych pokoi i przestrzeni
    +    Nie opuszczaj żadnych pokojów i przestrzeni
         Opuść wszystkie pokoje i przestrzenie
         Jesteś jedynym administratorem tej przestrzeni. Opuszczenie jej oznacza brak kontroli nad nią.
         Nie będziesz w stanie ponownie dołączyć, do momentu kiedy nie zostaniesz ponownie zaproszony.
    @@ -2051,7 +2014,7 @@
         Publiczna
         Prywatna przestrzeń dla Ciebie i Twoich znajomych
         Ja i moi znajomi
    -    Prywatna przestrzeń do organizacji Twoich pokoi
    +    Prywatna przestrzeń do organizacji Twoich pokojów
         Tylko ja
         Upewnij się, że odpowiednie osoby mają dostęp do %s. Możesz zmienić to później.
         Z kim pracujesz\?
    @@ -2132,7 +2095,7 @@
         Opuścić obecną konferencję i przejść do innej\?
         Wystąpił błąd podczas próby dołączenia do konferencji
         Ten serwer znajduje się już na liście
    -    Nie można odnaleźć tego serwera lub jego listy pokoi
    +    Nie można odnaleźć tego serwera lub jego listy pokojów
         Wprowadź nazwę nowego serwera, który chcesz odkrywać.
         Dodaj nowy serwer
         Twój serwer
    @@ -2149,7 +2112,7 @@
         wyproszenie użytkownika zaskutkuje usunięciem go z tej przestrzeni.
     \n
     \nAby uniemożliwić mu ponowne dołączenie, należy go zbanować.
    -    Pokaż wszystkie pokoje w katalogu pokoi (również te zawierające treści dla dorosłych).
    +    Pokaż wszystkie pokoje w katalogu pokojów (również te zawierające treści dla dorosłych).
         Pokaż pokoje z treścią dla dorosłych
         %1$s zmienił(a) alternatywne adresy dla tego pokoju.
         Dodano %1$s i usunięto %2$s jako adresy tego pokoju.
    @@ -2190,7 +2153,6 @@
         Ustawienia pokoju
         Ankieta
         Plik jest zbyt duży, aby go przesłać.
    -
         Wyślij maile i numery telefonów do %s
         Twoje kontakty są prywatne. Aby odnaleźć użytkowników z Twoich kontaktów, potrzebujemy zgody do wysłania informacji o nich na Twój serwer tożsamości.
         Bezpieczna kopia
    @@ -2273,7 +2235,6 @@
         Aktualizuj pokój prywatny
         Aktualizuj pokój publiczny
         Dołącz do pokoju zastępczego
    -
         Dodaj kilka szczegółów, aby ułatwić ludziom identyfikację. Możesz je zmienić w dowolnym momencie.
         Dodaj kilka szczegółów, aby się wyróżnić. Możesz je zmienić w dowolnym momencie.
         Twoja przestrzeń prywatna
    @@ -2336,7 +2297,6 @@
             %1$d aktywnych połączeń ·
             %1$d aktywnych połączeń ·
         
    -
         Zgadzasz się na wysłanie tych informacji\?
         Ustawienia systemu
         Wersje
    @@ -2371,7 +2331,6 @@
         Niedostępny
         Dostępny
         Pokaż znaczniki odczytania
    -
         Odkrywanie (%s)
         Dokończ konfigurację odkrywania.
         Usuń wszystkie nieudane wiadomości
    
    From abfd9b8fdcc4ce95aaf196d2d497c46c6586aa20 Mon Sep 17 00:00:00 2001
    From: Jozef Gaal 
    Date: Tue, 1 Mar 2022 23:41:47 +0000
    Subject: [PATCH 019/126] Translated using Weblate (Slovak)
    
    Currently translated at 98.9% (2134 of 2157 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 | 16 +++++++++-------
     1 file changed, 9 insertions(+), 7 deletions(-)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 18af56a598..6ec0827757 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -658,7 +658,7 @@
         Ignorovať
         Ste si istí, že sa chcete odhlásiť\?
         Označiť ako prečítané
    -    Prihlásiť sa použitím jediného prihlásenia
    +    Prihlásiť sa použitím jednotného prihlásenia SSO
         Pokročilé nastavenia oznámení
         Dôležitosť oznámení pre udalosti
         Vlastné nastavenia.
    @@ -1650,8 +1650,8 @@
         Vlastné (%1$d) v %2$s
         Predvolené v %1$s
         Overiť porovnaním emotikonov
    -    Namiesto toho overte porovnaním emoji
    -    Ak nie ste osobne, porovnajte namiesto toho emoji
    +    Namiesto toho overte porovnaním emotikonov
    +    Ak nie ste osobne, porovnajte namiesto toho emotikony
         Skenovať pomocou tohto zariadenia
         Naskenujte kód pomocou iného zariadenia alebo prepnite a skenujte pomocou tohto zariadenia
         Naskenujte kód pomocou zariadenia druhého používateľa, aby ste sa navzájom bezpečne overili
    @@ -2017,7 +2017,7 @@
         Vyberte si prosím heslo.
         Vyberte si prosím používateľské meno.
         Nepodarilo sa nastaviť krížové podpisovanie
    -    Interaktívne overte pomocou emoji
    +    Interaktívne overte pomocou emotikonov
         Manuálne overte pomocou textu
         Overte nové prihlásenie s prístupom k vášmu účtu: %1$s
         Overte všetky vaše relácie, aby ste si boli istý, že sú vaše správy a účet bezpečné
    @@ -2115,7 +2115,7 @@
         Krížové podpisovanie nie je povolené
         Vaša nová relácia je teraz overená. Má prístup k vašim šifrovaným správam a ostatní používatelia ju uvidia ako dôveryhodnú.
         Porovnajte kód s kódom zobrazeným na obrazovke druhého používateľa.
    -    Porovnajte jedinečné emoji a uistite sa, že sú zobrazené v rovnakom poradí.
    +    Porovnajte jedinečné emotikony a uistite sa, že sú zobrazené v rovnakom poradí.
         Aby ste si boli istý, urobte to osobne alebo použite iný dôveryhodný spôsob komunikácie.
         Ak chcete byť v bezpečí, overte %s pomocou jednorazového kódu.
         Po zapnutí šifrovania pre miestnosť ho už nemožno vypnúť. Správy odoslané v zašifrovanej miestnosti nemôže vidieť server, iba účastníci miestnosti. Zapnutie šifrovania môže zabrániť správnemu fungovaniu mnohých botov a premostení.
    @@ -2324,8 +2324,8 @@
         Kto má prístup\?
         Zmeny týkajúce sa toho, kto môže čítať históriu, sa budú vzťahovať len na budúce správy v tejto miestnosti. Viditeľnosť existujúcej histórie zostane nezmenená.
         Tento server neposkytuje žiadne zásady a pravidlá.
    -    Pridať tlačidlo do editora správ na otvorenie klávesnice emodži
    -    Zobraziť klávesnicu emodži
    +    Pridať tlačidlo do editora správ na otvorenie klávesnice emotikonov
    +    Zobraziť klávesnicu emotikonov
         Použite príkaz /confetti alebo pošlite správu obsahujúcu ❄️ alebo 🎉
         Zobraziť efekty konverzácie
         Relácia bola odhlásená!
    @@ -2437,4 +2437,6 @@
         
         %1$s, %2$s a ďalší
         %1$s a %2$s
    +    Pokračovať pomocou jednotného prihlásenia SSO
    +    jednotné prihlásenie SSO
     
    \ No newline at end of file
    
    From a251545e904cf0f0e3e43ba727e3c77f5adb8799 Mon Sep 17 00:00:00 2001
    From: Besnik Bleta 
    Date: Wed, 2 Mar 2022 09:39:16 +0000
    Subject: [PATCH 020/126] Translated using Weblate (Albanian)
    
    Currently translated at 99.4% (2145 of 2157 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 | 57 ++++++-----------------
     1 file changed, 15 insertions(+), 42 deletions(-)
    
    diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml
    index c363b8e4e9..48fc274eb7 100644
    --- a/vector/src/main/res/values-sq/strings.xml
    +++ b/vector/src/main/res/values-sq/strings.xml
    @@ -39,7 +39,6 @@
         %1$s hoqi emrin e tij në ekran (%2$s)
         %1$s hoqi temën e dhomës
         %1$s dërgoi një ftesë për %2$s që të marrë pjesë në dhomë
    -
         %s e përmirësoi këtë dhomë.
         Njëkohësimi fillestar:
     \nPo importohet llogaria…
    @@ -315,10 +314,6 @@
         Hidheni tej
         Anëtarë liste
         Hidhu te të palexuarit
    -
    -
    -
    -
         Dilni nga dhoma
         Jeni i sigurt se doni të dilni nga dhoma?
         FJALOSJE TË DREJTPËRDREJTA
    @@ -501,8 +496,6 @@
         Kreu
         Dhoma
         I ftuar
    -
    -
         Jeni përzënë prej %1$s nga %2$s
         Jeni dëbuar prej %1$s nga %2$s
         Arsye: %1$s
    @@ -520,7 +513,6 @@
         %1$s: %2$s
         %d+
         Po përgjohet për akte
    -
         Të parapëlqyer
         Ju lutemi, përshkruajeni të metën. Ç’po bënit? Ç’prisnit të ndodhte? Ç’ndodhi në fakt?
         Duket se po përplasni telefonin nga inati. Do të donit të hapej skena për njoftim të metash?
    @@ -528,17 +520,12 @@
         Dështoi dërgimi i njoftimit të të metës (%s)
         Dilni
         Dërgoni mesazh zanor
    -
         Verifikimi i adresës email dështoi: sigurohuni se keni klikuar lidhjen te email-i
    -
         Ju lutemi, niseni ${app_name}-in në një tjetër pajisje që mund të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te ky sesion.
    -
         %1$s & %2$s & të tjerë po shtypin…
         version olm
         Fikso dhomat me njoftime të humbura
         Vetëm anëtarët (që nga çasti i përzgjedhjes së kësaj mundësie)
    -
    -
         Përdor kamerë të brendshme
         Shtuat një sesion të ri \'%s\', i cili po kërkon kyçe fshehtëzimi.
         Sesioni juaj i paverifikuar \'%s\' po kërkon kyçe fshehtëzimi.
    @@ -551,7 +538,6 @@
         Ju lutemi, %s për ta zmadhuar këtë kufi.
         Ju lutemi, %s që të vazhdoni përdorimin e këtij shërbimi.
         ose
    -
         Në qoftë e mundur, ju lutemi, përshkrimin shkruajeni në anglisht.
         Hëpërhë, s’keni të aktivizuar ndonjë pako ngjitësash.
     \n
    @@ -565,16 +551,11 @@
         
         Po bëhet lidhja e thirrjes…
         Ana e largët dështoi të përgjigjet.
    -
    -
         Për të kryer thirrje audio, ${app_name}-i lyp leje të përdorë mikrofonin tuaj.
    -
         Për të kryer thirrje video, ${app_name}-i lyp leje të përdorë kamerën dhe mikrofonin tuaj.
     \n
     \nJu lutemi, lejoni përdorimin, që nga flluskat pasuese, që të jetë në gjendje të bëjë thirrjen.
    -
         JO
    -
         
             %d anëtar
             %d anëtarë
    @@ -585,14 +566,9 @@
             %d mesazh i ri
             %d mesazhe të rinj
         
    -
    -
    -
    -
         Ju lutemi, kontrolloni email-in tuaj dhe klikoni mbi lidhjen që përmban. Pasi të jetë bërë kjo, klikoni që të vazhdohet.
         Këto janë veçori eksperimentale që mund të ngecin në rrugë të papritura. Përdorini me kujdes.
         Ju lutemi, krijoni një frazëkalim për fshehtëzimin e kyçeve të eksportuar. Që të jeni në gjendje t’i importoni kyçet, do t’ju duhet të jepni të njëjtin frazëkalim.
    -
         Mos dërgo kurrë prej këtij sesioni mesazhe të fshehtëzuar te sesione të paverifikuar.
         Ripohojeni duke krahasuar sa vijon me Rregullimet e Përdoruesit te sesioni juaj tjetër:
         Nëse s’përputhen, siguria e komunikimeve tuaja mund të jetë komprometuar.
    @@ -639,7 +615,6 @@
             %d mesazh i njoftuar i palexuar
             %d mesazhe të njoftuar të palexuar
         
    -
         Dërgoni një ngjitës
         Dërgoni një ngjitës
         Thirrje
    @@ -700,7 +675,6 @@
         ${app_name}-i nuk preket nga Optimizime Baterie.
         Nëse një përdorues e lë një pajisje jo në prizë dhe të palëvizshme për një periudhë, me ekranin të fikur, pajisja kalon nën mënyrën Dremitje. Kjo u parandalon aplikimeve të hyjnë në rrjet dhe shtyn për më vonë punët e tyre, njëkohësimet dhe alarmet standarde.
         Shpërfille Optimizimin
    -
         S’u gjet APK për Google Play Services. Njoftimet mund të mos punojnë saktë.
         Thirrje Video Në Kryerje e Sipër…
         Kopjeruajtje Kyçesh
    @@ -737,7 +711,6 @@
         U bë
         Ruani Kyç Rimarrjesh
         Ruaje si Skedë
    -
         Ju lutemi, bëni një kopje
         Jepjani kyçin e rimarrjeve…
         Po prodhohet Kyç Rimarrjesh duke përdorur frazëkalim, ky proces mund të hajë disa sekonda.
    @@ -831,8 +804,6 @@
         Po shkarkohen kyçe…
         Po importohen kyçe…
         Që të përdorni Kopjeruajtje Kyçesh në këtë sesion, rikthejeni tani përmes frazëkalimit tuaj ose kyçi rimarrjesh.
    -
    -
         Media
         Ngjeshje parazgjedhje
         Zgjidhni
    @@ -869,8 +840,6 @@
         Shpërfille
         U verifikua!
         E mora vesh
    -
    -
         Kërkesë Verifikimi
         %s dëshiron të verifikojë sesionin tuaj
         Gabim i Panjohur
    @@ -965,7 +934,6 @@
         Asnjë
         Shfuqizoje
         Shkëputu
    -
         S’kapet dot shërbyes Home te kjo URL, ju lutemi, kontrollojeni
         Mënyrë Njëkohësimi Në Prapaskenë
         E optimizuar për baterinë
    @@ -976,7 +944,6 @@
     \nKjo do të ketë ndikim mbi përdorimin e baterisë dhe të transmetimit, do të shfaqet një njoftim i pandërprerë që pohon se ${app_name}-i po përgjon për akte.
         Pa njëkohësim në prapraskenë
         S’do të njoftoheni për mesazhe ardhës, kur aplikacioni gjendet në prapaskenë.
    -
         Administroni rregullimet tuaja për zbulime.
         S’po përdorni ndonjë shërbyes identitetesh
         Duket se po rrekeni të lidheni me një tjetër shërbyes Home. Doni të bëhet dalja\?
    @@ -1045,7 +1012,6 @@
         Kjo lëndë është raportuar si e papërshtatshme. 
     \n 
     \nNëse s’doni të shihni më lëndë nga ky përdorues, mund ta shpërfillni, që të fshihen mesazhet e tij.
    -
         Integrime
         Përdorni një përgjegjës integrimesh që të administroni robotë, ura, widget-e dhe paketa ngjitësish.
     \nPërgjegjësit e integrimeve marrin të dhëna formësimi dhe mund të ndryshojnë widget-e, të dërgojnë ftesa për në dhoma dhe të caktojnë shkallë pushteti në emrin tuaj.
    @@ -1324,7 +1290,6 @@
         %s u pranua
         Skanojeni kodin me pajisjen e përdoruesit tjetër, për të verifikuar në mënyrë të sigurt njëri-tjetrin
         Nëse s’jeni vetë atje, krahasoni emoji-n
    -
         ${app_name} nuk trajton akte të llojit \'%1$s\'
         ${app_name} ndeshi një problem kur vizatohej lëndë e aktit me ID \'%1$s\'
         Ky sesion s’është në gjendje të ndajë këtë verifikim me sesionet tuaj të tjerë.
    @@ -1407,7 +1372,6 @@
         Shtypeni dhe ruajeni diku në një vend të parrezik
         Ruajeni në një diskth USB ose pajisje kopjeruajtjesh
         Kopjojeni te depozita juaj personale në re
    -
         Fshehtëzimi u aktivizua
         Mesazhet në këtë dhomë janë të fshehtëzuara skaj-më-skaj. Mësoni më tepër & verifikoni përdorues te profilet e tyre.
         Fshehtëzim jo i aktivizuar
    @@ -1811,7 +1775,6 @@
         Fshihi të mëtejshmet
         Shfaq të mëtejshme
         %1$d nga %2$d
    -
         Jepe pranimin
         Shfuqizoje pranimin tim
         Keni dhënë pranimin tuaj për të dërguar email-e dhe numra telefonash te ky shërbyes identitetesh që të zbulojë përdorues të tjerë prej kontakteve tuaj.
    @@ -1863,8 +1826,6 @@
         Shpërngule
         Lidhe
         Konsultohu së pari
    -
    -
         Thirrje aktive (%1$s)
         Pati një gabim gjatë kërkimit të numrit të telefonit
         Pjesa e numrave
    @@ -2028,7 +1989,7 @@
         Unë dhe anëtarët e ekipit tim
         Një hapësirë private për të sistemuar dhomat tuaja
         Unë vetëm
    -    Siguroni që personat e duhur të kenë hyrje te %s. Këtë mund të ndryshoni më vonë.
    +    Siguroni që personat e duhur të kenë hyrje te %s.
         Me cilët po punoni\?
         Që të hyni në një hapësirë ekzistuese, ju duhet një ftesë.
         Këtë mund ta ndryshoni më vonë
    @@ -2102,7 +2063,6 @@
         Jepni emrin e e një shërbyesi të ri që doni të eksploroni.
         Shtoni shërbyes të ri
         Shërbyesi juaj
    -
         Na ndjeni, ndodhi një gabim teksa provohej të hyhej: %s
         Adresë hapësire
         Adresa hapësire
    @@ -2302,7 +2262,6 @@
         Krijoni Pyetësor
         A pranoni të dërgohen këto hollësi\?
         Për të zbuluar kontakte ekzistuese, duhet të dërgoni hollësi kontakti (email-e dhe numra telefonash) te shërbyesi juaj i identiteteve. Para dërgimit, i fshehtëzojmë të dhënat tuaja, për privatësi.
    -
         Dërgo email-e dhe numra telefonash te %s
         Kontaktet tuaja janë private. Për të zbuluar përdorues prej kontakteve tuaja, na duhet leja juaj për të dërguar hollësi kontakti te shërbyesi juaj i identiteteve.
         Është bërë dalja nga sesioni!
    @@ -2435,4 +2394,18 @@
         Kopjoje lidhjen te rrjedha
         Shiheni në dhomë
         Shihni Rrjedha
    +    %1$s dhe %2$s
    +    %1$s, %2$s dhe të tjerë
    +    
    +        %1$d më tepër
    +        %1$d më tepër
    +    
    +    Njofto krejt dhomën
    +    Përdorues
    +    
    +        %d ndryshim ACL-sh shërbyesi
    +        %d ndryshimë ACL-sh shërbyesi
    +    
    +    Njoftim dhome
    +    Shfaq më pak
     
    \ No newline at end of file
    
    From 0b6af0f2b290fee831ccf23316476b532b98de17 Mon Sep 17 00:00:00 2001
    From: Jeff Huang 
    Date: Tue, 1 Mar 2022 02:27:26 +0000
    Subject: [PATCH 021/126] Translated using Weblate (Chinese (Traditional))
    
    Currently translated at 100.0% (2157 of 2157 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 | 43 +------------------
     1 file changed, 2 insertions(+), 41 deletions(-)
    
    diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml
    index 060b739305..564a4ccf8a 100644
    --- a/vector/src/main/res/values-zh-rTW/strings.xml
    +++ b/vector/src/main/res/values-zh-rTW/strings.xml
    @@ -39,7 +39,6 @@
         聊天室邀請
         %1$s 和 %2$s
         空聊天室
    -
         初始化同步:
     \n正在匯入帳號……
         初始化同步:
    @@ -243,7 +242,6 @@
         刪除
         重新命名
         回報內容
    -
         
         邀請
         登出
    @@ -266,7 +264,6 @@
         僅 Matrix 聯絡人
         沒有結果
         聊天室
    -
         社群
         傳送記錄
         傳送當機紀錄
    @@ -300,11 +297,9 @@
         這看起不像是有效的電子郵件地址
         此電子郵件位址已經被定義。
         忘記密碼?
    -
         這個家伺服器想要確定您不是機器人
         必須輸入和您帳號關聯的電子郵件地址。
         電子郵件地址驗證失敗: 請確保您已點擊郵件中的連結
    -
         請輸入有效的網址
         異常的 JSON
         沒有包含有效的 JSON
    @@ -321,14 +316,10 @@
         通話進行中……
         遠端未能接聽。
         資訊
    -
    -
         ${app_name} 需要權限來存取麥克風,來撥打語音通話。
    -
         ${app_name} 需要權限來存取相機及麥克風來撥打視訊通話。
     \n
     \n為了可以正常使用通話功能,請在下個彈跳視窗中允許存取。
    -
         
         
         繼續
    @@ -337,8 +328,6 @@
         拒絕
         列出成員
         跳到未讀
    -
    -
         
             %d 個成員
         
    @@ -385,12 +374,9 @@
         請在另一個可以解密訊息的裝置上啟動 ${app_name},以便它將金鑰發送到此工作階段。
         憑證已從以前受信任的更改為不受信任的憑證。伺服器可能已續訂其憑證。請與伺服器管理員聯繫以尋找所需的指紋。
         僅當伺服器管理員發佈的指紋與上面的指紋匹配時才接受此憑證。
    -
         搜尋
         過濾聊天室成員
         沒有結果
    -
    -
         所有訊息
         新增到主畫面
         個人檔案圖片
    @@ -449,7 +435,6 @@
         更新公開名稱
         上次上線
         %1$s @ %2$s
    -
         授權
         登入爲
         家伺服器
    @@ -488,7 +473,6 @@
         這些是可能以非預期的方式壞掉的實驗性功能。請小心服用。
         設定為主要地址
         取消設定為主要地址
    -
         主題
         解密錯誤
         公開名稱
    @@ -500,7 +484,6 @@
         匯出
         輸入通關密語
         確認通關密語
    -
         匯入聊天室端到端加密密鑰
         匯入聊天室金鑰
         從本機檔案匯入金鑰
    @@ -512,7 +495,6 @@
         驗證
         透過將以下內容與您的其他工作階段中的使用者設定來確認:
         如果不符合的話,您的通訊安全可能正受到威脅。
    -
         選擇一個聊天室目錄
         伺服器名稱
         在 %s 伺服器上的所有聊天室
    @@ -520,7 +502,6 @@
         
             %d 條未讀的已通知訊息
         
    -
         
             %d 個聊天室
         
    @@ -594,15 +575,9 @@
         對話在此繼續
         這個聊天示是其他對話的延續
         點選這裡以檢視更舊的訊息
    -
    -
    -
    -
         
             %d 已選取
         
    -
    -
         系統警告
         聯絡您的服務管理員
         此家伺服器已經超過其中一項資源限制,所以有一些使用者將會無法登入
    @@ -694,7 +669,6 @@
         ${app_name} 不會被電池最佳化影響。
         如果使用者不為裝置充電,並讓其靜置一段時間,且將螢幕關閉,裝置將會進入 Doze 模式。這可能會導致應用程式無法存取網路,並延遲它們的工作、同步與標準警報。
         忽略最佳化
    -
         找不到有效的 Google Play 服務 APK。通知可能無法正常運作。
         視訊通話進行中……
         金鑰備份
    @@ -731,7 +705,6 @@
         完成
         儲存復原金鑰
         儲存為檔案
    -
         請複製
         分享復原金鑰與……
         正在使用通關密語生成復原金鑰,這個過程可能需要數秒鐘。
    @@ -814,7 +787,6 @@
         演算法
         簽章
         要在此工作階段上使用金鑰備份,現在就使用您的通關密語或復原金鑰復原。
    -
         正在計算復原金鑰……
         正在下載金鑰……
         正在匯出金鑰……
    @@ -823,7 +795,6 @@
         使用 Enter 傳送訊息
         軟體鍵盤的 Enter 按鈕將會傳送訊息而非換行
         密碼無效
    -
         媒體
         預設壓縮
         選擇
    @@ -858,8 +829,6 @@
         忽略
         已驗證!
         知道了
    -
    -
         驗證請求
         %s 想要驗證您的工作階段
         未知錯誤
    @@ -956,7 +925,6 @@
         
         撤銷
         斷線
    -
         無法在此 URL 找到家伺服器,請檢查
         背景同步模式
         為電池最佳化
    @@ -967,7 +935,6 @@
     \n這會影響到網路與電池的使用,並會顯示指出 ${app_name} 正在監聽某事件的永久通知。
         無背景同步
         當應用程式在背景時,您將不會收到訊息通知。
    -
         探索
         管理您的探索設定。
         您未使用任何身份識別伺服器
    @@ -1036,7 +1003,6 @@
         此內容已被回報為不合適。 
     \n 
     \n如果您不想要看到從此使用者而來的更多內容,您可以忽略他們以隱藏他們的訊息。
    -
         整合
         使用整合管理員以管理機器人、橋接、小工具與貼紙包。
     \n整合管理員可以代表您接收設定資料,調整小工具、傳送聊天室邀請並設定權力等級。
    @@ -1251,7 +1217,6 @@
         驗證 %s
         已驗證 %s
         正在等待驗證 %s……
    -
         此聊天室中的訊息未端到端加密。
         此聊天室中的訊息有端到端加密。
     \n
    @@ -1394,7 +1359,6 @@
         列印並將其存放在安全的地方
         將其儲存在 USB 隨身碟或備份磁碟上
         將其複製到您的私人雲端儲存空間
    -
         加密已啟用
         在此聊天室中的訊息已端到端加密。取得更多資訊並在使用者的個人檔案中驗證他們。
         加密未啟用
    @@ -1789,7 +1753,6 @@
         隱藏進階
         顯示進階
         %2$d 中的 %1$d
    -
         給予同意
         撤銷我的同意
         您已同意傳送電子郵件與電話號碼到此身份提供者以從您的聯絡人中探索其他使用者。
    @@ -1880,8 +1843,6 @@
         轉移
         連線
         先諮詢
    -
    -
         通話中 (%1$s)
         查詢電話號碼時發生錯誤
         撥號鍵盤
    @@ -2075,7 +2036,6 @@
         輸入您想要探索的新伺服器名稱。
         加入新的伺服器
         您的伺服器
    -
         抱歉,試圖加入時發生錯誤:%s
         空間地址
         檢視與管理此空間的地址。
    @@ -2272,7 +2232,6 @@
         投票問題或主題
         建立投票
         投票
    -
         向 %s 傳送電子郵件與電話號碼
         您的通訊錄是私人的。要從您的通訊錄中探索使用者,我們需要您的權限來傳送聯絡人資訊到您的身份識別伺服器。
         已登出工作階段!
    @@ -2411,4 +2370,6 @@
         
             %d 伺服器 ACL 變更
         
    +    %1$s 與 %2$s
    +    %1$s、%2$s 與其他人
     
    \ No newline at end of file
    
    From cc7545b31fe1900f44b5d33cb4e6246afce3ee62 Mon Sep 17 00:00:00 2001
    From: libexus 
    Date: Tue, 1 Mar 2022 15:36:02 +0000
    Subject: [PATCH 022/126] Translated using Weblate (German)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/de/
    ---
     fastlane/metadata/android/de-DE/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/de-DE/changelogs/40104020.txt | 2 ++
     2 files changed, 4 insertions(+)
     create mode 100644 fastlane/metadata/android/de-DE/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/de-DE/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/de-DE/changelogs/40104000.txt b/fastlane/metadata/android/de-DE/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..37de3cb4a2
    --- /dev/null
    +++ b/fastlane/metadata/android/de-DE/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +Neues: Erstelle Threads, damit dein Chatverlauf nicht zugespammt wird. Nachrichtenblasen.
    +Ganze Änderungsliste: https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/de-DE/changelogs/40104020.txt b/fastlane/metadata/android/de-DE/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..6693401a24
    --- /dev/null
    +++ b/fastlane/metadata/android/de-DE/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +Neues: Unterstützung für @room, Verbesserungen der Abstimmungen und weitere kleine Änderungen
    +Ganzer Changelog: https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From ee8e369294d84460cf59fb1787d20882d78936dc Mon Sep 17 00:00:00 2001
    From: Glandos 
    Date: Mon, 28 Feb 2022 19:52:43 +0000
    Subject: [PATCH 023/126] Translated using Weblate (French)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/fr/
    ---
     fastlane/metadata/android/fr-FR/changelogs/40103170.txt | 2 ++
     fastlane/metadata/android/fr-FR/changelogs/40103180.txt | 2 ++
     fastlane/metadata/android/fr-FR/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/fr-FR/changelogs/40104020.txt | 2 ++
     4 files changed, 8 insertions(+)
     create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40103170.txt
     create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40103180.txt
     create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/fr-FR/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/fr-FR/changelogs/40103170.txt b/fastlane/metadata/android/fr-FR/changelogs/40103170.txt
    new file mode 100644
    index 0000000000..c264ea3703
    --- /dev/null
    +++ b/fastlane/metadata/android/fr-FR/changelogs/40103170.txt
    @@ -0,0 +1,2 @@
    +Principaux changements pour cette version : envoyer votre position dans n'importe quel salon. Éditer un sondage.
    +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.17
    diff --git a/fastlane/metadata/android/fr-FR/changelogs/40103180.txt b/fastlane/metadata/android/fr-FR/changelogs/40103180.txt
    new file mode 100644
    index 0000000000..0b8a9542a5
    --- /dev/null
    +++ b/fastlane/metadata/android/fr-FR/changelogs/40103180.txt
    @@ -0,0 +1,2 @@
    +Principaux changements pour cette version : envoyer votre position dans n'importe quel salon. Éditer un sondage.
    +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.18
    diff --git a/fastlane/metadata/android/fr-FR/changelogs/40104000.txt b/fastlane/metadata/android/fr-FR/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..eaced9e3f4
    --- /dev/null
    +++ b/fastlane/metadata/android/fr-FR/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +Principaux changements pour cette version : Implémentation initial des fils de discussion. Bulles de messages.
    +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/fr-FR/changelogs/40104020.txt b/fastlane/metadata/android/fr-FR/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..068b4aac43
    --- /dev/null
    +++ b/fastlane/metadata/android/fr-FR/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +Principaux changements pour cette version : Ajout du support pour @room et des sondages non terminé parmi plein d'autres changements mineurs.
    +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From 6e805beeedc41f9a0fdf7c94d21ae4009955f134 Mon Sep 17 00:00:00 2001
    From: SPiRiT 
    Date: Wed, 2 Mar 2022 21:02:50 +0000
    Subject: [PATCH 024/126] Translated using Weblate (Hebrew)
    
    Currently translated at 81.2% (1753 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 95 +++++++----------------
     1 file changed, 30 insertions(+), 65 deletions(-)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 1fea4fb060..bc0ab0ff34 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -82,7 +82,6 @@
         ערכת נושא שחורה
         ערכת נושא כהה
         ערכת נושא בהירה
    -
         חדרים
         אנשי קשר מטריקס בלבד
         שיחות
    @@ -125,11 +124,9 @@
         זו אינה כתובת שרת מטריקס חוקית
         אנא הכנס כתובת תקינה
         אנא עיין וקבל את המדיניות של שרת בית זה:
    -
         אימות כתובת הדוא\"ל נכשל: ודא שלחצת על הקישור בדוא\"ל
         יש להזין את כתובת הדוא\"ל המקושרת לחשבונך.
         שרת הבית רוצה לוודא שאתה לא רובוט
    -
         שכחת סיסמה\?
         מספר הטלפון הזה כבר קיים ומעודכן במערכת.
         כתובת הדוא\"ל הזו כבר קיימת ומוגדרת במערכת.
    @@ -162,7 +159,6 @@
         שיחת האלמנט נכשלה
         האם אתה בטוח שברצונך להתחיל שיחת וידאו\?
         האם אתה בטוח שברצונך להתחיל שיחה קולית\?
    -
         עבור להודעה שלא נקראה
         חברי רשימה
         דחייה
    @@ -173,14 +169,10 @@
         כן
         אפשר הרשאה לגשת לאנשי הקשר שלך.
         כדי לסרוק קוד QR, עליך לאפשר גישה למצלמה.
    -
         אלמנט זקוק להרשאה כדי לגשת למצלמה ולמיקרופון שלך כדי לבצע שיחות וידאו.
     \n
     \nאנא אפשר גישה בחלונות הקופצים הבאים כדי להיות מסוגל לבצע את השיחה.
    -
         אלמנט זקוק להרשאה כדי לגשת למיקרופון שלך כדי לבצע שיחות שמע.
    -
    -
         מידע
         הצד המרוחק לא הצליח להרים.
         שיחת וידאו מתבצעת …
    @@ -235,7 +227,6 @@
             %d שניות
         
         עיכוב בין כל סינכרון
    -
         פסק-זמן לבקשה לסנכרון
         החל באתחול
         לא תקבל הודעה על הודעות נכנסות כאשר האפליקציה ברקע.
    @@ -310,7 +301,6 @@
         סנן משתמשים מודרים
         סנן חברים מהחדר
         חפש
    -
         
             %d נבחר
             %d נבחרים
    @@ -410,20 +400,14 @@
         תמונת פרופיל
         הוסף למסך הבית
         כל ההודעות
    -
         האם ברצונך לעזוב את החדר\?
         עזוב חדר
    -
    -
    -
    -
         
             %d חבר
             %d חברים
             %d חברים
             %d חברים
         
    -
         התחל אימות
         מושב לא מאומת מבקש מפתחות הצפנה.
     \nשם מושב: %1$s
    @@ -523,7 +507,6 @@
             %d חדרים מועטים
             %d חדרים אחרים
         
    -
         
             הודעת התראה %d שלא נקראה
             %d הודעות התראה שלא נקראו
    @@ -534,7 +517,6 @@
         כל החדרים בשרת %s
         כתובת אתר של שרת בית
         בחר מדריך חדרים
    -
         אם הם לא תואמים, אבטחת התקשורת שלך עלולה להיפגע.
         אשרו על ידי השוואה בין הדברים הבאים להגדרות המשתמש בפגישה האחרת שלכם:
         אמת
    @@ -556,7 +538,6 @@
         נהל גיבוי מפתח
         שחזור הודעות מוצפנות
         מפתחות יוצאו בהצלחה
    -
         אנא צור משפט סיסמה להצפנת המפתחות המיוצאים. יהיה עליך להזין את אותו ביטוי סיסמה כדי שתוכל לייבא את המפתחות.
         יצא
         יצא מפתחות לקובץ מקומי
    @@ -567,7 +548,6 @@
         שם ציבורי
         שגיאת פענוח
         ערכת נושא
    -
         ביטול ההגדרה ככתובת הראשית
         הגדר ככתובת ראשית
         אלה תכונות ניסיוניות שעשויות להישבר בדרכים לא צפויות. השתמש בזהירות.
    @@ -690,8 +670,6 @@
         סיבה: %1$s
         חסום על ידי %2$s מ- %1$s
         אתה נבעט מ- %1$s על ידי %2$s
    -
    -
         הוזמנו
         חדרים
         בית
    @@ -748,7 +726,6 @@
         לעולם אל תאבד הודעות מוצפנות
         להגן מפני אובדן גישה להודעות ונתונים מוצפנים
         גיבוי מאובטח
    -
         מחק גיבוי למחוק את מפתחות ההצפנה המגובים שלך מהשרת\? לא תוכל עוד להשתמש במפתח השחזור שלך כדי לקרוא את היסטוריית ההודעות המוצפנת.
         מחק את הגיבוי
         בודק מצב גיבוי
    @@ -794,7 +771,6 @@
         נראה שכבר יש לך גיבוי מפתח הגדרה מהפעלה אחרת. האם אתה רוצה להחליף אותו לזה שאתה יוצר\?
         גיבוי כבר קיים בשרת הבית שלך
         מפתח השחזור נשמר.
    -
         שמירת קובץ בשם
         שיתוף
         שמור מפתח שחזור
    @@ -998,7 +974,6 @@
         כל ההודעות
         כל ההודעות (רועשות)
         התעלם ממשתמש זה
    -
         תוכן זה דווח כבלתי הולם.
     \n
     \nאם אינך רוצה לראות תוכן נוסף ממשתמש זה, תוכל להתעלם ממנו כדי להסתיר את ההודעות שלו.
    @@ -1058,7 +1033,6 @@
         אנא הזן את כתובת ה- URL של שרת הזהות
         לא ניתן היה להתחבר לשרת זהות
         הזן כתובת אתר של שרת זהות
    -
         תן הסכמה
         בטל את הסכמתי
         נתת את הסכמתך לשלוח מיילים ומספרי טלפון לשרת זהות זה כדי לגלות משתמשים אחרים מאנשי הקשר שלך.
    @@ -1157,7 +1131,6 @@
     \nההודעות שלך מאובטחות במנעולים ורק לך ולמקבל יש את המפתחות הייחודיים לפתיחתם.
         ההודעות כאן אינן מוצפנות מקצה לקצה.
         הודעות בחדר זה אינן מוצפנות מקצה לקצה.
    -
         ממתין ל- %s…
         %s מאומת
         אמת. את %s
    @@ -1219,11 +1192,8 @@
         שגיאה לא ידועה
         %s רוצה לאמת את ההפעלה שלך
         בקשת אימות
    -
    -
         הבנתי
         מאומת!
    -
         חתימה
         אלגוריתם
         גירסה
    @@ -1253,7 +1223,6 @@
         הצג תוכן בהתראות
         קוד PIN הוא הדרך היחידה לפתוח את Element.
         אפשר ביומטריה ספציפית למכשירים, כמו טביעות אצבע וזיהוי פנים.
    -
         גיבוי מאובטח
         הוסף לחצן במלחין ההודעות כדי לפתוח מקלדת אימוג\'י
         הצג מקלדת אימוג\'י
    @@ -1284,11 +1253,9 @@
         צפה ועדכן את התפקידים הנדרשים לשינוי חלקים שונים בחדר.
         הרשאות חדרים
         חדר זה אינו ציבורי. לא תוכל להצטרף שוב ללא הזמנה.
    -
         (%%%s)התקדמות
         אנשים
         מועדפים
    -
         ברירת מחדל מערכת
         קפצו לקבלת קריאה
         הודעה ישירה
    @@ -1370,7 +1337,6 @@
         שרת ביתי
         מחובר כ
         הזדהות
    -
         נראה לאחרונה
         עדכן שם ציבורי
         שם ציבורי
    @@ -1378,7 +1344,6 @@
         אלמנט אוסף ניתוח אנונימי כדי לאפשר לנו לשפר את היישום.
         שלח נתוני ניתוח
         ניתוח נתונים
    -
         נהל את הגדרות הגילוי שלך.
         תַגלִית
         הפוך את המשתמש שלי ללא פעיל
    @@ -1568,7 +1533,6 @@
         אם תבטל עכשיו, אתה עלול לאבד הודעות ונתונים מוצפנים אם תאבד את הגישה לכניסות שלך.
     \n
     \nאתה יכול גם להגדיר גיבוי מאובטח ולנהל את המפתחות שלך בהגדרות.
    -
         העתק אותו לאחסון הענן האישי שלך
         שמור אותו במפתח USB או בכונן גיבוי
         הדפיסו ואחסנו במקום בטוח
    @@ -1731,55 +1695,55 @@
         סיימת את השיחה.
         %s סיים את השיחה.
         ענית לשיחה.
    -    %s שנה לשיחה.
    +    %s ענה לשיחה.
         שלחת מידע לביצוע שיחה.
         %s שלח מידע לביצוע שיחה.
         ביצעת שיחת אודיו.
    -    %s ביצע שיחת אודיו.
    +    %s ביצע/ה שיחה קולית.
         ביצעת שיחת וידאו.
    -    %s ביצע שיחת וידאו .
    +    %s ביצע/ה שיחת וידאו.
         שינית את שם החדר ל: %1$s
         %1$s שינה את שם החדר ל: %2$s
    -    שינית את דמות החדר
    -    %1$s שינה את דמות החדר
    -    שינית את השם ל: %1$s
    +    שינית את תמונת החדר
    +    %1$s שינה את תמונת החדר
    +    שינית את הנושא ל: %1$s
         %1$s שינה את הנושא ל: %2$s
    -    ביטלתם את שם התצוגה שלכם (שם קודם %1$s)
    +    הסרת את שם התצוגה שלך (הוא היה %1$s)
         %1$sהורידו את שם התצוגה שלהם (היה קודם %2$s)
         שינית את שמך מ %1$s ל %2$s
         %1$s שינו את שמותיהם מ %2$s ל %3$s
         שינית את שמך ל %1$s
         %1$s שינה את שמו ל %2$s
    -    שינית את דמותך באפליקציה
    -    %1$s שינה את דמותו
    +    שינית תמונת פרופיל
    +    %1$s שינה תמונת פרופיל
         משכת את הזמנתו של %1$s\'s
    -    %1$s משך את הזמנתו של %2$s\'s
    +    %1$s ביטל/ה את ההזמנה של %2$s\'s
         חסמת את %1$s
    -    %1$s חסם את%2$s
    -    חסמת את %1$s
    -    %1$s הסיר מחסימה את %2$s
    +    %1$s חסם/ה את %2$s
    +    הסרת את החסימה של %1$s
    +    %1$s הסיר/ה מחסימה את %2$s
         הרחקת את %1$s
    -    %1$s הרחיק את%2$s
    +    %1$s הרחיק/ה את %2$s
         דחית את ההזמנה
         %1$s דחה את ההזמנה
         עזבת את החדר
    -    %1$s עזב את החדר
    +    %1$s עזב/ה את החדר
         עזבת את החדר
    -    %1$s עזב את החדר
    +    %1$s עזב/ה את החדר
         הצטרפת
    -    %1$s הצטרף
    +    %1$s הצטרף/ה
         הצטרפת לחדר
    -    %1$s הצטרף לחדר
    -    %1$s הזמין אותך
    +    %1$s הצטרף/ה לחדר
    +    %1$s הזמין/ה אותך
         הזמנת את %1$s
    -    %1$s הזמין %2$s
    +    %1$s הזמין/ה את %2$s
         יצרת את הדיון
    -    %1$s יצר את הדיון
    +    %1$s יצר/ה את הדיון
         יצרת את החדר
    -    %1$s יצר את החדר
    +    %1$s יצר/ה את החדר
         הזמנתך
    -    %s הזמנה
    -    כל חברי החדר, מהנקודה בה הם הוזמנו.
    +    ההזמנה של %s
    +    כל חברי החדר, מהרגע שבו הוזמנו.
         את/ה הפכת הודעות עתידיות לגלויות בפני %1$s
         %1$s הפך הודעות עתידיות לגלויות בפני %2$s
         חסמת את %1$s. סיבה: %2$s
    @@ -1830,7 +1794,6 @@
     \nממתין לתגובת השרת…
         חדר ריק (היה %s)
         חדר ריק
    -
         
             %1$s, %2$s, %3$s ו-%4$d אחר
             %1$s, %2$s, %3$s ו-%4$d אחרים
    @@ -1894,10 +1857,10 @@
         שדרגת כאן.
         %s שודרג כאן.
         שדרגת את החדר הזה.
    -    %s שדרג את החדר הזה.
    +    %s שידרג/ה חדר זה.
         כל אחד.
         כל חברי החדר.
    -    כל חברי החדר, מהנקודה בה הצטרפו.
    +    כל חברי החדר, מהרגע שבו הצטרפו.
         מפה
         שתף מיקום
         מיקום
    @@ -1924,8 +1887,8 @@
         מיפוי מיקומי משתמשים בציר הזמן
         לאחר ההפעלה, תוכל לשלוח את המיקום שלך לכל חדר
         אפשר שיתוף מיקום
    -    לפתוח בעזרת
    -    ${app_name} לא הצליח לגשת למיקום שלך. בבקשה נסה שוב מאוחר יותר.
    +    פתח באמצעות
    +    ${app_name} לא הצליח לגשת למיקום שלך. אנא נסה שוב מאוחר יותר.
         ${app_name} לא הצליח לגשת למיקום שלך
         שתף מיקום
         אפשר התראת דוא\"ל עבור %s
    @@ -2096,4 +2059,6 @@
         %1$s משך את ההזמנה של %2$s. סיבה: %3$s
         קיבלת את ההזמנה עבור %1$s. סיבה: %2$s
         %1$s קיבל את ההזמנה עבור %2$s. סיבה: %3$s
    +    שיתפו את מיקומם
    +    מיקום
     
    \ No newline at end of file
    
    From ed7d1927f5466f61d231cccc5a0dc87a357ebf4a Mon Sep 17 00:00:00 2001
    From: sagi korin 
    Date: Wed, 2 Mar 2022 15:41:11 +0000
    Subject: [PATCH 025/126] Translated using Weblate (Hebrew)
    
    Currently translated at 81.2% (1753 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 6 ++++++
     1 file changed, 6 insertions(+)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index bc0ab0ff34..57a8cf6630 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2061,4 +2061,10 @@
         %1$s קיבל את ההזמנה עבור %2$s. סיבה: %3$s
         שיתפו את מיקומם
         מיקום
    +    משתמשים
    +    הצג פחות
    +    דלג על השאלה
    +    יש לי כבר חשבון
    +    צור חשבון
    +    תקשורת מאובטחת.
     
    \ No newline at end of file
    
    From e8024688f4cbc3110323c930b4a01dac207fbec8 Mon Sep 17 00:00:00 2001
    From: Besnik Bleta 
    Date: Wed, 2 Mar 2022 09:37:09 +0000
    Subject: [PATCH 026/126] Translated using Weblate (Albanian)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/sq/
    ---
     fastlane/metadata/android/sq/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/sq/changelogs/40104020.txt | 2 ++
     2 files changed, 4 insertions(+)
     create mode 100644 fastlane/metadata/android/sq/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/sq/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/sq/changelogs/40104000.txt b/fastlane/metadata/android/sq/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..f917c7c0cb
    --- /dev/null
    +++ b/fastlane/metadata/android/sq/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +Ndryshime kryesore në këtë version: Sendërtimi fillestar i mesazheve në rrjedha. Flluska mesazhesh.
    +Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/sq/changelogs/40104020.txt b/fastlane/metadata/android/sq/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..2fbe4f2bf6
    --- /dev/null
    +++ b/fastlane/metadata/android/sq/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +Ndryshimet kryesore në këtë version: shtim mbulimi për @room dhe për pyetësorë jopublikë, mes mjaft ndryshimesh të tjera të vockla.
    +Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From a77637b751a3cadd8c1e6cffdcac2d1b13aaeb32 Mon Sep 17 00:00:00 2001
    From: Suguru Hirahara 
    Date: Thu, 3 Mar 2022 13:05:29 +0000
    Subject: [PATCH 027/126] Translated using Weblate (Japanese)
    
    Currently translated at 98.3% (2121 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/
    ---
     vector/src/main/res/values-ja/strings.xml | 36 +++++++++++------------
     1 file changed, 18 insertions(+), 18 deletions(-)
    
    diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml
    index fbd6540dd6..c1f3304fb8 100644
    --- a/vector/src/main/res/values-ja/strings.xml
    +++ b/vector/src/main/res/values-ja/strings.xml
    @@ -1489,8 +1489,8 @@
         画像
         スクリーンショット
         接続
    -    投票
    -    投票
    +    アンケート
    +    アンケート
         コード
         役割
         送信
    @@ -1515,9 +1515,9 @@
         警告!
         位置情報
         メディア
    -    投票終了
    -    投票を終了しますか?
    -    投票を削除
    +    アンケート終了
    +    アンケートを終了しますか?
    +    アンケートを削除
         スペースを作成
         スペースに参加
         スペースを退出
    @@ -1531,10 +1531,10 @@
         非公開のルームをアップグレード
         音声メッセージを一時停止
         このメールアドレスをアカウントにリンク
    -    投票を編集
    +    アンケートを編集
         地図
    -    投票を終了
    -    投票を終了
    +    アンケートを終了
    +    アンケートを終了
         選択肢%1$d
         選択肢を作成
         位置情報
    @@ -1549,7 +1549,7 @@
         ファイルをアップロード
         連絡先を開く
         ステッカーを送信
    -    投票を作成
    +    アンケートを作成
         位置情報を共有
         スペースに関する変更を行うために必要な役割を更新する権限がありません
         スペースに関する変更を行うために必要な役割を選択
    @@ -1587,8 +1587,8 @@
         ルームの暗号化の有効化
         スペースのメインアドレスの変更
         スペースのアバターの変更
    -    投票を作成
    -    投票を作成
    +    アンケートを作成
    +    アンケートを作成
         暗号化が正しく設定されていないため、メッセージを送ることができません。クリックして設定を開いてください。
         暗号化が正しく設定されていないため、メッセージを送ることができません。管理者に連絡して、暗号化を正しい状態に復元してください。
         %2$dの%1$d
    @@ -1741,12 +1741,12 @@
         続行するには%sを入力してください
         有効なリカバリーキーではありません
         リカバリーキーを入力してください
    -    投票の種類
    -    実施中の投票
    +    アンケートの種類
    +    投票の際に結果を公開
         投票する
         投票した人には、投票の際に即座に結果が表示されます
    -    終了した投票
    -    結果は投票を終了した後でのみ明らかにされます
    +    アンケートの終了後に結果を公開
    +    結果はアンケートを終了した後でのみ明らかにされます
         以下で開く
         暗号化のアップグレードが利用可能です
         SSSSキーをリカバリーキーから生成しています
    @@ -1762,7 +1762,7 @@
         
             %1$d個の投票
         
    -    投票を締め切り、投票の最終結果を表示します。
    +    アンケートを締め切り、最終結果を表示します。
         招待者のみ参加可能。個人やチームに最適
         スペースを作成
         連絡先をスペースに招待
    @@ -1789,7 +1789,7 @@
         音声メッセージを録音しています
         録音を削除
         音声メッセージがアクティブの間は返信や編集はできません
    -    この投票を削除してよろしいですか?一度削除すると復元することはできません。
    +    このアンケートを削除してよろしいですか?一度削除すると復元することはできません。
         共有データの取り扱いに失敗しました
         回転とクロップ
         ルームを探索
    @@ -1815,7 +1815,7 @@
     \nこのユーザーのコンテンツをこれ以上見たくなければ、ユーザーを無視してそのメッセージを非表示にできます。
         %1$sにより%2$sに
         質問あるいはトピック
    -    投票の質問あるいはトピック
    +    アンケートの質問あるいはトピック
         少々お待ちください。少し時間がかかるかもしれません。
         ルームのバージョン 👓
         不安定
    
    From 4254f4606535f6899e0cc130683cfbbfc46fa7e8 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Thu, 3 Mar 2022 17:59:51 +0300
    Subject: [PATCH 028/126] Support scrolling playback on timeline.
    
    ---
     .../home/room/detail/TimelineFragment.kt      |  8 ++++++
     .../detail/composer/MessageComposerAction.kt  |  2 ++
     .../composer/MessageComposerViewModel.kt      | 16 +++++++++++-
     .../detail/composer/VoiceMessageHelper.kt     |  8 ++++++
     .../timeline/TimelineEventController.kt       |  2 ++
     .../timeline/factory/MessageItemFactory.kt    | 11 ++++++++
     .../detail/timeline/item/MessageVoiceItem.kt  | 25 +++++++++++++++++++
     7 files changed, 71 insertions(+), 1 deletion(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    index 2da69bbe6c..d019cb1777 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    @@ -2051,6 +2051,14 @@ class TimelineFragment @Inject constructor(
             messageComposerViewModel.handle(MessageComposerAction.PlayOrPauseVoicePlayback(eventId, messageAudioContent))
         }
     
    +    override fun onVoiceWaveformTouchedUp(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float) {
    +        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformTouchedUp(eventId, messageAudioContent, percentage))
    +    }
    +
    +    override fun onVoiceWaveformMovedTo(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float) {
    +        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformMovedTo(eventId, messageAudioContent, percentage))
    +    }
    +
         private fun onShareActionClicked(action: EventSharedAction.Share) {
             when (action.messageContent) {
                 is MessageTextContent           -> shareText(requireContext(), action.messageContent.body)
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    index 10cef39942..daa5631d84 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    @@ -40,4 +40,6 @@ sealed class MessageComposerAction : VectorViewModelAction {
         data class PlayOrPauseVoicePlayback(val eventId: String, val messageAudioContent: MessageAudioContent) : MessageComposerAction()
         object PlayOrPauseRecordingPlayback : MessageComposerAction()
         data class EndAllVoiceActions(val deleteRecord: Boolean = true) : MessageComposerAction()
    +    data class VoiceWaveformTouchedUp(val eventId: String, val messageAudioContent: MessageAudioContent, val percentage: Float) : MessageComposerAction()
    +    data class VoiceWaveformMovedTo(val eventId: String, val messageAudioContent: MessageAudioContent, val percentage: Float) : MessageComposerAction()
     }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index 0d90227168..ccb51d3796 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -108,7 +108,9 @@ class MessageComposerViewModel @AssistedInject constructor(
                 is MessageComposerAction.EndAllVoiceActions             -> handleEndAllVoiceActions(action.deleteRecord)
                 is MessageComposerAction.InitializeVoiceRecorder        -> handleInitializeVoiceRecorder(action.attachmentData)
                 is MessageComposerAction.OnEntersBackground             -> handleEntersBackground(action.composerText)
    -        }
    +            is MessageComposerAction.VoiceWaveformTouchedUp         -> handleVoiceWaveformTouchedUp(action)
    +            is MessageComposerAction.VoiceWaveformMovedTo           -> handleVoiceWaveformMovedTo(action)
    +        }.exhaustive
         }
     
         private fun handleOnVoiceRecordingUiStateChanged(action: MessageComposerAction.OnVoiceRecordingUiStateChanged) = setState {
    @@ -861,6 +863,18 @@ class MessageComposerViewModel @AssistedInject constructor(
             voiceMessageHelper.pauseRecording()
         }
     
    +    private fun handleVoiceWaveformTouchedUp(action: MessageComposerAction.VoiceWaveformTouchedUp) {
    +        val duration = (action.messageAudioContent.audioInfo?.duration ?: 0)
    +        val toMillisecond = (action.percentage * duration).toInt()
    +        voiceMessageHelper.movePlaybackTo(action.eventId, toMillisecond, duration)
    +    }
    +
    +    private fun handleVoiceWaveformMovedTo(action: MessageComposerAction.VoiceWaveformMovedTo) {
    +        val duration = (action.messageAudioContent.audioInfo?.duration ?: 0)
    +        val toMillisecond = (action.percentage * duration).toInt()
    +        voiceMessageHelper.movePlaybackTo(action.eventId, toMillisecond, duration)
    +    }
    +
         private fun handleEntersBackground(composerText: String) {
             val isVoiceRecording = com.airbnb.mvrx.withState(this) { it.isVoiceRecording }
             if (isVoiceRecording) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    index f9dfecd1f5..b6a8dc2cd5 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    @@ -174,6 +174,14 @@ class VoiceMessageHelper @Inject constructor(
             stopPlaybackTicker()
         }
     
    +    fun movePlaybackTo(id: String, toMillisecond: Int, totalDuration: Int) {
    +        val percentage = toMillisecond.toFloat() / totalDuration
    +        playbackTracker.updateCurrentPlaybackTime(id, toMillisecond, percentage)
    +
    +        stopPlayback()
    +        playbackTracker.pausePlayback(id)
    +    }
    +
         private fun startRecordingAmplitudes() {
             amplitudeTicker?.stop()
             amplitudeTicker = CountUpTimer(50).apply {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    index 2ac592797c..3965afdbaa 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    @@ -138,6 +138,8 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
             fun getPreviewUrlRetriever(): PreviewUrlRetriever
     
             fun onVoiceControlButtonClicked(eventId: String, messageAudioContent: MessageAudioContent)
    +        fun onVoiceWaveformTouchedUp(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float)
    +        fun onVoiceWaveformMovedTo(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float)
         }
     
         interface ReactionPillCallback {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    index da97cf6984..8b0b43009d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    @@ -357,11 +357,22 @@ class MessageItemFactory @Inject constructor(
                 }
             }
     
    +        val waveformTouchListener: MessageVoiceItem.WaveformTouchListener = object : MessageVoiceItem.WaveformTouchListener {
    +            override fun onWaveformTouchedUp(percentage: Float) {
    +                params.callback?.onVoiceWaveformTouchedUp(informationData.eventId, messageContent, percentage)
    +            }
    +
    +            override fun onWaveformMovedTo(percentage: Float) {
    +                params.callback?.onVoiceWaveformMovedTo(informationData.eventId, messageContent, percentage)
    +            }
    +        }
    +
             return MessageVoiceItem_()
                     .attributes(attributes)
                     .duration(messageContent.audioWaveformInfo?.duration ?: 0)
                     .waveform(messageContent.audioWaveformInfo?.waveform?.toFft().orEmpty())
                     .playbackControlButtonClickListener(playbackControlButtonClickListener)
    +                .waveformTouchListener(waveformTouchListener)
                     .voiceMessagePlaybackTracker(voiceMessagePlaybackTracker)
                     .izLocalFile(localFilesHelper.isLocalFile(fileUrl))
                     .izDownloaded(session.fileService().isFileInCache(
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    index 82400a431d..d1c134a743 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    @@ -19,6 +19,7 @@ package im.vector.app.features.home.room.detail.timeline.item
     import android.content.res.ColorStateList
     import android.graphics.Color
     import android.text.format.DateUtils
    +import android.view.MotionEvent
     import android.view.View
     import android.view.ViewGroup
     import android.widget.ImageButton
    @@ -38,6 +39,11 @@ import im.vector.app.features.voice.AudioWaveformView
     @EpoxyModelClass(layout = R.layout.item_timeline_event_base)
     abstract class MessageVoiceItem : AbsMessageItem() {
     
    +    interface WaveformTouchListener {
    +        fun onWaveformTouchedUp(percentage: Float)
    +        fun onWaveformMovedTo(percentage: Float)
    +    }
    +
         @EpoxyAttribute
         var mxcUrl: String = ""
     
    @@ -62,6 +68,9 @@ abstract class MessageVoiceItem : AbsMessageItem() {
         @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
         var playbackControlButtonClickListener: ClickListener? = null
     
    +    @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
    +    var waveformTouchListener: WaveformTouchListener? = null
    +
         @EpoxyAttribute
         lateinit var voiceMessagePlaybackTracker: VoiceMessagePlaybackTracker
     
    @@ -87,6 +96,20 @@ abstract class MessageVoiceItem : AbsMessageItem() {
                     holder.voicePlaybackWaveform.add(AudioWaveformView.FFT(amplitude.toFloat(), waveformColorIdle))
                 }
                 holder.voicePlaybackWaveform.summarize()
    +
    +            holder.voicePlaybackWaveform.setOnTouchListener { view, motionEvent ->
    +                when (motionEvent.action) {
    +                    MotionEvent.ACTION_UP   -> {
    +                        val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                        waveformTouchListener?.onWaveformTouchedUp(percentage)
    +                    }
    +                    MotionEvent.ACTION_MOVE -> {
    +                        val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                        waveformTouchListener?.onWaveformMovedTo(percentage)
    +                    }
    +                }
    +                true
    +            }
             }
     
             val backgroundTint = if (attributes.informationData.messageLayout is TimelineMessageLayout.Bubble) {
    @@ -111,6 +134,8 @@ abstract class MessageVoiceItem : AbsMessageItem() {
             }
         }
     
    +    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = motionEvent.x / view.width
    +
         private fun renderIdleState(holder: Holder, idleColor: Int, playedColor: Int) {
             holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play)
             holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message)
    
    From 3bd4a4ccd3ece851ac3de5c4c4e1e11a406efc33 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Thu, 3 Mar 2022 19:54:13 +0300
    Subject: [PATCH 029/126] Fix voice recorder start/pause states.
    
    ---
     .../home/room/detail/composer/VoiceMessageHelper.kt         | 6 ++++--
     .../detail/timeline/helper/VoiceMessagePlaybackTracker.kt   | 2 +-
     2 files changed, 5 insertions(+), 3 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    index b6a8dc2cd5..6bde4ada3d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    @@ -132,9 +132,11 @@ class VoiceMessageHelper @Inject constructor(
         }
     
         fun startOrPausePlayback(id: String, file: File) {
    -        stopPlayback()
    +        val playbackState = playbackTracker.getPlaybackState(id)
    +        mediaPlayer?.stop()
    +        stopPlaybackTicker()
             stopRecordingAmplitudes()
    -        if (playbackTracker.getPlaybackState(id) is VoiceMessagePlaybackTracker.Listener.State.Playing) {
    +        if (playbackState is VoiceMessagePlaybackTracker.Listener.State.Playing) {
                 playbackTracker.pausePlayback(id)
             } else {
                 startPlayback(id, file)
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
    index 076c05b9c4..8167ad94af 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt
    @@ -115,7 +115,7 @@ class VoiceMessagePlaybackTracker @Inject constructor() {
             }
         }
     
    -    fun getPercentage(id: String): Float {
    +    private fun getPercentage(id: String): Float {
             return when (val state = states[id]) {
                 is Listener.State.Playing -> state.percentage
                 is Listener.State.Paused  -> state.percentage
    
    From 5168d715ceb89ec62a31ea0504232952dd6c7c57 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 16:21:28 +0300
    Subject: [PATCH 030/126] Support scrolling playback on recorded audio before
     sending.
    
    ---
     .../home/room/detail/TimelineFragment.kt      | 20 ++++++++++++----
     .../detail/composer/MessageComposerAction.kt  |  4 ++--
     .../composer/MessageComposerViewModel.kt      |  8 ++-----
     .../detail/composer/VoiceMessageHelper.kt     |  6 ++---
     .../voice/VoiceMessageRecorderView.kt         | 17 +++++++++++++-
     .../composer/voice/VoiceMessageViews.kt       | 23 ++++++++++++++++---
     .../timeline/TimelineEventController.kt       |  4 ++--
     .../timeline/factory/MessageItemFactory.kt    |  6 +++--
     8 files changed, 65 insertions(+), 23 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    index d019cb1777..a0e8ddce3d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    @@ -786,6 +786,18 @@ class TimelineFragment @Inject constructor(
                     updateRecordingUiState(RecordingUiState.Draft)
                 }
     
    +            override fun onVoiceWaveformTouchedUp(percentage: Float, duration: Int) {
    +                messageComposerViewModel.handle(
    +                        MessageComposerAction.VoiceWaveformTouchedUp(VoiceMessagePlaybackTracker.RECORDING_ID, duration, percentage)
    +                )
    +            }
    +
    +            override fun onVoiceWaveformMoved(percentage: Float, duration: Int) {
    +                messageComposerViewModel.handle(
    +                        MessageComposerAction.VoiceWaveformTouchedUp(VoiceMessagePlaybackTracker.RECORDING_ID, duration, percentage)
    +                )
    +            }
    +
                 private fun updateRecordingUiState(state: RecordingUiState) {
                     messageComposerViewModel.handle(
                             MessageComposerAction.OnVoiceRecordingUiStateChanged(state))
    @@ -2051,12 +2063,12 @@ class TimelineFragment @Inject constructor(
             messageComposerViewModel.handle(MessageComposerAction.PlayOrPauseVoicePlayback(eventId, messageAudioContent))
         }
     
    -    override fun onVoiceWaveformTouchedUp(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float) {
    -        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformTouchedUp(eventId, messageAudioContent, percentage))
    +    override fun onVoiceWaveformTouchedUp(eventId: String, duration: Int, percentage: Float) {
    +        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformTouchedUp(eventId, duration, percentage))
         }
     
    -    override fun onVoiceWaveformMovedTo(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float) {
    -        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformMovedTo(eventId, messageAudioContent, percentage))
    +    override fun onVoiceWaveformMovedTo(eventId: String, duration: Int, percentage: Float) {
    +        messageComposerViewModel.handle(MessageComposerAction.VoiceWaveformMovedTo(eventId, duration, percentage))
         }
     
         private fun onShareActionClicked(action: EventSharedAction.Share) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    index daa5631d84..091e9f7869 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
    @@ -40,6 +40,6 @@ sealed class MessageComposerAction : VectorViewModelAction {
         data class PlayOrPauseVoicePlayback(val eventId: String, val messageAudioContent: MessageAudioContent) : MessageComposerAction()
         object PlayOrPauseRecordingPlayback : MessageComposerAction()
         data class EndAllVoiceActions(val deleteRecord: Boolean = true) : MessageComposerAction()
    -    data class VoiceWaveformTouchedUp(val eventId: String, val messageAudioContent: MessageAudioContent, val percentage: Float) : MessageComposerAction()
    -    data class VoiceWaveformMovedTo(val eventId: String, val messageAudioContent: MessageAudioContent, val percentage: Float) : MessageComposerAction()
    +    data class VoiceWaveformTouchedUp(val eventId: String, val duration: Int, val percentage: Float) : MessageComposerAction()
    +    data class VoiceWaveformMovedTo(val eventId: String, val duration: Int, val percentage: Float) : MessageComposerAction()
     }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index ccb51d3796..fba3b8b5d3 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -864,15 +864,11 @@ class MessageComposerViewModel @AssistedInject constructor(
         }
     
         private fun handleVoiceWaveformTouchedUp(action: MessageComposerAction.VoiceWaveformTouchedUp) {
    -        val duration = (action.messageAudioContent.audioInfo?.duration ?: 0)
    -        val toMillisecond = (action.percentage * duration).toInt()
    -        voiceMessageHelper.movePlaybackTo(action.eventId, toMillisecond, duration)
    +        voiceMessageHelper.movePlaybackTo(action.eventId, action.percentage, action.duration)
         }
     
         private fun handleVoiceWaveformMovedTo(action: MessageComposerAction.VoiceWaveformMovedTo) {
    -        val duration = (action.messageAudioContent.audioInfo?.duration ?: 0)
    -        val toMillisecond = (action.percentage * duration).toInt()
    -        voiceMessageHelper.movePlaybackTo(action.eventId, toMillisecond, duration)
    +        voiceMessageHelper.movePlaybackTo(action.eventId, action.percentage, action.duration)
         }
     
         private fun handleEntersBackground(composerText: String) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    index 6bde4ada3d..c5d8b7a5c1 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt
    @@ -171,13 +171,13 @@ class VoiceMessageHelper @Inject constructor(
         }
     
         fun stopPlayback() {
    -        playbackTracker.stopPlayback(VoiceMessagePlaybackTracker.RECORDING_ID)
    +        playbackTracker.pausePlayback(VoiceMessagePlaybackTracker.RECORDING_ID)
             mediaPlayer?.stop()
             stopPlaybackTicker()
         }
     
    -    fun movePlaybackTo(id: String, toMillisecond: Int, totalDuration: Int) {
    -        val percentage = toMillisecond.toFloat() / totalDuration
    +    fun movePlaybackTo(id: String, percentage: Float, totalDuration: Int) {
    +        val toMillisecond = (totalDuration * percentage).toInt()
             playbackTracker.updateCurrentPlaybackTime(id, toMillisecond, percentage)
     
             stopPlayback()
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    index 9a643796a9..87a2630f2a 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    @@ -53,6 +53,8 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
             fun onDeleteVoiceMessage()
             fun onRecordingLimitReached()
             fun onRecordingWaveformClicked()
    +        fun onVoiceWaveformTouchedUp(percentage: Float, duration: Int)
    +        fun onVoiceWaveformMoved(percentage: Float, duration: Int)
         }
     
         @Inject lateinit var clock: Clock
    @@ -65,6 +67,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
         private var recordingTicker: CountUpTimer? = null
         private var lastKnownState: RecordingUiState? = null
         private var dragState: DraggingState = DraggingState.Ignored
    +    private var recordingDuration: Long = 0
     
         init {
             inflate(this.context, R.layout.view_voice_message_recorder, this)
    @@ -95,7 +98,6 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
                 override fun onDeleteVoiceMessage() = callback.onDeleteVoiceMessage()
                 override fun onWaveformClicked() {
                     when (lastKnownState) {
    -                    RecordingUiState.Draft  -> callback.onVoicePlaybackButtonClicked()
                         is RecordingUiState.Recording,
                         is RecordingUiState.Locked -> callback.onRecordingWaveformClicked()
                     }
    @@ -105,6 +107,18 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
                 override fun onMicButtonDrag(nextDragStateCreator: (DraggingState) -> DraggingState) {
                     onDrag(dragState, newDragState = nextDragStateCreator(dragState))
                 }
    +
    +            override fun onVoiceWaveformTouchedUp(percentage: Float) {
    +                if (lastKnownState == RecordingUiState.Draft) {
    +                    callback.onVoiceWaveformTouchedUp(percentage, recordingDuration.toInt())
    +                }
    +            }
    +
    +            override fun onVoiceWaveformMoved(percentage: Float) {
    +                if (lastKnownState == RecordingUiState.Draft) {
    +                    callback.onVoiceWaveformMoved(percentage, recordingDuration.toInt())
    +                }
    +            }
             })
         }
     
    @@ -203,6 +217,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
         }
     
         private fun stopRecordingTicker() {
    +        recordingDuration = recordingTicker?.elapsedTime() ?: 0
             recordingTicker?.stop()
             recordingTicker = null
         }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    index 8adecaad6e..f3b1fc918d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    @@ -60,8 +60,21 @@ class VoiceMessageViews(
                 actions.onDeleteVoiceMessage()
             }
     
    -        views.voicePlaybackWaveform.setOnClickListener {
    -            actions.onWaveformClicked()
    +        views.voicePlaybackWaveform.setOnTouchListener { view, motionEvent ->
    +            when (motionEvent.action) {
    +                MotionEvent.ACTION_DOWN -> {
    +                    actions.onWaveformClicked()
    +                }
    +                MotionEvent.ACTION_UP   -> {
    +                    val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                    actions.onVoiceWaveformTouchedUp(percentage)
    +                }
    +                MotionEvent.ACTION_MOVE -> {
    +                    val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                    actions.onVoiceWaveformMoved(percentage)
    +                }
    +            }
    +            true
             }
     
             views.voicePlaybackControlButton.setOnClickListener {
    @@ -70,6 +83,8 @@ class VoiceMessageViews(
             observeMicButton(actions)
         }
     
    +    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = motionEvent.x / view.width
    +
         @SuppressLint("ClickableViewAccessibility")
         private fun observeMicButton(actions: Actions) {
             val draggableStateProcessor = DraggableStateProcessor(resources, dimensionConverter)
    @@ -332,7 +347,7 @@ class VoiceMessageViews(
     
         fun renderRecordingWaveform(amplitudeList: Array) {
             views.voicePlaybackWaveform.doOnLayout { waveFormView ->
    -            val waveformColor = ThemeUtils.getColor(waveFormView.context, R.attr.vctr_content_secondary)
    +            val waveformColor = ThemeUtils.getColor(waveFormView.context, R.attr.vctr_content_quaternary)
                 amplitudeList.iterator().forEach {
                     (waveFormView as AudioWaveformView).add(AudioWaveformView.FFT(it.toFloat(), waveformColor))
                 }
    @@ -355,5 +370,7 @@ class VoiceMessageViews(
             fun onDeleteVoiceMessage()
             fun onWaveformClicked()
             fun onVoicePlaybackButtonClicked()
    +        fun onVoiceWaveformTouchedUp(percentage: Float)
    +        fun onVoiceWaveformMoved(percentage: Float)
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    index 3965afdbaa..9c469dfead 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
    @@ -138,8 +138,8 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
             fun getPreviewUrlRetriever(): PreviewUrlRetriever
     
             fun onVoiceControlButtonClicked(eventId: String, messageAudioContent: MessageAudioContent)
    -        fun onVoiceWaveformTouchedUp(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float)
    -        fun onVoiceWaveformMovedTo(eventId: String, messageAudioContent: MessageAudioContent, percentage: Float)
    +        fun onVoiceWaveformTouchedUp(eventId: String, duration: Int, percentage: Float)
    +        fun onVoiceWaveformMovedTo(eventId: String, duration: Int, percentage: Float)
         }
     
         interface ReactionPillCallback {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    index 8b0b43009d..9116de92dd 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    @@ -359,11 +359,13 @@ class MessageItemFactory @Inject constructor(
     
             val waveformTouchListener: MessageVoiceItem.WaveformTouchListener = object : MessageVoiceItem.WaveformTouchListener {
                 override fun onWaveformTouchedUp(percentage: Float) {
    -                params.callback?.onVoiceWaveformTouchedUp(informationData.eventId, messageContent, percentage)
    +                val duration = messageContent.audioInfo?.duration ?: 0
    +                params.callback?.onVoiceWaveformTouchedUp(informationData.eventId, duration, percentage)
                 }
     
                 override fun onWaveformMovedTo(percentage: Float) {
    -                params.callback?.onVoiceWaveformMovedTo(informationData.eventId, messageContent, percentage)
    +                val duration = messageContent.audioInfo?.duration ?: 0
    +                params.callback?.onVoiceWaveformMovedTo(informationData.eventId, duration, percentage)
                 }
             }
     
    
    From aae75ce52fa1541b32f54ee96a3442b65a92844a Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 16:54:56 +0300
    Subject: [PATCH 031/126] Always stop all voice actions and media player if app
     enters to the background.
    
    ---
     .../home/room/detail/composer/MessageComposerViewModel.kt  | 7 +++++--
     1 file changed, 5 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index fba3b8b5d3..b71398c8a2 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -872,11 +872,14 @@ class MessageComposerViewModel @AssistedInject constructor(
         }
     
         private fun handleEntersBackground(composerText: String) {
    +        // Always stop all voice actions. It may be playing in timeline or active recording
    +        val playingAudioContent = voiceMessageHelper.stopAllVoiceActions(deleteRecord = false)
    +        voiceMessageHelper.clearTracker()
    +        
             val isVoiceRecording = com.airbnb.mvrx.withState(this) { it.isVoiceRecording }
             if (isVoiceRecording) {
    -            voiceMessageHelper.clearTracker()
                 viewModelScope.launch {
    -                voiceMessageHelper.stopAllVoiceActions(deleteRecord = false)?.toContentAttachmentData()?.let { voiceDraft ->
    +                playingAudioContent?.toContentAttachmentData()?.let { voiceDraft ->
                         val content = voiceDraft.toJsonString()
                         room.saveDraft(UserDraft.Voice(content))
                         setState { copy(sendMode = SendMode.Voice(content)) }
    
    From 601f10a6fb7e62f43e9d1ec8dbcf898bcbf50b78 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 17:16:09 +0300
    Subject: [PATCH 032/126] Support ltr and rtl flow of the recording waveform.
    
    ---
     .../java/im/vector/app/features/voice/AudioWaveformView.kt   | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    index 768635b2f7..7cdb1d51d5 100644
    --- a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    +++ b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    @@ -164,9 +164,10 @@ class AudioWaveformView @JvmOverloads constructor(
     
         private fun drawBars(canvas: Canvas) {
             var currentX = horizontalPadding
    -        visibleBarHeights.forEach {
    +        val flowableBarHeights = if (flow == Flow.LTR) visibleBarHeights else visibleBarHeights.reversed()
    +
    +        flowableBarHeights.forEach {
                 barPaint.color = it.color
    -            // TODO. Support flow
                 when (alignment) {
                     Alignment.BOTTOM -> {
                         val startY = height - verticalPadding
    
    From e09b123a9191e1d0aaea845657675ce05f982ca1 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 17:21:00 +0300
    Subject: [PATCH 033/126] Changelog added.
    
    ---
     changelog.d/5426.feature | 1 +
     1 file changed, 1 insertion(+)
     create mode 100644 changelog.d/5426.feature
    
    diff --git a/changelog.d/5426.feature b/changelog.d/5426.feature
    new file mode 100644
    index 0000000000..2dee22f07a
    --- /dev/null
    +++ b/changelog.d/5426.feature
    @@ -0,0 +1 @@
    +Allow scrolling position of Voice Message playback
    \ No newline at end of file
    
    From 4cb432e49704e2ccd5132fafcfad851754e40135 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Fri, 4 Mar 2022 17:47:34 +0300
    Subject: [PATCH 034/126] Do not allow to flow RTL after summarized, playback
     time always flows LTR.
    
    ---
     .../main/java/im/vector/app/features/voice/AudioWaveformView.kt  | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    index 7cdb1d51d5..32f30fe458 100644
    --- a/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    +++ b/vector/src/main/java/im/vector/app/features/voice/AudioWaveformView.kt
    @@ -129,6 +129,7 @@ class AudioWaveformView @JvmOverloads constructor(
         }
     
         private fun List.summarize(target: Int): List {
    +        flow = Flow.LTR
             val result = mutableListOf()
             if (size <= target) {
                 result.addAll(this)
    
    From 3156410965eb913de7606d276962ae0dc715faef Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Mon, 7 Mar 2022 15:52:19 +0300
    Subject: [PATCH 035/126] Code review fixes.
    
    ---
     .../src/main/res/values/stylable_audio_waveform_view.xml        | 0
     .../home/room/detail/composer/voice/VoiceMessageViews.kt        | 2 +-
     .../home/room/detail/timeline/factory/MessageItemFactory.kt     | 1 +
     .../features/home/room/detail/timeline/item/MessageVoiceItem.kt | 2 +-
     4 files changed, 3 insertions(+), 2 deletions(-)
     rename vector/src/main/res/values/audio_waveform_attr.xml => library/ui-styles/src/main/res/values/stylable_audio_waveform_view.xml (100%)
    
    diff --git a/vector/src/main/res/values/audio_waveform_attr.xml b/library/ui-styles/src/main/res/values/stylable_audio_waveform_view.xml
    similarity index 100%
    rename from vector/src/main/res/values/audio_waveform_attr.xml
    rename to library/ui-styles/src/main/res/values/stylable_audio_waveform_view.xml
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    index f3b1fc918d..7a76657923 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageViews.kt
    @@ -83,7 +83,7 @@ class VoiceMessageViews(
             observeMicButton(actions)
         }
     
    -    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = motionEvent.x / view.width
    +    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = (motionEvent.x / view.width).coerceIn(0f, 1f)
     
         @SuppressLint("ClickableViewAccessibility")
         private fun observeMicButton(actions: Actions) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    index 865e8f80bd..e8e8927b6d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
    @@ -709,6 +709,7 @@ class MessageItemFactory @Inject constructor(
             return this
                     ?.filterNotNull()
                     ?.map {
    +                    // Value comes from AudioWaveformView.MAX_FFT, and 1024 is the max value in the Matrix spec
                         it * AudioWaveformView.MAX_FFT / 1024
                     }
         }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    index d1c134a743..722e0f620a 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    @@ -134,7 +134,7 @@ abstract class MessageVoiceItem : AbsMessageItem() {
             }
         }
     
    -    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = motionEvent.x / view.width
    +    private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = (motionEvent.x / view.width).coerceIn(0f, 1f)
     
         private fun renderIdleState(holder: Holder, idleColor: Int, playedColor: Int) {
             holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play)
    
    From 6fef2f6d4e87f4deadd45f74387b39ef32312ecc Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Mon, 7 Mar 2022 21:48:16 +0300
    Subject: [PATCH 036/126] Lint fixes.
    
    ---
     .../home/room/detail/composer/MessageComposerViewModel.kt       | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index 36fbdf4788..0c89226f5a 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -877,7 +877,7 @@ class MessageComposerViewModel @AssistedInject constructor(
             // Always stop all voice actions. It may be playing in timeline or active recording
             val playingAudioContent = voiceMessageHelper.stopAllVoiceActions(deleteRecord = false)
             voiceMessageHelper.clearTracker()
    -        
    +
             val isVoiceRecording = com.airbnb.mvrx.withState(this) { it.isVoiceRecording }
             if (isVoiceRecording) {
                 viewModelScope.launch {
    
    From e758f440c7c8a8887ee8e2ec437337c3c16abb52 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Peter=20V=C3=A1gner?= 
    Date: Mon, 7 Mar 2022 22:18:49 +0000
    Subject: [PATCH 037/126] Translated using Weblate (Slovak)
    
    Currently translated at 99.2% (2140 of 2157 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 6ec0827757..3ea0dc14a8 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2439,4 +2439,10 @@
         %1$s a %2$s
         Pokračovať pomocou jednotného prihlásenia SSO
         jednotné prihlásenie SSO
    +    Zatvoriť výzvu zálohovanie kľúčov
    +    Výťazná odpoveď
    +    Nezaškrtnuté
    +    Zaškrtnuté
    +    Rozpísaná správa
    +    Otvoriť navigačnú ponuku
     
    \ No newline at end of file
    
    From a657bc6976e6da2f74de8437b0856d8f904e5784 Mon Sep 17 00:00:00 2001
    From: Zet 
    Date: Sat, 5 Mar 2022 14:53:44 +0000
    Subject: [PATCH 038/126] Translated using Weblate (Arabic)
    
    Currently translated at 30.5% (659 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ar/
    ---
     vector/src/main/res/values-ar/strings.xml | 44 +++++++----------------
     1 file changed, 13 insertions(+), 31 deletions(-)
    
    diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml
    index 0f1004ad7b..f0cc1fbceb 100644
    --- a/vector/src/main/res/values-ar/strings.xml
    +++ b/vector/src/main/res/values-ar/strings.xml
    @@ -38,7 +38,6 @@
         غُرفة فارِغة
         %1$s وَ %2$s
         دَعوة لغُرفة
    -
         دعوتك
         أنشأ ⁨%1$s⁩ الغرفة
         أنشأتَ الغرفة
    @@ -156,7 +155,7 @@
         المُزامنة الأولية:
     \nيستورد الغُرف
         المُزامنة الأولية:
    -\nيجري إستيرد التَعمية
    +\nيستورد التَعمية
         غُرفة فارِغة (كانت %s)
         
             %1$s، %2$s و%3$s
    @@ -192,7 +191,6 @@
         احذف
         غيّر الاسم
         أبلِغ عن المحتوى
    -
         اخرج
         مكالمة صوتية
         مكالمة صورية
    @@ -209,7 +207,6 @@
         متراسلو «ماترِكس» فقط
         لا نتائج
         الغرف
    -
         أرسِل السجلات
         أرسِل سجلات الانهيار
         أرسِل لقطة شاشة
    @@ -234,7 +231,6 @@
         أنسيت كلمة السر؟
         يجب إدخال عنوان البريد الإلكتروني المرتبط بحسابك.
         فشل تأكيد عنوان البريد: تحقق من نقر الرابط في البريد
    -
         أدخِل مسارا صالحا
         لم يحتوي JSON صالح
         أُرسلت الكثير من الطلبات
    @@ -261,7 +257,6 @@
         اخرج
         البصمة (⁨%s⁩):
         تعذّر التحقق من معرّف الخادوم البعيد.
    -
         لا نتائج
         صورة اللاحة
         اسم العرض
    @@ -325,7 +320,6 @@
         استخدم الكمرة الأصيلة
         اضبطه كعنوان رئيسي
         ألغِ ضبطه كعنوان رئيسي
    -
         السمة
         خطأ في فكّ التعمية
         اسم الجهاز
    @@ -335,7 +329,6 @@
         صدّر المفاتيح إلى ملف محلي
         أدخِل عبارة المرور
         أكّد عبارة المرور
    -
         استورد مفاتيح الطرفين لغرفة
         استورد مفاتيح الغرفة
         استورد المفاتيح من ملف محلي
    @@ -363,9 +356,7 @@
         بلاغ علة
         يبدو أنك تهزّ الهاتف وأنت مُحبط. أتريد إرسال بلاغ علة؟
         التقدم (%s٪)
    -
         يحمّل…
    -
         
             لا أعضاء
             عضو واحد
    @@ -384,7 +375,6 @@
             %d رسالة جديدة
             %d رسالة جديدة
         
    -
         أولوية منخفضة
         المجتمعات
         هزّ الجهاز بجنون يُرسل بلاغًا بعلة
    @@ -396,7 +386,6 @@
         أمتأكد من بدء محادثة صوتية؟
         أمتأكد من بدء محادثة صورية؟
         عنوان البريد مُعرّف بالفعل.
    -
         يريد خادوم المنزل هذا التأكد من أنك لست أحد الآليين
         JSON‏ معطوب
         
    @@ -407,19 +396,14 @@
             %d تغييرا على العضوية
             %d تغيير على العضوية
         
    -
         يحتاج Element تصريحا منك للوصول إلى المِكرفون لإجراء المكالمات الصوتية.
    -
         يحتاج Element تصريحا منك للوصول إلى الكمرة والمِكرفون لإجراء المكالمات الصورية.
     
     رجاءً اسمح بالوصول في المنبثقة التالية لتقدر على إرسال إجراء المكالمات الصورية.
    -
    -
         ادعُ
         انضم إلى الغرفة
         الأصلي
         لم يُجب الطرف البعيد.
    -
         الدردشات المباشرة
         أشِر إليه
         لن تستطيع العودة عن هذا التغيير إذ أنك تمنح المستخدم نفس مستوى السلطة الذي لك.
    @@ -482,7 +466,6 @@
         هُزّ الجهاز عند الإشارة إليّ
         التحاليل
         ‏⁨%1$s⁩ في ⁨%2$s⁩
    -
         تخويل
         والج كَ‍
         خادوم المنزل
    @@ -493,7 +476,6 @@
         الميل
         معطّل
         مزعج
    -
         لا ترسل من هذا الجهاز الرسائل المعمّاة إلى الأجهزة غير المؤكّدة
         عمِّ إلى الأجهزة المؤكّدة فقط
         <b>غير<b/> مؤكّدة
    @@ -504,7 +486,6 @@
         قد يعني هذا بأن أحدهم يعترض الاتصال بعدوانية، أو أن هاتفك لا يثق بالشهادة التي قدّمها الخادوم البعيد.
         إن قال مدير الخادوم بأن هذا متوقع، فتأكد من أن البصمة أدناه تطابق البصمة التي وفّرها.
         تغيّرت الشهادة من شهادة كنت تثق بها إلى شهادة لا تثق بها. لربما جدّد الخادوم شهادته. راسل إدارة الخادوم واسألهم عن البصمة المتوقعة.
    -
         أضِف اختصارا إلى الشاشة الرئيسية
         شاشة معلومات التطبيق في النظام
         دعوات المكالمات
    @@ -545,10 +526,6 @@
         رجاءً اكتب كلمة السر.
         رجاءً اكتب الوصف بالإنجليزية إن أمكن.
         تنبيهات النظام
    -
    -
    -
    -
         
             لا شيء محدّد
             واحدة محدّدة
    @@ -566,14 +543,11 @@
             %d رسالة إخطار غير مقروءة
             %d رسالة إخطار غير مقروءة
         
    -
         يمنع المستخدم حسب المعرّف المعطى
         يُلغي المنع عن المستخدم حسب المعرّف المعطى
         يُحدّد مستوى قدرة المستخدم
         يدعو المستخدم حسب المعرّف المعطى إلى الغرفة الحالية
         شغّل/عطّل مارك‌داون
    -
    -
         ألغِ تفعيل الحساب
         استُبدلت هذه الغرفة ولم تعد نشطة بعد الآن
         هذه الغرفة هي استمرار لمحادثة أخرى
    @@ -610,8 +584,8 @@
         طرد
         الإعدادات المتقدمة للإشعارات
         عند تسجيل الخروج الآن ستخسر مفاتيحك
    -    النسخ الاحتياطي المفاتيح ما زال جاريا. في حال خروجك الآن لن تتمكن لاحقا من قراءة الرسائل المشفرة.
    -    تأكد من تفعيل النسخ الاحتياطي للمفاتيح على كل أجهزتك كي لا تخسر رسائلك المشفرة
    +    النسخ الاحتياطي المفاتيح ما زال جاريا. في حال خروجك الآن لن تتمكن لاحقا من قراءة الرسائل المعماة.
    +    تأكد من تفعيل النسخ الاحتياطي للمفاتيح على كل أجهزتك كي لا تخسر رسائلك المعماة
         ينسخ احتياطيا المفاتيح…
         ليس لديك تصريح لبدء إجتماع
         ليس لديك تصريح لبدء إجتماع في هذه الغرفة
    @@ -622,10 +596,10 @@
         إفصل
         أبّطل
         لاشيء
    -    ستفقد الوصول إلى رسائلك المشفرة إلا إذا أخذت نسخة إحتياطية من مفاتيحك قبل تسجيلك للخروج.
    +    ستفقد الوصول إلى رسائلك المعماة إلا إذا أخذت نسخة إحتياطية من مفاتيحك قبل تسجيلك للخروج.
         نسخة إحتياطية
         هل أنت متأكد؟
    -    لا أريد رسائلي المشفرة
    +    لا أريد رسائلي المعماة
         نسخ إحتياطي للمفتاح
         إفتراضي النظام
         غير %1$s عنوان الغرفة الى %2$s.
    @@ -840,4 +814,12 @@
         يستورد المفاتيح…
         ينزّل المفاتيح…
         لا يسمح لك بالانضمام لهذه الغرفة
    +    فشلت مكالمة ${app_name}
    +    انسخ رابط النقاش
    +    اعرضه في الغرفة
    +    أقبل
    +    اعرض النقاشات
    +    فشلت إزالة الودجة
    +    فشلت إضافة الودجة
    +    يستمع للإشعارات
     
    \ No newline at end of file
    
    From 2e5bd0dda6d4fa594f612423630b7bf74d9ae102 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= 
    Date: Sun, 6 Mar 2022 10:20:03 +0000
    Subject: [PATCH 039/126] Translated using Weblate (Estonian)
    
    Currently translated at 99.9% (2155 of 2157 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 | 43 ++---------------------
     1 file changed, 2 insertions(+), 41 deletions(-)
    
    diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml
    index 21d4aac1ec..44025005d3 100644
    --- a/vector/src/main/res/values-et/strings.xml
    +++ b/vector/src/main/res/values-et/strings.xml
    @@ -38,7 +38,6 @@
         Telefoninumber
         Kutse jututuppa
         %1$s ja %2$s
    -
         Tühi jututuba
         Esmane laadimine:
     \nImpordin kontot…
    @@ -265,7 +264,6 @@
         Tunnista kehtetuks
         Katkesta ühendus
         Teata kahtlasest sisust
    -
         või
         Kutsu
         Võta vastu
    @@ -297,7 +295,6 @@
         Vaid need, kellel on Matrixi konto
         Tulemusi ei ole
         Jututoad
    -
         Kogukonnad
         Saada logikirjed
         Saada kokkujooksmise logikirjed
    @@ -323,7 +320,6 @@
         Edasta häält
         Kas oled kindel, et soovid algatada häälkõnet\?
         Kas oled kindel, et soovid algatada videokõnet\?
    -
         Saada faile
         Saada kleepse
         Tee foto või video
    @@ -339,11 +335,9 @@
         See ei tundu olema e-posti aadressi moodi
         Selline e-posti aadress on juba kasutusel.
         Kas unustasid oma salasõna\?
    -
         See koduserver soovib olla kindel, et sa ei ole robot
         Sinu kontoga seotud e-posti aadress peab olema sisestatud.
         E-posti aadressi verifitseerimine ei õnnestunud. Palun kontrolli, et sa avasid kirjas leidunud lingi
    -
         Palun loe läbi ja nõustu koduserveri kasutusjuhendiga:
         Palun sisesta korrektne URL
         See ei ole toimiv Matrix\'i serveri aadress
    @@ -394,10 +388,7 @@
         Videokõne on pooleli…
         Teine osapool ei võtnud kõnet vastu.
         Lisateave õiguste kohta
    -
    -
         Kõnede tegemiseks vajab ${app_name} õigusi kasutada sinu mikrofoni.
    -
         ${app_name} vajab videokõnedeks õigusi sinu kaamera ja mikrofoni kasutamiseks.
     \n
     \nKõnede tegemiseks palun anna järgmisel lehel vajalikud õigused.
    @@ -408,7 +399,6 @@
         Liitu
         Hülga
         Mine lugemata sõnumite juurde
    -
         Isiklikud sõnumid
         See võib tähendada, et keegi on suuteline pahatahtlikult sinu veebiliiklust pealtkuulama või sinu telefon ei usalda serveri kasutatavat sertifikaati.
         Kui serveri haldaja on sind teavitanud, et nii võib juhtuda, siis kontrolli, et sertifikaadi sõrmejälg vastab sellele, mille haldaja sulle on andnud.
    @@ -455,7 +445,6 @@
         Kui sa soovid oma PIN-koodi lähtestada, siis klõpsi nuppu „Unustasin PIN-koodi“.
         Määra põhiaadressiks
         Eemalda põhiaadressiks määramine
    -
         Teema
         Fontide suurus
         Pisike
    @@ -513,8 +502,6 @@
         Palun sisesta taastevõti
         Verifitseeritud!
         Selge lugu
    -
    -
         Verifitseerimispäring
         %s soovib verifitseerida sinu sessiooni
         Sinu jututoad kuvatakse siin. Olemasolevate jututubade leidmiseks või uute tegemiseks klõpsi all paremal nurgas asuvat + nuppu.
    @@ -578,8 +565,6 @@
         Kuna sina oled selle sessiooni verifitseerinud, siis see sessioon on krüptitud sõnumite saatmiseks usaldusväärne:
         See isikutuvastusserver kasutab vana API\'t. ${app_name} toetab aga vaid API versiooni 2.
         See tegevus ei ole võimalik. Koduserveri versioon on liiga vana.
    -
    -
         Kõik sõnumid
         Lisa avalehele
         Profiilipilt
    @@ -698,15 +683,10 @@
         Väldi juhuslikke kõnesid
         Enne kõne algatamist küsi kinnitust
         Osalejate loend
    -
         
             %d osaleja
             %d osalejat
         
    -
    -
    -
    -
         Lahku jututoast
         Kas oled kindel, et soovid lahkuda jututoast\?
         Kutsu
    @@ -715,7 +695,6 @@
         Taasta ligipääs
         Müksa välja
         Maini
    -
         Taastevõti on salvestatud.
         Varukoopia on juba olemas sinu koduserveris
         Asenda
    @@ -871,8 +850,6 @@
         Lisa Matrix\'i rakendusi
         Luba süsteemi poolt hallatud kaamera kasutamine
         Käivita kohandatud vaate asemel süsteemne kaamera vaade.
    -
    -
         Taustapiirangud on Elemendi jaoks keelatud. Seda testi tuleks läbi viia mobiilse andmeside abil (WIFI puudub).
     \n%1$s
         Elemendi jaoks on taustpiirangud lubatud.
    @@ -909,7 +886,6 @@
         Kui rakendus töötab taustal, siis sa ei saa saabunud sõnumite kohta teavitusi.
         Käivita teenus seadme käivitamisel
         Sünkroniseerimispäring aegus
    -
         Viivitus sünkroonimiste vahel
         Versioon
         olm-teegi versioon
    @@ -964,7 +940,6 @@
         Eemalda minu konto kasutusest
         Leia kasutajaid
         Halda kasutajate otsingu seadistusi.
    -
         Analüütika
         Saada arendajatele analüütikat
         Võimaldamaks meil rakendust parandada kogub ${app_name} anonüümset teavet rakenduse kasutuse kohta.
    @@ -973,7 +948,6 @@
         Uuenda avalikku nime
         Viimati nähtud
         %1$s @ %2$s
    -
         Autentimine
         Sisselogitud kui
         Koduserver
    @@ -1000,7 +974,6 @@
     \nPane tähele, et antud toiming taaskäivitab rakenduse ja see võib võtta veidi aega.
         Vali riik
         Eksporditavate võtmete krüptimiseks palun sisesta paroolifraas. Võtmete importimisel pead kasutama sama paroolifraasi.
    -
         Võtmete eksportimine õnnestus
         Krüptitud sõnumite taastamine
         Halda võtmete varundust
    @@ -1016,7 +989,6 @@
         Verifitseeri
         Kinnita seda võrreldes järgnevaid andmeid oma teise sessiooni kasutajaseadetes:
         Kui nad omavahel ei klapi, siis teie suhtluse turvalisus võib olla ohus.
    -
         Vali jututubade loend
         Serveri aadress
         Kõik jututoad %s serveris
    @@ -1025,7 +997,6 @@
             %d lugemata teavitatud sõnum
             %d lugemata teavitatud sõnumit
         
    -
         Jätkamaks pead nõustuma kasutustingimustega.
         Sa oled lisanud uue sessiooni \'%s\', mis soovib saada krüptimisvõtmeid.
         Uus sessioon soovib krüptovõtmeid.
    @@ -1066,8 +1037,6 @@
         Avaleht
         Jututoad
         Kutsutud
    -
    -
         %2$s müksas sind välja %1$s jututoast
         Tunnuspilt
         Selleks et jätkata koduserveri %1$s kasutamist sa pead üle vaatama ja nõustuma meie kasutustingimustega.
    @@ -1156,7 +1125,6 @@
         Kontrollin varukoopia olekut
         Kustuta varukoopia
         Kas kustutame krüptovõtmete varukoopia serverist\? Sellisel juhul sa ei saa kasutada ka taastevõtit krüptitud sõnumite ajaloo loetavaks muutmseks.
    -
         Turvaline varundus
         Hoia ära, et kaotad ligipääsu krüptitud sõnumitele ja andmetele
         Ära kunagi kaota krüptitud sõnumeid
    @@ -1173,7 +1141,6 @@
         Versioon
         Algoritm
         Allkiri
    -
         Teadmata viga
         Sa ei kasuta ühtegi isikutuvastusserverit
         Tundub, et sa üritad luua ühendust teise koduserveriga. Kas sa soovid välja logida\?
    @@ -1448,7 +1415,6 @@
         Trüki ta välja ja hoia turvalises kohas
         Salvesta ta mälupulgale või varunduskettale
         Kopeeri ta isiklikku andmehoidlasse mis asub pilves
    -
         Kui sa tühistad nüüd, siis sa võid peale viimasest seadmest välja logimist kaotada ligipääsu oma krüptitud sõnumitele ja andmetele.
     \n
     \nAga sa võid seadistustes võtta kasutusele turvalise varunduse ning hallata oma krüptovõtmeid.
    @@ -1527,7 +1493,6 @@
         Haldaja sai nüüd teate, et see sisu ei ole sobilik. 
     \n 
     \nKui sa ei soovi enam näha selle kasutaja sisu, siis sa võid tema sõnumite peitmiseks kasutajat eirata.
    -
         Eira kasutajat
         Kõik sõnumid (lärmakas)
         Kõik sõnumid
    @@ -1708,7 +1673,6 @@
         Halda on Matrix\'i kontoga seotud e-posti aadresse ja telefoninumbreid
         Kood
         Palun kasuta rahvusvahelist vormingut (telefoninumbri alguses peaks olema „+“)
    -
         Kinnita oma isikusamasust verifitseerides seda sisselogimissessiooni. Sellega tagad ligipääsu krüptitud sõnumitele.
         Ei ole võimalik avada sellise jututoa vaadet, kus sulle on seatud suhtluskeeld.
         Ei leia sellist jututuba. Palun kontrolli, et ta ikka olemas on.
    @@ -1791,7 +1755,6 @@
         Otsevestlus
         Lisa kaasa võtmevahetusega seotud päringute ajalugu
         Rohkem otsingutulemusi pole
    -
         🔐️ Liitu minuga vestlusrakenduses ${app_name}
         Hei, palun suhtle minuga vestlusrakenduses ${app_name}: %s
         Kutsu sõpru
    @@ -1914,8 +1877,6 @@
         Suuna
         Ühenda
         Pea esmalt nõu
    -
    -
         Kõne on pooleli (%1$s)
         Telefoninumbri otsimisel tekkis viga
         Numbriklahvistik
    @@ -2112,7 +2073,6 @@
         Sisesta serveri nimi, mille sisu sa soovid uurida.
         Lisa uus server
         Sinu server
    -
         Vabandust, liitumisel tekkis viga: %s
         Kogukonnakeskuse aadressid
         Selle kogukonnakeskuse hallatud ja nähtavad aadressid.
    @@ -2315,7 +2275,6 @@
         Küsitluse küsimus või teema
         Koosta üks küsitlus
         Küsitlus
    -
         Saada e-posti aadressid ja telefoninumbrid %s serverisse
         Sinu kontaktid on vaid sinu teada. Kui tahad nende hulgast leida Matrix\'i kasutajaid, siis me vajame sinu luba nende andmete saatmiseks räsitud kujul isikutuvastusserverisse.
         Selleks et leida tuttavaid, sa peaksid saatma oma kontaktteavet (telefoninumbreid ja/või e-posti aadresse) siin rakenduses seadistatud isikutuvastusserverile. Parema andmeturvalisuse nimel me ei saada teavet mitte loetava tekstina, vaid räsina.
    @@ -2458,4 +2417,6 @@
             %d serveri kasutusõiguste muudatus
             %d serveri kasutusõiguste muudatust
         
    +    %1$s, %2$s ning teised kasutajad
    +    %1$s ja %2$s
     
    \ No newline at end of file
    
    From cf6a71702302ce4bf939e0999c4bcd02e3791aa6 Mon Sep 17 00:00:00 2001
    From: Tuomas Hietala 
    Date: Fri, 4 Mar 2022 23:28:50 +0000
    Subject: [PATCH 040/126] Translated using Weblate (Finnish)
    
    Currently translated at 80.2% (1730 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fi/
    ---
     vector/src/main/res/values-fi/strings.xml | 105 ++++++++++++++--------
     1 file changed, 67 insertions(+), 38 deletions(-)
    
    diff --git a/vector/src/main/res/values-fi/strings.xml b/vector/src/main/res/values-fi/strings.xml
    index 931075ce8d..7e22ce42a8 100644
    --- a/vector/src/main/res/values-fi/strings.xml
    +++ b/vector/src/main/res/values-fi/strings.xml
    @@ -39,7 +39,6 @@
         Huonekutsu
         %1$s ja %2$s
         Tyhjä huone
    -
         Alkusynkronointi:
     \nTuodaan tiliä…
         Alkusynkronointi:
    @@ -190,7 +189,6 @@
         Poista
         Nimeä uudelleen
         Ilmoita epäilyttävästä sisällöstä
    -
         tai
         Kutsu
         Kirjaudu ulos
    @@ -213,7 +211,6 @@
         Ainoastaan Matrix-yhteyshenkilöt
         Ei tuloksia
         Huoneet
    -
         Lähetä lokit
         Lähetä kaatumislokit
         Lähetä näytönkaappauskuva
    @@ -259,13 +256,10 @@
         Puhelu käynnissä…
         Toinen puoli ei vastannut.
         Huomio
    -
         ${app_name} tarvitsee käyttöluvan mikrofoniin suorittakseen puheluita.
    -
         ${app_name} tarvitsee käyttöluvan kameraan ja mikrofoniin suorittakseen videopuheluita.
     \n
     \nSalli mikrofonin ja kameran käyttö seuraavilla näytöillä aloittaaksesi tämän puhelun.
    -
         KYLLÄ
         EI
         Jatka
    @@ -273,7 +267,6 @@
         Liity
         Hylkää
         Siirry ensimmäiseen lukemattomaan viestiin.
    -
         Poistu huoneesta
         Haluatko varmasti poistua huoneesta?
         YKSITYISKESKUSTELUT
    @@ -299,7 +292,6 @@
         Sertifikaatti johon laitteesi luotti aikaisemmin on vaihtunut. Tämä on HYVIN EPÄTAVALLISTA. On suositeltavaa, että ET hyväksy tätä uutta sertifikaattia.
         Sertifikaatti on vaihtunut ennestään luotetusta ei-luotettuun. Palvelin on voinut uusia sertifikaattinsa. Kysy palvelimen ylläpitäjältä, mikä sormenjäljen pitäisi olla.
         Hyväksy sertifikaatti vain, jos palvelimen ylläpitäjä on julkaissut sormenjäljen, joka täsmää yllä olevan kanssa.
    -
         Etsi
         Etsi huoneen jäsenistä
         Ei tuloksia
    @@ -344,7 +336,6 @@
         Päivitä julkinen nimi
         Viimeksi käytetty
         %1$s @ %2$s
    -
         Tunnistautuminen
         Kirjautuneena nimellä
         Kotipalvelin
    @@ -375,7 +366,6 @@
         Nämä ovat kokeellisia ominaisuuksia, jotka voivat mennä rikki. Käytä varoen.
         Aseta pääosoitteeksi
         Poista pääosoite
    -
         Salauksenpurkuvirhe
         Julkinen nimi
         Istunnon tunnus
    @@ -386,7 +376,6 @@
         Vie
         Anna salasana
         Vahvista salasana
    -
         Tuo salatun huoneen avaimet
         Tuo huoneen avaimet
         Tuo avaimet paikallisesta tiedostosta
    @@ -527,15 +516,10 @@
         Saapuvien puheluiden soittoääni
         Videopuhelu menossa…
         Käyttäjälista
    -
         
             yksi jäsen
             %d jäsentä
         
    -
    -
    -
    -
         Poista huoneesta
         
             yksi uusi viesti
    @@ -545,8 +529,6 @@
             yksi valittu
             %d valittu
         
    -
    -
         Edistyneet ilmoitusasetukset
         Ilmoituksen tärkeys tapahtumakohtaisesti
         Ratkaise ilmoituksien ongelmia
    @@ -621,7 +603,6 @@
         Paina lukukuittauksesta nähdäksesi tarkemman listan.
         Ei vaikuta kutsuihin, poistamisiin ja porttikieltoihin.
         Sisältää hahmokuvat ja näyttönimien vaihdot.
    -
         ${app_name} kerää anonyymiä analytiikkaa sovelluksen parantamiseksi.
         Luo salalause salataksesi viedyt avaimet. Tarvitset saman salalauseen avainten tuomiseen.
         Salattujen viestien palautus
    @@ -630,7 +611,6 @@
             yksi lukematon ilmoitettu viesti
             %d lukematonta ilmoitettua viestiä
         
    -
         
             yksi huone
             %d huonetta
    @@ -656,8 +636,6 @@
         Markdown päällä/pois
         Matrix-sovellusten hallinnan korjaamiseen
         Hiljainen
    -
    -
         Hahmokuva
         Jatkaaksesi kotipalvelimen %1$s käyttöä, sinun täytyy hyväksyä palvelun käyttöehdot.
         Näytä ehdot
    @@ -715,7 +693,6 @@
         Tallenna palautusavain
         Jaa
         Tallenna tiedostona
    -
         Teethän kopion
         Jaa palautusavain kohteelle…
         Luodaan palautusavainta käyttäen salalausetta. Tässä saattaa kestää useampi sekunti.
    @@ -782,8 +759,6 @@
         Näppäimistön enter-näppäin lähettää viestin sen sijaan, että se lisäisi rivinvaihdon
         Salasana ei ole kelvollinen
         %1$s -> %2$s
    -
    -
         Media
         Oletuksena oleva pakkauksen määrä
         Valitse
    @@ -887,8 +862,6 @@
         Näytä muokkaushistoria
         Avaimen jakopyyntö
         Vahvistettu!
    -
    -
         Vahvistuspyyntö
         %s haluaa vahvistaa laitteesi
         Viesti-ilmoitusten säännöt
    @@ -898,7 +871,6 @@
         Taustasynkronointitila
         Ei taustasynkronointia
         Et saa ilmoituksia saapuvista viesteistä, kun sovellus on taustalla.
    -
         Jatkaaksesi sinun täytyy hyväksyä palvelun käyttöehdot.
         Et käytä mitään identiteettipalvelinta
         Näyttää, että yrität yhdistää toiseen kotipalvelimeen. Haluatko kirjautua ulos\?
    @@ -942,7 +914,6 @@
         Se on roskapostia
         Se on sopimaton
         Ei mitään
    -
         Optimoitu akunkestoa varten
         ${app_name} synkronoi taustalla laitteen rajallisia resursseja (akkua) säästäen.
     \nLaitteesi resurssien tilasta riippuen käyttöjärjestelmä saattaa lykätä synkronointia.
    @@ -1025,7 +996,6 @@
         Tämä sisältö on ilmiannettu epäsopivana. 
     \n 
     \nJos et halua nähdä enempää sisältöä tältä käyttäjältä, voit estää hänet piilottaaksesi hänen viestit.
    -
         Tämä ei ole kelvollinen Matrix-palvelimen osoite
         Jätä käyttäjä huomiotta
         Kaikki viestit (äänekäs)
    @@ -1222,7 +1192,6 @@
         Varmenna %s
         Varmennettu %s
         Odotetaan käyttäjää %s…
    -
         Huoneessa olevat viesti eivät ole salattu osapuolten välisellä salauksella.
         Huoneen viestit ovat salattu osapuolten välisellä salauksella.
     \n
    @@ -1674,8 +1643,6 @@
             Aktiivinen puhelu ·
             %1$d aktiivista puhelua ·
         
    -
    -
         Aktiivinen puhelu (%1$s)
         Numeronäppäimistö
         Ei vastausta
    @@ -1926,14 +1893,14 @@
         Puuttuvat oikeudet
         Avaruudet
         
    -        Vähintään %1$s valinta vaaditaan
    -        Vähintään %1$s valintaa vaaditaan
    +        Vähintään yksi vaihtoehto vaaditaan
    +        Vähintään %1$s vaihtoehtoa vaaditaan
         
         Kysymys ei voi olla tyhjä
         LUO KYSELY
    -    LISÄÄ VALINTA
    -    Valinta %1$d
    -    Luo valinnat
    +    LISÄÄ VAIHTOEHTO
    +    Vaihtoehto %1$d
    +    Luo vaihtoehdot
         Kysymys tai aihe
         Kyselyn kysymys tai aihe
         Luo kysely
    @@ -1954,4 +1921,66 @@
         Lähetä m.room.server_acl-tapahtumia
         Valitse kotipalvelin
         Ei nyt
    +    Palauta salaus
    +    lähettää lumisadetta ❄️
    +    lähettää konfettia 🎉
    +    🔐️ Liity seuraani ${app_name}-sovelluksessa
    +    Hei, juttele minulle ${app_name}-sovelluksessa: %s
    +    Kotipalvelimesi (%1$s) ehdottaa, että käytät palvelinta %2$s identiteettipalvelimenasi
    +    Odotetaan salaushistoriaa
    +    Sinulla ei ole pääsyä tähän viestiin, koska lähettäjä jätti avaimet tarkoituksella lähettämättä
    +    Sinulla ei ole pääsyä tähän viestiin, koska lähettäjä ei luota istuntoosi
    +    Sinulla ei ole pääsyä tähän viestiin, koska lähettäjä esti sinut
    +    Ei saatavilla
    +    Tapahtuma lähetetty!
    +    Odotetaan tätä viestiä, tässä voi kestää jonkin aikaa
    +    Sinulla ei ole pääsyä tähän viestiin
    +    %1$s antoi porttikiellon
    +    Äänestäjät näkevät tulokset heti äänestettyään
    +    
    +        Lopullinen tulos yhden äänen perusteella
    +        Lopullinen tulos %1$d äänen perusteella
    +    
    +    
    +        Yksi ääni annettu. Äänestä nähdäksesi tulokset
    +        %1$d ääntä annettu. Äänestä nähdäksesi tulokset
    +    
    +    Ääniä ei annettu
    +    
    +        Perustuen yhteen ääneen
    +        Perustuen %1$d ääneen
    +    
    +    
    +        yksi ääni
    +        %1$d ääntä
    +    
    +    Ääni annettu
    +    Kartta
    +    Jaa sijainti
    +    Sijainti
    +    Jaa sijainti
    +    Suljettu kysely
    +    Avoin kysely
    +    Kyselyn tyyppi
    +    Muokkaa kyselyä
    +    Poista kysely
    +    Lähetä tarra
    +    Lähetä kuvia ja videoita
    +    Avaa kamera
    +    Näytä viestikuplat
    +    Kartan lataaminen epäonnistui
    +    Jaa sijainti
    +    Luo kysely
    +    Jaa sijainti
    +    Näytä vähemmän
    +    Läpisalattu, puhelinnumeroa ei vaadita. Ei mainoksia tai tiedonlouhintaa.
    +    Valitse missä keskustelujasi säilytetään – sinä päätät ja olet riippumaton. Yhdistäjänä Matrix.
    +    Sinä päätät.
    +    Turvallista ja riippumatonta viestintää, joka on yhtä yksityistä kuin keskustelisit kasvokkain kotonasi.
    +    Viestintää tiimillesi.
    +    Turvallista viestintää.
    +    Pidä keskustelusi hallussasi.
    +    Yhdistä palvelimeen
    +    Minulla on jo tili
    +    Luo tili
     
    \ No newline at end of file
    
    From 9e828822a7d72cf15cf976e4f9d8a5866668b7ad Mon Sep 17 00:00:00 2001
    From: Glandos 
    Date: Sun, 6 Mar 2022 21:45:13 +0000
    Subject: [PATCH 041/126] Translated using Weblate (French)
    
    Currently translated at 99.9% (2156 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
    ---
     vector/src/main/res/values-fr/strings.xml | 86 ++++++++++++-----------
     1 file changed, 44 insertions(+), 42 deletions(-)
    
    diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml
    index f56efb4ec3..6bae118e59 100644
    --- a/vector/src/main/res/values-fr/strings.xml
    +++ b/vector/src/main/res/values-fr/strings.xml
    @@ -39,7 +39,6 @@
         Invitation au salon
         Salon vide
         %1$s et %2$s
    -
         Synchronisation initiale :
     \nImportation du compte…
         Synchronisation initiale :
    @@ -217,7 +216,6 @@
         Supprimer
         Renommer
         Signaler le contenu
    -
         ou
         Inviter
         Se déconnecter
    @@ -368,7 +366,6 @@
         Nom du serveur d’accueil
         Tous les salons sur le serveur %s
         Tous les salons natifs sur %s
    -
         Veuillez décrire l’erreur. Qu’avez-vous fait \? Quel était le comportement attendu \? Que s’est-il réellement passé \?
         Afin de diagnostiquer les problèmes, les journaux de ce client seront envoyés avec ce rapport d’erreur. Ce rapport d’erreur, y compris les journaux et la capture d’écran, ne seront pas visibles publiquement. Si vous préférez envoyer le texte ci-dessus uniquement, veuillez décocher :
         Vous semblez secouer le téléphone avec agacement. Souhaitez-vous ouvrir soumettre un rapport d’anomalie \?
    @@ -377,26 +374,19 @@
         L’envoi du rapport d’anomalie a échoué (%s)
         Ceci ne ressemble pas à une adresse e-mail valide
         Cette adresse e-mail est déjà utilisée.
    -
         Ce serveur d’accueil souhaite s’assurer que vous n’êtes pas un robot
         L’adresse e-mail liée à votre compte doit être saisie.
         Impossible de vérifier l’adresse e-mail : assurez-vous d’avoir cliqué sur le lien dans l’e-mail
    -
         Trop de requêtes ont été envoyées
         Quitter
         Citer
         Le correspondant n’a pas décroché.
         Information
    -
    -
         ${app_name} a besoin d’accéder à votre microphone pour passer des appels audio.
    -
         ${app_name} a besoin d’accéder à votre appareil photo et à votre microphone pour passer des appels vidéo.
     \n
     \nVeuillez autoriser l’accès dans les prochaines fenêtres pour pouvoir effectuer l’appel.
    -
         Aller au premier message non lu
    -
         Voulez-vous vraiment quitter le salon \?
         Ignorer
         Afficher tous les messages de cet utilisateur
    @@ -413,11 +403,9 @@
         Le certificat n’est plus celui qui a été approuvé par votre téléphone. Ce comportement est INATTENDU. Il est recommandé de ne PAS ACCEPTER ce nouveau certificat.
         Le certificat n’est plus celui qui a été approuvé par votre téléphone. Le serveur a peut-être renouvelé son certificat. Contactez l’administrateur du serveur pour lui demander l’empreinte de son certificat.
         Acceptez le certificat uniquement si l’administrateur du serveur a publié une empreinte correspondant à celle ci-dessus.
    -
         Quand je suis invité sur un salon
         Paramètres utilisateur
         %1$s @ %2$s
    -
         Vérifiez votre e-mail et cliquez sur le lien qu’il contient. Une fois cela fait, cliquez sur continuer.
         Afficher tous les messages de %s \?
     \n
    @@ -426,14 +414,11 @@
         Uniquement les membres (à partir de l’activation de cette option)
         Uniquement les membres (depuis leur invitation)
         Ce sont des fonctionnalités expérimentales qui peuvent se comporter de façon inattendue. À utiliser avec précaution.
    -
         Exporter les clés vers un fichier local
    -
         Importer les clés à partir d’un fichier local
         Ne jamais envoyer de messages chiffrés aux sessions non vérifiées depuis cette session.
         Confirmez en comparant les informations suivantes avec les paramètres utilisateur dans votre autre session :
         Si elles ne correspondent pas, la sécurité de votre communication est peut-être compromise.
    -
         Interface utilisateur
         Langue
         Choisissez une langue
    @@ -508,7 +493,6 @@
         Motif : %1$s
         Badge
         Secouer avec agacement pour signaler une anomalie
    -
         
             %d membre
             %d membres
    @@ -518,13 +502,10 @@
             %d nouveaux messages
         
         Liste les membres
    -
    -
         
             %d message notifié non lu
             %d messages notifiés non lus
         
    -
         
             %d salon
             %d salons
    @@ -584,16 +565,10 @@
         La conversation continue ici
         Ce salon est la suite d’une autre conversation
         Cliquer ici pour voir les anciens messages
    -
    -
    -
    -
         
             %d sélectionné
             %d sélectionnés
         
    -
    -
         Alertes système
         contacter l’administrateur de votre service
         Ce serveur d’accueil a dépassé une de ses limites de ressources donc certains utilisateurs ne pourront pas se connecter.
    @@ -685,7 +660,6 @@
         ${app_name} n’est pas affecté par l’optimisation de la batterie.
         Si un utilisateur laisse un appareil débranché et immobile pour une longue durée, avec l’écran éteint, l’appareil entre en mode veille.. Cela empêche les applications d’accéder au réseau et reporte leurs tâches, synchronisations et alarmes standard.
         Ignorer l’optimisation
    -
         Aucun APK des services Google Play valide n’a été trouvé. Les notifications peuvent ne pas fonctionner correctement.
         Appel vidéo en cours…
         Sauvegarde de clé
    @@ -722,7 +696,6 @@
         Terminé
         Sauvegarder la clé de récupération
         Enregistrer dans un fichier
    -
         Veuillez en faire une copie
         Partager la clé de récupération avec…
         Génération de la clé de récupération utilisant la phrase secrète. Cette opération peut prendre plusieurs secondes.
    @@ -808,7 +781,6 @@
         Algorithme
         Signature
         Pour utiliser la sauvegarde de clés sur cette session, faites une restauration avec votre phrase secrète ou votre clé de récupération.
    -
         Traitement de la clé de récupération…
         Téléchargement des clés…
         Importation des clés…
    @@ -817,7 +789,6 @@
         Envoyer le message avec Entrée
         Le bouton Entrée sur le clavier logiciel enverra le message au lieu d’aller à la ligne
         Le mot de passe n’est pas valide
    -
         Média
         Compression par défaut
         Choisir
    @@ -854,8 +825,6 @@
         Ignorer
         Vérifié !
         Compris
    -
    -
         Demande de vérification
         %s veut vérifier votre session
         Erreur inconnue
    @@ -952,7 +921,6 @@
         Aucun
         Révoquer
         Déconnecter
    -
         Impossible de joindre le serveur d’accueil à cette URL, veuillez la vérifier
         Mode de synchronisation en arrière-plan
         Optimisé pour préserver la batterie
    @@ -963,7 +931,6 @@
     \nCela aura un impact sur l’utilisation des données mobiles et de la batterie, une notification permanente sera affichée indiquant que ${app_name} est à l’écoute des évènements.
         Aucune synchronisation en arrière-plan
         Vous ne serez pas notifié des messages entrants quand l’application est en arrière-plan.
    -
         Découverte
         Gérer vos paramètres de découverte.
         Vous n’utilisez aucun serveur d’identité
    @@ -1033,7 +1000,6 @@
         Ce contenu a été signalé comme inapproprié.
     \n
     \nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l’ignorer pour masquer ses messages.
    -
         Intégrations
         Utilisez un gestionnaire d’intégrations pour gérer les robots, les passerelles, les widgets et les jeux d’autocollants.
     \nLes gestionnaires d’intégrations reçoivent des données de configuration et peuvent modifier des widgets, envoyer des invitations de salon et définir des rangs à votre place.
    @@ -1249,7 +1215,6 @@
         Vérifier %s
         %s a été vérifié
         Nous attendons %s…
    -
         Les messages dans ce salon ne sont pas chiffrés de bout en bout.
         Les messages dans ce salon sont chiffrés de bout en bout.
     \n
    @@ -1395,7 +1360,6 @@
         Imprimez-le et conservez-le en lieu sûr
         Sauvegardez-le sur une clé USB ou un disque de sauvegarde
         Copiez-le sur votre stockage dans le cloud personnel
    -
         Chiffrement activé
         Les messages de ce salon sont chiffrés de bout en bout. Apprenez-en plus et vérifiez les utilisateurs sur leur profil.
         Chiffrement désactivé
    @@ -1779,7 +1743,6 @@
         Veuillez fournir une adresse de salon
         Cette adresse est déjà utilisée
         %1$d de %2$d
    -
         Autoriser
         Révoquer mon autorisation
         Vous avez donné votre autorisation pour envoyer des e-mails et des numéros de téléphone à ce serveur d’identité pour découvrir d\'autres utilisateurs à partir de vos contacts.
    @@ -1858,8 +1821,6 @@
         Transférer
         Rejoindre
         Consulter d’abord
    -
    -
         Appel en cours (%1$s)
         Il y a eu une erreur lors de la recherche du numéro de téléphone
         Pavé de numérotation
    @@ -2060,7 +2021,7 @@
         Moi et mon équipe
         Un espace privé pour organiser vos salons
         Seulement moi
    -    Assurez-vous que les accès à %s sont accordés aux bonnes personnes. Vous pourrez changer ceci plus tard.
    +    Assurez-vous que les bonnes personnes ont accès à %s.
         Avec qui travaillez-vous \?
         Pour rejoindre un espace existant, il vous faut une invitation.
         Le fichier est trop volumineux pour être envoyé.
    @@ -2112,7 +2073,6 @@
         Ajouter un nouveau serveur
         Votre serveur
         Consultation de %1$s
    -
         Désolé, une erreur est survenue en essayant de rejoindre %s
         Adresse de l’espace
         Afficher et gérer les adresses de cet espace.
    @@ -2313,7 +2273,6 @@
         Question ou sujet du sondage
         Créer un sondage
         Sondage
    -
         Envoyer des courriels et des numéros de téléphone à %s
         Vos contacts sont personnels et privés. Pour découvrir des utilisateurs à partir de vos contacts, nous avons besoin de votre permission pour envoyer les informations des contacts à votre serveur d’identité.
         La session a été déconnectée !
    @@ -2413,4 +2372,47 @@
         Communication indépendante et sécurisée qui vous donne le même niveau d\'intimité qu\'une discussion face-à-face dans votre maison.
         Localisation
         Le chiffrement a été mal configuré ce qui vous empêche d\'envoyer des messages. Cliquez pour ouvrir les paramètres.
    +    Notification du salon
    +    Utilisateurs
    +    Notifier tout le salon
    +    
    +        %1$d de plus
    +        %1$d de plus
    +    
    +    Réduire
    +    Afficher les messages en bulles
    +    Impossible de charger la carte
    +    Carte
    +    Note : l’application sera redémarrée
    +    Activer les messages en fils de discussion
    +    Se connecter au serveur
    +    Vous cherchez à joindre un serveur existant \?
    +    passer cette question
    +    Pas encore sûr \? Vous pouvez %s
    +    Communautés
    +    Équipes
    +    Famille et amis
    +    Nous allons vous aider à vous connecter.
    +    À qui allez-vous le plus parler \?
    +    Vous êtes déjà en train de voir ce fil de discussion !
    +    Voir dans le salon
    +    Répondre dans le fil de discussion
    +    La commande « %s » est connue mais non supportée dans les fils de discussion.
    +    Depuis un fil de discussion
    +    Indice : Appui long sur un message puis « %s ».
    +    Les fils de discussion vous permettent de centrer vos conversations sur un sujet, et de les suivre facilement.
    +    Gardez vos conversations organisées avec les fils de discussion
    +    Affiche tous les fils de discussion auxquels vous avez participé
    +    Mes fils de discussion
    +    Affiche tous les fils de discussion du salon actuel
    +    Tous les fils de discussion
    +    Filtrer
    +    Fils de discussion
    +    Fil de discussion
    +    Filtrer les fils de discussion du salon
    +    %1$s, %2$s et d’autres
    +    %1$s et %2$s
    +    Copier le lien du fil de discussion
    +    Voir dans le salon
    +    Voir les fils de discussions
     
    \ No newline at end of file
    
    From 8b7606bd203ec1aa988ca862bf71f1aa92260faf Mon Sep 17 00:00:00 2001
    From: notramo 
    Date: Mon, 7 Mar 2022 20:27:43 +0000
    Subject: [PATCH 042/126] Translated using Weblate (Hungarian)
    
    Currently translated at 99.8% (2154 of 2157 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 | 28 +++++++++++------------
     1 file changed, 14 insertions(+), 14 deletions(-)
    
    diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml
    index 000da846b8..f189a4198f 100644
    --- a/vector/src/main/res/values-hu/strings.xml
    +++ b/vector/src/main/res/values-hu/strings.xml
    @@ -1562,7 +1562,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
         Szoba beállításainak módosítása sikeres
         Nem érheted el ezt az üzenetet
         Várakozás erre az üzenetre, ez eltarthat egy darabig
    -    A végpontok közötti titkosítás miatt lehet hogy várnod kell, hogy valaki üzenet megérkezzen, mert a titkosítási kulcsok nem lettek megfelelően elküldve neked.
    +    A végpontok közötti titkosítás miatt lehet hogy várnod kell, hogy valaki üzenetét el tudd olvasni, mert a titkosítási kulcsok nem lettek megfelelően elküldve neked.
         Nem érheted el ezt az üzenetet, mert a küldő letiltott
         Nem érheted el ezt az üzenetet, mert a feladó nem bízik a munkamenetedben
         Nem érheted el ezt az üzenetet, mert a feladó szándékosan nem küldte el a kulcsokat
    @@ -1829,7 +1829,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
         Én és a csoporttársaim
         Privát tér a szobáid csoportosításához
         Csak én
    -    Ellenőrizd, hogy a megfelelő személyeknek van hozzáférése ide: %s.
    +    Ellenőrizd, hogy a megfelelő személyeknek van hozzáférésük ehhez: %s.
         Csak az olvasatlan üzenetek számát mutassa az egyszerű értesítésekben.
         Kivel dolgozol együtt\?
         Létező térbe való belépéshez meghívó szükséges.
    @@ -2376,25 +2376,25 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
         Térkép betöltése sikertelen
         Térkép
         Figyelem: az alkalmazás újraindul
    -    Üzenetszálak engedélyezése
    +    Üzenetszálak bekapcsolása
         Szerverhez csatlakozás
    -    Csatlakoznál egy már meglévő szerverhez\?
    -    kérdés kihagyása
    -    Még nem vagy biztos\? Tudhatsz ilyent: %s
    +    Csatlakoznál egy meglévő szerverhez\?
    +    Kihagyhatod ezt a kérdést.
    +    Még nem tudod\? %s
         Közösségek
         Csoportok
         Barátok és család
         Segítünk a kapcsolatteremtésben.
    -    Kivel beszélgetnék leginkább\?
    -    Már nézed ezt az üzenetszálat!
    +    Kikkel fogsz legtöbbet beszélgetni\?
    +    Jelenleg ezt az üzenetszálat olvasod!
         Megjelenítés szobában
    -    Válasz az üzenetszálban
    +    Válasz üzenetszálban
         „%s” parancs ismert, de üzenetszálban nem támogatott.
    -    Az üzenetszálból
    -    Tipp: Koppints hosszan az üzenetre és használd ezt: %s.
    +    Egy üzenetszálból
    +    Tipp: Koppints hosszan az üzenetre és használd a \"%s\" opciót.
         Az üzenetszálak segítenek a különböző témájú beszélgetések figyelemmel kísérésében.
    -    Beszélgetések üzenetszálakba való rendezése
    -    Minden üzenetszál megjelenítése ahol szerepel
    +    Beszélgetések üzenetszálakba rendezése
    +    Minden üzenetszál megjelenítése, ahová üzenetet küldtél
         Üzenetszálaim
         A szobában lévő összes szál mutatása
         Minden üzenetszál
    @@ -2417,6 +2417,6 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
             %d szerver jogosultság változott
             %d szerver jogosultság változott
         
    -    %1$s, %2$s és még mások
    +    %1$s, %2$s és mások
         %1$s és %2$s
     
    \ No newline at end of file
    
    From e6d81b3a7712e6ad27c673cd4700ec3746344d6c Mon Sep 17 00:00:00 2001
    From: Suguru Hirahara 
    Date: Mon, 7 Mar 2022 06:14:01 +0000
    Subject: [PATCH 043/126] Translated using Weblate (Japanese)
    
    Currently translated at 98.6% (2128 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/
    ---
     vector/src/main/res/values-ja/strings.xml | 114 +++++++++++-----------
     1 file changed, 58 insertions(+), 56 deletions(-)
    
    diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml
    index c1f3304fb8..e87e5653ca 100644
    --- a/vector/src/main/res/values-ja/strings.xml
    +++ b/vector/src/main/res/values-ja/strings.xml
    @@ -139,8 +139,8 @@
         メールアドレスを追加
         電話番号を追加
         通知音
    -    このアカウントで通知を許可
    -    このセッションで通知を許可
    +    このアカウントでは通知を有効にする
    +    このセッションでは通知を有効にする
         1対1のチャットでのメッセージ
         グループチャットでのメッセージ
         ルームへ招待されたとき
    @@ -219,7 +219,7 @@
         送信
         このホームサーバーは、あなたがロボットではないことの確認を求めています
         アカウントに登録されたメールアドレスの入力が必要です。
    -    メールアドレスの確認に失敗しました:電子メールのリンクをクリックしたことを確認してください
    +    メールアドレスの認証に失敗しました:電子メールのリンクをクリックしたことを確認してください
         不正な形式のJSON
         有効なJSONを含んでいませんでした
         ログイン要求が多すぎます
    @@ -273,14 +273,14 @@
         発言を通報
         写真を撮影
         動画を撮影
    -    検証を開始
    +    認証を開始
         リクエストにuser_idがありません。
         リクエストにroom_idがありません。
         リクエストの送信に失敗しました。
         ウィジェットを作成できません。
         ウィジェットをこのルームから削除してもよろしいですか?
    -    一致していない場合は、あなたのコミュニケーションの安全性が損なわれている可能性があります。
    -    このセッションでは、未検証のセッションに対して暗号化されたメッセージを送信しない。
    +    一致していない場合は、コミュニケーションのセキュリティーが破られている可能性があります。
    +    このセッションでは、未認証のセッションに対して暗号化されたメッセージを送信しない。
         認証済のセッションに対してのみ暗号化
         インポート
         ローカルファイルから鍵をインポート
    @@ -300,7 +300,7 @@
         信用する
         信用しない
         フィンガープリント(%s):
    -    リモートサーバーのIDを確認できませんでした。
    +    リモートサーバーのIDを認証できませんでした。
         誰かが不当にあなたの通信を傍受しているか、あなたの電話がリモートサーバーの証明書を信用していない可能性があります。
         サーバーの管理者が、これは想定されていることであると言っているのであれば、以下のフィンガープリントが、管理者によるフィンガープリントと一致していることを確認してください。
         証明書はあなたの電話により信頼されていたものから変更されています。これはきわめて異常な事態です。この新しい証明書を承認しないことを強く推奨します。
    @@ -420,7 +420,7 @@
         アカウントを停止するときに、自分の送信した全てのメッセージの履歴を消去してください(警告: この操作により、今後のユーザーは会話を不完全な形で見ることになります)
         アカウントを停止
         パスワードを入力してください。
    -    このルームは交換されており、使用されていません。
    +    このルームは置き換えられており、アクティブではありません。
         こちらから継続中の会話を確認
         このルームは別の会話の続きです
         以前のメッセージを見るには、ここをクリックしてください
    @@ -438,7 +438,7 @@
         %1$s:%2$s
         %d+
         展開
    -    畳む
    +    折りたたむ
         承諾
         このホームサーバーの方針を確認し承諾してください:
         通話設定画面
    @@ -569,7 +569,7 @@
         
             %d件のアクティブなセッション
         
    -    このログインを検証
    +    このログインを認証
         QRコード
         はい
         いいえ
    @@ -580,7 +580,7 @@
         削除の確認
         このイベントを削除してよろしいですか?ルーム名や説明の変更を削除すると、変更が取り消されますのでご注意ください。
         暗号化は有効です
    -    このルーム内でのメッセージはエンドツーエンド暗号化されます。詳細の確認や検証はユーザーのプロフィールをご確認ください。
    +    このルーム内でのメッセージはエンドツーエンド暗号化されます。詳細の確認や認証はユーザーのプロフィールをご確認ください。
         暗号化が有効になっていません
         通知設定
         切断
    @@ -657,7 +657,7 @@
         招待されています
         %sからの招待
         概ね完了しました。%sの画面にも同じシールドアイコンが表示されていますか?
    -    相手ユーザーの端末のコードをスキャンし、相互に安全性を検証
    +    相手ユーザーの端末のコードをスキャンし、相互に安全性を認証
         相手のコードをスキャン
         スキャンできません
         拒否
    @@ -1147,10 +1147,10 @@
     \nセッション名:%1$s
     \n最後のオンライン日時:%2$s
     \n新たにログインして新しいセッションを開始しなかった場合、この要求を無視してください。
    -    未認証のセッションが暗号鍵を要請しています。
    +    未認証のセッションが暗号鍵を要求しています。
     \nセッション名:%1$s
     \n最後のオンライン日時:%2$s
    -\n新たにログインして新しいセッションを開始しなかった場合、この要求を無視してください。
    +\n新しいセッションにログインしていない場合、この要求を無視してください。
         鍵の共有リクエスト
         カスタムカメラ画面の代わりにシステムカメラを使用します。
         使用中のウィジェットがありません
    @@ -1326,7 +1326,7 @@
         会話
         未読メッセージはありません
         未読はありません!
    -    %sがセッションの検証を要求しています
    +    %sがセッションの認証を要求しています
         リトライ
         他のホームサーバーに接続しようとしているようですね。サインアウトしますか?
         IDサーバーを使用していません
    @@ -1334,7 +1334,7 @@
         このルームを含む参加済のスペース
         このルームにアクセスできるスペースを決定します。スペースが選択されると、そのメンバーはルーム名を見つけて参加できます。
         了解
    -    完了しました!
    +    完了しました!
         メッセージの新しい鍵
         暗号化されたメッセージを決して失わないために
         セキュアバックアップ
    @@ -1477,7 +1477,7 @@
         スパムとして報告済
         このルームにファイルはありません
         このルームにメディアはありません
    -    公開されたルームをアップグレード
    +    公開ルームをアップグレード
         非公開スペース
         公開スペース
         送信済
    @@ -1566,7 +1566,7 @@
         有効にする
         あなたのIDサーバーの運営方針
         新しいルームを作成
    -    認証コードが正しくありません。
    +    確認コードが正しくありません。
         IDサーバーのURLを入力してください
         名前、ID、メールアドレスで検索
         システムの設定
    @@ -1667,7 +1667,7 @@
         イベントを送信しました!
         送信に失敗した全てのメッセージを削除
         失敗しました
    -    公開されたルーム
    +    公開ルーム
         アバターを削除
         アバターを変更
         かけ直す
    @@ -1705,7 +1705,7 @@
         ユーザーを招待しています…
         パスワードを選択してください。
         メンバーを追加
    -    ログインを検証
    +    ログインを認証
         メッセージを送る…
         このファイルは大きすぎてアップロードできません。
         この情報の送信に同意しますか?
    @@ -1838,7 +1838,7 @@
         一般
         転送
         信頼済
    -    検証済
    +    認証済
         未送信のメッセージを削除
         カスタムイベントを送信
         ルームの状態を探索
    @@ -1857,7 +1857,7 @@
         
             %1$d個の投票があります。結果を見るには投票してください
         
    -    未検証の端末で暗号化
    +    未認証の端末で暗号化
         メッセージを紙吹雪と共に送る
         メッセージを降雪と共に送る
         紙吹雪🎉を送る
    @@ -1954,7 +1954,7 @@
         パスワードはまだ変更されていません。
     \n
     \n変更作業を中止しますか?
    -    %1$sに認証メールを送信しました。
    +    %1$sに確認メールを送信しました。
         メールボックスを確認してください
         サインインに戻る
         元の大きさのままメディアファイルを送信
    @@ -1968,18 +1968,18 @@
         認証の要求
         %sがキャンセルしました
         既読
    -    検証
    +    認証
         メールアドレスが正しくないようです
         国際電話番号の形式を使用してください。
         国際電話番号は「+」から始まる必要があります
         コードを%1$sに送信しました。以下に入力して認証してください。
         このメールアドレスはどのアカウントにも登録されていません
         パスワードを変更すると、全てのセッションでのエンドツーエンド暗号鍵がリセットされ、暗号化されたメッセージ履歴が読めなくなります。パスワードを再設定する前に、鍵のバックアップを設定するか、他のセッションからルームの鍵をエクスポートしておいてください。
    -    パスワードの再設定を確認するために認証メールを送信します。
    -    このメールアドレスはどのアカウントにも属していません。
    -    このアプリではこのホームサーバーにアカウントを作成できません。
    +    パスワードの再設定を確認するために確認メールを送信します。
    +    このメールアドレスはどのアカウントにも登録されていません。
    +    このアプリでは、このホームサーバーにアカウントを作成できません。
     \n
    -\nウェブクライエントを使用してアカウント登録しますか?
    +\nウェブクライアントを使用してアカウントを作成しますか?
         申し訳ありませんが、このサーバーはアカウントの新規登録を受け入れていません。
         このアプリではこのホームサーバーにサインインできません。このホームサーバーは次のサインインの方法に対応しています:%1$s
     \n
    @@ -2037,11 +2037,11 @@
         セキュリティーキーを保存
         位置情報を共有しました
         %sでリアクションしました
    -    検証終了
    +    認証が完了しました
         次のいずれかのセキュリティーが破られている可能性があります。
     \n
     \n - あなたのホームサーバー
    -\n - 検証している相手のホームサーバー
    +\n - 認証している相手が接続しているホームサーバー
     \n - あなたか相手のインターネット接続
     \n - あなたか相手の端末
         セキュアではない
    @@ -2130,23 +2130,23 @@
         ナビゲーションのメニューを開く
         承諾しました
         %sが承諾しました
    -    %sが検証済み
    -    %sを検証する
    -    絵文字を比較して検証
    -    絵文字を比較して検証
    +    %sが認証済
    +    %sを認証する
    +    絵文字を比較して認証
    +    絵文字を比較して認証
         対面でない場合は、代わりに絵文字を比較してください
         あなたのホームサーバーで許容されている添付ファイルの最大サイズは%sです。
         新しいパスワードを確認するには下記のリンクを開いてください。リンクにアクセスしてから、以下をクリックしてください。
         PINコードを再設定するには「PINコードを忘れた」をタップしてログアウトし、その後再設定してください。
         
    -        いま検証できる%d個の端末を表示
    +        いま認証できる%d個の端末を表示
         
         この操作を実行するには ${app_name}に認証情報を入力する必要があります。
         あなただけが知っている秘密のパスワードを入力してください。バックアップ用にセキュリティーキーを生成します。
    -    暗号化されたメッセージにアクセスするには、ログインを検証し、本人確認を行う必要があります。
    -    暗号化されたメッセージにアクセスするには、あなたの他のセッションからログインを検証し、本人確認を行う必要があります。
    +    暗号化されたメッセージにアクセスするには、ログインを認証し、本人確認を行う必要があります。
    +    暗号化されたメッセージにアクセスするには、あなたの他のセッションからログインを認証し、本人確認を行う必要があります。
         詳しく知る
    -    セキュリティーを高めるために、使い捨てコードが一致しているのを確認して、%sを検証しましょう。
    +    セキュリティーを高めるために、使い捨てコードが一致しているのを確認して、%sを認証しましょう。
         暗号化の設定が正しくありません。
         暗号化を復元
         暗号化を有効な状態に取り戻すために、管理者に連絡してください。
    @@ -2163,12 +2163,12 @@
         完了!
         アカウントパスワードと違うものにしてください。
         続行するには%sを入力してください。
    -    検証を中止しました
    -    今中止すると、%1$s(%2$s)を検証しません。検証は相手のユーザープロフィール画面からもう一度開始できます。
    +    認証を中止しました
    +    今中止すると、%1$s(%2$s)を認証しません。認証は相手のユーザープロフィール画面からもう一度開始できます。
         中止すると、新しい端末では暗号化されたメッセージが読めず、他のユーザーに信頼されません
         中止すると、この端末では暗号化されたメッセージが読めず、他のユーザーに信頼されません
         自分ではない
    -    新しいセッションを検証して、暗号化されたメッセージにアクセスできるようにしましょう。
    +    新しいセッションを認証して、暗号化されたメッセージにアクセスできるようにしましょう。
         新しいログイン。あなたですか?
         ${app_name} Android
         ルームの管理者によって削除されています。理由:%1$s
    @@ -2180,9 +2180,9 @@
     \n
     \n予期しないトラブルを起こす可能性があるので注意してください。
         %1$s(%2$s)が新しいセッションでサインインしました:
    -    このセッションは%1$s(%2$s)によって検証されているので、メッセージのセキュリティは信頼できます。
    -    既存のセッションでこのセッションを検証して、暗号化されたメッセージへアクセスできるようにしましょう。
    -    あなたはこのセッションを検証しているので、メッセージのセキュリティは信頼できます。
    +    このセッションは%1$s(%2$s)によって認証されているので、メッセージのセキュリティは信頼できます。
    +    既存のセッションでこのセッションを認証して、暗号化されたメッセージへアクセスできるようにしましょう。
    +    あなたはこのセッションを認証しているので、メッセージのセキュリティは信頼できます。
         利用可能な暗号情報がありません
         既定のバージョン
         非公開のルームとダイレクトメッセージにおけるエンドツーエンド暗号化は、あなたのサーバーの管理者により既定として無効にされています。
    @@ -2198,7 +2198,7 @@
         あと少しです!確認を待機しています…
         あと少しです!もう一方のデバイスは同じマークを表示していますか?
         %sを待機しています…
    -    このユーザーがこのセッションを検証するまで、送受信されるメッセージには警告マークが付きます。手動で検証することも可能です。
    +    このユーザーがこのセッションを認証するまで、送受信されるメッセージには警告マークが付きます。手動で認証することも可能です。
         セッションの取得に失敗しました
         誰がチームの仲間ですか?
         %sを探索できるようになります
    @@ -2228,7 +2228,7 @@
         再認証が必要です
         全てリセット
         連絡先
    -    検証をキャンセルしました。あらためて開始してください。
    +    認証をキャンセルしました。あらためて開始してください。
         押し続けて録音し、離すと送信
         PINコードを設定してください
         
    @@ -2237,9 +2237,9 @@
         置き換えられたルームに参加
         このルームが発見できません。存在することを確認してください。
         指紋や顔画像など、端末に固有の生体認証を有効にする。
    -    絵文字で検証
    -    テキストで検証
    -    すべてのセッションを検証し、アカウントとメッセージが安全であることを確認してください
    +    絵文字で認証
    +    テキストで認証
    +    すべてのセッションを認証し、アカウントとメッセージが安全であることを確認してください
         ログインしている場所を確認
         復旧用の手段を全て無くしてしまいましたか?全てリセットする
         クロス署名に対応した他のMatrixのクライアントでも使用できます。
    @@ -2282,12 +2282,12 @@
     \n
     \n続行してよろしいですか?
         このリンクを再確認してください
    -    ログインを検証してください:%1$s
    +    ログインを認証してください:%1$s
         機密ストレージのアクセスに失敗しました
         この設定を有効にすると、全てのアクティビティーにFLAG_SECUREを追加します。変更を有効にするにはアプリケーションの再起動が必要です。
         このアカウントは無効化されています。
    -    個人のクラウドストレージにコピーしましょう
    -    印刷して安全な場所に保管しましょう
    +    個人用のクラウドストレージにコピー
    +    印刷して安全な場所に保管
         %2$sと%1$sが設定されました。
     \n
     \n安全な場所で保管してください!それらは、アクティブなセッションを全て失ってしまった際、暗号化されたメッセージや安全な情報のロックを解除するために必要となります。
    @@ -2300,7 +2300,7 @@
         PINコードでしか${app_name}のロックを解除することはできません。
         ${app_name}を開く際には、毎回PINコードの入力が必要です。
         あなたがブロックされているルームを開くことはできません。
    -    PINコードの検証に失敗しました。新しいコードを入力してください。
    +    PINコードの認証に失敗しました。新しいコードを入力してください。
         端末の連絡先がありません
         暗号化の履歴を待機しています
         送信者があなたのセッションを信頼していないため、このメッセージにアクセスすることができません
    @@ -2318,8 +2318,8 @@
         絵文字の一覧を開く
         認証に失敗しました
         復旧を設定しています。
    -    このセッションは、他のセッションと検証を共有することができません。
    -\n検証は端末に保存され、新しいバージョンのアプリで共有されます。
    +    このセッションは、他のセッションと認証を共有することができません。
    +\n認証は端末に保存され、新しいバージョンのアプリで共有されます。
         %1$s、%2$s他
         %1$sと%2$s
         自分と相手を認証して、チャットを安全に保ちましょう
    @@ -2331,7 +2331,7 @@
         音声通話が拒否されました
         %1$sは通話を拒否しました
         このデバイスを認証可能な他の端末が全くない場合にのみ、続行してください。
    -    このセッションを信頼済として検証すると、暗号化されたメッセージにアクセスすることができます。このアカウントにサインインしなかった場合は、あなたのアカウントのセキュリティーが破られている可能性があります:
    +    このセッションを信頼済として認証すると、暗号化されたメッセージにアクセスすることができます。このアカウントにサインインしなかった場合は、あなたのアカウントのセキュリティーが破られている可能性があります:
         アカウントのセキュリティーが破られている可能性があります
         選択したスペースに追加
         最新の${app_name}は他のデバイスでも使用できます:
    @@ -2340,4 +2340,6 @@
         メールアドレスで招待したり、連絡先を検索したりできます…
         鍵のバックアップの機密情報をSSSSに保存しています
         あなたしか知らないセキュリティーフレーズを入力してください。サーバーで機密情報を保護するために使用します。
    +    詳細を非表示
    +    他の参加者はいません。%sに招待しましょう。
     
    \ No newline at end of file
    
    From e1c61e3e309566e643a3e20240ad3fc4c8ae2188 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?N=C3=ADcolas=20F=2E=20R=2E=20A=2E=20Prado?=
     
    Date: Fri, 4 Mar 2022 02:24:21 +0000
    Subject: [PATCH 044/126] Translated using Weblate (Portuguese (Brazil))
    
    Currently translated at 100.0% (2157 of 2157 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 | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml
    index b9e2fa3791..cd237407d2 100644
    --- a/vector/src/main/res/values-pt-rBR/strings.xml
    +++ b/vector/src/main/res/values-pt-rBR/strings.xml
    @@ -1414,7 +1414,7 @@
         Quase lá! %s está mostrando um tick (✓)\?
         Sim
         Não
    -    Conectividade ao servidor tem sido perdida
    +    A conexão com o servidor foi perdida
         Modo avião está ligado
         Ferramentas Dev
         Dados de Conta
    @@ -2107,7 +2107,7 @@
             %d chamadas de vídeo perdidas
         
         
    -        Chamadad de áudio perdida
    +        Chamada de áudio perdida
             %d chamadas de áudio perdidas
         
         Por favor note que fazer upgrade vai fazer uma nova versão da sala. Todas as mensagens atuais vão permanecer nesta sala arquivada.
    
    From 37bbaa983f0687616298071e7e4a7f9879ac1a04 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Peter=20V=C3=A1gner?= 
    Date: Mon, 7 Mar 2022 22:22:00 +0000
    Subject: [PATCH 045/126] Translated using Weblate (Slovak)
    
    Currently translated at 99.3% (2143 of 2157 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 | 9 ++++++++-
     1 file changed, 8 insertions(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 3ea0dc14a8..410939ef62 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2423,7 +2423,7 @@
         Udalosť vymazaná používateľom, dôvod: %1$s
         Dôvod úpravy
         ${app_name} sa stretol s problémom pri vykresľovaní obsahu udalosti s id \'%1$s\'
    -    Reagoval/a s: %s
    +    Reagoval/a: %s
         ${app_name} môže padať častejšie, keď sa vyskytne neočakávaná chyba
         Zadajte adresu servera, ktorý chcete použiť
         Vlastné hlásenie…
    @@ -2445,4 +2445,11 @@
         Zaškrtnuté
         Rozpísaná správa
         Otvoriť navigačnú ponuku
    +    Videli
    +    
    +        %1$d ďalšia
    +        %1$d ďalšie
    +        %1$d ďalších
    +    
    +    Zadajte URL adresu servera Modular Element alebo adresu servera, ktorý si želáte použiť
     
    \ No newline at end of file
    
    From 4d0cde6fb9413c90137b60d032e365e5a79fda58 Mon Sep 17 00:00:00 2001
    From: Jozef Gaal 
    Date: Mon, 7 Mar 2022 22:18:58 +0000
    Subject: [PATCH 046/126] Translated using Weblate (Slovak)
    
    Currently translated at 99.3% (2143 of 2157 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 | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 410939ef62..8d97ff7266 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2439,7 +2439,7 @@
         %1$s a %2$s
         Pokračovať pomocou jednotného prihlásenia SSO
         jednotné prihlásenie SSO
    -    Zatvoriť výzvu zálohovanie kľúčov
    +    Zatvoriť výzvu na zálohovanie kľúčov
         Výťazná odpoveď
         Nezaškrtnuté
         Zaškrtnuté
    
    From d8f8d4a40c084c7deb373b772246ac3411459d70 Mon Sep 17 00:00:00 2001
    From: notramo 
    Date: Mon, 7 Mar 2022 20:38:25 +0000
    Subject: [PATCH 047/126] Translated using Weblate (Hungarian)
    
    Currently translated at 98.0% (50 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/
    ---
     .../android/hu-HU/full_description.txt        | 61 +++++++++----------
     .../android/hu-HU/short_description.txt       |  2 +-
     fastlane/metadata/android/hu-HU/title.txt     |  2 +-
     3 files changed, 32 insertions(+), 33 deletions(-)
    
    diff --git a/fastlane/metadata/android/hu-HU/full_description.txt b/fastlane/metadata/android/hu-HU/full_description.txt
    index 899b4cd978..0791eed7ba 100644
    --- a/fastlane/metadata/android/hu-HU/full_description.txt
    +++ b/fastlane/metadata/android/hu-HU/full_description.txt
    @@ -1,43 +1,42 @@
    -Element egy biztonságos üzenetküldő és csapatmunka támogató alkalmazás ami ideális távoli munkavégzés közben csoportos csevegéshez. Az alkalmazás végpontok közötti titkosítást használ videó konferenciához, fájl megosztáshoz és videó hivásokhoz.
    +Az Element egy biztonságos üzenetküldő, és egy csapatmunka app, amely távoli munkavégzéshez is alkalmas lehet. Az alkalmazás végponti titkosítás használatával biztosít videó konferencia, fájlmegosztás, és audio hívás lehetőségeket.
     
    -Element tulajdonságai:
    -- Fejlett online kommunikációs eszköz
    -- Teljesen titkosított üzenetküldés biztonságos céges kommunikációt kínál még a távdolgozóknak is
    -- Elosztott csevegés a Matrix nyílt forráskódú keretrendszer felhasználásával
    -- Bizontságos fájl megosztás titkosítottan projektek kezeléséhez
    -- Videó hívás VoIP-pal és képernyőmegosztással
    -- Könnyen integrálható a kedvenc online kollaborációs eszközöddel, projekt menedzsment eszközzel, VoIP szolgáltatással vagy más csoport üzenetküldő alkalmazással
    +Az Element funkciói többek között:
    +- Fejlett online kommunikációs eszközök
    +- Titkosított üzenetek a biztonságos céges kommunikációhoz, otthonról dolgozóknak is
    +- Decentralizált chat a nyílt forráskódú Matrix protokoll használatával
    +- Biztonságos fájlmegosztáss a projektek kezeléséhez
    +- Videochat, VoIP, és képernyőmegosztási lehetőséggel 
    +- Egyszerű integráció a kedvenc online kollaborációs eszközeiddel, projektkezelési eszközökkel, VoIP szolgáltatásokkal, és más csoportos üzenetküldő alkalmazásokkal
     
    -Element teljesen más mint a többi üzenetküldő alkalmazás. Matrixot használ, egy nyílt hálózatot a decentralizált biztonságos kommunikációhoz. Lehetőséget ad saját szerver üzemeltetésére ami maximális tulajdont és kontrollt biztosít az adatok fölött.
    +Element is completely different from other messaging and collaboration apps. It operates on Matrix, an open network for secure messaging and decentralized communication. It allows self-hosting to give users maximum ownership and control of their data and messages.
     
    -Magánélet védelme és titkosított üzenetküldés
    -Element megóv a kéretlen hirdetésektől, adatbányászattól és a különböző szigetszerű megoldásoktól. Minden adatot biztonságba helyez, egy az egybe videó és hang kommunikáció végpontok között titkosítva ahol az eszközök hitelesítve vannak.
    +Privacy and encrypted messaging
    +Element protects you from unwanted ads, data mining and walled gardens. It also secures all your data, one-to-one video and voice communication through end-to-end encryption and cross-signed device verification.
     
    -Element a kezedbe adja az adatvédelmi irányítást miközben bárkivel kommunikálhatsz a Matrix hálózatban vagy más üzleti kollaborációs eszközzel ami integrálva van, mint amilyen a Slack.
    +Element gives you control over your privacy while allowing you to communicate securely with anyone on the Matrix network, or other business collaboration tools by integrating with apps such as Slack.
     
    -Element futtatható saját szerveren
    +Element can be self-hosted
    +To allow more control of your sensitive data and conversations, Element can be self-hosted or you can choose any Matrix-based host - the standard for open source, decentralized communication. Element gives you privacy, security compliance and integration flexibility.
     
    -Azért, hogy az érzékeny adatok és beszélgetések minnél inkább az irányításod alatt lehessen az Elementet saját magadnak üzemeltetheted vagy választhatsz bármely Matrixon alapuló - szabványos nyílt forráskódú és decentralizált kommunikáció - szoláltató közül. Element adatvédelmet, biztonságot és rugalmas integrációkat biztosít.
    +Own your data
    +You decide where to keep your data and messages. Without the risk of data mining or access from third parties.
     
    -A te adatod a tiéd
    -Te döntöd el, hogy hol tárolod az adataidat és üzeneteidet. Adatbányászat vagy harmadik fél hozzáférésének kockázata nélkül.
    +Element puts you in control in different ways:
    +1. Get a free account on the matrix.org public server hosted by the Matrix developers, or choose from thousands of public servers hosted by volunteers
    +2. Self-host your account by running a server on your own IT infrastructure
    +3. Sign up for an account on a custom server by simply subscribing to the Element Matrix Services hosting platform
     
    -Element többféle képpen adja vissza az irányítást:
    -1. Szerezz egy ingyenes hozzáférést a matrix.org nyilvános szerverre amit a Matrix fejlesztők üzemeltetnek vagy válassz a több ezer önkéntesek által üzemeltetett nyilvános szerverből 
    -2. Üzemeltess szerver magadnak a saját infrastruktúrádon
    -3. Iratkozz fel egy egyedi szerverre az Element Matrix Services platformon
    +Open messaging and collaboration
    +You can chat with anyone on the Matrix network, whether they’re using Element, another Matrix app or even if they are using a different messaging app.
     
    -Nyílt üzenetküldés és kollaboráció
    -Bárkivel beszélgethetsz a Matrix hálózaton, akár az Elementet használja akár egy másik Matrix alkalmazást használ vagy akár egy eltérő üzenetküldőt. 
    +Super secure
    +Real end-to-end encryption (only those in the conversation can decrypt messages), and cross-signed device verification.
     
    -Fantasztikusan biztonságos
    -Igazi végpontok között titkosítás (csak a beszélgetésben résztvevők tudják visszafejteni) és hitelesítés eszközök közötti aláírásokkal.
    +Complete communication and integration
    +Messaging, voice and video calls, file sharing, screen sharing and a whole bunch of integrations, bots and widgets. Build rooms, communities, stay in touch and get things done.
     
    -Teljes kommunikáció és integráció
    -Üzenetküldés, hang és videóhívás, fájl megosztás, képernyő megosztás és egy csomó integráció, botok és kisalkalmazások. Építs szobákat, közösségeket, maradj kapcsolatban és végezz el dolgokat.
    +Pick up where you left off
    +Stay in touch wherever you are with fully synchronised message history across all your devices and on the web at https://app.element.io
     
    -Vedd fel a fonalat
    -Maradj kapcsolatban bárhol minden eszközödön a szinkronizált üzenetekkel és a weben a https://app.element.io oldallal
    -
    -Nyílt forráskód
    -Element Android egy nyílt forráskódú projekt a GitHubon. Küldj hibajegyet és/vagy vegyél részt a fejlesztésében itt: https://github.com/vector-im/element-android
    +Open source
    +Element Android is an open source project, hosted by GitHub. Please report bugs and/or contribute to its development at https://github.com/vector-im/element-android
    diff --git a/fastlane/metadata/android/hu-HU/short_description.txt b/fastlane/metadata/android/hu-HU/short_description.txt
    index 2dfe14c516..51be689331 100644
    --- a/fastlane/metadata/android/hu-HU/short_description.txt
    +++ b/fastlane/metadata/android/hu-HU/short_description.txt
    @@ -1 +1 @@
    -Csoportos üzenetküldő - titkosított üzenetek, videó hívások
    +Csoportos üzenetküldő - titkosított üzenetek és videó hívások
    diff --git a/fastlane/metadata/android/hu-HU/title.txt b/fastlane/metadata/android/hu-HU/title.txt
    index 907f907f99..c463dea393 100644
    --- a/fastlane/metadata/android/hu-HU/title.txt
    +++ b/fastlane/metadata/android/hu-HU/title.txt
    @@ -1 +1 @@
    -Element
    +Element - Biztonságos üzenetküldő
    
    From bf619204e1a5d6aa459a78e8ed9ebfe86a182d1c Mon Sep 17 00:00:00 2001
    From: Edward Gera 
    Date: Mon, 7 Mar 2022 14:54:14 +0000
    Subject: [PATCH 048/126] Translated using Weblate (Hebrew)
    
    Currently translated at 85.5% (1846 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 69 +++++++++++++++++++++++
     1 file changed, 69 insertions(+)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 57a8cf6630..3d9cfd1154 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2067,4 +2067,73 @@
         יש לי כבר חשבון
         צור חשבון
         תקשורת מאובטחת.
    +    סגור את קוֹטֵף האמוג\'י
    +    פתח את קוֹטֵף האמוג\'י
    +    רמת האמון אמינה
    +    אזהרה רמת האמון
    +    ברירת המחדל של רמת האמון
    +    נבחר
    +    וידאו
    +    יש טיוטה שלא נשלחה
    +    חלק מההודעות לא נשלחו
    +    מחיקת אווטאר
    +    החלף אווטאר
    +    תמונה
    +    ייבוא מפתחות מהקובץ
    +    פתח יישומונים
    +    צילום מסך
    +    האימות נכשלה
    +    ${app_name} כדי לבצע פעולה זו נדורש להזין את פרטי התחברות שלך.
    +    יש צורך באימות מחדש
    +    החלק כדי לסיים את השיחה
    +    אדם לא ידוע
    +    העבר אל %1$s
    +    התייעצות עם %1$s
    +    משתמשים
    +    אירעה שגיאה בהעברת השיחה
    +    הַעֲבִר
    +    התחבר
    +    התייעץ קודם
    +    %1$s הקש לחזרה
    +    שיחה פעילה (%1$s) ·
    +    
    +        שיחה פעילה ·
    +        %1$d שיחות פעילות ·
    +        
    +        
    +    
    +    שיחה פעילה (%1$s)
    +    אירעה שגיאה בחיפוש מספר הטלפון
    +    לוח חיוג
    +    אין מענה
    +    שיחה וידאו שלא נענתה
    +    שיחה קולית שלא נענתה
    +    השיחה קולית נדחתה
    +    שיחת וידאו נדחתה
    +    שיחת הווידאו הסתיימה • %1$s
    +    השיחה הקולית הסתיימה • %1$s
    +    שיחת קולית פעילה
    +    שיחת וידאו פעילה
    +    שיחה וידאו נכנסת
    +    שיחה קולית נכנסת
    +    שיחה חוזרת
    +    השיחה הזו הסתיימה
    +    %1$s דחה את השיחה הזו
    +    דחית את השיחה הזו
    +    התראת חדר
    +    להודיע לכל החדר
    +    
    +        %1$d יותר
    +        
    +        
    +        
    +    
    +    %1$s, %2$s ואחרים
    +    %1$s ו %2$s
    +    
    +        %d שינוי ברשימות ACL בשרתים
    +        
    +        
    +        
    +    
     
    \ No newline at end of file
    
    From a7e44c81f2e1914806c306421a74e2bba43e5a53 Mon Sep 17 00:00:00 2001
    From: Ilan Feler 
    Date: Sun, 6 Mar 2022 14:48:01 +0000
    Subject: [PATCH 049/126] Translated using Weblate (Hebrew)
    
    Currently translated at 85.5% (1846 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 39 +++++++++++++++++++++++
     1 file changed, 39 insertions(+)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 3d9cfd1154..73a57823eb 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2136,4 +2136,43 @@
             
             
         
    +    נהל חדרים
    +    החלט מי יכול לראות ולהצטרף לחדר זה.
    +    הקש כדי לערוך מרחבים
    +    חפש שם
    +    חפש באמצאות שם, כינוי או מייל
    +    דוחס וידאו %d%%
    +    דוחס תמונה …
    +    תן משוב
    +    שליחת המשוב נכשלה (%s)
    +    תודה, המשוב שלך נשלח בהצלחה
    +    אתה יכול לצור איתי קשר במידה ויהיו לך שאלות המשך
    +    הינך משתמש בגירסת נסיון של מרחבים. המשוב שלך ישמש לעידכון גהגרסאות הבאות. פרטי המערכת ושם המשתמש ירשמו כדי שנוכל להשתמש במשוב שלך בצורה מיטבית.
    +    משוב
    +    סוף המשאל
    +    פעולה זו תעצור את האפשרות להצביע ותציג את תוצאות המשאל.
    +    סוף המשאל\?
    +    אפשרות הזוכה
    +    סוף המשאל
    +    שאלה לא יכולה להיות ריקה
    +    צור משאל
    +    הוסף אפשרות
    +    אפשרות %1$d
    +    צור אפשריות
    +    שאלה או נושא
    +    שאלה או נושא המשאל
    +    צור משאל
    +    אתחל את הישומון כדי שהשינויים יכנסו לתוקף.
    +    הצטרף בכל מקרה
    +    הצטרף למרחב
    +    צור מרחב
    +    דלג כרגע
    +    הצטרף למרחב שלי %1$s%2$s
    +    הודעות קבוצה מוצפנות
    +    הודעות ישירות
    +    שידרוגי חדר
    +    השם המוצג שלי
    +    שם המשתמש שלי
    +    הזמנות לחדר
    +    מילות מפתח
     
    \ No newline at end of file
    
    From 2c0d281a7bde658ec9ca50e27b543d7ca1f6be13 Mon Sep 17 00:00:00 2001
    From: Suguru Hirahara 
    Date: Mon, 7 Mar 2022 07:33:01 +0000
    Subject: [PATCH 050/126] Translated using Weblate (Japanese)
    
    Currently translated at 62.7% (32 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/ja/
    ---
     .../android/ja-JP/changelogs/40100100.txt     |  2 +-
     .../android/ja-JP/changelogs/40100110.txt     |  2 +-
     .../android/ja-JP/changelogs/40100120.txt     |  4 +-
     .../android/ja-JP/changelogs/40100130.txt     |  4 +-
     .../android/ja-JP/changelogs/40100140.txt     |  4 +-
     .../android/ja-JP/changelogs/40100150.txt     |  4 +-
     .../android/ja-JP/changelogs/40100160.txt     |  4 +-
     .../android/ja-JP/changelogs/40100170.txt     |  4 +-
     .../android/ja-JP/changelogs/40101000.txt     |  4 +-
     .../android/ja-JP/changelogs/40101010.txt     |  4 +-
     .../android/ja-JP/changelogs/40101020.txt     |  4 +-
     .../android/ja-JP/changelogs/40101030.txt     |  4 +-
     .../android/ja-JP/changelogs/40101160.txt     |  4 +-
     .../android/ja-JP/changelogs/40103090.txt     |  2 +
     .../android/ja-JP/changelogs/40103100.txt     |  2 +-
     .../android/ja-JP/changelogs/40103130.txt     |  2 +
     .../android/ja-JP/changelogs/40103140.txt     |  2 +
     .../android/ja-JP/changelogs/40103150.txt     |  2 +
     .../android/ja-JP/full_description.txt        | 40 +++++++++----------
     19 files changed, 53 insertions(+), 45 deletions(-)
     create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103090.txt
     create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103130.txt
     create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103140.txt
     create mode 100644 fastlane/metadata/android/ja-JP/changelogs/40103150.txt
    
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100100.txt b/fastlane/metadata/android/ja-JP/changelogs/40100100.txt
    index 48af96d216..0f9fc720a9 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100100.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100100.txt
    @@ -1,2 +1,2 @@
     今回の新バージョンでは、主にバグの修正と改善が行われています。メッセージの送信がより速くなりました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.10
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.10
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100110.txt b/fastlane/metadata/android/ja-JP/changelogs/40100110.txt
    index b8b9798fcd..d67486a147 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100110.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100110.txt
    @@ -1,2 +1,2 @@
     今回の新バージョンでは、主にUI(ユーザーインターフェース)とUX(ユーザーエクスペリエンス)の向上が図られています。友達を招待したり、QRコードを読み取って素早くDMを作成できるようになりました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.11
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.11
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100120.txt b/fastlane/metadata/android/ja-JP/changelogs/40100120.txt
    index 01c33c5d52..1e10e5f2e3 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100120.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100120.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.12
    +このバージョンの主な変更点:URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.12
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100130.txt b/fastlane/metadata/android/ja-JP/changelogs/40100130.txt
    index 941a052239..0e5ef9b8eb 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100130.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100130.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.13
    +このバージョンの主な変更点:URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.13
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100140.txt b/fastlane/metadata/android/ja-JP/changelogs/40100140.txt
    index 6dc536cdcf..8fa9848d0b 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100140.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100140.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: 部屋の許可、自動のテーマ切替、そして多くのバグを修正しました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.14
    +このバージョンの主な変更点:部屋の許可、自動のテーマ切替、そして多くのバグを修正しました。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.14
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100150.txt b/fastlane/metadata/android/ja-JP/changelogs/40100150.txt
    index caded1b8ed..c94330b70b 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100150.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100150.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: ソーシャルログインに対応しました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.15
    +このバージョンの主な変更点:ソーシャルログインに対応しました。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.15
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100160.txt b/fastlane/metadata/android/ja-JP/changelogs/40100160.txt
    index 1b1a2092b0..ae947f1781 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100160.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100160.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100170.txt b/fastlane/metadata/android/ja-JP/changelogs/40100170.txt
    index a0cc7b107d..01b742a9a2 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40100170.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40100170.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: バグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.17
    +このバージョンの主な変更点:バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.0.17
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101000.txt b/fastlane/metadata/android/ja-JP/changelogs/40101000.txt
    index d0900f38c2..0c09cee3dd 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101000.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101000.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.0
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.0
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101010.txt b/fastlane/metadata/android/ja-JP/changelogs/40101010.txt
    index cb204e5696..25ac73b449 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101010.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101010.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.1
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.1
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101020.txt b/fastlane/metadata/android/ja-JP/changelogs/40101020.txt
    index bb6ab66525..762879a281 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101020.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101020.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.2
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.2
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101030.txt b/fastlane/metadata/android/ja-JP/changelogs/40101030.txt
    index e7ecc05a0f..3c641c09ac 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101030.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101030.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.3
    +このバージョンの主な変更点:パフォーマンスの向上と、バグを修正しました!
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.3
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101160.txt b/fastlane/metadata/android/ja-JP/changelogs/40101160.txt
    index 985ea10510..3e37e353d7 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40101160.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40101160.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点:ルームにて誰かがログアウトした際に発生するエラーを修正しました。
    -全ての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.16
    +このバージョンの主な変更点:ルームにて誰かがログアウトした際に発生するエラーを修正しました。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.1.16
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103090.txt b/fastlane/metadata/android/ja-JP/changelogs/40103090.txt
    new file mode 100644
    index 0000000000..580b49e6d9
    --- /dev/null
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103090.txt
    @@ -0,0 +1,2 @@
    +このバージョンの主な変更点:音声メッセージの下書き機能の追加。不具合の修正。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.9
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103100.txt b/fastlane/metadata/android/ja-JP/changelogs/40103100.txt
    index 76c28cdd90..0527756005 100644
    --- a/fastlane/metadata/android/ja-JP/changelogs/40103100.txt
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103100.txt
    @@ -1,2 +1,2 @@
    -このバージョンの主な変更点:投票機能のサポート(実験的)。URL プレビューの新規デザイン。
    +このバージョンの主な変更点:アンケート機能のサポート(実験的)。URL プレビューの新規デザイン。
     更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.10
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103130.txt b/fastlane/metadata/android/ja-JP/changelogs/40103130.txt
    new file mode 100644
    index 0000000000..19d04a9b99
    --- /dev/null
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103130.txt
    @@ -0,0 +1,2 @@
    +このバージョンの主な変更点:登録時の表示に関する変更(Analyticsへのオプトインなど)。数学に関するイベントをラボに追加。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.13
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103140.txt b/fastlane/metadata/android/ja-JP/changelogs/40103140.txt
    new file mode 100644
    index 0000000000..c9f5062c5b
    --- /dev/null
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103140.txt
    @@ -0,0 +1,2 @@
    +このバージョンの主な変更点:登録時の表示に関する変更(Analyticsへのオプトインなど)。数学に関するイベントをラボに追加。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.14
    diff --git a/fastlane/metadata/android/ja-JP/changelogs/40103150.txt b/fastlane/metadata/android/ja-JP/changelogs/40103150.txt
    new file mode 100644
    index 0000000000..89c3117cf5
    --- /dev/null
    +++ b/fastlane/metadata/android/ja-JP/changelogs/40103150.txt
    @@ -0,0 +1,2 @@
    +このバージョンの主な変更点:登録時の表示に関する変更(Analyticsへのオプトインなど)。数学に関するイベントをラボに追加。
    +更新履歴:https://github.com/vector-im/element-android/releases/tag/v1.3.15
    diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt
    index 6014938cce..ce1550acb0 100644
    --- a/fastlane/metadata/android/ja-JP/full_description.txt
    +++ b/fastlane/metadata/android/ja-JP/full_description.txt
    @@ -1,42 +1,42 @@
    -Elementは、安全なメッセンジャー、リモートワーク中のグループチャットに適したチームコラボレーションアプリです。エンドツーエンドの暗号化を使用して、強力なビデオ会議、ファイル共有、音声通話を提供します。
    +Elementは、安全なメッセージングアプリ、リモートワーク中のグループチャットに適したチームコラボレーションアプリです。エンド・ツー・エンドの暗号化技術を使用して、強力なビデオ会議、ファイル共有、音声通話を提供します。
     
     Elementの特徴
     - 高度なオンラインコミュニケーションツール
    -- 完全に暗号化されたメッセージにより、リモートワーカーでも、より安全な企業コミュニケーションが可能
    -- Matrixオープンソースフレームワークをベースにした分散型のチャット
    -- プロジェクトを管理しながら、暗号化されたデータで安全にファイル共有
    +- メッセージの完全な暗号化。リモートワーカーでも、より安全な企業コミュニケーションが可能
    +- Matrixオープンソースフレームワークに基づく、分散型のチャット
    +- プロジェクトの管理と並行して、データの暗号化によりファイルを安全に共有することが可能
     - Voice over IPによるビデオチャットと画面共有
    -- お気に入りのオンラインコラボレーションツール、プロジェクト管理ツール、VoIPサービス、その他のチームメッセージングアプリと簡単に統合可能
    +- お気に入りのオンラインコラボレーションツールや、プロジェクト管理ツール、VoIPサービス、その他のチームメッセージングアプリと簡単に統合可能
     
    -Elementは他のメッセージングアプリやコラボレーションアプリとは全く異なります。安全なメッセージングと分散型(非中央集権)コミュニケーションのためのオープンネットワークであるMatrixで動作します。ユーザーが自分のデータやメッセージを最大限にコントロールできるように、セルフホスティングも可能です。
    +Elementは、他のメッセージングアプリやコラボレーションアプリとは全く異なります。安全なメッセージングと分散型(非中央集権型)コミュニケーションのためのオープンネットワークであるMatrixで動作します。自分のデータやメッセージを最大限にコントロールするために、あなた自身がサーバーを運営することもできます。
     
     プライバシーと暗号化されたコミュニケーション
    -Elementは、望ましくない広告、データマイニング、ウォールドガーデンからユーザーを保護します。また、エンド・ツー・エンドの暗号化と相互署名された端末の検証により、全てのデータ、1対1のビデオおよび音声通信を保護します。
    +Elementは、望ましくない広告、データマイニング、囲い込みからユーザーを守ります。また、エンド・ツー・エンドの暗号化と、相互署名による端末の認証に基づき、全てのデータ、ビデオ会議、音声通信を保護します。
     
    -Elementは、Slackなどのアプリと統合することで、Matrixネットワーク上の誰とでも安全にコミュニケーションを取ることができると同時に、プライバシーをコントロールすることができます。
    +Elementでは、Matrixネットワークにいる誰とでもコミュニケーションが行えるだけでなく、Slackなどのアプリと連携すれば、他のネットワークともコミュニケーションを行うとともに、プライバシーをコントロールすることができます。
     
    -Elementはセルフホスティングが可能
    -機密データや会話の管理を強化するために、Elementはセルフホスティングが可能です。または、オープンソースの分散型コミュニケーションの標準であるMatrixベースのホストを選択することもできます。Elementは、プライバシー、セキュリティーコンプライアンス、および統合の柔軟性を提供します。
    +セルフホスティングが可能
    +機密データや会話の管理を強化するために、Elementはセルフホスティングが可能です。または、オープンソースの分散型コミュニケーションの標準であるMatrixに基づくサーバーを選ぶこともできます。Elementは、プライバシー、セキュリティーコンプライアンス、および柔軟な機能統合を提供します。
     
     自分のデータを所有する
    -データやメッセージをどこに保管するかは、ユーザー自身が決めることができます。データマイニングやサードパーティからのアクセスのリスクはありません。
    +データやメッセージを保管する場所を自分で決めることができます。データマイニングや第三者へのデータ流出のリスクはありません。
     
    -Elementでは、どのサーバーを使うかを、ご自身で決めることができます。
    -1. 開発者がホストする matrix.org のパブリックサーバーで無料アカウントを取得するか、ボランティアがホストしているパブリックサーバーから選択する。
    +Elementでは、どのサーバーを使うかをご自身で決めることができます。
    +1. 開発者が運営する matrix.org の公開サーバーで無料アカウントを取得するか、ボランティアが管理している運営サーバーから選ぶ。
     2. あなた自身がサーバーを運営し、アカウントを管理する。
    -3. Element Matrix Servicesのホスティングプラットフォームに加入し、カスタムサーバー上でアカウントを作る。
    +3. Element Matrix Servicesの運営プラットフォームに加入し、カスタムサーバー上でアカウントを作る。
     
     オープンなメッセージングとコラボレーション
    -Matrixネットワーク上の誰とでも、相手がElementや他のMatrixアプリを使っているか、さらには他のメッセージングアプリを使っているかに関わらず、チャットをすることができます。
    +相手がElement、他のMatrixアプリ、さらには他のメッセージングアプリを使っているかに関わらず、Matrixネットワーク上の誰とでもチャットをすることができます。
     
     非常に安全
    -本物のエンド・ツー・エンドの暗号化(会話に参加している人だけがメッセージを復号化できる)と、相互署名された端末の検証を行います。
    +本物のエンド・ツー・エンドの暗号化(会話に参加している人だけがメッセージを復号化できます)と、クロス署名による端末の認証が可能です。
     
     包括的なコミュニケーションと統合
    -メッセージング、音声およびビデオ通話、ファイル共有、画面共有、その他多くのインテグレーション、ボット、ウィジェットを提供します。ルームやコミュニティーを立ち上げて連絡を取り合い、物事をスムーズに成し遂げることができます。
    +メッセージング、音声およびビデオ通話、ファイル共有、画面共有、その他多くの機能統合、ボット、ウィジェットを提供します。ルームやコミュニティーを立ち上げて連絡を取り合い、物事をスムーズに成し遂げましょう。
     
    -中断からの再開
    -メッセージの履歴は全ての端末とウェブ(https://app.element.io)で完全に同期されるので、どこからでも連絡を取り合うことができます。
    +いつでも、どこにいても
    +メッセージの履歴は、全ての端末とウェブ(https://app.element.io)で完全に同期されるので、どこからでも連絡を取り合うことができます。
     
     オープンソース
    -Element AndroidはGitHubで開発されているオープンソースのプロジェクトです。 バグの報告や開発への貢献は https://github.com/vector-im/element-android にて受け付けています。
    +Element Androidは、GitHubで開発されているオープンソースのプロジェクトです。 不具合の報告や開発への貢献は https://github.com/vector-im/element-android にて受け付けています。
    
    From 4922d5f5ff6f48e96a077ed6ba643a44be272166 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= 
    Date: Fri, 11 Mar 2022 11:25:56 +0000
    Subject: [PATCH 051/126] Translated using Weblate (Icelandic)
    
    Currently translated at 65.3% (1409 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/is/
    ---
     vector/src/main/res/values-is/strings.xml | 1234 ++++++++++++++++++++-
     1 file changed, 1199 insertions(+), 35 deletions(-)
    
    diff --git a/vector/src/main/res/values-is/strings.xml b/vector/src/main/res/values-is/strings.xml
    index 07fe4b55be..714ec292e8 100644
    --- a/vector/src/main/res/values-is/strings.xml
    +++ b/vector/src/main/res/values-is/strings.xml
    @@ -4,9 +4,9 @@
         %1$s bauð %2$s
         %1$s bauð þér
         %1$s gekk í hópinn
    -    %1$s hætti
    +    %1$s hætti í spjallrásinni
         %1$s hafnaði boðinu
    -    %1$s sparkaði %2$s
    +    %1$s fjarlægði %2$s
         %1$s afbannaði %2$s
         %1$s bannaði %2$s
         %1$s breyttu auðkennismynd sinni
    @@ -20,10 +20,10 @@
         Villa í Matrix
         Tölvupóstfang
         Símanúmer
    -    %1$s tók til baka boð frá %2$s
    +    %1$s tók til baka boð til %2$s
         %1$s setti birtingarnafn sitt sem %2$s
         %1$s breytti birtingarnafni sínu úr %2$s í %3$s
    -    %1$s fjarlægði birtingarnafn sitt (%2$s)
    +    %1$s fjarlægði birtingarnafn sitt (sem var %2$s)
         %1$s breytti umræðuefninu í: %2$s
         %1$s breytti heiti spjallrásarinnar í: %2$s
         %s hringdi myndsamtal.
    @@ -38,7 +38,6 @@
         Tæki sendandans hefur ekki sent okkur dulritunarlyklana fyrir þessi skilaboð.
         Boð á spjallrás
         %1$s og %2$s
    -
         Tóm spjallrás
         Ljóst þema
         Dökkt þema
    @@ -80,7 +79,6 @@
         Samtöl
         Engar niðurstöður
         Spjallrásir
    -
         Senda atvikaskrá
         Senda hrunskrár
         Senda skjámynd
    @@ -121,14 +119,13 @@
         Taka þátt
         Hafna
         Listi yfir meðlimi
    -
         
             %d meðlimur
             %d meðlimir
         
         Fara af spjallrás
    -    Ertu viss um að þú viljir fara út spjallrásinni?
    -    BEINT SPJALL
    +    Ertu viss um að þú viljir fara úr spjallrásinni\?
    +    Bein skilaboð
         Bjóða
         %s er að skrifa…
         %1$s & %2$s eru að skrifa…
    @@ -145,7 +142,6 @@
         Leita
         Sía meðlimi spjallrásar
         Engar niðurstöður
    -
         Öll skilaboð
         Notandamynd
         Birtingarnafn
    @@ -180,7 +176,7 @@
         Veldu tungumál
         Breyta lykilorði
         eldra lykilorð
    -    nýtt lykilorð
    +    Nýtt lykilorð
         Mistókst að uppfæra lykilorð
         Lykilorðið þitt hefur verið uppfært
         Sýna öll skilaboð frá %s\?
    @@ -199,10 +195,10 @@
         Þema
         Afkóðunarvilla
         Heiti tækis
    -    Auðkenni tækis
    +    Auðkenni setu
         Dulritunarlykill tækis
         Flytja út
    -    Settu inn lykilsetningu (passphrase)
    +    Settu inn lykilsetningu
         Staðfestu lykilsetningu
         Flytja inn
         Sannreyna
    @@ -270,19 +266,18 @@
         Þér hefur verið sparkað úr %1$s af %2$s
         Þú hefur verið settur í bann á %1$s af %2$s
         Tilraunir
    -    Klaga efni
    +    Kæra efni
         Slóð á heimaþjón
         Ertu viss að þú viljir byrja raddsamtal?
         Ertu viss að þú viljir byrja myndsamtal?
    -    Fara í fyrstu ólesin skilaboð.
    +    Fara í ólesið
         Banna
         Afbanna
         Fela öll skilaboð frá þessum notanda
         Sýna öll skilaboð frá þessum notanda
    -    Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás
    +    Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás.
         Gat ekki sannreynt auðkenni fjartengds þjóns.
    -
    -    Bæta við flýtileið á aðalskjá
    +    Bæta við á upphafsskjá
         Hljóð með tilkynningu
         Virkja tilkynningar fyrir þennan notandaaðgang
         Virkja tilkynningar á þessu tæki
    @@ -294,7 +289,6 @@
         Heimildir fyrir tengiliði
         Alltaf birta tímamerki skilaboða
         Birta tímamerki á 12 stunda sniði (t.d. 2:30 fh)
    -
         Heimaþjónn
         Auðkennisþjónn
         Þetta tölvupóstfang er nú þegar í notkun.
    @@ -304,18 +298,16 @@
         Einungis meðlimir (síðan þeir skráðu sig)
         Innra auðkenni þessarar spjallrásar
         Veldu skrá yfir spjallrásir
    -    URL-slóð heimaþjóns
    +    Heiti heimaþjóns
         
             %d ólesið tilkynnt skilaboð
             %d ólesin tilkynnt skilaboð
         
    -
         Ertu viss um að þú viljir eyða viðmótshlutanum?
         Gat ekki búið til viðmótshluta.
         Mistókst að senda beiðni.
         Boðið
    -    Bönun notanda mun henda þeim út úr þessu herbergi og halda þeim frá því að koma aftur.
    -
    +    Bann á notanda mun henda honum út af þessari spjallrás og koma í veg fyrir að viðkomandi komi aftur.
         Skilaboð innihalda birtingarnafn mitt
         Skilaboð innihalda notandanafn mitt
         Skilaboð í maður-á-mann spjalli
    @@ -332,10 +324,8 @@
         Þú getur ekki afturkallað þessa aðgerð, þar sem þú ert að gefa notandanum jafn mikil völd og þú hefur sjálf/ur.
     \nErtu alveg viss\?
         Hlé milli tveggja samstillingarbeiðna
    -    Halda gögnum
    +    Halda myndefni
         Skoðaðu tölvupóstinn þinn og smelltu á tengilinn sem hann inniheldur. Þegar því er lokið skaltu smella á að halda áfram.
    -
    -
         Aðeins dulrita til sannvottaðra tækja
         Aldrei senda dulrituð skilaboð af þessu tæki til ósannvottaðra tækja.
         Völd verða að vera jákvæð heiltala.
    @@ -344,36 +334,1210 @@
         Vantar spjallrásarauðkenni í beiðni.
         Vantar notandaauðkenni í beiðni.
         Senda límmerki
    -
         Ekki var svarað á fjartengda endanum.
    -
    -
         ${app_name} þarf heimild til að nota hljóðnemann svo hægt sé að hringja hljóðsímtöl.
    -
         ${app_name} þarf heimild til að nota myndavélina og hljóðnemann svo hægt sé að hringja myndsímtöl.
     \n
     \nLeyfðu aðgang í næstu sprettgluggum til þess að geta hringt.
    -
    -
         Gera notandaaðgang óvirkann
         Gera notandaaðganginn minn óvirkann
         Senda greiningargögn
         Yfirfara núna
         Gera notandaaðgang óvirkann
         Gera notandaaðgang óvirkann
    -
         Lýstu villunni. Hvað varstu að gera? Hverju áttirðu von á? Hvað gerðist í raun?
         Til að geta greint vandamál eru atvikaskrár þessa forrits sendar með þessari villuskýrslu. Ef þú vilt einungis senda textann hér fyrir ofan, taktu þá gátmerkið úr reitnum:
         Það er eins og þú sért að hrista símann ákveðið. Myndirðu vilja senda villuskýrslu?
         Forritið hrundi síðast. Myndirðu vilja senda inn villuskýrslu?
         Senda límmerki
         ${app_name} safnar nafnlausum greiningargögnum til að gera okkur kleift að bæta forritið.
    -    Heimaskjár
    +    Upphafsskjár
         Festa spjallrásir með óskoðuðum tilkynningum
         Festa spjallrásir með ólesnum skilaboðum
         Sjálfgefið virkja forskoðun innfelldra vefslóða
         Þetta eru eiginleikar á tilraunastigi sem gætu bilað á óvæntan hátt. Notist með varúð.
         Setja sem aðalvistfang
    -    Ekki setja sem aðalvistfang
    +    Ekki hafa sem aðalvistfang
         Nauðsynlegt gildi vantar.
    +    Þú getur slökkt á þessu hvenær sem er í stillingunum
    +    Dulrituð skilaboð í hópaspjalli
    +    Dulrituð skilaboð í maður-á-mann spjalli
    +    Upphaf samstillingar:
    +\nHleð inn samtölunum þínum
    +\nÞetta getur tekið dálítinn tíma ef þú tekur þátt í mörgum spjallrásum
    +    Aðeins fólk sem hefur verið boðið getur fundið og tekið þátt
    +    Einka (einungis gegn boði)
    +    Þú getur sýsla- með tilkynningar í %1$s.
    +    Sjálfgefinn uppruni myndefnis
    +    Sjálfgefin þjöppun
    +    Sýslaðu með tölvupóstföng og símanúmer sem tengd eru við Matrix-aðganginn þinn
    +    Tölvupóstföng og símanúmer
    +    Lykilorðið er ekki gilt
    +    Utanaðkomandi aðgerðasöfn
    +    Hjálpaðu okkur að bæta ${app_name}
    +    Sýsla með uppgötvunarstillingarnar þínar.
    +    Smelltu á leskvittanir til að sjá ítarlegan lista.
    +    Birta leskvittanir
    +    Markdown-sníðing
    +    Láttu aðra sjá að þú sért að skrifa.
    +    Senda skriftilkynningar
    +    Umsýsla dulritunarlykla
    +    Dulrituð hópskilaboð
    +    Dulrituð bein skilaboð
    +    Bestun fyrir rafhlöðuendingu
    +    Birting tilkynninga
    +    Tilkynningar eru óvirkar í þessari setu.
    +\nYfirfarðu stillingar í ${app_name}.
    +    Tilkynningar eru virkar í þessari setu.
    +    Tilkynningar eru óvirkar fyrir notandaaðganginn þinn.
    +\nYfirfarðu stillingar aðgangsins.
    +    Tilkynningar eru virkar fyrir notandaaðganginn þinn.
    +    Tilkynningar eru óvirkar í kerfisstillingum.
    +\nYfirfarðu kerfisstillingarnar.
    +    Tilkynningar eru virkar í kerfisstillingum.
    +    Í keyrslu (%1$d af %2$d)
    +    Keyra prófanir
    +    Greining á vandamálum
    +    Leysa vandamál með tilkynningar
    +    Stikkorð mega ekki innihalda \'%s\'
    +    Stikkorð mega ekki byrja með \'.\'
    +    Bæta við nýju stikkorði
    +    Stikkorðin þín
    +    Minnst á og stikkorð
    +    Virkja tilkynningar í tölvupósti fyrir %s
    +    Til að fá tilkynningar í tölvupósti, þarf að tengja tölvupóstfang við Matrix-aðganginn þinn
    +    Tilkynning í tölvupósti
    +    Mikilvægi tilkynninga eftir atburðum
    +    Skráð út úr setunni!
    +    Spjallrásin hefur verið yfirgefin!
    +    Einungis þar sem er minnst á og stikkorð
    +    Sía bannaða notendur
    +    Úr spjallþræði
    +    Ábending: Ýttu lengi á skilaboð og notaðu “%s”.
    +    Spjallþræðir hjálpa til við að halda samræðum við efnið og gerir auðveldara að rekja þær.
    +    Haltu umræðum skipulögðum með spjallþráðum
    +    Birtir alla spjallþræði sem þú hefur tekið þátt í
    +    Birtir alla spjallþræði úr fyrirliggjandi spjallrás
    +    Spjallþræðirnir mínir
    +    Allir spjallþræðir
    +    Sía þræði spjallrásar
    +    Heimildir spjallrásar
    +    Þessi spjallrás er ekki opinber. Þú munt ekki geta tekið aftur þátt nema að vera boðið.
    +    Gefa heimild til að fá aðgang að tengiliðunum þínum.
    +    Til að skanna QR-kóða þarftu að veita aðgang að myndavélinni.
    +    Lýk símtali…
    +    Notandi upptekinn
    +    Þú settir símtalið í bið
    +    %s setti símtalið í bið
    +    Raddsímtal við %s
    +    Myndsamtal við %s
    +    Myndsamtal í gangi…
    +    
    +        Ósvarað myndsímtal
    +        %d ósvöruð myndsímtöl
    +    
    +    
    +        Ósvarað raddsímtal
    +        %d ósvöruð raddsímtöl
    +    
    +    Veldu hringitón fyrir símtöl:
    +    Innhringitónn
    +    Nota sjálfgefinn ${app_name} hringitón fyrir innhringingar
    +    Biðja um staðfestingu áður en símtal er hafið
    +    Koma í veg fyrir símtöl af slysni
    +    Þetta símanúmer er nú þegar skráð.
    +    Því miður, ekkert utankomandi forrit hefur fundist sem getur lokið þessari aðgerð.
    +    Í augnablikinu ertu ekki með neina límmerkjapakka virkjaða.
    +\n
    +\nBæta einhverjum við núna\?
    +    Veldu hljóðtæki
    +    ${app_name} símtal mistókst
    +    Senda tal
    +    Slóð á API-kerfisviðmót heimaþjóns
    +    Ef mögulegt, skaltu skrifa lýsinguna á ensku.
    +    Sýna allar spjallrásir í spjallrásalistanum, þar með taldar spjallrásir með viðkvæmu efni.
    +    Sýna spjallrásir með viðkvæmu efni
    +    Aðvaranir kerfis
    +    Afrita tengil á spjallþráð
    +    Taka úr birtingu
    +    Skoða spjallþræði
    +    Mistókst að fjarlægja viðmótshluta
    +    Mistókst að bæta við viðmótshluta
    +    Þú getur ekki byrjað símtal með sjálfum þér, bíddu eftir að þátttakendur samþykki boðið
    +    Þú getur ekki byrjað símtal með sjálfum þér
    +    Til að senda talskilaboð þarf að gefa heimild fyrir hljóðnema.
    +    Til að framkvæma þessa aðgerð þarf að gefa heimild fyrir myndavél í kerfisstillingum.
    +    Það vantar heimildir til að framkvæma þessa aðgerð, það þarf að gefa viðkomandi heimildir í kerfisstillingum.
    +    Hefja talfund
    +    Hefja myndfund
    +    Þú hefur ekki heimildir til að hefja símtal
    +    Þú hefur ekki heimildir til að hefja símtal á þessari spjallrás
    +    Þú hefur ekki heimildir til að hefja fjarfund
    +    Þú hefur ekki heimildir til að hefja fjarfund á þessari spjallrás
    +    Vantar heimildir
    +    Þú munt missa aðgang að dulrituðu skilaboðunum þínum nema þú takir öryggisafrit af dulritunarlyklum áður en þú skráir þig út.
    +    Öryggisafritun dulritunarlykla í gangi. Þú munt tapa dulrituðu skilaboðunum þínum ef þú skráir þig út núna.
    +    Þú munt tapa dulrituðu skilaboðunum þínum ef þú skráir þig út núna
    +    Þú kveiktir á enda-í-enda dulritun.
    +    %1$s kveikti á enda-í-enda dulritun.
    +    Taka öryggisafrit
    +    Öryggisafrita dulritunarlykla…
    +    Ég vil ekki dulrituðu skilaboðin mín
    +    Nota öryggisafrit af lykli
    +    Hlusta eftir tilkynningum
    +    Þú kveiktir á enda-í-enda dulritun (óþekkt algrími %1$s).
    +    %1$s kveikti á enda-í-enda dulritun (óþekkt algrími %2$s).
    +    Þú hefur bannað gestum að koma inn á spjallrásina.
    +    %1$s hefur bannað gestum að koma inn á spjallrásina.
    +    Þú hefur bannað gestum að koma inn á spjallrásina.
    +    %1$s hefur bannað gestum að koma inn á spjallrásina.
    +    Þú hefur leyft gestum að koma inn hér.
    +    %1$s hefur leyft gestum að koma inn hér.
    +    Þú hefur leyft gestum að koma inn á spjallrásina.
    +    %1$s hefur leyft gestum að koma inn á spjallrásina.
    +    
    +        Þú fjarlægðir varavistfangið %1$s af þessari spjallrás.
    +        Þú fjarlægðir varavistföngin %1$s af þessari spjallrás.
    +    
    +    
    +        %1$s fjarlægði varavistfangið %2$s af þessari spjallrás.
    +        %1$s fjarlægði varavistföngin %2$s af þessari spjallrás.
    +    
    +    
    +        Þú bættir við varavistfanginu %1$s fyrir þessa spjallrás.
    +        Þú bættir við varavistföngunum %1$s fyrir þessa spjallrás.
    +    
    +    
    +        %1$s bætti við varavistfanginu %2$s fyrir þessa spjallrás.
    +        %1$s bætti við varavistföngunum %2$s fyrir þessa spjallrás.
    +    
    +    Þú tókst til baka boð til %1$s. Ástæða: %2$s
    +    %1$s tók til baka boð til %2$s. Ástæða: %3$s
    +    Þú samþykktir boð um að taka þátt í %1$s. Ástæða: %2$s
    +    %1$s samþykkti boð um að taka þátt í %2$s. Ástæða: %3$s
    +    Þú bannaðir %1$s. Ástæða: %2$s
    +    %1$s bannaði %2$s. Ástæða: %3$s
    +    Þú tókst %1$s úr banni. Ástæða: %2$s
    +    %1$s tók %2$s úr banni. Ástæða: %3$s
    +    Þú fjarlægðir %1$s. Ástæða: %2$s
    +    %1$s fjarlægði %2$s. Ástæða: %3$s
    +    Þú hafnaðir boðinu. Ástæða: %2$s
    +    %1$s hafnaði boðinu. Ástæða: %2$s
    +    Þú hættir. Ástæða: %1$s
    +    %1$s hætti. Ástæða: %2$s
    +    Þú yfirgafst spjallrásina. Ástæða: %1$s
    +    %1$s yfirgaf spjallrásina. Ástæða: %2$s
    +    Þú tekur þátt. Ástæða: %1$s
    +    %1$s tekur þátt. Ástæða: %2$s
    +    Þú komst inn á spjallrásina. Ástæða: %1$s
    +    %1$s kom inn á spjallrásina. Ástæða: %2$s
    +    %1$s bauð þér. Ástæða: %2$s
    +    Þú bauðst %1$s. Ástæða: %2$s
    +    %1$s bauð %2$s. Ástæða: %3$s
    +    Boð um þátttöku til þín. Ástæða: %1$s
    +    Boð um þátttöku til %1$s. Ástæða: %2$s
    +    Upphaf samstillingar:
    +\nFlyt inn gögn úr notandaaðgangi
    +    Upphaf samstillingar:
    +\nFlyt inn samfélög
    +    Upphaf samstillingar:
    +\nFlyt inn yfirgefnar spjallrásir
    +    Upphaf samstillingar:
    +\nFlyt inn boð í spjallrásir
    +    Upphaf samstillingar:
    +\nFlyt inn spjallrásir
    +    Upphaf samstillingar:
    +\nFlyt inn dulritunargögn
    +    Upphaf samstillingar:
    +\nFlyt inn notandaaðgang…
    +    Upphaf samstillingar:
    +\nSæki gögn…
    +    Upphaf samstillingar:
    +\nBíð eftir svari frá netþjóni…
    +    Þú hefur ekki heimild til að taka þátt í þessari spjallrás
    +    Þú breyttir völdum %1$s.
    +    Þú breyttir %1$s viðmótshluta
    +    %1$s breytti %2$s viðmótshluta
    +    Þú fjarlægðir %1$s viðmótshluta
    +    %1$s fjarlægði %2$s viðmótshluta
    +    Þú bættir við %1$s viðmótshluta
    +    %1$s bætti við %2$s viðmótshluta
    +    Þú samþykktir boð um að taka þátt í %$s
    +    Þú afturkallaðir boðið til %1$s
    +    %1$s afturkallaði boðið til %2$s
    +    Þú afturkallaðir boð til %1$s um þátttöku í spjallrásinni
    +    %1$s afturkallaði boð til %2$s um þátttöku í spjallrásinni
    +    Þú bauðst %1$s
    +    Þú sendir boð til %1$s um þátttöku í spjallrásinni
    +    Þú fjarlægðir auðkennismynd spjallrásarinnar
    +    %1$s fjarlægði auðkennismynd spjallrásarinnar
    +    Þú fjarlægðir umfjöllunarefni spjallrásar
    +    Þú fjarlægðir heiti spjallrásar
    +    
    +        Breyting á ACL á %d netþjóni
    +        Breyting á ACL á %d netþjóni
    +    
    +    Þú gerðir skilaboð héðan í frá sýnileg fyrir %1$s
    +    Bæta við fólki
    +    🎉 Öllum netþjónum er núna bannað að taka þátt! Þessa spjallrás er ekki lengur hægt að nota.
    +    • Netþjónar sem samsvara IP-tölum eru núna bannaðir.
    +    • Netþjónar sem samsvara IP-tölum eru núna leyfðir.
    +    • Netþjónar sem samsvara %s voru fjarlægðir af listanum yfir leyfilegt.
    +    • Netþjónar sem samsvara %s eru núna leyfðir.
    +    • Netþjónar sem samsvara %s voru fjarlægðir af bannlistanum.
    +    • Netþjónar sem samsvara %s eru núna bannaðir.
    +    Þú breyttir ACL á netþjóni fyrir þessa spjallrás.
    +    %s breytti ACL á netþjóni fyrir þessa spjallrás.
    +    • Netþjónar sem samsvara IP-tölum eru bannaðir.
    +    • Netþjónar sem samsvara IP-tölum eru leyfðir.
    +    • Netþjónar sem samsvara %s eru leyfðir.
    +    • Netþjónar sem samsvara %s eru bannaðir.
    +    Þú stilltir ACL á netþjóni fyrir þessa spjallrás.
    +    %s stillti ACL á netþjóni fyrir þessa spjallrás.
    +    Þú uppfærðir hér.
    +    %s uppfærði hér.
    +    Þú uppfærðir þessa spjallrás.
    +    %s uppfærði þessa spjallrás.
    +    %1$s gerði skilaboð héðan í frá sýnileg fyrir %2$s
    +    Þú gerðir ferilskrá spjallrásar héðan í frá sýnilega fyrir %1$s
    +    Þú laukst símtalinu.
    +    Þú svaraðir símtalinu.
    +    Þú sendir gögn til að setja upp samtalið.
    +    %s sendi gögn til að setja upp samtalið.
    +    Þú hringdir raddsamtal.
    +    Þú hringdir myndsamtal.
    +    Þú breyttir heiti spjallrásarinnar í: %1$s
    +    Þú breyttir auðkennismynd spjallrásarinnar
    +    %1$s breytti auðkennismynd spjallrásarinnar
    +    Þú breyttir umræðuefninu í: %1$s
    +    Þú fjarlægðir birtingarnafn þitt (sem var %1$s)
    +    Þú breytti birtingarnafni þínu úr %1$s í %2$s
    +    Þú settir birtingarnafn þitt sem %1$s
    +    Opna könnun
    +    Spila talskilaboð
    +    Þú þarft heimild til að uppfæra spjallrás
    +    Vertu þolinmóð/ur Þetta getur tekið nokkra stund.
    +    Opið öllum, best fyrir dreifða hópa
    +    Aðvara án hljóðs
    +    Aðvara með hljóði
    +    Opna emoji-tánmyndaval
    +    Skipta um auðkennismynd
    +    Opna viðmótshluta
    +    Virkt samtal (%1$s)
    +    Talnaborð
    +    Nýtt PIN-númer
    +    Opna notkunarskilmála %s
    +    Önnur tiltæk tungumál
    +    🔐️ Vertu með mér á ${app_name}
    +    Veldu þér lykilorð.
    +    Veldu þér notandanafn.
    +    Aðeins stutt í dulrituðum spjallrásum
    +    Settu inn endurheimtulykil
    +    Ný innskráning. Varst þetta þú\?
    +    Flugvélahamur er virkur
    +    Ekki treyst
    +    Sérsniðið (%1$d) í %2$s
    +    Sjálfgefið í %1$s
    +    Umsjónarmaður í %1$s
    +    Stjórnandi í %1$s
    +    Stjórnendur
    +    
    +        Einn aðili
    +        %1$d aðilar
    +    
    +    Aðgerðir stjórnanda
    +    Ekki öruggt
    +    Birta villuleitarupplýsingar á skjá
    +    Aðrar setur
    +    Úreltur heimaþjónn
    +    Athugaðu tölvupóstinn þinn
    +    Símanúmer lítur út fyrir að vera ógilt. Yfirfarðu það
    +    Nota alþjóðlega sniðið.
    +    Nýtt lykilorð
    +    Opna valmyndina til að útbúa spjallrás
    +    Settu inn slóð auðkennisþjónsins
    +    Engar breytingar fundust
    +    Aðrar tilkynningar frá utanaðkomandi aðilum
    +    Ekkert netkerfi. Athugaðu nettenginguna þína.
    +    Atburður undir umsjón stjórnanda spjallrásar
    +    Eyða öryggisafriti
    +    Öryggisafrit endurheimti %s !
    +    Settu inn endurheimtulykil
    +    Aflæsi ferli
    +    Flyt inn dulritunarlykla…
    +    Næ í dulritunarlykla…
    +    Reikna endurheimtulykil…
    +    Endurheimti úr öryggisafriti:
    +    Settu inn endurheimtulykil
    +    Endurheimtulykill
    +    Deila endurheimtulykli með…
    +    Gera afrit
    +    Endurheimtulykillinn hefur verið vistaður.
    +    Vista endurheimtulykil
    +    Ég hef gert afrit
    +    Því miður, villa kom upp
    +    Smelltu hér til að sjá eldri skilaboð
    +    Markdown-texti hefur verið gerður óvirkur.
    +    Markdown-texti hefur verið gerður virkur.
    +    Birtir upplýsingar um notanda
    +    Markdown-texti af/á
    +    Skilgreindu völd notanda
    +    Loka á allt
    +    Auðkenni viðmótshluta
    +    Þemað þitt
    +    Notandaauðkennið þitt
    +    Vefslóð á auðkennismyndina þína
    +    Birtingarnafnið þitt
    +    Þessum viðmótshluta var bætt við af:
    +    %1$s: %2$s %3$s
    +    ** Mistókst að senda - opnaðu spjallrásina
    +    %1$s í %2$s og %3$s
    +    
    +        %1$s: %2$d skilaboð
    +        %1$s: %2$d skilaboð
    +    
    +    
    +        %d boð
    +        %d boð
    +    
    +    Þessi netþjónn er nú þegar á listanum
    +    Fann ekki þennan netþjón eða spjallrásalista hans
    +    Sláðu inn nafn nýja netþjónsins sem þú vilt skoða.
    +    óþekkt IP-vistfang
    +    Sýsla með öryggisafrit dulritunarlykla
    +    Endurheimt dulritaðra skilaboða
    +    Útflutningur dulritunarlykla tókst
    +    Önnur svæði sem þú gætir ekki vitað um
    +    Spila hljóð við myndatöku
    +    Engin samstilling í bakgrunni
    +    Bestað gagnvart rauntíma
    +    Bestað gagnvart rafhleðslu
    +    Hamur samstillingar í bakgrunni
    +    Láta mig vita fyrir
    +    Engu tölvupóstfangi hefur verið bætt við notandaaðganginn þinn
    +    Engu símanúmeri hefur verið bætt við notandaaðganginn þinn
    +    Mistókst að koma á rauntímatengingu.
    +\nBiddu kerfisstjóra heimaþjónsins þíns um að setja upp TURN-þjón til að tryggja að símtöl virki eðlilega.
    +    %1$s úr %2$s í %3$s
    +    %1$s breytti völdum %2$s.
    +    Stjórnandi
    +    Þú breyttir auðkennismyndinni þinni
    +    Þú tókst til baka boð til %1$s
    +    Þú bannaðir %1$s
    +    Þú afbannaðir %1$s
    +    Þú fjarlægðir %1$s
    +    Þú hafnaðir boðinu
    +    Þú hættir í spjallrásinni
    +    %1$s hætti í spjallrásinni
    +    Þú hættir í spjallrásinni
    +    Þú gekkst í hópinn
    +    Þú gekkst í spjallrásina
    +    Þú bauðst %1$s
    +    Þú bjóst til umræðuna
    +    %1$s bjó til umræðuna
    +    Þú bjóst til spjallrásina
    +    %1$s bjó til spjallrásina
    +    %s gekk í hópinn.
    +    Þú stilltir aðalvistfang spjallrásarinnar sem %1$s.
    +    Sérsniðin kæra…
    +    Sýna allar spjallrásir á forsíðu
    +    Sýsla með spjallrásir og svæði
    +    Sýsla með spjallrásir
    +    Svæði eru ný leið til að hópa fólk og spjallrásir.
    +    Bæta við fyrirliggjandi svæðum
    +    Bæta við fyrirliggjandi spjallrásum
    +    Yfirgefa svæði
    +    Bæta við spjallrásum
    +    Kanna spjallrásir
    +    Búa til svæði
    +    Ég og félagar í teyminu mínu
    +    Bara ég
    +    Einkasvæðið þitt
    +    Opinbera svæðið þitt
    +    Bæta við svæði
    +    Einkasvæði
    +    Opinbert svæði
    +    Uppfærir spjallrás í nýja útgáfu
    +    Búa til svæði
    +    Almenningsspjallrás
    +    Eyða auðkennismynd
    +    Það kom upp villa við að fletta upp símanúmerinu
    +    Sendir skilaboðið með snjókomu
    +    Sendir skilaboðið með skrauti
    +    Uppfærsla dulritunar tiltæk
    +    Sendir skilaboð sem óbreyttur texti án þess að túlka það sem markdown
    +    Dulritun ekki virk
    +    Skilaboð í þessari spjallrás eru enda-í-enda dulrituð.
    +    Kerfisstjóri netþjónsins þíns hefur lokað á sjálfvirka dulritun í einkaspjallrásum og beinum skilaboðum.
    +    Stillingar spjallrásar
    +    Skilaboð í þessari spjallrás eru ekki enda-í-enda dulrituð.
    +    Límmerki
    +    Útbý svæði…
    +    Settu inn vistfang spjallrásar
    +    Þetta vistfang er nú þegar í notkun
    +    Vistfang svæðis
    +    Eftir að kveikt er á dulritun er ekki hægt að slökkva á henni.
    +    Setur ( ͡° ͜ʖ ͡°) framan við hrein textaskilaboð
    +    Setur ¯\\_(ツ)_/¯ framan við hrein textaskilaboð
    +    Þetta lítur ekki út eins og gilt tölvupóstfang
    +    Skrá tölvupóstfang
    +    Sláðu inn vistfang netþjónsins sem þú vilt nota
    +    Sláðu inn vistfang Modular Element-þjóns eða netþjónsins sem þú vilt nota
    +    Vistfang fyrir Element Matrix þjónustur
    +    Skrá inn í %1$s
    +    Tengjast við %1$s
    +    Skrá inn með %s
    +    Teymi
    +    Vinir og fjölskylda
    +    Sendir skilaboðin sem stríðni
    +    Stillingar spjallrásar
    +    Hunsa notanda
    +    Snúa og skera utan af
    +    Límmerki
    +    Bæta við mynd frá
    +    Búa til nýja spjallrás
    +    Samþykktu þjónustuskilmála auðkennisþjónsins (%s) svo hægt sé að finna þig með tölvupóstfangi eða símanúmeri.
    +    Þú ert núna að deila tölvupóstföngum eða símanúmerum á auðkennisþjóninum %1$s. Þú þarft að tengjast aftur við %2$s til að hætta að deila þessu.
    +    Finnanleg tölvupóstföng
    +    Búa til nýja spjallrás
    +    Notaðu vélmenni, viðmótshluta og límmerkjapakka
    +    Sýsla með samþættingar
    +    Leyfðu \'Sýsla með samþættingar\' í stillingunum til að gera þetta.
    +    Samþættingar eru óvirkar
    +    Samþættingarstýring
    +    Leyfa samþættingar
    +    Sýna lyklaborð með tjáningartáknum
    +    Senda skilaboð með \'Enter\'
    +    Hefur ekki áhrif á boð/fjarlægingu/bönn.
    +    Birta taka-þátt og hætta skilaboð
    +    Notaðu samþættingarstýringu til að stýra vélmennum, viðmótshlutum og límmerkjapökkum.
    +\nSamþættingarstýringar taka við stillingagögnum og geta breytt viðmótshlutum, sent boð í spjallrásir, auk þess að geta úthlutað völdum fyrir þína hönd.
    +    Samþættingar
    +    Þetta er upphaf ferils beinna skilaboða með %s.
    +    Bein skilaboð
    +    Leita að heiti
    +    Leita eftir heiti, auðkenni eða tölvupóstfangi
    +    Nafn eða auðkenni (#example:matrix.org)
    +    Skoða spjallrásalistann
    +    Senda ný bein skilaboð
    +    Breytingar á skilaboðum
    +    Þjappa myndskeiði %d%%
    +    Þjappa mynd…
    +    Sendi skrá (%1$s / %2$s)
    +    Dulrita skrá…
    +    Öll samfélög
    +    Sýna fjarlægð skilaboð
    +    Þú átt engin fleiri ólesin skilaboð
    +    Boðið af %s
    +    Sendi þér boð
    +    Svara í spjallþræði
    +    Allir lyklar öryggisafritaðir
    +    Setja upp á þessu tæki
    +    Varið öryggisafrit
    +    Búa til svæði
    +    Einungis gegn boði, best fyrir þig og lítinn hóp
    +    Fara í fyrstu leskvittun
    +    Sannprófa þessa setu
    +    Þau samsvara ekki
    +    Þau samsvara
    +    Fela ítarlegt
    +    Birta ítarlegt
    +    Hreinsa öll gögn
    +    Þú hefur verið skráður út úr öllum setum og munt ekki lengur fá ýti-tilkynningar. Til að endurvirkja tilkynningar, þarf að skrá sig aftur inn á hverju tæki fyrir sig.
    +    Eigðu samtölin þín.
    +    Aftengja auðkennisþjón
    +    Umsagnir um svæði
    +    Birta frátökutákn fyrir fjarlægð skilaboð
    +    Eftir að þetta hefur verið virkjað, muntu geta sent staðsetninguna þína á hvaða spjallrás sem er
    +    Niðurstöður birtast einungis eftir að þú hefur lokað könnuninni
    +    Kjósendur sjá niðurstöðurnar þegar þeir hafa kosið
    +    
    +        Lokaniðurstöður byggðar á %1$d atkvæði
    +        Lokaniðurstöður byggðar á %1$d atkvæðum
    +    
    +    
    +        %1$d atkvæði greitt. Greiddu atkvæði til að sjá útkomuna
    +        %1$d atkvæði greidd. Greiddu atkvæði til að sjá útkomuna
    +    
    +    Næ ekki að tengjast heimaþjóni á þessari slóð, athugaðu slóðina
    +    réttur valkostur
    +    Spurning eða viðfangsefni
    +    Endurræstu forritið til að breytingin taki gildi.
    +    Virkja LaTeX-stærðfræði
    +    Tengja þetta tölvupóstfang við notandaaðganginn þinn
    +    
    +        %1$d til viðbótar
    +        %1$d til viðbótar
    +    
    +    Birta skilaboðablöðrur
    +    Mistókst að hlaða inn landakorti
    +    Myndgera staðsetningu notenda á tímalínunni
    +    Virkja deilingu staðsetninga
    +    ${app_name} gat ekki fengið staðsetninguna þína. Reyndu aftur síðar.
    +    ${app_name} gat ekki fengið staðsetninguna þína
    +    Lokuð könnun
    +    Ljúka könnun
    +    Ljúka þessari könnun\?
    +    Ljúka könnun
    +    Engin atkvæði greidd
    +    
    +        Byggt á %1$d atkvæði
    +        Byggt á %1$d atkvæðum
    +    
    +    
    +        %1$d atkvæði
    +        %1$d atkvæði
    +    
    +    
    +        Það þarf allavega %1$s valkost
    +        Það þarf allavega %1$s valkosti
    +    
    +    Spurning má ekki vera auð
    +    Set upp öryggisafrit af lykli
    +    Útbý öruggislykil úr lykilsetningu
    +    Lykilsetning endurheimtu
    +    Notaðu lykilsetningu endurheimtu eða dulritunarlykil
    +    Sýsla með í öryggisafriti dulritunarlykla
    +    Nota öryggisafrit af lykli
    +    Verja öryggisafrit
    +    Eyða öryggisafriti
    +    Athuga ástand öryggisafrits
    +    Eyði öryggisafriti…
    +    Öryggisafrit af lyklum er ekki virkt í þessari setu.
    +    
    +        %d nýjum lykli hefur verið bætt við þessa setu.
    +        %d nýjum lyklum hefur verið bætt við þessa setu.
    +    
    +    
    +        Endurheimti öryggisafrit með %d lykli.
    +        Endurheimti öryggisafrit með %d lyklum.
    +    
    +    Ef þú veist ekki lykilsetningu fyrir endurheimtu, geturðu %s.
    +    notað endurheimtulykilinn þinn
    +    Öryggisafrit er þegar til staðar á heimaþjóninum þínum
    +    (Ítarlegt) Settu upp með endurheimtulykli
    +    Bý til öryggisafrit
    +    Stilla lykilsetningu
    +    Verðu öryggisafritið þitt með lykilsetningu.
    +    Byrja að nota öryggisafrit dulritunarlykla
    +    Lykilsetning er of veik
    +    Settu inn lykilsetningu
    +    Lykilsetningar samsvara ekki
    +    Búa til lykilsetningu
    +    Útbúðu lykilsetningu til að dulrita útfluttu dulritunarlyklana. Þú þarft að setja inn sama lykilsetningu til að geta flutt aftur inn þessa dulritunarlykla.
    +    Renna til að ljúka símtalinu
    +    Tapaðu aldrei dulrituðum skilaboðum
    +    Endilega %s til að halda áfram að nota þessa þjónustu.
    +    Endilega %s til að fá þessi takmörk hækkuð.
    +    Þessi heimaþjónn er kominn fram yfir takmörk á mánaðarlega virkum notendum.
    +     Þessi heimaþjónn er kominn fram yfir takmörk á mánaðarlega virkum notendum þannig að sumir notendur munu ekki geta skráð sig inn.
    +    Þessi heimaþjónn er kominn fram yfir takmörk á tilföngum sínum.
    +    Þessi heimaþjónn er kominn fram yfir takmörk á tilföngum sínum þannig að sumir notendur munu ekki geta skráð sig inn.
    +    hafðu samband við kerfisstjóra þjónustunnar þinnar
    +    Þessi spjallrás er framhald af öðru samtali
    +    Samtalið heldur áfram hér
    +    Þessari spjallrás hefur verið skipt út og er hún ekki lengur virk.
    +    Til að halda áfram að nota %1$s heimaþjóninn þarftu að yfirfara og samþykkja skilmálana og kvaðir.
    +    Til að laga umsýslu Matrix-forrita
    +    Beiðni um deilingu dulritunarlykils
    +    Þú verður að samþykkja þjónustuskilmálana til að geta haldið áfram.
    +    Ræstu myndavél kerfisins í stað sérsniðna myndavélaskjásins.
    +    Þessi viðmótshluti vill nota eftirfarandi tilföng:
    +    Fara af fyrirliggjandi fjarfundi og skipta yfir í hinn\?
    +    Því miður, villa kom upp við að reyna að tengjast fjarfundinum
    +    Því miður, fjarfundasímtöl með Jitsi eru ekki studd á eldri tækjum (tæki með Android OS minna en 6.0)
    +    Afturkalla aðgang fyrir mig
    +    Mistókst að hlaða inn viðmótshluta.
    +\n%s
    +    Að nota það gæti deilt gögnum með %s:
    +    Að nota það gæti stillt vefkökur og deilt gögnum með %s:
    +    Ef þetta samsvarar ekki, getur verið að samskiptin þín séu berskjölduð.
    +    Staðfestu með því að bera eftirfarandi saman við \'Stillingar notanda\' í hinni setunni þinni:
    +    
    +        Tókst að flytja inn%1$d/%2$d dulritunarlykli.
    +        Tókst að flytja inn%1$d/%2$d dulritunarlyklum.
    +    
    +    Veldu hvaða svæði hafa aðgang að þessari spjallrás. Ef svæði er valið geta meðlimir þess fundið og tekið þátt í spjallrásinni.
    +    Hver sem er á svæði með þessari spjallrás getur fundið hana og tekið þátt í henni. Aðeins stjórnendur spjallrásarinnar geta bætt henni í svæði.
    +    Hver sem er getur látið vita af sér á spjallrásinni, meðlimir geta þá samþykkt eða hafnað
    +    Mistókst að fá sýnileika spjallrásar á spjallrásaskrá (%1$s).
    +    Svæði sem þú veist að innihalda þessa spjallrás
    +    Veldu hverjir geta fundið spjallrásina og tekið þátt.
    +    Svæði sem hafa aðgang
    +    Leyfa meðlimum svæðis að finna og fá aðgang.
    +    Meðlimir svæðisins %s geta fundið, forskoðað og tekið þátt.
    +    Óþekkt aðgangsstilling (%s)
    +    Birta þessa spjallrás opinberlega á skrá %1$s yfir spjallrásir\?
    +    Einungis meðlimir svæðis
    +    Hver sem er getur fundið svæðið og tekið þátt
    +    Hver sem er getur fundið spjallrásina og tekið þátt
    +    Birta falda atburði í tímalínu
    +    Hjálp og um
    +    Rödd og myndband
    +    Stillingar spjallrásar
    +    Umfjöllunarefni spjallrásar (valkvætt)
    +    Skipta um netkerfi
    +    Búa til nýtt svæði
    +    Viðbrögð
    +    Skoða viðbrögð
    +    Bæta við viðbrögðum
    +    Viðbrögð
    +    Þú hefur klárað að lesa allt!
    +    Skoða á spjallrás
    +    Breytir auðkennismyndinni þinni einungis í fyrirliggjandi spjallrás
    +    Breytir auðkennismyndinni einungis í fyrirliggjandi spjallrás
    +    Breytir birtu gælunafni þínu einungis í fyrirliggjandi spjallrás
    +    Fjarlægir notanda með uppgefið auðkenni úr þessari spjallrás
    +    Stilla umfjöllunarefni spjallrásar
    +    Gengur til liðs við spjallrás með uppgefnu vistfangi
    +    Býður notanda með uppgefið auðkenni í fyrirliggjandi spjallrás
    +    Stillir heiti spjallrásar
    +    Hunsar notanda, felur skilaboð viðkomandi fyrir þér
    +    Bannar notanda með uppgefið auðkenni
    +    Engir virkir viðmótshlutar
    +    Nota hljóðnemann
    +    Nota myndavélina
    +    Hlaða inn viðmótshluta
    +    Nýtt boð
    +    Netþjónninn þinn
    +    Útgáfa spjallrásar
    +    
    +        %d bannaður notandi
    +        %d bannaðir notendur
    +    
    +    %1$s, %2$s, %3$s og %4$s
    +    Villa í SSL.
    +    Veldu heimaþjón
    +    Skrá inn með einfaldri innskráningu (single sign-on)
    +    Nota sem sjálfgefið og ekki spyrja aftur
    +    Kveikja á HD
    +    Slökkva á HD
    +    Skipta á milli myndavéla
    +    Þráðlaus heyrnartól
    +    Tilkynning á spjallrás
    +    Notendur
    +    Tilkynna öllum á spjallrásinni
    +    Sýna minna
    +    Deila staðsetningu
    +    Búa til könnun
    +    Opna tengiliði
    +    Senda límmerki
    +    Hlaða inn skrá
    +    Senda myndir og myndskeið
    +    Opna myndavél
    +    Opna með
    +    Deila staðsetningu
    +    Landakort
    +    Deila staðsetningu
    +    Staðsetning
    +    Deila staðsetningu
    +    Tegund könnunar
    +    Breyta könnun
    +    Fjarlægja könnun
    +    Atkvæði greitt
    +    ÚTBÚA KÖNNUN
    +    BÆTA VIÐ VALKOSTI
    +    Búa til valkosti
    +    Búa til könnun
    +    %1$ds eftir
    +    Eyða upptöku
    +    Stöðva upptöku
    +    Uppfærsla er nauðsynleg
    +    Uppfæra
    +    Nafnlaus spjallrás
    +    Tillaga
    +    Ljúka uppsetningu
    +    Sleppa í bili
    +    Deila tengli
    +    Bjóða fólki
    +    Lýsing
    +    Slembið
    +    Almennt
    +    Einka
    +    Opinbert
    +    Eyða ósendum skilaboðum
    +    Mistókst
    +    Sent
    +    Sendi
    +    Atburður sendur!
    +    Ekkert efni
    +    Stöðulykill
    +    Tegund
    +    Senda sérsniðinn atburð
    +    Skoða stöðu spjallrásar
    +    Ekki tiltækt
    +    Ónettengt
    +    Nettengt
    +    Ekki tilkynna
    +    Ekki skoðað
    +    Athugað
    +    Valið
    +    Myndskeið
    +    Mynd
    +    Skjámynd
    +    Tókst ekki að auðkenna
    +    Óþekktur einstaklingur
    +    Notendur
    +    Flutningur
    +    Tengjast
    +    Virkt samtal (%1$s) ·
    +    
    +        Virkt samtal ·
    +        %1$d virk samtöl ·
    +    
    +    Ekkert svar
    +    Innhringing myndsamtals
    +    Innhringing raddsamtals
    +    Hringja til baka
    +    Þessu símtali er lokið
    +    Henda breytingum
    +    Breyta PIN-númeri
    +    Virkja PIN-númer
    +    Gleymt PIN-númer\?
    +    Settu inn PIN-númerið þitt
    +    Staðfestu PIN-númer
    +    
    +        %d færsla
    +        %d færslur
    +    
    +    Tengiliðaskrá
    +    KANNA NÁNAR
    +    NÁÐI ÞVÍ
    +    Stilla auðkennismynd
    +    Umfjöllunarefni
    +    Nafn spjallrásar
    +    Setja upp
    +    Ræsa myndavélina
    +    Stöðva myndavélina
    +    Kveikja á hljóðnema
    +    Þagga niður í hljóðnema
    +    Opna spjall
    +    Hlutverk
    +    Stilla hlutverk
    +    Senda inn
    +    Nota %1$s
    +    Núverandi tungumál
    +    Bjóða vinum
    +    Bjóða notendum
    +    BJÓÐA
    +    Ódulritað
    +    Frumstilla allt
    +    Gat ekki vistað myndefnisskrá
    +    Skilaboð…
    +    Leysa vandamál
    +    "Umfjöllunarefni: "
    +    Dulritun virk
    +    Ljúka
    +    Hætt við staðfestingu
    +    Endurlesa
    +    Staðfesta fjarlægingu
    +    Fjarlægja…
    +    Tenging við netþjón hefur rofnað
    +    Nei
    +    
    +    QR-kóði
    +    Endurstilla dulritunarlykla
    +    Treyst
    +    Setur
    +    Aðvörun
    +    Sannreynt
    +    Sannreyna
    +    óstöðug
    +    stöðug
    +    Sjálfgefin útgáfa
    +    Útgáfa á þjóni
    +    Heiti þjóns
    +    Virkja dulritun
    +    Virkja dulritun\?
    +    Tímalína
    +    Hætta að hunsa
    +    Notendur
    +    Boðsgestir
    +    Sérsniðið
    +    Umsjónarmenn
    +    Fara út
    +    Fara af spjallrás
    +    Innsendingar
    +    Tilkynningar
    +    Stillingar
    +    Meira
    +    Kanna nánar
    +    Öryggi
    +    Bíð…
    +    Könnun
    +    Skrá
    +    Tal
    +    Hljóð
    +    Mynd.
    +    Myndskeið.
    +    Virkja dulritun
    +    Núverandi seta
    +    Stillingar
    +    Ítarlegar stillingar
    +    Lýsingin er of stutt
    +    Hreinsa gögn
    +    Lykilorð
    +    Skrá inn
    +    Skrá inn
    +    Matrix-auðkenni
    +    Aðvörun
    +    Næsta
    +    Lykilorð
    +    Notandanafn
    +    Notandanafn eða tölvupóstfang
    +    Næsta
    +    Settu inn kóða
    +    Staðfestu símanúmer
    +    Næsta
    +    Símanúmer (valfrjálst)
    +    Símanúmer
    +    Næsta
    +    Tölvupóstfang (valfrjálst)
    +    Tölvupóstur
    +    Könnuninni er lokið
    +    Valkostur %1$d
    +    Spurning eða viðfangsefni könnunar
    +    Aðvörun
    +    Lykilorðið þitt hefur verið endurstillt.
    +    Tókst!
    +    Ég hef staðfest tölvupóstfangið mitt
    +    Halda áfram
    +    Aðvörun!
    +    Tölvupóstur
    +    Næsta
    +    Vistfang
    +    Hreinsa vinnsluferil
    +    Skrá inn
    +    Nýskrá
    +    Halda áfram
    +    einfaldri innskráningu (single sign-on)
    +    Skrá inn með %s
    +    Halda áfram með %s
    +    Eða
    +    Annað
    +    Kanna nánar
    +    Ég er nú þegar með notandaaðgang
    +    Stofna aðgang
    +    Komast í gang
    +    Tengjast þjóni
    +    Samfélög
    +    Ólesin skilaboð
    +    Fjarlægja úr eftirlætum
    +    Bæta í eftirlæti
    +    Stillingar
    +    Þagga niður
    +    Aðeins minnst á
    +    Öll skilaboð
    +    Öll skilaboð (hávært)
    +    Tilkynnt sem óviðeigandi
    +    Tilkynnt sem ruslpóstur
    +    Efni tilkynnt
    +    KÆRA
    +    Ástæður fyrir kæru á þessu efni
    +    Kæra þetta efni
    +    Þetta er óviðeigandi
    +    Þetta er ruslpóstur
    +    %1$s kl. %2$s
    +    SKRÁR
    +    MYNDEFNI
    +    %1$d af %2$d
    +    Staðsetning
    +    Könnun
    +    Myndasafn
    +    Myndavél
    +    Tengiliður
    +    Skrá
    +    Opna leiðsagnarsleðann
    +    Kóði
    +    Auðkennisþjónn
    +    Þjónustuskilmálar
    +    Skoða breytingaskrá
    +    Tillögur
    +    QR-kóði
    +    Tengill afritaður á klippispjald
    +    (breytt)
    +    Bíð…
    +    Bein skilaboð
    +    Gefðu umsögn
    +    Umsagnir
    +    Kerfisstillingar
    +    Útgáfur
    +    Hjálp og aðstoð
    +    Hjálp
    +    Snið:
    +    Slóð:
    +    Öryggi og gagnaleynd
    +    Kjörstillingar
    +    Almennt
    +    Opinbert
    +    Umfjöllunarefni
    +    Heiti
    +    Nafn spjallrásar
    +    ÚTBÚA
    +    Bein skilaboð
    +    Spjallrásir
    +    Bíddu aðeins…
    +    Búa til nýja spjallrás
    +    Skilaboðum eytt
    +    Spjallrásir
    +    Samtöl
    +    Reyna aftur
    +    Svara
    +    Breyta
    +    Óþekkt villa
    +    Náði því
    +    Sannreynt!
    +    Undirritun
    +    Reiknirit
    +    Útgáfa
    +    Endurheimta úr öryggisafriti
    +    Ertu viss\?
    +    Óvænt villa
    +    Stöðva
    +    Skipta út
    +    Vista sem skrá
    +    Deila
    +    Lokið
    +    Tókst !
    +    (Ítarlegt)
    +    %d+
    +    %1$s: %2$s
    +    fella saman
    +    fletta út
    +    Settu inn lykilorðið þitt.
    +    Settu inn notandanafn.
    +    Þögult
    +    Breytir birtu gælunafni þínu
    +    Fara af spjallrás
    +    Birtir aðgerð
    +    Hunsa
    +    Deila
    +    Lesa DRM-varið myndefni
    +    Leyfa
    +    Auðkenni spjallrásar
    +    Opna í vafra
    +    Endurlesa viðmótshluta
    +    Viðmótshluti
    +    Virkir viðmótshlutar
    +    SKOÐA
    +    %1$s: %2$s
    +    Ég
    +    Ný skilaboð
    +    Spjallrás
    +    Nýr atburður
    +    %1$s og %2$s
    +    
    +        %d tilkynning
    +        %d tilkynningar
    +    
    +    Bæta við nýjum þjóni
    +    Opinbert
    +    Einka
    +    Staðvær vistföng
    +    Gefa út
    +    Aðgangur að spjallrás
    +    Stillingar notandaaðgangs
    +    Veldu
    +    Veldu
    +    Myndefni
    +    Lykilorð
    +    hér
    +    Forskoða myndefni fyrir sendingu
    +    
    +        %d sekúnda
    +        %d sekúndur
    +    
    +    Skilaboð frá vélmennum
    +    Boð á spjallrás
    +    Stikkorð
    +    \@spjallrás
    +    Hópskilaboð
    +    Bein skilaboð
    +    Notandanafnið mitt
    +    Birtingarnafn mitt
    +    Virkja í ræsingu
    +    Bæta við notandaaðgangi
    +    Sérsniðnar stillingar.
    +    Virkja
    +    Setustillingar.
    +    Virkja
    +    Stillingar notandaaðgangs.
    +    Opna stillingar
    +    Kerfisstillingar.
    +    Annað
    +    Sjálfgefnar tilkynningar
    +    Ítarlegar stillingar á tilkynningum
    +    Fjarlægja %s\?
    +    Símanúmer
    +    Tölvupóstföng
    +    Ekkert
    +    Sía
    +    Spjallþræðir
    +    Spjallþráður
    +    
    +        %d valið
    +        %d valið
    +    
    +    Breyta stillingum
    +    Bjóða notendum
    +    Heimildir
    +    %1$s og %2$s
    +    Taka notanda úr banni
    +    Banna notanda
    +    Fjarlægja notanda
    +    Lækka niður um stig
    +    Ekkert svar
    +    Bíða
    +    Halda áfram
    +    Símtöl
    +    Alltaf spyrja
    +    Aftan
    +    Fram
    +    Heyrnartól
    +    Hátalari
    +    Sími
    +    Svæði
    +    Skrá yfir spjallrásir
    +    Ekki fleiri niðurstöður
    +    Tilkynningar
    +    Nýtt gildi
    +    Tókst
    +    Villa
    +    Endurstilla
    +    Hafna
    +    Spila
    +    Aftengjast
    +    Afturkalla
    +    Sækja
    +    Hafna
    +    Hunsa
    +    Sleppa
    +    Samþykkja
    +    Breyta
    +    Samþykki
    +    Ekki núna
    +    Virkja
    +    Skipta um
    +    Bæta við
    +    Ýttu til að breyta svæðum
    +    Veldu svæði
    +    Hætta að birta þetta vistfang
    +    Birta þetta vistfang
    +    Bæta við staðværu vistfangi
    +    Þessi spjallrás er ekki með nein staðvær vistföng
    +    Stilltu vistföng fyrir þessa spjallrás svo notendur geti fundið hana í gegnum heimaþjóninn þinn (%1$s)
    +    Nýtt birt vistfangs (t.d. #samnefni:netþjónn)
    +    Engin önnur birt vistföng ennþá.
    +    Engin önnur birt vistföng ennþá, bættu einu við hér fyrir neðan.
    +    Eyða vistfanginu \"%1$s\"\?
    +    Hætta að birta vistfangið \"%1$s\"\?
    +    Birta nýtt vistfang handvirkt
    +    Önnur birt vistföng:
    +    Þetta er aðalvistfangið
    +    Birt vistföng getur hvaða einstaklingur eða netþjónn sem er notað til að taka þátt í spjallrásinni þinni. Til að birta vistfang, þarf fyrst að stilla það sem staðvært vistfang.
    +    Birt vistföng
    +    Sjá og sýsla með vistföng þessa svæðis.
    +    Vistföng svæða
    +    Sjá og sýsla með vistföng þessarar spjallrásar og sýnileika hennar í spjallrásaskránni.
    +    Vistföng spjallrása
    +    Leyfa gestum að taka þátt
    +    Aðgangur að svæði
    +    Hver hefur aðgang\?
    +    Láta mig vita fyrir
    +    Uppgötvun
    +    Uppfærslur spjallrásar
    +    Skilaboð sem innihalda @spjallrás
    +    Þegar spjallrásir eru uppfærðar
    +    Heimildir svæðis
    +    Ástæða fyrir banni
    +    Ástæða fjarlægingar
    +    Hætta við boð
    +    Hætta að hunsa notanda
    +    Hunsa notanda
    +    Lækka þig sjálfa/n í tign\?
    +    Fjarlægja úr spjalli
    +    Hætta við boð
    +    Notandinn sem þú hringdir í er upptekinn.
    +    Þetta er ekki gilt vistfang á Matrix-þjóni
    +    Tillögur að spjallrásum
    +    Skoða á spjallrás
    +    Þú breyttir vistföngum fyrir þessa spjallrás.
    +    %1$s breytti vistföngum fyrir þessa spjallrás.
    +    Þú breytti aðal- og varavistföngunum fyrir þessa spjallrás.
    +    %1$s breytti aðal- og varavistföngunum fyrir þessa spjallrás.
    +    Þú breyttir varavistfanginu fyrir þessa spjallrás.
    +    %1$s breytti varavistfanginu fyrir þessa spjallrás.
    +    Þú fjarlægðir aðalvistfang spjallrásarinnar.
    +    %1$s fjarlægði aðalvistfang spjallrásarinnar.
    +    %1$s stillti aðalvistfang spjallrásarinnar sem %2$s.
    +    Þú bættir við %1$s og fjarlægðir %2$s sem vistföng fyrir þessa spjallrás.
    +    %1$s bætti við %2$s og fjarlægði %3$s sem vistföng fyrir þessa spjallrás.
    +    
    +        Þú fjarlægðir %1$s sem vistfang fyrir þessa spjallrás.
    +        Þú fjarlægðir %1$s sem vistföng fyrir þessa spjallrás.
    +    
    +    
    +        %1$s fjarlægði %2$s sem vistfang fyrir þessa spjallrás.
    +        %1$s fjarlægði %2$s sem vistföng fyrir þessa spjallrás.
    +    
    +    
    +        Þú bættir við %1$s sem vistfangi fyrir þessa spjallrás.
    +        Þú bættir við %1$s sem vistföngum fyrir þessa spjallrás.
    +    
    +    
    +        %1$s bætti við %2$s sem vistfangi fyrir þessa spjallrás.
    +        %1$s bætti við %2$s sem vistföngum fyrir þessa spjallrás.
    +    
    +    Breyta umfjöllunarefni
    +    Uppfæra svæðið
    +    Uppfæra spjallrásina
    +    Senda m.room.server_acl atburði
    +    Breyta heimildum
    +    Breyta nafni svæðis
    +    Breyta nafni spjallrásar
    +    Breyta sýnileika ferils
    +    Virkja dulritun svæðis
    +    Virkja dulritun spjallrásar
    +    Skipta um aðalvistfang svæðisins
    +    Skipta um aðalvistfang spjallrásarinnar
    +    Skipta um táknmynd svæðis
    +    Skipta um auðkennismynd spjallrásar
    +    Breyta viðmótshlutum
    +    Tilkynna öllum
    +    Fjarlægja skilaboð send af öðrum
    +    Banna notendur
    +    Fjarlægja notendur
    +    Senda skilaboð
    +    Sjálfgefið hlutverk
    +    %1$s, %2$s og aðrir
    +    Hringing…
    +    Afrita
    +    Merkja sem lesið
    +    Ertu viss um að þú viljir skrá þig út\?
    +    Leggja á
    +    Hafna
    +    Samþykkja
    +    Lokið
    +    Svæði
    +    Hefja spjall
    +    Ekkert
    +    Ertu viss\?
    +    Öryggisafrit af lykli
    +    Sjálfgefið í kerfinu
    +    Sendi skilaboð…
    +    Skilaboð send
    +    Tóm spjallrás (var %s)
    +    
    +        %1$s, %2$s, %3$s og %4$d til viðbótar
    +        %1$s, %2$s, %3$s og %4$d til viðbótar
    +    
    +    %1$s, %2$s og %3$s
    +    Sérsniðið
    +    Sérsniðið (%1$d)
    +    Sjálfgefið
    +    Umsjónarmaður
    +    %1$s bauð %2$s
    +    Engin breyting.
    +    %1$s gekk í hópinn
    +    Boðið þitt
     
    \ No newline at end of file
    
    From 3d7aa99b28418faf511ca980fe407ceafa85cc9a Mon Sep 17 00:00:00 2001
    From: Tuomas Hietala 
    Date: Fri, 11 Mar 2022 22:40:22 +0000
    Subject: [PATCH 052/126] Translated using Weblate (Finnish)
    
    Currently translated at 83.2% (1795 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fi/
    ---
     vector/src/main/res/values-fi/strings.xml | 88 ++++++++++++++++++++---
     1 file changed, 79 insertions(+), 9 deletions(-)
    
    diff --git a/vector/src/main/res/values-fi/strings.xml b/vector/src/main/res/values-fi/strings.xml
    index 7e22ce42a8..c5e67771dd 100644
    --- a/vector/src/main/res/values-fi/strings.xml
    +++ b/vector/src/main/res/values-fi/strings.xml
    @@ -46,7 +46,8 @@
         Alkusynkronointi:
     \nTuodaan huoneita
         Alkusynkronointi:
    -\nTuodaan liityttyjä huoneita
    +\nLadataan keskustelujasi
    +\nMikäli olet liittynyt moniin huoneisiin, tässä voi mennä tovi
         Alkusynkronointi:
     \nTuodaan kutsuttuja huoneita
         Alkusynkronointi:
    @@ -365,7 +366,7 @@
         Kokeelliset
         Nämä ovat kokeellisia ominaisuuksia, jotka voivat mennä rikki. Käytä varoen.
         Aseta pääosoitteeksi
    -    Poista pääosoite
    +    Kumoa pääosoitteeksi asettaminen
         Salauksenpurkuvirhe
         Julkinen nimi
         Istunnon tunnus
    @@ -520,7 +521,7 @@
             yksi jäsen
             %d jäsentä
         
    -    Poista huoneesta
    +    Poista keskustelusta
         
             yksi uusi viesti
             %d uutta viestiä
    @@ -628,7 +629,7 @@
         Määritä käyttäjän oikeuksien taso
         Poistaa käyttäjän operaattorioikeudet
         Kutsuu käyttäjän nykyiseen huoneeseen
    -    Liittyy annettuun huoneeseen
    +    Liittyy osoitteen mukaiseen huoneeseen
         Poistu huoneesta
         Aseta huoneen aihe
         Potkaisee käyttäjän pois
    @@ -646,7 +647,7 @@
     \nViestien näkyvyys Matrixissa on samantapainen kuin sähköpostissa. Viestiesi unohtaminen tarkoittaa, että lähettämiäsi viestejä ei näytetä uusille tai rekisteröitymättömille käyttäjille. Ne rekisteröityneet käyttäjät, joilla viestisi jo on, pääsevät kuitenkin näkemään oman kopionsa niistä jatkossakin.
         Unohda kaikki viestit, jotka olen lähettänyt, kun tilini on poistettu (Varoitus: tästä seuraa, että tulevat käyttäjät näkevät vanhat keskustelut epätäydellisinä)
         Syötä käyttäjätunnus.
    -    Tämä huone on korvattu toisella huoneella
    +    Tämä huone on korvattu toisella eikä ole enää aktiivinen.
         Keskustelu jatkuu täällä
         Tämä huone on jatkoa toiselle keskustelulle
         Paina tästä nähdäksesi vanhemmat viestit
    @@ -801,9 +802,9 @@
         %s kutsui
         Sinulla ei ole enempää lukemattomia viestejä
         Keskustelut
    -    Yksityisviestisi näytetään tässä. Napsauta + oikeasta alakulmasta aloittaaksesi.
    +    Yksityisviestisi näytetään tässä. Napauta + oikeasta alakulmasta aloittaaksesi keskustelun.
         Huoneet
    -    Huoneesi näytetään tässä. Napsauta + oikeasta alakulmasta aloittaaksesi.
    +    Huoneesi näytetään tässä. Napauta + oikeasta alakulmasta löytääksesi olemassa olevia tai perustaaksesi omiasi.
         Reaktiot
         Samaa mieltä
         Lisää reaktio
    @@ -1405,7 +1406,7 @@
         Viestieditori
         Muut kielet
         Näytä merkki poistettujen viestien paikalla
    -    Käytä /snow kometoa tai lähetä viesti jossa on ❄️ tai 🎉
    +    Käytä /confetti-komentoa tai lähetä viesti jossa on ❄️ tai 🎉
         Näytä keskustelujen tehosteet
         Näytä poistetut viestit
         Jos poistat käyttäjän porttikiellon, hän voi liittyä huoneeseen uudelleen.
    @@ -1507,7 +1508,7 @@
         Ensimmäinen synkronointi:
     \nLadataan tietoja…
         Ensimmäinen synkronointi:
    -\nOdotetaan palvelimen vastausta. . .
    +\nOdotetaan palvelimen vastausta…
         
             %1$s, %2$s, %3$s ja %4$d muu
             %1$s, %2$s, %3$s ja %4$d muuta
    @@ -1983,4 +1984,73 @@
         Yhdistä palvelimeen
         Minulla on jo tili
         Luo tili
    +    ${app_name} ei voinut käyttää sijaintiasi. Yritä myöhemmin uudelleen.
    +    ${app_name} ei voinut käyttää sijaintiasi
    +    Haluatko varmasti poistaa tämän kyselyn\? Et voi palauttaa sitä poistamisen jälkeen.
    +    Huomaa: sovellus käynnistetään uudelleen
    +    Tapahtuman sisältö
    +    Tapahtuman sisältö
    +    Lähetä mukautettu tapahtuma
    +    Oletusluottamustaso
    +    Huonetta, johon olet saanut porttikiellon ei voi avata.
    +    Noudetaan yhteystietojasi…
    +    Lähettää viestin lumisateen kera
    +    Lähettää viestin konfetin kera
    +    ${app_name} iOS
    +\n${app_name} Android
    +    Lähettää viestin pelkkänä tekstinä, tulkitsematta sitä markdowniksi
    +    Ota yhteyttä ylläpitäjään salauksen palauttamiseksi kelvolliseen tilaan.
    +    Lue koodi toisella laitteellasi tai vaihda ja lue tällä laitteella
    +    Ei-luotettu kirjautuminen
    +    Teit tästä kutsua edellyttävän.
    +    Sijainti
    +    Kysely
    +    
    +        %1$s, %2$s ja yksi muu lukivat
    +        %1$s, %2$s ja %3$d muuta lukivat
    +    
    +    Hyväksytkö näiden tietojen lähettämisen\?
    +    Versiot
    +    Ohje ja tuki
    +    Ohje
    +    Huone on luotu, mutta joitakin kutsuja ei ole lähetetty seuraavasta syystä:
    +\n
    +\n%s
    +    Tähän huoneeseen ei pääse tällä hetkellä.
    +\nYritä myöhemmin uudelleen tai kysy huoneen ylläpitäjältä onko sinulla pääsyä.
    +    Näytä huoneessa
    +    Tuntematon pääsyasetus (%s)
    +    Aseta osoitteita tälle huoneelle, jotta käyttäjät voivat löytää tämän huoneen kotipalvelimesi (%1$s) kautta
    +    Uusi julkaistu osoite (esim. #alias:palvelin)
    +    Kuka hyvänsä millä hyvänsä palvelimella voi käyttää julkaistua osoitetta huoneeseesi liittymiseen. Osoitteen julkaisemiseksi se täytyy ensin asettaa paikalliseksi osoitteeksi.
    +    Kolmansien osapuolten kirjastot
    +    Voit poistaa tämän käytöstä koska tahansa asetuksista
    +    Emme jaa tietoa kolmansien tahojen kanssa
    +    Emme tallenna tai profiloi mitään tilin tietoja
    +    Huoneesta on poistuttu!
    +    Sinulla ei ole lupaa päivittää rooleja, jotka vaaditaan huoneen eri osien muuttamiseen
    +    Valitse roolit, jotka vaaditaan huoneen eri osien muuttamiseen
    +    Tarkastele ja päivitä rooleja, jotka vaaditaan huoneen eri osien muuttamiseen.
    +    %1$s, %2$s ja muita
    +    %1$s ja %2$s
    +    Kotipalvelinta URL-osoitteesta %s ei tavoiteta. Tarkista linkki tai valitse kotipalvelin manuaalisesti.
    +    Näytä huoneessa
    +    Ota käyttöön
    +    
    +        Poistit tältä huoneelta vaihtoehtoisen osoitteen %1$s.
    +        Poistit tältä huoneelta vaihtoehtoiset osoitteet %1$s.
    +    
    +    
    +        %1$s poisti tältä huoneelta vaihtoehtoisen osoitteen %2$s.
    +        %1$s poisti tältä huoneelta vaihtoehtoiset osoitteet %2$s.
    +    
    +    
    +        Lisäsit tälle huoneelle vaihtoehtoisen osoitteen %1$s.
    +        Lisäsit tälle huoneelle vaihtoehtoiset osoitteet %1$s.
    +    
    +    
    +        %1$s lisäsi tälle huoneelle vaihtoehtoisen osoitteen %2$s.
    +        %1$s lisäsi tälle huoneelle vaihtoehtoiset osoitteet %2$s.
    +    
    +    Sinulla ei ole lupaa liittyä tähän huoneeseen
     
    \ No newline at end of file
    
    From 0521ff91c3ef116d0c4b59fa94964a5ada3526ce Mon Sep 17 00:00:00 2001
    From: Szimszon 
    Date: Fri, 11 Mar 2022 09:33:25 +0000
    Subject: [PATCH 053/126] Translated using Weblate (Hungarian)
    
    Currently translated at 99.8% (2154 of 2157 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 | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml
    index f189a4198f..eae62b6417 100644
    --- a/vector/src/main/res/values-hu/strings.xml
    +++ b/vector/src/main/res/values-hu/strings.xml
    @@ -2279,7 +2279,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
         Elhagytad a szobát!
         A meglévő kapcsolatok felderítéséhez információkat (e-mail cím és telefonszám) kell elküldeni az azonosítási szolgáltatónak. Az adatok az adatvédelem miatt hashelve lesznek elküldve.
         Beleegyezel az információk elküldésébe\?
    -    Nem most
    +    Ne most
         Engedélyezés
         Biztosan törlöd ezt a szavazást\? Ezt a műveletet később nem lehet visszavonni.
         Szavazás törlése
    
    From 5d67529ce211124c7a1fdab919145ff7227aea92 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Peter=20V=C3=A1gner?= 
    Date: Mon, 14 Mar 2022 04:37:32 +0000
    Subject: [PATCH 054/126] Translated using Weblate (Slovak)
    
    Currently translated at 99.7% (2152 of 2157 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 | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 8d97ff7266..154d6f41b3 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2452,4 +2452,5 @@
             %1$d ďalších
         
         Zadajte URL adresu servera Modular Element alebo adresu servera, ktorý si želáte použiť
    +    Hlasovať
     
    \ No newline at end of file
    
    From 667189c8bc2c59f6aef58b7e07c3b98523f18f32 Mon Sep 17 00:00:00 2001
    From: Jozef Gaal 
    Date: Mon, 14 Mar 2022 04:37:00 +0000
    Subject: [PATCH 055/126] Translated using Weblate (Slovak)
    
    Currently translated at 99.7% (2152 of 2157 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 | 10 +++++++++-
     1 file changed, 9 insertions(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index 154d6f41b3..ab3d80d9ca 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2274,7 +2274,7 @@
         Týmto sa zastaví možnosť hlasovania a zobrazia sa konečné výsledky ankety.
         Určite chcete túto anketu odstrániť\? Po odstránení ju už nebudete môcť obnoviť.
         Typ ankety
    -    Otvoriť anketu
    +    Otvorená anketa
         Hlasujúci uvidia výsledky hneď po hlasovaní
         Uzavretá anketa
         Zobraziť vlákna
    @@ -2453,4 +2453,12 @@
         
         Zadajte URL adresu servera Modular Element alebo adresu servera, ktorý si želáte použiť
         Hlasovať
    +    Odoslať stav udalosti
    +    Priradenie sa nepodarilo.
    +    V súčasnosti neexistuje žiadne priradenie k tomuto identifikátoru.
    +    použite záložný kľúč na obnovu kľúča
    +    Uloženie tajnej zálohy kľúčov v SSSS
    +    Generovanie kľúča SSSS z kľúča pre obnovu
    +    Definovanie predvoleného kľúča SSSS
    +    Rýchle-zlyhanie
     
    \ No newline at end of file
    
    From 0b67e1cb3f1ae55a1d8561cd9aacbc2718fc53b2 Mon Sep 17 00:00:00 2001
    From: Nikita Epifanov 
    Date: Sun, 13 Mar 2022 08:59:01 +0000
    Subject: [PATCH 056/126] Translated using Weblate (Russian)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/ru/
    ---
     fastlane/metadata/android/ru-RU/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/ru-RU/changelogs/40104020.txt | 2 ++
     2 files changed, 4 insertions(+)
     create mode 100644 fastlane/metadata/android/ru-RU/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/ru-RU/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104000.txt b/fastlane/metadata/android/ru-RU/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..f6bf34b3cc
    --- /dev/null
    +++ b/fastlane/metadata/android/ru-RU/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +Основные изменения в этой версии: Начальная реализация веток сообщений. Сообщения пузыри.
    +Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104020.txt b/fastlane/metadata/android/ru-RU/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..864bd03d5e
    --- /dev/null
    +++ b/fastlane/metadata/android/ru-RU/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +Основные изменения в этой версии: добавлена поддержка @room и нераскрытых опросов, а также множество других мелких изменений.
    +Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From a5585ca3b37405923641e9a18df37f3c144cdc3d Mon Sep 17 00:00:00 2001
    From: Edward Gera 
    Date: Sun, 13 Mar 2022 15:01:48 +0000
    Subject: [PATCH 057/126] Translated using Weblate (Hebrew)
    
    Currently translated at 89.0% (1921 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 91 +++++++++++++++++++++--
     1 file changed, 83 insertions(+), 8 deletions(-)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 73a57823eb..d78ff9f162 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2099,8 +2099,8 @@
         
             שיחה פעילה ·
             %1$d שיחות פעילות ·
    -        
    -        
    +        
    +        
         
         שיחה פעילה (%1$s)
         אירעה שגיאה בחיפוש מספר הטלפון
    @@ -2124,17 +2124,17 @@
         להודיע לכל החדר
         
             %1$d יותר
    -        
    -        
    -        
    +        
    +        
    +        
         
         %1$s, %2$s ואחרים
         %1$s ו %2$s
         
             %d שינוי ברשימות ACL בשרתים
    -        
    -        
    -        
    +        
    +        
    +        
         
         נהל חדרים
         החלט מי יכול לראות ולהצטרף לחדר זה.
    @@ -2175,4 +2175,79 @@
         שם המשתמש שלי
         הזמנות לחדר
         מילות מפתח
    +    הזמן אל %s
    +    הזמן אנשים
    +    הזמן אנשים למרחב שלך
    +    תֵאוּר
    +    יוצר מרחב…
    +    אַקרַאִי
    +    ראשי
    +    בואו ניצור חדר לכל אחד מהם. אתה יכול להוסיף עוד מאוחר יותר, כולל אלה שכבר קיימים.
    +    על איזה דברים אתה עובד\?
    +    ודא שלאנשים הנכונים יש גישה לחברה %s. תוכל להזמין עוד מאוחר יותר.
    +    מי הם חבריך לצוות\?
    +    אנחנו ניצור עבורם חדרים. אתה יכול להוסיף עוד מאוחר יותר גם.
    +    איזה דיונים אתה רוצה לקיים ב-%s\?
    +    תן לזה שם כדי להמשיך.
    +    הוסף כמה פרטים כדי לשפר לזיהוי. אתה יכול לשנות את זה בכל שלב.
    +    הוסף כמה פרטים כדי לבלוט. אתה יכול לשנות את זה בכל שלב.
    +    צור מרחב
    +    הזמן רק, הכי טוב לעצמך או לצוותים שלך
    +    פְּרָטִי
    +    פתוח לכל אחד, הכי מתאים לקהילות
    +    צִבּוּרִי
    +    מרחב פרטי עבורך ועבור חברי הצוות שלך
    +    אני וחברי הצוות
    +    מרחב פרטי לארגון החדרים שלך
    +    רק אני
    +    ודא שלאנשים הנכונים יש גישה אל %s.
    +    עם מי אתה עובד\?
    +    כדי להצטרף למרחב קיים, אתה צריך הזמנה.
    +    אתה יכול לשנות את זה מאוחר יותר
    +    איזה סוג מרחב אתה רוצה ליצור\?
    +    המרחב הפרטי שלך
    +    המרחב הציבורי שלך
    +    הוסף מרחב
    +    מרחב אישי
    +    מרחב ציבורי
    +    האם אתה בטוח שברצונך למחוק את כל ההודעות שלא נשלחו בחדר הזה\?
    +    מחק הודעות שלא נשלחו
    +    שליחת ההודעות נכשלה
    +    האם ברצונך לבטל את שליחת ההודעה\?
    +    מחק את כל ההודעות שנכשלו
    +    נִכשָׁל
    +    נשלח
    +    שְׁלִיחָה
    +    משדרג חדר לגרסה חדשה
    +    עזוב את החדר עם מזהה נתון (או החדר הנוכחי אם ריק)
    +    הצטרף למרחב עם המזהה הנתון
    +    הוסף למרחב הנתון
    +    צור מרחב
    +    תוכן האירוע
    +    מצב האירוע נשלח!
    +    האירוע נשלח!
    +    אירוע שגוי
    +    חסר סוג הודעה
    +    אין תוכן
    +    תוכן האירוע
    +    מצב מפתח
    +    סוג
    +    שלח אירוע מצב מותאם אישית
    +    ערוך תוכן
    +    מצב אירוע
    +    שלח מצב אירוע
    +    שלח אירוע מותאם אישית
    +    חקור מצב חדר
    +    כלי מפתח
    +    לא זמין
    +    לא על הקו
    +    על הקו
    +    חדר ציבורי
    +    צפה באישורי קריאה
    +    אל תתריעה
    +    מתריעה ללא קול
    +    מתריעה עם צליל
    +    ההודעה לא נשלחה עקב שגיאה
    +    לא בָּדוּק
    +    בָּדוּק
     
    \ No newline at end of file
    
    From e3d8b3d488153c6b48d76691f57435b022379d5c Mon Sep 17 00:00:00 2001
    From: Nikita Epifanov 
    Date: Sun, 13 Mar 2022 09:12:39 +0000
    Subject: [PATCH 058/126] Translated using Weblate (Russian)
    
    Currently translated at 99.8% (2153 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
    ---
     vector/src/main/res/values-ru/strings.xml | 99 +++++++++--------------
     1 file changed, 39 insertions(+), 60 deletions(-)
    
    diff --git a/vector/src/main/res/values-ru/strings.xml b/vector/src/main/res/values-ru/strings.xml
    index 465bbbb28c..9a925ecaa7 100644
    --- a/vector/src/main/res/values-ru/strings.xml
    +++ b/vector/src/main/res/values-ru/strings.xml
    @@ -39,7 +39,6 @@
         Приглашение в комнату
         %1$s и %2$s
         Пустая комната
    -
         Начальная синхронизация:
     \nИмпорт учетной записи…
         Начальная синхронизация:
    @@ -258,7 +257,6 @@
         Удалить
         Переименовать
         Пожаловаться на содержимое
    -
         или
         Приглашение
         Выйти из учётной записи
    @@ -281,7 +279,6 @@
         Только Matrix контакты
         Нет результатов
         Комнаты
    -
         Отправить логи
         Отправить журналы ошибок
         Отправить снимок экрана
    @@ -309,11 +306,9 @@
         Это не похоже на действительный адрес электронной почты
         Этот адрес электронной почты уже используется.
         Забыли пароль?
    -
         Этот домашний сервер хочет убедиться, что вы не робот
         Должен быть введен адрес электронной почты привязанный к учетной записи.
         Не удалось проверить адрес электронной почты: убедитесь, что вы перешли по ссылке из сообщения
    -
         Пожалуйста, введите корректный URL
         Неверный формат JSON
         Не содержит допустимого JSON
    @@ -329,12 +324,10 @@
         Идёт разговор…
         Вызываемый абонент не смог ответить.
         Информация
    -
         ${app_name} необходимы разрешения на доступ к микрофону, чтобы выполнять звонки.
         ${app_name} необходимы разрешения на доступ к камере и микрофону для видеовызовов.
     \n
     \nПожалуйста дайте разрешение в следующем окне для звонка.
    -
         ДА
         НЕТ
         Продолжить
    @@ -342,7 +335,6 @@
         Присоединиться
         Отклонить
         Перейти к непрочитанному
    -
         Покинуть комнату
         Вы уверены, что хотите выйти из комнаты\?
         ПРЯМЫЕ СООБЩЕНИЯ
    @@ -369,7 +361,6 @@
         Сертификат был изменен с того, которому доверял ваш телефон. Это ОЧЕНЬ НЕОБЫЧНО. Рекомендуется НЕ ПРИНИМАТЬ этот новый сертификат.
         Сертификат изменился с ранее доверенного на недействительный. Возможно, сервер обновил свой сертификат. Свяжитесь с администратором сервера для получения ожидаемого отпечатка сертификата.
         Примите сертификат только если администратор сервера опубликовал отпечаток сертификата, который соответствует указанному выше.
    -
         Поиск
         Фильтр списка пользователей
         Нет результатов
    @@ -414,7 +405,6 @@
         Обновить публичное имя
         Недавно
         %1$s @ %2$s
    -
         Аутентификация
         Авторизован как
         Домашний сервер
    @@ -445,7 +435,6 @@
         Это экспериментальные функции, которые могут повести себя неожиданным образом. Используйте с осторожностью.
         Установить как основной адрес
         Сбросить основной адрес
    -
         Ошибка дешифровки
         Публичное имя
         ID сессии
    @@ -456,7 +445,6 @@
         Экспорт
         Введите парольную фразу
         Подтвердите парольную фразу
    -
         Импорт E2E ключей комнаты
         Импорт ключей комнаты
         Импортировать ключи из локального файла
    @@ -468,7 +456,6 @@
         Подтвердить
         Чтобы убедиться, что этой сессии можно доверять, обратитесь к ее владельцу, используя другие способы (например, лично или по телефону), и спросите, соответствует ли ключ, который он видит в настройках для этой сессии:
         Если они не совпадают, безопасность вашего общения может быть поставлена под угрозу.
    -
         Выбор каталога комнат
         Имя сервера
         Все комнаты на сервере %s
    @@ -545,7 +532,6 @@
         Причина: %1$s
         Встряхните устройство, чтобы сообщить об ошибке
         Список участников
    -
         
             %d комната
             %d комнаты
    @@ -560,7 +546,6 @@
             
         
         Аватар
    -
         
             %d участник
             %d участника
    @@ -573,7 +558,6 @@
             %d новых сообщений
             
         
    -
         
             %d изменение членства
             %d изменения членства
    @@ -586,7 +570,6 @@
             %d непрочитанных уведомлений
             
         
    -
         Чутье
         Отправить стикер
         Отправить стикер
    @@ -633,18 +616,12 @@
         Нажмите здесь для просмотра старых сообщений
         Присоединиться к комнате с указанным адресом
         Для исправления управления приложениями Matrix
    -
    -
    -
    -
         
             %d выбран
             %d выбрано
             %d выбраны
             
         
    -
    -
         Системные оповещения
         Ошибка
         Создать парольную фразу
    @@ -733,7 +710,6 @@
         Показывать события о вступлении/выходе
         Показывать события аккаунта
         Включает изменения аватара и отображаемого имени.
    -
         Использовать системную камеру вместо камеры Element.
         %1$s: %2$s
         %d+
    @@ -814,7 +790,6 @@
         Невозможно расшифровать резервную копию с помощью этого ключа восстановления: убедитесь, что вы ввели правильный ключ.
         Невозможно расшифровать резервную копию с помощью этого пароля: убедитесь, что вы ввели правильный пароль.
         Генерация ключей восстановления с использованием парольной фразы может занять несколько секунд.
    -
         [%1$s]
     \nЭта ошибка вне контроля ${app_name}. На телефоне нет учетной записи Google. Пожалуйста, добавьте аккаунт Google.
         [%1$s]
    @@ -855,7 +830,6 @@
         Использовать резервное копирование ключей
         Управление резервным копированием ключей
         Новые ключи зашифрованных сообщений
    -
         Ваши ключи копируются.
         (Дополнительно) Настройка с ключом восстановления
         Или защитите резервную копию с помощью ключа восстановления, сохранив его в безопасном месте.
    @@ -910,11 +884,8 @@
         Поделиться
         Запрос поделится ключом
         Игнорировать
    -
         Проверено!
         Понял
    -
    -
         Запрос на подтверждение
         %s желает подтвердить вашу сессию
         Неизвестная ошибка
    @@ -1011,7 +982,6 @@
         Никто
         Отмена
         Отключить
    -
         Не удается связаться с домашним сервером по этому URL, пожалуйста, проверьте его
         Оптимизирован для батареи
         Оптимизирован для работы в реальном времени
    @@ -1023,7 +993,6 @@
         ${app_name} будет синхронизироваться в фоновом режиме периодически в точное время (настраивается).
     \nЭто повлияет на использование радио и батареи, появится постоянное уведомление о том, что ${app_name} прислушивается к событиям.
         Вы не будете уведомлены о входящих сообщениях, когда приложение находится в фоновом режиме.
    -
         Изменить настройки обнаружения.
         Вы не используете какой-либо сервер обнаружения
         Похоже, вы пытаетесь подключиться к другому домашнему серверу. Вы хотите выйти\?
    @@ -1090,7 +1059,7 @@
         Покинуть комнату
         %1$s сделал(а) комнату доступной для всех, у кого есть ссылка.
         %1$s сделал(а) комнату доступной только по приглашению.
    -    Подробные логи помогут разработчикам, предоставив больше информации, когда вы отправляете ВзмахЯрости. Даже когда они разрешены, приложение не записывает ваши сообщения и другие приватные данные.
    +    Подробные логи помогут разработчикам, предоставив больше информации, когда вы отправляете \"Яростное встряхивание\". Даже когда они разрешены, приложение не записывает ваши сообщения и другие приватные данные.
         Закройте меню создание комнаты…
         Вниз
         Контакт
    @@ -1276,7 +1245,6 @@
         Лента сообщений
         Ключ сообщения
         Распечатайте его и храните в безопасном месте
    -
         Шифрование включено
         Шифрование не включено
         %1$s: %2$s
    @@ -1311,7 +1279,6 @@
         Закрыть окно резервного копирования ключей
         %s прочитано
         Не удалось обработать данные
    -
         Воспроизвести
         Копировать
         Удачно
    @@ -1405,10 +1372,10 @@
         Это недопустимый идентификатор пользователя. Ожидаемый формат: \'@user:homeserver.org\'
         Не удалось найти действительный домашний сервер. Пожалуйста, проверьте свой идентификатор
         Начальная синхронизация…
    -    СотрясениеЯрости
    +    Яростное встряхивание
         Порог обнаружения
         Встряхните телефон, чтобы проверить порог обнаружения
    -    Обнаружено потрясение!
    +    Обнаружено встряхивание!
         Показываем только первые результаты, наберите больше букв…
         Раннее падение
         ${app_name} может падать чаще, когда происходит непредвиденная ошибка
    @@ -1443,7 +1410,6 @@
         Подтверждено %s
         Подтверждённых %s
         Ожидаем %s…
    -
         Сообщения в этой комнате не защищены сквозным шифрованием.
         Сообщения в этой комнате защищены сквозным шифрованием.
     \n
    @@ -1871,7 +1837,6 @@
         Скрыть дополнительные настройки
         Показать дополнительные настройки
         %1$d из %2$d
    -
         Дать согласие
         Отозвать моё согласие
         Больше никаких результатов
    @@ -1973,8 +1938,6 @@
         Перевод
         Подключиться
         Сначала посоветуйтесь
    -
    -
         Нет учётных данных, неправильная учётная запись пользователя и/или пароль
         Вы уверены, что хотите удалить все неотправленные сообщения в этой комнате\?
         Удалить неотправленные сообщения
    @@ -2061,7 +2024,6 @@
         Обновление
         Пожалуйста, будьте терпеливы, это может занять некоторое время.
         Присоединиться к замещенной комнате
    -
         Безымянная Комната
         Некоторые комнаты могут быть скрыты, потому что они приватные, и вам нужно приглашение.
         Некоторые комнаты могут быть скрыты, потому что они приватные, и вам нужно приглашение.
    @@ -2130,7 +2092,7 @@
         Приватное пространство для организации ваших комнат
         Я и члены команды
         Только я
    -    Убедитесь, что нужные люди имеют доступ к %s. Вы сможете изменить это позже.
    +    Убедитесь, что нужные люди имеют доступ к %s.
         С кем вы работаете\?
         Чтобы присоединиться к существующему пространству, вам необходимо получить приглашение.
         Вы сможете изменить это позже
    @@ -2453,7 +2415,6 @@
         Местоположение
         Вы согласны отправить эту информацию\?
         Чтобы обнаружить существующие контакты, необходимо отправить контактную информацию (электронную почту и номера телефонов) на сервер обнаружения. Мы хешируем ваши данные перед отправкой для обеспечения конфиденциальности.
    -
         Отправить электронные адреса и номера телефонов %s
         Ваши контакты приватны. Чтобы обнаружить пользователей из ваших контактов, нам необходимо ваше разрешение на отправку контактной информации на ваш сервер обнаружения.
         Системные настройки
    @@ -2485,16 +2446,16 @@
         Включить
         Слежка за уведомлениями
         Вам не разрешено подключаться к этой комнате
    -    Организуйте обсуждение в потоках
    -    Показать все потоки в которых вы участвуете
    -    Все Потоки
    -    Просмотр Потоков
    +    Организуйте обсуждение с помощью веток
    +    Показать все ветки, в которых вы участвуете
    +    Все ветки
    +    Посмотреть ветки
         Посмотреть в комнате
    -    Показать всплывающие сообщения
    +    Показывать сообщения в пузырях
         Не удалось загрузить карту
         Карта
         Примечание: приложение будет перезапущено
    -    Включить Сообщения Потока
    +    Включить ветки сообщений
         Подключиться к серверу
         Хотите присоединиться к существующему серверу\?
         пропустить вопрос
    @@ -2504,18 +2465,36 @@
         Друзья и семья
         Мы поможем вам подключится.
         С кем вы будете общаться больше всего\?
    -    Вы уже просматриваете этот Поток!
    +    Вы уже просматриваете эту ветку!
         Просмотр в Комнате
    -    Ответить в Поток
    -    Команда «%s» распознается, но не поддерживается в потоках.
    -    Из Потока
    +    Ответить в ветке
    +    Команда «%s» распознается, но не поддерживается в ветках.
    +    Из ветки
         Совет: нажмите и удерживайте сообщение и используйте «%s».
    -    Потоки помогают хранить ваши разговоры по темам и легко отслеживать их.
    -    Мои Потоки
    -    Показать все потоки в текущей комнате
    +    Ветки помогают хранить ваши разговоры по темам и легко отслеживать их.
    +    Мои ветки
    +    Показать все ветки этой комнаты
         Фильтр
    -    Потоки
    -    Поток
    -    Фильтровать Потоки в комнате
    -    Скопировать ссылку в поток
    +    Ветки
    +    Ветка
    +    Фильтровать ветки в комнате
    +    Скопировать ссылку в ветку
    +    Уведомления комнаты
    +    Пользователи
    +    Оповестить всю комнату
    +    
    +        И ещё %1$d
    +        И ещё %1$d
    +        И ещё %1$d
    +        И ещё %1$d
    +    
    +    Свернуть
    +    %1$s, %2$s и другие
    +    %1$s и %2$s
    +    
    +        %d изменение ACL сервера
    +        %d изменения ACL сервера
    +        %d изменений ACL сервера
    +        %d изменений ACL сервера
    +    
     
    \ No newline at end of file
    
    From bd50954b575fc06b4b07ad1de06a2b22d3ba9ff6 Mon Sep 17 00:00:00 2001
    From: Ultimator14 
    Date: Sat, 12 Mar 2022 20:36:39 +0000
    Subject: [PATCH 059/126] Translated using Weblate (German)
    
    Currently translated at 99.8% (2154 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
    ---
     vector/src/main/res/values-de/strings.xml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
    index 7a8ac9c71b..41d94b8afc 100644
    --- a/vector/src/main/res/values-de/strings.xml
    +++ b/vector/src/main/res/values-de/strings.xml
    @@ -1257,7 +1257,7 @@
         Raum verlassen
         Verlasse den Raum…
         Administratoren
    -    Moderationen
    +    Moderatoren
         Benutzerdefiniert
         Eingeladen
         Nutzer
    
    From bd4e251c8adb9a9ff94e1bf6df198202dcc4c25a Mon Sep 17 00:00:00 2001
    From: libexus 
    Date: Fri, 11 Mar 2022 19:38:58 +0000
    Subject: [PATCH 060/126] Translated using Weblate (German)
    
    Currently translated at 99.8% (2154 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
    ---
     vector/src/main/res/values-de/strings.xml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
    index 41d94b8afc..a62349040d 100644
    --- a/vector/src/main/res/values-de/strings.xml
    +++ b/vector/src/main/res/values-de/strings.xml
    @@ -1079,7 +1079,7 @@
         Erweitere und individualisiere dein Benutzererlebnis
         Mit %1$s verbinden
         Mit Element Matrix Services verbinden
    -    Mit einem individuellen Server verbinden
    +    Mit einem anderen Server verbinden
         Bei %1$s anmelden
         Registrieren
         Anmelden
    
    From 9657a50a6ac78b335713c9f734c42171ea3d2b29 Mon Sep 17 00:00:00 2001
    From: lvre <7uu3qrbvm@relay.firefox.com>
    Date: Wed, 9 Mar 2022 08:45:52 +0000
    Subject: [PATCH 061/126] Translated using Weblate (Portuguese (Brazil))
    
    Currently translated at 100.0% (2157 of 2157 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 | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml
    index cd237407d2..f2eaf8d993 100644
    --- a/vector/src/main/res/values-pt-rBR/strings.xml
    +++ b/vector/src/main/res/values-pt-rBR/strings.xml
    @@ -1414,7 +1414,7 @@
         Quase lá! %s está mostrando um tick (✓)\?
         Sim
         Não
    -    A conexão com o servidor foi perdida
    +    Conectividade ao servidor tem sido perdida
         Modo avião está ligado
         Ferramentas Dev
         Dados de Conta
    
    From 0013d08ac7824d2fe7ee16d8bc0e247b919c11bc Mon Sep 17 00:00:00 2001
    From: Edward Gera 
    Date: Tue, 15 Mar 2022 06:44:44 +0000
    Subject: [PATCH 062/126] Translated using Weblate (Hebrew)
    
    Currently translated at 89.1% (1923 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index d78ff9f162..8459160bf2 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2250,4 +2250,6 @@
         ההודעה לא נשלחה עקב שגיאה
         לא בָּדוּק
         בָּדוּק
    +    הזמינו בדואר אלקטרוני
    +    זה רק אתה כרגע. %s יהיה טוב יותר עם אחרים.
     
    \ No newline at end of file
    
    From c2fa67ea22c82b62ffbfe6790b2822acb2193787 Mon Sep 17 00:00:00 2001
    From: Jeanne Lavoie 
    Date: Tue, 15 Mar 2022 12:26:50 +0000
    Subject: [PATCH 063/126] Translated using Weblate (French)
    
    Currently translated at 100.0% (2157 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
    ---
     vector/src/main/res/values-fr/strings.xml | 8 ++++++--
     1 file changed, 6 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml
    index 6bae118e59..5c95775ca3 100644
    --- a/vector/src/main/res/values-fr/strings.xml
    +++ b/vector/src/main/res/values-fr/strings.xml
    @@ -34,7 +34,7 @@
         L’appareil de l’expéditeur ne nous a pas envoyé les clés pour ce message.
         Envoi du message impossible
         Erreur de Matrix
    -    Adresse e-mail
    +    Adresse électronique
         Numéro de téléphone
         Invitation au salon
         Salon vide
    @@ -372,7 +372,7 @@
         L’application s’est arrêtée anormalement la dernière fois. Souhaitez-vous ouvrir l’écran de rapport d’anomalie \?
         Le rapport d’anomalie a bien été envoyé
         L’envoi du rapport d’anomalie a échoué (%s)
    -    Ceci ne ressemble pas à une adresse e-mail valide
    +    Ceci ne ressemble pas à une adresse électronique valide
         Cette adresse e-mail est déjà utilisée.
         Ce serveur d’accueil souhaite s’assurer que vous n’êtes pas un robot
         L’adresse e-mail liée à votre compte doit être saisie.
    @@ -2415,4 +2415,8 @@
         Copier le lien du fil de discussion
         Voir dans le salon
         Voir les fils de discussions
    +    
    +        %d changement des ACL du serveur
    +        %d changements des ACL du serveur
    +    
     
    \ No newline at end of file
    
    From ae5f09922a59728cff664cf2d37e0c025b1821ce Mon Sep 17 00:00:00 2001
    From: Jozef Gaal 
    Date: Mon, 14 Mar 2022 13:37:44 +0000
    Subject: [PATCH 064/126] Translated using Weblate (Slovak)
    
    Currently translated at 100.0% (2157 of 2157 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 | 5 +++++
     1 file changed, 5 insertions(+)
    
    diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
    index ab3d80d9ca..6650890ac3 100644
    --- a/vector/src/main/res/values-sk/strings.xml
    +++ b/vector/src/main/res/values-sk/strings.xml
    @@ -2461,4 +2461,9 @@
         Generovanie kľúča SSSS z kľúča pre obnovu
         Definovanie predvoleného kľúča SSSS
         Rýchle-zlyhanie
    +    Najprv konzultovať
    +    Vyberte si, čo opustíte
    +    Opustiť miestnosť s daným id (alebo aktuálnu miestnosť, ak je prázdna)
    +    Varovná úroveň dôveryhodnosti
    +    Pripojiť
     
    \ No newline at end of file
    
    From a40ad9543d19a7628e734eadf65c716c03dfbab7 Mon Sep 17 00:00:00 2001
    From: Danial Behzadi 
    Date: Mon, 14 Mar 2022 11:45:58 +0000
    Subject: [PATCH 065/126] Translated using Weblate (Persian)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/
    ---
     fastlane/metadata/android/fa/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/fa/changelogs/40104020.txt | 2 ++
     2 files changed, 4 insertions(+)
     create mode 100644 fastlane/metadata/android/fa/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/fa/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/fa/changelogs/40104000.txt b/fastlane/metadata/android/fa/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..7beb79981f
    --- /dev/null
    +++ b/fastlane/metadata/android/fa/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +تغییرات اصلی در این نگارش: پیاده سازی نخستین پیام‌های رشته‌ای. حباب‌های پیام.
    +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/fa/changelogs/40104020.txt b/fastlane/metadata/android/fa/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..6d5148220d
    --- /dev/null
    +++ b/fastlane/metadata/android/fa/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +تغییرات اصلی در این نگارش: افزودن پشتیبانی به ‪@room‬ و نظرسنجی‌های فاش نشده در کنار تغییرات کوچک دیگر.
    +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From 3130e67edb706fe79094602e4d5011f7f31102b1 Mon Sep 17 00:00:00 2001
    From: Danial Behzadi 
    Date: Mon, 14 Mar 2022 11:43:03 +0000
    Subject: [PATCH 066/126] Translated using Weblate (Persian)
    
    Currently translated at 100.0% (2157 of 2157 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 | 57 ++++++-----------------
     1 file changed, 15 insertions(+), 42 deletions(-)
    
    diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml
    index eb8a29b6b2..a3ee61013e 100644
    --- a/vector/src/main/res/values-fa/strings.xml
    +++ b/vector/src/main/res/values-fa/strings.xml
    @@ -40,7 +40,6 @@
         شماره تلفن
         دعوت اتاق
         %1$s و %2$s
    -
         اتاق خالی
         همگام‌سازی نخستین:
     \nدرون‌ریزی حساب…
    @@ -221,7 +220,6 @@
         اولویت پایین
         گفتگوها
         اتاق‌ها
    -
         گزارش اشکال
         پیوستن به اتاق
         نام کاربری
    @@ -296,16 +294,11 @@
             %d عضو
             %d عضو
         
    -
    -
    -
    -
         ترک اتاق
         آیا از ترک این اتاق اطمینان دارید؟
         گپ‌های مستقیم
         دعوت
         بارگیری
    -
         رد شدن
         انجام شد
         نادیده‌گرفتن
    @@ -327,7 +320,6 @@
         در صورت عدم پشتیبان‌گیری از کلیدهای خود پیش از خروج، دسترسی شما به پیام‌های رمزنگاری شده از بین می‌رود.
         پیوند دائمی
         مشاهده منبع رمزگشایی شده
    -
         این کارساز خانگی می‌خواهد مطمئن شود که روبات نیستید
         بازدرخواست کلیدهای رمزنگاری از دیگر نشست‌هایتان.
         لطفاً المنت را روی افزاره‌ای دیگر که می‌تواند پیام را رمزگشایی کند، اجرا کنید تا بتواند کلیدها را به این نشست بفرستد.
    @@ -335,8 +327,6 @@
         قطع اتصال
         نپذیرفتن
         پالایش اعضای اتاق
    -
    -
         عکس نمایه
         نام نمایشی
         افزودن نشانی رایانامه
    @@ -419,7 +409,6 @@
         افزودن کاره‌های ماتریکس
         پیام رمزنگاری شده
         اتاق‌ها
    -
         (پیش‌رفته)
         (پیش‌رفته) برپایی با کلید بازیابی
         گرفتن نگارش پشتیبان…
    @@ -518,7 +507,6 @@
         ابطال
         باید نشانی رایانامهٔ پیوسته به حسابتان وارد شود.
         شکست در تأیید نشانی رایانامه: مطمئن شوید که پیوند درون رایانامه را کلیک کرده‌اید
    -
         لطفاً سیاست‌های این کارساز خانگی را بررسی کرده و بپذیرید:
         لطفا یک نشانی معتبر وارد کنید
         این یک نشانی کارساز ماتریکس معتبر نیست
    @@ -531,7 +519,6 @@
         گزینش صدای زنگ برای تماس‌ها:
         اطلاعات
         پرش به ناخوانده
    -
         تحریم
         رفع انسداد
         اخراج
    @@ -722,7 +709,6 @@
             %d پیام آگاهی نخوانده
             %d پیام آگاهی نخوانده
         
    -
         
             %1$s: %2$d پیام
             %1$s: %2$d پیام
    @@ -796,7 +782,6 @@
         ایجاد
         خانه
         دعوت شد
    -
         غیرفعّال‌سازی حساب
         غیرفعّال‌سازی حساب
         هرگز پیام‌های رمزشده را از دست ندهید
    @@ -1084,7 +1069,6 @@
         گرفتم
         اطّلاعات بیش‌تر
         خطای رمزگشایی
    -
         بازنشاندن از نشانی اصلی
         ارتباط با مدیر خدمتتان
         اکنون بازبینی شود
    @@ -1096,7 +1080,6 @@
         رمزنگاری این اتاق پشتیبانی نمی‌شود
         لطفاً نام کاربری‌ای وارد کنید.
         برای دیدن پیام‌های قدیمی‌تر، کلیک کنید
    -
         پیام‌های این‌جا، رمزنگاری سرتاسری شده‌اند. 
     \n 
     \nپیام‌هایتان با قفل‌هایی امن شده‌اند و فقط شما و گیرندگان دیگر، کلیدهای یکتا را برای قفل‌گشاییشان دارید.
    @@ -1215,7 +1198,6 @@
         دعوت‌ها، برداشتن‌ها و انسدادها تأثیر نمی‌پذیرند.
         نمایش پیام‌های پیوستن و ترک اتاق
         پیش‌نمایشی از آدرس‌های URL در پیام‌ها نمایش داده شود.
    -
         المنت بصورت دوره‌ای و در بازه‌های قابل تنظیم در پس زمینه همگام‌سازی می شود.
     \nاین بر مصرف باتری شما تأثیر می‌گذارد، یک اعلان دائمی نمایش داده می‌شود که المنت برای رویدادها گوش می‌دهد.
         المنت در پس زمینه همگام‌سازی می‌کند به گونه ای که منابع محدود دستگاه (باتری) حفظ می‌شود.
    @@ -1264,7 +1246,6 @@
         هیچ شماره تلفنی به حسابتان افزوده نشده
         نتیجه‌ای در پی نداشت
         فیلترکردن کاربران مسدود شده
    -
         
             %d مورد
             %d مورد
    @@ -1284,19 +1265,13 @@
         تنزل نقش شما در اتاق؟
         شما نمی‌توانید این تغییر را بازگردانید. زیرا در حال ارتقای سطح کاربر دیگر به سطح خودتان هستید.
     \nآیا مطمئن هستید؟
    -
    -
         المنت برای برقراری تماس تصویری نیازمند دسترسی به میکروفون و دوربین است.
     \n
     \nلطفا در پنجره های بعدی دسترسی های لازم را بدهید.
    -
         المنت برای برقراری تماس صوتی نیازمند دسترسی به میکروفون است.
    -
    -
         خطای SSL: هویت طرف مقابل تأیید نشد.
         شکست در برقراری ارتباط همزمان.
     \nلطاً از مدیر کارساز بخواهید برای برقراری مطمئن تماس‌ها، کارساز turn را پیکربندی کند.
    -
         بعد از راه‌اندازی مجدد، هیچ تاریخچه، پیام، دستگاه تائید شده یا کاربر تائید شده‌ای در حساب شما وجود نخواهد داشت
         اگر همه چیز را بازنشانی کنید
         تنها در صورتی این کار را انجام دهید که از هیچ دستگاه دیگری نمی‌توانید این دستگاه را تائید نمائید.
    @@ -1319,7 +1294,6 @@
         اگر اکنون لغو کنید، ممکن است در صورت قطع دسترسی به ورودهایتان، داده‌ها و پیام‌های رمزنگاشته را از دست بدهد.
     \n
     \nهمچنین می‌توانید در تنظیمات، پشتیبان امن برپا کرده و کلیدهایتان را مدیریت کنید.
    -
         آن را در فضای ابری خود کپی کنید
         آن را روی فلش یا حافظه‌ای دیگر ذخیره کنید
         آن را چاپ کرده و در محلی امن و مطمئن نگهداری کنید
    @@ -1478,7 +1452,6 @@
         ارسال به عنوان پیام تباه‌کننده
         حذف‌کردن از اولویت پایین
         اضافه‌کردن به اولویت پایین
    -
         این محتوا به عنوان محتوای نامناسب گزارش شده‌است.
     \n
     \nاگر نمی‌خواهید محتوای بیشتری از این کاربر مشاهده کنید ، می توانید او را نادیده بگیرید تا پیام‌های او را مشاهده نکنید.
    @@ -1553,11 +1526,8 @@
         خطای نامشخص
         %s می‌خواهد نشستتان را تأیید کند
         درخواست تأیید
    -
    -
         فهمیدم
         تأییدشده!
    -
         امضاء
         الگوریتم
         
    @@ -1568,7 +1538,6 @@
         پشتیبان‌گیری از کلیدهای شما. این ممکن است چند دقیقه طول بکشد…
         مدیریت در بخش پشتیبان‌گیری از کلید
         کلیدهای رمزگذاری جدید
    -
         کلیدهای رمزگذاری پشتیبان شما از سرور حذف شوند؟ در اینن صورت دیگر نخواهید توانست از کلید بازیابی خود برای خواندن پیام رمزشده‌ی قبلی خود استفاده کنید.
         حذف نسخه‌ی پشتیبان
         در حال بررسی وضعیت نسخه‌ی پشتیبان
    @@ -1609,7 +1578,6 @@
         به نظر می‌رسد شما در یک نشست دیگر کلید پشتیبان تهیه کرده‌اید. آیا می‌خواهید آن را با موردی که ایجاد می‌کنید جایگزین کنید؟
         از پیش، پشتیبانی روی کارساز خانگیتان وجود دارد
         کلید بازیابی ذخیره شد.
    -
         کلید بازیابی خود را در جایی بسیار امن نظیر برنامه‌های شناخته‌شده‌ی مدیریت گذرواژه نگه دارید
         کلید بازیابی شما برای روز مبادا است - اگر کلید امنیتی خود را فراموش کنید می توانید از آن برای بازیابی دسترسی به پیام‌های رمزگذاری شده استفاده کنید.
     \nکلید بازیابی خود را در جایی بسیار امن نظیر برنامه‌های شناخته‌شده‌ی مدیریت گذرواژه نگه دارید
    @@ -1686,13 +1654,11 @@
             %d دعوت
         
         نام کارساز
    -
         
             %1$d از %2$d کلید با موفقیت بارگذاری شد.
             %1$d از %2$d کلید با موفقیت بارگذاری شدند.
         
         کلیدها با موفقیت بر روی دستگاه استخراج شدند
    -
         لطفاً یک رمز برای رمزنگاری کلیدها وارد کنید. ورود این رمز برای بارگذاری کلیدها ضروری خواهد بود.
         اجتماع
         پخش صدای شاتر
    @@ -1707,13 +1673,11 @@
         لطفاً ایمیل خود را بررسی کنید و روی لینک ارسال شده، کلیک کنید. پس از انجام این کار، روی ادامه کلیک کنید.
         برای انجام این کار اجازه‌ی یکپارچه‌سازی را در تنظیمات فعال کنید.
         یکپارچه‌سازی‌ها غیر فعال هستند
    -
         %1$s @ %2$s
         آخرین اتصال
         نام عمومی
         به‌روزرسانی نام عمومی
         شناسه
    -
         المنت اطلاعاتی را جمع آوری می کند و با ارسال آنان به صورت ناشناس به ما امکان بهبود برنامه را می‌دهد.
         ارسال داده های تجزیه و تحلیل
         تجزیه و تحلیل
    @@ -1786,7 +1750,6 @@
         آغاز به گپ
         برون‌ریزی بازرسی
         اگر اتاق فقط برای تعامل با افراد داخل سرور خانه شما می‌باشد، این قابلیت را فعال کنید. این تنظیم را بعدا نمی‌توانید تغییر دهید.
    -
         یک کلید امنیتی ایجاد کنید تا در مکانی امن مانند سامانه مدیریت رمز عبور یا گاوصندوق آن را ذخیره کنید.
         ارتباطی با این شناسه وجود ندارد.
         هویت خود را تأیید کنید تا به پیام‌های رمز شده دسترسی پیدا کنید.
    @@ -1872,8 +1835,6 @@
         هنگام انتقال تماس خطایی روی داد
         انتقال
         متصل شوید
    -
    -
         تماس فعال (%1$s)
         هنگام جستجوی شماره تلفن خطایی روی داد
         ‬پد شماره گیری
    @@ -2039,7 +2000,7 @@
         من و همگروهی‌هایم
         یک فضای خصوصی برای نظم بخشی به اتاق‌هایتان
         فقط من
    -    مطمئن شوید که افراد درست به %s دسترسی دارند. می‌توانید بعدها این را تغییر دهید.
    +    مطمئن شوید که افراد درست به %s دسترسی دارند.
         ساخت یک فضا
         هر کسی در فضای این اتاق، می‌تواند اتاق را یافته و بپیوندد. فقط مدیران این اتاق می توانند به فضایی بیفزایندش.
         فقط اعضای فضا
    @@ -2123,7 +2084,6 @@
         ارتقا
         لطفاً شکیبا باشید. ممکن است کمی زمان ببرد.
         پیوستن به اتاق جایگزینی
    -
         ناپایدار
         پایدار
         نگارش پیش‌گزیده
    @@ -2313,7 +2273,6 @@
         پرسش یا موضوع نظرسنجی
         ایجاد نظرسنجی
         نظرسنجی
    -
         فرستادن رایانامه‌ّا و شماره‌های تلفن به %s
         آشنایانتان خصوصی هستند. برای کشف کاربران از آشنایانتان، نیاز به اجازه‌تان برای فرستادن اطّلاعات آشنا به کارساز هویتتان داریم.
         نشست خارج شده است!
    @@ -2446,4 +2405,18 @@
         رونوشت از پیوند به رشته
         دیدن در اتاق
         دیدن رشته‌ها
    +    
    +        %d تغییر سطح کنترل دسترسی
    +        %d تغییر سطح کنترل دسترسی
    +    
    +    آگاهی اتاق
    +    کاربران
    +    آگاهی به تمام اتاق
    +    
    +        %1$d بیش‌تر
    +        %1$d بیش‌تر
    +    
    +    نمایش کم‌تر
    +    %1$s، %2$s و دیگران
    +    %1$s و %2$s
     
    \ No newline at end of file
    
    From 91259bef40623773b123ad57aa3fc33dc8bd8a47 Mon Sep 17 00:00:00 2001
    From: SpiritCroc 
    Date: Thu, 17 Mar 2022 11:02:32 +0100
    Subject: [PATCH 067/126] Ensure proper double linking of TimelineChunks
    
    We need both directions so getOffsetIndex() produces correct results in
    all cases.
    ---
     changelog.d/5564.bugfix                          |  1 +
     .../session/room/timeline/TimelineChunk.kt       | 16 ++++++++++++----
     2 files changed, 13 insertions(+), 4 deletions(-)
     create mode 100644 changelog.d/5564.bugfix
    
    diff --git a/changelog.d/5564.bugfix b/changelog.d/5564.bugfix
    new file mode 100644
    index 0000000000..64891b503c
    --- /dev/null
    +++ b/changelog.d/5564.bugfix
    @@ -0,0 +1 @@
    +Fix sometimes read marker not properly updating
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt
    index 8a7078fdf9..c8f2132ae6 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt
    @@ -83,11 +83,15 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity,
                 isLastBackward.set(chunkEntity.isLastBackward)
             }
             if (changeSet.isFieldChanged(ChunkEntityFields.NEXT_CHUNK.`$`)) {
    -            nextChunk = createTimelineChunk(chunkEntity.nextChunk)
    +            nextChunk = createTimelineChunk(chunkEntity.nextChunk).also {
    +                it?.prevChunk = this
    +            }
                 nextChunkLatch?.complete(Unit)
             }
             if (changeSet.isFieldChanged(ChunkEntityFields.PREV_CHUNK.`$`)) {
    -            prevChunk = createTimelineChunk(chunkEntity.prevChunk)
    +            prevChunk = createTimelineChunk(chunkEntity.prevChunk).also {
    +                it?.nextChunk = this
    +            }
                 prevChunkLatch?.complete(Unit)
             }
         }
    @@ -194,7 +198,9 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity,
                 when {
                     nextChunkEntity != null -> {
                         if (nextChunk == null) {
    -                        nextChunk = createTimelineChunk(nextChunkEntity)
    +                        nextChunk = createTimelineChunk(nextChunkEntity).also {
    +                            it?.prevChunk = this
    +                        }
                         }
                         nextChunk?.loadMore(offsetCount, direction, fetchFromServerIfNeeded) ?: LoadMoreResult.FAILURE
                     }
    @@ -210,7 +216,9 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity,
                 when {
                     prevChunkEntity != null -> {
                         if (prevChunk == null) {
    -                        prevChunk = createTimelineChunk(prevChunkEntity)
    +                        prevChunk = createTimelineChunk(prevChunkEntity).also {
    +                            it?.nextChunk = this
    +                        }
                         }
                         prevChunk?.loadMore(offsetCount, direction, fetchFromServerIfNeeded) ?: LoadMoreResult.FAILURE
                     }
    
    From 2ca3387ab3648034f6e3a04f497e89eb415499bb Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Thu, 17 Mar 2022 18:51:54 +0100
    Subject: [PATCH 068/126] Migrate Threads and notify user
    
    ---
     .../android/sdk/api/MatrixConfiguration.kt    |  6 +-
     .../lightweight/LightweightSettingsStorage.kt |  8 ++-
     .../session/sync/SyncResponseHandler.kt       |  2 +-
     .../src/main/res/values/config-settings.xml   |  3 +-
     .../im/vector/app/core/di/SingletonModule.kt  |  8 ++-
     .../im/vector/app/features/MainActivity.kt    |  2 +-
     .../vector/app/features/home/HomeActivity.kt  | 48 +++++++++++++++
     .../features/home/HomeActivityViewEvents.kt   |  3 +
     .../features/home/HomeActivityViewModel.kt    | 46 +++++++++++++++
     .../features/settings/VectorPreferences.kt    | 58 ++++++++++++++++++-
     .../settings/VectorSettingsLabsFragment.kt    |  1 +
     .../src/main/res/xml/vector_settings_labs.xml |  4 +-
     12 files changed, 177 insertions(+), 12 deletions(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt
    index c87f21d7ac..f8472319fd 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt
    @@ -60,7 +60,11 @@ data class MatrixConfiguration(
             /**
              * RoomDisplayNameFallbackProvider to provide default room display name.
              */
    -        val roomDisplayNameFallbackProvider: RoomDisplayNameFallbackProvider
    +        val roomDisplayNameFallbackProvider: RoomDisplayNameFallbackProvider,
    +        /**
    +         * Thread messages default enable/disabled value
    +         */
    +        val threadMessagesEnabledDefault: Boolean = false,
     ) {
     
         /**
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt
    index 700b94a985..65c98ab872 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt
    @@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.database.lightweight
     import android.content.Context
     import androidx.core.content.edit
     import androidx.preference.PreferenceManager
    +import org.matrix.android.sdk.api.MatrixConfiguration
     import javax.inject.Inject
     
     /**
    @@ -27,7 +28,10 @@ import javax.inject.Inject
      * not for large data sets
      */
     
    -class LightweightSettingsStorage  @Inject constructor(context: Context) {
    +class LightweightSettingsStorage  @Inject constructor(
    +        context: Context,
    +        val matrixConfiguration: MatrixConfiguration
    +) {
     
         private val sdkDefaultPrefs = PreferenceManager.getDefaultSharedPreferences(context.applicationContext)
     
    @@ -38,7 +42,7 @@ class LightweightSettingsStorage  @Inject constructor(context: Context) {
         }
     
         fun areThreadMessagesEnabled(): Boolean {
    -        return sdkDefaultPrefs.getBoolean(MATRIX_SDK_SETTINGS_THREAD_MESSAGES_ENABLED, false)
    +        return sdkDefaultPrefs.getBoolean(MATRIX_SDK_SETTINGS_THREAD_MESSAGES_ENABLED, matrixConfiguration.threadMessagesEnabledDefault)
         }
     
         companion object {
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
    index 1bbf54a788..ac3ae3df91 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
    @@ -75,7 +75,7 @@ internal class SyncResponseHandler @Inject constructor(
         suspend fun handleResponse(syncResponse: SyncResponse,
                                    fromToken: String?,
                                    reporter: ProgressReporter?) {
    -        val isInitialSync = fromToken == null
    +        var isInitialSync = fromToken == null
             Timber.v("Start handling sync, is InitialSync: $isInitialSync")
     
             measureTimeMillis {
    diff --git a/vector-config/src/main/res/values/config-settings.xml b/vector-config/src/main/res/values/config-settings.xml
    index 0121ee9ae7..40fc68bbae 100755
    --- a/vector-config/src/main/res/values/config-settings.xml
    +++ b/vector-config/src/main/res/values/config-settings.xml
    @@ -36,8 +36,9 @@
         
     
         
    +    false
     
    -    
    +    
     
         
     
    diff --git a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt
    index a5575ef536..211bc3987f 100644
    --- a/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt
    +++ b/vector/src/main/java/im/vector/app/core/di/SingletonModule.kt
    @@ -46,6 +46,7 @@ import im.vector.app.features.navigation.Navigator
     import im.vector.app.features.pin.PinCodeStore
     import im.vector.app.features.pin.SharedPrefPinCodeStore
     import im.vector.app.features.room.VectorRoomDisplayNameFallbackProvider
    +import im.vector.app.features.settings.VectorPreferences
     import im.vector.app.features.ui.SharedPreferencesUiStateRepository
     import im.vector.app.features.ui.UiStateRepository
     import kotlinx.coroutines.CoroutineScope
    @@ -113,10 +114,13 @@ object VectorStaticModule {
         }
     
         @Provides
    -    fun providesMatrixConfiguration(vectorRoomDisplayNameFallbackProvider: VectorRoomDisplayNameFallbackProvider): MatrixConfiguration {
    +    fun providesMatrixConfiguration(
    +            vectorPreferences: VectorPreferences,
    +            vectorRoomDisplayNameFallbackProvider: VectorRoomDisplayNameFallbackProvider): MatrixConfiguration {
             return MatrixConfiguration(
                     applicationFlavor = BuildConfig.FLAVOR_DESCRIPTION,
    -                roomDisplayNameFallbackProvider = vectorRoomDisplayNameFallbackProvider
    +                roomDisplayNameFallbackProvider = vectorRoomDisplayNameFallbackProvider,
    +                threadMessagesEnabledDefault = vectorPreferences.areThreadMessagesEnabled()
             )
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/MainActivity.kt b/vector/src/main/java/im/vector/app/features/MainActivity.kt
    index 33b735551c..42bd2318b3 100644
    --- a/vector/src/main/java/im/vector/app/features/MainActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/MainActivity.kt
    @@ -241,7 +241,7 @@ class MainActivity : VectorBaseActivity(), UnlockedActivity
                     // We have a session.
                     // Check it can be opened
                     if (sessionHolder.getActiveSession().isOpenable) {
    -                    HomeActivity.newIntent(this)
    +                    HomeActivity.newIntent(this, existingSession = true)
                     } else {
                         // The token is still invalid
                         navigator.softLogout(this)
    diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    index 964fb6f365..1bd61c0f9e 100644
    --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    @@ -90,6 +90,7 @@ import javax.inject.Inject
     data class HomeActivityArgs(
             val clearNotification: Boolean,
             val accountCreation: Boolean,
    +        val existingSession: Boolean = false,
             val inviteNotificationRoomId: String? = null
     ) : Parcelable
     
    @@ -253,6 +254,8 @@ class HomeActivity :
                     HomeActivityViewEvents.PromptToEnableSessionPush        -> handlePromptToEnablePush()
                     is HomeActivityViewEvents.OnCrossSignedInvalidated      -> handleCrossSigningInvalidated(it)
                     HomeActivityViewEvents.ShowAnalyticsOptIn               -> handleShowAnalyticsOptIn()
    +                HomeActivityViewEvents.NotifyUserForThreadsMigration    -> handleNotifyUserForThreadsMigration()
    +                is HomeActivityViewEvents.MigrateThreads                -> migrateThreadsIfNeeded(it.checkSession)
                 }.exhaustive
             }
             homeActivityViewModel.onEach { renderState(it) }
    @@ -269,6 +272,49 @@ class HomeActivity :
             navigator.openAnalyticsOptIn(this)
         }
     
    +    /**
    +     * Migrating from old threads io.element.thread to new m.thread needs an initial sync to
    +     * sync and display existing messages appropriately
    +     */
    +    private fun migrateThreadsIfNeeded(checkSession: Boolean) {
    +
    +        if (checkSession) {
    +            // We should check session to ensure we will only clear cache if needed
    +            val args = intent.getParcelableExtra(Mavericks.KEY_ARG)
    +            if (args?.existingSession == true) {
    +                // existingSession --> Will be true only if we came from an existing active session
    +                Timber.i("----> Migrating threads from an existing session..")
    +                handleThreadsMigration()
    +            } else {
    +                // We came from a new session and not an existing one,
    +                // so there is no need to migrate threads while an initial synced performed
    +                Timber.i("----> No thread migration needed, we are ok")
    +                vectorPreferences.threadsMigrated()
    +            }
    +        } else {
    +            // Proceed with migration
    +            handleThreadsMigration()
    +        }
    +    }
    +
    +    /**
    +     * Clear cache and restart to invoke an initial sync for threads migration
    +     */
    +    private fun handleThreadsMigration() {
    +        Timber.i("----> Threads Migration detected, clearing cache and sync...")
    +        vectorPreferences.threadsMigrated()
    +        MainActivity.restartApp(this, MainActivityArgs(clearCache = true))
    +    }
    +
    +    private fun handleNotifyUserForThreadsMigration() {
    +        MaterialAlertDialogBuilder(this)
    +                .setTitle("Threads, no longer experimental")
    +                .setMessage("All \uD83C\uDF89 \uD83C\uDF89 threads created during experimental period will\n\n now be rendered as regular replies. This will be an one-off transition, as threads are now part of the matrix specification")
    +                .setCancelable(true)
    +                .setPositiveButton(R.string.ok) { _, _ -> }
    +                .show()
    +    }
    +
         private fun handleIntent(intent: Intent?) {
             intent?.dataString?.let { deepLink ->
                 val resolvedLink = when {
    @@ -546,11 +592,13 @@ class HomeActivity :
             fun newIntent(context: Context,
                           clearNotification: Boolean = false,
                           accountCreation: Boolean = false,
    +                      existingSession: Boolean = false,
                           inviteNotificationRoomId: String? = null
             ): Intent {
                 val args = HomeActivityArgs(
                         clearNotification = clearNotification,
                         accountCreation = accountCreation,
    +                    existingSession = existingSession,
                         inviteNotificationRoomId = inviteNotificationRoomId
                 )
     
    diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt
    index adc44a57bd..e301967884 100644
    --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt
    @@ -25,4 +25,7 @@ sealed interface HomeActivityViewEvents : VectorViewEvents {
         data class OnCrossSignedInvalidated(val userItem: MatrixItem.UserItem) : HomeActivityViewEvents
         object PromptToEnableSessionPush : HomeActivityViewEvents
         object ShowAnalyticsOptIn : HomeActivityViewEvents
    +    object NotifyUserForThreadsMigration : HomeActivityViewEvents
    +    data class MigrateThreads(val checkSession: Boolean) : HomeActivityViewEvents
    +
     }
    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 35c112b63a..bb248965e4 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
    @@ -51,6 +51,7 @@ import org.matrix.android.sdk.api.util.toMatrixItem
     import org.matrix.android.sdk.flow.flow
     import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo
     import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap
    +import org.matrix.android.sdk.internal.database.lightweight.LightweightSettingsStorage
     import org.matrix.android.sdk.internal.util.awaitCallback
     import timber.log.Timber
     import kotlin.coroutines.Continuation
    @@ -62,6 +63,7 @@ class HomeActivityViewModel @AssistedInject constructor(
             private val activeSessionHolder: ActiveSessionHolder,
             private val reAuthHelper: ReAuthHelper,
             private val analyticsStore: AnalyticsStore,
    +        private val lightweightSettingsStorage: LightweightSettingsStorage,
             private val vectorPreferences: VectorPreferences
     ) : VectorViewModel(initialState) {
     
    @@ -84,6 +86,7 @@ class HomeActivityViewModel @AssistedInject constructor(
             checkSessionPushIsOn()
             observeCrossSigningReset()
             observeAnalytics()
    +        initThreadsMigration()
         }
     
         private fun observeAnalytics() {
    @@ -130,6 +133,49 @@ class HomeActivityViewModel @AssistedInject constructor(
                     .launchIn(viewModelScope)
         }
     
    +    /**
    +     * Handle threads migration. The migration includes:
    +     * - Notify users that had io.element.thread enabled from labs
    +     * - Re-Enable m.thread to those users (that they had enabled labs threads)
    +     * - Handle migration when threads are enabled by default
    +     */
    +    private fun initThreadsMigration() {
    +
    +        // Notify users
    +        if (vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.areThreadMessagesEnabled()) {
    +            Timber.i("----> Notify users about threads")
    +            // Notify the user if needed that we migrated to support m.thread
    +            // instead of io.element.thread so old thread messages will be displayed as normal timeline messages
    +            _viewEvents.post(HomeActivityViewEvents.NotifyUserForThreadsMigration)
    +            vectorPreferences.userNotifiedAboutThreads()
    +            return
    +        }
    +
    +        // Migrate users with enabled lab settings
    +        if (vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.shouldMigrateThreads()) {
    +            Timber.i("----> Migrate threads with enabled labs")
    +            // If user had io.element.thread enabled then enable the new thread support,
    +            // clear cache to sync messages appropriately
    +            vectorPreferences.setThreadMessagesEnabled()
    +            lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
    +            // Clear Cache
    +            _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = false))
    +            return
    +        }
    +        // Enable all users
    +        // When we would to enable threads for all
    +        // if(vectorPreferences.shouldMigrateThreads) -->
    +        // vectorPreferences.setThreadMessagesEnabled() &&
    +        // lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
    +        if(vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()){
    +            Timber.i("----> Try to migrate threads")
    +            _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = true))
    +            return
    +        }
    +
    +
    +    }
    +
         private fun observeInitialSync() {
             val session = activeSessionHolder.getSafeActiveSession() ?: return
     
    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 352c5768fb..d263dc1cbb 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
    @@ -201,7 +201,13 @@ class VectorPreferences @Inject constructor(private val context: Context) {
             private const val TAKE_PHOTO_VIDEO_MODE = "TAKE_PHOTO_VIDEO_MODE"
     
             private const val SETTINGS_LABS_RENDER_LOCATIONS_IN_TIMELINE = "SETTINGS_LABS_RENDER_LOCATIONS_IN_TIMELINE"
    -        const val SETTINGS_LABS_ENABLE_THREAD_MESSAGES = "SETTINGS_LABS_ENABLE_THREAD_MESSAGES"
    +
    +        // This key will be used to identify clients with the old thread support enabled io.element.thread
    +        const val SETTINGS_LABS_ENABLE_THREAD_MESSAGES_OLD_CLIENTS = "SETTINGS_LABS_ENABLE_THREAD_MESSAGES"
    +
    +        // This key will be used to identify clients with the new thread support enabled m.thread
    +        const val SETTINGS_LABS_ENABLE_THREAD_MESSAGES = "SETTINGS_LABS_ENABLE_THREAD_MESSAGES_FINAL"
    +        const val SETTINGS_THREAD_MESSAGES_SYNCED = "SETTINGS_THREAD_MESSAGES_SYNCED"
     
             // Possible values for TAKE_PHOTO_VIDEO_MODE
             const val TAKE_PHOTO_VIDEO_MODE_ALWAYS_ASK = 0
    @@ -1006,7 +1012,55 @@ class VectorPreferences @Inject constructor(private val context: Context) {
             return defaultPrefs.getBoolean(SETTINGS_LABS_RENDER_LOCATIONS_IN_TIMELINE, true)
         }
     
    +    /**
    +     * Indicates whether or not thread messages are enabled
    +     */
         fun areThreadMessagesEnabled(): Boolean {
    -        return defaultPrefs.getBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES, false)
    +        return defaultPrefs.getBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES, getDefault(R.bool.settings_labs_thread_messages_default))
    +    }
    +
    +    /**
    +     * Manually sets thread messages enabled, useful for migrating users from io.element.thread
    +     */
    +    fun setThreadMessagesEnabled() {
    +        defaultPrefs
    +                .edit()
    +                .putBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES, true)
    +                .apply()
    +    }
    +    /**
    +     * Indicates whether or not the user will be notified about the new thread support
    +     * We should notify the user only if he had old thread support enabled
    +     */
    +    fun shouldNotifyUserAboutThreads(): Boolean {
    +        return defaultPrefs.getBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES_OLD_CLIENTS, false)
    +    }
    +
    +    /**
    +     * Indicates that the user have been notified about threads migration
    +     */
    +    fun userNotifiedAboutThreads() {
    +        defaultPrefs
    +                .edit()
    +                .putBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES_OLD_CLIENTS, false)
    +                .apply()
    +    }
    +
    +    /**
    +     * Indicates whether or not we should clear cache for threads migration.
    +     * Default value is true, for fresh installs and updates
    +     */
    +    fun shouldMigrateThreads(): Boolean {
    +        return defaultPrefs.getBoolean(SETTINGS_THREAD_MESSAGES_SYNCED, true)
    +    }
    +
    +    /**
    +     * Indicates that there no longer threads migration needed
    +     */
    +    fun threadsMigrated() {
    +        defaultPrefs
    +                .edit()
    +                .putBoolean(SETTINGS_THREAD_MESSAGES_SYNCED, false)
    +                .apply()
         }
     }
    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 118e820f84..683c1e1dd2 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
    @@ -42,6 +42,7 @@ class VectorSettingsLabsFragment @Inject constructor(
             // clear cache
             findPreference(VectorPreferences.SETTINGS_LABS_ENABLE_THREAD_MESSAGES)?.let {
                 it.onPreferenceClickListener = Preference.OnPreferenceClickListener {
    +                vectorPreferences.threadsMigrated() // Manual actions should disable the ato enable mechanism
                     lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
                     displayLoadingView()
                     MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
    diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml
    index 73193edfd5..5144f6fe1f 100644
    --- a/vector/src/main/res/xml/vector_settings_labs.xml
    +++ b/vector/src/main/res/xml/vector_settings_labs.xml
    @@ -52,8 +52,8 @@
         
     
         
     
    
    From 61cb7a6ffb41a8775eb9389923c346b7736b5456 Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Thu, 17 Mar 2022 19:09:09 +0100
    Subject: [PATCH 069/126] Prepare next RC threads migration to all users
    
    ---
     .../im/vector/app/features/home/HomeActivityViewModel.kt   | 7 ++++---
     1 file changed, 4 insertions(+), 3 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 bb248965e4..ba91ac7ae1 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
    @@ -164,9 +164,10 @@ class HomeActivityViewModel @AssistedInject constructor(
             }
             // Enable all users
             // When we would to enable threads for all
    -        // if(vectorPreferences.shouldMigrateThreads) -->
    -        // vectorPreferences.setThreadMessagesEnabled() &&
    -        // lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
    +//        if(vectorPreferences.shouldMigrateThreads()) {
    +//            vectorPreferences.setThreadMessagesEnabled()
    +//            lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
    +//        }
             if(vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()){
                 Timber.i("----> Try to migrate threads")
                 _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = true))
    
    From f00b1f29bf5562c7f767f0758a16b9e92c5d0fe8 Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Fri, 18 Mar 2022 11:58:29 +0100
    Subject: [PATCH 070/126] Enhance text context for thread migration notice
    
    ---
     .../main/java/im/vector/app/features/home/HomeActivity.kt  | 7 +++----
     .../im/vector/app/features/home/HomeActivityViewEvents.kt  | 1 -
     .../im/vector/app/features/home/HomeActivityViewModel.kt   | 5 +----
     vector/src/main/res/values/strings.xml                     | 2 ++
     4 files changed, 6 insertions(+), 9 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    index 1bd61c0f9e..f6ee160104 100644
    --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    @@ -277,7 +277,6 @@ class HomeActivity :
          * sync and display existing messages appropriately
          */
         private fun migrateThreadsIfNeeded(checkSession: Boolean) {
    -
             if (checkSession) {
                 // We should check session to ensure we will only clear cache if needed
                 val args = intent.getParcelableExtra(Mavericks.KEY_ARG)
    @@ -308,10 +307,10 @@ class HomeActivity :
     
         private fun handleNotifyUserForThreadsMigration() {
             MaterialAlertDialogBuilder(this)
    -                .setTitle("Threads, no longer experimental")
    -                .setMessage("All \uD83C\uDF89 \uD83C\uDF89 threads created during experimental period will\n\n now be rendered as regular replies. This will be an one-off transition, as threads are now part of the matrix specification")
    +                .setTitle(R.string.threads_notice_migration_title)
    +                .setMessage(R.string.threads_notice_migration_message)
                     .setCancelable(true)
    -                .setPositiveButton(R.string.ok) { _, _ -> }
    +                .setPositiveButton(R.string.sas_got_it) { _, _ -> }
                     .show()
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt
    index e301967884..5efd49a579 100644
    --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewEvents.kt
    @@ -27,5 +27,4 @@ sealed interface HomeActivityViewEvents : VectorViewEvents {
         object ShowAnalyticsOptIn : HomeActivityViewEvents
         object NotifyUserForThreadsMigration : HomeActivityViewEvents
         data class MigrateThreads(val checkSession: Boolean) : HomeActivityViewEvents
    -
     }
    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 ba91ac7ae1..e6a7fd37a2 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
    @@ -140,7 +140,6 @@ class HomeActivityViewModel @AssistedInject constructor(
          * - Handle migration when threads are enabled by default
          */
         private fun initThreadsMigration() {
    -
             // Notify users
             if (vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.areThreadMessagesEnabled()) {
                 Timber.i("----> Notify users about threads")
    @@ -168,13 +167,11 @@ class HomeActivityViewModel @AssistedInject constructor(
     //            vectorPreferences.setThreadMessagesEnabled()
     //            lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
     //        }
    -        if(vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()){
    +        if (vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()) {
                 Timber.i("----> Try to migrate threads")
                 _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = true))
                 return
             }
    -
    -
         }
     
         private fun observeInitialSync() {
    diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
    index 162ab3e119..fbb3b81efa 100644
    --- a/vector/src/main/res/values/strings.xml
    +++ b/vector/src/main/res/values/strings.xml
    @@ -731,6 +731,8 @@
         
         Tip: Long tap a message and use “%s”.
         From a Thread
    +    Threads no longer experimental
    +    All threads created during the experimental period will now be rendered as regular replies.\n\nThis will be a one-off transition, as threads are now part of the Matrix specification.\n\nThank you for helping us test Threads! 🎉
     
         
         Search
    
    From 2e5d45ec6e9e403cf047c2aa2954babff4da36f2 Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Fri, 18 Mar 2022 12:03:17 +0100
    Subject: [PATCH 071/126] Format code
    
    ---
     .../java/im/vector/app/features/settings/VectorPreferences.kt    | 1 +
     1 file changed, 1 insertion(+)
    
    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 d263dc1cbb..bd20c57ca5 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
    @@ -1028,6 +1028,7 @@ class VectorPreferences @Inject constructor(private val context: Context) {
                     .putBoolean(SETTINGS_LABS_ENABLE_THREAD_MESSAGES, true)
                     .apply()
         }
    +
         /**
          * Indicates whether or not the user will be notified about the new thread support
          * We should notify the user only if he had old thread support enabled
    
    From fd4d99d6fce5ecd9705410107de83ecd4df34977 Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Fri, 18 Mar 2022 14:50:34 +0100
    Subject: [PATCH 072/126] Possible NullPointerException crash fix
    
    ---
     .../matrix/android/sdk/internal/di/WorkManagerProvider.kt    | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt
    index 7d004bc5c0..e6143b4dc8 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt
    @@ -31,6 +31,7 @@ import kotlinx.coroutines.launch
     import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
     import org.matrix.android.sdk.internal.session.SessionScope
     import org.matrix.android.sdk.internal.worker.MatrixWorkerFactory
    +import timber.log.Timber
     import java.util.concurrent.TimeUnit
     import javax.inject.Inject
     
    @@ -80,8 +81,8 @@ internal class WorkManagerProvider @Inject constructor(
                 workManager.enqueue(checkWorkerRequest)
                 val checkWorkerLiveState = workManager.getWorkInfoByIdLiveData(checkWorkerRequest.id)
                 val observer = object : Observer {
    -                override fun onChanged(workInfo: WorkInfo) {
    -                    if (workInfo.state.isFinished) {
    +                override fun onChanged(workInfo: WorkInfo?) {
    +                    if (workInfo?.state?.isFinished == true) {
                             checkWorkerLiveState.removeObserver(this)
                             if (workInfo.state == WorkInfo.State.FAILED) {
                                 throw RuntimeException("MatrixWorkerFactory is not being set on your worker configuration.\n" +
    
    From 06db7e2374039ba0860ed9faef9ccacbed11111b Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Fri, 18 Mar 2022 14:51:06 +0100
    Subject: [PATCH 073/126] Enhance migration logic & PR remarks
    
    ---
     .../session/sync/SyncResponseHandler.kt       |  2 +-
     .../vector/app/features/home/HomeActivity.kt  |  4 +-
     .../features/home/HomeActivityViewModel.kt    | 53 +++++++++----------
     .../features/settings/VectorPreferences.kt    |  4 +-
     .../settings/VectorSettingsLabsFragment.kt    |  3 +-
     5 files changed, 33 insertions(+), 33 deletions(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
    index ac3ae3df91..1bbf54a788 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
    @@ -75,7 +75,7 @@ internal class SyncResponseHandler @Inject constructor(
         suspend fun handleResponse(syncResponse: SyncResponse,
                                    fromToken: String?,
                                    reporter: ProgressReporter?) {
    -        var isInitialSync = fromToken == null
    +        val isInitialSync = fromToken == null
             Timber.v("Start handling sync, is InitialSync: $isInitialSync")
     
             measureTimeMillis {
    diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    index f6ee160104..dbeb5d5b8f 100644
    --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    @@ -288,7 +288,7 @@ class HomeActivity :
                     // We came from a new session and not an existing one,
                     // so there is no need to migrate threads while an initial synced performed
                     Timber.i("----> No thread migration needed, we are ok")
    -                vectorPreferences.threadsMigrated()
    +                vectorPreferences.setShouldMigrateThreads(shouldMigrate = false)
                 }
             } else {
                 // Proceed with migration
    @@ -301,7 +301,7 @@ class HomeActivity :
          */
         private fun handleThreadsMigration() {
             Timber.i("----> Threads Migration detected, clearing cache and sync...")
    -        vectorPreferences.threadsMigrated()
    +        vectorPreferences.setShouldMigrateThreads(shouldMigrate = false)
             MainActivity.restartApp(this, MainActivityArgs(clearCache = true))
         }
     
    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 e6a7fd37a2..b4af50c7ff 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
    @@ -140,37 +140,36 @@ class HomeActivityViewModel @AssistedInject constructor(
          * - Handle migration when threads are enabled by default
          */
         private fun initThreadsMigration() {
    -        // Notify users
    -        if (vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.areThreadMessagesEnabled()) {
    -            Timber.i("----> Notify users about threads")
    -            // Notify the user if needed that we migrated to support m.thread
    -            // instead of io.element.thread so old thread messages will be displayed as normal timeline messages
    -            _viewEvents.post(HomeActivityViewEvents.NotifyUserForThreadsMigration)
    -            vectorPreferences.userNotifiedAboutThreads()
    -            return
    -        }
    -
    -        // Migrate users with enabled lab settings
    -        if (vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.shouldMigrateThreads()) {
    -            Timber.i("----> Migrate threads with enabled labs")
    -            // If user had io.element.thread enabled then enable the new thread support,
    -            // clear cache to sync messages appropriately
    -            vectorPreferences.setThreadMessagesEnabled()
    -            lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
    -            // Clear Cache
    -            _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = false))
    -            return
    -        }
    -        // Enable all users
    -        // When we would to enable threads for all
    +        // When we would like to enable threads for all users
     //        if(vectorPreferences.shouldMigrateThreads()) {
     //            vectorPreferences.setThreadMessagesEnabled()
     //            lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
     //        }
    -        if (vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()) {
    -            Timber.i("----> Try to migrate threads")
    -            _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = true))
    -            return
    +
    +        when {
    +            // Notify users
    +            vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.areThreadMessagesEnabled() -> {
    +                Timber.i("----> Notify users about threads")
    +                // Notify the user if needed that we migrated to support m.thread
    +                // instead of io.element.thread so old thread messages will be displayed as normal timeline messages
    +                _viewEvents.post(HomeActivityViewEvents.NotifyUserForThreadsMigration)
    +                vectorPreferences.userNotifiedAboutThreads()
    +            }
    +            // Migrate users with enabled lab settings
    +            vectorPreferences.shouldNotifyUserAboutThreads() && vectorPreferences.shouldMigrateThreads()     -> {
    +                Timber.i("----> Migrate threads with enabled labs")
    +                // If user had io.element.thread enabled then enable the new thread support,
    +                // clear cache to sync messages appropriately
    +                vectorPreferences.setThreadMessagesEnabled()
    +                lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
    +                // Clear Cache
    +                _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = false))
    +            }
    +            // Enable all users
    +            vectorPreferences.shouldMigrateThreads() && vectorPreferences.areThreadMessagesEnabled()         -> {
    +                Timber.i("----> Try to migrate threads")
    +                _viewEvents.post(HomeActivityViewEvents.MigrateThreads(checkSession = true))
    +            }
             }
         }
     
    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 bd20c57ca5..8d93edc0ec 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
    @@ -1058,10 +1058,10 @@ class VectorPreferences @Inject constructor(private val context: Context) {
         /**
          * Indicates that there no longer threads migration needed
          */
    -    fun threadsMigrated() {
    +    fun setShouldMigrateThreads(shouldMigrate: Boolean) {
             defaultPrefs
                     .edit()
    -                .putBoolean(SETTINGS_THREAD_MESSAGES_SYNCED, false)
    +                .putBoolean(SETTINGS_THREAD_MESSAGES_SYNCED, shouldMigrate)
                     .apply()
         }
     }
    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 683c1e1dd2..003832fb97 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
    @@ -42,7 +42,8 @@ class VectorSettingsLabsFragment @Inject constructor(
             // clear cache
             findPreference(VectorPreferences.SETTINGS_LABS_ENABLE_THREAD_MESSAGES)?.let {
                 it.onPreferenceClickListener = Preference.OnPreferenceClickListener {
    -                vectorPreferences.threadsMigrated() // Manual actions should disable the ato enable mechanism
    +                // We should migrate threads only if threads are disabled
    +                vectorPreferences.setShouldMigrateThreads(!vectorPreferences.areThreadMessagesEnabled())
                     lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
                     displayLoadingView()
                     MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
    
    From e574fda0993fca8d483507300cffbe28ff7acef8 Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Fri, 18 Mar 2022 14:55:14 +0100
    Subject: [PATCH 074/126] Remove unused import
    
    ---
     .../org/matrix/android/sdk/internal/di/WorkManagerProvider.kt    | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt
    index e6143b4dc8..fedd7d05f9 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt
    @@ -31,7 +31,6 @@ import kotlinx.coroutines.launch
     import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
     import org.matrix.android.sdk.internal.session.SessionScope
     import org.matrix.android.sdk.internal.worker.MatrixWorkerFactory
    -import timber.log.Timber
     import java.util.concurrent.TimeUnit
     import javax.inject.Inject
     
    
    From df717dd82d0d6093ceb6b95fcaf0f3ac7fa98401 Mon Sep 17 00:00:00 2001
    From: Zet 
    Date: Wed, 16 Mar 2022 17:55:53 +0000
    Subject: [PATCH 075/126] Translated using Weblate (Arabic)
    
    Currently translated at 32.7% (706 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/ar/
    ---
     vector/src/main/res/values-ar/strings.xml | 50 +++++++++++++++++++++++
     1 file changed, 50 insertions(+)
    
    diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml
    index f0cc1fbceb..10c10b8062 100644
    --- a/vector/src/main/res/values-ar/strings.xml
    +++ b/vector/src/main/res/values-ar/strings.xml
    @@ -822,4 +822,54 @@
         فشلت إزالة الودجة
         فشلت إضافة الودجة
         يستمع للإشعارات
    +    ينتظر…
    +    تفاعلَ بـ: %s
    +    استبيان
    +    ملصق
    +    ملف
    +    تسجيل صوتي
    +    صوت
    +    صورة.
    +    فيديو.
    +    ليس آمن
    +    ينشئ فضاءً…
    +    فشل إرسال الاقتراح (%s)
    +    شكرًا، أُرسل اقتراحك
    +    صِف اقتراحك
    +    اكتب اقتراحك أدناه.
    +    إعدادات النظام
    +    احصل على المساعدة باستخدام ${app_name}
    +    الصوت والفيديو
    +    الأمان والخصوصية
    +    الخيارات
    +    عام
    +    "أُنشئت  الغرفة، لكن فشل إرسال بعض الدعوات بسبب:
    +\n
    +\n%s"
    +    يمكن لأي شخص الإنضمام لهذه الغرفة
    +    علنية
    +    إعدادات الغرفة
    +    الموضوع
    +    موضوع الغرفة (اختياري)
    +    الاسم
    +    اسم الغرفة
    +    أنشئ
    +    رسالة مباشرة
    +    الغرف
    +    لا يمكنك معاينة هذه الغرفة، هل تريد الإنضمام إليها؟
    +    لا يمكنك الوصول إلى هذه الغرفة حاليًا.
    +\nحاول لاحقًا، أو اسأل مدير الغرفة إن كان لديك نفاذ لها.
    +    تتعذر معاية هذه الغرفة
    +    كل المجتمعات
    +    رجاء انتظر…
    +    غيّر الشبكة
    +    أنشئ فضاء جديد
    +    أنشئ غرفة جديدة
    +    حدث حذفه مستخدم
    +    اعرض الرسائل المحذوفة
    +    حُذفت الرسالة
    +    الانفعالات
    +    اعرض الانفعالات
    +    أضف انفعالًا
    +    الانفعالات
     
    \ No newline at end of file
    
    From 805666b2f5e879fe4e93ef53f12c9fa5eefa4157 Mon Sep 17 00:00:00 2001
    From: waclaw66 
    Date: Thu, 17 Mar 2022 18:18:38 +0000
    Subject: [PATCH 076/126] Translated using Weblate (Czech)
    
    Currently translated at 100.0% (2157 of 2157 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 | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml
    index cf022172c2..c7e0f96433 100644
    --- a/vector/src/main/res/values-cs/strings.xml
    +++ b/vector/src/main/res/values-cs/strings.xml
    @@ -932,7 +932,7 @@
         Opakovat
         Poslali Vám pozvánku
         %s Vás pozval
    -    Vše jste dohnali!
    +    To je všechno!
         Nemáte již žádné nepřečtené zprávy
         Konverzace
         Tady budou zobrazeny Vaše přímé konverzace. Pro novou zprávu klepněte na + vpravo dole.
    
    From 96904d0fd72a8e8e83c7f96ec7a9de8c8515b45f Mon Sep 17 00:00:00 2001
    From: Theo 
    Date: Wed, 16 Mar 2022 14:46:47 +0000
    Subject: [PATCH 077/126] Translated using Weblate (Greek)
    
    Currently translated at 16.0% (347 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/el/
    ---
     vector/src/main/res/values-el/strings.xml | 28 ++++-------------------
     1 file changed, 5 insertions(+), 23 deletions(-)
    
    diff --git a/vector/src/main/res/values-el/strings.xml b/vector/src/main/res/values-el/strings.xml
    index fb4956444a..a7da13bdb3 100644
    --- a/vector/src/main/res/values-el/strings.xml
    +++ b/vector/src/main/res/values-el/strings.xml
    @@ -1,7 +1,6 @@
     
     
         Ηλεκτρονική διεύθυνση
    -
         Ο/Η %1$s σας προσκάλεσε
         Ο/Η %1$s αποχώρησε
         Ο/Η %1$s απέρριψε την πρόσκληση
    @@ -9,7 +8,6 @@
         Ο/Η %1$s προσκάλεσε τον/την %2$s
         Η πρόσκληση του/της %s
         Αριθμός τηλεφώνου
    -
         Ο/Η %1$s απέκλεισε τον/την %2$s
         Ο/Η %1$s απέσυρε την πρόσκληση του/της %2$s
         Ο/Η %1$s άλλαξε εικονίδιο χρήστη
    @@ -20,7 +18,6 @@
         Ο/Η %1$s άλλαξε το όνομα του δωματίου σε: %2$s
         Ο/Η %s απάντησε στην κλήση.
         Ο/Η %s τερμάτισε την κλήση.
    -
         Ο/Η %s πραγματοποίησε μια κλήση βίντεο.
         Ο/Η %s πραγματοποίησε μια κλήση ήχου.
         Ο/Η %1$s κατέστησε το μελλοντικό ιστορικό του δωματίου ορατό στον/στην %2$s
    @@ -31,28 +28,15 @@
         Ο/Η %1$s αφαίρεσε το όνομα του δωματίου
         Ο/Η %1$s αφαίρεσε το θέμα του δωματίου
         Ο/Η %1$s δέχτηκε την πρόσκληση για το %2$s
    -
         ** Αδυναμία αποκρυπτογράφησης: %s **
         Η συσκευή του/της αποστολέα δεν μας έχει στείλει τα κλειδιά για αυτό το μήνυμα.
    -
         Αποτυχία αποστολής μηνύματος
    -
    -
         Σφάλμα του Matrix
    -
    -
         Ο/Η %1$s εισήλθε στο δωμάτιο
    -
         Πρόσκληση στο δωμάτιο
    -
         %1$s και %2$s
    -
    -
    -
         Άδειο δωμάτιο
    -
         όλα τα μέλη του δωματίου από την στιγμή που εισήλθαν.
    -
         Ο/Η %1$s έστειλε μία πρόσκληση στον/στην %2$s για να εισέλθει στο δωμάτιο
         Ακύρωση
         Κλείσιμο
    @@ -108,7 +92,6 @@
         Μόνο οι επαφές Matrix
         Δεν βρέθηκαν αποτελέσματα
         Δωμάτια
    -
         Κοινότητες
         Αποστολή καταγραφών σφαλμάτων
         Αναφορά σφάλματος
    @@ -214,8 +197,6 @@
         Σφάλμα εντολής
         Δημιουργία
         Δωμάτια
    -
    -
         Λόγος: %1$s
         Απενεργοποίηση λογαριασμού
         Απενεργοποίηση λογαριασμού
    @@ -295,7 +276,6 @@
             %d πρόσκληση
             %d προσκλήσεις
         
    -
         Σύνδεση
         Λόγος οριστικής αποβολής
         Αποκλεισμός χρήστη
    @@ -353,7 +333,6 @@
         Αποτυχία σύνδεσης σε πραγματικό χρόνο.
     \nΖητήστε από τον διαχειριστή του οικιακού σας διακομιστή να διαμορφώσει έναν διακομιστή TURN ώστε οι κλήσεις να λειτουργούν αξιόπιστα.
         Η Κλήση ${app_name} Aπέτυχε
    -
         Είσαστε σίγουροι ότι θέλετε να κάνετε κλήση βίντεο;
         Είσαστε σίγουροι ότι θέλετε να κάνετε κλήση ήχου;
         Αποστολή φωνής
    @@ -369,7 +348,6 @@
         Κατάργηση δημοσίευσης
         Αντιγραφή
         Τέλος κλήσης
    -
         Ειδοποιήσεις
         Αντιγράφηκε στο πρόχειρο
         Πρόσθεση
    @@ -392,7 +370,6 @@
         %s γράφει…
         %1$s & %2$s γράφουν…
         Δεν εξακριβώθηκε η ταυτότητα του εξωτερικού διακομιστή.
    -
         Κανένα αποτέλεσμα
         Φιλτράρισμα αποβεβλημένων χρηστών
         Φιλτράρισμα μελών δωματίου
    @@ -402,4 +379,9 @@
         Το πιστοποιητικό έχει αλλάξει από αυτό που εμπιστεύθηκε προηγουμένως η συσκευή σας. Αυτό είναι ΑΚΡΩΣ ΑΣΥΝΗΘΙΣΤΟ. Προτείνεται να ΜΗΝ ΑΠΟΔΕΚΤΕΙΤΕ το νεο πιστοποιητικό.
         Προεπιλογή Συστήματος
         Λανθασμένο όνομα χρήστη και/ή κωδικού
    +    Τερματισμός δημοσκόπησης
    +    Επεξεργασία δημοσκόπησης
    +    Άνοιγμα με
    +    Αποστολή αυτοκόλλητου
    +    %1$s δημιούργησε το δωμάτιο
     
    \ No newline at end of file
    
    From 4b6c8b89804992c4055c15b3e5bc06286b7f55bd Mon Sep 17 00:00:00 2001
    From: Jeanne Lavoie 
    Date: Wed, 16 Mar 2022 17:05:33 +0000
    Subject: [PATCH 078/126] Translated using Weblate (French (Canada))
    
    Currently translated at 83.7% (1806 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fr_CA/
    ---
     vector/src/main/res/values-fr-rCA/strings.xml | 49 ++++---------------
     1 file changed, 9 insertions(+), 40 deletions(-)
    
    diff --git a/vector/src/main/res/values-fr-rCA/strings.xml b/vector/src/main/res/values-fr-rCA/strings.xml
    index cf2ef1a13f..29e2a7b9c2 100644
    --- a/vector/src/main/res/values-fr-rCA/strings.xml
    +++ b/vector/src/main/res/values-fr-rCA/strings.xml
    @@ -150,7 +150,6 @@
     \nVos messages sont sécurisés avec des verrous et seuls vous et le destinataire avez les clés uniques pour les déverrouiller.
         Les messages ici ne sont pas chiffrés de bout en bout.
         Les messages dans ce salon ne sont pas chiffrés de bout en bout.
    -
         Nous attendons %s…
         %s a été vérifié
         Vérifier %s
    @@ -396,7 +395,6 @@
     \nLes gestionnaires d’intégrations reçoivent des données de configuration et peuvent modifier des gadgets logiciels, envoyer des invitations de salon et définir des rangs à votre place.
         Taille maximum pour des téléversements sur ce serveur
         Téléversements
    -
         Mot de passe oublié\?
         Vous n’avez aucun jeu d\'autocollants activé pour le moment.
     \n
    @@ -422,8 +420,6 @@
         Impossible de valider le NIP, veillez en composer un nouveau.
         Confirmez le NIP
         Choisissez un NIP par sécurité
    -
    -
         
             %d entrée
             %d entrées
    @@ -476,8 +472,6 @@
             Sauvegarde restaurée avec %d clé.
             Sauvegarde restaurée avec %d clés.
         
    -
    -
         
             %d gadget logiciel actif
             %d gadgets logiciels actifs
    @@ -498,7 +492,6 @@
             %d salon
             %d salons
         
    -
         
             %d message notifié non lu
             %d messages notifiés non lu
    @@ -515,8 +508,6 @@
             %d seconde
             %d secondes
         
    -
    -
         Contenu de l’évènement
         Contenu d’évènement
         Envoyer des évènements d’état personnalisés
    @@ -532,21 +523,15 @@
             %d nouveau message
             %d nouveaux messages
         
    -
    -
    -
    -
         
             %d membre
             %d membres
         
         Voulez-vous vraiment quitter le salon\?
    -
         
             %d changement de statut
             %d changements de statut
         
    -
         
             Vous avez supprimé l’adresse alternative %1$s de ce salon.
             Vous avez supprimé les adresses alternatives %1$s de ce salon.
    @@ -582,11 +567,9 @@
     \nDésactiver votre compte ne nous fait pas oublier les messages que vous avez envoyés par défaut. Si vous souhaitez que nous oubliions vos messages, cochez la case ci-dessous.
     \n
     \nLa visibilité des messages dans Matrix est identique à celle des courriels. Si nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront plus partagés avec les nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà accès à ces messages en conserveront leur copie.
    -
         Impossible de vérifier l’adresse courriel : assurez-vous d’avoir cliqué sur le lien dans l’courriel
         Aucune adresse courriel n’a été ajoutée à votre compte
         Cette adresse courriel est déjà utilisée.
    -
         L’adresse courriel liée à votre compte doit être saisie.
         Vous n’avez pas accès à ce message
         Définir l’avatar
    @@ -739,7 +722,6 @@
         Si vous annulez maintenant, vous pourrez perdre les messages et données chiffrés si vous perdez accès à vos identifiants.
     \n
     \nVous pouvez aussi activer la sauvegarde sécurisée et gérer vos clés dans les paramètres.
    -
         Copiez-le sur votre stockage dans le cloud personnel
         Sauvegardez-le sur une clé USB ou un disque de sauvegarde
         Imprimez-le et conservez-le en lieu sûr
    @@ -765,8 +747,6 @@
         Phrase de récupération
         %s veut vérifier votre session
         Demande de vérification
    -
    -
         Compris
         Vérifié !
         Nouvelle invitation
    @@ -780,7 +760,6 @@
         Tous les salons sur le serveur %s
         URL du serveur d’accueil
         Sélectionner un répertoire de salons
    -
         Si elles ne correspondent pas, la sécurité de votre communication est peut-être compromise.
         Confirmez en comparant les informations suivantes avec les paramètres utilisateur dans votre autre session :
         Vérifier
    @@ -796,7 +775,6 @@
         Gérer la sauvegarde de clés
         Récupération des messages chiffrés
         Les clés ont bien été exportées
    -
         Veuillez créer une phrase secrète pour chiffrer les clés exportées. Vous devrez saisir cette même phrase secrète afin de pouvoir importer les clés.
         Exporter
         Exporter les clés vers un fichier local
    @@ -807,7 +785,6 @@
         Nom public
         Erreur de déchiffrement
         Thème
    -
         Désactiver comme adresse principale
         Définir comme adresse principale
         Ce sont des fonctionnalités expérimentales qui peuvent se comporter de façon inattendue. À utiliser avec précaution.
    @@ -1014,7 +991,6 @@
         Tous les messages
         Tous les messages (sonore)
         Bloquer l’utilisateur
    -
         Ce contenu a été signalé comme inapproprié.
     \n
     \nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l’ignorer pour masquer ses messages.
    @@ -1045,7 +1021,6 @@
         Serveur d’accueil
         Connecté en tant que
         Authentification
    -
         %1$s @ %2$s
         Vu la dernière fois
         Mettre à jour le nom public
    @@ -1139,7 +1114,6 @@
         Filtrer les utilisateurs exclus
         Filtrer les membres du salon
         Rechercher
    -
         Changer le sujet
         Mettre à niveau le salon
         Changer les permissions
    @@ -1188,7 +1162,6 @@
         Nous vous avons envoyé un courriel de confirmation à %s, consultez vos courriels et cliquez sur le lien de confirmation
         Envoyer des courriels et des numéros de téléphone
         Vous avez donné votre autorisation pour envoyer des courriels et des numéros de téléphone à ce serveur d’identité pour découvrir d\'autres utilisateurs à partir de vos contacts.
    -
         Vous partagez actuellement des adresse courriels et des numéros de téléphone sur le serveur d’identité %1$s. Vous devrez vous reconnecter à %2$s pour arrêter de les partager.
         Acceptez les conditions de service du serveur d’identité (%s) pour vous permettre d’être découvrable avec une adresse courriel ou un numéro de téléphone.
         Un courriel de vérification sera envoyé à votre adresse pour confirmer la configuration de votre nouveau mot de passe.
    @@ -1221,7 +1194,6 @@
             %1$s a ajouté %2$s comme adresse pour ce salon.
             %1$s a ajouté %2$s comme adresses pour ce salon.
         
    -
         
             %1$s, %2$s, %3$s et %4$d autre
             %1$s, %2$s, %3$s et %4$d autres
    @@ -1289,7 +1261,6 @@
         Partager par SMS
         Impossible de trouver ce salon. Assurez-vous qu’il existe.
         Impossible d’ouvrir un salon dont vous êtes banni.
    -
         Signature
         Algorithme
         Version
    @@ -1298,7 +1269,6 @@
         On dirait que vous avez déjà configuré une sauvegarde de clé depuis une autre session. Voulez-vous la remplacer par celle que vous êtes en train de créer \?
         Une sauvegarde est déjà disponible sur votre serveur d’accueil
         La clé de récupération a été enregistrée.
    -
         Enregistrer dans un fichier
         Partager
         Sauvegarder la clé de récupération
    @@ -1479,7 +1449,6 @@
         Impossible d\'établir une connexion en temps réel.
     \nVeuillez demander à l’administrateur de votre serveur d’accueil de configurer un serveur TURN afin que les appels fonctionnent de manière fiable.
         Appel échoué
    -
         Envoyer un message vocal
         Nouvel appel vidéo
         Nouvel appel audio
    @@ -1554,7 +1523,6 @@
         Vous n\'avez pas la permission de lancer un appel dans ce salon
         Vous n’avez pas la permission de lancer une téléconférence
         Vous n’avez pas la permission de lancer une téléconférence dans ce salon
    -
         Commencer une conversation
         Réinitialiser
         Ignorer
    @@ -1588,7 +1556,6 @@
         Ne perdez jamais vos messages chiffrés
         Sécurité contre la perte d’accès aux messages et données chiffrées
         Sauvegarde sécurisée
    -
         Supprimer les clés de chiffrement sauvegardées sur le serveur \? Vous ne pourrez plus utiliser votre clé de récupération pour lire l’historique des messages chiffrés.
         Supprimer la sauvegarde
         Vérification de l’état de la sauvegarde
    @@ -1631,7 +1598,6 @@
         Veuillez en faire une copie
         Arrêter
         Remplacer
    -
         Gérer vos paramètres de découverte.
         Découverte
         Désactiver mon compte
    @@ -1689,7 +1655,6 @@
         Version de olm
         Version
         Délai entre chaque synchronisation
    -
         Délai d’attente de la requête de synchronisation
         Lancer au démarrage
         Vous ne serez pas notifié des messages entrants quand l’application est en arrière-plan.
    @@ -1843,7 +1808,7 @@
         • Les serveurs correspondant à des IP littérales sont maintenant interdits.
         • Les serveurs correspondants à des IP littérales sont maintenant autorisés.
         • Les serveurs correspondant à %s sont supprimés de la liste autorisée.
    -    • les serveur correspondant à %s sont maintenant autorisés.
    +    • les serveurs correspondant à %s sont maintenant autorisés.
         • Les serveurs correspondant à %s étaient supprimés de la liste des interdits.
         • Les serveurs correspondant à %s sont maintenant interdits.
         Vous avez changé les droits ACL du serveur pour ce salon.
    @@ -1927,10 +1892,7 @@
         ${app_name} a besoin d’accéder à votre appareil photo et à votre microphone pour passer des appels vidéo.
     \n
     \nVeuillez autoriser l’accès dans les prochaines fenêtres pour pouvoir effectuer l’appel.
    -
         ${app_name} a besoin d’accéder à votre microphone pour passer des appels audio.
    -
    -
         Information
         Le correspondant n’a pas décroché.
         Vous avez mis l’appel en attente
    @@ -1966,7 +1928,6 @@
         Ce n’est pas une adresse de serveur Matrix valide
         Veuillez saisir une URL valide
         Veuillez lire et accepter les politiques de ce serveur d’accueil :
    -
         Ce serveur d’accueil souhaite s’assurer que vous n’êtes pas un robot
         Le numéro de téléphone est déjà défini.
         Nom d’utilisateur et/ou mot de passe incorrect
    @@ -2100,4 +2061,12 @@
         Remarques
         Remarques sur les espaces
         Désolé, une erreur s’est produite en essayant d’entrer dans la conférence
    +    Certaines permissions manquent pour effectuer cette action, veuillez autoriser ces permissions depuis les réglages système.
    +    Espaces
    +    Écoute des notifications
    +    Vous n’êtes pas autorisé(e) à rejoindre ce salon
    +    
    +        %d changement des ACL du serveur
    +        %d changements des ACL du serveur
    +    
     
    \ No newline at end of file
    
    From d24f01c001cc7a265668f4666904e6a5cdaad0e0 Mon Sep 17 00:00:00 2001
    From: Jeanne Lavoie 
    Date: Tue, 15 Mar 2022 12:39:26 +0000
    Subject: [PATCH 079/126] Translated using Weblate (French)
    
    Currently translated at 100.0% (2157 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
    ---
     vector/src/main/res/values-fr/strings.xml | 86 +++++++++++------------
     1 file changed, 43 insertions(+), 43 deletions(-)
    
    diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml
    index 5c95775ca3..e1b3b0043c 100644
    --- a/vector/src/main/res/values-fr/strings.xml
    +++ b/vector/src/main/res/values-fr/strings.xml
    @@ -290,7 +290,7 @@
         Aucun résultat
         Image de profil
         Nom affiché
    -    Ajouter une adresse e-mail
    +    Ajouter une adresse électronique
         Ajouter un numéro de téléphone
         Affiche les informations de l’application dans les paramètres système.
         Informations sur l’application
    @@ -373,10 +373,10 @@
         Le rapport d’anomalie a bien été envoyé
         L’envoi du rapport d’anomalie a échoué (%s)
         Ceci ne ressemble pas à une adresse électronique valide
    -    Cette adresse e-mail est déjà utilisée.
    +    Cette adresse électronique est déjà utilisée.
         Ce serveur d’accueil souhaite s’assurer que vous n’êtes pas un robot
    -    L’adresse e-mail liée à votre compte doit être saisie.
    -    Impossible de vérifier l’adresse e-mail : assurez-vous d’avoir cliqué sur le lien dans l’e-mail
    +    L’adresse électronique liée à votre compte doit être saisie.
    +    Impossible de vérifier l’adresse électronique : assurez-vous d’avoir cliqué sur le lien dans le courriel
         Trop de requêtes ont été envoyées
         Quitter
         Citer
    @@ -406,7 +406,7 @@
         Quand je suis invité sur un salon
         Paramètres utilisateur
         %1$s @ %2$s
    -    Vérifiez votre e-mail et cliquez sur le lien qu’il contient. Une fois cela fait, cliquez sur continuer.
    +    Vérifiez votre courriel et cliquez sur le lien qu’il contient. Une fois ceci fait, cliquez sur continuer.
         Afficher tous les messages de %s \?
     \n
     \nVeuillez noter que cette action redémarrera l’application et pourra prendre un certain temps.
    @@ -422,7 +422,7 @@
         Interface utilisateur
         Langue
         Choisissez une langue
    -    Cette adresse e-mail est déjà utilisée.
    +    Cette adresse électronique est déjà utilisée.
         Ce numéro de téléphone est déjà utilisé.
         Lancer au démarrage
         Vider le cache des médias
    @@ -533,11 +533,11 @@
         Pour continuer à utiliser le serveur d’accueil %1$s, vous devez lire et accepter les conditions générales.
         Voir maintenant
         Désactiver le compte
    -    Votre compte sera inutilisable de façon permanente. Vous ne pourrez plus vous connecter et personne ne pourra se réenregistrer avec le même identifiant d’utilisateur. Le compte quittera tous les salons auxquels il participe et tous ses détails seront supprimés du serveur d’identité. Cette action est irréversible. 
    -\n 
    -\nDésactiver votre compte ne nous fait pas oublier les messages que vous avez envoyés par défaut. Si vous souhaitez que nous oubliions vos messages, cochez la case ci-dessous. 
    -\n 
    -\nLa visibilité des messages dans Matrix est identique à celle des e-mails. Si nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront plus partagés avec les nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà accès à ces messages en conserveront leur copie.
    +    Votre compte sera inutilisable de façon permanente. Vous ne pourrez plus vous connecter et personne ne pourra se réenregistrer avec le même identifiant d’utilisateur. Le compte quittera tous les salons auxquels il participe et tous ses détails seront supprimés du serveur d’identité. Cette action est irréversible.
    +\n
    +\nDésactiver votre compte ne nous fait pas oublier les messages que vous avez envoyés par défaut. Si vous souhaitez que nous oubliions vos messages, cochez la case ci-dessous.
    +\n
    +\nLa visibilité des messages dans Matrix est identique à celle des courriels. Si nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront plus partagés avec les nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà accès à ces messages en conserveront leur copie.
         Veuillez oublier tous les messages que j’ai envoyé quand mon compte sera désactivé (Avertissement : les futurs utilisateurs verront une version incomplète des conversations)
         Désactiver le compte
         Télécharger
    @@ -941,20 +941,20 @@
         Modifier le serveur d’identité
         Vous utilisez actuellement %1$s pour découvrir et être découvrable par les contacts existants que vous connaissez.
         Vous n’utilisez actuellement aucun serveur d’identité. Pour découvrir et être découvrable par les contacts existants que vous connaissez, configurez-en un ci-dessous.
    -    Adresses e-mail découvrables
    -    Les options de découverte apparaîtront quand vous aurez ajouté un e-mail.
    +    Adresses électronique découvrables
    +    Les options de découverte apparaîtront quand vous aurez ajouté un courriel.
         Les options de découverte apparaîtront quand vous aurez ajouté un numéro de téléphone.
    -    La déconnexion du serveur d’identité signifie que vous ne pourrez plus être découvrable par les autres utilisateurs et que vous ne pourrez plus inviter d’autres personnes par e-mail ou par téléphone.
    +    La déconnexion du serveur d’identité signifie que vous ne pourrez plus être découvrable par les autres utilisateurs et que vous ne pourrez plus inviter d’autres personnes par courriel ou par téléphone.
         Numéros de téléphone découvrables
    -    Nous vous avons envoyé un e-mail de confirmation à %s, consultez vos e-mails et cliquez sur le lien de confirmation
    +    Nous vous avons envoyé un courriel de confirmation à %s, consultez vos courriels et cliquez sur le lien de confirmation
         Renseignez l’URL d’un serveur d’identité
         Impossible de se connecter au serveur d’identité
         Veuillez renseigner l’URL du serveur d’identité
         Le serveur d’identité n’a pas de conditions de service
         Le serveur d’identité qui vous avez choisi n’a pas de conditions de service. Continuez uniquement si vous faites confiance au propriétaire de ce service
         Un SMS a été envoyé à %s. Saisissez le code de vérification qu’il contient.
    -    Vous partagez actuellement des adresse e-mails et des numéros de téléphone sur le serveur d’identité %1$s. Vous devrez vous reconnecter à %2$s pour arrêter de les partager.
    -    Acceptez les conditions de service du serveur d’identité (%s) pour vous permettre d’être découvrable avec une adresse e-mail ou un numéro de téléphone.
    +    Vous partagez actuellement des adresses électroniques et des numéros de téléphone sur le serveur d’identité %1$s. Vous devrez vous reconnecter à %2$s pour arrêter de les partager.
    +    Acceptez les conditions de service du serveur d’identité (%s) pour vous permettre d’être découvrable avec une adresse électronique ou un numéro de téléphone.
         Activer les journaux verbeux.
         Les journaux verbeux aideront les développeurs en fournissant plus de journaux quand vous envoyez un rapport d’anomalie. Même si cette option est activée, l’application n’envoie pas le contenu des messages ou toute autre donnée personnelle.
         Réessayez quand vous aurez accepté les termes et conditions de votre serveur d’accueil.
    @@ -1049,7 +1049,7 @@
         Étendez et personnalisez votre expérience
         Démarrer
         Sélectionner un serveur
    -    Tout comme les e-mails, les comptes ont un serveur d’accueil, même si vous pouvez parler à tout le monde
    +    Tout comme les courriels, les comptes ont un serveur d’accueil, même si vous pouvez parler à tout le monde
         Rejoignez des millions de personnes gratuitement sur le plus grand serveur public
         Hébergement premium pour les organisations
         En savoir plus
    @@ -1075,20 +1075,20 @@
         L’application ne peut pas créer de compte sur ce serveur d’accueil.
     \n
     \nVoulez-vous vous inscrire en utilisant un client web \?
    -    Cet e-mail n’est associé à aucun compte.
    +    Ce courriel n’est associé à aucun compte.
         Réinitialiser le mot de passe sur %1$s
    -    Un e-mail de vérification sera envoyé à votre adresse pour confirmer la configuration de votre nouveau mot de passe.
    +    Un courriel de vérification sera envoyé à votre adresse pour confirmer la configuration de votre nouveau mot de passe.
         Suivant
    -    E-mail
    +    Courriel
         Nouveau mot de passe
         Attention !
         Le changement de mot de passe réinitialisera toutes les clés de chiffrement sur toutes vos sessions, rendant l’historique des discussions chiffrées illisible. Configurez la sauvegarde de clés ou exportez vos clés de salon depuis une autre session avant de réinitialiser votre mot de passe.
         Poursuivre
    -    Cet e-mail n’est lié à aucun compte
    +    Ce courriel n’est lié à aucun compte
         Vérifiez votre boîte de réception
    -    Un e-mail de vérification a été envoyé à %1$s.
    +    Un courriel de vérification a été envoyé à %1$s.
         Touchez le lien pour confirmer votre nouveau mot de passe. Après avoir suivi le lien qu’il contient, cliquez ci-dessous.
    -    J’ai vérifié mon adresse e-mail
    +    J’ai vérifié mon adresse électronique
         Succès !
         Votre mot de passe a été réinitialisé.
         Vous avez été déconnecté de toutes les sessions et ne recevrez plus de notification. Pour réactiver les notifications, reconnectez-vous sur chaque appareil.
    @@ -1097,10 +1097,10 @@
         Votre mot de passe n’a pas encore été changé.
     \n
     \nArrêter le processus de changement \?
    -    Définir l’adresse e-mail
    -    Définir une adresse e-mail pour récupérer votre compte. Plus tard, vous pourrez éventuellement autoriser des personnes à vous retrouver avec votre adresse e-mail.
    -    E-mail
    -    E-mail (facultatif)
    +    Définir l’adresse électronique
    +    Définir une adresse électronique pour récupérer votre compte. Plus tard, vous pourrez éventuellement autoriser des personnes à vous retrouver avec votre adresse électronique.
    +    Courriel
    +    Courriel (facultatif)
         Suivant
         Définir le numéro de téléphone
         Définir un numéro de téléphone pour autoriser éventuellement des personnes à vous découvrir.
    @@ -1116,7 +1116,7 @@
         Les numéros de téléphone internationaux doivent commencer par « + »
         Le numéro de téléphone n’a pas l’air d’être valide. Veuillez le vérifier
         S’inscrire sur %1$s
    -    Nom d’utilisateur ou e-mail
    +    Nom d’utilisateur ou courriel
         Mot de passe
         Suivant
         Ce nom d’utilisateur est déjà pris
    @@ -1129,8 +1129,8 @@
         Sélectionner un serveur d’accueil personnalisé
         Veuillez compléter le captcha
         Acceptez les termes pour continuer
    -    Vérifiez vos e-mails
    -    Nous avons envoyé un e-mail à %1$s.
    +    Vérifiez vos courriels
    +    Nous avons envoyé un courriel à %1$s.
     \nCliquez sur le lien qu’il contient pour continuer la création du compte.
         Le code saisi n’est pas correct. Veuillez vérifier.
         Serveur d’accueil obsolète
    @@ -1184,7 +1184,7 @@
         Préfixe ¯\\_(ツ)_/¯ à un message en texte brut
         Activer le chiffrement
         Une fois qu’il est activé, le chiffrement ne peut pas être désactivé.
    -    Le domaine de votre adresse e-mail n’est pas autorisé à s’inscrire sur ce serveur
    +    Le domaine de votre adresse électronique n’est pas autorisé à s’inscrire sur ce serveur
         Connexion non fiable
         Ils correspondent
         Ils ne correspondent pas
    @@ -1443,7 +1443,7 @@
         Message supprimé
         Afficher les messages supprimés
         Afficher un remplaçant pour les messages supprimés
    -    Nous vous avons envoyé un e-mail de confirmation à %s, consultez vos e-mails et cliquez sur le lien de confirmation
    +    Nous vous avons envoyé un courriel de confirmation à %s, consultez vos courriels et cliquez sur le lien de confirmation
         Le code de vérification n’est pas correct.
         MÉDIA
         Il n’y a aucun média dans ce salon
    @@ -1466,7 +1466,7 @@
         Cette opération n’est pas possible. Le serveur d’accueil est obsolète.
         Veuillez d’abord configurer un serveur d’identité.
         Veuillez d’abord accepter les termes du serveur d’identité dans les paramètres.
    -    Pour votre vie privée, ${app_name} prend uniquement en charge l’envoi des adresses e-mail et des numéros de téléphone hachés.
    +    Pour votre vie privée, ${app_name} prend uniquement en charge l’envoi des adresses électronique et des numéros de téléphone hachés.
         L’association a échoué.
         Il n’y a actuellement aucune association avec cet identifiant.
         Votre serveur d’accueil (%1$s) propose d’utiliser %2$s comme serveur d’identité
    @@ -1653,8 +1653,8 @@
             %d utilisateur banni
             %d utilisateurs bannis
         
    -    Gérer les e-mails et numéros de téléphone liés à votre compte Matrix
    -    E-mails et numéros de téléphone
    +    Gérer les courriels et numéros de téléphone liés à votre compte Matrix
    +    Courriels et numéros de téléphone
         Sauvegarde sécurisée
         Démarrer la caméra
         Ouvrir la discussion
    @@ -1677,11 +1677,11 @@
             %d seconde
             %d secondes
         
    -    Assurez-vous d\'avoir cliqué sur le lien envoyé par e-mail.
    +    Assurez-vous d\'avoir cliqué sur le lien envoyé par courriel.
         Supprimer %s \?
         Numéros de téléphone
    -    Aucune adresse e-mail n’a été ajoutée à votre compte
    -    Adresses e-mail
    +    Aucune adresse électronique n’a été ajoutée à votre compte
    +    Adresses électroniques
         Aucun numéro de téléphone n’a été ajouté à votre compte
         Filtrer les utilisateurs exclus
         Ne plus ignorer cet utilisateur aura pour effet de ré-afficher ses messages.
    @@ -1745,8 +1745,8 @@
         %1$d de %2$d
         Autoriser
         Révoquer mon autorisation
    -    Vous avez donné votre autorisation pour envoyer des e-mails et des numéros de téléphone à ce serveur d’identité pour découvrir d\'autres utilisateurs à partir de vos contacts.
    -    Envoyer des e-mails et des numéros de téléphone
    +    Vous avez donné votre autorisation pour envoyer des courriels et des numéros de téléphone à ce serveur d’identité pour découvrir d\'autres utilisateurs à partir de vos contacts.
    +    Envoyer des courriels et des numéros de téléphone
         Suggestions
         Utilisateurs connus
         code QR
    @@ -1997,7 +1997,7 @@
         Permettra de parcourir les salons de %s
         Inviter dans %s
         Partager le lien
    -    Inviter par e-mail
    +    Inviter par courriel
         Vous êtes seul pour l’instant. %s sera plus agréable avec de la compagnie.
         Invitez des personnes dans votre espace
         Inviter des personnes
    @@ -2153,7 +2153,7 @@
         Mentions et mots-clés
         Notifications par défaut
         %s dans les paramètres pour recevoir les invitations directement dans ${app_name}.
    -    Lier cet e-mail à votre compte
    +    Lier ce courriel à votre compte
         Cette invitation à cette espace a été envoyée à %s qui n’est pas associé à votre compte
         Cette invitation à ce salon a été envoyée à %s qui n’est pas associé à votre compte
         Tous les salons dans lesquels vous vous trouvez seront affichés sur l’Accueil.
    
    From 1ecbe415291734bbf44475dcada42d593df9051b Mon Sep 17 00:00:00 2001
    From: Besnik Bleta 
    Date: Wed, 16 Mar 2022 08:20:11 +0000
    Subject: [PATCH 080/126] Translated using Weblate (Albanian)
    
    Currently translated at 99.4% (2145 of 2157 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 | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml
    index 48fc274eb7..0fc5c7f6fb 100644
    --- a/vector/src/main/res/values-sq/strings.xml
    +++ b/vector/src/main/res/values-sq/strings.xml
    @@ -310,7 +310,7 @@
         PO
         Vazhdo
         Hiqe
    -    Bëhuni pjesë
    +    Hyni
         Hidheni tej
         Anëtarë liste
         Hidhu te të palexuarit
    
    From 20d9f686793c47cb433e13e1b201dfcca054176a Mon Sep 17 00:00:00 2001
    From: Modificator 
    Date: Thu, 17 Mar 2022 01:18:17 +0000
    Subject: [PATCH 081/126] Translated using Weblate (Chinese (Simplified))
    
    Currently translated at 95.7% (2065 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/
    ---
     vector/src/main/res/values-zh-rCN/strings.xml | 45 ++-----------------
     1 file changed, 4 insertions(+), 41 deletions(-)
    
    diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml
    index d2e17e856d..67bf3f5e06 100644
    --- a/vector/src/main/res/values-zh-rCN/strings.xml
    +++ b/vector/src/main/res/values-zh-rCN/strings.xml
    @@ -39,7 +39,6 @@
         空聊天室
         聊天室邀请
         %1$s 和 %2$s
    -
         初始化同步:
     \n正在导入账号…
         初始化同步:
    @@ -262,10 +261,8 @@
         拍摄照片或视频
         此主服务器想确认你不是机器人
         电子邮箱地址验证失败:请确保你已点击邮件中的链接
    -
         原始
         通话正在连接…
    -
         ${app_name} 需要权限以访问你的麦克风来进行语音通话。
         私聊
         邀请
    @@ -283,7 +280,6 @@
         忽略
         指纹(%s):
         无法验证远程服务器的身份。
    -
         应用信息
         启用这个账号的通知
         启用这个设备的通知
    @@ -301,7 +297,6 @@
         通知
         已忽略的用户
         通讯录权限
    -
         身份认证
         当前密码
         是否重新显示所有来自 %s 的消息? 
    @@ -319,14 +314,12 @@
         高级
         此聊天室的内部 ID
         这些是实验性功能,可能会出现不可预料的错误。请谨慎使用。
    -
         导出端对端聊天室密钥
         导出聊天室密钥
         导出密钥到本地文件
         导出
         输入密语
         确认密语
    -
         导入端对端聊天室密钥
         导入聊天室密钥
         从本地文件导入密钥
    @@ -338,25 +331,20 @@
         永久链接
         重命名
         举报内容
    -
         问题反馈
         为分析此问题,本客户端的日志将会随此问题反馈发送。本问题反馈,包括日志与截图,将不会被公开显示。若你希望仅发送上面的文字,请取消选择:
         问题反馈发送成功
         问题反馈发送失败(%s)
    -
         异常的 JSON
         呼入的视频通话
         呼入的语音通话
         通话中…
         通话未被接听。
         信息
    -
    -
         ${app_name} 需要权限以访问你的摄像机和麦克风来进行视频通话。
     \n
     \n请在接下来的弹出窗口中授权允许访问,以便进行通话。
         移除
    -
         你将不能撤销这个修改,因为你正在让这个用户和你拥有相同的特权级别。
     \n你确定吗?
         这可能意味着有人正在恶意劫持你的流量,或者你的手机不信任远程服务器提供的数字证书。
    @@ -375,7 +363,6 @@
         取消设置为主要地址
         确认
         你似乎沮丧地摇了摇手机。你想打开问题反馈界面吗?
    -
         证书已从一个先前受你的设备信任的证书更改为另一个。这非常反常!建议你不要接受此新证书。
         证书已从曾受信任的证书更改为不受信任的证书。服务器可能已更新其证书,请联系管理员并核对服务器的指纹。
         请仅在服务器管理员发布了与上述指纹匹配的指纹的情况下接受该证书。
    @@ -391,7 +378,6 @@
         实验室
         为验证此设备是否可信,请通过其他方式(例如面对面交换或拨打电话)与其拥有者联系,并询问他们该设备的用户设置中的密钥是否与以下密钥匹配:
         如果它们不匹配,你通讯的安全性可能会受到影响。
    -
         邀请
         收藏夹
         联系人
    @@ -479,7 +465,6 @@
         
         社群
         摇一摇快捷反馈问题
    -
         
             %d 位成员的状态发生了变化
         
    @@ -490,7 +475,6 @@
             %d 条未读消息
         
         显示成员
    -
         徽章
         
             %d 个聊天室
    @@ -505,9 +489,7 @@
         你已被 %2$s 从 %1$s 中封禁
         理由:%1$s
         头像
    -
         %1$s 条在 %2$s 中
    -
         停用账号
         停用我的账号
         发送统计分析数据
    @@ -553,16 +535,9 @@
         对话在此继续
         这个聊天室是另一个对话的延续
         点击此处查看更早的消息
    -
    -
    -
    -
    -
         
             已选择 %d 个
         
    -
    -
         系统警告
         联系你的服务管理员
         本服务器其中一项资源已超出限制,部分用户将无法登录
    @@ -631,7 +606,6 @@
         邀请、移除与封禁事件不受影响。
         显示账号变动事件
         包括头像与显示名称的变动。
    -
         密码
         %d+
         %1$s:%2$s
    @@ -719,7 +693,6 @@
         保存恢复密钥
         分享
         保存为文件
    -
         请制作一份拷贝
         分享恢复密钥…
         正在使用密语来生成恢复密钥,此过程可能会花费几秒钟。
    @@ -765,7 +738,6 @@
         正在删除备份…
         删除备份
         要从此服务器中删除你备份的加密密钥吗?你将无法再使用恢复密钥来读取加密的历史消息。
    -
         永不丢失已加密消息
         使用备份密钥
         新加密信息密钥
    @@ -783,7 +755,6 @@
         按回车发送消息
         软键盘的 Enter 按钮将发送消息而不是添加换行符
         密码无效
    -
         媒体
         默认压缩
         选择
    @@ -865,7 +836,6 @@
         撤消
         断开连接
         拒绝
    -
         這不是有效的 Matrix 服务器位置
         无法在此 URL 找到主服务器,请检查
         播放
    @@ -918,7 +888,6 @@
     \n这将影响网络和电池的使用,将显示一个永久通知表明 ${app_name} 正在监听事件。
         无后台同步
         应用在后台时你不会收到消息通知。
    -
         集成
         使用集成管理器管理机器人、桥接、部件和贴纸包。
     \n集成管理器接收配置数据,可以代表你修改部件、发送聊天室邀请及设置特权等级。
    @@ -972,8 +941,6 @@
         安全备份
         保护加密信息及数据的访问权
         设置安全备份
    -
    -
         你未使用身份服务器
         你似乎正在试图连接到另一个主服务器。你想要登出吗?
         你已经跟上了!
    @@ -1096,7 +1063,6 @@
         此内容已报告为不合适。
     \n
     \n如果你不希望再看到此用户的更多内容,你可以忽略他们以隐藏他们的消息。
    -
         忽略用户
         全部消息(嘈杂)
         全部消息
    @@ -1295,7 +1261,6 @@
         验证 %s
         已验证 %s
         正在等待 %s…
    -
         此聊天室的消息未经端对端加密。
         该聊天室的消息已被端对端加密。
     \n
    @@ -1446,7 +1411,6 @@
         密钥已是最新!
         保存到优盘或者备份盘
         复制到你的个人云存储
    -
         如果你现在取消,那么当你失去登录权限时也会丢失加密的信息和数据。
     \n
     \n你也可以通过设置菜单来建立保护备份以及管理你的密钥。
    @@ -1754,7 +1718,6 @@
         %2$d 的 %1$d
         旋转和裁剪
         添加图像自
    -
         授予许可
         撤销我的许可
         你已同意发送电子邮件和电话号码到身份服务器以从你的联系人发现其他用户。
    @@ -1823,7 +1786,6 @@
         已勾选
         已选中
         活跃通话(%1$s)
    -
         需要重新验证
         删除失败的消息
         你确定要取消发送消息吗?
    @@ -1987,7 +1949,6 @@
         ${app_name} 要求你输入凭据才能执行此操作。
         呼叫转移时发生错误
         先询问
    -
         查找电话号码时发生了错误
         此通话已结束
         %1$s 拒绝了此通话
    @@ -2075,7 +2036,6 @@
         输入你想要探索的新服务器的名称。
         添加一个新的服务器
         你的服务器
    -
         抱歉,尝试加入 %s 时发生了一个错误
         空间地址
         查看和管理这个空间的地址。
    @@ -2272,7 +2232,6 @@
         投票问题或主题
         创建投票
         投票
    -
         向 %s 发送电子邮件和电话号码
         您的联系人是私密的。 要从您的联系人中发现用户,我们需要您的许可才能将联系信息发送到您的身份服务器。
         已退出此会话!
    @@ -2321,4 +2280,8 @@
     \n你可以阅读我们所有的条款 %s。
         帮助改进 ${app_name}
         启用
    +    不允许加入此房间
    +    
    +        修改服务器 %d 的 ACLs
    +    
     
    \ No newline at end of file
    
    From db828152a6700063547e5c49745c8a6396b3e0d0 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?=D0=AD=D0=B4=D1=83=D0=B0=D1=80=D0=B4=20=D0=93=D0=B5=D1=80?=
     =?UTF-8?q?=D0=B0?= 
    Date: Thu, 17 Mar 2022 14:02:09 +0000
    Subject: [PATCH 082/126] Translated using Weblate (Hebrew)
    
    Currently translated at 94.5% (2039 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 53 +++++++++++++++++++++++
     1 file changed, 53 insertions(+)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 8459160bf2..3823e60e2d 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -2252,4 +2252,57 @@
         בָּדוּק
         הזמינו בדואר אלקטרוני
         זה רק אתה כרגע. %s יהיה טוב יותר עם אחרים.
    +    בחלל זה אין חדרים
    +    אנא צור קשר עם מנהל השרת הביתי שלך לקבלת מידע נוסף
    +    נראה שהשרת הביתי שלך עדיין לא תומך במרחבים
    +    מרגיש ניסיוני\?
    +\nניתן להוסיף חללים קיימים למרחב.
    +    הצג את כל החדרים בדף הבית
    +    כל החדרים שבהם אתה נמצא יוצגו בדף הבית.
    +    ניהול חדרים ומרחבים
    +    סמן כלא מוצע
    +    מוצע
    +    סמן כמוצע
    +    מחפש מישהו שאינו ב-%s\?
    +    %s מזמין אותך
    +    הערה: האפליקציה תופעל מחדש
    +    אפשר הודעות שרשור
    +    המערכת שלך תשלח אוטומטית יומנים כאשר מתרחשת שגיאה ללא יכולת לפענח
    +    דווח אוטומטית על שגיאות פענוח.
    +    אתם מוזמנים
    +    מרחבים הם דרך חדשה לאיחוד של חדרים ואנשים.
    +    הוסף מרחב לכל מרחב שאתה מנהל.
    +    הוסף מרחבים קיימים
    +    הוסף חדרים קיימים
    +    הוסף חדרים ומרחבים קיימים
    +    בחר דברים להשאיר
    +    השאירו חדרים ומרחבים ספציפיים…
    +    אל תעזובו חדרים וא מרחבים
    +    עזבו את כל החדרים והמרחבים
    +    אתה המנהל היחיד של המרחב הזה. עזיבה תגרום לכך שאף אחד לא ישלוט על המרחב.
    +    לא תוכל להצטרף מחדש אלא אם כן תוזמן מחדש.
    +    אתה האדם היחיד כאן. אם תעזוב, אף אחד לא יוכל להצטרף בעתיד, כולל אותך.
    +    האם אתה בטוח שברצונך לעזוב את %s\?
    +    עזוב את המרחב
    +    הוסיפו חדרים
    +    גלה חדרים
    +    
    +        אדם %d שאתה מכיר כבר הצטרף
    +        %d אנשים שאתה מכיר כבר הצטרפו
    +        %d אנשים שאתה מכיר כבר הצטרפו
    +        %d אנשים שאתה מכיר כבר הצטרפו
    +    
    +    גילוי (%s)
    +    סיים את ההגדרה
    +    הזמן בדואר אלקטרוני, מצא אנשי קשר ועוד…
    +    סיים להגדיר את הגילוי.
    +    אינך משתמש כעת בשרת זהות. על מנת להזמין חברים לצוות ולהיות ניתנים לגילוי על ידם, הגדר שרת זהות למטה.
    +    כינוי זה אינו נגיש בשלב זה.
    +\nנסה שוב מאוחר יותר, או בקש ממנהל חדר לבדוק אם יש לך גישה.
    +    הם לא יהיו חלק מ-%s
    +    רק לחדר הזה
    +    הם יוכלו לחקור את %s
    +    הזמן אל %s
    +    שתף קישור
    +    הזמן לפי שם משתמש או דואר אלקטרוני
     
    \ No newline at end of file
    
    From cb290550a9aa87820d25b004925815fe62649845 Mon Sep 17 00:00:00 2001
    From: ravit 
    Date: Thu, 17 Mar 2022 11:55:12 +0000
    Subject: [PATCH 083/126] Translated using Weblate (Hebrew)
    
    Currently translated at 94.5% (2039 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
    ---
     vector/src/main/res/values-iw/strings.xml | 122 +++++++++++++++++++++-
     1 file changed, 117 insertions(+), 5 deletions(-)
    
    diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
    index 3823e60e2d..b70034888f 100644
    --- a/vector/src/main/res/values-iw/strings.xml
    +++ b/vector/src/main/res/values-iw/strings.xml
    @@ -203,7 +203,7 @@
         יעדי התראות
         ניהול מפתחות קריפטוגרפיה
         קריפטוגרפיה
    -    השתמש במנהל שילוב לניהול בוטים, גשרים, ווידג\'טים וחבילות מדבקות.
    +    השתמש במנהל אינטגרציה לניהול בוטים, גשרים, ווידג\'טים וחבילות מדבקות.
     \nמנהלי אינטגרציה מקבלים נתוני תצורה ויכולים לשנות ווידג\'טים, לשלוח הזמנות לחדר ולהגדיר רמות כוח מטעמכם.
         אינטגרציות
         מתקדם
    @@ -440,7 +440,7 @@
         חסום הכל
         אפשר
         יישומון זה רוצה להשתמש במשאבים הבאים:
    -    מצטערים, שיחות ועידה עם Jitsi אינן נתמכות במכשירים ישנים (מכשירים עם מערכת הפעלה אנדרואיד מתחת ל -5.0)
    +    מצטערים, שיחות ועידה עם Jitsi אינן נתמכות במכשירים ישנים (מכשירים עם מערכת הפעלה אנדרואיד מתחת ל -6.0)
         מזהה חדר
         מזהה ישומון
         ערכת הנושא שלכם
    @@ -515,7 +515,7 @@
         
         כל החדרים המקומיים %s
         כל החדרים בשרת %s
    -    כתובת אתר של שרת בית
    +    שם השרת
         בחר מדריך חדרים
         אם הם לא תואמים, אבטחת התקשורת שלך עלולה להיפגע.
         אשרו על ידי השוואה בין הדברים הבאים להגדרות המשתמש בפגישה האחרת שלכם:
    @@ -686,7 +686,7 @@
         בועט משתמש עם מזהה נתון
         הגדר את נושא החדר
         עזוב חדר
    -    מצטרף לחדר עם כינוי נתון
    +    מצטרף לחדר עם כתובת ידועה
         מזמין משתמש עם זיהוי נתון לחדר הנוכחי
         משתמש מבוטל עם מזהה נתון
         הגדר את רמת ההרשאה של המשתמש
    @@ -705,7 +705,7 @@
         רטוט בעת אזכור משתמש
         כולל שינויים באווטאר ושמות תצוגה.
         הצג אירועי חשבון
    -    הזמנות, בעיטות ואיסורים אינם מושפעים.
    +    הזמנות, הסרות ואיסורים אינם מושפעים.
         הראה אירועי הצטרפות ועזיבה
         לחץ על אישורי הקריאה לרשימה מפורטת.
         הצג קבלות הצג קבלות קריאה
    @@ -2305,4 +2305,116 @@
         הזמן אל %s
         שתף קישור
         הזמן לפי שם משתמש או דואר אלקטרוני
    +    ההצפנה הוגדרה בצורה שגויה.
    +    אמת על ידי השוואת אימוג\'י
    +    סרוק עם המכשיר הקיים
    +    סרוק את הקוד עם המכשיר האחר או החלף וסרוק את הקוד מהמכשיר הקיים
    +    קול
    +    יצירת מרחב…
    +    כתובת מרחב
    +    קידומת ( ͡° ͜ʖ ͡°) להודעת טקסט רגילה
    +    הראה קצת מידע שימושי לעזור לטיפול בבאגים ביישום
    +    הראה מידע על באגים במסך
    +    נראה שכתובת הדואר האלקטרוני אינה תקפה
    +    התחבר לשרת
    +    מחפש להצטרף לשרת קיים \?
    +    עדיין לא בטוח \? אתה יכול %s
    +    קהילות
    +    צוותים
    +    חברים ומשפחה
    +    נעזור לך להיות מחובר.
    +    עם מי תדברו הכי הרבה\?
    +    הצפנה קצה לקצה ולא נדרש מספר טלפון. אין פרסומות או כריית מידע.
    +    בחירת מקום שמירת השיחה שלך , נותנת לך בקרה ועצמאות . מחובר דרך מטריקס.
    +    תקשורת מאובטחת ועצמאית המעניקה לך את אותה רמת פרטיות כמו שיחה פנים אל פנים בבית שלך.
    +    הודעות לקבוצתך.
    +    אתה בבקרה.
    +    שיחות בבעלותך.
    +    הגדרות חדר
    +    סקר
    +    הקובץ גדול מדי להעלאה.
    +    האם אתה מאשר את שליחת המידע \?
    +    שליחת דואר אלקטרוני ומספרי טלפון אל %s
    +    רשימת אנשי הקשר שלך הינה פרטית. לחשיפת משתמשים מרשימת אנשי הקשר שלך , נדרש אישורך לשליחת מידע על איש הקשר לשרת ההזדהות.
    +    לא סופקה מדיניות על ידי שרת הזדהות
    +    הסתר מדיניות שרת הזדהות
    +    הראה מדיניות שרת הזדהות
    +    פתח הגדרות
    +    משוב על מרחבים
    +    הגדרות מערכת
    +    גרסאות
    +    קבלת עזרה בשימוש ${app_name}
    +    עזרה ותמיכה
    +    עזרה
    +    משפטים
    +    אתה צופה בת\'רד זה!
    +    יצירת מרחב חדש
    +    צפייה בחדר
    +    מענה בת\'רד
    +    הצגת מידע על המשתמש
    +    משנה את האווטר שלך בחדר הנוכחי בלבד
    +    משנה את האווטר בחדר הנוכחי
    +    משנה את הכינוי בחדר הנוכחי בלבד
    +    הפקודה \"%s\" מזוהה אך אינה נתמכת.
    +    עזרו לנו לזהות ולשפר את ${app_name} על ידי שיתוף השימוש בצורה אנונימי. להבנת השימוש של אנשים במכשירים שונים , אנחנו נחולל מזהה אקראי , אשר ישותף על ידי המכשירים שלך .
    +\n
    +\n ניתן לקרוא את כל התנאים %s.
    +    
    +        התוצאה הסופית מתבססת על הצבעה %1$d
    +        
    +        התוצאה הסופית מתבססת על הצבעות %1$d
    +        
    +    
    +    בחר אילו מרחבים יכולים לגשת לחדר זה. בבחירת מרחב החברים יוכלו למצוא ולהצטרף לחדר.
    +    חברים במרחב %s יכולים למצוא , לצפות ולהצטרף.
    +    כל אחד במרחב בחדר זה יכול להצטרף. רק מנהלי מערכת של החדר יכולים להוסיף למרחב.
    +    אנחנו  לא  משתפים מידע עם חברות צד שלישי
    +    אנחנו  לא מקליטים או עושים פרופיל מנתוני החשבון
    +    הפסק להתעלם ממשתמש , אשר הודעותיו נראות
    +    הגדר את שם החדר
    +    התעלם ממשתמש , אשר מעלים הודעות ממך
    +    האם מאושרת עזיבת שיחת הועידה הנוכחית ומעבר לשיחת ועידה אחרת \?
    +    מצטערים , אירעה שגיאה בניסיון הצטרפות לשיחת הועידה
    +    השרת כבר נמצא ברשימה
    +    לא ניתן למצוא את השרת או את רשימת החדשים
    +    הכנס את שם השרת החדש שיחשף
    +    הוספת שרת חדש
    +    השרת שלך
    +    גרסת חדר
    +    מרחבים או חדרים שאינכם מכירים
    +    מרחב שמכיל את החדר
    +    בחרו מרחבים
    +    מרחבים פתוחים
    +    אפשרו לחברים במרחב להצטרף.
    +    מרחב לחברים בלבד
    +    כל אחד יכול למצוא את המרחב ולהצטרף
    +    כל אחד יכול להצטרף
    +    ציבורי
    +    רק מוזמנים יכולים להצטרף
    +    פרטי (מוזמן בלבד)
    +    פרטי
    +    הגדרת גישה לא ידועה(%s)
    +    כל אחד יכול לבקש להצטרף לחדר , החברים יוכלו לאשר או לדחות זאת
    +    סדר כתובות במרחב זה.
    +    מרחב כתובות
    +    אפשר לאורחים להצטרף
    +    מרחב גישה
    +    למי יש גישה\?
    +    הגדרות חשבון
    +    ניתן לסדר את ההתראות ב-%1$s.
    +    שימו לב שהתראות על מילים מוזכרות לא זמינות בחדרים מוצפנים בטלפון הנייד
    +    הודע לי עבור
    +    אין מדיניות לשרת זה
    +    ספריות חברות צד שלישי
    +    מדיניות שרת ההזדהות שלך
    +    מדיניות השרת הביתי שלך
    +    מדיניות ${app_name}
    +    ניתן לסגור בכל זמן בהגדרות
    +    כאן
    +    עזרה בשיפור ${app_name}
    +    לא תתקבלנה התראות על מילים המוזכרות בחדרים מוצפנים בטלפון הנייד.
    +    הודעות על ידי בוט
    +    חדר@
    +    הודעות קבוצתיות
    +    הודעות ישירות מוצפנות
     
    \ No newline at end of file
    
    From 7910b4cd3564bafdd6b5fb6d68cd6e17247d3ba8 Mon Sep 17 00:00:00 2001
    From: libexus 
    Date: Fri, 18 Mar 2022 20:20:38 +0000
    Subject: [PATCH 084/126] Translated using Weblate (German)
    
    Currently translated at 99.9% (2155 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
    ---
     vector/src/main/res/values-de/strings.xml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
    index a62349040d..4c5131d452 100644
    --- a/vector/src/main/res/values-de/strings.xml
    +++ b/vector/src/main/res/values-de/strings.xml
    @@ -2380,7 +2380,7 @@
         Organisiere Diskussionen mit Threads
         Threads im Raum filtern
         Möchtest du einem existierenden Server beitreten\?
    -    Communities
    +    Gemeinschaften
         Teams
         Wir helfen dir, in Verbindung zu kommen.
         Mit wem wirst du am meisten chatten\?
    
    From 8a783a7a0bddb4b0af7c5e8fbc0584153af50926 Mon Sep 17 00:00:00 2001
    From: Jeanne Lavoie 
    Date: Fri, 18 Mar 2022 22:21:25 +0000
    Subject: [PATCH 085/126] Translated using Weblate (French (Canada))
    
    Currently translated at 83.9% (1811 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/fr_CA/
    ---
     vector/src/main/res/values-fr-rCA/strings.xml | 5 +++++
     1 file changed, 5 insertions(+)
    
    diff --git a/vector/src/main/res/values-fr-rCA/strings.xml b/vector/src/main/res/values-fr-rCA/strings.xml
    index 29e2a7b9c2..c54c7c6222 100644
    --- a/vector/src/main/res/values-fr-rCA/strings.xml
    +++ b/vector/src/main/res/values-fr-rCA/strings.xml
    @@ -2069,4 +2069,9 @@
             %d changement des ACL du serveur
             %d changements des ACL du serveur
         
    +    Activer
    +    Voir les fils de discussions
    +    Permissions manquantes
    +    Pour envoyer des messages vocaux, veuillez accorder la permission Microphone.
    +    Pour effectuer cette action, veuillez autoriser la permission Caméra depuis les réglages système.
     
    \ No newline at end of file
    
    From 06af5a80178a6ee2897d3afc9cbe71cce989214c Mon Sep 17 00:00:00 2001
    From: notramo 
    Date: Fri, 18 Mar 2022 23:01:35 +0000
    Subject: [PATCH 086/126] Translated using Weblate (Hungarian)
    
    Currently translated at 99.8% (2154 of 2157 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 | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml
    index eae62b6417..f189a4198f 100644
    --- a/vector/src/main/res/values-hu/strings.xml
    +++ b/vector/src/main/res/values-hu/strings.xml
    @@ -2279,7 +2279,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
         Elhagytad a szobát!
         A meglévő kapcsolatok felderítéséhez információkat (e-mail cím és telefonszám) kell elküldeni az azonosítási szolgáltatónak. Az adatok az adatvédelem miatt hashelve lesznek elküldve.
         Beleegyezel az információk elküldésébe\?
    -    Ne most
    +    Nem most
         Engedélyezés
         Biztosan törlöd ezt a szavazást\? Ezt a műveletet később nem lehet visszavonni.
         Szavazás törlése
    
    From 777913493fb6d88631218eb8e4569a9652381116 Mon Sep 17 00:00:00 2001
    From: notramo 
    Date: Fri, 18 Mar 2022 21:05:54 +0000
    Subject: [PATCH 087/126] Translated using Weblate (Hungarian)
    
    Currently translated at 100.0% (51 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/
    ---
     fastlane/metadata/android/hu-HU/full_description.txt | 9 +++++----
     1 file changed, 5 insertions(+), 4 deletions(-)
    
    diff --git a/fastlane/metadata/android/hu-HU/full_description.txt b/fastlane/metadata/android/hu-HU/full_description.txt
    index 0791eed7ba..b43613eb20 100644
    --- a/fastlane/metadata/android/hu-HU/full_description.txt
    +++ b/fastlane/metadata/android/hu-HU/full_description.txt
    @@ -8,12 +8,13 @@ Az Element egy biztonságos üzenetküldő, és egy csapatmunka app, amely távo
     - Videochat, VoIP, és képernyőmegosztási lehetőséggel 
     - Egyszerű integráció a kedvenc online kollaborációs eszközeiddel, projektkezelési eszközökkel, VoIP szolgáltatásokkal, és más csoportos üzenetküldő alkalmazásokkal
     
    -Element is completely different from other messaging and collaboration apps. It operates on Matrix, an open network for secure messaging and decentralized communication. It allows self-hosting to give users maximum ownership and control of their data and messages.
    +Az Element teljesen más, mint az összes többi üzenetküldő és kollaborációs alkalmazás. A biztonságos üzenetküldést és decentralizált kommunikációt biztosító Matrix platformot használja. Akár egyénileg üzemeltetett szervereket is lehet használni az adatok teljes kontrollálása érdekében.
     
    -Privacy and encrypted messaging
    -Element protects you from unwanted ads, data mining and walled gardens. It also secures all your data, one-to-one video and voice communication through end-to-end encryption and cross-signed device verification.
    +Magánszféra és titkosított csevegés
    +Az Element megvéd a nemkívánatos hirdetésektől, adatbányászattól, és a zárt platformoktól. Ezeken felül biztonságban tartja az összes adatod és 1:1 hívásod a végponti titkosításnak és az eszközök-közti hitelesítésnek köszönhetően.
    +
    +Az Element átadja neked az irányítást a magánszférád felett, miközben lehetővé teszi, hogy biztonságosan kommunikálj bárkivel a Matrix hálózatban, vagy a többi üzleti kommunikációs eszközt használókkal, az olyan appok integrálásának köszönhetően, mint például a Slack.
     
    -Element gives you control over your privacy while allowing you to communicate securely with anyone on the Matrix network, or other business collaboration tools by integrating with apps such as Slack.
     
     Element can be self-hosted
     To allow more control of your sensitive data and conversations, Element can be self-hosted or you can choose any Matrix-based host - the standard for open source, decentralized communication. Element gives you privacy, security compliance and integration flexibility.
    
    From 75fe14561efa3828c095f9b5014030091528e75b Mon Sep 17 00:00:00 2001
    From: Linerly 
    Date: Sun, 20 Mar 2022 07:40:09 +0000
    Subject: [PATCH 088/126] Translated using Weblate (Indonesian)
    
    Currently translated at 100.0% (2157 of 2157 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 | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml
    index d7856089e8..719b49fc4b 100644
    --- a/vector/src/main/res/values-in/strings.xml
    +++ b/vector/src/main/res/values-in/strings.xml
    @@ -2002,7 +2002,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
     \n${app_name} Desktop
         Atur kata sandi akun baru…
         Tidak dapat menyimpan file media
    -    Mengaktifkan pengaturan ini menambahkan FLAG_SECURE ke semua Aktifitas. Mulai ulang aplikasi ini untuk berpengaruh pada perubahannya.
    +    Mengaktifkan pengaturan ini menambahkan FLAG_SECURE ke semua Aktivitas. Mulai ulang aplikasi ini untuk berpengaruh pada perubahannya.
         Mencegah tangkapan layar dari aplikasi
         Kunci pemulihan kunci cadangan
         Tidak tahu Kunci Frasa Sandi Cadangan, Anda dapat %s.
    
    From ed2cb5f0fe20102afd2db43f1eb9dd243730f254 Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Mon, 21 Mar 2022 15:45:08 +0200
    Subject: [PATCH 089/126] Enhance text constants
    
    ---
     vector/src/main/res/values/strings.xml | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
    index fbb3b81efa..1ce3a4f87e 100644
    --- a/vector/src/main/res/values/strings.xml
    +++ b/vector/src/main/res/values/strings.xml
    @@ -731,8 +731,8 @@
         
         Tip: Long tap a message and use “%s”.
         From a Thread
    -    Threads no longer experimental
    -    All threads created during the experimental period will now be rendered as regular replies.\n\nThis will be a one-off transition, as threads are now part of the Matrix specification.\n\nThank you for helping us test Threads! 🎉
    +    Threads Approaching Beta 🎉
    +    We’re getting closer to releasing a public Beta for Threads.\n\nAs we prepare for it, we need to make some changes: threads created before this point will be displayed as regular replies.\n\nThis will be a one-off transition as Threads are now part of the Matrix specification.
     
         
         Search
    
    From 6fd207764dfbb1017de99d7a009aa998d2b5f03c Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Mon, 21 Mar 2022 23:03:30 +0000
    Subject: [PATCH 090/126] Bump actions/cache from 2 to 3
    
    Bumps [actions/cache](https://github.com/actions/cache) from 2 to 3.
    - [Release notes](https://github.com/actions/cache/releases)
    - [Commits](https://github.com/actions/cache/compare/v2...v3)
    
    ---
    updated-dependencies:
    - dependency-name: actions/cache
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     .github/workflows/build.yml   | 4 ++--
     .github/workflows/nightly.yml | 8 ++++----
     .github/workflows/quality.yml | 4 ++--
     .github/workflows/tests.yml   | 4 ++--
     4 files changed, 10 insertions(+), 10 deletions(-)
    
    diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
    index 4ff935fad1..14b5112818 100644
    --- a/.github/workflows/build.yml
    +++ b/.github/workflows/build.yml
    @@ -26,7 +26,7 @@ jobs:
           cancel-in-progress: true
         steps:
           - uses: actions/checkout@v3
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    @@ -50,7 +50,7 @@ jobs:
         # Only runs on main, no concurrency.
         steps:
           - uses: actions/checkout@v3
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
    index 455545aeef..9b225ce59b 100644
    --- a/.github/workflows/nightly.yml
    +++ b/.github/workflows/nightly.yml
    @@ -34,7 +34,7 @@ jobs:
             uses: actions/setup-python@v3
             with:
               python-version: 3.8
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    @@ -221,7 +221,7 @@ jobs:
             uses: actions/setup-python@v3
             with:
               python-version: 3.8
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    @@ -273,7 +273,7 @@ jobs:
             with: 
               distribution: 'adopt'
               java-version: '11'
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    @@ -302,7 +302,7 @@ jobs:
             with:
               distribution: 'adopt'
               java-version: '11'
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml
    index a588b91449..d427d65b7f 100644
    --- a/.github/workflows/quality.yml
    +++ b/.github/workflows/quality.yml
    @@ -97,7 +97,7 @@ jobs:
           cancel-in-progress: true
         steps:
           - uses: actions/checkout@v3
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    @@ -130,7 +130,7 @@ jobs:
           cancel-in-progress: true
         steps:
           - uses: actions/checkout@v3
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
    index 587bf14488..98e5f588ca 100644
    --- a/.github/workflows/tests.yml
    +++ b/.github/workflows/tests.yml
    @@ -25,7 +25,7 @@ jobs:
             with: 
               distribution: 'adopt' 
               java-version: 11 
    -      - uses: actions/cache@v2 
    +      - uses: actions/cache@v3 
             with: 
               path: | 
                 ~/.gradle/caches 
    @@ -45,7 +45,7 @@ jobs:
           cancel-in-progress: true
         steps:
           - uses: actions/checkout@v3
    -      - uses: actions/cache@v2
    +      - uses: actions/cache@v3
             with:
               path: |
                 ~/.gradle/caches
    
    From 13d0b2366356ac10d90ffe16ce24c7a861da0b01 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Mon, 21 Mar 2022 23:03:32 +0000
    Subject: [PATCH 091/126] Bump michaelkaye/setup-matrix-synapse from 0.3.0 to
     0.4.0
    
    Bumps [michaelkaye/setup-matrix-synapse](https://github.com/michaelkaye/setup-matrix-synapse) from 0.3.0 to 0.4.0.
    - [Release notes](https://github.com/michaelkaye/setup-matrix-synapse/releases)
    - [Commits](https://github.com/michaelkaye/setup-matrix-synapse/compare/v0.3.0...v0.4.0)
    
    ---
    updated-dependencies:
    - dependency-name: michaelkaye/setup-matrix-synapse
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     .github/workflows/nightly.yml | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
    index 455545aeef..4a1ea84107 100644
    --- a/.github/workflows/nightly.yml
    +++ b/.github/workflows/nightly.yml
    @@ -43,7 +43,7 @@ jobs:
               restore-keys: |
                 ${{ runner.os }}-gradle-
           - name: Start synapse server
    -        uses: michaelkaye/setup-matrix-synapse@v0.3.0
    +        uses: michaelkaye/setup-matrix-synapse@v0.4.0
             with:
               uploadLogs: true
               httpPort: 8080
    @@ -230,7 +230,7 @@ jobs:
               restore-keys: |
                 ${{ runner.os }}-gradle-
           - name: Start synapse server
    -        uses: michaelkaye/setup-matrix-synapse@v0.3.0
    +        uses: michaelkaye/setup-matrix-synapse@v0.4.0
             with:
               uploadLogs: true
               httpPort: 8080
    
    From c2e3c631002cb324055a7a402774e65d63b2a003 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Mon, 21 Mar 2022 23:09:06 +0000
    Subject: [PATCH 092/126] Bump json from 20211205 to 20220320
    
    Bumps [json](https://github.com/douglascrockford/JSON-java) from 20211205 to 20220320.
    - [Release notes](https://github.com/douglascrockford/JSON-java/releases)
    - [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md)
    - [Commits](https://github.com/douglascrockford/JSON-java/commits)
    
    ---
    updated-dependencies:
    - dependency-name: org.json:json
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     library/jsonviewer/build.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/library/jsonviewer/build.gradle b/library/jsonviewer/build.gradle
    index 15f46754b3..0cad8ac171 100644
    --- a/library/jsonviewer/build.gradle
    +++ b/library/jsonviewer/build.gradle
    @@ -59,7 +59,7 @@ dependencies {
         implementation libs.jetbrains.coroutinesCore
         implementation libs.jetbrains.coroutinesAndroid
     
    -    testImplementation 'org.json:json:20211205'
    +    testImplementation 'org.json:json:20220320'
         testImplementation libs.tests.junit
         androidTestImplementation libs.androidx.junit
         androidTestImplementation libs.androidx.espressoCore
    
    From a431d885f0323897e875db42bf4f13b21a6ff736 Mon Sep 17 00:00:00 2001
    From: ariskotsomitopoulos 
    Date: Tue, 22 Mar 2022 11:20:47 +0200
    Subject: [PATCH 093/126] Increase the thread summaries limit
    
    ---
     .../session/room/relation/threads/FetchThreadSummariesTask.kt   | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/threads/FetchThreadSummariesTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/threads/FetchThreadSummariesTask.kt
    index d316eed691..b596f2288e 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/threads/FetchThreadSummariesTask.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/threads/FetchThreadSummariesTask.kt
    @@ -44,7 +44,7 @@ internal interface FetchThreadSummariesTask : Task
    Date: Tue, 22 Mar 2022 13:57:20 +0200
    Subject: [PATCH 094/126] PR remarks
    
    ---
     .../database/lightweight/LightweightSettingsStorage.kt      | 4 ++--
     .../main/java/im/vector/app/features/home/HomeActivity.kt   | 6 +++---
     2 files changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt
    index 65c98ab872..069e539e2c 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/lightweight/LightweightSettingsStorage.kt
    @@ -24,13 +24,13 @@ import javax.inject.Inject
     
     /**
      * The purpose of this class is to provide an alternative and lightweight way to store settings/data
    - * on the sdi without using the database. This should be used just for sdk/user preferences and
    + * on the sdk without using the database. This should be used just for sdk/user preferences and
      * not for large data sets
      */
     
     class LightweightSettingsStorage  @Inject constructor(
             context: Context,
    -        val matrixConfiguration: MatrixConfiguration
    +        private val matrixConfiguration: MatrixConfiguration
     ) {
     
         private val sdkDefaultPrefs = PreferenceManager.getDefaultSharedPreferences(context.applicationContext)
    diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    index dbeb5d5b8f..2e9ab0efcb 100644
    --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    @@ -90,7 +90,7 @@ import javax.inject.Inject
     data class HomeActivityArgs(
             val clearNotification: Boolean,
             val accountCreation: Boolean,
    -        val existingSession: Boolean = false,
    +        val hasExistingSession: Boolean = false,
             val inviteNotificationRoomId: String? = null
     ) : Parcelable
     
    @@ -280,7 +280,7 @@ class HomeActivity :
             if (checkSession) {
                 // We should check session to ensure we will only clear cache if needed
                 val args = intent.getParcelableExtra(Mavericks.KEY_ARG)
    -            if (args?.existingSession == true) {
    +            if (args?.hasExistingSession == true) {
                     // existingSession --> Will be true only if we came from an existing active session
                     Timber.i("----> Migrating threads from an existing session..")
                     handleThreadsMigration()
    @@ -597,7 +597,7 @@ class HomeActivity :
                 val args = HomeActivityArgs(
                         clearNotification = clearNotification,
                         accountCreation = accountCreation,
    -                    existingSession = existingSession,
    +                    hasExistingSession = existingSession,
                         inviteNotificationRoomId = inviteNotificationRoomId
                 )
     
    
    From 1e6e8b546d2dd5c46d01de51dd073cb7df1b473b Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Tue, 22 Mar 2022 12:37:13 +0000
    Subject: [PATCH 095/126] fixing presence icon anchoring to the middle of the
     room icon - creates a secondary verification shield and aligns to the start
     of the room title when presence is present
    
    ---
     changelog.d/5489.bugfix                       |  1 +
     .../home/room/detail/TimelineFragment.kt      |  9 ++--
     .../res/layout/view_room_detail_toolbar.xml   | 46 ++++++++++++-------
     3 files changed, 34 insertions(+), 22 deletions(-)
     create mode 100644 changelog.d/5489.bugfix
    
    diff --git a/changelog.d/5489.bugfix b/changelog.d/5489.bugfix
    new file mode 100644
    index 0000000000..69ef0118a8
    --- /dev/null
    +++ b/changelog.d/5489.bugfix
    @@ -0,0 +1 @@
    +Fix presence indicator being aligned to the center of the room image
    \ No newline at end of file
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    index b66897d8d1..f462128c6b 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    @@ -1613,11 +1613,10 @@ class TimelineFragment @Inject constructor(
                     views.includeRoomToolbar.roomToolbarContentView.isClickable = roomSummary.membership == Membership.JOIN
                     views.includeRoomToolbar.roomToolbarTitleView.text = roomSummary.displayName
                     avatarRenderer.render(roomSummary.toMatrixItem(), views.includeRoomToolbar.roomToolbarAvatarImageView)
    -                views.includeRoomToolbar.roomToolbarDecorationImageView.render(roomSummary.roomEncryptionTrustLevel)
    -                views.includeRoomToolbar.roomToolbarPresenceImageView.render(
    -                        roomSummary.isDirect && matrixConfiguration.presenceSyncEnabled,
    -                        roomSummary.directUserPresence
    -                )
    +                val showPresence = roomSummary.isDirect && matrixConfiguration.presenceSyncEnabled
    +                views.includeRoomToolbar.roomToolbarPresenceImageView.render(showPresence, roomSummary.directUserPresence)
    +                val shieldView = if (showPresence) views.includeRoomToolbar.roomToolbarTitleShield else views.includeRoomToolbar.roomToolbarAvatarShield
    +                shieldView.render(roomSummary.roomEncryptionTrustLevel)
                     views.includeRoomToolbar.roomToolbarPublicImageView.isVisible = roomSummary.isPublic && !roomSummary.isDirect
                 }
             } else {
    diff --git a/vector/src/main/res/layout/view_room_detail_toolbar.xml b/vector/src/main/res/layout/view_room_detail_toolbar.xml
    index befd84ea34..d5c1914d41 100644
    --- a/vector/src/main/res/layout/view_room_detail_toolbar.xml
    +++ b/vector/src/main/res/layout/view_room_detail_toolbar.xml
    @@ -19,15 +19,6 @@
             app:layout_constraintTop_toTopOf="parent"
             tools:src="@sample/room_round_avatars" />
     
    -    
    -
         
     
    @@ -59,27 +48,50 @@
             tools:ignore="MissingConstraints"
             tools:visibility="invisible" />
     
    +    
    +
         
    +        app:constraint_referenced_ids="roomToolbarAvatarImageView,roomToolbarAvatarShield,roomToolbarPresenceImageView,roomToolbarPublicImageView" />
    +
    +    
     
         
    Date: Tue, 22 Mar 2022 17:04:35 +0300
    Subject: [PATCH 096/126] Code review fixes.
    
    ---
     .../detail/timeline/item/MessageVoiceItem.kt  | 74 ++++++++++---------
     1 file changed, 38 insertions(+), 36 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    index 722e0f620a..bbaab3959d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    @@ -24,6 +24,7 @@ import android.view.View
     import android.view.ViewGroup
     import android.widget.ImageButton
     import android.widget.TextView
    +import androidx.core.view.doOnLayout
     import androidx.core.view.isVisible
     import com.airbnb.epoxy.EpoxyAttribute
     import com.airbnb.epoxy.EpoxyModelClass
    @@ -85,31 +86,8 @@ abstract class MessageVoiceItem : AbsMessageItem() {
                 holder.progressLayout.isVisible = false
             }
     
    -        holder.voicePlaybackWaveform.setOnLongClickListener(attributes.itemLongClickListener)
    -
    -        val waveformColorIdle = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_quaternary)
    -        val waveformColorPlayed = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary)
    -
    -        holder.voicePlaybackWaveform.post {
    -            holder.voicePlaybackWaveform.clear()
    -            waveform.forEach { amplitude ->
    -                holder.voicePlaybackWaveform.add(AudioWaveformView.FFT(amplitude.toFloat(), waveformColorIdle))
    -            }
    -            holder.voicePlaybackWaveform.summarize()
    -
    -            holder.voicePlaybackWaveform.setOnTouchListener { view, motionEvent ->
    -                when (motionEvent.action) {
    -                    MotionEvent.ACTION_UP   -> {
    -                        val percentage = getTouchedPositionPercentage(motionEvent, view)
    -                        waveformTouchListener?.onWaveformTouchedUp(percentage)
    -                    }
    -                    MotionEvent.ACTION_MOVE -> {
    -                        val percentage = getTouchedPositionPercentage(motionEvent, view)
    -                        waveformTouchListener?.onWaveformMovedTo(percentage)
    -                    }
    -                }
    -                true
    -            }
    +        holder.voicePlaybackWaveform.doOnLayout {
    +            onWaveformViewReady(holder)
             }
     
             val backgroundTint = if (attributes.informationData.messageLayout is TimelineMessageLayout.Bubble) {
    @@ -119,19 +97,43 @@ abstract class MessageVoiceItem : AbsMessageItem() {
             }
             holder.voicePlaybackLayout.backgroundTintList = ColorStateList.valueOf(backgroundTint)
             holder.voicePlaybackControlButton.setOnClickListener { playbackControlButtonClickListener?.invoke(it) }
    +    }
     
    -        // Don't track and don't try to update UI before view is present
    -        holder.view.post {
    -            voiceMessagePlaybackTracker.track(attributes.informationData.eventId, object : VoiceMessagePlaybackTracker.Listener {
    -                override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) {
    -                    when (state) {
    -                        is VoiceMessagePlaybackTracker.Listener.State.Idle    -> renderIdleState(holder, waveformColorIdle, waveformColorPlayed)
    -                        is VoiceMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state, waveformColorIdle, waveformColorPlayed)
    -                        is VoiceMessagePlaybackTracker.Listener.State.Paused  -> renderPausedState(holder, state, waveformColorIdle, waveformColorPlayed)
    -                    }
    -                }
    -            })
    +    private fun onWaveformViewReady(holder: Holder) {
    +        holder.voicePlaybackWaveform.setOnLongClickListener(attributes.itemLongClickListener)
    +
    +        val waveformColorIdle = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_quaternary)
    +        val waveformColorPlayed = ThemeUtils.getColor(holder.view.context, R.attr.vctr_content_secondary)
    +
    +        holder.voicePlaybackWaveform.clear()
    +        waveform.forEach { amplitude ->
    +            holder.voicePlaybackWaveform.add(AudioWaveformView.FFT(amplitude.toFloat(), waveformColorIdle))
             }
    +        holder.voicePlaybackWaveform.summarize()
    +
    +        holder.voicePlaybackWaveform.setOnTouchListener { view, motionEvent ->
    +            when (motionEvent.action) {
    +                MotionEvent.ACTION_UP   -> {
    +                    val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                    waveformTouchListener?.onWaveformTouchedUp(percentage)
    +                }
    +                MotionEvent.ACTION_MOVE -> {
    +                    val percentage = getTouchedPositionPercentage(motionEvent, view)
    +                    waveformTouchListener?.onWaveformMovedTo(percentage)
    +                }
    +            }
    +            true
    +        }
    +
    +        voiceMessagePlaybackTracker.track(attributes.informationData.eventId, object : VoiceMessagePlaybackTracker.Listener {
    +            override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) {
    +                when (state) {
    +                    is VoiceMessagePlaybackTracker.Listener.State.Idle    -> renderIdleState(holder, waveformColorIdle, waveformColorPlayed)
    +                    is VoiceMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state, waveformColorIdle, waveformColorPlayed)
    +                    is VoiceMessagePlaybackTracker.Listener.State.Paused  -> renderPausedState(holder, state, waveformColorIdle, waveformColorPlayed)
    +                }
    +            }
    +        })
         }
     
         private fun getTouchedPositionPercentage(motionEvent: MotionEvent, view: View) = (motionEvent.x / view.width).coerceIn(0f, 1f)
    
    From 6f55a25a30c9f24ee130f290052822ae9334729b Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Tue, 16 Nov 2021 12:33:23 +0000
    Subject: [PATCH 097/126] Bump kotlin-gradle-plugin from 1.5.31 to 1.6.0
    
    Bumps [kotlin-gradle-plugin](https://github.com/JetBrains/kotlin) from 1.5.31 to 1.6.0.
    - [Release notes](https://github.com/JetBrains/kotlin/releases)
    - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
    - [Commits](https://github.com/JetBrains/kotlin/commits)
    
    ---
    updated-dependencies:
    - dependency-name: org.jetbrains.kotlin:kotlin-gradle-plugin
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     dependencies.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/dependencies.gradle b/dependencies.gradle
    index 1f2a08b6a6..4f06fbfa86 100644
    --- a/dependencies.gradle
    +++ b/dependencies.gradle
    @@ -9,7 +9,7 @@ ext.versions = [
     
     def gradle = "7.0.4"
     // Ref: https://kotlinlang.org/releases.html
    -def kotlin = "1.5.31"
    +def kotlin = "1.6.0"
     def kotlinCoroutines = "1.5.2"
     def dagger = "2.40.5"
     def retrofit = "2.9.0"
    
    From e169c81a2cfc77604da8760c7593117c61f163e1 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Thu, 9 Dec 2021 23:17:20 +0000
    Subject: [PATCH 098/126] Bump moshi from 1.12.0 to 1.13.0
    
    Bumps `moshi` from 1.12.0 to 1.13.0.
    
    Updates `moshi-adapters` from 1.12.0 to 1.13.0
    - [Release notes](https://github.com/square/moshi/releases)
    - [Changelog](https://github.com/square/moshi/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/square/moshi/compare/moshi-parent-1.12.0...moshi-parent-1.13.0)
    
    Updates `moshi-kotlin-codegen` from 1.12.0 to 1.13.0
    - [Release notes](https://github.com/square/moshi/releases)
    - [Changelog](https://github.com/square/moshi/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/square/moshi/compare/moshi-parent-1.12.0...moshi-parent-1.13.0)
    
    ---
    updated-dependencies:
    - dependency-name: com.squareup.moshi:moshi-adapters
      dependency-type: direct:production
      update-type: version-update:semver-minor
    - dependency-name: com.squareup.moshi:moshi-kotlin-codegen
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     dependencies.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/dependencies.gradle b/dependencies.gradle
    index 4f06fbfa86..c0b9726f0f 100644
    --- a/dependencies.gradle
    +++ b/dependencies.gradle
    @@ -15,7 +15,7 @@ def dagger = "2.40.5"
     def retrofit = "2.9.0"
     def arrow = "0.8.2"
     def markwon = "4.6.2"
    -def moshi = "1.12.0"
    +def moshi = "1.13.0"
     def lifecycle = "2.4.0"
     def flowBinding = "1.2.0"
     def epoxy = "4.6.2"
    
    From f07c9bf105509cc9eef6fbfa35245f5892f2c14b Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 14:40:53 +0100
    Subject: [PATCH 099/126] Fix compilation warning (exhaustive when)
    
    ---
     .../billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt   | 7 ++-----
     1 file changed, 2 insertions(+), 5 deletions(-)
    
    diff --git a/library/jsonviewer/src/main/java/org/billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt b/library/jsonviewer/src/main/java/org/billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt
    index 96b5a9c997..e3c4004fb5 100644
    --- a/library/jsonviewer/src/main/java/org/billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt
    +++ b/library/jsonviewer/src/main/java/org/billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt
    @@ -20,7 +20,6 @@ import android.content.Context
     import android.view.View
     import com.airbnb.epoxy.TypedEpoxyController
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Success
     import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
     import me.gujun.android.span.Span
     import me.gujun.android.span.span
    @@ -44,10 +43,8 @@ internal class JSonViewerEpoxyController(private val context: Context) :
                         text(async.error.localizedMessage?.toEpoxyCharSequence())
                     }
                 }
    -            is Success -> {
    -                val model = data.root.invoke()
    -
    -                model?.let {
    +            else    -> {
    +                async.invoke()?.let {
                         buildRec(it, 0, "")
                     }
                 }
    
    From ed62a2f1c98a4e5f58a56d0be56d3ba5c67c79bf Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 14:42:05 +0100
    Subject: [PATCH 100/126] Format file (no other change)
    
    ---
     .../jsonviewer/JSonViewerEpoxyController.kt   | 182 +++++++++---------
     1 file changed, 91 insertions(+), 91 deletions(-)
    
    diff --git a/library/jsonviewer/src/main/java/org/billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt b/library/jsonviewer/src/main/java/org/billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt
    index e3c4004fb5..9f8093f801 100644
    --- a/library/jsonviewer/src/main/java/org/billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt
    +++ b/library/jsonviewer/src/main/java/org/billcarsonfr/jsonviewer/JSonViewerEpoxyController.kt
    @@ -25,7 +25,7 @@ import me.gujun.android.span.Span
     import me.gujun.android.span.span
     
     internal class JSonViewerEpoxyController(private val context: Context) :
    -    TypedEpoxyController() {
    +        TypedEpoxyController() {
     
         private var styleProvider: JSonViewerStyleProvider = JSonViewerStyleProvider.default(context)
     
    @@ -52,9 +52,9 @@ internal class JSonViewerEpoxyController(private val context: Context) :
         }
     
         private fun buildRec(
    -        model: JSonViewerModel,
    -        depth: Int,
    -        idBase: String
    +            model: JSonViewerModel,
    +            depth: Int,
    +            idBase: String
         ) {
             val host = this
             val id = "$idBase/${model.key ?: model.index}_${model.isExpanded}}"
    @@ -71,34 +71,34 @@ internal class JSonViewerEpoxyController(private val context: Context) :
                             id(id + "_sum")
                             depth(depth)
                             text(
    -                            span {
    -                                if (model.key != null) {
    -                                    span("\"${model.key}\"") {
    -                                        textColor = host.styleProvider.keyColor
    -                                    }
    -                                    span(" : ") {
    -                                        textColor = host.styleProvider.baseColor
    -                                    }
    -                                }
    -                                if (model.index != null) {
    -                                    span("${model.index}") {
    -                                        textColor = host.styleProvider.secondaryColor
    -                                    }
    -                                    span(" : ") {
    -                                        textColor = host.styleProvider.baseColor
    -                                    }
    -                                }
                                     span {
    -                                    +"{+${model.keys.size}}"
    -                                    textColor = host.styleProvider.baseColor
    -                                }
    -                            }.toEpoxyCharSequence()
    +                                    if (model.key != null) {
    +                                        span("\"${model.key}\"") {
    +                                            textColor = host.styleProvider.keyColor
    +                                        }
    +                                        span(" : ") {
    +                                            textColor = host.styleProvider.baseColor
    +                                        }
    +                                    }
    +                                    if (model.index != null) {
    +                                        span("${model.index}") {
    +                                            textColor = host.styleProvider.secondaryColor
    +                                        }
    +                                        span(" : ") {
    +                                            textColor = host.styleProvider.baseColor
    +                                        }
    +                                    }
    +                                    span {
    +                                        +"{+${model.keys.size}}"
    +                                        textColor = host.styleProvider.baseColor
    +                                    }
    +                                }.toEpoxyCharSequence()
                             )
                             itemClickListener(View.OnClickListener { host.itemClicked(model) })
                         }
                     }
                 }
    -            is JSonViewerArray -> {
    +            is JSonViewerArray  -> {
                     if (model.isExpanded) {
                         open(id, model.key, model.index, depth, false, model)
                         model.items.forEach {
    @@ -110,6 +110,38 @@ internal class JSonViewerEpoxyController(private val context: Context) :
                             id(id + "_sum")
                             depth(depth)
                             text(
    +                                span {
    +                                    if (model.key != null) {
    +                                        span("\"${model.key}\"") {
    +                                            textColor = host.styleProvider.keyColor
    +                                        }
    +                                        span(" : ") {
    +                                            textColor = host.styleProvider.baseColor
    +                                        }
    +                                    }
    +                                    if (model.index != null) {
    +                                        span("${model.index}") {
    +                                            textColor = host.styleProvider.secondaryColor
    +                                        }
    +                                        span(" : ") {
    +                                            textColor = host.styleProvider.baseColor
    +                                        }
    +                                    }
    +                                    span {
    +                                        +"[+${model.items.size}]"
    +                                        textColor = host.styleProvider.baseColor
    +                                    }
    +                                }.toEpoxyCharSequence()
    +                        )
    +                        itemClickListener(View.OnClickListener { host.itemClicked(model) })
    +                    }
    +                }
    +            }
    +            is JSonViewerLeaf   -> {
    +                valueItem {
    +                    id(id)
    +                    depth(depth)
    +                    text(
                                 span {
                                     if (model.key != null) {
                                         span("\"${model.key}\"") {
    @@ -119,6 +151,7 @@ internal class JSonViewerEpoxyController(private val context: Context) :
                                             textColor = host.styleProvider.baseColor
                                         }
                                     }
    +
                                     if (model.index != null) {
                                         span("${model.index}") {
                                             textColor = host.styleProvider.secondaryColor
    @@ -127,41 +160,8 @@ internal class JSonViewerEpoxyController(private val context: Context) :
                                             textColor = host.styleProvider.baseColor
                                         }
                                     }
    -                                span {
    -                                    +"[+${model.items.size}]"
    -                                    textColor = host.styleProvider.baseColor
    -                                }
    +                                append(host.valueToSpan(model))
                                 }.toEpoxyCharSequence()
    -                        )
    -                        itemClickListener(View.OnClickListener { host.itemClicked(model) })
    -                    }
    -                }
    -            }
    -            is JSonViewerLeaf -> {
    -                valueItem {
    -                    id(id)
    -                    depth(depth)
    -                    text(
    -                        span {
    -                            if (model.key != null) {
    -                                span("\"${model.key}\"") {
    -                                    textColor = host.styleProvider.keyColor
    -                                }
    -                                span(" : ") {
    -                                    textColor = host.styleProvider.baseColor
    -                                }
    -                            }
    -
    -                            if (model.index != null) {
    -                                span("${model.index}") {
    -                                    textColor = host.styleProvider.secondaryColor
    -                                }
    -                                span(" : ") {
    -                                    textColor = host.styleProvider.baseColor
    -                                }
    -                            }
    -                            append(host.valueToSpan(model))
    -                        }.toEpoxyCharSequence()
                         )
                         copyValue(model.stringRes)
                     }
    @@ -172,12 +172,12 @@ internal class JSonViewerEpoxyController(private val context: Context) :
         private fun valueToSpan(leaf: JSonViewerLeaf): Span {
             val host = this
             return when (leaf.type) {
    -            JSONType.STRING -> {
    +            JSONType.STRING  -> {
                     span("\"${leaf.stringRes}\"") {
                         textColor = host.styleProvider.stringColor
                     }
                 }
    -            JSONType.NUMBER -> {
    +            JSONType.NUMBER  -> {
                     span(leaf.stringRes) {
                         textColor = host.styleProvider.numberColor
                     }
    @@ -187,7 +187,7 @@ internal class JSonViewerEpoxyController(private val context: Context) :
                         textColor = host.styleProvider.booleanColor
                     }
                 }
    -            JSONType.NULL -> {
    +            JSONType.NULL    -> {
                     span("null") {
                         textColor = host.styleProvider.booleanColor
                     }
    @@ -196,42 +196,42 @@ internal class JSonViewerEpoxyController(private val context: Context) :
         }
     
         private fun open(
    -        id: String,
    -        key: String?,
    -        index: Int?,
    -        depth: Int,
    -        isObject: Boolean = true,
    -        composed: JSonViewerModel
    +            id: String,
    +            key: String?,
    +            index: Int?,
    +            depth: Int,
    +            isObject: Boolean = true,
    +            composed: JSonViewerModel
         ) {
             val host = this
             valueItem {
                 id("${id}_Open")
                 depth(depth)
                 text(
    -                span {
    -                    if (key != null) {
    -                        span("\"$key\"") {
    -                            textColor = host.styleProvider.keyColor
    +                    span {
    +                        if (key != null) {
    +                            span("\"$key\"") {
    +                                textColor = host.styleProvider.keyColor
    +                            }
    +                            span(" : ") {
    +                                textColor = host.styleProvider.baseColor
    +                            }
                             }
    -                        span(" : ") {
    -                            textColor = host.styleProvider.baseColor
    +                        if (index != null) {
    +                            span("$index") {
    +                                textColor = host.styleProvider.secondaryColor
    +                            }
    +                            span(" : ") {
    +                                textColor = host.styleProvider.baseColor
    +                            }
                             }
    -                    }
    -                    if (index != null) {
    -                        span("$index") {
    +                        span("- ") {
                                 textColor = host.styleProvider.secondaryColor
                             }
    -                        span(" : ") {
    +                        span("{".takeIf { isObject } ?: "[") {
                                 textColor = host.styleProvider.baseColor
                             }
    -                    }
    -                    span("- ") {
    -                        textColor = host.styleProvider.secondaryColor
    -                    }
    -                    span("{".takeIf { isObject } ?: "[") {
    -                        textColor = host.styleProvider.baseColor
    -                    }
    -                }.toEpoxyCharSequence()
    +                    }.toEpoxyCharSequence()
                 )
                 itemClickListener(View.OnClickListener { host.itemClicked(composed) })
             }
    @@ -248,10 +248,10 @@ internal class JSonViewerEpoxyController(private val context: Context) :
                 id("${id}_Close")
                 depth(depth)
                 text(
    -                span {
    -                    text = "}".takeIf { isObject } ?: "]"
    -                    textColor = host.styleProvider.baseColor
    -                }.toEpoxyCharSequence()
    +                    span {
    +                        text = "}".takeIf { isObject } ?: "]"
    +                        textColor = host.styleProvider.baseColor
    +                    }.toEpoxyCharSequence()
                 )
             }
         }
    
    From 7502158ba90832f9b0c1861d57e8281c03da7f06 Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 14:45:01 +0100
    Subject: [PATCH 101/126] Fix compilation warning (exhaustive when)
    
    ---
     .../verification/qrcode/DefaultQrCodeVerificationTransaction.kt  | 1 +
     .../sdk/internal/session/room/summary/RoomSummaryDataSource.kt   | 1 +
     2 files changed, 2 insertions(+)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt
    index 829e066bf3..8bfbcfaef4 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt
    @@ -272,6 +272,7 @@ internal class DefaultQrCodeVerificationTransaction(
                     // I now know that i can trust my MSK
                     trust(true, emptyList(), true)
                 }
    +            null                                           -> Unit
             }
         }
     
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryDataSource.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryDataSource.kt
    index ea4f102fa5..aa78bb8afc 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryDataSource.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryDataSource.kt
    @@ -314,6 +314,7 @@ internal class RoomSummaryDataSource @Inject constructor(
                 RoomCategoryFilter.ONLY_ROOMS              -> query.equalTo(RoomSummaryEntityFields.IS_DIRECT, false)
                 RoomCategoryFilter.ONLY_WITH_NOTIFICATIONS -> query.greaterThan(RoomSummaryEntityFields.NOTIFICATION_COUNT, 0)
                 RoomCategoryFilter.ALL                     -> Unit // nop
    +            null                                       -> Unit
             }
     
             // Timber.w("VAL: activeSpaceId : ${queryParams.activeSpaceId}")
    
    From 57bee40211bca7aa31be692307646c0e7e4ffa12 Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 15:18:58 +0100
    Subject: [PATCH 102/126] Fix compilation warning (exhaustive when)
    
    ---
     .../app/core/preference/PushRulePreference.kt |  1 +
     .../app/core/ui/views/KeysBackupBanner.kt     |  9 +++------
     .../core/ui/views/PresenceStateImageView.kt   |  1 +
     .../app/core/ui/views/ShieldImageView.kt      | 13 +++++++------
     .../app/features/call/CallControlsView.kt     |  1 +
     .../app/features/call/VectorCallActivity.kt   |  3 +--
     .../createdirect/CreateDirectRoomActivity.kt  |  2 ++
     ...eysBackupSettingsRecyclerViewController.kt |  1 +
     .../quads/SharedSecureStorageActivity.kt      |  3 ++-
     .../quads/SharedSecuredStorageKeyFragment.kt  |  1 +
     .../SharedSecuredStoragePassphraseFragment.kt |  1 +
     .../verification/VerificationBottomSheet.kt   |  1 +
     .../emoji/VerificationEmojiCodeViewModel.kt   |  1 +
     .../request/VerificationRequestController.kt  |  2 ++
     .../discovery/DiscoverySettingsController.kt  | 17 +++++++++++------
     .../app/features/home/HomeDetailViewModel.kt  |  1 +
     .../home/room/detail/TimelineFragment.kt      |  3 +++
     .../voice/VoiceMessageRecorderView.kt         |  7 ++++---
     .../home/room/detail/search/SearchFragment.kt |  2 ++
     .../ViewEditHistoryEpoxyController.kt         | 10 ++++++----
     .../detail/timeline/item/MessageVoiceItem.kt  |  7 ++++---
     .../reactions/ViewReactionsEpoxyController.kt | 10 ++++++----
     .../app/features/login/LoginFragment.kt       |  4 +++-
     .../login/LoginResetPasswordFragment.kt       |  3 +--
     ...inResetPasswordMailConfirmationFragment.kt |  5 ++---
     .../app/features/login/LoginViewModel.kt      |  1 +
     .../app/features/login2/LoginViewModel2.kt    |  2 +-
     .../features/matrixto/MatrixToBottomSheet.kt  | 11 +++++------
     .../matrixto/MatrixToBottomSheetViewModel.kt  | 13 +++++++------
     .../features/navigation/DefaultNavigator.kt   |  2 ++
     .../notifications/NotificationRenderer.kt     | 16 ++++++----------
     .../onboarding/OnboardingViewModel.kt         |  1 +
     .../ftueauth/FtueAuthLoginFragment.kt         |  5 ++---
     .../ftueauth/FtueAuthResetPasswordFragment.kt |  3 +--
     ...thResetPasswordMailConfirmationFragment.kt |  5 ++---
     .../roomdirectory/RoomDirectoryActivity.kt    |  9 +++++----
     .../picker/RoomDirectoryPickerController.kt   |  8 ++++----
     .../RoomMemberProfileFragment.kt              | 10 ++++++----
     .../roomprofile/alias/RoomAliasController.kt  |  7 ++++---
     .../uploads/files/RoomUploadsFilesFragment.kt |  2 ++
     .../uploads/media/RoomUploadsMediaFragment.kt |  2 ++
     .../devtools/AccountDataEpoxyController.kt    |  2 ++
     .../settings/locale/LocalePickerController.kt | 19 +++++++++++++++----
     .../threepids/ThreePidsSettingsController.kt  |  2 ++
     .../signout/soft/SoftLogoutController.kt      | 10 ++++++----
     .../app/features/spaces/SpaceListFragment.kt  |  9 ++++++---
     .../spaces/manage/SpaceManageActivity.kt      |  1 +
     .../app/features/terms/TermsController.kt     | 12 +++++++-----
     .../usercode/UserCodeSharedViewModel.kt       | 19 ++++++++++---------
     .../app/features/widgets/WidgetActivity.kt    |  1 +
     .../app/features/widgets/WidgetFragment.kt    |  9 +++++----
     .../RoomWidgetPermissionViewModel.kt          |  1 +
     52 files changed, 175 insertions(+), 116 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt b/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt
    index 1a7a79ed8c..78266cf5ee 100644
    --- a/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt
    +++ b/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt
    @@ -83,6 +83,7 @@ class PushRulePreference : VectorPreference {
                 NotificationIndex.NOISY  -> {
                     radioGroup?.check(R.id.bingPreferenceRadioBingRuleNoisy)
                 }
    +            null                     -> Unit
             }
     
             radioGroup?.setOnCheckedChangeListener { _, checkedId ->
    diff --git a/vector/src/main/java/im/vector/app/core/ui/views/KeysBackupBanner.kt b/vector/src/main/java/im/vector/app/core/ui/views/KeysBackupBanner.kt
    index 94c1ab6576..58a5666e94 100755
    --- a/vector/src/main/java/im/vector/app/core/ui/views/KeysBackupBanner.kt
    +++ b/vector/src/main/java/im/vector/app/core/ui/views/KeysBackupBanner.kt
    @@ -77,13 +77,10 @@ class KeysBackupBanner @JvmOverloads constructor(
     
         override fun onClick(v: View?) {
             when (state) {
    -            is State.Setup   -> {
    -                delegate?.setupKeysBackup()
    -            }
    +            is State.Setup   -> delegate?.setupKeysBackup()
                 is State.Update,
    -            is State.Recover -> {
    -                delegate?.recoverKeysBackup()
    -            }
    +            is State.Recover -> delegate?.recoverKeysBackup()
    +            else             -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/core/ui/views/PresenceStateImageView.kt b/vector/src/main/java/im/vector/app/core/ui/views/PresenceStateImageView.kt
    index 301f8afdc9..82675e8c11 100644
    --- a/vector/src/main/java/im/vector/app/core/ui/views/PresenceStateImageView.kt
    +++ b/vector/src/main/java/im/vector/app/core/ui/views/PresenceStateImageView.kt
    @@ -49,6 +49,7 @@ class PresenceStateImageView @JvmOverloads constructor(
                     setImageResource(R.drawable.ic_presence_offline)
                     contentDescription = context.getString(R.string.a11y_presence_offline)
                 }
    +            null                     -> Unit
             }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/core/ui/views/ShieldImageView.kt b/vector/src/main/java/im/vector/app/core/ui/views/ShieldImageView.kt
    index ac0b4408b2..713c177099 100644
    --- a/vector/src/main/java/im/vector/app/core/ui/views/ShieldImageView.kt
    +++ b/vector/src/main/java/im/vector/app/core/ui/views/ShieldImageView.kt
    @@ -40,21 +40,21 @@ class ShieldImageView @JvmOverloads constructor(
             isVisible = roomEncryptionTrustLevel != null
     
             when (roomEncryptionTrustLevel) {
    -            RoomEncryptionTrustLevel.Default -> {
    +            RoomEncryptionTrustLevel.Default                     -> {
                     contentDescription = context.getString(R.string.a11y_trust_level_default)
                     setImageResource(
                             if (borderLess) R.drawable.ic_shield_black_no_border
                             else R.drawable.ic_shield_black
                     )
                 }
    -            RoomEncryptionTrustLevel.Warning -> {
    +            RoomEncryptionTrustLevel.Warning                     -> {
                     contentDescription = context.getString(R.string.a11y_trust_level_warning)
                     setImageResource(
                             if (borderLess) R.drawable.ic_shield_warning_no_border
                             else R.drawable.ic_shield_warning
                     )
                 }
    -            RoomEncryptionTrustLevel.Trusted -> {
    +            RoomEncryptionTrustLevel.Trusted                     -> {
                     contentDescription = context.getString(R.string.a11y_trust_level_trusted)
                     setImageResource(
                             if (borderLess) R.drawable.ic_shield_trusted_no_border
    @@ -65,6 +65,7 @@ class ShieldImageView @JvmOverloads constructor(
                     contentDescription = context.getString(R.string.a11y_trust_level_trusted)
                     setImageResource(R.drawable.ic_warning_badge)
                 }
    +            null                                                 -> Unit
             }
         }
     }
    @@ -72,9 +73,9 @@ class ShieldImageView @JvmOverloads constructor(
     @DrawableRes
     fun RoomEncryptionTrustLevel.toDrawableRes(): Int {
         return when (this) {
    -        RoomEncryptionTrustLevel.Default -> R.drawable.ic_shield_black
    -        RoomEncryptionTrustLevel.Warning -> R.drawable.ic_shield_warning
    -        RoomEncryptionTrustLevel.Trusted -> R.drawable.ic_shield_trusted
    +        RoomEncryptionTrustLevel.Default                     -> R.drawable.ic_shield_black
    +        RoomEncryptionTrustLevel.Warning                     -> R.drawable.ic_shield_warning
    +        RoomEncryptionTrustLevel.Trusted                     -> R.drawable.ic_shield_trusted
             RoomEncryptionTrustLevel.E2EWithUnsupportedAlgorithm -> R.drawable.ic_warning_badge
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/call/CallControlsView.kt b/vector/src/main/java/im/vector/app/features/call/CallControlsView.kt
    index 8d30c4d5c5..b3fc36e5bc 100644
    --- a/vector/src/main/java/im/vector/app/features/call/CallControlsView.kt
    +++ b/vector/src/main/java/im/vector/app/features/call/CallControlsView.kt
    @@ -111,6 +111,7 @@ class CallControlsView @JvmOverloads constructor(
                     views.ringingControls.isVisible = false
                     views.connectedControls.isVisible = false
                 }
    +            null                      -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt
    index 23c7b79914..e9d16ee710 100644
    --- a/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallActivity.kt
    @@ -525,8 +525,7 @@ class VectorCallActivity : VectorBaseActivity(), CallContro
                     navigator.openCallTransfer(this, callTransferActivityResultLauncher, callId)
                 }
                 is VectorCallViewEvents.FailToTransfer         -> showSnackbar(getString(R.string.call_transfer_failure))
    -            null                                           -> {
    -            }
    +            else                                           -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
    index 9df4f52d0f..111b872a15 100644
    --- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
    @@ -28,6 +28,7 @@ import com.airbnb.mvrx.Async
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import com.airbnb.mvrx.viewModel
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import dagger.hilt.android.AndroidEntryPoint
    @@ -167,6 +168,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
     
         private fun renderCreateAndInviteState(state: Async) {
             when (state) {
    +            Uninitialized,
                 is Loading -> renderCreationLoading()
                 is Success -> renderCreationSuccess(state())
                 is Fail    -> renderCreationFailure(state.error)
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsRecyclerViewController.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsRecyclerViewController.kt
    index 577572ef14..3c922e6309 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsRecyclerViewController.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsRecyclerViewController.kt
    @@ -140,6 +140,7 @@ class KeysBackupSettingsRecyclerViewController @Inject constructor(
     
                     isBackupAlreadySetup = true
                 }
    +            null                                       -> Unit
             }
     
             if (isBackupAlreadySetup) {
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageActivity.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageActivity.kt
    index b317ac95ad..0a105064d5 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageActivity.kt
    @@ -116,12 +116,13 @@ class SharedSecureStorageActivity :
                 is SharedSecureStorageViewEvent.FinishSuccess        -> {
                     val dataResult = Intent()
                     dataResult.putExtra(EXTRA_DATA_RESULT, it.cypherResult)
    -                setResult(Activity.RESULT_OK, dataResult)
    +                setResult(RESULT_OK, dataResult)
                     finish()
                 }
                 is SharedSecureStorageViewEvent.ShowResetBottomSheet -> {
                     navigator.open4SSetup(this, SetupMode.HARD_RESET)
                 }
    +            else                                                 -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageKeyFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageKeyFragment.kt
    index 8e7f11f0f5..fd660367ae 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageKeyFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageKeyFragment.kt
    @@ -77,6 +77,7 @@ class SharedSecuredStorageKeyFragment @Inject constructor() : VectorBaseFragment
                     is SharedSecureStorageViewEvent.KeyInlineError -> {
                         views.ssssKeyEnterTil.error = it.message
                     }
    +                else                                           -> Unit
                 }
             }
     
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt
    index 70c1003773..41507f2722 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt
    @@ -86,6 +86,7 @@ class SharedSecuredStoragePassphraseFragment @Inject constructor(
                     is SharedSecureStorageViewEvent.InlineError -> {
                         views.ssssPassphraseEnterTil.error = it.message
                     }
    +                else                                        -> Unit
                 }
             }
     
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt
    index 65e3fbabba..8255e42d74 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheet.kt
    @@ -252,6 +252,7 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment Unit
                 }
     
                 return@withState
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeViewModel.kt
    index 6f213adb7e..aec28f898e 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/emoji/VerificationEmojiCodeViewModel.kt
    @@ -139,6 +139,7 @@ class VerificationEmojiCodeViewModel @AssistedInject constructor(
                         )
                     }
                 }
    +            else                                  -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestController.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestController.kt
    index 90997830a0..781677433b 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestController.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/request/VerificationRequestController.kt
    @@ -18,6 +18,7 @@ package im.vector.app.features.crypto.verification.request
     
     import androidx.core.text.toSpannable
     import com.airbnb.epoxy.EpoxyController
    +import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
     import com.airbnb.mvrx.Uninitialized
    @@ -153,6 +154,7 @@ class VerificationRequestController @Inject constructor(
                             }
                         }
                     }
    +                is Fail          -> Unit
                 }
             }
     
    diff --git a/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsController.kt b/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsController.kt
    index 551b72dd82..b338f367e3 100644
    --- a/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsController.kt
    +++ b/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsController.kt
    @@ -50,6 +50,7 @@ class DiscoverySettingsController @Inject constructor(
     
         override fun buildModels(data: DiscoverySettingsState) {
             when (data.identityServer) {
    +            Uninitialized,
                 is Loading -> {
                     loadingItem {
                         id("identityServerLoading")
    @@ -209,18 +210,19 @@ class DiscoverySettingsController @Inject constructor(
                 titleResId(R.string.settings_discovery_emails_title)
             }
             when (emails) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     loadingItem {
                         id("emailsLoading")
                     }
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     settingsInfoItem {
                         id("emailsError")
                         helperText(emails.error.message)
                     }
                 }
    -            is Success    -> {
    +            is Success -> {
                     if (emails().isEmpty()) {
                         settingsInfoItem {
                             id("emailsEmpty")
    @@ -277,18 +279,19 @@ class DiscoverySettingsController @Inject constructor(
             }
     
             when (msisdns) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     loadingItem {
                         id("msisdnLoading")
                     }
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     settingsInfoItem {
                         id("msisdnListError")
                         helperText(msisdns.error.message)
                     }
                 }
    -            is Success    -> {
    +            is Success -> {
                     if (msisdns().isEmpty()) {
                         settingsInfoItem {
                             id("no_msisdn")
    @@ -353,6 +356,7 @@ class DiscoverySettingsController @Inject constructor(
                 colorProvider(host.colorProvider)
                 stringProvider(host.stringProvider)
                 when (pidInfo.isShared) {
    +                Uninitialized,
                     is Loading -> {
                         buttonIndeterminate(true)
                     }
    @@ -384,6 +388,7 @@ class DiscoverySettingsController @Inject constructor(
                                 else          -> iconMode(IconMode.NONE)
                             }
                         }
    +                    null                            -> Unit
                     }
                 }
             }
    diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt
    index e812942996..01d91f3edc 100644
    --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt
    @@ -273,6 +273,7 @@ class HomeDetailViewModel @AssistedInject constructor(
                                     )
                                 }
                             }
    +                        null                                -> Unit
                         }
                     }
                     .launchIn(viewModelScope)
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    index f462128c6b..7137cbc4cf 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    @@ -1782,6 +1782,7 @@ class TimelineFragment @Inject constructor(
                             transactionId = data.transactionId,
                     ).show(parentFragmentManager, "REQ")
                 }
    +            else                                          -> Unit
             }
         }
     
    @@ -2236,6 +2237,8 @@ class TimelineFragment @Inject constructor(
                 is EventSharedAction.EndPoll                    -> {
                     askConfirmationToEndPoll(action.eventId)
                 }
    +            is EventSharedAction.ReportContent              -> Unit /* Not clickable */
    +            EventSharedAction.Separator                     -> Unit /* Not clickable */
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    index 9a643796a9..ba39f40daf 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    @@ -95,9 +95,10 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
                 override fun onDeleteVoiceMessage() = callback.onDeleteVoiceMessage()
                 override fun onWaveformClicked() {
                     when (lastKnownState) {
    -                    RecordingUiState.Draft  -> callback.onVoicePlaybackButtonClicked()
    +                    RecordingUiState.Draft     -> callback.onVoicePlaybackButtonClicked()
                         is RecordingUiState.Recording,
                         is RecordingUiState.Locked -> callback.onRecordingWaveformClicked()
    +                    else                       -> Unit
                     }
                 }
     
    @@ -119,7 +120,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
         fun render(recordingState: RecordingUiState) {
             if (lastKnownState == recordingState) return
             when (recordingState) {
    -            RecordingUiState.Idle      -> {
    +            RecordingUiState.Idle         -> {
                     reset()
                 }
                 is RecordingUiState.Recording -> {
    @@ -137,7 +138,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
                         voiceMessageViews.showRecordingLockedViews(recordingState)
                     }, 500)
                 }
    -            RecordingUiState.Draft   -> {
    +            RecordingUiState.Draft        -> {
                     stopRecordingTicker()
                     voiceMessageViews.showDraftViews()
                 }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchFragment.kt
    index 62c142238e..fbcf29d863 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchFragment.kt
    @@ -26,6 +26,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import com.airbnb.mvrx.args
     import com.airbnb.mvrx.fragmentViewModel
     import com.airbnb.mvrx.withState
    @@ -88,6 +89,7 @@ class SearchFragment @Inject constructor(
         override fun invalidate() = withState(searchViewModel) { state ->
             if (state.searchResult.isNullOrEmpty()) {
                 when (state.asyncSearchRequest) {
    +                Uninitialized,
                     is Loading -> {
                         views.stateView.state = StateView.State.Loading
                     }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryEpoxyController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryEpoxyController.kt
    index 1dad6cc4a7..9f05547300 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryEpoxyController.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryEpoxyController.kt
    @@ -18,8 +18,9 @@ package im.vector.app.features.home.room.detail.timeline.edithistory
     import android.text.Spannable
     import com.airbnb.epoxy.TypedEpoxyController
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Incomplete
    +import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import im.vector.app.R
     import im.vector.app.core.date.DateFormatKind
     import im.vector.app.core.date.VectorDateFormatter
    @@ -54,18 +55,19 @@ class ViewEditHistoryEpoxyController @Inject constructor(
         override fun buildModels(state: ViewEditHistoryViewState) {
             val host = this
             when (state.editList) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     genericLoaderItem {
                         id("Spinner")
                     }
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     genericFooterItem {
                         id("failure")
                         text(host.stringProvider.getString(R.string.unknown_error).toEpoxyCharSequence())
                     }
                 }
    -            is Success    -> {
    +            is Success -> {
                     state.editList()?.let { renderEvents(it, state.isOriginalAReply) }
                 }
             }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    index e9f728d976..98be75027e 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
    @@ -96,9 +96,10 @@ abstract class MessageVoiceItem : AbsMessageItem() {
             voiceMessagePlaybackTracker.track(attributes.informationData.eventId, object : VoiceMessagePlaybackTracker.Listener {
                 override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) {
                     when (state) {
    -                    is VoiceMessagePlaybackTracker.Listener.State.Idle    -> renderIdleState(holder)
    -                    is VoiceMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state)
    -                    is VoiceMessagePlaybackTracker.Listener.State.Paused  -> renderPausedState(holder, state)
    +                    is VoiceMessagePlaybackTracker.Listener.State.Idle      -> renderIdleState(holder)
    +                    is VoiceMessagePlaybackTracker.Listener.State.Playing   -> renderPlayingState(holder, state)
    +                    is VoiceMessagePlaybackTracker.Listener.State.Paused    -> renderPausedState(holder, state)
    +                    is VoiceMessagePlaybackTracker.Listener.State.Recording -> Unit
                     }
                 }
             })
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsEpoxyController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsEpoxyController.kt
    index 10af3792d5..86e5c529ee 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsEpoxyController.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/reactions/ViewReactionsEpoxyController.kt
    @@ -18,8 +18,9 @@ package im.vector.app.features.home.room.detail.timeline.reactions
     
     import com.airbnb.epoxy.TypedEpoxyController
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Incomplete
    +import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import im.vector.app.EmojiSpanify
     import im.vector.app.R
     import im.vector.app.core.resources.StringProvider
    @@ -41,18 +42,19 @@ class ViewReactionsEpoxyController @Inject constructor(
         override fun buildModels(state: DisplayReactionsViewState) {
             val host = this
             when (state.mapReactionKeyToMemberList) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     genericLoaderItem {
                         id("Spinner")
                     }
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     genericFooterItem {
                         id("failure")
                         text(host.stringProvider.getString(R.string.unknown_error).toEpoxyCharSequence())
                     }
                 }
    -            is Success    -> {
    +            is Success -> {
                     state.mapReactionKeyToMemberList()?.forEach { reactionInfo ->
                         reactionInfoSimpleItem {
                             id(reactionInfo.eventId)
    diff --git a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
    index da61d95997..61d32eadd8 100644
    --- a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
    @@ -29,6 +29,7 @@ import androidx.lifecycle.lifecycleScope
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import im.vector.app.R
     import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.hideKeyboard
    @@ -269,6 +270,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment {
                     // Ensure password is hidden
                     views.passwordField.hidePassword()
    @@ -300,7 +302,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment Unit
    +            else       -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt
    index d121245532..1d32944f9f 100644
    --- a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt
    @@ -23,7 +23,6 @@ import android.view.ViewGroup
     import androidx.lifecycle.lifecycleScope
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
    -import com.airbnb.mvrx.Success
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.hideKeyboard
    @@ -129,7 +128,7 @@ class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment {
                     views.resetPasswordEmailTil.error = errorFormatter.toHumanReadable(state.asyncResetPassword.error)
                 }
    -            is Success -> Unit
    +            else       -> Unit
             }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordMailConfirmationFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordMailConfirmationFragment.kt
    index 5f376700f8..232e7ab622 100644
    --- a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordMailConfirmationFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordMailConfirmationFragment.kt
    @@ -21,7 +21,6 @@ import android.view.LayoutInflater
     import android.view.View
     import android.view.ViewGroup
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Success
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.databinding.FragmentLoginResetPasswordMailConfirmationBinding
    @@ -59,7 +58,7 @@ class LoginResetPasswordMailConfirmationFragment @Inject constructor() : Abstrac
             setupUi(state)
     
             when (state.asyncResetMailConfirmed) {
    -            is Fail    -> {
    +            is Fail -> {
                     // Link in email not yet clicked ?
                     val message = if (state.asyncResetMailConfirmed.error.is401()) {
                         getString(R.string.auth_reset_password_error_unauthorized)
    @@ -73,7 +72,7 @@ class LoginResetPasswordMailConfirmationFragment @Inject constructor() : Abstrac
                             .setPositiveButton(R.string.ok, null)
                             .show()
                 }
    -            is Success -> Unit
    +            else    -> Unit
             }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt
    index bfa924c155..4eba31994b 100644
    --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt
    @@ -173,6 +173,7 @@ class LoginViewModel @AssistedInject constructor(
                                     .withAllowedFingerPrints(listOf(action.fingerprint))
                                     .build()
                     )
    +            else                            -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt
    index b73988126b..e2831e7d2d 100644
    --- a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt
    +++ b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt
    @@ -18,7 +18,6 @@ package im.vector.app.features.login2
     
     import android.content.Context
     import android.net.Uri
    -import androidx.lifecycle.viewModelScope
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.MavericksViewModelFactory
     import dagger.assisted.Assisted
    @@ -172,6 +171,7 @@ class LoginViewModel2 @AssistedInject constructor(
                     handleSetUserPassword(finalLastAction)
                 is LoginAction2.LoginWith        ->
                     handleLoginWith(finalLastAction)
    +            else                             -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt
    index 63e0398fc1..61dcd48779 100644
    --- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt
    +++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt
    @@ -65,18 +65,17 @@ class MatrixToBottomSheet :
         override fun invalidate() = withState(viewModel) { state ->
             super.invalidate()
             when (state.linkType) {
    -            is PermalinkData.RoomLink     -> {
    +            is PermalinkData.RoomLink            -> {
                     views.matrixToCardContentLoading.isVisible = state.roomPeekResult is Incomplete
                     showFragment(MatrixToRoomSpaceFragment::class, Bundle())
                 }
    -            is PermalinkData.UserLink     -> {
    +            is PermalinkData.UserLink            -> {
                     views.matrixToCardContentLoading.isVisible = state.matrixItem is Incomplete
                     showFragment(MatrixToUserFragment::class, Bundle())
                 }
    -            is PermalinkData.GroupLink    -> {
    -            }
    -            is PermalinkData.FallbackLink -> {
    -            }
    +            is PermalinkData.GroupLink           -> Unit
    +            is PermalinkData.FallbackLink        -> Unit
    +            is PermalinkData.RoomEmailInviteLink -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
    index e741f6fb39..76391c6dec 100644
    --- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
    @@ -49,8 +49,8 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor(
             private val session: Session,
             private val stringProvider: StringProvider,
             private val directRoomHelper: DirectRoomHelper,
    -        private val errorFormatter: ErrorFormatter) :
    -    VectorViewModel(initialState) {
    +        private val errorFormatter: ErrorFormatter
    +) : VectorViewModel(initialState) {
     
         @AssistedFactory
         interface Factory : MavericksAssistedViewModelFactory {
    @@ -61,22 +61,23 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor(
     
         init {
             when (initialState.linkType) {
    -            is PermalinkData.RoomLink     -> {
    +            is PermalinkData.RoomLink            -> {
                     setState {
                         copy(roomPeekResult = Loading())
                     }
                 }
    -            is PermalinkData.UserLink     -> {
    +            is PermalinkData.UserLink            -> {
                     setState {
                         copy(matrixItem = Loading())
                     }
                 }
    -            is PermalinkData.GroupLink    -> {
    +            is PermalinkData.GroupLink           -> {
                     // Not yet supported
                 }
    -            is PermalinkData.FallbackLink -> {
    +            is PermalinkData.FallbackLink        -> {
                     // Not yet supported
                 }
    +            is PermalinkData.RoomEmailInviteLink -> Unit
             }
             viewModelScope.launch(Dispatchers.IO) {
                 resolveLink(initialState)
    diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
    index cc02687d93..4c3ce80339 100644
    --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
    +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
    @@ -320,6 +320,7 @@ class DefaultNavigator @Inject constructor(
                         }
                     }
                 }
    +            null                                -> Unit
             }
         }
     
    @@ -376,6 +377,7 @@ class DefaultNavigator @Inject constructor(
                         context.startActivity(intent)
                     }
                 }
    +            null                                -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationRenderer.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationRenderer.kt
    index 4078bb0b5c..e0e21a39a7 100644
    --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationRenderer.kt
    +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationRenderer.kt
    @@ -47,11 +47,9 @@ class NotificationRenderer @Inject constructor(private val notificationDisplayer
                 )
     
                 // Remove summary first to avoid briefly displaying it after dismissing the last notification
    -            when (summaryNotification) {
    -                SummaryNotification.Removed -> {
    -                    Timber.d("Removing summary notification")
    -                    notificationDisplayer.cancelNotificationMessage(null, SUMMARY_NOTIFICATION_ID)
    -                }
    +            if (summaryNotification == SummaryNotification.Removed) {
    +                Timber.d("Removing summary notification")
    +                notificationDisplayer.cancelNotificationMessage(null, SUMMARY_NOTIFICATION_ID)
                 }
     
                 roomNotifications.forEach { wrapper ->
    @@ -94,11 +92,9 @@ class NotificationRenderer @Inject constructor(private val notificationDisplayer
                 }
     
                 // Update summary last to avoid briefly displaying it before other notifications
    -            when (summaryNotification) {
    -                is SummaryNotification.Update -> {
    -                    Timber.d("Updating summary notification")
    -                    notificationDisplayer.showNotificationMessage(null, SUMMARY_NOTIFICATION_ID, summaryNotification.notification)
    -                }
    +            if (summaryNotification is SummaryNotification.Update) {
    +                Timber.d("Updating summary notification")
    +                notificationDisplayer.showNotificationMessage(null, SUMMARY_NOTIFICATION_ID, summaryNotification.notification)
                 }
             }
         }
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    index 6659058b4e..856b2ab567 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    @@ -222,6 +222,7 @@ class OnboardingViewModel @AssistedInject constructor(
                                     .withAllowedFingerPrints(listOf(action.fingerprint))
                                     .build()
                     )
    +            else                                 -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    index 5f15d9a35d..632625f4de 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    @@ -28,7 +28,6 @@ import androidx.core.view.isVisible
     import androidx.lifecycle.lifecycleScope
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
    -import com.airbnb.mvrx.Success
     import im.vector.app.R
     import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.hideKeyboard
    @@ -299,7 +298,7 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
                     }
                 }
                 // Success is handled by the LoginActivity
    -            is Success -> Unit
    +            else       -> Unit
             }
     
             when (state.asyncRegistration) {
    @@ -308,7 +307,7 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
                     views.passwordField.hidePassword()
                 }
                 // Success is handled by the LoginActivity
    -            is Success -> Unit
    +            else       -> Unit
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    index 6a224dfae8..073801c920 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    @@ -23,7 +23,6 @@ import android.view.ViewGroup
     import androidx.lifecycle.lifecycleScope
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
    -import com.airbnb.mvrx.Success
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.hideKeyboard
    @@ -125,7 +124,7 @@ class FtueAuthResetPasswordFragment @Inject constructor() : AbstractFtueAuthFrag
                 is Fail    -> {
                     views.resetPasswordEmailTil.error = errorFormatter.toHumanReadable(state.asyncResetPassword.error)
                 }
    -            is Success -> Unit
    +            else       -> Unit
             }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    index 1d5e1aa00a..f8b3266d37 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    @@ -21,7 +21,6 @@ import android.view.LayoutInflater
     import android.view.View
     import android.view.ViewGroup
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Success
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.databinding.FragmentLoginResetPasswordMailConfirmationBinding
    @@ -61,7 +60,7 @@ class FtueAuthResetPasswordMailConfirmationFragment @Inject constructor() : Abst
             setupUi(state)
     
             when (state.asyncResetMailConfirmed) {
    -            is Fail    -> {
    +            is Fail -> {
                     // Link in email not yet clicked ?
                     val message = if (state.asyncResetMailConfirmed.error.is401()) {
                         getString(R.string.auth_reset_password_error_unauthorized)
    @@ -75,7 +74,7 @@ class FtueAuthResetPasswordMailConfirmationFragment @Inject constructor() : Abst
                             .setPositiveButton(R.string.ok, null)
                             .show()
                 }
    -            is Success -> Unit
    +            else    -> Unit
             }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryActivity.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryActivity.kt
    index 48da9f4fa0..f0df31342e 100644
    --- a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryActivity.kt
    @@ -62,8 +62,8 @@ class RoomDirectoryActivity : VectorBaseActivity(), Matri
                     .stream()
                     .onEach { sharedAction ->
                         when (sharedAction) {
    -                        is RoomDirectorySharedAction.Back           -> popBackstack()
    -                        is RoomDirectorySharedAction.CreateRoom     -> {
    +                        is RoomDirectorySharedAction.Back              -> popBackstack()
    +                        is RoomDirectorySharedAction.CreateRoom        -> {
                                 // Transmit the filter to the CreateRoomFragment
                                 withState(roomDirectoryViewModel) {
                                     addFragmentToBackstack(
    @@ -73,9 +73,10 @@ class RoomDirectoryActivity : VectorBaseActivity(), Matri
                                     )
                                 }
                             }
    -                        is RoomDirectorySharedAction.ChangeProtocol ->
    +                        is RoomDirectorySharedAction.ChangeProtocol    ->
                                 addFragmentToBackstack(views.simpleFragmentContainer, RoomDirectoryPickerFragment::class.java)
    -                        is RoomDirectorySharedAction.Close          -> finish()
    +                        is RoomDirectorySharedAction.Close             -> finish()
    +                        is RoomDirectorySharedAction.CreateRoomSuccess -> Unit
                         }
                     }
                     .launchIn(lifecycleScope)
    diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerController.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerController.kt
    index 08e044630d..7d121d1ff4 100644
    --- a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerController.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerController.kt
    @@ -22,7 +22,6 @@ import android.view.inputmethod.EditorInfo
     import android.widget.TextView
     import com.airbnb.epoxy.TypedEpoxyController
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Incomplete
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
     import com.airbnb.mvrx.Uninitialized
    @@ -60,7 +59,7 @@ class RoomDirectoryPickerController @Inject constructor(
             val host = this
     
             when (val asyncThirdPartyProtocol = data.asyncThirdPartyRequest) {
    -            is Success    -> {
    +            is Success -> {
                     data.directories.join(
                             each = { _, roomDirectoryServer -> buildDirectory(roomDirectoryServer) },
                             between = { idx, _ -> buildDivider(idx) }
    @@ -71,12 +70,13 @@ class RoomDirectoryPickerController @Inject constructor(
                         heightInPx(host.dimensionConverter.dpToPx(16))
                     }
                 }
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     loadingItem {
                         id("loading")
                     }
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     errorWithRetryItem {
                         id("error")
                         text(host.errorFormatter.toHumanReadable(asyncThirdPartyProtocol.error))
    diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
    index 7e919fb663..44e7405ee5 100644
    --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
    @@ -25,8 +25,9 @@ import android.view.View
     import android.view.ViewGroup
     import androidx.core.view.isVisible
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Incomplete
    +import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import com.airbnb.mvrx.args
     import com.airbnb.mvrx.fragmentViewModel
     import com.airbnb.mvrx.withState
    @@ -198,18 +199,19 @@ class RoomMemberProfileFragment @Inject constructor(
     
         override fun invalidate() = withState(viewModel) { state ->
             when (val asyncUserMatrixItem = state.userMatrixItem) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     views.matrixProfileToolbarTitleView.text = state.userId
                     avatarRenderer.render(MatrixItem.UserItem(state.userId, null, null), views.matrixProfileToolbarAvatarImageView)
                     headerViews.memberProfileStateView.state = StateView.State.Loading
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     avatarRenderer.render(MatrixItem.UserItem(state.userId, null, null), views.matrixProfileToolbarAvatarImageView)
                     views.matrixProfileToolbarTitleView.text = state.userId
                     val failureMessage = errorFormatter.toHumanReadable(asyncUserMatrixItem.error)
                     headerViews.memberProfileStateView.state = StateView.State.Error(failureMessage)
                 }
    -            is Success    -> {
    +            is Success -> {
                     val userMatrixItem = asyncUserMatrixItem()
                     headerViews.memberProfileStateView.state = StateView.State.Content
                     headerViews.memberProfileIdView.text = userMatrixItem.id
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt
    index 03e6ab9984..fcf6bc3a47 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasController.kt
    @@ -199,12 +199,13 @@ class RoomAliasController @Inject constructor(
             }
     
             when (val localAliases = data.localAliases) {
    -            is Uninitialized -> {
    +            Uninitialized,
    +            is Loading -> {
                     loadingItem {
                         id("loadingAliases")
                     }
                 }
    -            is Success       -> {
    +            is Success -> {
                     if (localAliases().isEmpty()) {
                         settingsInfoItem {
                             id("locEmpty")
    @@ -220,7 +221,7 @@ class RoomAliasController @Inject constructor(
                         }
                     }
                 }
    -            is Fail          -> {
    +            is Fail    -> {
                     errorWithRetryItem {
                         id("alt_error")
                         text(host.errorFormatter.toHumanReadable(localAliases.error))
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/files/RoomUploadsFilesFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/files/RoomUploadsFilesFragment.kt
    index 1739378761..953838aecd 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/files/RoomUploadsFilesFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/files/RoomUploadsFilesFragment.kt
    @@ -24,6 +24,7 @@ import androidx.core.content.ContextCompat
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import com.airbnb.mvrx.parentFragmentViewModel
     import com.airbnb.mvrx.withState
     import im.vector.app.R
    @@ -91,6 +92,7 @@ class RoomUploadsFilesFragment @Inject constructor(
         override fun invalidate() = withState(uploadsViewModel) { state ->
             if (state.fileEvents.isEmpty()) {
                 when (state.asyncEventsRequest) {
    +                Uninitialized,
                     is Loading -> {
                         views.genericStateViewListStateView.state = StateView.State.Loading
                     }
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/RoomUploadsMediaFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/RoomUploadsMediaFragment.kt
    index eb4337cffa..2f33f8403c 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/RoomUploadsMediaFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/media/RoomUploadsMediaFragment.kt
    @@ -29,6 +29,7 @@ import androidx.recyclerview.widget.GridLayoutManager
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import com.airbnb.mvrx.parentFragmentViewModel
     import com.airbnb.mvrx.withState
     import com.google.android.material.appbar.AppBarLayout
    @@ -188,6 +189,7 @@ class RoomUploadsMediaFragment @Inject constructor(
         override fun invalidate() = withState(uploadsViewModel) { state ->
             if (state.mediaEvents.isEmpty()) {
                 when (state.asyncEventsRequest) {
    +                Uninitialized,
                     is Loading -> {
                         views.genericStateViewListStateView.state = StateView.State.Loading
                     }
    diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt
    index f3ae18a72f..4748aeb45e 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt
    @@ -21,6 +21,7 @@ import com.airbnb.epoxy.TypedEpoxyController
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import im.vector.app.R
     import im.vector.app.core.epoxy.loadingItem
     import im.vector.app.core.resources.StringProvider
    @@ -45,6 +46,7 @@ class AccountDataEpoxyController @Inject constructor(
             if (data == null) return
             val host = this
             when (data.accountData) {
    +            Uninitialized,
                 is Loading -> {
                     loadingItem {
                         id("loading")
    diff --git a/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerController.kt b/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerController.kt
    index 4e1c62a4ec..cffef0da7b 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerController.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerController.kt
    @@ -17,12 +17,16 @@
     package im.vector.app.features.settings.locale
     
     import com.airbnb.epoxy.TypedEpoxyController
    -import com.airbnb.mvrx.Incomplete
    +import com.airbnb.mvrx.Fail
    +import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import im.vector.app.R
    +import im.vector.app.core.epoxy.errorWithRetryItem
     import im.vector.app.core.epoxy.loadingItem
     import im.vector.app.core.epoxy.noResultItem
     import im.vector.app.core.epoxy.profiles.profileSectionItem
    +import im.vector.app.core.error.ErrorFormatter
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.core.utils.safeCapitalize
     import im.vector.app.features.settings.VectorLocale
    @@ -32,7 +36,8 @@ import javax.inject.Inject
     
     class LocalePickerController @Inject constructor(
             private val vectorPreferences: VectorPreferences,
    -        private val stringProvider: StringProvider
    +        private val stringProvider: StringProvider,
    +        private val errorFormatter: ErrorFormatter
     ) : TypedEpoxyController() {
     
         var listener: Listener? = null
    @@ -58,13 +63,14 @@ class LocalePickerController @Inject constructor(
                 title(host.stringProvider.getString(R.string.choose_locale_other_locales_title))
             }
             when (list) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     loadingItem {
                         id("loading")
                         loadingText(host.stringProvider.getString(R.string.choose_locale_loading_locales))
                     }
                 }
    -            is Success    ->
    +            is Success ->
                     if (list().isEmpty()) {
                         noResultItem {
                             id("noResult")
    @@ -84,6 +90,11 @@ class LocalePickerController @Inject constructor(
                                     }
                                 }
                     }
    +            is Fail    ->
    +                errorWithRetryItem {
    +                    id("error")
    +                    text(host.errorFormatter.toHumanReadable(list.error))
    +                }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsController.kt b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsController.kt
    index d374357396..7fd2292274 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsController.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsController.kt
    @@ -21,6 +21,7 @@ import com.airbnb.epoxy.TypedEpoxyController
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import im.vector.app.R
     import im.vector.app.core.epoxy.loadingItem
     import im.vector.app.core.epoxy.noResultItem
    @@ -78,6 +79,7 @@ class ThreePidsSettingsController @Inject constructor(
             }
     
             when (data.threePids) {
    +            Uninitialized,
                 is Loading -> {
                     loadingItem {
                         id("loading")
    diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
    index 0cd9cde547..e2f3c14e7d 100644
    --- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
    +++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutController.kt
    @@ -18,8 +18,9 @@ package im.vector.app.features.signout.soft
     
     import com.airbnb.epoxy.EpoxyController
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Incomplete
    +import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import im.vector.app.R
     import im.vector.app.core.epoxy.loadingItem
     import im.vector.app.core.error.ErrorFormatter
    @@ -89,19 +90,20 @@ class SoftLogoutController @Inject constructor(
         private fun buildForm(state: SoftLogoutViewState) {
             val host = this
             when (state.asyncHomeServerLoginFlowRequest) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     loadingItem {
                         id("loading")
                     }
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     loginErrorWithRetryItem {
                         id("errorRetry")
                         text(host.errorFormatter.toHumanReadable(state.asyncHomeServerLoginFlowRequest.error))
                         listener { host.listener?.retry() }
                     }
                 }
    -            is Success    -> {
    +            is Success -> {
                     when (state.asyncHomeServerLoginFlowRequest.invoke()) {
                         LoginMode.Password          -> {
                             loginPasswordFormItem {
    diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt
    index dff98722eb..fb7786e3bd 100644
    --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt
    @@ -22,8 +22,9 @@ import android.view.LayoutInflater
     import android.view.View
     import android.view.ViewGroup
     import com.airbnb.epoxy.EpoxyTouchHelper
    -import com.airbnb.mvrx.Incomplete
    +import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import com.airbnb.mvrx.fragmentViewModel
     import com.airbnb.mvrx.withState
     import im.vector.app.core.extensions.cleanup
    @@ -121,8 +122,10 @@ class SpaceListFragment @Inject constructor(
     
         override fun invalidate() = withState(viewModel) { state ->
             when (state.asyncSpaces) {
    -            is Incomplete -> views.stateView.state = StateView.State.Loading
    -            is Success    -> views.stateView.state = StateView.State.Content
    +            Uninitialized,
    +            is Loading -> views.stateView.state = StateView.State.Loading
    +            is Success -> views.stateView.state = StateView.State.Content
    +            else       -> Unit
             }
             spaceController.update(state)
         }
    diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageActivity.kt
    index 85f80960b0..12ae8fc1f9 100644
    --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageActivity.kt
    @@ -85,6 +85,7 @@ class SpaceManageActivity : VectorBaseActivity() {
                         when (sharedAction) {
                             is RoomDirectorySharedAction.Back,
                             is RoomDirectorySharedAction.Close -> finish()
    +                        else                               -> Unit
                         }
                     }
                     .launchIn(lifecycleScope)
    diff --git a/vector/src/main/java/im/vector/app/features/terms/TermsController.kt b/vector/src/main/java/im/vector/app/features/terms/TermsController.kt
    index 6109e9abc8..10238829b3 100644
    --- a/vector/src/main/java/im/vector/app/features/terms/TermsController.kt
    +++ b/vector/src/main/java/im/vector/app/features/terms/TermsController.kt
    @@ -17,8 +17,9 @@ package im.vector.app.features.terms
     
     import com.airbnb.epoxy.TypedEpoxyController
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Incomplete
    +import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
    +import com.airbnb.mvrx.Uninitialized
     import im.vector.app.R
     import im.vector.app.core.epoxy.errorWithRetryItem
     import im.vector.app.core.epoxy.loadingItem
    @@ -38,19 +39,20 @@ class TermsController @Inject constructor(
             val host = this
     
             when (data.termsList) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     loadingItem {
                         id("loading")
                     }
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     errorWithRetryItem {
                         id("errorRetry")
                         text(host.errorFormatter.toHumanReadable(data.termsList.error))
                         listener { host.listener?.retry() }
                     }
                 }
    -            is Success    -> buildTerms(data.termsList.invoke())
    +            is Success -> buildTerms(data.termsList.invoke())
             }
         }
     
    @@ -67,7 +69,7 @@ class TermsController @Inject constructor(
                     description(host.description)
                     checked(term.accepted)
     
    -                clickListener  { host.listener?.review(term) }
    +                clickListener { host.listener?.review(term) }
                     checkChangeListener { _, isChecked ->
                         host.listener?.setChecked(term, isChecked)
                     }
    diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt
    index 64bcf9cead..da894a42be 100644
    --- a/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt
    @@ -62,12 +62,12 @@ class UserCodeSharedViewModel @AssistedInject constructor(
     
         override fun handle(action: UserCodeActions) {
             when (action) {
    -            UserCodeActions.DismissAction -> _viewEvents.post(UserCodeShareViewEvents.Dismiss)
    -            is UserCodeActions.SwitchMode -> setState { copy(mode = action.mode) }
    -            is UserCodeActions.DecodedQRCode -> handleQrCodeDecoded(action)
    -            is UserCodeActions.StartChattingWithUser -> handleStartChatting(action)
    +            UserCodeActions.DismissAction                 -> _viewEvents.post(UserCodeShareViewEvents.Dismiss)
    +            is UserCodeActions.SwitchMode                 -> setState { copy(mode = action.mode) }
    +            is UserCodeActions.DecodedQRCode              -> handleQrCodeDecoded(action)
    +            is UserCodeActions.StartChattingWithUser      -> handleStartChatting(action)
                 is UserCodeActions.CameraPermissionNotGranted -> _viewEvents.post(UserCodeShareViewEvents.CameraPermissionNotGranted(action.deniedPermanently))
    -            UserCodeActions.ShareByText -> handleShareByText()
    +            UserCodeActions.ShareByText                   -> handleShareByText()
             }
         }
     
    @@ -110,11 +110,11 @@ class UserCodeSharedViewModel @AssistedInject constructor(
             _viewEvents.post(UserCodeShareViewEvents.ShowWaitingScreen)
             viewModelScope.launch(Dispatchers.IO) {
                 when (linkedId) {
    -                is PermalinkData.RoomLink -> {
    +                is PermalinkData.RoomLink            -> {
                         // not yet supported
                         _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented)))
                     }
    -                is PermalinkData.UserLink -> {
    +                is PermalinkData.UserLink            -> {
                         val user = tryOrNull { session.resolveUser(linkedId.userId) }
                         // Create raw Uxid in case the user is not searchable
                                 ?: User(linkedId.userId, null, null)
    @@ -125,14 +125,15 @@ class UserCodeSharedViewModel @AssistedInject constructor(
                             )
                         }
                     }
    -                is PermalinkData.GroupLink -> {
    +                is PermalinkData.GroupLink           -> {
                         // not yet supported
                         _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented)))
                     }
    -                is PermalinkData.FallbackLink -> {
    +                is PermalinkData.FallbackLink        -> {
                         // not yet supported
                         _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented)))
                     }
    +                is PermalinkData.RoomEmailInviteLink -> Unit
                 }
                 _viewEvents.post(UserCodeShareViewEvents.HideWaitingScreen)
             }
    diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt
    index 963bd9521c..77ec4c5b06 100644
    --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetActivity.kt
    @@ -80,6 +80,7 @@ class WidgetActivity : VectorBaseActivity() {
             viewModel.observeViewEvents {
                 when (it) {
                     is WidgetViewEvents.Close -> handleClose(it)
    +                else                      -> Unit
                 }
             }
     
    diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt
    index 8fa9e07848..dbd63186b6 100644
    --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt
    @@ -29,7 +29,6 @@ import android.view.ViewGroup
     import androidx.core.view.isInvisible
     import androidx.core.view.isVisible
     import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Incomplete
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
     import com.airbnb.mvrx.Uninitialized
    @@ -87,6 +86,7 @@ class WidgetFragment @Inject constructor() :
                     is WidgetViewEvents.OnURLFormatted            -> loadFormattedUrl(it)
                     is WidgetViewEvents.DisplayIntegrationManager -> displayIntegrationManager(it)
                     is WidgetViewEvents.Failure                   -> displayErrorDialog(it.throwable)
    +                is WidgetViewEvents.Close                     -> Unit
                 }
             }
             viewModel.handle(WidgetAction.LoadFormattedUrl)
    @@ -192,13 +192,14 @@ class WidgetFragment @Inject constructor() :
         override fun invalidate() = withState(viewModel) { state ->
             Timber.v("Invalidate state: $state")
             when (state.formattedURL) {
    -            is Incomplete -> {
    +            Uninitialized,
    +            is Loading -> {
                     setStateError(null)
                     views.widgetWebView.isInvisible = true
                     views.widgetProgressBar.isIndeterminate = true
                     views.widgetProgressBar.isVisible = true
                 }
    -            is Success    -> {
    +            is Success -> {
                     setStateError(null)
                     when (state.webviewLoadedUrl) {
                         Uninitialized -> {
    @@ -221,7 +222,7 @@ class WidgetFragment @Inject constructor() :
                         }
                     }
                 }
    -            is Fail       -> {
    +            is Fail    -> {
                     // we need to show Error
                     views.widgetWebView.isInvisible = true
                     views.widgetProgressBar.isVisible = false
    diff --git a/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt b/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt
    index f29e6d1928..78871da324 100644
    --- a/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/widgets/permissions/RoomWidgetPermissionViewModel.kt
    @@ -93,6 +93,7 @@ class RoomWidgetPermissionViewModel @AssistedInject constructor(@Assisted val in
             when (action) {
                 RoomWidgetPermissionActions.AllowWidget -> handleAllowWidget()
                 RoomWidgetPermissionActions.BlockWidget -> handleRevokeWidget()
    +            RoomWidgetPermissionActions.DoClose     -> Unit
             }
         }
     
    
    From 97bb5a9abbd5d2a0f4f17d3892b02538cc8fea5d Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 15:45:02 +0100
    Subject: [PATCH 103/126] Also upgrade the coroutine lib
    
    ---
     dependencies.gradle | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/dependencies.gradle b/dependencies.gradle
    index c0b9726f0f..7666a3bf9f 100644
    --- a/dependencies.gradle
    +++ b/dependencies.gradle
    @@ -10,7 +10,7 @@ ext.versions = [
     def gradle = "7.0.4"
     // Ref: https://kotlinlang.org/releases.html
     def kotlin = "1.6.0"
    -def kotlinCoroutines = "1.5.2"
    +def kotlinCoroutines = "1.6.0"
     def dagger = "2.40.5"
     def retrofit = "2.9.0"
     def arrow = "0.8.2"
    
    From 03fee2a131a402baf2579adf3441df1880c86c38 Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 15:56:06 +0100
    Subject: [PATCH 104/126] The `.exhaustive` trick is not needed anymore in
     Kotlin 1.6.0
     https://kotlinlang.org/docs/whatsnew16.html#stable-exhaustive-when-statements-for-enum-sealed-and-boolean-subjects
    
    ---
     .../DefaultQrCodeVerificationTransaction.kt   |  5 ++---
     .../android/sdk/internal/util/Exhaustive.kt   | 20 -------------------
     .../root/src/app_package/ViewModel.kt.ftl     |  3 +--
     .../analytics/DebugAnalyticsViewModel.kt      |  3 +--
     .../settings/DebugPrivateSettingsViewModel.kt |  3 +--
     .../vector/app/core/extensions/Exhaustive.kt  | 20 -------------------
     .../app/core/platform/VectorBaseActivity.kt   |  3 +--
     .../app/core/ui/views/NotificationAreaView.kt |  3 +--
     .../ui/consent/AnalyticsConsentViewModel.kt   |  3 +--
     .../ui/consent/AnalyticsOptInActivity.kt      |  3 +--
     .../preview/AttachmentsPreviewViewModel.kt    |  3 +--
     .../app/features/call/VectorCallViewModel.kt  |  5 ++---
     .../call/conference/JitsiCallViewModel.kt     |  3 +--
     .../call/conference/VectorJitsiActivity.kt    |  3 +--
     .../call/transfer/CallTransferActivity.kt     |  3 +--
     .../contactsbook/ContactsBookFragment.kt      |  3 +--
     .../contactsbook/ContactsBookViewModel.kt     |  3 +--
     .../createdirect/CreateDirectRoomActivity.kt  |  7 +++----
     .../createdirect/CreateDirectRoomViewModel.kt |  5 ++---
     .../quads/SharedSecureStorageViewModel.kt     |  3 +--
     .../crypto/recover/BootstrapBottomSheet.kt    |  3 +--
     .../recover/BootstrapSharedViewModel.kt       |  9 ++++-----
     .../verification/VerificationBottomSheet.kt   |  3 +--
     .../VerificationBottomSheetViewModel.kt       |  3 +--
     .../features/devtools/RoomDevToolActivity.kt  |  3 +--
     .../discovery/DiscoverySettingsFragment.kt    |  5 ++---
     .../discovery/DiscoverySettingsViewModel.kt   |  5 ++---
     .../SettingsTextButtonSingleLineItem.kt       |  5 ++---
     .../change/SetIdentityServerFragment.kt       |  3 +--
     .../change/SetIdentityServerViewModel.kt      |  3 +--
     .../vector/app/features/home/HomeActivity.kt  |  8 ++++----
     .../features/home/HomeActivityViewModel.kt    |  3 +--
     .../home/room/detail/TimelineFragment.kt      | 13 ++++++------
     .../home/room/detail/TimelineViewModel.kt     |  3 +--
     .../composer/MessageComposerViewModel.kt      |  5 ++---
     .../voice/VoiceMessageRecorderView.kt         |  3 +--
     .../room/detail/search/SearchViewModel.kt     |  3 +--
     .../helper/ContentUploadStateTrackerBinder.kt |  3 +--
     .../detail/timeline/item/PollOptionView.kt    |  3 +--
     .../timeline/item/VerificationRequestItem.kt  |  3 +--
     .../home/room/list/RoomListFragment.kt        |  5 ++---
     .../home/room/list/RoomListViewModel.kt       |  3 +--
     .../location/LocationSharingFragment.kt       |  3 +--
     .../location/LocationSharingViewModel.kt      |  3 +--
     .../features/login/AbstractLoginFragment.kt   |  3 +--
     .../app/features/login/LoginActivity.kt       |  7 +++----
     .../app/features/login/LoginFragment.kt       |  5 ++---
     .../app/features/login/LoginViewModel.kt      |  9 ++++-----
     .../features/login2/AbstractLoginFragment2.kt |  3 +--
     .../app/features/login2/LoginViewModel2.kt    |  9 ++++-----
     .../matrixto/MatrixToBottomSheetViewModel.kt  |  3 +--
     .../app/features/onboarding/Login2Variant.kt  |  3 +--
     .../onboarding/OnboardingViewModel.kt         |  9 ++++-----
     .../ftueauth/AbstractFtueAuthFragment.kt      |  3 +--
     .../ftueauth/FtueAuthLoginFragment.kt         |  5 ++---
     .../onboarding/ftueauth/FtueAuthVariant.kt    |  5 ++---
     .../poll/create/CreatePollFragment.kt         |  3 +--
     .../features/qrcode/QrCodeScannerActivity.kt  |  3 +--
     .../room/RequireActiveMembershipViewModel.kt  |  3 +--
     .../roomdirectory/PublicRoomsFragment.kt      |  3 +--
     .../createroom/CreateRoomFragment.kt          |  3 +--
     .../createroom/CreateRoomViewModel.kt         |  5 ++---
     .../picker/RoomDirectoryPickerViewModel.kt    |  3 +--
     .../roompreview/RoomPreviewViewModel.kt       |  3 +--
     .../RoomMemberProfileFragment.kt              |  3 +--
     .../RoomMemberProfileViewModel.kt             |  3 +--
     .../devices/DeviceListBottomSheet.kt          |  3 +--
     .../devices/DeviceListBottomSheetViewModel.kt |  3 +--
     .../roomprofile/RoomProfileActivity.kt        |  3 +--
     .../roomprofile/RoomProfileFragment.kt        |  3 +--
     .../roomprofile/RoomProfileViewModel.kt       |  3 +--
     .../roomprofile/alias/RoomAliasFragment.kt    |  3 +--
     .../roomprofile/alias/RoomAliasViewModel.kt   |  3 +--
     .../banned/RoomBannedMemberListViewModel.kt   |  3 +--
     .../members/RoomMemberListViewModel.kt        |  3 +--
     .../permissions/RoomPermissionsFragment.kt    |  3 +--
     .../permissions/RoomPermissionsViewModel.kt   |  3 +--
     .../settings/RoomSettingsFragment.kt          |  3 +--
     .../settings/RoomSettingsViewModel.kt         |  3 +--
     .../RoomJoinRuleChooseRestrictedViewModel.kt  |  3 +--
     .../uploads/RoomUploadsFragment.kt            |  3 +--
     .../uploads/RoomUploadsViewModel.kt           |  3 +--
     .../deactivation/DeactivateAccountFragment.kt |  3 +--
     .../DeactivateAccountViewModel.kt             |  3 +--
     .../CrossSigningSettingsFragment.kt           |  3 +--
     .../CrossSigningSettingsViewModel.kt          |  3 +--
     .../devices/VectorSettingsDevicesFragment.kt  |  3 +--
     .../settings/devtools/AccountDataViewModel.kt |  3 +--
     .../settings/devtools/KeyRequestViewModel.kt  |  3 +--
     .../settings/devtools/KeyRequestsFragment.kt  |  3 +--
     .../VectorSettingsIgnoredUsersFragment.kt     |  3 +--
     .../settings/legals/LegalsViewModel.kt        |  3 +--
     .../settings/locale/LocalePickerFragment.kt   |  3 +--
     .../settings/locale/LocalePickerViewModel.kt  |  3 +--
     .../settings/push/PushGatewaysFragment.kt     |  3 +--
     .../settings/push/PushGatewaysViewModel.kt    |  3 +--
     .../threepids/ThreePidsSettingsController.kt  |  5 ++---
     .../threepids/ThreePidsSettingsFragment.kt    |  3 +--
     .../threepids/ThreePidsSettingsViewModel.kt   |  3 +--
     .../features/share/IncomingShareFragment.kt   |  3 +--
     .../features/share/IncomingShareViewModel.kt  |  5 ++---
     .../app/features/spaces/SpaceListFragment.kt  |  3 +--
     .../spaces/create/CreateSpaceViewModel.kt     |  3 +--
     .../manage/SpaceManageSharedViewModel.kt      |  3 +--
     .../spaces/manage/SpaceSettingsFragment.kt    |  3 +--
     .../spaces/people/SpacePeopleViewModel.kt     |  3 +--
     .../app/features/terms/ReviewTermsActivity.kt |  3 +--
     .../app/features/terms/ReviewTermsFragment.kt |  3 +--
     .../features/terms/ReviewTermsViewModel.kt    |  3 +--
     .../app/features/usercode/UserCodeActivity.kt |  5 ++---
     .../userdirectory/UserListViewModel.kt        |  3 +--
     .../workers/signout/SignoutCheckViewModel.kt  |  3 +--
     112 files changed, 149 insertions(+), 298 deletions(-)
     delete mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/Exhaustive.kt
     delete mode 100644 vector/src/main/java/im/vector/app/core/extensions/Exhaustive.kt
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt
    index 8bfbcfaef4..90ede18dc8 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt
    @@ -29,7 +29,6 @@ import org.matrix.android.sdk.internal.crypto.crosssigning.fromBase64Safe
     import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore
     import org.matrix.android.sdk.internal.crypto.verification.DefaultVerificationTransaction
     import org.matrix.android.sdk.internal.crypto.verification.ValidVerificationInfoStart
    -import org.matrix.android.sdk.internal.util.exhaustive
     import timber.log.Timber
     
     internal class DefaultQrCodeVerificationTransaction(
    @@ -129,7 +128,7 @@ internal class DefaultQrCodeVerificationTransaction(
                         // Nothing special here, we will send a reciprocate start event, and then the other session will trust it's view of the MSK
                     }
                 }
    -        }.exhaustive
    +        }
     
             val toVerifyDeviceIds = mutableListOf()
     
    @@ -174,7 +173,7 @@ internal class DefaultQrCodeVerificationTransaction(
                         Unit
                     }
                 }
    -        }.exhaustive
    +        }
     
             if (!canTrustOtherUserMasterKey && toVerifyDeviceIds.isEmpty()) {
                 // Nothing to verify
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/Exhaustive.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/Exhaustive.kt
    deleted file mode 100644
    index 097bdaf153..0000000000
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/Exhaustive.kt
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -/*
    - * Copyright 2020 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.util
    -
    -// Trick to ensure that when block is exhaustive
    -internal val  T.exhaustive: T get() = this
    diff --git a/tools/templates/ElementFeature/root/src/app_package/ViewModel.kt.ftl b/tools/templates/ElementFeature/root/src/app_package/ViewModel.kt.ftl
    index 64e6a0f83f..62b1f40df5 100644
    --- a/tools/templates/ElementFeature/root/src/app_package/ViewModel.kt.ftl
    +++ b/tools/templates/ElementFeature/root/src/app_package/ViewModel.kt.ftl
    @@ -7,7 +7,6 @@ import com.airbnb.mvrx.ViewModelContext
     import dagger.assisted.Assisted
     import dagger.assisted.AssistedInject
     import dagger.assisted.AssistedFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     
     <#if createViewEvents>
    @@ -42,6 +41,6 @@ class ${viewModelClass} @AssistedInject constructor(@Assisted initialState: ${vi
         override fun handle(action: ${actionClass}) {
             when (action) {
     
    -        }.exhaustive
    +        }
         }
     }
    diff --git a/vector/src/debug/java/im/vector/app/features/debug/analytics/DebugAnalyticsViewModel.kt b/vector/src/debug/java/im/vector/app/features/debug/analytics/DebugAnalyticsViewModel.kt
    index 03e416813a..e007e61c1c 100644
    --- a/vector/src/debug/java/im/vector/app/features/debug/analytics/DebugAnalyticsViewModel.kt
    +++ b/vector/src/debug/java/im/vector/app/features/debug/analytics/DebugAnalyticsViewModel.kt
    @@ -22,7 +22,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.EmptyViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.analytics.store.AnalyticsStore
    @@ -53,7 +52,7 @@ class DebugAnalyticsViewModel @AssistedInject constructor(
         override fun handle(action: DebugAnalyticsViewActions) {
             when (action) {
                 DebugAnalyticsViewActions.ResetAnalyticsOptInDisplayed -> handleResetAnalyticsOptInDisplayed()
    -        }.exhaustive
    +        }
         }
     
         private fun handleResetAnalyticsOptInDisplayed() {
    diff --git a/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsViewModel.kt b/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsViewModel.kt
    index 62871023bc..e469dbacda 100644
    --- a/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsViewModel.kt
    +++ b/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsViewModel.kt
    @@ -22,7 +22,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.EmptyViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.debug.features.DebugVectorOverrides
    @@ -71,7 +70,7 @@ class DebugPrivateSettingsViewModel @AssistedInject constructor(
                 is DebugPrivateSettingsViewActions.SetForceLoginFallbackEnabled -> handleSetForceLoginFallbackEnabled(action)
                 is SetDisplayNameCapabilityOverride                             -> handSetDisplayNameCapabilityOverride(action)
                 is SetAvatarCapabilityOverride                                  -> handSetAvatarCapabilityOverride(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleSetDialPadVisibility(action: DebugPrivateSettingsViewActions.SetDialPadVisibility) {
    diff --git a/vector/src/main/java/im/vector/app/core/extensions/Exhaustive.kt b/vector/src/main/java/im/vector/app/core/extensions/Exhaustive.kt
    deleted file mode 100644
    index 158ea84f0c..0000000000
    --- a/vector/src/main/java/im/vector/app/core/extensions/Exhaustive.kt
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -/*
    - * Copyright 2020 New Vector Ltd
    - *
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - *
    - *     http://www.apache.org/licenses/LICENSE-2.0
    - *
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - */
    -
    -package im.vector.app.core.extensions
    -
    -// Trick to ensure that when block is exhaustive
    -val  T.exhaustive: T get() = this
    diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
    index 2c161feb37..4796022856 100644
    --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
    +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
    @@ -54,7 +54,6 @@ import im.vector.app.core.di.ActiveSessionHolder
     import im.vector.app.core.di.ActivityEntryPoint
     import im.vector.app.core.dialogs.DialogLocker
     import im.vector.app.core.dialogs.UnrecognizedCertificateDialog
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.observeEvent
     import im.vector.app.core.extensions.observeNotNull
     import im.vector.app.core.extensions.registerStartForActivityResult
    @@ -267,7 +266,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver
                 is GlobalError.CertificateError     ->
                     handleCertificateError(globalError)
                 GlobalError.ExpiredAccount          -> Unit // TODO Handle account expiration
    -        }.exhaustive
    +        }
         }
     
         private fun handleCertificateError(certificateError: GlobalError.CertificateError) {
    diff --git a/vector/src/main/java/im/vector/app/core/ui/views/NotificationAreaView.kt b/vector/src/main/java/im/vector/app/core/ui/views/NotificationAreaView.kt
    index 1615e77902..5190bb21a8 100644
    --- a/vector/src/main/java/im/vector/app/core/ui/views/NotificationAreaView.kt
    +++ b/vector/src/main/java/im/vector/app/core/ui/views/NotificationAreaView.kt
    @@ -27,7 +27,6 @@ import androidx.core.text.italic
     import im.vector.app.R
     import im.vector.app.core.epoxy.onClick
     import im.vector.app.core.error.ResourceLimitErrorFormatter
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.utils.DimensionConverter
     import im.vector.app.databinding.ViewNotificationAreaBinding
     import im.vector.app.features.themes.ThemeUtils
    @@ -77,7 +76,7 @@ class NotificationAreaView @JvmOverloads constructor(
                 is State.UnsupportedAlgorithm       -> renderUnsupportedAlgorithm(newState)
                 is State.Tombstone                  -> renderTombstone()
                 is State.ResourceLimitExceededError -> renderResourceLimitExceededError(newState)
    -        }.exhaustive
    +        }
         }
     
         // PRIVATE METHODS ****************************************************************************************************************************************
    diff --git a/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsConsentViewModel.kt b/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsConsentViewModel.kt
    index 2c7a8ac9bc..a570b31452 100644
    --- a/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsConsentViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsConsentViewModel.kt
    @@ -22,7 +22,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.analytics.VectorAnalytics
     import kotlinx.coroutines.launch
    @@ -55,7 +54,7 @@ class AnalyticsConsentViewModel @AssistedInject constructor(
         override fun handle(action: AnalyticsConsentViewActions) {
             when (action) {
                 is AnalyticsConsentViewActions.SetUserConsent -> handleSetUserConsent(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleSetUserConsent(action: AnalyticsConsentViewActions.SetUserConsent) {
    diff --git a/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsOptInActivity.kt b/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsOptInActivity.kt
    index c84031d2fd..c11cf582d3 100644
    --- a/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsOptInActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsOptInActivity.kt
    @@ -19,7 +19,6 @@ package im.vector.app.features.analytics.ui.consent
     import com.airbnb.mvrx.viewModel
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.core.extensions.addFragment
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.ScreenOrientationLocker
     import im.vector.app.core.platform.VectorBaseActivity
     import im.vector.app.databinding.ActivitySimpleBinding
    @@ -48,7 +47,7 @@ class AnalyticsOptInActivity : VectorBaseActivity() {
             viewModel.observeViewEvents {
                 when (it) {
                     AnalyticsOptInViewEvents.OnDataSaved -> finish()
    -            }.exhaustive
    +            }
             }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewViewModel.kt b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewViewModel.kt
    index 0a0e700ce9..3e9d72e98b 100644
    --- a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewViewModel.kt
    @@ -17,7 +17,6 @@
     
     package im.vector.app.features.attachments.preview
     
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     
     class AttachmentsPreviewViewModel(initialState: AttachmentsPreviewViewState) :
    @@ -28,7 +27,7 @@ class AttachmentsPreviewViewModel(initialState: AttachmentsPreviewViewState) :
                 is AttachmentsPreviewAction.SetCurrentAttachment          -> handleSetCurrentAttachment(action)
                 is AttachmentsPreviewAction.UpdatePathOfCurrentAttachment -> handleUpdatePathOfCurrentAttachment(action)
                 AttachmentsPreviewAction.RemoveCurrentAttachment          -> handleRemoveCurrentAttachment()
    -        }.exhaustive
    +        }
         }
     
         private fun handleRemoveCurrentAttachment() = withState {
    diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt
    index a26eec04f3..449a740cf3 100644
    --- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt
    @@ -26,7 +26,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.call.audio.CallAudioManager
     import im.vector.app.features.call.dialpad.DialPadLookup
    @@ -343,7 +342,7 @@ class VectorCallViewModel @AssistedInject constructor(
                     setState { VectorCallViewState(action.callArgs) }
                     setupCallWithCurrentState()
                 }
    -        }.exhaustive
    +        }
         }
     
         private fun handleCallTransfer() {
    @@ -358,7 +357,7 @@ class VectorCallViewModel @AssistedInject constructor(
             when (result) {
                 is CallTransferResult.ConnectWithUserId      -> connectWithUserId(result)
                 is CallTransferResult.ConnectWithPhoneNumber -> connectWithPhoneNumber(result)
    -        }.exhaustive
    +        }
         }
     
         private fun connectWithUserId(result: CallTransferResult.ConnectWithUserId) {
    diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewModel.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewModel.kt
    index d04bebfd1b..f0b7b75afb 100644
    --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewModel.kt
    @@ -27,7 +27,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import kotlinx.coroutines.Job
     import kotlinx.coroutines.delay
    @@ -103,7 +102,7 @@ class JitsiCallViewModel @AssistedInject constructor(
             when (action) {
                 is JitsiCallViewActions.SwitchTo      -> handleSwitchTo(action)
                 JitsiCallViewActions.OnConferenceLeft -> handleOnConferenceLeft()
    -        }.exhaustive
    +        }
         }
     
         private fun handleSwitchTo(action: JitsiCallViewActions.SwitchTo) = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt b/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt
    index a668f66f30..5a12337e4f 100644
    --- a/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt
    @@ -35,7 +35,6 @@ import com.facebook.react.modules.core.PermissionListener
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseActivity
     import im.vector.app.databinding.ActivityJitsiBinding
     import kotlinx.parcelize.Parcelize
    @@ -79,7 +78,7 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee
                     JitsiCallViewEvents.FailJoiningConference         -> handleFailJoining()
                     JitsiCallViewEvents.Finish                        -> finish()
                     JitsiCallViewEvents.LeaveConference               -> handleLeaveConference()
    -            }.exhaustive
    +            }
             }
             lifecycle.addObserver(ConferenceEventObserver(this, this::onBroadcastEvent))
         }
    diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
    index d8eede6a55..b10353be13 100644
    --- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
    @@ -26,7 +26,6 @@ import com.google.android.material.tabs.TabLayoutMediator
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.R
     import im.vector.app.core.error.ErrorFormatter
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseActivity
     import im.vector.app.databinding.ActivityCallTransferBinding
     import kotlinx.parcelize.Parcelize
    @@ -57,7 +56,7 @@ class CallTransferActivity : VectorBaseActivity() {
             callTransferViewModel.observeViewEvents {
                 when (it) {
                     is CallTransferViewEvents.Complete -> handleComplete()
    -            }.exhaustive
    +            }
             }
     
             sectionsPagerAdapter = CallTransferPagerAdapter(this)
    diff --git a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
    index ebd0089736..7425e0ae8a 100644
    --- a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
    @@ -26,7 +26,6 @@ import com.airbnb.mvrx.activityViewModel
     import com.airbnb.mvrx.withState
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.hideKeyboard
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.utils.showIdentityServerConsentDialog
    @@ -73,7 +72,7 @@ class ContactsBookFragment @Inject constructor(
                 when (it) {
                     is ContactsBookViewEvents.Failure             -> showFailure(it.throwable)
                     is ContactsBookViewEvents.OnPoliciesRetrieved -> showConsentDialog(it)
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookViewModel.kt b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookViewModel.kt
    index 5678668b25..d016558764 100644
    --- a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookViewModel.kt
    @@ -27,7 +27,6 @@ import im.vector.app.core.contacts.ContactsDataSource
     import im.vector.app.core.contacts.MappedContact
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.features.discovery.fetchIdentityServerWithTerms
    @@ -165,7 +164,7 @@ class ContactsBookViewModel @AssistedInject constructor(
                 is ContactsBookAction.OnlyBoundContacts -> handleOnlyBoundContacts(action)
                 ContactsBookAction.UserConsentGranted   -> handleUserConsentGranted()
                 ContactsBookAction.UserConsentRequest   -> handleUserConsentRequest()
    -        }.exhaustive
    +        }
         }
     
         private fun handleUserConsentRequest() {
    diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
    index 111b872a15..0d36c7c7cc 100644
    --- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
    @@ -36,7 +36,6 @@ import im.vector.app.R
     import im.vector.app.core.error.ErrorFormatter
     import im.vector.app.core.extensions.addFragment
     import im.vector.app.core.extensions.addFragmentToBackstack
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.SimpleFragmentActivity
     import im.vector.app.core.platform.WaitingViewData
     import im.vector.app.core.utils.PERMISSIONS_FOR_MEMBERS_SEARCH
    @@ -85,7 +84,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
                             is UserListSharedAction.OnMenuItemSelected -> onMenuItemSelected(action)
                             UserListSharedAction.OpenPhoneBook         -> openPhoneBook()
                             UserListSharedAction.AddByQrCode           -> openAddByQrCode()
    -                    }.exhaustive
    +                    }
                     }
                     .launchIn(lifecycleScope)
             if (isFirstCreation()) {
    @@ -112,7 +111,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
                         Toast.makeText(this, R.string.cannot_dm_self, Toast.LENGTH_SHORT).show()
                         finish()
                     }
    -            }.exhaustive
    +            }
             }
     
             qrViewModel.observeViewEvents {
    @@ -125,7 +124,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
                         finish()
                     }
                     else                               -> Unit
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
    index 9dd3ef6a9b..d3011496d2 100644
    --- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
    @@ -24,7 +24,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.mvrx.runCatchingToAsync
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.raw.wellknown.getElementWellknown
    @@ -56,7 +55,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted
             when (action) {
                 is CreateDirectRoomAction.CreateRoomAndInviteSelectedUsers -> onSubmitInvitees(action.selections)
                 is CreateDirectRoomAction.QrScannedAction                  -> onCodeParsed(action)
    -        }.exhaustive
    +        }
         }
     
         private fun onCodeParsed(action: CreateDirectRoomAction.QrScannedAction) {
    @@ -108,7 +107,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted
                                 when (it) {
                                     is PendingSelection.UserPendingSelection     -> invitedUserIds.add(it.user.userId)
                                     is PendingSelection.ThreePidPendingSelection -> invite3pids.add(it.threePid)
    -                            }.exhaustive
    +                            }
                             }
                             setDirectMessage()
                             enableEncryptionIfInvitedUsersSupportIt = adminE2EByDefault
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
    index 8994ad901b..d324a52242 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
    @@ -29,7 +29,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.platform.WaitingViewData
     import im.vector.app.core.resources.StringProvider
    @@ -142,7 +141,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
                 SharedSecureStorageAction.Back                        -> handleBack()
                 SharedSecureStorageAction.ForgotResetAll              -> handleResetAll()
                 SharedSecureStorageAction.DoResetAll                  -> handleDoResetAll()
    -        }.exhaustive
    +        }
         }
     
         private fun handleDoResetAll() {
    diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapBottomSheet.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapBottomSheet.kt
    index 8448422a56..ac7662ca59 100644
    --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapBottomSheet.kt
    +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapBottomSheet.kt
    @@ -36,7 +36,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.R
     import im.vector.app.core.extensions.commitTransaction
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.registerStartForActivityResult
     import im.vector.app.core.extensions.toMvRxBundle
     import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
    @@ -209,7 +208,7 @@ class BootstrapBottomSheet : VectorBaseBottomSheetDialogFragment showSnackbar(it.message)
    -            }.exhaustive
    +            }
             }
             supportFragmentManager.addOnBackStackChangedListener(this)
         }
    diff --git a/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsFragment.kt b/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsFragment.kt
    index 523e8cb9bb..2de03f296e 100644
    --- a/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsFragment.kt
    @@ -28,7 +28,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.observeEvent
     import im.vector.app.core.extensions.registerStartForActivityResult
     import im.vector.app.core.platform.VectorBaseFragment
    @@ -70,7 +69,7 @@ class DiscoverySettingsFragment @Inject constructor(
                 when (it) {
                     is DiscoverySharedViewModelAction.ChangeIdentityServer ->
                         viewModel.handle(DiscoverySettingsAction.ChangeIdentityServer(it.newUrl))
    -            }.exhaustive
    +            }
             }
     
             viewModel.observeViewEvents {
    @@ -78,7 +77,7 @@ class DiscoverySettingsFragment @Inject constructor(
                     is DiscoverySettingsViewEvents.Failure -> {
                         displayErrorDialog(it.throwable)
                     }
    -            }.exhaustive
    +            }
             }
             if (discoveryArgs.expandIdentityPolicies) {
                 viewModel.handle(DiscoverySettingsAction.SetPoliciesExpandState(expanded = true))
    diff --git a/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsViewModel.kt
    index 19f233fe98..8c1caaf67a 100644
    --- a/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/discovery/DiscoverySettingsViewModel.kt
    @@ -27,7 +27,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import kotlinx.coroutines.flow.launchIn
    @@ -113,7 +112,7 @@ class DiscoverySettingsViewModel @AssistedInject constructor(
                 is DiscoverySettingsAction.FinalizeBind3pid       -> finalizeBind3pid(action, true)
                 is DiscoverySettingsAction.SubmitMsisdnToken      -> submitMsisdnToken(action)
                 is DiscoverySettingsAction.CancelBinding          -> cancelBinding(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleUpdateUserConsent(action: DiscoverySettingsAction.UpdateUserConsent) {
    @@ -235,7 +234,7 @@ class DiscoverySettingsViewModel @AssistedInject constructor(
             when (action.threePid) {
                 is ThreePid.Email  -> revokeEmail(action.threePid)
                 is ThreePid.Msisdn -> revokeMsisdn(action.threePid)
    -        }.exhaustive
    +        }
         }
     
         private fun revokeEmail(threePid: ThreePid.Email) = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/discovery/SettingsTextButtonSingleLineItem.kt b/vector/src/main/java/im/vector/app/features/discovery/SettingsTextButtonSingleLineItem.kt
    index 527d28dfad..29a44a1d8a 100644
    --- a/vector/src/main/java/im/vector/app/features/discovery/SettingsTextButtonSingleLineItem.kt
    +++ b/vector/src/main/java/im/vector/app/features/discovery/SettingsTextButtonSingleLineItem.kt
    @@ -34,7 +34,6 @@ import im.vector.app.core.epoxy.attributes.ButtonStyle
     import im.vector.app.core.epoxy.attributes.ButtonType
     import im.vector.app.core.epoxy.attributes.IconMode
     import im.vector.app.core.epoxy.onClick
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.setTextOrHide
     import im.vector.app.core.resources.ColorProvider
     import im.vector.app.core.resources.StringProvider
    @@ -122,7 +121,7 @@ abstract class SettingsTextButtonSingleLineItem : EpoxyModelWithHolder {
                                 holder.mainButton.setTextColor(colorProvider.getColorFromAttribute(R.attr.colorError))
                             }
    -                    }.exhaustive
    +                    }
                         holder.mainButton.onClick(buttonClickListener)
                     }
                     ButtonType.SWITCH    -> {
    @@ -133,7 +132,7 @@ abstract class SettingsTextButtonSingleLineItem : EpoxyModelWithHolder useDefault()
                 is SetIdentityServerAction.UseCustomIdentityServer -> usedCustomIdentityServerUrl(action)
    -        }.exhaustive
    +        }
         }
     
         private fun useDefault() = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    index 2e9ab0efcb..009edcc69e 100644
    --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
    @@ -38,7 +38,6 @@ import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.AppStateHandler
     import im.vector.app.R
     import im.vector.app.core.di.ActiveSessionHolder
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.hideKeyboard
     import im.vector.app.core.extensions.registerStartForActivityResult
     import im.vector.app.core.extensions.replaceFragment
    @@ -107,6 +106,7 @@ class HomeActivity :
     
         @Suppress("UNUSED")
         private val analyticsAccountDataViewModel: AnalyticsAccountDataViewModel by viewModel()
    +
         @Suppress("UNUSED")
         private val userColorAccountDataViewModel: UserColorAccountDataViewModel by viewModel()
     
    @@ -232,7 +232,7 @@ class HomeActivity :
                             HomeActivitySharedAction.SendSpaceFeedBack    -> {
                                 bugReporter.openBugReportScreen(this, ReportType.SPACE_BETA_FEEDBACK)
                             }
    -                    }.exhaustive
    +                    }
                     }
                     .launchIn(lifecycleScope)
     
    @@ -256,7 +256,7 @@ class HomeActivity :
                     HomeActivityViewEvents.ShowAnalyticsOptIn               -> handleShowAnalyticsOptIn()
                     HomeActivityViewEvents.NotifyUserForThreadsMigration    -> handleNotifyUserForThreadsMigration()
                     is HomeActivityViewEvents.MigrateThreads                -> migrateThreadsIfNeeded(it.checkSession)
    -            }.exhaustive
    +            }
             }
             homeActivityViewModel.onEach { renderState(it) }
     
    @@ -374,7 +374,7 @@ class HomeActivity :
                     // Idle or Incremental sync status
                     views.waitingView.root.isVisible = false
                 }
    -        }.exhaustive
    +        }
         }
     
         private fun handleAskPasswordToInitCrossSigning(events: HomeActivityViewEvents.AskPasswordToInitCrossSigning) {
    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 b4af50c7ff..87de0a32e3 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
    @@ -25,7 +25,6 @@ import im.vector.app.config.analyticsConfig
     import im.vector.app.core.di.ActiveSessionHolder
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.analytics.store.AnalyticsStore
     import im.vector.app.features.login.ReAuthHelper
    @@ -306,6 +305,6 @@ class HomeActivityViewModel @AssistedInject constructor(
                 HomeActivityViewActions.ViewStarted               -> {
                     initialize()
                 }
    -        }.exhaustive
    +        }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    index 7137cbc4cf..a0844a9a96 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
    @@ -72,7 +72,6 @@ import im.vector.app.core.dialogs.ConfirmationDialogBuilder
     import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper
     import im.vector.app.core.epoxy.LayoutManagerStateRestorer
     import im.vector.app.core.extensions.cleanup
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.hideKeyboard
     import im.vector.app.core.extensions.registerStartForActivityResult
     import im.vector.app.core.extensions.setTextOrHide
    @@ -446,7 +445,7 @@ class TimelineFragment @Inject constructor(
                         }
                         showErrorInSnackbar(it.throwable)
                     }
    -            }.exhaustive
    +            }
             }
     
             timelineViewModel.observeViewEvents {
    @@ -483,7 +482,7 @@ class TimelineFragment @Inject constructor(
                     RoomDetailViewEvents.StopChatEffects                     -> handleStopChatEffects()
                     is RoomDetailViewEvents.DisplayAndAcceptCall             -> acceptIncomingCall(it)
                     RoomDetailViewEvents.RoomReplacementStarted              -> handleRoomReplacement()
    -            }.exhaustive
    +            }
             }
     
             if (savedInstanceState == null) {
    @@ -875,7 +874,7 @@ class TimelineFragment @Inject constructor(
                     onContentAttachmentsReady(sharedData.attachmentData)
                 }
                 null                      -> Timber.v("No share data to process")
    -        }.exhaustive
    +        }
         }
     
         private fun handleSpaceShare() {
    @@ -1241,7 +1240,7 @@ class TimelineFragment @Inject constructor(
                     insertUserDisplayNameInTextEditor(roomDetailPendingAction.userId)
                 is RoomDetailPendingAction.OpenRoom          ->
                     handleOpenRoom(RoomDetailViewEvents.OpenRoom(roomDetailPendingAction.roomId, roomDetailPendingAction.closeCurrentRoom))
    -        }.exhaustive
    +        }
         }
     
         override fun onPause() {
    @@ -1658,7 +1657,7 @@ class TimelineFragment @Inject constructor(
                 is MessageComposerViewEvents.SlashCommandNotSupportedInThreads -> {
                     displayCommandError(getString(R.string.command_not_supported_in_threads, sendMessageResult.command.command))
                 }
    -        } // .exhaustive
    +        } // 
     
             lockSendButton = false
         }
    @@ -2437,7 +2436,7 @@ class TimelineFragment @Inject constructor(
                                     locationOwnerId = session.myUserId
                             )
                 }
    -        }.exhaustive
    +        }
         }
     
         // AttachmentsHelper.Callback
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt
    index a9235b5699..6933adc758 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt
    @@ -33,7 +33,6 @@ import im.vector.app.BuildConfig
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.mvrx.runCatchingToAsync
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
    @@ -440,7 +439,7 @@ class TimelineViewModel @AssistedInject constructor(
                     _viewEvents.post(RoomDetailViewEvents.OpenRoom(action.replacementRoomId, closeCurrentRoom = true))
                 }
                 is RoomDetailAction.EndPoll                          -> handleEndPoll(action.eventId)
    -        }.exhaustive
    +        }
         }
     
         private fun handleJitsiCallJoinStatus(action: RoomDetailAction.UpdateJoinJitsiCallStatus) = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index 009d898940..8b34d9d9a9 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -23,7 +23,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.features.analytics.AnalyticsTracker
    @@ -463,7 +462,7 @@ class MessageComposerViewModel @AssistedInject constructor(
                                 _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
                                 popDraft()
                             }
    -                    }.exhaustive
    +                    }
                     }
                     is SendMode.Edit    -> {
                         // is original event a reply?
    @@ -536,7 +535,7 @@ class MessageComposerViewModel @AssistedInject constructor(
                     is SendMode.Voice   -> {
                         // do nothing
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    index ba39f40daf..7cb8bbad95 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt
    @@ -23,7 +23,6 @@ import androidx.constraintlayout.widget.ConstraintLayout
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.BuildConfig
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.hardware.vibrate
     import im.vector.app.core.time.Clock
     import im.vector.app.core.utils.DimensionConverter
    @@ -168,7 +167,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
                 DraggingState.Ready         -> {
                     // do nothing
                 }
    -        }.exhaustive
    +        }
             dragState = newDragState
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchViewModel.kt
    index 7bff76cc36..1702fb95cd 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchViewModel.kt
    @@ -25,7 +25,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import kotlinx.coroutines.CancellationException
     import kotlinx.coroutines.Job
    @@ -56,7 +55,7 @@ class SearchViewModel @AssistedInject constructor(
                 is SearchAction.SearchWith -> handleSearchWith(action)
                 is SearchAction.LoadMore   -> handleLoadMore()
                 is SearchAction.Retry      -> handleRetry()
    -        }.exhaustive
    +        }
         }
     
         private fun handleSearchWith(action: SearchAction.SearchWith) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt
    index 0909cbe8de..9ff8ddfbce 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/ContentUploadStateTrackerBinder.kt
    @@ -26,7 +26,6 @@ import dagger.hilt.android.scopes.ActivityScoped
     import im.vector.app.R
     import im.vector.app.core.di.ActiveSessionHolder
     import im.vector.app.core.error.ErrorFormatter
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.utils.TextUtils
     import im.vector.app.features.home.room.detail.timeline.MessageColorProvider
     import org.matrix.android.sdk.api.session.content.ContentUploadStateTracker
    @@ -86,7 +85,7 @@ private class ContentMediaProgressUpdater(private val progressLayout: ViewGroup,
                 is ContentUploadStateTracker.State.Success             -> handleSuccess()
                 is ContentUploadStateTracker.State.CompressingImage    -> handleCompressingImage()
                 is ContentUploadStateTracker.State.CompressingVideo    -> handleCompressingVideo(state)
    -        }.exhaustive
    +        }
         }
     
         private fun handleIdle() {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollOptionView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollOptionView.kt
    index 2be933d9c3..80daa595b6 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollOptionView.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollOptionView.kt
    @@ -23,7 +23,6 @@ import androidx.appcompat.content.res.AppCompatResources
     import androidx.constraintlayout.widget.ConstraintLayout
     import androidx.core.view.isVisible
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.setAttributeTintedImageResource
     import im.vector.app.databinding.ItemPollOptionBinding
     
    @@ -49,7 +48,7 @@ class PollOptionView @JvmOverloads constructor(
                 is PollOptionViewState.PollReady       -> renderPollReady()
                 is PollOptionViewState.PollVoted       -> renderPollVoted(state)
                 is PollOptionViewState.PollUndisclosed -> renderPollUndisclosed(state)
    -        }.exhaustive
    +        }
         }
     
         private fun renderPollSending() {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt
    index 821531416b..61fcddd123 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt
    @@ -31,7 +31,6 @@ import com.airbnb.epoxy.EpoxyModelClass
     import im.vector.app.R
     import im.vector.app.core.epoxy.ClickListener
     import im.vector.app.core.epoxy.onClick
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.features.home.AvatarRenderer
     import im.vector.app.features.home.room.detail.RoomDetailAction
     import im.vector.app.features.home.room.detail.timeline.MessageColorProvider
    @@ -105,7 +104,7 @@ abstract class VerificationRequestItem : AbsBaseMessageItem handleSelectRoom(it, it.isInviteAlreadyAccepted)
                     is RoomListViewEvents.Done                      -> Unit
                     is RoomListViewEvents.NavigateToMxToBottomSheet -> handleShowMxToLink(it.link)
    -            }.exhaustive
    +            }
             }
     
             views.createChatFabMenu.listener = this
    @@ -418,7 +417,7 @@ class RoomListFragment @Inject constructor(
                 is RoomListQuickActionsSharedAction.Leave                     -> {
                     promptLeaveRoom(quickAction.roomId)
                 }
    -        }.exhaustive
    +        }
         }
     
         private fun promptLeaveRoom(roomId: String) {
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt
    index ec8b01876b..70974bc1f6 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt
    @@ -29,7 +29,6 @@ import im.vector.app.AppStateHandler
     import im.vector.app.RoomGroupingMethod
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.features.analytics.AnalyticsTracker
    @@ -163,7 +162,7 @@ class RoomListViewModel @AssistedInject constructor(
                 is RoomListAction.ToggleSection               -> handleToggleSection(action.section)
                 is RoomListAction.JoinSuggestedRoom           -> handleJoinSuggestedRoom(action)
                 is RoomListAction.ShowRoomDetails             -> handleShowRoomDetails(action)
    -        }.exhaustive
    +        }
         }
     
         fun isPublicRoom(roomId: String): Boolean {
    diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingFragment.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingFragment.kt
    index c4dccc1b73..d61d53ae51 100644
    --- a/vector/src/main/java/im/vector/app/features/location/LocationSharingFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingFragment.kt
    @@ -29,7 +29,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import com.mapbox.mapboxsdk.maps.MapView
     import im.vector.app.BuildConfig
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.utils.PERMISSIONS_FOR_BACKGROUND_LOCATION_SHARING
     import im.vector.app.core.utils.PERMISSIONS_FOR_FOREGROUND_LOCATION_SHARING
    @@ -86,7 +85,7 @@ class LocationSharingFragment @Inject constructor(
                     LocationSharingViewEvents.Close                     -> locationSharingNavigator.quit()
                     LocationSharingViewEvents.LocationNotAvailableError -> handleLocationNotAvailableError()
                     is LocationSharingViewEvents.ZoomToUserLocation     -> handleZoomToUserLocationEvent(it)
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt
    index 639666e63f..1d68247f2c 100644
    --- a/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt
    @@ -23,7 +23,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider
     import im.vector.app.features.location.domain.usecase.CompareLocationsUseCase
    @@ -122,7 +121,7 @@ class LocationSharingViewModel @AssistedInject constructor(
                 is LocationSharingAction.LocationTargetChange    -> handleLocationTargetChangeAction(action)
                 LocationSharingAction.ZoomToUserLocation         -> handleZoomToUserLocationAction()
                 LocationSharingAction.StartLiveLocationSharing   -> handleStartLiveLocationSharingAction()
    -        }.exhaustive
    +        }
         }
     
         private fun handleCurrentUserLocationSharingAction() = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/login/AbstractLoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/AbstractLoginFragment.kt
    index 8b83873142..f5e48e84e7 100644
    --- a/vector/src/main/java/im/vector/app/features/login/AbstractLoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/login/AbstractLoginFragment.kt
    @@ -26,7 +26,6 @@ import com.airbnb.mvrx.withState
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.dialogs.UnrecognizedCertificateDialog
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.OnBackPressed
     import im.vector.app.core.platform.VectorBaseFragment
     import kotlinx.coroutines.CancellationException
    @@ -69,7 +68,7 @@ abstract class AbstractLoginFragment : VectorBaseFragment(
                 else                       ->
                     // This is handled by the Activity
                     Unit
    -        }.exhaustive
    +        }
         }
     
         override fun showFailure(throwable: Throwable) {
    diff --git a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
    index a40f26acec..dec6fef040 100644
    --- a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
    @@ -35,7 +35,6 @@ import im.vector.app.R
     import im.vector.app.core.extensions.POP_BACK_STACK_EXCLUSIVE
     import im.vector.app.core.extensions.addFragment
     import im.vector.app.core.extensions.addFragmentToBackstack
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.validateBackPressed
     import im.vector.app.core.platform.VectorBaseActivity
     import im.vector.app.databinding.ActivityLoginBinding
    @@ -197,7 +196,7 @@ open class LoginActivity : VectorBaseActivity(), UnlockedA
                 is LoginViewEvents.Loading                                    ->
                     // This is handled by the Fragments
                     Unit
    -        }.exhaustive
    +        }
         }
     
         private fun updateWithState(loginViewState: LoginViewState) {
    @@ -260,13 +259,13 @@ open class LoginActivity : VectorBaseActivity(), UnlockedA
                                 tag = FRAGMENT_LOGIN_TAG,
                                 option = commonOption)
                         LoginMode.Unsupported -> onLoginModeNotSupported(state.loginModeSupportedTypes)
    -                }.exhaustive
    +                }
                 }
                 SignMode.SignInWithMatrixId -> addFragmentToBackstack(views.loginFragmentContainer,
                         LoginFragment::class.java,
                         tag = FRAGMENT_LOGIN_TAG,
                         option = commonOption)
    -        }.exhaustive
    +        }
         }
     
         /**
    diff --git a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
    index 61d32eadd8..22f8792078 100644
    --- a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt
    @@ -31,7 +31,6 @@ import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
     import com.airbnb.mvrx.Uninitialized
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.hideKeyboard
     import im.vector.app.core.extensions.hidePassword
     import im.vector.app.core.extensions.toReducedUrl
    @@ -98,7 +97,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment SocialLoginButtonsView.Mode.MODE_SIGN_UP
                 SignMode.SignIn,
                 SignMode.SignInWithMatrixId -> SocialLoginButtonsView.Mode.MODE_SIGN_IN
    -        }.exhaustive
    +        }
         }
     
         private fun submit() {
    diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt
    index 4eba31994b..246c3ad464 100644
    --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt
    @@ -31,7 +31,6 @@ import im.vector.app.core.di.ActiveSessionHolder
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
     import im.vector.app.core.extensions.configureAndStart
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.core.utils.ensureTrailingSlash
    @@ -131,7 +130,7 @@ class LoginViewModel @AssistedInject constructor(
                 is LoginAction.UserAcceptCertificate      -> handleUserAcceptCertificate(action)
                 LoginAction.ClearHomeServerHistory        -> handleClearHomeServerHistory()
                 is LoginAction.PostViewEvent              -> _viewEvents.post(action.viewEvent)
    -        }.exhaustive
    +        }
         }
     
         private fun handleOnGetStarted(action: LoginAction.OnGetStarted) {
    @@ -448,7 +447,7 @@ class LoginViewModel @AssistedInject constructor(
                     handle(LoginAction.UpdateHomeServer(matrixOrgUrl))
                 ServerType.EMS,
                 ServerType.Other     -> _viewEvents.post(LoginViewEvents.OnServerSelectionDone(action.serverType))
    -        }.exhaustive
    +        }
         }
     
         private fun handleInitWith(action: LoginAction.InitWith) {
    @@ -556,7 +555,7 @@ class LoginViewModel @AssistedInject constructor(
                 SignMode.SignIn             -> handleLogin(action)
                 SignMode.SignUp             -> handleRegisterWith(action)
                 SignMode.SignInWithMatrixId -> handleDirectLogin(action, null)
    -        }.exhaustive
    +        }
         }
     
         private fun handleDirectLogin(action: LoginAction.LoginOrRegister, homeServerConnectionConfig: HomeServerConnectionConfig?) {
    @@ -586,7 +585,7 @@ class LoginViewModel @AssistedInject constructor(
                     else                          -> {
                         onWellKnownError()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/login2/AbstractLoginFragment2.kt b/vector/src/main/java/im/vector/app/features/login2/AbstractLoginFragment2.kt
    index 8c9749d91e..68568d1420 100644
    --- a/vector/src/main/java/im/vector/app/features/login2/AbstractLoginFragment2.kt
    +++ b/vector/src/main/java/im/vector/app/features/login2/AbstractLoginFragment2.kt
    @@ -26,7 +26,6 @@ import com.airbnb.mvrx.withState
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.dialogs.UnrecognizedCertificateDialog
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.OnBackPressed
     import im.vector.app.core.platform.VectorBaseFragment
     import kotlinx.coroutines.CancellationException
    @@ -67,7 +66,7 @@ abstract class AbstractLoginFragment2 : VectorBaseFragment
                 else                        ->
                     // This is handled by the Activity
                     Unit
    -        }.exhaustive
    +        }
         }
     
         override fun showFailure(throwable: Throwable) {
    diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt
    index e2831e7d2d..8125c6e089 100644
    --- a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt
    +++ b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt
    @@ -28,7 +28,6 @@ import im.vector.app.core.di.ActiveSessionHolder
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
     import im.vector.app.core.extensions.configureAndStart
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.tryAsync
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
    @@ -136,7 +135,7 @@ class LoginViewModel2 @AssistedInject constructor(
                 LoginAction2.ClearHomeServerHistory        -> handleClearHomeServerHistory()
                 is LoginAction2.PostViewEvent              -> _viewEvents.post(action.viewEvent)
                 is LoginAction2.Finish                     -> handleFinish()
    -        }.exhaustive
    +        }
         }
     
         private fun handleFinish() {
    @@ -500,7 +499,7 @@ class LoginViewModel2 @AssistedInject constructor(
                 SignMode2.Unknown -> error("Developer error, invalid sign mode")
                 SignMode2.SignIn  -> handleSetUserNameForSignIn(action, null)
                 SignMode2.SignUp  -> handleSetUserNameForSignUp(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleSetUserPassword(action: LoginAction2.SetUserPassword) = withState { state ->
    @@ -508,7 +507,7 @@ class LoginViewModel2 @AssistedInject constructor(
                 SignMode2.Unknown -> error("Developer error, invalid sign mode")
                 SignMode2.SignIn  -> handleSignInWithPassword(action)
                 SignMode2.SignUp  -> handleRegisterWithPassword(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleRegisterWithPassword(action: LoginAction2.SetUserPassword) = withState { state ->
    @@ -588,7 +587,7 @@ class LoginViewModel2 @AssistedInject constructor(
                     else                          -> {
                         onWellKnownError()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
    index 76391c6dec..04c2c8dd44 100644
    --- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
    @@ -28,7 +28,6 @@ import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
     import im.vector.app.core.error.ErrorFormatter
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.features.createdirect.DirectRoomHelper
    @@ -264,7 +263,7 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor(
                 is MatrixToAction.OpenRoom              -> {
                     _viewEvents.post(MatrixToViewEvents.NavigateToRoom(action.roomId))
                 }
    -        }.exhaustive
    +        }
         }
     
         private fun handleJoinSpace(joinSpace: MatrixToAction.JoinSpace) {
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/Login2Variant.kt b/vector/src/main/java/im/vector/app/features/onboarding/Login2Variant.kt
    index 107c08da5a..163af5d8d1 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/Login2Variant.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/Login2Variant.kt
    @@ -30,7 +30,6 @@ import im.vector.app.R
     import im.vector.app.core.extensions.POP_BACK_STACK_EXCLUSIVE
     import im.vector.app.core.extensions.addFragment
     import im.vector.app.core.extensions.addFragmentToBackstack
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.resetBackstack
     import im.vector.app.core.platform.VectorBaseActivity
     import im.vector.app.databinding.ActivityLoginBinding
    @@ -257,7 +256,7 @@ class Login2Variant(
                 is LoginViewEvents2.OnSessionCreated                           -> handleOnSessionCreated(event)
                 is LoginViewEvents2.Finish                                     -> terminate(true)
                 is LoginViewEvents2.CancelRegistration                         -> handleCancelRegistration()
    -        }.exhaustive
    +        }
         }
     
         private fun handleCancelRegistration() {
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    index 856b2ab567..e7302cb1e2 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    @@ -31,7 +31,6 @@ import im.vector.app.core.di.ActiveSessionHolder
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
     import im.vector.app.core.extensions.configureAndStart
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.vectorStore
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
    @@ -166,7 +165,7 @@ class OnboardingViewModel @AssistedInject constructor(
                 OnboardingAction.SaveSelectedProfilePicture    -> updateProfilePicture()
                 is OnboardingAction.PostViewEvent              -> _viewEvents.post(action.viewEvent)
                 OnboardingAction.StopEmailValidationCheck      -> cancelWaitForEmailValidation()
    -        }.exhaustive
    +        }
         }
     
         private fun handleSplashAction(resetConfig: Boolean, onboardingFlow: OnboardingFlow) {
    @@ -404,7 +403,7 @@ class OnboardingViewModel @AssistedInject constructor(
                     handle(OnboardingAction.UpdateHomeServer(matrixOrgUrl))
                 ServerType.EMS,
                 ServerType.Other     -> _viewEvents.post(OnboardingViewEvents.OnServerSelectionDone(action.serverType))
    -        }.exhaustive
    +        }
         }
     
         private fun handleInitWith(action: OnboardingAction.InitWith) {
    @@ -512,7 +511,7 @@ class OnboardingViewModel @AssistedInject constructor(
                 SignMode.SignIn             -> handleLogin(action)
                 SignMode.SignUp             -> handleRegisterWith(action)
                 SignMode.SignInWithMatrixId -> handleDirectLogin(action, null)
    -        }.exhaustive
    +        }
         }
     
         private fun handleDirectLogin(action: OnboardingAction.LoginOrRegister, homeServerConnectionConfig: HomeServerConnectionConfig?) {
    @@ -542,7 +541,7 @@ class OnboardingViewModel @AssistedInject constructor(
                     else                          -> {
                         onWellKnownError()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/AbstractFtueAuthFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/AbstractFtueAuthFragment.kt
    index 0caf2ea152..f8f6f6cefa 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/AbstractFtueAuthFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/AbstractFtueAuthFragment.kt
    @@ -26,7 +26,6 @@ import com.airbnb.mvrx.withState
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.dialogs.UnrecognizedCertificateDialog
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.OnBackPressed
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.features.onboarding.OnboardingAction
    @@ -73,7 +72,7 @@ abstract class AbstractFtueAuthFragment : VectorBaseFragment
                     // This is handled by the Activity
                     Unit
    -        }.exhaustive
    +        }
         }
     
         override fun showFailure(throwable: Throwable) {
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    index 632625f4de..dacd8feab3 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    @@ -29,7 +29,6 @@ import androidx.lifecycle.lifecycleScope
     import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.hideKeyboard
     import im.vector.app.core.extensions.hidePassword
     import im.vector.app.core.extensions.toReducedUrl
    @@ -104,7 +103,7 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
                         views.loginField.setAutofillHints(HintConstants.AUTOFILL_HINT_USERNAME)
                         views.passwordField.setAutofillHints(HintConstants.AUTOFILL_HINT_PASSWORD)
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    @@ -114,7 +113,7 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
                 SignMode.SignUp             -> SocialLoginButtonsView.Mode.MODE_SIGN_UP
                 SignMode.SignIn,
                 SignMode.SignInWithMatrixId -> SocialLoginButtonsView.Mode.MODE_SIGN_IN
    -        }.exhaustive
    +        }
         }
     
         private fun submit() {
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    index 79a974038b..13b5f61010 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    @@ -31,7 +31,6 @@ import im.vector.app.R
     import im.vector.app.core.extensions.POP_BACK_STACK_EXCLUSIVE
     import im.vector.app.core.extensions.addFragment
     import im.vector.app.core.extensions.addFragmentToBackstack
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.popBackstack
     import im.vector.app.core.extensions.replaceFragment
     import im.vector.app.core.platform.ScreenOrientationLocker
    @@ -229,7 +228,7 @@ class FtueAuthVariant(
                 OnboardingViewEvents.OnChooseProfilePicture                        -> onChooseProfilePicture()
                 OnboardingViewEvents.OnPersonalizationComplete                     -> onPersonalizationComplete()
                 OnboardingViewEvents.OnBack                                        -> activity.popBackstack()
    -        }.exhaustive
    +        }
         }
     
         private fun registrationShouldFallback(registrationFlowResult: OnboardingViewEvents.RegistrationFlowResult) =
    @@ -281,7 +280,7 @@ class FtueAuthVariant(
                 SignMode.SignUp             -> Unit // This case is processed in handleOnboardingViewEvents
                 SignMode.SignIn             -> handleSignInSelected(state)
                 SignMode.SignInWithMatrixId -> handleSignInWithMatrixId(state)
    -        }.exhaustive
    +        }
         }
     
         private fun handleSignInSelected(state: OnboardingViewState) {
    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 4483b00158..2abff7f22b 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
    @@ -27,7 +27,6 @@ import com.airbnb.mvrx.args
     import com.airbnb.mvrx.withState
     import im.vector.app.R
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     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
    @@ -68,7 +67,7 @@ class CreatePollFragment @Inject constructor(
                     views.createPollToolbar.title = getString(R.string.edit_poll_title)
                     views.createPollButton.text = getString(R.string.edit_poll_title)
                 }
    -        }.exhaustive
    +        }
     
             views.createPollRecyclerView.configureWith(controller, disableItemAnimation = true)
             // workaround for https://github.com/vector-im/element-android/issues/4735
    diff --git a/vector/src/main/java/im/vector/app/features/qrcode/QrCodeScannerActivity.kt b/vector/src/main/java/im/vector/app/features/qrcode/QrCodeScannerActivity.kt
    index dda7b2e2eb..b23f2f171d 100644
    --- a/vector/src/main/java/im/vector/app/features/qrcode/QrCodeScannerActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/qrcode/QrCodeScannerActivity.kt
    @@ -24,7 +24,6 @@ import androidx.activity.result.ActivityResultLauncher
     import com.airbnb.mvrx.viewModel
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.replaceFragment
     import im.vector.app.core.platform.VectorBaseActivity
     import im.vector.app.databinding.ActivitySimpleBinding
    @@ -51,7 +50,7 @@ class QrCodeScannerActivity() : VectorBaseActivity() {
                         finish()
                     }
                     else                               -> Unit
    -            }.exhaustive
    +            }
             }
     
             if (isFirstCreation()) {
    diff --git a/vector/src/main/java/im/vector/app/features/room/RequireActiveMembershipViewModel.kt b/vector/src/main/java/im/vector/app/features/room/RequireActiveMembershipViewModel.kt
    index a77bd32f26..0cb49746f1 100644
    --- a/vector/src/main/java/im/vector/app/features/room/RequireActiveMembershipViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/room/RequireActiveMembershipViewModel.kt
    @@ -23,7 +23,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import kotlinx.coroutines.Dispatchers
    @@ -127,6 +126,6 @@ class RequireActiveMembershipViewModel @AssistedInject constructor(
                     }
                     roomIdFlow.tryEmit(Optional.from(action.roomId))
                 }
    -        }.exhaustive
    +        }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsFragment.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsFragment.kt
    index 14b50c2745..b8bba347fd 100644
    --- a/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsFragment.kt
    @@ -28,7 +28,6 @@ import com.airbnb.mvrx.withState
     import im.vector.app.R
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.trackItemsVisibilityChange
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.platform.showOptimizedSnackbar
    @@ -96,7 +95,7 @@ class PublicRoomsFragment @Inject constructor(
                 is RoomDirectoryViewEvents.Failure -> {
                     views.coordinatorLayout.showOptimizedSnackbar(errorFormatter.toHumanReadable(viewEvents.throwable))
                 }
    -        }.exhaustive
    +        }
         }
     
         override fun onDestroyView() {
    diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt
    index 2bd41ae3af..2871513c1f 100644
    --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt
    @@ -34,7 +34,6 @@ import im.vector.app.R
     import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.OnBackPressed
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.resources.ColorProvider
    @@ -94,7 +93,7 @@ class CreateRoomFragment @Inject constructor(
                 when (it) {
                     CreateRoomViewEvents.Quit       -> vectorBaseActivity.onBackPressed()
                     is CreateRoomViewEvents.Failure -> showFailure(it.throwable)
    -            }.exhaustive
    +            }
             }
         }
     
    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 3b2e9de2d1..7d65c44a57 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
    @@ -28,7 +28,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.AppStateHandler
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.analytics.AnalyticsTracker
     import im.vector.app.features.analytics.plan.CreatedRoom
    @@ -138,7 +137,7 @@ class CreateRoomViewModel @AssistedInject constructor(
                 CreateRoomAction.Reset                    -> doReset()
                 CreateRoomAction.ToggleShowAdvanced       -> toggleShowAdvanced()
                 is CreateRoomAction.DisableFederation     -> disableFederation(action)
    -        }.exhaustive
    +        }
         }
     
         private fun disableFederation(action: CreateRoomAction.DisableFederation) {
    @@ -281,7 +280,7 @@ class CreateRoomViewModel @AssistedInject constructor(
                                 // Preset
                                 preset = CreateRoomPreset.PRESET_PRIVATE_CHAT
                             }
    -                    }.exhaustive
    +                    }
                         // Disabling federation
                         disableFederation = state.disableFederation
     
    diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerViewModel.kt
    index a5673e78a2..51af9a8286 100644
    --- a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryPickerViewModel.kt
    @@ -27,7 +27,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.EmptyViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
    @@ -104,7 +103,7 @@ class RoomDirectoryPickerViewModel @AssistedInject constructor(
                 is RoomDirectoryPickerAction.SetServerUrl -> handleSetServerUrl(action)
                 RoomDirectoryPickerAction.Submit          -> handleSubmit()
                 is RoomDirectoryPickerAction.RemoveServer -> handleRemoveServer(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleEnterEditMode() {
    diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewViewModel.kt
    index 42bec8c8b3..a22dc7ed95 100644
    --- a/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewViewModel.kt
    @@ -24,7 +24,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.EmptyViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.analytics.AnalyticsTracker
    @@ -204,7 +203,7 @@ class RoomPreviewViewModel @AssistedInject constructor(
             when (action) {
                 is RoomPreviewAction.Join        -> handleJoinRoom()
                 RoomPreviewAction.JoinThirdParty -> handleJoinRoomThirdParty()
    -        }.exhaustive
    +        }
         }
     
         private fun handleJoinRoomThirdParty() = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
    index 44e7405ee5..d9ed6d227a 100644
    --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
    @@ -39,7 +39,6 @@ import im.vector.app.core.dialogs.ConfirmationDialogBuilder
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
     import im.vector.app.core.extensions.copyOnLongClick
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.setTextOrHide
     import im.vector.app.core.platform.StateView
     import im.vector.app.core.platform.VectorBaseFragment
    @@ -134,7 +133,7 @@ class RoomMemberProfileFragment @Inject constructor(
                     is RoomMemberProfileViewEvents.OnBanActionSuccess          -> Unit
                     is RoomMemberProfileViewEvents.OnIgnoreActionSuccess       -> Unit
                     is RoomMemberProfileViewEvents.OnInviteActionSuccess       -> Unit
    -            }.exhaustive
    +            }
             }
             setupLongClicks()
         }
    diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
    index a79a9f4c1d..db54f27910 100644
    --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
    @@ -28,7 +28,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.mvrx.runCatchingToAsync
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
    @@ -170,7 +169,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor(
                 RoomMemberProfileAction.InviteUser                -> handleInviteAction()
                 is RoomMemberProfileAction.SetUserColorOverride   -> handleSetUserColorOverride(action)
                 is RoomMemberProfileAction.OpenOrCreateDm         -> handleOpenOrCreateDm(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleOpenOrCreateDm(action: RoomMemberProfileAction.OpenOrCreateDm) {
    diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheet.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheet.kt
    index bb2317b59c..8df0b3ffd5 100644
    --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheet.kt
    +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheet.kt
    @@ -29,7 +29,6 @@ import com.airbnb.mvrx.withState
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.R
     import im.vector.app.core.extensions.commitTransaction
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
     import im.vector.app.databinding.BottomSheetWithFragmentsBinding
     import im.vector.app.features.crypto.verification.VerificationBottomSheet
    @@ -57,7 +56,7 @@ class DeviceListBottomSheet :
                                 transactionId = it.txID
                         ).show(requireActivity().supportFragmentManager, "REQPOP")
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt
    index d2491237ca..03e07a2f82 100644
    --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt
    @@ -28,7 +28,6 @@ import dagger.hilt.EntryPoints
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.SingletonEntryPoint
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import org.matrix.android.sdk.api.session.Session
     import org.matrix.android.sdk.api.session.crypto.crosssigning.MXCrossSigningInfo
    @@ -94,7 +93,7 @@ class DeviceListBottomSheetViewModel @AssistedInject constructor(@Assisted priva
                 is DeviceListAction.SelectDevice   -> selectDevice(action)
                 is DeviceListAction.DeselectDevice -> deselectDevice()
                 is DeviceListAction.ManuallyVerify -> manuallyVerify(action)
    -        }.exhaustive
    +        }
         }
     
         private fun refreshSelectedId() = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt
    index 4c6d2ed2e3..12a5d94eca 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt
    @@ -26,7 +26,6 @@ import com.airbnb.mvrx.viewModel
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.core.extensions.addFragment
     import im.vector.app.core.extensions.addFragmentToBackstack
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseActivity
     import im.vector.app.databinding.ActivitySimpleBinding
     import im.vector.app.features.home.room.detail.RoomDetailPendingActionStore
    @@ -102,7 +101,7 @@ class RoomProfileActivity :
                             RoomProfileSharedAction.OpenRoomUploads                 -> openRoomUploads()
                             RoomProfileSharedAction.OpenBannedRoomMembers        -> openBannedRoomMembers()
                             RoomProfileSharedAction.OpenRoomNotificationSettings -> openRoomNotificationSettings()
    -                    }.exhaustive
    +                    }
                     }
                     .launchIn(lifecycleScope)
     
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt
    index b13ef2a5d1..ba9280dc59 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt
    @@ -37,7 +37,6 @@ import im.vector.app.core.animations.MatrixItemAppBarStateChangeListener
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
     import im.vector.app.core.extensions.copyOnLongClick
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.setTextOrHide
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.utils.copyToClipboard
    @@ -127,7 +126,7 @@ class RoomProfileFragment @Inject constructor(
                     is RoomProfileViewEvents.ShareRoomProfile -> onShareRoomProfile(it.permalink)
                     is RoomProfileViewEvents.OnShortcutReady  -> addShortcut(it)
                     RoomProfileViewEvents.DismissLoading      -> dismissLoadingDialog()
    -            }.exhaustive
    +            }
             }
             roomListQuickActionsSharedActionViewModel
                     .stream()
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt
    index b7c7d24888..61013c8eb6 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt
    @@ -24,7 +24,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.features.home.ShortcutCreator
    @@ -137,7 +136,7 @@ class RoomProfileViewModel @AssistedInject constructor(
                 is RoomProfileAction.ShareRoomProfile            -> handleShareRoomProfile()
                 RoomProfileAction.CreateShortcut                 -> handleCreateShortcut()
                 RoomProfileAction.RestoreEncryptionState         -> restoreEncryptionState()
    -        }.exhaustive
    +        }
         }
     
         fun isPublicRoom(): Boolean {
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt
    index e48ce54e6c..2a738fd07c 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasFragment.kt
    @@ -29,7 +29,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.utils.shareText
     import im.vector.app.core.utils.toast
    @@ -77,7 +76,7 @@ class RoomAliasFragment @Inject constructor(
                 when (it) {
                     is RoomAliasViewEvents.Failure -> showFailure(it.throwable)
                     RoomAliasViewEvents.Success    -> showSuccess()
    -            }.exhaustive
    +            }
             }
     
             sharedActionViewModel
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt
    index 19f600e5de..adffbcbd06 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt
    @@ -26,7 +26,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
     import kotlinx.coroutines.flow.launchIn
    @@ -190,7 +189,7 @@ class RoomAliasViewModel @AssistedInject constructor(@Assisted initialState: Roo
                 is RoomAliasAction.RemoveLocalAlias           -> handleRemoveLocalAlias(action)
                 is RoomAliasAction.PublishAlias               -> handlePublishAlias(action)
                 RoomAliasAction.Retry                         -> handleRetry()
    -        }.exhaustive
    +        }
         }
     
         private fun handleRetry() = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/banned/RoomBannedMemberListViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/banned/RoomBannedMemberListViewModel.kt
    index d7efc2fb79..ec249c75ba 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/banned/RoomBannedMemberListViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/banned/RoomBannedMemberListViewModel.kt
    @@ -23,7 +23,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
    @@ -84,7 +83,7 @@ class RoomBannedMemberListViewModel @AssistedInject constructor(@Assisted initia
                 is RoomBannedMemberListAction.QueryInfo -> onQueryBanInfo(action.roomMemberSummary)
                 is RoomBannedMemberListAction.UnBanUser -> unBanUser(action.roomMemberSummary)
                 is RoomBannedMemberListAction.Filter    -> handleFilter(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleFilter(action: RoomBannedMemberListAction.Filter) {
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt
    index 0bbdd87f3e..c9a70fbef8 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/members/RoomMemberListViewModel.kt
    @@ -23,7 +23,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.EmptyViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
    @@ -181,7 +180,7 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState
             when (action) {
                 is RoomMemberListAction.RevokeThreePidInvite -> handleRevokeThreePidInvite(action)
                 is RoomMemberListAction.FilterMemberList     -> handleFilterMemberList(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleRevokeThreePidInvite(action: RoomMemberListAction.RevokeThreePidInvite) {
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsFragment.kt
    index 0d5ac7dea8..c1175796fb 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsFragment.kt
    @@ -27,7 +27,6 @@ import com.airbnb.mvrx.withState
     import im.vector.app.R
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.utils.toast
     import im.vector.app.databinding.FragmentRoomSettingGenericBinding
    @@ -67,7 +66,7 @@ class RoomPermissionsFragment @Inject constructor(
                 when (it) {
                     is RoomPermissionsViewEvents.Failure -> showFailure(it.throwable)
                     RoomPermissionsViewEvents.Success    -> showSuccess()
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt
    index 7e8a66d12a..6fbc545b6c 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsViewModel.kt
    @@ -23,7 +23,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
     import kotlinx.coroutines.flow.launchIn
    @@ -90,7 +89,7 @@ class RoomPermissionsViewModel @AssistedInject constructor(@Assisted initialStat
             when (action) {
                 is RoomPermissionsAction.UpdatePermission      -> updatePermission(action)
                 RoomPermissionsAction.ToggleShowAllPermissions -> toggleShowAllPermissions()
    -        }.exhaustive
    +        }
         }
     
         private fun toggleShowAllPermissions() {
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt
    index 51f6b247d4..0bde35f41e 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/settings/RoomSettingsFragment.kt
    @@ -33,7 +33,6 @@ import im.vector.app.R
     import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.intent.getFilenameFromUri
     import im.vector.app.core.platform.OnBackPressed
     import im.vector.app.core.platform.VectorBaseFragment
    @@ -98,7 +97,7 @@ class RoomSettingsFragment @Inject constructor(
                         ignoreChanges = true
                         vectorBaseActivity.onBackPressed()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    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 a0325cfc2b..8ad5bcdce6 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
    @@ -23,7 +23,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.powerlevel.PowerLevelsFlowFactory
     import im.vector.app.features.settings.VectorPreferences
    @@ -201,7 +200,7 @@ class RoomSettingsViewModel @AssistedInject constructor(@Assisted initialState:
                 is RoomSettingsAction.SetRoomGuestAccess       -> handleSetGuestAccess(action)
                 is RoomSettingsAction.Save                     -> saveSettings()
                 is RoomSettingsAction.Cancel                   -> cancel()
    -        }.exhaustive
    +        }
         }
     
         private fun handleSetRoomJoinRule(action: RoomSettingsAction.SetRoomJoinRule) = withState { state ->
    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 548ec9cfe4..f1897761b2 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
    @@ -29,7 +29,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.core.utils.styleMatchingText
    @@ -180,7 +179,7 @@ class RoomJoinRuleChooseRestrictedViewModel @AssistedInject constructor(
                 is RoomJoinRuleChooseRestrictedActions.SelectJoinRules            -> handleSelectRule(action)
                 is RoomJoinRuleChooseRestrictedActions.SwitchToRoomAfterMigration -> handleSwitchToRoom(action)
                 RoomJoinRuleChooseRestrictedActions.DoUpdateJoinRules             -> handleSubmit()
    -        }.exhaustive
    +        }
             checkForChanges()
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt
    index a0adf42d5b..6a115ad272 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt
    @@ -28,7 +28,6 @@ import com.airbnb.mvrx.withState
     import com.google.android.material.appbar.AppBarLayout
     import com.google.android.material.tabs.TabLayoutMediator
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.intent.getMimeTypeFromUri
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.utils.saveMedia
    @@ -99,7 +98,7 @@ class RoomUploadsFragment @Inject constructor(
                         Unit
                     }
                     is RoomUploadsViewEvents.Failure             -> showFailure(it.throwable)
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsViewModel.kt
    index 92ff33395e..c9aaca4373 100644
    --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsViewModel.kt
    @@ -25,7 +25,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import kotlinx.coroutines.launch
     import org.matrix.android.sdk.api.session.Session
    @@ -110,7 +109,7 @@ class RoomUploadsViewModel @AssistedInject constructor(
                 is RoomUploadsAction.Share    -> handleShare(action)
                 RoomUploadsAction.Retry       -> handleLoadMore()
                 RoomUploadsAction.LoadMore    -> handleLoadMore()
    -        }.exhaustive
    +        }
         }
     
         private fun handleShare(action: RoomUploadsAction.Share) {
    diff --git a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountFragment.kt b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountFragment.kt
    index 631c375e62..4397da00c4 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/account/deactivation/DeactivateAccountFragment.kt
    @@ -25,7 +25,6 @@ import android.view.ViewGroup
     import androidx.appcompat.app.AppCompatActivity
     import com.airbnb.mvrx.fragmentViewModel
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.registerStartForActivityResult
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.databinding.FragmentDeactivateAccountBinding
    @@ -128,7 +127,7 @@ class DeactivateAccountFragment @Inject constructor() : VectorBaseFragment {
                         views.waitingView.waitingView.isVisible = false
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/settings/crosssigning/CrossSigningSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/crosssigning/CrossSigningSettingsViewModel.kt
    index 644b7f33dd..5e691f64b2 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/crosssigning/CrossSigningSettingsViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/crosssigning/CrossSigningSettingsViewModel.kt
    @@ -22,7 +22,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.features.auth.ReAuthActivity
    @@ -146,7 +145,7 @@ class CrossSigningSettingsViewModel @AssistedInject constructor(
                     uiaContinuation = null
                     pendingAuth = null
                 }
    -        }.exhaustive
    +        }
         }
     
         private fun handleInitializeXSigningError(failure: Throwable) {
    diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/VectorSettingsDevicesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/VectorSettingsDevicesFragment.kt
    index 5bbb03c8a4..407af19151 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/devices/VectorSettingsDevicesFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/devices/VectorSettingsDevicesFragment.kt
    @@ -32,7 +32,6 @@ import im.vector.app.R
     import im.vector.app.core.dialogs.ManuallyVerifyDialog
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.registerStartForActivityResult
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.databinding.DialogBaseEditTextBinding
    @@ -90,7 +89,7 @@ class VectorSettingsDevicesFragment @Inject constructor(
                             viewModel.handle(DevicesAction.MarkAsManuallyVerified(it.cryptoDeviceInfo))
                         }
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataViewModel.kt
    index 6289699687..9576b84e98 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataViewModel.kt
    @@ -25,7 +25,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.EmptyViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import kotlinx.coroutines.launch
    @@ -51,7 +50,7 @@ class AccountDataViewModel @AssistedInject constructor(@Assisted initialState: A
         override fun handle(action: AccountDataAction) {
             when (action) {
                 is AccountDataAction.DeleteAccountData -> handleDeleteAccountData(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleDeleteAccountData(action: AccountDataAction.DeleteAccountData) {
    diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestViewModel.kt
    index f480eb2db8..fd1cd3480d 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestViewModel.kt
    @@ -29,7 +29,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.platform.VectorViewModelAction
    @@ -64,7 +63,7 @@ class KeyRequestViewModel @AssistedInject constructor(
         override fun handle(action: KeyRequestAction) {
             when (action) {
                 is KeyRequestAction.ExportAudit -> exportAudit(action)
    -        }.exhaustive
    +        }
         }
     
         private fun exportAudit(action: KeyRequestAction.ExportAudit) {
    diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt
    index d807fc620a..db2d07feef 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt
    @@ -33,7 +33,6 @@ import com.airbnb.mvrx.fragmentViewModel
     import com.airbnb.mvrx.withState
     import com.google.android.material.tabs.TabLayoutMediator
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.registerStartForActivityResult
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.utils.selectTxtFileToWrite
    @@ -111,7 +110,7 @@ class KeyRequestsFragment @Inject constructor() : VectorBaseFragment os.write(it.raw.toByteArray()) }
                         }
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
    index 509014492d..5c188fe933 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
    @@ -30,7 +30,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.databinding.FragmentGenericRecyclerBinding
     import javax.inject.Inject
    @@ -57,7 +56,7 @@ class VectorSettingsIgnoredUsersFragment @Inject constructor(
                 when (it) {
                     is IgnoredUsersViewEvents.Loading -> showLoading(it.message)
                     is IgnoredUsersViewEvents.Failure -> showFailure(it.throwable)
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/settings/legals/LegalsViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/legals/LegalsViewModel.kt
    index 9d58535490..1497c793c2 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/legals/LegalsViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/legals/LegalsViewModel.kt
    @@ -25,7 +25,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.EmptyViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
    @@ -50,7 +49,7 @@ class LegalsViewModel @AssistedInject constructor(
         override fun handle(action: LegalsAction) {
             when (action) {
                 LegalsAction.Refresh -> loadData()
    -        }.exhaustive
    +        }
         }
     
         private fun loadData() = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerFragment.kt b/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerFragment.kt
    index 601574c908..d46b66dd87 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerFragment.kt
    @@ -26,7 +26,6 @@ import com.airbnb.mvrx.withState
     import im.vector.app.R
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.restart
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.databinding.FragmentLocalePickerBinding
    @@ -54,7 +53,7 @@ class LocalePickerFragment @Inject constructor(
                     LocalePickerViewEvents.RestartActivity -> {
                         activity?.restart()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerViewModel.kt
    index d6b35fa4fe..0bbbc323e0 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerViewModel.kt
    @@ -23,7 +23,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.configuration.VectorConfiguration
     import im.vector.app.features.settings.VectorLocale
    @@ -56,7 +55,7 @@ class LocalePickerViewModel @AssistedInject constructor(
         override fun handle(action: LocalePickerAction) {
             when (action) {
                 is LocalePickerAction.SelectLocale -> handleSelectLocale(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleSelectLocale(action: LocalePickerAction.SelectLocale) {
    diff --git a/vector/src/main/java/im/vector/app/features/settings/push/PushGatewaysFragment.kt b/vector/src/main/java/im/vector/app/features/settings/push/PushGatewaysFragment.kt
    index 65c62542bb..73a74b1e3f 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/push/PushGatewaysFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/push/PushGatewaysFragment.kt
    @@ -28,7 +28,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.databinding.FragmentGenericRecyclerBinding
     import org.matrix.android.sdk.api.session.pushers.Pusher
    @@ -78,7 +77,7 @@ class PushGatewaysFragment @Inject constructor(
                                 .setPositiveButton(android.R.string.ok, null)
                                 .show()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/settings/push/PushGatewaysViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/push/PushGatewaysViewModel.kt
    index 1256673364..4d95447f2d 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/push/PushGatewaysViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/push/PushGatewaysViewModel.kt
    @@ -25,7 +25,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import kotlinx.coroutines.launch
     import org.matrix.android.sdk.api.session.Session
    @@ -65,7 +64,7 @@ class PushGatewaysViewModel @AssistedInject constructor(@Assisted initialState:
             when (action) {
                 is PushGatewayAction.Refresh      -> handleRefresh()
                 is PushGatewayAction.RemovePusher -> removePusher(action.pusher)
    -        }.exhaustive
    +        }
         }
     
         private fun removePusher(pusher: Pusher) {
    diff --git a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsController.kt b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsController.kt
    index 7fd2292274..61d93b6f5f 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsController.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsController.kt
    @@ -26,7 +26,6 @@ import im.vector.app.R
     import im.vector.app.core.epoxy.loadingItem
     import im.vector.app.core.epoxy.noResultItem
     import im.vector.app.core.error.ErrorFormatter
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.getFormattedValue
     import im.vector.app.core.resources.ColorProvider
     import im.vector.app.core.resources.StringProvider
    @@ -162,7 +161,7 @@ class ThreePidsSettingsController @Inject constructor(
                     }
                 }
                 is ThreePidsSettingsUiState.AddingPhoneNumber -> Unit
    -        }.exhaustive
    +        }
     
             settingsSectionTitleItem {
                 id("msisdn")
    @@ -225,7 +224,7 @@ class ThreePidsSettingsController @Inject constructor(
                         cancelOnClick { host.interactionListener?.cancelAdding() }
                     }
                 }
    -        }.exhaustive
    +        }
         }
     
         private fun buildThreePid(idPrefix: String, threePid: ThreePid) {
    diff --git a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsFragment.kt
    index bdb1fb895f..ee7f8efab4 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsFragment.kt
    @@ -28,7 +28,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.getFormattedValue
     import im.vector.app.core.extensions.hideKeyboard
     import im.vector.app.core.extensions.isEmail
    @@ -64,7 +63,7 @@ class ThreePidsSettingsFragment @Inject constructor(
                 when (it) {
                     is ThreePidsSettingsViewEvents.Failure -> displayErrorDialog(it.throwable)
                     is ThreePidsSettingsViewEvents.RequestReAuth -> askAuthentication(it)
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsViewModel.kt
    index 12ff436ccb..acbe893d58 100644
    --- a/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/settings/threepids/ThreePidsSettingsViewModel.kt
    @@ -25,7 +25,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
     import im.vector.app.core.utils.ReadOnceTrue
    @@ -149,7 +148,7 @@ class ThreePidsSettingsViewModel @AssistedInject constructor(
                     uiaContinuation = null
                     pendingAuth = null
                 }
    -        }.exhaustive
    +        }
         }
     
         var uiaContinuation: Continuation? = null
    diff --git a/vector/src/main/java/im/vector/app/features/share/IncomingShareFragment.kt b/vector/src/main/java/im/vector/app/features/share/IncomingShareFragment.kt
    index 62fb064536..9dc433e96f 100644
    --- a/vector/src/main/java/im/vector/app/features/share/IncomingShareFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/share/IncomingShareFragment.kt
    @@ -34,7 +34,6 @@ import im.vector.app.R
     import im.vector.app.core.di.ActiveSessionHolder
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.registerStartForActivityResult
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.databinding.FragmentIncomingShareBinding
    @@ -81,7 +80,7 @@ class IncomingShareFragment @Inject constructor(
                     is IncomingShareViewEvents.ShareToRoom            -> handleShareToRoom(it)
                     is IncomingShareViewEvents.EditMediaBeforeSending -> handleEditMediaBeforeSending(it)
                     is IncomingShareViewEvents.MultipleRoomsShareDone -> handleMultipleRoomsShareDone(it)
    -            }.exhaustive
    +            }
             }
     
             val intent = vectorBaseActivity.intent
    diff --git a/vector/src/main/java/im/vector/app/features/share/IncomingShareViewModel.kt b/vector/src/main/java/im/vector/app/features/share/IncomingShareViewModel.kt
    index 4a413ad8ba..ca4148ebb7 100644
    --- a/vector/src/main/java/im/vector/app/features/share/IncomingShareViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/share/IncomingShareViewModel.kt
    @@ -22,7 +22,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.toggle
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.features.attachments.isPreviewable
    @@ -96,7 +95,7 @@ class IncomingShareViewModel @AssistedInject constructor(
                 is IncomingShareAction.ShareMedia           -> handleShareMediaToSelectedRooms(action)
                 is IncomingShareAction.FilterWith           -> handleFilter(action)
                 is IncomingShareAction.UpdateSharedData     -> handleUpdateSharedData(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleUpdateSharedData(action: IncomingShareAction.UpdateSharedData) {
    @@ -127,7 +126,7 @@ class IncomingShareViewModel @AssistedInject constructor(
                     is SharedData.Attachments -> {
                         shareAttachments(sharedData.attachmentData, state.selectedRoomIds, proposeMediaEdition = true, compressMediaBeforeSending = false)
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt
    index fb7786e3bd..1fc131ca86 100644
    --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListFragment.kt
    @@ -29,7 +29,6 @@ import com.airbnb.mvrx.fragmentViewModel
     import com.airbnb.mvrx.withState
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.StateView
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.databinding.FragmentGroupListBinding
    @@ -110,7 +109,7 @@ class SpaceListFragment @Inject constructor(
                     is SpaceListViewEvents.AddSpace         -> sharedActionViewModel.post(HomeActivitySharedAction.AddSpace)
                     is SpaceListViewEvents.OpenGroup        -> sharedActionViewModel.post(HomeActivitySharedAction.OpenGroup(it.groupingMethodHasChanged))
                     is SpaceListViewEvents.OpenSpaceInvite  -> sharedActionViewModel.post(HomeActivitySharedAction.OpenSpaceInvite(it.id))
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt
    index 8ddeab3223..2b8276a4d7 100644
    --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt
    @@ -29,7 +29,6 @@ import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
     import im.vector.app.core.error.ErrorFormatter
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.isEmail
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.resources.StringProvider
    @@ -192,7 +191,7 @@ class CreateSpaceViewModel @AssistedInject constructor(
                 is CreateSpaceAction.SetSpaceTopology         -> {
                     handleSetTopology(action)
                 }
    -        }.exhaustive
    +        }
         }
     
         private fun handleSetTopology(action: CreateSpaceAction.SetSpaceTopology) {
    diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageSharedViewModel.kt
    index bedd1873e8..2a2598075f 100644
    --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageSharedViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceManageSharedViewModel.kt
    @@ -22,7 +22,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import org.matrix.android.sdk.api.session.Session
     
    @@ -51,6 +50,6 @@ class SpaceManageSharedViewModel @AssistedInject constructor(
                 SpaceManagedSharedAction.ManageRooms                 -> _viewEvents.post(SpaceManagedSharedViewEvents.NavigateToManageRooms)
                 SpaceManagedSharedAction.OpenSpaceAliasesSettings    -> _viewEvents.post(SpaceManagedSharedViewEvents.NavigateToAliasSettings)
                 SpaceManagedSharedAction.OpenSpacePermissionSettings -> _viewEvents.post(SpaceManagedSharedViewEvents.NavigateToPermissionSettings)
    -        }.exhaustive
    +        }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsFragment.kt
    index 266d08fd12..db9420abc2 100644
    --- a/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/spaces/manage/SpaceSettingsFragment.kt
    @@ -34,7 +34,6 @@ import im.vector.app.R
     import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.intent.getFilenameFromUri
     import im.vector.app.core.platform.OnBackPressed
     import im.vector.app.core.platform.VectorBaseFragment
    @@ -102,7 +101,7 @@ class SpaceSettingsFragment @Inject constructor(
                         ignoreChanges = true
                         vectorBaseActivity.onBackPressed()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt
    index 55d1dbe61e..2e386697d4 100644
    --- a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt
    @@ -25,7 +25,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.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
    @@ -52,7 +51,7 @@ class SpacePeopleViewModel @AssistedInject constructor(
             when (action) {
                 is SpacePeopleViewAction.ChatWith   -> handleChatWith(action)
                 SpacePeopleViewAction.InviteToSpace -> handleInviteToSpace()
    -        }.exhaustive
    +        }
         }
     
         private fun handleInviteToSpace() {
    diff --git a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsActivity.kt b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsActivity.kt
    index e6071fdd2a..9a86e550a8 100644
    --- a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsActivity.kt
    @@ -23,7 +23,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.R
     import im.vector.app.core.error.ErrorFormatter
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.replaceFragment
     import im.vector.app.core.platform.SimpleFragmentActivity
     import org.matrix.android.sdk.api.session.terms.TermsService
    @@ -63,7 +62,7 @@ class ReviewTermsActivity : SimpleFragmentActivity() {
                         setResult(Activity.RESULT_OK)
                         finish()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsFragment.kt b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsFragment.kt
    index cb76e5b31f..53afbf7a07 100644
    --- a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsFragment.kt
    @@ -29,7 +29,6 @@ import im.vector.app.R
     import im.vector.app.core.epoxy.onClick
     import im.vector.app.core.extensions.cleanup
     import im.vector.app.core.extensions.configureWith
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorBaseFragment
     import im.vector.app.core.utils.openUrlInChromeCustomTab
     import im.vector.app.databinding.FragmentReviewTermsBinding
    @@ -70,7 +69,7 @@ class ReviewTermsFragment @Inject constructor(
                     ReviewTermsViewEvents.Success    -> {
                         // Handled by the Activity
                     }
    -            }.exhaustive
    +            }
             }
     
             reviewTermsViewModel.handle(ReviewTermsAction.LoadTerms(getString(R.string.resources_language)))
    diff --git a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsViewModel.kt b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsViewModel.kt
    index 9932efb11a..8fe1f598f6 100644
    --- a/vector/src/main/java/im/vector/app/features/terms/ReviewTermsViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/terms/ReviewTermsViewModel.kt
    @@ -24,7 +24,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.VectorViewModel
     import kotlinx.coroutines.launch
     import org.matrix.android.sdk.api.session.Session
    @@ -49,7 +48,7 @@ class ReviewTermsViewModel @AssistedInject constructor(
                 is ReviewTermsAction.LoadTerms          -> loadTerms(action)
                 is ReviewTermsAction.MarkTermAsAccepted -> markTermAsAccepted(action)
                 ReviewTermsAction.Accept                -> acceptTerms()
    -        }.exhaustive
    +        }
         }
     
         private fun markTermAsAccepted(action: ReviewTermsAction.MarkTermAsAccepted) = withState { state ->
    diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt
    index 356893aee2..9e0aa15297 100644
    --- a/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt
    @@ -30,7 +30,6 @@ import com.airbnb.mvrx.viewModel
     import com.airbnb.mvrx.withState
     import dagger.hilt.android.AndroidEntryPoint
     import im.vector.app.R
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.replaceFragment
     import im.vector.app.core.platform.VectorBaseActivity
     import im.vector.app.core.utils.onPermissionDeniedSnackbar
    @@ -127,7 +126,7 @@ class UserCodeActivity : VectorBaseActivity(),
                         Toast.makeText(this, R.string.qr_code_not_scanned, Toast.LENGTH_SHORT).show()
                         finish()
                     }
    -            }.exhaustive
    +            }
             }
         }
     
    @@ -153,7 +152,7 @@ class UserCodeActivity : VectorBaseActivity(),
                 UserCodeState.Mode.SHOW -> super.onBackPressed()
                 is UserCodeState.Mode.RESULT,
                 UserCodeState.Mode.SCAN -> sharedViewModel.handle(UserCodeActions.SwitchMode(UserCodeState.Mode.SHOW))
    -        }.exhaustive
    +        }
         }
     
         companion object {
    diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt
    index 61f8bc35f3..039c7041b0 100644
    --- a/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/userdirectory/UserListViewModel.kt
    @@ -26,7 +26,6 @@ import dagger.assisted.AssistedInject
     import im.vector.app.R
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.extensions.isEmail
     import im.vector.app.core.extensions.toggle
     import im.vector.app.core.platform.VectorViewModel
    @@ -113,7 +112,7 @@ class UserListViewModel @AssistedInject constructor(
                 UserListAction.UserConsentRequest            -> handleUserConsentRequest()
                 is UserListAction.UpdateUserConsent          -> handleISUpdateConsent(action)
                 UserListAction.Resumed                       -> handleResumed()
    -        }.exhaustive
    +        }
         }
     
         private fun handleUserConsentRequest() {
    diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt b/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt
    index 4daaef6fe1..fbc0b8fcff 100644
    --- a/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/workers/signout/SignoutCheckViewModel.kt
    @@ -28,7 +28,6 @@ import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
     import im.vector.app.core.di.MavericksAssistedViewModelFactory
     import im.vector.app.core.di.hiltMavericksViewModelFactory
    -import im.vector.app.core.extensions.exhaustive
     import im.vector.app.core.platform.EmptyViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.platform.VectorViewModelAction
    @@ -124,7 +123,7 @@ class SignoutCheckViewModel @AssistedInject constructor(
                         copy(hasBeenExportedToFile = Success(true))
                     }
                 }
    -        }.exhaustive
    +        }
         }
     
         private fun handleExportKeys(action: Actions.ExportKeys) {
    
    From f791ddb7bb3feffa4ff322e694afdddd3a0fbf2b Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 15:57:10 +0100
    Subject: [PATCH 105/126] Small cleanup
    
    ---
     .../im/vector/app/features/invite/InviteUsersToRoomActivity.kt | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
    index 48a70fb164..7bb6670e96 100644
    --- a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
    +++ b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
    @@ -74,8 +74,7 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity() {
                             is UserListSharedAction.OnMenuItemSelected -> onMenuItemSelected(sharedAction)
                             UserListSharedAction.OpenPhoneBook         -> openPhoneBook()
                             // not exhaustive because it's a sharedAction
    -                        else                                       -> {
    -                        }
    +                        else                                       -> Unit
                         }
                     }
                     .launchIn(lifecycleScope)
    
    From 86829008c31e4a650ccf3ab4b7f327f322fbecd5 Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 16:33:31 +0100
    Subject: [PATCH 106/126] runBlockingTest -> runTest
     https://github.com/Kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-test/MIGRATION.md
    
    ---
     .../space/DefaultResolveSpaceInfoTaskTest.kt  |   6 +-
     .../impl/DefaultVectorAnalyticsTest.kt        |  22 +--
     .../impl/LateInitUserPropertiesFactoryTest.kt |   8 +-
     .../quads/SharedSecureStorageViewModelTest.kt | 164 ++++++++----------
     .../usecase/CompareLocationsUseCaseTest.kt    |   6 +-
     .../usecase/DownloadMediaUseCaseTest.kt       |   6 +-
     .../onboarding/OnboardingViewModelTest.kt     |  36 ++--
     .../RegistrationActionHandlerTest.kt          |   4 +-
     8 files changed, 120 insertions(+), 132 deletions(-)
    
    diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/space/DefaultResolveSpaceInfoTaskTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/space/DefaultResolveSpaceInfoTaskTest.kt
    index f80c0f06d0..7203f89629 100644
    --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/space/DefaultResolveSpaceInfoTaskTest.kt
    +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/space/DefaultResolveSpaceInfoTaskTest.kt
    @@ -17,7 +17,7 @@
     package org.matrix.android.sdk.internal.session.space
     
     import kotlinx.coroutines.ExperimentalCoroutinesApi
    -import kotlinx.coroutines.test.runBlockingTest
    +import kotlinx.coroutines.test.runTest
     import okhttp3.ResponseBody.Companion.toResponseBody
     import org.amshove.kluent.shouldBeEqualTo
     import org.junit.Test
    @@ -35,7 +35,7 @@ internal class DefaultResolveSpaceInfoTaskTest {
         private val resolveSpaceInfoTask = DefaultResolveSpaceInfoTask(spaceApi.instance, globalErrorReceiver)
     
         @Test
    -    fun `given stable endpoint works, when execute, then return stable api data`() = runBlockingTest {
    +    fun `given stable endpoint works, when execute, then return stable api data`() = runTest {
             spaceApi.givenStableEndpointReturns(response)
     
             val result = resolveSpaceInfoTask.execute(spaceApi.params)
    @@ -44,7 +44,7 @@ internal class DefaultResolveSpaceInfoTaskTest {
         }
     
         @Test
    -    fun `given stable endpoint fails, when execute, then fallback to unstable endpoint`() = runBlockingTest {
    +    fun `given stable endpoint fails, when execute, then fallback to unstable endpoint`() = runTest {
             spaceApi.givenStableEndpointThrows(httpException)
             spaceApi.givenUnstableEndpointReturns(response)
     
    diff --git a/vector/src/test/java/im/vector/app/features/analytics/impl/DefaultVectorAnalyticsTest.kt b/vector/src/test/java/im/vector/app/features/analytics/impl/DefaultVectorAnalyticsTest.kt
    index b17c1a8bba..543d517db1 100644
    --- a/vector/src/test/java/im/vector/app/features/analytics/impl/DefaultVectorAnalyticsTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/analytics/impl/DefaultVectorAnalyticsTest.kt
    @@ -30,7 +30,7 @@ import im.vector.app.test.fixtures.aVectorAnalyticsScreen
     import kotlinx.coroutines.CoroutineScope
     import kotlinx.coroutines.Dispatchers
     import kotlinx.coroutines.ExperimentalCoroutinesApi
    -import kotlinx.coroutines.test.runBlockingTest
    +import kotlinx.coroutines.test.runTest
     import org.junit.Before
     import org.junit.Test
     
    @@ -60,35 +60,35 @@ class DefaultVectorAnalyticsTest {
         }
     
         @Test
    -    fun `when setting user consent then updates analytics store`() = runBlockingTest {
    +    fun `when setting user consent then updates analytics store`() = runTest {
             defaultVectorAnalytics.setUserConsent(true)
     
             fakeAnalyticsStore.verifyConsentUpdated(updatedValue = true)
         }
     
         @Test
    -    fun `when consenting to analytics then updates posthog opt out to false`() = runBlockingTest {
    +    fun `when consenting to analytics then updates posthog opt out to false`() = runTest {
             fakeAnalyticsStore.givenUserContent(consent = true)
     
             fakePostHog.verifyOptOutStatus(optedOut = false)
         }
     
         @Test
    -    fun `when revoking consent to analytics then updates posthog opt out to true`() = runBlockingTest {
    +    fun `when revoking consent to analytics then updates posthog opt out to true`() = runTest {
             fakeAnalyticsStore.givenUserContent(consent = false)
     
             fakePostHog.verifyOptOutStatus(optedOut = true)
         }
     
         @Test
    -    fun `when setting the analytics id then updates analytics store`() = runBlockingTest {
    +    fun `when setting the analytics id then updates analytics store`() = runTest {
             defaultVectorAnalytics.setAnalyticsId(AN_ANALYTICS_ID)
     
             fakeAnalyticsStore.verifyAnalyticsIdUpdated(updatedValue = AN_ANALYTICS_ID)
         }
     
         @Test
    -    fun `given lateinit user properties when valid analytics id updates then identify with lateinit properties`() = runBlockingTest {
    +    fun `given lateinit user properties when valid analytics id updates then identify with lateinit properties`() = runTest {
             fakeLateInitUserPropertiesFactory.givenCreatesProperties(A_LATE_INIT_USER_PROPERTIES)
     
             fakeAnalyticsStore.givenAnalyticsId(AN_ANALYTICS_ID)
    @@ -97,7 +97,7 @@ class DefaultVectorAnalyticsTest {
         }
     
         @Test
    -    fun `when signing out then resets posthog`() = runBlockingTest {
    +    fun `when signing out then resets posthog`() = runTest {
             fakeAnalyticsStore.allowSettingAnalyticsIdToCallBackingFlow()
     
             defaultVectorAnalytics.onSignOut()
    @@ -106,7 +106,7 @@ class DefaultVectorAnalyticsTest {
         }
     
         @Test
    -    fun `given user consent when tracking screen events then submits to posthog`() = runBlockingTest {
    +    fun `given user consent when tracking screen events then submits to posthog`() = runTest {
             fakeAnalyticsStore.givenUserContent(consent = true)
     
             defaultVectorAnalytics.screen(A_SCREEN_EVENT)
    @@ -115,7 +115,7 @@ class DefaultVectorAnalyticsTest {
         }
     
         @Test
    -    fun `given user has not consented when tracking screen events then does not track`() = runBlockingTest {
    +    fun `given user has not consented when tracking screen events then does not track`() = runTest {
             fakeAnalyticsStore.givenUserContent(consent = false)
     
             defaultVectorAnalytics.screen(A_SCREEN_EVENT)
    @@ -124,7 +124,7 @@ class DefaultVectorAnalyticsTest {
         }
     
         @Test
    -    fun `given user consent when tracking events then submits to posthog`() = runBlockingTest {
    +    fun `given user consent when tracking events then submits to posthog`() = runTest {
             fakeAnalyticsStore.givenUserContent(consent = true)
     
             defaultVectorAnalytics.capture(AN_EVENT)
    @@ -133,7 +133,7 @@ class DefaultVectorAnalyticsTest {
         }
     
         @Test
    -    fun `given user has not consented when tracking events then does not track`() = runBlockingTest {
    +    fun `given user has not consented when tracking events then does not track`() = runTest {
             fakeAnalyticsStore.givenUserContent(consent = false)
     
             defaultVectorAnalytics.capture(AN_EVENT)
    diff --git a/vector/src/test/java/im/vector/app/features/analytics/impl/LateInitUserPropertiesFactoryTest.kt b/vector/src/test/java/im/vector/app/features/analytics/impl/LateInitUserPropertiesFactoryTest.kt
    index c2fa50f789..2068099ab9 100644
    --- a/vector/src/test/java/im/vector/app/features/analytics/impl/LateInitUserPropertiesFactoryTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/analytics/impl/LateInitUserPropertiesFactoryTest.kt
    @@ -23,7 +23,7 @@ import im.vector.app.test.fakes.FakeContext
     import im.vector.app.test.fakes.FakeSession
     import im.vector.app.test.fakes.FakeVectorStore
     import kotlinx.coroutines.ExperimentalCoroutinesApi
    -import kotlinx.coroutines.test.runBlockingTest
    +import kotlinx.coroutines.test.runTest
     import org.amshove.kluent.shouldBeEqualTo
     import org.junit.Test
     
    @@ -43,14 +43,14 @@ class LateInitUserPropertiesFactoryTest {
         )
     
         @Test
    -    fun `given no active session when creating properties then returns null`() = runBlockingTest {
    +    fun `given no active session when creating properties then returns null`() = runTest {
             val result = lateInitUserProperties.createUserProperties()
     
             result shouldBeEqualTo null
         }
     
         @Test
    -    fun `given no use case set on an active session when creating properties then returns null`() = runBlockingTest {
    +    fun `given no use case set on an active session when creating properties then returns null`() = runTest {
             fakeVectorStore.givenUseCase(null)
             fakeSession.givenVectorStore(fakeVectorStore.instance)
             fakeActiveSessionDataSource.setActiveSession(fakeSession)
    @@ -61,7 +61,7 @@ class LateInitUserPropertiesFactoryTest {
         }
     
         @Test
    -    fun `given use case set on an active session when creating properties then includes the use case`() = runBlockingTest {
    +    fun `given use case set on an active session when creating properties then includes the use case`() = runTest {
             fakeVectorStore.givenUseCase(FtueUseCase.TEAMS)
             fakeActiveSessionDataSource.setActiveSession(fakeSession)
             val result = lateInitUserProperties.createUserProperties()
    diff --git a/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt b/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
    index fc4197e07a..cd80be0801 100644
    --- a/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
    @@ -21,7 +21,7 @@ import com.airbnb.mvrx.test.MvRxTestRule
     import im.vector.app.test.fakes.FakeSession
     import im.vector.app.test.fakes.FakeStringProvider
     import im.vector.app.test.test
    -import kotlinx.coroutines.test.runBlockingTest
    +import kotlinx.coroutines.test.runTest
     import org.junit.Rule
     import org.junit.Test
     import org.matrix.android.sdk.api.session.securestorage.IntegrityResult
    @@ -47,117 +47,105 @@ class SharedSecureStorageViewModelTest {
         val args = SharedSecureStorageActivity.Args(keyId = null, emptyList(), "alias")
     
         @Test
    -    fun `given a key info with passphrase when initialising then step is EnterPassphrase`() {
    -        runBlockingTest {
    -            givenKey(KEY_INFO_WITH_PASSPHRASE)
    -            val viewModel = createViewModel()
    -            viewModel
    -                    .test(this)
    -                    .assertState(aViewState(
    -                            hasPassphrase = true,
    -                            step = SharedSecureStorageViewState.Step.EnterPassphrase
    -                    ))
    -                    .finish()
    -        }
    +    fun `given a key info with passphrase when initialising then step is EnterPassphrase`() = runTest {
    +        givenKey(KEY_INFO_WITH_PASSPHRASE)
    +        val viewModel = createViewModel()
    +        viewModel
    +                .test(this)
    +                .assertState(aViewState(
    +                        hasPassphrase = true,
    +                        step = SharedSecureStorageViewState.Step.EnterPassphrase
    +                ))
    +                .finish()
         }
     
         @Test
    -    fun `given a key info without passphrase when initialising then step is EnterKey`() {
    -        runBlockingTest {
    -            givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
    +    fun `given a key info without passphrase when initialising then step is EnterKey`() = runTest {
    +        givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
     
    -            val viewModel = createViewModel()
    +        val viewModel = createViewModel()
     
    -            viewModel
    -                    .test(this)
    -                    .assertState(aViewState(
    -                            hasPassphrase = false,
    -                            step = SharedSecureStorageViewState.Step.EnterKey
    -                    ))
    -                    .finish()
    -        }
    +        viewModel
    +                .test(this)
    +                .assertState(aViewState(
    +                        hasPassphrase = false,
    +                        step = SharedSecureStorageViewState.Step.EnterKey
    +                ))
    +                .finish()
         }
     
         @Test
    -    fun `given on EnterKey step when going back then dismisses`() {
    -        runBlockingTest {
    -            givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
    +    fun `given on EnterKey step when going back then dismisses`() = runTest {
    +        givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
     
    -            val viewModel = createViewModel()
    -            val test = viewModel.test(this)
    -            viewModel.handle(SharedSecureStorageAction.Back)
    -            test
    -                    .assertEvents(SharedSecureStorageViewEvent.Dismiss)
    -                    .finish()
    -        }
    +        val viewModel = createViewModel()
    +        val test = viewModel.test(this)
    +        viewModel.handle(SharedSecureStorageAction.Back)
    +        test
    +                .assertEvents(SharedSecureStorageViewEvent.Dismiss)
    +                .finish()
         }
     
         @Test
    -    fun `given on passphrase step when using key then step is EnterKey`() {
    -        runBlockingTest {
    -            givenKey(KEY_INFO_WITH_PASSPHRASE)
    -            val viewModel = createViewModel()
    -            val test = viewModel.test(this)
    +    fun `given on passphrase step when using key then step is EnterKey`() = runTest {
    +        givenKey(KEY_INFO_WITH_PASSPHRASE)
    +        val viewModel = createViewModel()
    +        val test = viewModel.test(this)
     
    -            viewModel.handle(SharedSecureStorageAction.UseKey)
    +        viewModel.handle(SharedSecureStorageAction.UseKey)
     
    -            test
    -                    .assertStates(
    -                            aViewState(
    -                                    hasPassphrase = true,
    -                                    step = SharedSecureStorageViewState.Step.EnterPassphrase
    -                            ),
    -                            aViewState(
    -                                    hasPassphrase = true,
    -                                    step = SharedSecureStorageViewState.Step.EnterKey
    -                            )
    -                    )
    -                    .finish()
    -        }
    +        test
    +                .assertStates(
    +                        aViewState(
    +                                hasPassphrase = true,
    +                                step = SharedSecureStorageViewState.Step.EnterPassphrase
    +                        ),
    +                        aViewState(
    +                                hasPassphrase = true,
    +                                step = SharedSecureStorageViewState.Step.EnterKey
    +                        )
    +                )
    +                .finish()
         }
     
         @Test
    -    fun `given a key info with passphrase and on EnterKey step when going back then step is EnterPassphrase`() {
    -        runBlockingTest {
    -            givenKey(KEY_INFO_WITH_PASSPHRASE)
    -            val viewModel = createViewModel()
    -            val test = viewModel.test(this)
    +    fun `given a key info with passphrase and on EnterKey step when going back then step is EnterPassphrase`() = runTest {
    +        givenKey(KEY_INFO_WITH_PASSPHRASE)
    +        val viewModel = createViewModel()
    +        val test = viewModel.test(this)
     
    -            viewModel.handle(SharedSecureStorageAction.UseKey)
    -            viewModel.handle(SharedSecureStorageAction.Back)
    +        viewModel.handle(SharedSecureStorageAction.UseKey)
    +        viewModel.handle(SharedSecureStorageAction.Back)
     
    -            test
    -                    .assertStates(
    -                            aViewState(
    -                                    hasPassphrase = true,
    -                                    step = SharedSecureStorageViewState.Step.EnterPassphrase
    -                            ),
    -                            aViewState(
    -                                    hasPassphrase = true,
    -                                    step = SharedSecureStorageViewState.Step.EnterKey
    -                            ),
    -                            aViewState(
    -                                    hasPassphrase = true,
    -                                    step = SharedSecureStorageViewState.Step.EnterPassphrase
    -                            )
    -                    )
    -                    .finish()
    -        }
    +        test
    +                .assertStates(
    +                        aViewState(
    +                                hasPassphrase = true,
    +                                step = SharedSecureStorageViewState.Step.EnterPassphrase
    +                        ),
    +                        aViewState(
    +                                hasPassphrase = true,
    +                                step = SharedSecureStorageViewState.Step.EnterKey
    +                        ),
    +                        aViewState(
    +                                hasPassphrase = true,
    +                                step = SharedSecureStorageViewState.Step.EnterPassphrase
    +                        )
    +                )
    +                .finish()
         }
     
         @Test
    -    fun `given on passphrase step when going back then dismisses`() {
    -        runBlockingTest {
    -            givenKey(KEY_INFO_WITH_PASSPHRASE)
    -            val viewModel = createViewModel()
    -            val test = viewModel.test(this)
    +    fun `given on passphrase step when going back then dismisses`() = runTest {
    +        givenKey(KEY_INFO_WITH_PASSPHRASE)
    +        val viewModel = createViewModel()
    +        val test = viewModel.test(this)
     
    -            viewModel.handle(SharedSecureStorageAction.Back)
    +        viewModel.handle(SharedSecureStorageAction.Back)
     
    -            test
    -                    .assertEvents(SharedSecureStorageViewEvent.Dismiss)
    -                    .finish()
    -        }
    +        test
    +                .assertEvents(SharedSecureStorageViewEvent.Dismiss)
    +                .finish()
         }
     
         private fun createViewModel(): SharedSecureStorageViewModel {
    diff --git a/vector/src/test/java/im/vector/app/features/location/domain/usecase/CompareLocationsUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/location/domain/usecase/CompareLocationsUseCaseTest.kt
    index 015a27b0c8..7a80cbe87e 100644
    --- a/vector/src/test/java/im/vector/app/features/location/domain/usecase/CompareLocationsUseCaseTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/location/domain/usecase/CompareLocationsUseCaseTest.kt
    @@ -21,7 +21,7 @@ import im.vector.app.features.location.LocationData
     import im.vector.app.test.fakes.FakeSession
     import io.mockk.MockKAnnotations
     import io.mockk.impl.annotations.OverrideMockKs
    -import kotlinx.coroutines.test.runBlockingTest
    +import kotlinx.coroutines.test.runTest
     import org.junit.Before
     import org.junit.Rule
     import org.junit.Test
    @@ -42,7 +42,7 @@ class CompareLocationsUseCaseTest {
         }
     
         @Test
    -    fun `given 2 very near locations when calling execute then these locations are considered as equal`() = runBlockingTest {
    +    fun `given 2 very near locations when calling execute then these locations are considered as equal`() = runTest {
             // Given
             val location1 = LocationData(
                     latitude = 48.858269,
    @@ -62,7 +62,7 @@ class CompareLocationsUseCaseTest {
         }
     
         @Test
    -    fun `given 2 far away locations when calling execute then these locations are considered as not equal`() = runBlockingTest {
    +    fun `given 2 far away locations when calling execute then these locations are considered as not equal`() = runTest {
             // Given
             val location1 = LocationData(
                     latitude = 48.858269,
    diff --git a/vector/src/test/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCaseTest.kt
    index 2fa8c7d5f7..bb05357cb2 100644
    --- a/vector/src/test/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCaseTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCaseTest.kt
    @@ -38,7 +38,7 @@ import io.mockk.runs
     import io.mockk.unmockkStatic
     import io.mockk.verify
     import io.mockk.verifyAll
    -import kotlinx.coroutines.test.runBlockingTest
    +import kotlinx.coroutines.test.runTest
     import org.junit.After
     import org.junit.Before
     import org.junit.Rule
    @@ -77,7 +77,7 @@ class DownloadMediaUseCaseTest {
         }
     
         @Test
    -    fun `given a file when calling execute then save the file in local with success`() = runBlockingTest {
    +    fun `given a file when calling execute then save the file in local with success`() = runTest {
             // Given
             val uri = mockk()
             val mimeType = "mimeType"
    @@ -105,7 +105,7 @@ class DownloadMediaUseCaseTest {
         }
     
         @Test
    -    fun `given a file when calling execute then save the file in local with error`() = runBlockingTest {
    +    fun `given a file when calling execute then save the file in local with error`() = runTest {
             // Given
             val uri = mockk()
             val mimeType = "mimeType"
    diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    index f6c322af40..a9028f1147 100644
    --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    @@ -40,7 +40,7 @@ import im.vector.app.test.fakes.FakeVectorFeatures
     import im.vector.app.test.fakes.FakeVectorOverrides
     import im.vector.app.test.fixtures.aHomeServerCapabilities
     import im.vector.app.test.test
    -import kotlinx.coroutines.test.runBlockingTest
    +import kotlinx.coroutines.test.runTest
     import org.junit.Before
     import org.junit.Rule
     import org.junit.Test
    @@ -82,7 +82,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `when handling PostViewEvent, then emits contents as view event`() = runBlockingTest {
    +    fun `when handling PostViewEvent, then emits contents as view event`() = runTest {
             val test = viewModel.test(this)
     
             viewModel.handle(OnboardingAction.PostViewEvent(OnboardingViewEvents.OnTakeMeHome))
    @@ -93,7 +93,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given supports changing display name, when handling PersonalizeProfile, then emits contents choose display name`() = runBlockingTest {
    +    fun `given supports changing display name, when handling PersonalizeProfile, then emits contents choose display name`() = runTest {
             val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = true, supportsChangingProfilePicture = false))
             viewModel = createViewModel(initialState)
             val test = viewModel.test(this)
    @@ -106,7 +106,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given only supports changing profile picture, when handling PersonalizeProfile, then emits contents choose profile picture`() = runBlockingTest {
    +    fun `given only supports changing profile picture, when handling PersonalizeProfile, then emits contents choose profile picture`() = runTest {
             val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = false, supportsChangingProfilePicture = true))
             viewModel = createViewModel(initialState)
             val test = viewModel.test(this)
    @@ -119,7 +119,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `when handling SignUp then sets sign mode to sign up and starts registration`() = runBlockingTest {
    +    fun `when handling SignUp then sets sign mode to sign up and starts registration`() = runTest {
             givenRegistrationResultFor(RegisterAction.StartRegistration, ANY_CONTINUING_REGISTRATION_RESULT)
             val test = viewModel.test(this)
     
    @@ -137,7 +137,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given register action requires more steps, when handling action, then posts next steps`() = runBlockingTest {
    +    fun `given register action requires more steps, when handling action, then posts next steps`() = runTest {
             val test = viewModel.test(this)
             givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, ANY_CONTINUING_REGISTRATION_RESULT)
     
    @@ -154,7 +154,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given register action is non loadable, when handling action, then posts next steps without loading`() = runBlockingTest {
    +    fun `given register action is non loadable, when handling action, then posts next steps without loading`() = runTest {
             val test = viewModel.test(this)
             givenRegistrationResultFor(A_NON_LOADABLE_REGISTER_ACTION, ANY_CONTINUING_REGISTRATION_RESULT)
     
    @@ -167,7 +167,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given register action ignores result, when handling action, then does nothing on success`() = runBlockingTest {
    +    fun `given register action ignores result, when handling action, then does nothing on success`() = runTest {
             val test = viewModel.test(this)
             givenRegistrationResultFor(A_RESULT_IGNORED_REGISTER_ACTION, RegistrationResult.FlowResponse(AN_IGNORED_FLOW_RESULT))
     
    @@ -184,7 +184,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `when registering account, then updates state and emits account created event`() = runBlockingTest {
    +    fun `when registering account, then updates state and emits account created event`() = runTest {
             givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.Success(fakeSession))
             givenSuccessfullyCreatesAccount(A_HOMESERVER_CAPABILITIES)
             val test = viewModel.test(this)
    @@ -203,7 +203,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given registration has started and has dummy step to do, when handling action, then ignores other steps and executes dummy`() = runBlockingTest {
    +    fun `given registration has started and has dummy step to do, when handling action, then ignores other steps and executes dummy`() = runTest {
             givenSuccessfulRegistrationForStartAndDummySteps(missingStages = listOf(Stage.Dummy(mandatory = true)))
             val test = viewModel.test(this)
     
    @@ -221,7 +221,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given changing profile picture is supported, when updating display name, then updates upstream user display name and moves to choose profile picture`() = runBlockingTest {
    +    fun `given changing profile picture is supported, when updating display name, then updates upstream user display name and moves to choose profile picture`() = runTest {
             val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = true))
             viewModel = createViewModel(personalisedInitialState)
             val test = viewModel.test(this)
    @@ -236,7 +236,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given changing profile picture is not supported, when updating display name, then updates upstream user display name and completes personalization`() = runBlockingTest {
    +    fun `given changing profile picture is not supported, when updating display name, then updates upstream user display name and completes personalization`() = runTest {
             val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = false))
             viewModel = createViewModel(personalisedInitialState)
             val test = viewModel.test(this)
    @@ -251,7 +251,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given upstream failure, when handling display name update, then emits failure event`() = runBlockingTest {
    +    fun `given upstream failure, when handling display name update, then emits failure event`() = runTest {
             val test = viewModel.test(this)
             fakeSession.fakeProfileService.givenSetDisplayNameErrors(AN_ERROR)
     
    @@ -268,7 +268,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `when handling profile picture selected, then updates selected picture state`() = runBlockingTest {
    +    fun `when handling profile picture selected, then updates selected picture state`() = runTest {
             val test = viewModel.test(this)
     
             viewModel.handle(OnboardingAction.ProfilePictureSelected(fakeUri.instance))
    @@ -283,7 +283,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given a selected picture, when handling save selected profile picture, then updates upstream avatar and completes personalization`() = runBlockingTest {
    +    fun `given a selected picture, when handling save selected profile picture, then updates upstream avatar and completes personalization`() = runTest {
             val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME)
             viewModel = createViewModel(initialStateWithPicture)
             val test = viewModel.test(this)
    @@ -298,7 +298,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given upstream update avatar fails, when saving selected profile picture, then emits failure event`() = runBlockingTest {
    +    fun `given upstream update avatar fails, when saving selected profile picture, then emits failure event`() = runTest {
             fakeSession.fakeProfileService.givenUpdateAvatarErrors(AN_ERROR)
             val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME)
             viewModel = createViewModel(initialStateWithPicture)
    @@ -313,7 +313,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `given no selected picture, when saving selected profile picture, then emits failure event`() = runBlockingTest {
    +    fun `given no selected picture, when saving selected profile picture, then emits failure event`() = runTest {
             val test = viewModel.test(this)
     
             viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
    @@ -325,7 +325,7 @@ class OnboardingViewModelTest {
         }
     
         @Test
    -    fun `when handling profile skipped, then completes personalization`() = runBlockingTest {
    +    fun `when handling profile skipped, then completes personalization`() = runTest {
             val test = viewModel.test(this)
     
             viewModel.handle(OnboardingAction.UpdateProfilePictureSkipped)
    diff --git a/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt
    index 2ca9aaef07..a7fa2a6331 100644
    --- a/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt
    @@ -19,7 +19,7 @@ package im.vector.app.features.onboarding
     import im.vector.app.test.fakes.FakeRegistrationWizard
     import im.vector.app.test.fakes.FakeSession
     import io.mockk.coVerifyAll
    -import kotlinx.coroutines.test.runBlockingTest
    +import kotlinx.coroutines.test.runTest
     import org.amshove.kluent.shouldBeEqualTo
     import org.junit.Test
     import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
    @@ -39,7 +39,7 @@ private val A_PID_TO_REGISTER = RegisterThreePid.Email("an email")
     class RegistrationActionHandlerTest {
     
         @Test
    -    fun `when handling register action then delegates to wizard`() = runBlockingTest {
    +    fun `when handling register action then delegates to wizard`() = runTest {
             val cases = listOf(
                     case(RegisterAction.StartRegistration) { getRegistrationFlow() },
                     case(RegisterAction.CaptchaDone(A_CAPTCHA_RESPONSE)) { performReCaptcha(A_CAPTCHA_RESPONSE) },
    
    From 012cdf4b4d588aff1e92724305ffc47a29f50091 Mon Sep 17 00:00:00 2001
    From: Benoit Marty 
    Date: Tue, 22 Mar 2022 16:52:18 +0100
    Subject: [PATCH 107/126] runBlocking -> runTest
     https://github.com/Kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-test/MIGRATION.md
    
    ---
     .../session/pushers/DefaultAddPusherTaskTest.kt      | 12 +++++++-----
     .../sdk/internal/task/CoroutineSequencersTest.kt     |  8 ++++----
     .../app/features/crypto/keys/KeysExporterTest.kt     | 10 +++++-----
     3 files changed, 16 insertions(+), 14 deletions(-)
    
    diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/pushers/DefaultAddPusherTaskTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/pushers/DefaultAddPusherTaskTest.kt
    index c8be0f5487..31fd86fe65 100644
    --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/pushers/DefaultAddPusherTaskTest.kt
    +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/session/pushers/DefaultAddPusherTaskTest.kt
    @@ -16,7 +16,8 @@
     
     package org.matrix.android.sdk.internal.session.pushers
     
    -import kotlinx.coroutines.runBlocking
    +import kotlinx.coroutines.ExperimentalCoroutinesApi
    +import kotlinx.coroutines.test.runTest
     import org.amshove.kluent.internal.assertFailsWith
     import org.amshove.kluent.shouldBeEqualTo
     import org.junit.Test
    @@ -39,6 +40,7 @@ private val A_JSON_PUSHER = JsonPusher(
             data = JsonPusherData(brand = "Element")
     )
     
    +@ExperimentalCoroutinesApi
     class DefaultAddPusherTaskTest {
     
         private val pushersAPI = FakePushersAPI()
    @@ -55,7 +57,7 @@ class DefaultAddPusherTaskTest {
         fun `given no persisted pusher when adding Pusher then updates api and inserts result with Registered state`() {
             monarchy.givenWhereReturns(result = null)
     
    -        runBlocking { addPusherTask.execute(AddPusherTask.Params(A_JSON_PUSHER)) }
    +        runTest { addPusherTask.execute(AddPusherTask.Params(A_JSON_PUSHER)) }
     
             pushersAPI.verifySetPusher(A_JSON_PUSHER)
             monarchy.verifyInsertOrUpdate {
    @@ -70,7 +72,7 @@ class DefaultAddPusherTaskTest {
             val realmResult = PusherEntity(appDisplayName = null)
             monarchy.givenWhereReturns(result = realmResult)
     
    -        runBlocking { addPusherTask.execute(AddPusherTask.Params(A_JSON_PUSHER)) }
    +        runTest { addPusherTask.execute(AddPusherTask.Params(A_JSON_PUSHER)) }
     
             pushersAPI.verifySetPusher(A_JSON_PUSHER)
     
    @@ -85,7 +87,7 @@ class DefaultAddPusherTaskTest {
             pushersAPI.givenSetPusherErrors(SocketException())
     
             assertFailsWith {
    -            runBlocking { addPusherTask.execute(AddPusherTask.Params(A_JSON_PUSHER)) }
    +            runTest { addPusherTask.execute(AddPusherTask.Params(A_JSON_PUSHER)) }
             }
     
             realmResult.state shouldBeEqualTo PusherState.FAILED_TO_REGISTER
    @@ -97,7 +99,7 @@ class DefaultAddPusherTaskTest {
             pushersAPI.givenSetPusherErrors(SocketException())
     
             assertFailsWith {
    -            runBlocking { addPusherTask.execute(AddPusherTask.Params(A_JSON_PUSHER)) }
    +            runTest { addPusherTask.execute(AddPusherTask.Params(A_JSON_PUSHER)) }
             }
         }
     }
    diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/task/CoroutineSequencersTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/task/CoroutineSequencersTest.kt
    index 0abca8bee3..149b964fd2 100644
    --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/task/CoroutineSequencersTest.kt
    +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/internal/task/CoroutineSequencersTest.kt
    @@ -21,7 +21,7 @@ import kotlinx.coroutines.asCoroutineDispatcher
     import kotlinx.coroutines.delay
     import kotlinx.coroutines.joinAll
     import kotlinx.coroutines.launch
    -import kotlinx.coroutines.runBlocking
    +import kotlinx.coroutines.test.runTest
     import org.junit.Assert.assertEquals
     import org.junit.Test
     import org.matrix.android.sdk.MatrixTest
    @@ -51,7 +51,7 @@ class CoroutineSequencersTest : MatrixTest {
                                 .also { results.add(it) }
                     }
             )
    -        runBlocking {
    +        runTest {
                 jobs.joinAll()
             }
             assertEquals(3, results.size)
    @@ -81,7 +81,7 @@ class CoroutineSequencersTest : MatrixTest {
                                 .also { results.add(it) }
                     }
             )
    -        runBlocking {
    +        runTest {
                 jobs.joinAll()
             }
             assertEquals(3, results.size)
    @@ -109,7 +109,7 @@ class CoroutineSequencersTest : MatrixTest {
             )
             // We are canceling the second job
             jobs[1].cancel()
    -        runBlocking {
    +        runTest {
                 jobs.joinAll()
             }
             assertEquals(2, results.size)
    diff --git a/vector/src/test/java/im/vector/app/features/crypto/keys/KeysExporterTest.kt b/vector/src/test/java/im/vector/app/features/crypto/keys/KeysExporterTest.kt
    index 57ad2a52ab..5d0317592d 100644
    --- a/vector/src/test/java/im/vector/app/features/crypto/keys/KeysExporterTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/crypto/keys/KeysExporterTest.kt
    @@ -26,7 +26,7 @@ import io.mockk.every
     import io.mockk.mockk
     import io.mockk.verify
     import kotlinx.coroutines.Dispatchers
    -import kotlinx.coroutines.runBlocking
    +import kotlinx.coroutines.test.runTest
     import org.amshove.kluent.internal.assertFailsWith
     import org.junit.Before
     import org.junit.Test
    @@ -55,7 +55,7 @@ class KeysExporterTest {
             givenFileDescriptorWithSize(size = A_ROOM_KEYS_EXPORT.size.toLong())
             val outputStream = context.givenOutputStreamFor(A_URI)
     
    -        runBlocking { keysExporter.export(A_PASSWORD, A_URI) }
    +        runTest { keysExporter.export(A_PASSWORD, A_URI) }
     
             verify { outputStream.write(A_ROOM_KEYS_EXPORT) }
         }
    @@ -66,7 +66,7 @@ class KeysExporterTest {
             context.givenOutputStreamFor(A_URI)
     
             assertFailsWith {
    -            runBlocking { keysExporter.export(A_PASSWORD, A_URI) }
    +            runTest { keysExporter.export(A_PASSWORD, A_URI) }
             }
         }
     
    @@ -75,7 +75,7 @@ class KeysExporterTest {
             context.givenMissingOutputStreamFor(A_URI)
     
             assertFailsWith(message = "Unable to open file for writing") {
    -            runBlocking { keysExporter.export(A_PASSWORD, A_URI) }
    +            runTest { keysExporter.export(A_PASSWORD, A_URI) }
             }
         }
     
    @@ -85,7 +85,7 @@ class KeysExporterTest {
             context.givenOutputStreamFor(A_URI)
     
             assertFailsWith(message = "Exported file not found") {
    -            runBlocking { keysExporter.export(A_PASSWORD, A_URI) }
    +            runTest { keysExporter.export(A_PASSWORD, A_URI) }
             }
         }
     
    
    From 707800532f071eb1a85b000ead29815d79ae601e Mon Sep 17 00:00:00 2001
    From: iaiz 
    Date: Mon, 21 Mar 2022 17:17:28 +0000
    Subject: [PATCH 108/126] Translated using Weblate (Spanish)
    
    Currently translated at 66.6% (34 of 51 strings)
    
    Translation: Element Android/Element Android Store
    Translate-URL: https://translate.element.io/projects/element-android/element-store/es/
    ---
     fastlane/metadata/android/es-ES/changelogs/40104000.txt | 2 ++
     fastlane/metadata/android/es-ES/changelogs/40104020.txt | 2 ++
     2 files changed, 4 insertions(+)
     create mode 100644 fastlane/metadata/android/es-ES/changelogs/40104000.txt
     create mode 100644 fastlane/metadata/android/es-ES/changelogs/40104020.txt
    
    diff --git a/fastlane/metadata/android/es-ES/changelogs/40104000.txt b/fastlane/metadata/android/es-ES/changelogs/40104000.txt
    new file mode 100644
    index 0000000000..ea607fe19a
    --- /dev/null
    +++ b/fastlane/metadata/android/es-ES/changelogs/40104000.txt
    @@ -0,0 +1,2 @@
    +Principales cambios de esta versión: primera implementación de los hilos de mensajes. Burbujas de mensajes.
    +Todos los cambios en: https://github.com/vector-im/element-android/releases/tag/v1.4.0
    diff --git a/fastlane/metadata/android/es-ES/changelogs/40104020.txt b/fastlane/metadata/android/es-ES/changelogs/40104020.txt
    new file mode 100644
    index 0000000000..8c2c78cb62
    --- /dev/null
    +++ b/fastlane/metadata/android/es-ES/changelogs/40104020.txt
    @@ -0,0 +1,2 @@
    +Principales cambios de esta versión: añadir @room, encuestas cerradas y muchos cambios menores más.
    +Todos los cambios en: https://github.com/vector-im/element-android/releases/tag/v1.4.2
    
    From 8550db9f234855c2014cda0f7bcff314d053021c Mon Sep 17 00:00:00 2001
    From: iaiz 
    Date: Mon, 21 Mar 2022 16:13:47 +0000
    Subject: [PATCH 109/126] Translated using Weblate (Spanish)
    
    Currently translated at 95.7% (2065 of 2157 strings)
    
    Translation: Element Android/Element Android App
    Translate-URL: https://translate.element.io/projects/element-android/element-app/es/
    ---
     vector/src/main/res/values-es/strings.xml | 74 ++++++++++-------------
     1 file changed, 33 insertions(+), 41 deletions(-)
    
    diff --git a/vector/src/main/res/values-es/strings.xml b/vector/src/main/res/values-es/strings.xml
    index 8e0568e7ae..0f80bc8e0f 100644
    --- a/vector/src/main/res/values-es/strings.xml
    +++ b/vector/src/main/res/values-es/strings.xml
    @@ -39,7 +39,6 @@
         Invitación a Sala
         %1$s y %2$s
         Sala vacía
    -
         %1$s ha revocado la invitación a unirse a la sala para %2$s
         Sincronización inicial
     \nImportando cuenta…
    @@ -241,7 +240,6 @@
         Eliminar
         Renombrar
         Reportar contenido
    -
         o
         Invitar
         Cerrar sesión
    @@ -264,7 +262,6 @@
         Solo contactos de Matrix
         No hay resultados
         Salas
    -
         Enviar registros
         Enviar registros de fallas
         Enviar captura de pantalla
    @@ -292,11 +289,9 @@
         Esto no parece ser una dirección de correo electrónico válida
         Esta dirección de correo electrónico ya está definida.
         ¿Olvidaste tu contraseña?
    -
         Este Servidor Doméstico quiere asegurarse de que no eres un robot
         Debes ingresar la dirección de correo electrónico vinculada a tu cuenta.
         No se pudo verificar la dirección de correo electrónico: asegúrate de hacer clic en el enlace del correo electrónico
    -
         Por favor introduce una URL válida
         JSON mal formado
         No contenía un JSON válido
    @@ -312,15 +307,10 @@
         Llamada En Curso…
         El lado remoto no contestó.
         Información
    -
    -
         ${app_name} necesita permiso para acceder a tu micrófono para realizar llamadas de voz.
    -
         ${app_name} necesita permiso para acceder a tu cámara y micrófono para realizar llamadas de vídeo.
     \n
     \nPor favor permite el acceso en las próximas ventanas emergentes para poder realizar la llamada.
    -
    -
         
         NO
         Continuar
    @@ -328,7 +318,6 @@
         Unirse
         Rechazar
         Mensajes no leídos.
    -
         Salir de la sala
         ¿Seguro que quieres salir de la sala?
         CONVERSACIONES DIRECTAS
    @@ -355,7 +344,6 @@
         El certificado cambió de uno que era confiable para tu teléfono. Esto es MUY INUSUAL. Se recomienda NO ACEPTAR este nuevo certificado.
         El certificado cambió de uno que era confiable a uno que no es confiable. El servidor puede haber renovado su certificado. Contacta al administrador del servidor para obtener la huella digital.
         Solo acepta el certificado si el administrador del servidor ha publicado una huella digital que coincide con la anterior.
    -
         Buscar
         Filtrar miembros de la sala
         No hay resultados
    @@ -400,7 +388,6 @@
         Actualizar Nombre Público
         Visto por última vez
         %1$s @ %2$s
    -
         Autenticación
         Sesión iniciada como
         Servidor Doméstico
    @@ -431,7 +418,6 @@
         Estas son funcionalidades experimentales que pueden romperse de maneras inesperadas. Utilizar con precaución.
         Establecer como dirección principal
         Dejar de Establecer como dirección principal
    -
         Error de descifrado
         Nombre público
         ID de sesión
    @@ -442,7 +428,6 @@
         Exportar
         Ingresar frase de contraseña
         Confirmar frase de contraseña
    -
         Importar claves de salas con cifrado Extremo-a-Extremo
         Importar claves de sala
         Importar las claves desde un archivo local
    @@ -454,7 +439,6 @@
         Verificar
         Para verificar que esta sesión es confiable, por favor contacta a su dueño por algún otro medio (ej. cara a cara o por teléfono) y pregúntale si la clave que ve en sus Ajustes de Usuario para esta sesión coincide con la clave a continuación:
         Si coincide, presione el botón de verificar a continuación. Si no coincide, entonces alguien está interceptando esta sesión y probablemente debería prohibirlo. En el futuro, este proceso de verificación será más sofisticado.
    -
         Selecciona un directorio de salas
         Nombre del servidor
         Todas las salas en el servidor %s
    @@ -540,8 +524,6 @@
             %d mensaje nuevo
             %d mensajes nuevos
         
    -
    -
         
             %d sala
             %d salas
    @@ -550,12 +532,10 @@
             %d cambio de membresía
             %d cambios de membresía
         
    -
         
             %d mensaje sin leer
             %d mensajes sin leer
         
    -
         %1$s en %2$s
         
             %d componente activo
    @@ -608,16 +588,10 @@
         Haz clic aquí para ver mensajes más antiguos
         Degrada al usuario con la ID dada
         Alertas de Sistema
    -
    -
    -
    -
         
             $d seleccionado
             %d seleccionados
         
    -
    -
         contacta al administrador de tu servicio
         Este servidor doméstico ha excedido uno de sus límites de recursos, por lo que algunos usuarios no podrán iniciar sesión.
         Este servidor doméstico ha excedido uno de sus límites de recursos.
    @@ -741,7 +715,6 @@
         Incluye cambios en el avatar y en el nombre.
         Enviar mensaje con intro
         La tecla Intro enviará el mensaje en vez de añadir un salto de línea
    -
         Contraseña
         La contraseña no es válida
         Media
    @@ -801,7 +774,6 @@
         Guardar clave de recuperación
         Compartir
         Guardar como archivo
    -
         Por favor, haga una copia
         Compartir clave de recuperación con…
         Generando clave de recuperación usando una contraseña, este proceso puede tardar varios segundos.
    @@ -848,7 +820,6 @@
             Cargando %d de las claves…
         
         Firma
    -
         Origen predeterminado de medios
         Configurar copia de seguridad de las claves de cifrado
         Obteniendo una versión de copia de seguridad…
    @@ -857,7 +828,6 @@
         La copia de seguridad tiene una firma inválida de la sesión no verificada %s
         Para usar la copia de seguridad de la clave en esta sesión introduzca su contraseña o su clave de recuperación ahora.
         ¿Deseas borrar tus claves de cifrado guardadas en el servidor\? No podrás usar tu clave de recuperación para leer el historial de mensajes cifrados.
    -
         Reproducir sonido de cámara
         ip desconocida
         Una nueva sesión solicita claves de cifrado.
    @@ -878,8 +848,6 @@
         Comprobando copias de respaldo
         ¡Verificado!
         Ok
    -
    -
         Solicitud de verificación
         %s quiere verificar tu sesión
         Error desconocido
    @@ -933,7 +901,6 @@
         Integraciones
         Descubrimiento
         Gestione sus preferencias de descubrimiento.
    -
         Esta no es una dirección de servidor Matrix válida
         No se puede acceder al servidor en esta URL, por favor, compruébelo
         Modo Sincronización en segundo plano
    @@ -942,7 +909,6 @@
         ${app_name} se sincronizará en segundo plano periódicamente en un momento preciso (configurable).
     \nEsto afectará al uso de la radio y la batería, se mostrará una notificación permanente que indica que ${app_name} está escuchando a nuevos acontecimientos.
         No se le notificará de los mensajes entrantes cuando la aplicación esté en segundo plano.
    -
         Utiliza un Gestor de Integración para gestionar los bots, puentes, widgets y paquetes de pegatinas.
     \nLos Gestores de Integración reciben los datos de configuración y pueden modificar los widgets, enviar invitaciones a salas y establecer niveles de poder en su nombre.
         Permitir integraciones
    @@ -1078,7 +1044,6 @@
         Este contenido fue reportado como inapropiado.
     \n
     \nSi no quieres ver más contenido de este usuario, puedes bloquearlo para ocultar sus mensajes.
    -
         Ignorar usuario
         Todos los mensajes (sonido)
         Todos los mensajes
    @@ -1508,7 +1473,6 @@
     \n- El servidor privado al que está conectado el usuario que estás verificando
     \n- Su conexión a internet o la de otros usuarios
     \n- Su dispositivo o el de otros usuarios
    -
         Los mensajes de esta sala están cifrados Extremo-a-Extremo.
     \n
     \nSus mensajes están protegidos y sólo usted y el destinatario tienen las claves únicas para descifrarlos.
    @@ -1589,7 +1553,6 @@
         Imprímelo y guárdalo en un lugar seguro
         Guárdelo en una llave USB o unidad de respaldo
         Cópielo en su almacenamiento personal en la nube
    -
         Si cancela ahora, puede perder mensajes y datos cifrados si pierde el acceso a sus inicios de sesión.
     \n
     \nTambién puede configurar la Copia de Seguridad Segura y administrar sus claves en Configuración.
    @@ -1937,7 +1900,6 @@
         Transferir
         Conectar
         Preguntar primero
    -
         Llamada activa (%1$s)
         Pad de marcado
         Esta llamada ha terminado
    @@ -2062,7 +2024,6 @@
         Para llevar a cabo esta acción has de otorgar el permiso de Cámara en las preferencias del sistema.
         Se requieren permisos para llevar a cabo esta acción. Por favor, otórgalos desde las preferencias del sistema.
         Impedir a cualquiera que no forme parte de %s unirse a este sala
    -
         Dar consentimiento
         Revocar consentimiento
         Has dado tu consentimiento para enviar emails y números de teléfono a este servidor identidad para descubrir a otros usuarios desde tus contactos.
    @@ -2087,7 +2048,6 @@
         Actualización requerida
         Actualizar
         Por favor, se paciente. Ésto puede llevar algo de tiempo.
    -
         Sala sin nombre
         Por favor, contacta con el administrador de tu homeserver para más información
         Parece que tu homeserver no soporta Espacios todavía
    @@ -2143,7 +2103,6 @@
         Transferir a %1$s
         Consultando con %1$s
         Ocurrió un error al transferir la llamada
    -
         Hubo un error al buscar el número de teléfono
         Devolver la llamada
         Buscar contactos en Matrix
    @@ -2312,4 +2271,37 @@
         Ver en la sala
         Habilitar
         No estás autorizado a unirte a esta sala
    +    ¿No lo sabes todavía\? Puedes %s
    +    saltar esta pregunta
    +    Comunidades
    +    Equipos
    +    Familia y amigos
    +    Te vamos a ayudar a conectarte.
    +    ¿Con quién hablarás más\?
    +    Mensajería para tu equipo.
    +    Mensajería segura.
    +    Tú mandas.
    +    Toma el control de tus conversaciones.
    +    Ubicación
    +    Encuesta
    +    ¿Aceptas enviar esta información\?
    +    Ajustes del sistema
    +    Versiones
    +    Obtén ayuda sobre cómo usar ${app_name}
    +    Ayuda
    +    Ayuda
    +    Asuntos legales
    +    ¡Ya estás viendo este hilo!
    +    Ver en la sala
    +    Responder en un hilo
    +    El comando «%s» existe, pero no funciona dentro de hilos.
    +    Este servidor no ha devuelto ninguna política.
    +    Bibliotecas de terceros
    +    Política de tu servidor de identidad
    +    Política de tu servidor base
    +    Política de ${app_name}
    +    %1$s y %2$s
    +    Filtrar
    +    %1$s, %2$s y otros
    +    Copiar enlace al hilo
     
    \ No newline at end of file
    
    From 6787980185221f351d867136486cb45923dab72a Mon Sep 17 00:00:00 2001
    From: ClaireG 
    Date: Tue, 22 Mar 2022 17:31:21 +0100
    Subject: [PATCH 110/126] Do not suggest collapse if there is only one section
    
    ---
     changelog.d/5347.misc                           |  1 +
     .../features/home/room/list/RoomListFragment.kt | 14 +++++++++++---
     .../home/room/list/SectionHeaderAdapter.kt      | 17 ++++++++++++-----
     3 files changed, 24 insertions(+), 8 deletions(-)
     create mode 100644 changelog.d/5347.misc
    
    diff --git a/changelog.d/5347.misc b/changelog.d/5347.misc
    new file mode 100644
    index 0000000000..501ff71d7c
    --- /dev/null
    +++ b/changelog.d/5347.misc
    @@ -0,0 +1 @@
    +[Rooms list] Do not suggest collapse the unique section
    \ No newline at end of file
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
    index 4265eebe62..a8f1174283 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
    @@ -295,7 +295,8 @@ class RoomListFragment @Inject constructor(
                                             section.notificationCount.observe(viewLifecycleOwner) { counts ->
                                                 sectionAdapter.updateSection(sectionAdapter.roomsSectionData.copy(
                                                         notificationCount = counts.totalCount,
    -                                                    isHighlighted = counts.isHighlight
    +                                                    isHighlighted = counts.isHighlight,
    +                                                    shouldShowExpandedArrow = shouldShowExpendedArrow()
                                                 ))
                                             }
                                             section.isExpanded.observe(viewLifecycleOwner) { _ ->
    @@ -329,14 +330,17 @@ class RoomListFragment @Inject constructor(
                                                 controller.setData(list)
                                                 sectionAdapter.updateSection(sectionAdapter.roomsSectionData.copy(
                                                         isHidden = list.isEmpty(),
    -                                                    isLoading = false))
    +                                                    isLoading = false,
    +                                                    shouldShowExpandedArrow = shouldShowExpendedArrow()
    +                                            ))
                                                 checkEmptyState()
                                             }
                                             observeItemCount(section, sectionAdapter)
                                             section.notificationCount.observe(viewLifecycleOwner) { counts ->
                                                 sectionAdapter.updateSection(sectionAdapter.roomsSectionData.copy(
                                                         notificationCount = counts.totalCount,
    -                                                    isHighlighted = counts.isHighlight
    +                                                    isHighlighted = counts.isHighlight,
    +                                                    shouldShowExpandedArrow = shouldShowExpendedArrow()
                                                 ))
                                             }
                                             section.isExpanded.observe(viewLifecycleOwner) { _ ->
    @@ -444,6 +448,10 @@ class RoomListFragment @Inject constructor(
             footerController.setData(state)
         }
     
    +    private fun shouldShowExpendedArrow(): Boolean {
    +        return adapterInfosList.filter { !it.sectionHeaderAdapter.roomsSectionData.isHidden }.size >= 2
    +    }
    +
         private fun checkEmptyState() {
             val shouldShowEmpty = adapterInfosList.all { it.sectionHeaderAdapter.roomsSectionData.isHidden } &&
                     !adapterInfosList.any { it.sectionHeaderAdapter.roomsSectionData.isLoading }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/SectionHeaderAdapter.kt b/vector/src/main/java/im/vector/app/features/home/room/list/SectionHeaderAdapter.kt
    index 2e6436d21d..cd2879cf28 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/list/SectionHeaderAdapter.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/list/SectionHeaderAdapter.kt
    @@ -17,6 +17,7 @@
     package im.vector.app.features.home.room.list
     
     import android.view.LayoutInflater
    +import android.view.View
     import android.view.ViewGroup
     import androidx.core.content.ContextCompat
     import androidx.core.graphics.drawable.DrawableCompat
    @@ -39,7 +40,8 @@ class SectionHeaderAdapter constructor(
                 val isHighlighted: Boolean = false,
                 val isHidden: Boolean = true,
                 // This will be false until real data has been submitted once
    -            val isLoading: Boolean = true
    +            val isLoading: Boolean = true,
    +            val shouldShowExpandedArrow: Boolean = false
         )
     
         lateinit var roomsSectionData: RoomsSectionData
    @@ -82,11 +84,16 @@ class SectionHeaderAdapter constructor(
             fun bind(roomsSectionData: RoomsSectionData) {
                 binding.roomCategoryTitleView.text = roomsSectionData.name
                 val tintColor = ThemeUtils.getColor(binding.root.context, R.attr.vctr_content_secondary)
    -            val expandedArrowDrawableRes = if (roomsSectionData.isExpanded) R.drawable.ic_expand_more else R.drawable.ic_expand_less
    -            val expandedArrowDrawable = ContextCompat.getDrawable(binding.root.context, expandedArrowDrawableRes)?.also {
    -                DrawableCompat.setTint(it, tintColor)
    +            if (roomsSectionData.shouldShowExpandedArrow) {
    +                binding.roomCategoryCounterView.visibility = View.VISIBLE
    +                val expandedArrowDrawableRes = if (roomsSectionData.isExpanded) R.drawable.ic_expand_more else R.drawable.ic_expand_less
    +                val expandedArrowDrawable = ContextCompat.getDrawable(binding.root.context, expandedArrowDrawableRes)?.also {
    +                    DrawableCompat.setTint(it, tintColor)
    +                }
    +                binding.roomCategoryCounterView.setCompoundDrawablesWithIntrinsicBounds(null, null, expandedArrowDrawable, null)
    +            } else {
    +                binding.roomCategoryCounterView.visibility = View.GONE
                 }
    -            binding.roomCategoryCounterView.setCompoundDrawablesWithIntrinsicBounds(null, null, expandedArrowDrawable, null)
                 binding.roomCategoryCounterView.text = roomsSectionData.itemCount.takeIf { it > 0 }?.toString().orEmpty()
                 binding.roomCategoryUnreadCounterBadgeView.render(UnreadCounterBadgeView.State(roomsSectionData.notificationCount, roomsSectionData.isHighlighted))
             }
    
    From fdf3cc36ce646b163e5c51ac7e018323c46b5061 Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Tue, 22 Mar 2022 17:01:34 +0000
    Subject: [PATCH 111/126] fixing view model tests not collecting flow results -
     the switch from runBlockingTest to runTest means we need to provide a
     separate scope from the test in order to asynchronously collect the flow
     results
    
    ---
     .../quads/SharedSecureStorageViewModelTest.kt | 12 +++----
     .../onboarding/OnboardingViewModelTest.kt     | 34 +++++++++----------
     .../java/im/vector/app/test/Extensions.kt     |  8 +++--
     3 files changed, 28 insertions(+), 26 deletions(-)
    
    diff --git a/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt b/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
    index cd80be0801..7562dfdf14 100644
    --- a/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
    @@ -51,7 +51,7 @@ class SharedSecureStorageViewModelTest {
             givenKey(KEY_INFO_WITH_PASSPHRASE)
             val viewModel = createViewModel()
             viewModel
    -                .test(this)
    +                .test()
                     .assertState(aViewState(
                             hasPassphrase = true,
                             step = SharedSecureStorageViewState.Step.EnterPassphrase
    @@ -66,7 +66,7 @@ class SharedSecureStorageViewModelTest {
             val viewModel = createViewModel()
     
             viewModel
    -                .test(this)
    +                .test()
                     .assertState(aViewState(
                             hasPassphrase = false,
                             step = SharedSecureStorageViewState.Step.EnterKey
    @@ -79,7 +79,7 @@ class SharedSecureStorageViewModelTest {
             givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
     
             val viewModel = createViewModel()
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
             viewModel.handle(SharedSecureStorageAction.Back)
             test
                     .assertEvents(SharedSecureStorageViewEvent.Dismiss)
    @@ -90,7 +90,7 @@ class SharedSecureStorageViewModelTest {
         fun `given on passphrase step when using key then step is EnterKey`() = runTest {
             givenKey(KEY_INFO_WITH_PASSPHRASE)
             val viewModel = createViewModel()
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(SharedSecureStorageAction.UseKey)
     
    @@ -112,7 +112,7 @@ class SharedSecureStorageViewModelTest {
         fun `given a key info with passphrase and on EnterKey step when going back then step is EnterPassphrase`() = runTest {
             givenKey(KEY_INFO_WITH_PASSPHRASE)
             val viewModel = createViewModel()
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(SharedSecureStorageAction.UseKey)
             viewModel.handle(SharedSecureStorageAction.Back)
    @@ -139,7 +139,7 @@ class SharedSecureStorageViewModelTest {
         fun `given on passphrase step when going back then dismisses`() = runTest {
             givenKey(KEY_INFO_WITH_PASSPHRASE)
             val viewModel = createViewModel()
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(SharedSecureStorageAction.Back)
     
    diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    index a9028f1147..4fd079611d 100644
    --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    @@ -83,7 +83,7 @@ class OnboardingViewModelTest {
     
         @Test
         fun `when handling PostViewEvent, then emits contents as view event`() = runTest {
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.PostViewEvent(OnboardingViewEvents.OnTakeMeHome))
     
    @@ -96,7 +96,7 @@ class OnboardingViewModelTest {
         fun `given supports changing display name, when handling PersonalizeProfile, then emits contents choose display name`() = runTest {
             val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = true, supportsChangingProfilePicture = false))
             viewModel = createViewModel(initialState)
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.PersonalizeProfile)
     
    @@ -109,7 +109,7 @@ class OnboardingViewModelTest {
         fun `given only supports changing profile picture, when handling PersonalizeProfile, then emits contents choose profile picture`() = runTest {
             val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = false, supportsChangingProfilePicture = true))
             viewModel = createViewModel(initialState)
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.PersonalizeProfile)
     
    @@ -121,7 +121,7 @@ class OnboardingViewModelTest {
         @Test
         fun `when handling SignUp then sets sign mode to sign up and starts registration`() = runTest {
             givenRegistrationResultFor(RegisterAction.StartRegistration, ANY_CONTINUING_REGISTRATION_RESULT)
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.UpdateSignMode(SignMode.SignUp))
     
    @@ -138,7 +138,7 @@ class OnboardingViewModelTest {
     
         @Test
         fun `given register action requires more steps, when handling action, then posts next steps`() = runTest {
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
             givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, ANY_CONTINUING_REGISTRATION_RESULT)
     
             viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION))
    @@ -155,7 +155,7 @@ class OnboardingViewModelTest {
     
         @Test
         fun `given register action is non loadable, when handling action, then posts next steps without loading`() = runTest {
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
             givenRegistrationResultFor(A_NON_LOADABLE_REGISTER_ACTION, ANY_CONTINUING_REGISTRATION_RESULT)
     
             viewModel.handle(OnboardingAction.PostRegisterAction(A_NON_LOADABLE_REGISTER_ACTION))
    @@ -168,7 +168,7 @@ class OnboardingViewModelTest {
     
         @Test
         fun `given register action ignores result, when handling action, then does nothing on success`() = runTest {
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
             givenRegistrationResultFor(A_RESULT_IGNORED_REGISTER_ACTION, RegistrationResult.FlowResponse(AN_IGNORED_FLOW_RESULT))
     
             viewModel.handle(OnboardingAction.PostRegisterAction(A_RESULT_IGNORED_REGISTER_ACTION))
    @@ -187,7 +187,7 @@ class OnboardingViewModelTest {
         fun `when registering account, then updates state and emits account created event`() = runTest {
             givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.Success(fakeSession))
             givenSuccessfullyCreatesAccount(A_HOMESERVER_CAPABILITIES)
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION))
     
    @@ -205,7 +205,7 @@ class OnboardingViewModelTest {
         @Test
         fun `given registration has started and has dummy step to do, when handling action, then ignores other steps and executes dummy`() = runTest {
             givenSuccessfulRegistrationForStartAndDummySteps(missingStages = listOf(Stage.Dummy(mandatory = true)))
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION))
     
    @@ -224,7 +224,7 @@ class OnboardingViewModelTest {
         fun `given changing profile picture is supported, when updating display name, then updates upstream user display name and moves to choose profile picture`() = runTest {
             val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = true))
             viewModel = createViewModel(personalisedInitialState)
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME))
     
    @@ -239,7 +239,7 @@ class OnboardingViewModelTest {
         fun `given changing profile picture is not supported, when updating display name, then updates upstream user display name and completes personalization`() = runTest {
             val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = false))
             viewModel = createViewModel(personalisedInitialState)
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME))
     
    @@ -252,7 +252,7 @@ class OnboardingViewModelTest {
     
         @Test
         fun `given upstream failure, when handling display name update, then emits failure event`() = runTest {
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
             fakeSession.fakeProfileService.givenSetDisplayNameErrors(AN_ERROR)
     
             viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME))
    @@ -269,7 +269,7 @@ class OnboardingViewModelTest {
     
         @Test
         fun `when handling profile picture selected, then updates selected picture state`() = runTest {
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.ProfilePictureSelected(fakeUri.instance))
     
    @@ -286,7 +286,7 @@ class OnboardingViewModelTest {
         fun `given a selected picture, when handling save selected profile picture, then updates upstream avatar and completes personalization`() = runTest {
             val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME)
             viewModel = createViewModel(initialStateWithPicture)
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
     
    @@ -302,7 +302,7 @@ class OnboardingViewModelTest {
             fakeSession.fakeProfileService.givenUpdateAvatarErrors(AN_ERROR)
             val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME)
             viewModel = createViewModel(initialStateWithPicture)
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
     
    @@ -314,7 +314,7 @@ class OnboardingViewModelTest {
     
         @Test
         fun `given no selected picture, when saving selected profile picture, then emits failure event`() = runTest {
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
     
    @@ -326,7 +326,7 @@ class OnboardingViewModelTest {
     
         @Test
         fun `when handling profile skipped, then completes personalization`() = runTest {
    -        val test = viewModel.test(this)
    +        val test = viewModel.test()
     
             viewModel.handle(OnboardingAction.UpdateProfilePictureSkipped)
     
    diff --git a/vector/src/test/java/im/vector/app/test/Extensions.kt b/vector/src/test/java/im/vector/app/test/Extensions.kt
    index 67eff7ca11..b9521298e2 100644
    --- a/vector/src/test/java/im/vector/app/test/Extensions.kt
    +++ b/vector/src/test/java/im/vector/app/test/Extensions.kt
    @@ -21,12 +21,14 @@ import im.vector.app.core.platform.VectorViewEvents
     import im.vector.app.core.platform.VectorViewModel
     import im.vector.app.core.platform.VectorViewModelAction
     import kotlinx.coroutines.CoroutineScope
    +import kotlinx.coroutines.Dispatchers
     
     fun String.trimIndentOneLine() = trimIndent().replace("\n", "")
     
    -fun  VectorViewModel.test(coroutineScope: CoroutineScope): ViewModelTest {
    -    val state = stateFlow.test(coroutineScope)
    -    val viewEvents = viewEvents.stream().test(coroutineScope)
    +fun  VectorViewModel.test(): ViewModelTest {
    +    val testResultCollectingScope = CoroutineScope(Dispatchers.Unconfined)
    +    val state = stateFlow.test(testResultCollectingScope)
    +    val viewEvents = viewEvents.stream().test(testResultCollectingScope)
         return ViewModelTest(state, viewEvents)
     }
     
    
    From c06c9ea1d686ad6a02b44f2490195f3ea365c7ba Mon Sep 17 00:00:00 2001
    From: ganfra 
    Date: Tue, 22 Mar 2022 18:55:34 +0100
    Subject: [PATCH 112/126] Fix lint issues on weblate sync
    
    ---
     vector/src/main/res/values-is/strings.xml | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/vector/src/main/res/values-is/strings.xml b/vector/src/main/res/values-is/strings.xml
    index 714ec292e8..ee34c9e314 100644
    --- a/vector/src/main/res/values-is/strings.xml
    +++ b/vector/src/main/res/values-is/strings.xml
    @@ -521,7 +521,7 @@
         %1$s tók %2$s úr banni. Ástæða: %3$s
         Þú fjarlægðir %1$s. Ástæða: %2$s
         %1$s fjarlægði %2$s. Ástæða: %3$s
    -    Þú hafnaðir boðinu. Ástæða: %2$s
    +    Þú hafnaðir boðinu. Ástæða: %1$s
         %1$s hafnaði boðinu. Ástæða: %2$s
         Þú hættir. Ástæða: %1$s
         %1$s hætti. Ástæða: %2$s
    @@ -562,7 +562,7 @@
         %1$s fjarlægði %2$s viðmótshluta
         Þú bættir við %1$s viðmótshluta
         %1$s bætti við %2$s viðmótshluta
    -    Þú samþykktir boð um að taka þátt í %$s
    +    Þú samþykktir boð um að taka þátt í %1$s
         Þú afturkallaðir boðið til %1$s
         %1$s afturkallaði boðið til %2$s
         Þú afturkallaðir boð til %1$s um þátttöku í spjallrásinni
    
    From 5bbc9dc1023e59cbeeac1fbc79206531c0c9f741 Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Wed, 23 Mar 2022 09:02:33 +0000
    Subject: [PATCH 113/126] fixing the onboarding sanity test failing - adds
     tapping the new take me home button within the sanity test
    
    ---
     .../androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt | 3 +++
     1 file changed, 3 insertions(+)
    
    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 b3bb5172e8..d051488ad7 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
    @@ -21,6 +21,7 @@ import androidx.test.espresso.Espresso.onView
     import androidx.test.espresso.Espresso.pressBack
     import androidx.test.espresso.matcher.ViewMatchers.isRoot
     import androidx.test.espresso.matcher.ViewMatchers.withId
    +import androidx.test.espresso.matcher.ViewMatchers.withText
     import com.adevinta.android.barista.assertion.BaristaEnabledAssertions.assertDisabled
     import com.adevinta.android.barista.assertion.BaristaEnabledAssertions.assertEnabled
     import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions.assertDisplayed
    @@ -55,6 +56,8 @@ class OnboardingRobot {
     
         fun createAccount(userId: String, password: String = "password", homeServerUrl: String = "http://10.0.2.2:8080") {
             initSession(true, userId, password, homeServerUrl)
    +        waitUntilViewVisible(withText(R.string.ftue_account_created_congratulations_title))
    +        clickOn(R.string.ftue_account_created_take_me_home)
         }
     
         fun login(userId: String, password: String = "password", homeServerUrl: String = "http://10.0.2.2:8080") {
    
    From 7ead3f93f45b81b9f42cae7454f7516c458e1550 Mon Sep 17 00:00:00 2001
    From: Onuray Sahin 
    Date: Wed, 23 Mar 2022 13:52:53 +0300
    Subject: [PATCH 114/126] Remove exhaustive.
    
    ---
     .../home/room/detail/composer/MessageComposerViewModel.kt       | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    index a9b9a1d302..976489eec3 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
    @@ -110,7 +110,7 @@ class MessageComposerViewModel @AssistedInject constructor(
                 is MessageComposerAction.OnEntersBackground             -> handleEntersBackground(action.composerText)
                 is MessageComposerAction.VoiceWaveformTouchedUp         -> handleVoiceWaveformTouchedUp(action)
                 is MessageComposerAction.VoiceWaveformMovedTo           -> handleVoiceWaveformMovedTo(action)
    -        }.exhaustive
    +        }
         }
     
         private fun handleOnVoiceRecordingUiStateChanged(action: MessageComposerAction.OnVoiceRecordingUiStateChanged) = setState {
    
    From 55b946a0197b043c284df80829b6968a3daae27f Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Wed, 23 Mar 2022 09:02:33 +0000
    Subject: [PATCH 115/126] fixing the onboarding sanity test failing - adds
     tapping the new take me home button within the sanity test
    
    ---
     .../androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt | 3 +++
     1 file changed, 3 insertions(+)
    
    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 b3bb5172e8..d051488ad7 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
    @@ -21,6 +21,7 @@ import androidx.test.espresso.Espresso.onView
     import androidx.test.espresso.Espresso.pressBack
     import androidx.test.espresso.matcher.ViewMatchers.isRoot
     import androidx.test.espresso.matcher.ViewMatchers.withId
    +import androidx.test.espresso.matcher.ViewMatchers.withText
     import com.adevinta.android.barista.assertion.BaristaEnabledAssertions.assertDisabled
     import com.adevinta.android.barista.assertion.BaristaEnabledAssertions.assertEnabled
     import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions.assertDisplayed
    @@ -55,6 +56,8 @@ class OnboardingRobot {
     
         fun createAccount(userId: String, password: String = "password", homeServerUrl: String = "http://10.0.2.2:8080") {
             initSession(true, userId, password, homeServerUrl)
    +        waitUntilViewVisible(withText(R.string.ftue_account_created_congratulations_title))
    +        clickOn(R.string.ftue_account_created_take_me_home)
         }
     
         fun login(userId: String, password: String = "password", homeServerUrl: String = "http://10.0.2.2:8080") {
    
    From 4755ebfa974d0958529e77641fb23e176d6e94b0 Mon Sep 17 00:00:00 2001
    From: ganfra 
    Date: Wed, 23 Mar 2022 13:38:33 +0100
    Subject: [PATCH 116/126] Update Changes
    
    ---
     CHANGES.md                                    | 54 +++++++++++++++++++
     changelog.d/4533.misc                         |  1 -
     changelog.d/4780.bugfix                       |  1 -
     changelog.d/4860.bugfix                       |  1 -
     changelog.d/5230.feature                      |  1 -
     changelog.d/5232.feature                      |  1 -
     changelog.d/5260.misc                         |  1 -
     changelog.d/5270.misc                         |  1 -
     changelog.d/5271.sdk                          |  1 -
     changelog.d/5340.bugfix                       |  1 -
     changelog.d/5346.misc                         |  1 -
     changelog.d/5347.misc                         |  1 -
     changelog.d/5375.wip                          |  1 -
     changelog.d/5378.misc                         |  1 -
     changelog.d/5384.misc                         |  1 -
     changelog.d/5389.wip                          |  1 -
     changelog.d/5395.feature                      |  1 -
     changelog.d/5408.misc                         |  1 -
     changelog.d/5417.feature                      |  1 -
     changelog.d/5443.misc                         |  1 -
     changelog.d/5448.bugfix                       |  1 -
     changelog.d/5489.bugfix                       |  1 -
     changelog.d/5501.misc                         |  1 -
     changelog.d/5513.misc                         |  1 -
     changelog.d/5514.bugfix                       |  1 -
     changelog.d/5521.bugfix                       |  1 -
     changelog.d/5522.feature                      |  1 -
     changelog.d/5536.feature                      |  1 -
     changelog.d/5540.bugfix                       |  1 -
     changelog.d/5547.bugfix                       |  1 -
     changelog.d/5551.bugfix                       |  1 -
     changelog.d/5552.bugfix                       |  1 -
     changelog.d/5563.misc                         |  1 -
     changelog.d/5564.bugfix                       |  1 -
     changelog.d/5571.feature                      |  1 -
     changelog.d/5572.misc                         |  2 -
     .../android/en-US/changelogs/40104060.txt     |  2 +
     37 files changed, 56 insertions(+), 36 deletions(-)
     delete mode 100644 changelog.d/4533.misc
     delete mode 100644 changelog.d/4780.bugfix
     delete mode 100644 changelog.d/4860.bugfix
     delete mode 100644 changelog.d/5230.feature
     delete mode 100644 changelog.d/5232.feature
     delete mode 100644 changelog.d/5260.misc
     delete mode 100644 changelog.d/5270.misc
     delete mode 100644 changelog.d/5271.sdk
     delete mode 100644 changelog.d/5340.bugfix
     delete mode 100644 changelog.d/5346.misc
     delete mode 100644 changelog.d/5347.misc
     delete mode 100644 changelog.d/5375.wip
     delete mode 100644 changelog.d/5378.misc
     delete mode 100644 changelog.d/5384.misc
     delete mode 100644 changelog.d/5389.wip
     delete mode 100644 changelog.d/5395.feature
     delete mode 100644 changelog.d/5408.misc
     delete mode 100644 changelog.d/5417.feature
     delete mode 100644 changelog.d/5443.misc
     delete mode 100644 changelog.d/5448.bugfix
     delete mode 100644 changelog.d/5489.bugfix
     delete mode 100644 changelog.d/5501.misc
     delete mode 100644 changelog.d/5513.misc
     delete mode 100644 changelog.d/5514.bugfix
     delete mode 100644 changelog.d/5521.bugfix
     delete mode 100644 changelog.d/5522.feature
     delete mode 100644 changelog.d/5536.feature
     delete mode 100644 changelog.d/5540.bugfix
     delete mode 100644 changelog.d/5547.bugfix
     delete mode 100644 changelog.d/5551.bugfix
     delete mode 100644 changelog.d/5552.bugfix
     delete mode 100644 changelog.d/5563.misc
     delete mode 100644 changelog.d/5564.bugfix
     delete mode 100644 changelog.d/5571.feature
     delete mode 100644 changelog.d/5572.misc
     create mode 100644 fastlane/metadata/android/en-US/changelogs/40104060.txt
    
    diff --git a/CHANGES.md b/CHANGES.md
    index c411593627..e293a776dd 100644
    --- a/CHANGES.md
    +++ b/CHANGES.md
    @@ -1,3 +1,57 @@
    +Changes in Element v1.4.6 (2022-03-23)
    +======================================
    +
    +Features ✨
    +----------
    + - Thread timeline is now live and much faster especially for large or old threads ([#5230](https://github.com/vector-im/element-android/issues/5230))
    + - View all threads per room screen is now live when the home server supports threads ([#5232](https://github.com/vector-im/element-android/issues/5232))
    + - Add a custom view to display a picker for share location options ([#5395](https://github.com/vector-im/element-android/issues/5395))
    + - Add ability to pin a location on map for sharing ([#5417](https://github.com/vector-im/element-android/issues/5417))
    + - Poll Integration Tests ([#5522](https://github.com/vector-im/element-android/issues/5522))
    + - Live location sharing: adding build config field and show permission dialog ([#5536](https://github.com/vector-im/element-android/issues/5536))
    + - Live location sharing: Adding indicator view when enabled ([#5571](https://github.com/vector-im/element-android/issues/5571))
    +
    +Bugfixes 🐛
    +----------
    + - Poll system notifications on Android are not user friendly ([#4780](https://github.com/vector-im/element-android/issues/4780))
    + - Add colors for shield vector drawable ([#4860](https://github.com/vector-im/element-android/issues/4860))
    + - Support both stable and unstable prefixes for Events about Polls and Location ([#5340](https://github.com/vector-im/element-android/issues/5340))
    + - Fix missing messages when loading messages forwards ([#5448](https://github.com/vector-im/element-android/issues/5448))
    + - Fix presence indicator being aligned to the center of the room image ([#5489](https://github.com/vector-im/element-android/issues/5489))
    + - Read receipt in wrong order ([#5514](https://github.com/vector-im/element-android/issues/5514))
    + - Fix mentions using matrix.to rather than client defined permalink base url ([#5521](https://github.com/vector-im/element-android/issues/5521))
    + - Fixes crash when tapping the timeline verification surround box instead of the buttons ([#5540](https://github.com/vector-im/element-android/issues/5540))
    + - [Notification mode] Wrong mode is displayed when the mention only is selected on the web client ([#5547](https://github.com/vector-im/element-android/issues/5547))
    + - Fix local echos not being shown when re-opening rooms ([#5551](https://github.com/vector-im/element-android/issues/5551))
    + - Fix crash when closing a room while decrypting timeline events ([#5552](https://github.com/vector-im/element-android/issues/5552))
    + - Fix sometimes read marker not properly updating ([#5564](https://github.com/vector-im/element-android/issues/5564))
    +
    +In development 🚧
    +----------------
    + - Dynamically showing/hiding onboarding personalisation screens based on the users homeserver capabilities ([#5375](https://github.com/vector-im/element-android/issues/5375))
    + - Introduces FTUE personalisation complete screen along with confetti celebration ([#5389](https://github.com/vector-im/element-android/issues/5389))
    +
    +SDK API changes ⚠️
    +------------------
    + - Adds support for MSC3440, additional threads homeserver capabilities ([#5271](https://github.com/vector-im/element-android/issues/5271))
    +
    +Other changes
    +-------------
    + - Improve headers UI in Rooms/Messages lists ([#4533](https://github.com/vector-im/element-android/issues/4533))
    + - Number of unread messages on space badge now include number of unread DMs ([#5260](https://github.com/vector-im/element-android/issues/5260))
    + - Amend spaces menu to be consistent with iOS version ([#5270](https://github.com/vector-im/element-android/issues/5270))
    + - Selected space highlight changed in left panel ([#5346](https://github.com/vector-im/element-android/issues/5346))
    + - [Rooms list] Do not suggest collapse the unique section ([#5347](https://github.com/vector-im/element-android/issues/5347))
    + - Add analytics support for threads ([#5378](https://github.com/vector-im/element-android/issues/5378))
    + - Add top margin before our first message ([#5384](https://github.com/vector-im/element-android/issues/5384))
    + - Improved onboarding registration unit test coverage ([#5408](https://github.com/vector-im/element-android/issues/5408))
    + - Adds stable room hierarchy endpoint with a fallback to the unstable one ([#5443](https://github.com/vector-im/element-android/issues/5443))
    + - Use ColorPrimary for attachmentGalleryButton tint ([#5501](https://github.com/vector-im/element-android/issues/5501))
    + - Added online presence indicator attribute online to match offline styling ([#5513](https://github.com/vector-im/element-android/issues/5513))
    + - Add a presence sync enabling build config ([#5563](https://github.com/vector-im/element-android/issues/5563))
    + - Show stickers on click ([#5572](https://github.com/vector-im/element-android/issues/5572))
    +
    +
     Changes in Element v1.4.4 (2022-03-09)
     ======================================
     
    diff --git a/changelog.d/4533.misc b/changelog.d/4533.misc
    deleted file mode 100644
    index 1137a1c43c..0000000000
    --- a/changelog.d/4533.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Improve headers UI in Rooms/Messages lists
    diff --git a/changelog.d/4780.bugfix b/changelog.d/4780.bugfix
    deleted file mode 100644
    index 51eb1e4ad7..0000000000
    --- a/changelog.d/4780.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Poll system notifications on Android are not user friendly
    \ No newline at end of file
    diff --git a/changelog.d/4860.bugfix b/changelog.d/4860.bugfix
    deleted file mode 100644
    index 32049face4..0000000000
    --- a/changelog.d/4860.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Add colors for shield vector drawable
    \ No newline at end of file
    diff --git a/changelog.d/5230.feature b/changelog.d/5230.feature
    deleted file mode 100644
    index b333a3f2c7..0000000000
    --- a/changelog.d/5230.feature
    +++ /dev/null
    @@ -1 +0,0 @@
    -Thread timeline is now live and much faster especially for large or old threads
    \ No newline at end of file
    diff --git a/changelog.d/5232.feature b/changelog.d/5232.feature
    deleted file mode 100644
    index 8f3bec97bd..0000000000
    --- a/changelog.d/5232.feature
    +++ /dev/null
    @@ -1 +0,0 @@
    -View all threads per room screen is now live when the home server supports threads
    \ No newline at end of file
    diff --git a/changelog.d/5260.misc b/changelog.d/5260.misc
    deleted file mode 100644
    index 36812e2c83..0000000000
    --- a/changelog.d/5260.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Number of unread messages on space badge now include number of unread DMs
    \ No newline at end of file
    diff --git a/changelog.d/5270.misc b/changelog.d/5270.misc
    deleted file mode 100644
    index 9bbe41af59..0000000000
    --- a/changelog.d/5270.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Amend spaces menu to be consistent with iOS version
    \ No newline at end of file
    diff --git a/changelog.d/5271.sdk b/changelog.d/5271.sdk
    deleted file mode 100644
    index b73d97ee4f..0000000000
    --- a/changelog.d/5271.sdk
    +++ /dev/null
    @@ -1 +0,0 @@
    -Adds support for MSC3440, additional threads homeserver capabilities
    \ No newline at end of file
    diff --git a/changelog.d/5340.bugfix b/changelog.d/5340.bugfix
    deleted file mode 100644
    index 4c53f0088c..0000000000
    --- a/changelog.d/5340.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Support both stable and unstable prefixes for Events about Polls and Location
    \ No newline at end of file
    diff --git a/changelog.d/5346.misc b/changelog.d/5346.misc
    deleted file mode 100644
    index f979c180ef..0000000000
    --- a/changelog.d/5346.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Selected space highlight changed in left panel
    \ No newline at end of file
    diff --git a/changelog.d/5347.misc b/changelog.d/5347.misc
    deleted file mode 100644
    index 501ff71d7c..0000000000
    --- a/changelog.d/5347.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -[Rooms list] Do not suggest collapse the unique section
    \ No newline at end of file
    diff --git a/changelog.d/5375.wip b/changelog.d/5375.wip
    deleted file mode 100644
    index 352b2385a9..0000000000
    --- a/changelog.d/5375.wip
    +++ /dev/null
    @@ -1 +0,0 @@
    -Dynamically showing/hiding onboarding personalisation screens based on the users homeserver capabilities
    \ No newline at end of file
    diff --git a/changelog.d/5378.misc b/changelog.d/5378.misc
    deleted file mode 100644
    index 1cf6da5e59..0000000000
    --- a/changelog.d/5378.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Add analytics support for threads
    \ No newline at end of file
    diff --git a/changelog.d/5384.misc b/changelog.d/5384.misc
    deleted file mode 100644
    index dca87422bb..0000000000
    --- a/changelog.d/5384.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Add top margin before our first message
    diff --git a/changelog.d/5389.wip b/changelog.d/5389.wip
    deleted file mode 100644
    index 089fe2da1a..0000000000
    --- a/changelog.d/5389.wip
    +++ /dev/null
    @@ -1 +0,0 @@
    -Introduces FTUE personalisation complete screen along with confetti celebration
    \ No newline at end of file
    diff --git a/changelog.d/5395.feature b/changelog.d/5395.feature
    deleted file mode 100644
    index eb16c6cd81..0000000000
    --- a/changelog.d/5395.feature
    +++ /dev/null
    @@ -1 +0,0 @@
    -Add a custom view to display a picker for share location options
    diff --git a/changelog.d/5408.misc b/changelog.d/5408.misc
    deleted file mode 100644
    index 3807ee1da8..0000000000
    --- a/changelog.d/5408.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Improved onboarding registration unit test coverage
    \ No newline at end of file
    diff --git a/changelog.d/5417.feature b/changelog.d/5417.feature
    deleted file mode 100644
    index 8b64f9fc7f..0000000000
    --- a/changelog.d/5417.feature
    +++ /dev/null
    @@ -1 +0,0 @@
    -Add ability to pin a location on map for sharing
    diff --git a/changelog.d/5443.misc b/changelog.d/5443.misc
    deleted file mode 100644
    index f9fd715403..0000000000
    --- a/changelog.d/5443.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Adds stable room hierarchy endpoint with a fallback to the unstable one
    diff --git a/changelog.d/5448.bugfix b/changelog.d/5448.bugfix
    deleted file mode 100644
    index c4e8fb4a49..0000000000
    --- a/changelog.d/5448.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Fix missing messages when loading messages forwards
    diff --git a/changelog.d/5489.bugfix b/changelog.d/5489.bugfix
    deleted file mode 100644
    index 69ef0118a8..0000000000
    --- a/changelog.d/5489.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Fix presence indicator being aligned to the center of the room image
    \ No newline at end of file
    diff --git a/changelog.d/5501.misc b/changelog.d/5501.misc
    deleted file mode 100644
    index 6c46a105b7..0000000000
    --- a/changelog.d/5501.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Use ColorPrimary for attachmentGalleryButton tint
    \ No newline at end of file
    diff --git a/changelog.d/5513.misc b/changelog.d/5513.misc
    deleted file mode 100644
    index 767a9f1843..0000000000
    --- a/changelog.d/5513.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Added online presence indicator attribute online to match offline styling
    diff --git a/changelog.d/5514.bugfix b/changelog.d/5514.bugfix
    deleted file mode 100644
    index 0dfbca6e9a..0000000000
    --- a/changelog.d/5514.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Read receipt in wrong order
    \ No newline at end of file
    diff --git a/changelog.d/5521.bugfix b/changelog.d/5521.bugfix
    deleted file mode 100644
    index 851396a770..0000000000
    --- a/changelog.d/5521.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Fix mentions using matrix.to rather than client defined permalink base url
    diff --git a/changelog.d/5522.feature b/changelog.d/5522.feature
    deleted file mode 100644
    index b50e8d1e60..0000000000
    --- a/changelog.d/5522.feature
    +++ /dev/null
    @@ -1 +0,0 @@
    -Poll Integration Tests
    \ No newline at end of file
    diff --git a/changelog.d/5536.feature b/changelog.d/5536.feature
    deleted file mode 100644
    index bd0160f2fe..0000000000
    --- a/changelog.d/5536.feature
    +++ /dev/null
    @@ -1 +0,0 @@
    -Live location sharing: adding build config field and show permission dialog
    diff --git a/changelog.d/5540.bugfix b/changelog.d/5540.bugfix
    deleted file mode 100644
    index 8887cf4074..0000000000
    --- a/changelog.d/5540.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Fixes crash when tapping the timeline verification surround box instead of the buttons
    \ No newline at end of file
    diff --git a/changelog.d/5547.bugfix b/changelog.d/5547.bugfix
    deleted file mode 100644
    index 3eb631902b..0000000000
    --- a/changelog.d/5547.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -[Notification mode] Wrong mode is displayed when the mention only is selected on the web client
    \ No newline at end of file
    diff --git a/changelog.d/5551.bugfix b/changelog.d/5551.bugfix
    deleted file mode 100644
    index 22f9d51e18..0000000000
    --- a/changelog.d/5551.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Fix local echos not being shown when re-opening rooms
    diff --git a/changelog.d/5552.bugfix b/changelog.d/5552.bugfix
    deleted file mode 100644
    index 5061e642f0..0000000000
    --- a/changelog.d/5552.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Fix crash when closing a room while decrypting timeline events
    diff --git a/changelog.d/5563.misc b/changelog.d/5563.misc
    deleted file mode 100644
    index c0867365f6..0000000000
    --- a/changelog.d/5563.misc
    +++ /dev/null
    @@ -1 +0,0 @@
    -Add a presence sync enabling build config
    diff --git a/changelog.d/5564.bugfix b/changelog.d/5564.bugfix
    deleted file mode 100644
    index 64891b503c..0000000000
    --- a/changelog.d/5564.bugfix
    +++ /dev/null
    @@ -1 +0,0 @@
    -Fix sometimes read marker not properly updating
    diff --git a/changelog.d/5571.feature b/changelog.d/5571.feature
    deleted file mode 100644
    index 04b62b8940..0000000000
    --- a/changelog.d/5571.feature
    +++ /dev/null
    @@ -1 +0,0 @@
    -Live location sharing: Adding indicator view when enabled
    diff --git a/changelog.d/5572.misc b/changelog.d/5572.misc
    deleted file mode 100644
    index d37d8fe07d..0000000000
    --- a/changelog.d/5572.misc
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -Show stickers on click
    -
    diff --git a/fastlane/metadata/android/en-US/changelogs/40104060.txt b/fastlane/metadata/android/en-US/changelogs/40104060.txt
    new file mode 100644
    index 0000000000..1863bef5fb
    --- /dev/null
    +++ b/fastlane/metadata/android/en-US/changelogs/40104060.txt
    @@ -0,0 +1,2 @@
    +Main changes in this version: Thread timeline are now live and faster. Various bug fixes and stability improvements.
    +Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.4.6
    \ No newline at end of file
    
    From 55b1a60f96e58491ae9c31f7b8453c951a940559 Mon Sep 17 00:00:00 2001
    From: ganfra 
    Date: Wed, 23 Mar 2022 16:09:05 +0100
    Subject: [PATCH 117/126] Revert "Do not suggest collapse if there is only one
     section"
    
    This reverts commit 6787980185221f351d867136486cb45923dab72a.
    ---
     .../features/home/room/list/RoomListFragment.kt | 14 +++-----------
     .../home/room/list/SectionHeaderAdapter.kt      | 17 +++++------------
     2 files changed, 8 insertions(+), 23 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
    index a8f1174283..4265eebe62 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
    @@ -295,8 +295,7 @@ class RoomListFragment @Inject constructor(
                                             section.notificationCount.observe(viewLifecycleOwner) { counts ->
                                                 sectionAdapter.updateSection(sectionAdapter.roomsSectionData.copy(
                                                         notificationCount = counts.totalCount,
    -                                                    isHighlighted = counts.isHighlight,
    -                                                    shouldShowExpandedArrow = shouldShowExpendedArrow()
    +                                                    isHighlighted = counts.isHighlight
                                                 ))
                                             }
                                             section.isExpanded.observe(viewLifecycleOwner) { _ ->
    @@ -330,17 +329,14 @@ class RoomListFragment @Inject constructor(
                                                 controller.setData(list)
                                                 sectionAdapter.updateSection(sectionAdapter.roomsSectionData.copy(
                                                         isHidden = list.isEmpty(),
    -                                                    isLoading = false,
    -                                                    shouldShowExpandedArrow = shouldShowExpendedArrow()
    -                                            ))
    +                                                    isLoading = false))
                                                 checkEmptyState()
                                             }
                                             observeItemCount(section, sectionAdapter)
                                             section.notificationCount.observe(viewLifecycleOwner) { counts ->
                                                 sectionAdapter.updateSection(sectionAdapter.roomsSectionData.copy(
                                                         notificationCount = counts.totalCount,
    -                                                    isHighlighted = counts.isHighlight,
    -                                                    shouldShowExpandedArrow = shouldShowExpendedArrow()
    +                                                    isHighlighted = counts.isHighlight
                                                 ))
                                             }
                                             section.isExpanded.observe(viewLifecycleOwner) { _ ->
    @@ -448,10 +444,6 @@ class RoomListFragment @Inject constructor(
             footerController.setData(state)
         }
     
    -    private fun shouldShowExpendedArrow(): Boolean {
    -        return adapterInfosList.filter { !it.sectionHeaderAdapter.roomsSectionData.isHidden }.size >= 2
    -    }
    -
         private fun checkEmptyState() {
             val shouldShowEmpty = adapterInfosList.all { it.sectionHeaderAdapter.roomsSectionData.isHidden } &&
                     !adapterInfosList.any { it.sectionHeaderAdapter.roomsSectionData.isLoading }
    diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/SectionHeaderAdapter.kt b/vector/src/main/java/im/vector/app/features/home/room/list/SectionHeaderAdapter.kt
    index cd2879cf28..2e6436d21d 100644
    --- a/vector/src/main/java/im/vector/app/features/home/room/list/SectionHeaderAdapter.kt
    +++ b/vector/src/main/java/im/vector/app/features/home/room/list/SectionHeaderAdapter.kt
    @@ -17,7 +17,6 @@
     package im.vector.app.features.home.room.list
     
     import android.view.LayoutInflater
    -import android.view.View
     import android.view.ViewGroup
     import androidx.core.content.ContextCompat
     import androidx.core.graphics.drawable.DrawableCompat
    @@ -40,8 +39,7 @@ class SectionHeaderAdapter constructor(
                 val isHighlighted: Boolean = false,
                 val isHidden: Boolean = true,
                 // This will be false until real data has been submitted once
    -            val isLoading: Boolean = true,
    -            val shouldShowExpandedArrow: Boolean = false
    +            val isLoading: Boolean = true
         )
     
         lateinit var roomsSectionData: RoomsSectionData
    @@ -84,16 +82,11 @@ class SectionHeaderAdapter constructor(
             fun bind(roomsSectionData: RoomsSectionData) {
                 binding.roomCategoryTitleView.text = roomsSectionData.name
                 val tintColor = ThemeUtils.getColor(binding.root.context, R.attr.vctr_content_secondary)
    -            if (roomsSectionData.shouldShowExpandedArrow) {
    -                binding.roomCategoryCounterView.visibility = View.VISIBLE
    -                val expandedArrowDrawableRes = if (roomsSectionData.isExpanded) R.drawable.ic_expand_more else R.drawable.ic_expand_less
    -                val expandedArrowDrawable = ContextCompat.getDrawable(binding.root.context, expandedArrowDrawableRes)?.also {
    -                    DrawableCompat.setTint(it, tintColor)
    -                }
    -                binding.roomCategoryCounterView.setCompoundDrawablesWithIntrinsicBounds(null, null, expandedArrowDrawable, null)
    -            } else {
    -                binding.roomCategoryCounterView.visibility = View.GONE
    +            val expandedArrowDrawableRes = if (roomsSectionData.isExpanded) R.drawable.ic_expand_more else R.drawable.ic_expand_less
    +            val expandedArrowDrawable = ContextCompat.getDrawable(binding.root.context, expandedArrowDrawableRes)?.also {
    +                DrawableCompat.setTint(it, tintColor)
                 }
    +            binding.roomCategoryCounterView.setCompoundDrawablesWithIntrinsicBounds(null, null, expandedArrowDrawable, null)
                 binding.roomCategoryCounterView.text = roomsSectionData.itemCount.takeIf { it > 0 }?.toString().orEmpty()
                 binding.roomCategoryUnreadCounterBadgeView.render(UnreadCounterBadgeView.State(roomsSectionData.notificationCount, roomsSectionData.isHighlighted))
             }
    
    From adf2c642da32a63c40e4f29908b421045753a109 Mon Sep 17 00:00:00 2001
    From: ganfra 
    Date: Wed, 23 Mar 2022 16:27:36 +0100
    Subject: [PATCH 118/126] Update versions to 1.4.8
    
    ---
     matrix-sdk-android/build.gradle | 2 +-
     vector/build.gradle             | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle
    index 2b2c38e22a..1e2eda166f 100644
    --- a/matrix-sdk-android/build.gradle
    +++ b/matrix-sdk-android/build.gradle
    @@ -31,7 +31,7 @@ android {
             // that the app's state is completely cleared between tests.
             testInstrumentationRunnerArguments clearPackageData: 'true'
     
    -        buildConfigField "String", "SDK_VERSION", "\"1.4.6\""
    +        buildConfigField "String", "SDK_VERSION", "\"1.4.8\""
     
             buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
             buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""
    diff --git a/vector/build.gradle b/vector/build.gradle
    index 04b20599d4..9f8471bc18 100644
    --- a/vector/build.gradle
    +++ b/vector/build.gradle
    @@ -18,7 +18,7 @@ ext.versionMinor = 4
     // Note: even values are reserved for regular release, odd values for hotfix release.
     // When creating a hotfix, you should decrease the value, since the current value
     // is the value for the next regular release.
    -ext.versionPatch = 6
    +ext.versionPatch = 8
     
     static def getGitTimestamp() {
         def cmd = 'git show -s --format=%ct'
    
    From e3df9c4ceff2ad888ee1c2a14399929bb37f3b53 Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Tue, 8 Mar 2022 11:06:35 +0000
    Subject: [PATCH 119/126] using isLoading boolean instead of stateless async
     result for the display name and profile picture updates
    
    ---
     .../onboarding/OnboardingViewModel.kt         | 12 +++++------
     .../onboarding/OnboardingViewState.kt         |  9 +++-----
     .../onboarding/ftueauth/FtueAuthVariant.kt    |  2 +-
     .../onboarding/OnboardingViewModelTest.kt     | 21 +++++++++----------
     4 files changed, 20 insertions(+), 24 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    index e7302cb1e2..6ebbffa6e3 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    @@ -828,20 +828,20 @@ class OnboardingViewModel @AssistedInject constructor(
         }
     
         private fun updateDisplayName(displayName: String) {
    -        setState { copy(asyncDisplayName = Loading()) }
    +        setState { copy(isLoading = true) }
             viewModelScope.launch {
                 val activeSession = activeSessionHolder.getActiveSession()
                 try {
                     activeSession.setDisplayName(activeSession.myUserId, displayName)
                     setState {
                         copy(
    -                            asyncDisplayName = Success(Unit),
    +                            isLoading = false,
                                 personalizationState = personalizationState.copy(displayName = displayName)
                         )
                     }
                     handleDisplayNameStepComplete()
                 } catch (error: Throwable) {
    -                setState { copy(asyncDisplayName = Fail(error)) }
    +                setState { copy(isLoading = false) }
                     _viewEvents.post(OnboardingViewEvents.Failure(error))
                 }
             }
    @@ -883,7 +883,7 @@ class OnboardingViewModel @AssistedInject constructor(
                 when (val pictureUri = state.personalizationState.selectedPictureUri) {
                     null -> _viewEvents.post(OnboardingViewEvents.Failure(NullPointerException("picture uri is missing from state")))
                     else -> {
    -                    setState { copy(asyncProfilePicture = Loading()) }
    +                    setState { copy(isLoading = true) }
                         viewModelScope.launch {
                             val activeSession = activeSessionHolder.getActiveSession()
                             try {
    @@ -894,12 +894,12 @@ class OnboardingViewModel @AssistedInject constructor(
                                 )
                                 setState {
                                     copy(
    -                                        asyncProfilePicture = Success(Unit),
    +                                        isLoading = false,
                                     )
                                 }
                                 onProfilePictureSaved()
                             } catch (error: Throwable) {
    -                            setState { copy(asyncProfilePicture = Fail(error)) }
    +                            setState { copy(isLoading = false) }
                                 _viewEvents.post(OnboardingViewEvents.Failure(error))
                             }
                         }
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    index 8747de6da8..cdb68cfdac 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    @@ -34,8 +34,7 @@ data class OnboardingViewState(
             val asyncResetPassword: Async = Uninitialized,
             val asyncResetMailConfirmed: Async = Uninitialized,
             val asyncRegistration: Async = Uninitialized,
    -        val asyncDisplayName: Async = Uninitialized,
    -        val asyncProfilePicture: Async = Uninitialized,
    +        val isLoading: Boolean = false,
     
             @PersistState
             val onboardingFlow: OnboardingFlow? = null,
    @@ -73,14 +72,12 @@ data class OnboardingViewState(
             val personalizationState: PersonalizationState = PersonalizationState()
     ) : MavericksState {
     
    -    fun isLoading(): Boolean {
    +    fun legacyIsLoading(): Boolean {
             return asyncLoginAction is Loading ||
                     asyncHomeServerLoginFlowRequest is Loading ||
                     asyncResetPassword is Loading ||
                     asyncResetMailConfirmed is Loading ||
    -                asyncRegistration is Loading ||
    -                asyncDisplayName is Loading ||
    -                asyncProfilePicture is Loading
    +                asyncRegistration is Loading
         }
     }
     
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    index 13b5f61010..b8319c9f3a 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    @@ -121,7 +121,7 @@ class FtueAuthVariant(
     
         private fun updateWithState(viewState: OnboardingViewState) {
             isForceLoginFallbackEnabled = viewState.isForceLoginFallbackEnabled
    -        views.loginLoading.isVisible = viewState.isLoading()
    +        views.loginLoading.isVisible = viewState.isLoading || viewState.legacyIsLoading()
         }
     
         override fun setIsLoading(isLoading: Boolean) = Unit
    diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    index 4fd079611d..20e6ceb55d 100644
    --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    @@ -17,7 +17,6 @@
     package im.vector.app.features.onboarding
     
     import android.net.Uri
    -import com.airbnb.mvrx.Fail
     import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.Success
     import com.airbnb.mvrx.Uninitialized
    @@ -260,8 +259,8 @@ class OnboardingViewModelTest {
             test
                     .assertStatesChanges(
                             initialState,
    -                        { copy(asyncDisplayName = Loading()) },
    -                        { copy(asyncDisplayName = Fail(AN_ERROR)) },
    +                        { copy(isLoading = true) },
    +                        { copy(isLoading = false) },
                     )
                     .assertEvents(OnboardingViewEvents.Failure(AN_ERROR))
                     .finish()
    @@ -307,7 +306,7 @@ class OnboardingViewModelTest {
             viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
     
             test
    -                .assertStates(expectedProfilePictureFailureStates(initialStateWithPicture, AN_ERROR))
    +                .assertStates(expectedProfilePictureFailureStates(initialStateWithPicture))
                     .assertEvents(OnboardingViewEvents.Failure(AN_ERROR))
                     .finish()
         }
    @@ -362,20 +361,20 @@ class OnboardingViewModelTest {
     
         private fun expectedProfilePictureSuccessStates(state: OnboardingViewState) = listOf(
                 state,
    -            state.copy(asyncProfilePicture = Loading()),
    -            state.copy(asyncProfilePicture = Success(Unit))
    +            state.copy(isLoading = true),
    +            state.copy(isLoading = false)
         )
     
    -    private fun expectedProfilePictureFailureStates(state: OnboardingViewState, cause: Exception) = listOf(
    +    private fun expectedProfilePictureFailureStates(state: OnboardingViewState) = listOf(
                 state,
    -            state.copy(asyncProfilePicture = Loading()),
    -            state.copy(asyncProfilePicture = Fail(cause))
    +            state.copy(isLoading = true),
    +            state.copy(isLoading = false)
         )
     
         private fun expectedSuccessfulDisplayNameUpdateStates(): List OnboardingViewState> {
             return listOf(
    -                { copy(asyncDisplayName = Loading()) },
    -                { copy(asyncDisplayName = Success(Unit), personalizationState = personalizationState.copy(displayName = A_DISPLAY_NAME)) }
    +                { copy(isLoading = true) },
    +                { copy(isLoading = false, personalizationState = personalizationState.copy(displayName = A_DISPLAY_NAME)) }
             )
         }
     
    
    From 2227df479c3d46cf21369a99df4e63901d297375 Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Tue, 8 Mar 2022 11:41:32 +0000
    Subject: [PATCH 120/126] replacing async login/register state with separate
     failure view event and shared isLoading
    
    ---
     .../onboarding/OnboardingViewModel.kt         | 101 +++++-------------
     .../onboarding/OnboardingViewState.kt         |   8 +-
     .../ftueauth/FtueAuthLoginFragment.kt         |  65 ++++++-----
     .../onboarding/OnboardingViewModelTest.kt     |  22 ++--
     4 files changed, 67 insertions(+), 129 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    index 6ebbffa6e3..d6c0daa26e 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    @@ -239,31 +239,19 @@ class OnboardingViewModel @AssistedInject constructor(
             val safeLoginWizard = loginWizard
     
             if (safeLoginWizard == null) {
    -            setState {
    -                copy(
    -                        asyncLoginAction = Fail(Throwable("Bad configuration"))
    -                )
    -            }
    +            setState { copy(isLoading = false) }
    +            _viewEvents.post(OnboardingViewEvents.Failure(Throwable("Bad configuration")))
             } else {
    -            setState {
    -                copy(
    -                        asyncLoginAction = Loading()
    -                )
    -            }
    +            setState { copy(isLoading = true) }
     
                 currentJob = viewModelScope.launch {
                     try {
    -                    safeLoginWizard.loginWithToken(action.loginToken)
    +                    val result = safeLoginWizard.loginWithToken(action.loginToken)
    +                    onSessionCreated(result, isAccountCreated = false)
                     } catch (failure: Throwable) {
                         _viewEvents.post(OnboardingViewEvents.Failure(failure))
    -                    setState {
    -                        copy(
    -                                asyncLoginAction = Fail(failure)
    -                        )
    -                    }
    -                    null
    +                    setState { copy(isLoading = false) }
                     }
    -                        ?.let { onSessionCreated(it, isAccountCreated = false) }
                 }
             }
         }
    @@ -271,7 +259,7 @@ class OnboardingViewModel @AssistedInject constructor(
         private fun handleRegisterAction(action: RegisterAction) {
             currentJob = viewModelScope.launch {
                 if (action.hasLoadingState()) {
    -                setState { copy(asyncRegistration = Loading()) }
    +                setState { copy(isLoading = true) }
                 }
                 runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) }
                         .fold(
    @@ -292,7 +280,7 @@ class OnboardingViewModel @AssistedInject constructor(
                                     }
                                 }
                         )
    -            setState { copy(asyncRegistration = Uninitialized) }
    +            setState { copy(isLoading = false) }
             }
         }
     
    @@ -345,12 +333,7 @@ class OnboardingViewModel @AssistedInject constructor(
                 OnboardingAction.ResetLogin          -> {
                     viewModelScope.launch {
                         authenticationService.cancelPendingLoginOrRegistration()
    -                    setState {
    -                        copy(
    -                                asyncLoginAction = Uninitialized,
    -                                asyncRegistration = Uninitialized
    -                        )
    -                    }
    +                    setState { copy(isLoading = false) }
                     }
                 }
                 OnboardingAction.ResetResetPassword  -> {
    @@ -515,11 +498,7 @@ class OnboardingViewModel @AssistedInject constructor(
         }
     
         private fun handleDirectLogin(action: OnboardingAction.LoginOrRegister, homeServerConnectionConfig: HomeServerConnectionConfig?) {
    -        setState {
    -            copy(
    -                    asyncLoginAction = Loading()
    -            )
    -        }
    +        setState { copy(isLoading = true) }
     
             currentJob = viewModelScope.launch {
                 val data = try {
    @@ -546,11 +525,7 @@ class OnboardingViewModel @AssistedInject constructor(
         }
     
         private fun onWellKnownError() {
    -        setState {
    -            copy(
    -                    asyncLoginAction = Uninitialized
    -            )
    -        }
    +        setState { copy(isLoading = false) }
             _viewEvents.post(OnboardingViewEvents.Failure(Exception(stringProvider.getString(R.string.autodiscover_well_known_error))))
         }
     
    @@ -587,18 +562,10 @@ class OnboardingViewModel @AssistedInject constructor(
                 is Failure.UnrecognizedCertificateFailure -> {
                     // Display this error in a dialog
                     _viewEvents.post(OnboardingViewEvents.Failure(failure))
    -                setState {
    -                    copy(
    -                            asyncLoginAction = Uninitialized
    -                    )
    -                }
    +                setState { copy(isLoading = false) }
                 }
                 else                                      -> {
    -                setState {
    -                    copy(
    -                            asyncLoginAction = Fail(failure)
    -                    )
    -                }
    +                setState { copy(isLoading = false) }
                 }
             }
         }
    @@ -607,37 +574,22 @@ class OnboardingViewModel @AssistedInject constructor(
             val safeLoginWizard = loginWizard
     
             if (safeLoginWizard == null) {
    -            setState {
    -                copy(
    -                        asyncLoginAction = Fail(Throwable("Bad configuration"))
    -                )
    -            }
    +            setState { copy(isLoading = false) }
    +            _viewEvents.post(OnboardingViewEvents.Failure(Throwable("Bad configuration")))
             } else {
    -            setState {
    -                copy(
    -                        asyncLoginAction = Loading()
    -                )
    -            }
    -
    +            setState { copy(isLoading = true) }
                 currentJob = viewModelScope.launch {
                     try {
    -                    safeLoginWizard.login(
    +                    val result = safeLoginWizard.login(
                                 action.username,
                                 action.password,
                                 action.initialDeviceName
                         )
    +                    reAuthHelper.data = action.password
    +                    onSessionCreated(result, isAccountCreated = false)
                     } catch (failure: Throwable) {
    -                    setState {
    -                        copy(
    -                                asyncLoginAction = Fail(failure)
    -                        )
    -                    }
    -                    null
    +                    setState { copy(isLoading = false) }
                     }
    -                        ?.let {
    -                            reAuthHelper.data = action.password
    -                            onSessionCreated(it, isAccountCreated = false)
    -                        }
                 }
             }
         }
    @@ -678,12 +630,12 @@ class OnboardingViewModel @AssistedInject constructor(
                 true  -> {
                     val personalizationState = createPersonalizationState(session, state)
                     setState {
    -                    copy(asyncLoginAction = Success(Unit), personalizationState = personalizationState)
    +                    copy(isLoading = false, personalizationState = personalizationState)
                     }
                     _viewEvents.post(OnboardingViewEvents.OnAccountCreated)
                 }
                 false -> {
    -                setState { copy(asyncLoginAction = Success(Unit)) }
    +                setState { copy(isLoading = false) }
                     _viewEvents.post(OnboardingViewEvents.OnAccountSignedIn)
                 }
             }
    @@ -712,14 +664,11 @@ class OnboardingViewModel @AssistedInject constructor(
             } else {
                 currentJob = viewModelScope.launch {
                     try {
    -                    authenticationService.createSessionFromSso(homeServerConnectionConfigFinal, action.credentials)
    +                    val result = authenticationService.createSessionFromSso(homeServerConnectionConfigFinal, action.credentials)
    +                    onSessionCreated(result, isAccountCreated = false)
                     } catch (failure: Throwable) {
    -                    setState {
    -                        copy(asyncLoginAction = Fail(failure))
    -                    }
    -                    null
    +                    setState { copy(isLoading = false) }
                     }
    -                        ?.let { onSessionCreated(it, isAccountCreated = false) }
                 }
             }
         }
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    index cdb68cfdac..063c651dfd 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    @@ -29,11 +29,9 @@ import im.vector.app.features.login.SignMode
     import kotlinx.parcelize.Parcelize
     
     data class OnboardingViewState(
    -        val asyncLoginAction: Async = Uninitialized,
             val asyncHomeServerLoginFlowRequest: Async = Uninitialized,
             val asyncResetPassword: Async = Uninitialized,
             val asyncResetMailConfirmed: Async = Uninitialized,
    -        val asyncRegistration: Async = Uninitialized,
             val isLoading: Boolean = false,
     
             @PersistState
    @@ -73,11 +71,9 @@ data class OnboardingViewState(
     ) : MavericksState {
     
         fun legacyIsLoading(): Boolean {
    -        return asyncLoginAction is Loading ||
    -                asyncHomeServerLoginFlowRequest is Loading ||
    +        return asyncHomeServerLoginFlowRequest is Loading ||
                     asyncResetPassword is Loading ||
    -                asyncResetMailConfirmed is Loading ||
    -                asyncRegistration is Loading
    +                asyncResetMailConfirmed is Loading
         }
     }
     
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    index dacd8feab3..a5536b1dcd 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    @@ -26,8 +26,6 @@ import androidx.autofill.HintConstants
     import androidx.core.text.isDigitsOnly
     import androidx.core.view.isVisible
     import androidx.lifecycle.lifecycleScope
    -import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Loading
     import im.vector.app.R
     import im.vector.app.core.extensions.hideKeyboard
     import im.vector.app.core.extensions.hidePassword
    @@ -74,6 +72,33 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
         override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
             super.onViewCreated(view, savedInstanceState)
     
    +        viewModel.viewEvents
    +                .stream()
    +                .onEach {
    +                    when (it) {
    +                        is OnboardingViewEvents.Failure -> {
    +                            if (it.throwable is Failure.ServerError &&
    +                                    it.throwable.error.code == MatrixError.M_FORBIDDEN &&
    +                                    it.throwable.error.message.isEmpty()) {
    +                                // Login with email, but email unknown
    +                                views.loginFieldTil.error = getString(R.string.login_login_with_email_error)
    +                            } else {
    +                                // Trick to display the error without text.
    +                                views.loginFieldTil.error = " "
    +                                if (it.throwable.isInvalidPassword() && spaceInPassword()) {
    +                                    views.passwordFieldTil.error = getString(R.string.auth_invalid_login_param_space_in_password)
    +                                } else {
    +                                    views.passwordFieldTil.error = errorFormatter.toHumanReadable(it.throwable)
    +                                }
    +                            }
    +                        }
    +                        else                            -> {
    +                            // do nothing
    +                        }
    +                    }
    +                }
    +                .launchIn(lifecycleScope)
    +
             setupSubmitButton()
             setupForgottenPasswordButton()
     
    @@ -274,39 +299,9 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
             setupSocialLoginButtons(state)
             setupButtons(state)
     
    -        when (state.asyncLoginAction) {
    -            is Loading -> {
    -                // Ensure password is hidden
    -                views.passwordField.hidePassword()
    -            }
    -            is Fail    -> {
    -                val error = state.asyncLoginAction.error
    -                if (error is Failure.ServerError &&
    -                        error.error.code == MatrixError.M_FORBIDDEN &&
    -                        error.error.message.isEmpty()) {
    -                    // Login with email, but email unknown
    -                    views.loginFieldTil.error = getString(R.string.login_login_with_email_error)
    -                } else {
    -                    // Trick to display the error without text.
    -                    views.loginFieldTil.error = " "
    -                    if (error.isInvalidPassword() && spaceInPassword()) {
    -                        views.passwordFieldTil.error = getString(R.string.auth_invalid_login_param_space_in_password)
    -                    } else {
    -                        views.passwordFieldTil.error = errorFormatter.toHumanReadable(error)
    -                    }
    -                }
    -            }
    -            // Success is handled by the LoginActivity
    -            else       -> Unit
    -        }
    -
    -        when (state.asyncRegistration) {
    -            is Loading -> {
    -                // Ensure password is hidden
    -                views.passwordField.hidePassword()
    -            }
    -            // Success is handled by the LoginActivity
    -            else       -> Unit
    +        if (state.isLoading) {
    +            // Ensure password is hidden
    +            views.passwordField.hidePassword()
             }
         }
     
    diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    index 20e6ceb55d..09cefc5ff2 100644
    --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    @@ -128,8 +128,8 @@ class OnboardingViewModelTest {
                     .assertStatesChanges(
                             initialState,
                             { copy(signMode = SignMode.SignUp) },
    -                        { copy(asyncRegistration = Loading()) },
    -                        { copy(asyncRegistration = Uninitialized) }
    +                        { copy(isLoading = true) },
    +                        { copy(isLoading = false) }
                     )
                     .assertEvents(OnboardingViewEvents.RegistrationFlowResult(ANY_CONTINUING_REGISTRATION_RESULT.flowResult, isRegistrationStarted = true))
                     .finish()
    @@ -145,8 +145,8 @@ class OnboardingViewModelTest {
             test
                     .assertStatesChanges(
                             initialState,
    -                        { copy(asyncRegistration = Loading()) },
    -                        { copy(asyncRegistration = Uninitialized) }
    +                        { copy(isLoading = true) },
    +                        { copy(isLoading = false) }
                     )
                     .assertEvents(OnboardingViewEvents.RegistrationFlowResult(ANY_CONTINUING_REGISTRATION_RESULT.flowResult, isRegistrationStarted = true))
                     .finish()
    @@ -175,8 +175,8 @@ class OnboardingViewModelTest {
             test
                     .assertStatesChanges(
                             initialState,
    -                        { copy(asyncRegistration = Loading()) },
    -                        { copy(asyncRegistration = Uninitialized) }
    +                        { copy(isLoading = true) },
    +                        { copy(isLoading = false) }
                     )
                     .assertNoEvents()
                     .finish()
    @@ -193,9 +193,8 @@ class OnboardingViewModelTest {
             test
                     .assertStatesChanges(
                             initialState,
    -                        { copy(asyncRegistration = Loading()) },
    -                        { copy(asyncLoginAction = Success(Unit), personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) },
    -                        { copy(asyncLoginAction = Success(Unit), asyncRegistration = Uninitialized) }
    +                        { copy(isLoading = true) },
    +                        { copy(isLoading = false, personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) }
                     )
                     .assertEvents(OnboardingViewEvents.OnAccountCreated)
                     .finish()
    @@ -211,9 +210,8 @@ class OnboardingViewModelTest {
             test
                     .assertStatesChanges(
                             initialState,
    -                        { copy(asyncRegistration = Loading()) },
    -                        { copy(asyncLoginAction = Success(Unit), personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) },
    -                        { copy(asyncRegistration = Uninitialized) }
    +                        { copy(isLoading = true) },
    +                        { copy(isLoading = false, personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) }
                     )
                     .assertEvents(OnboardingViewEvents.OnAccountCreated)
                     .finish()
    
    From 7d80cfed0b2199d63d445d330ac18252b00cf6b2 Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Tue, 8 Mar 2022 12:00:42 +0000
    Subject: [PATCH 121/126] replacing async reset password,mail and homeserver
     requests with shared isLoading with error view events
    
    ---
     .../onboarding/OnboardingViewModel.kt         | 72 ++++++-------------
     .../onboarding/OnboardingViewState.kt         | 15 +---
     .../ftueauth/FtueAuthResetPasswordFragment.kt | 20 ++----
     ...thResetPasswordMailConfirmationFragment.kt | 30 ++++----
     .../onboarding/ftueauth/FtueAuthVariant.kt    |  2 +-
     5 files changed, 44 insertions(+), 95 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    index d6c0daa26e..a18b9e62e0 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
    @@ -18,11 +18,7 @@ package im.vector.app.features.onboarding
     
     import android.content.Context
     import android.net.Uri
    -import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.MavericksViewModelFactory
    -import com.airbnb.mvrx.Success
    -import com.airbnb.mvrx.Uninitialized
     import dagger.assisted.Assisted
     import dagger.assisted.AssistedFactory
     import dagger.assisted.AssistedInject
    @@ -249,8 +245,8 @@ class OnboardingViewModel @AssistedInject constructor(
                         val result = safeLoginWizard.loginWithToken(action.loginToken)
                         onSessionCreated(result, isAccountCreated = false)
                     } catch (failure: Throwable) {
    -                    _viewEvents.post(OnboardingViewEvents.Failure(failure))
                         setState { copy(isLoading = false) }
    +                    _viewEvents.post(OnboardingViewEvents.Failure(failure))
                     }
                 }
             }
    @@ -310,7 +306,7 @@ class OnboardingViewModel @AssistedInject constructor(
                         authenticationService.reset()
                         setState {
                             copy(
    -                                asyncHomeServerLoginFlowRequest = Uninitialized,
    +                                isLoading = false,
                                     homeServerUrlFromUser = null,
                                     homeServerUrl = null,
                                     loginMode = LoginMode.Unknown,
    @@ -323,7 +319,7 @@ class OnboardingViewModel @AssistedInject constructor(
                 OnboardingAction.ResetSignMode       -> {
                     setState {
                         copy(
    -                            asyncHomeServerLoginFlowRequest = Uninitialized,
    +                            isLoading = false,
                                 signMode = SignMode.Unknown,
                                 loginMode = LoginMode.Unknown,
                                 loginModeSupportedTypes = emptyList()
    @@ -339,8 +335,7 @@ class OnboardingViewModel @AssistedInject constructor(
                 OnboardingAction.ResetResetPassword  -> {
                     setState {
                         copy(
    -                            asyncResetPassword = Uninitialized,
    -                            asyncResetMailConfirmed = Uninitialized,
    +                            isLoading = false,
                                 resetPasswordEmail = null
                         )
                     }
    @@ -409,35 +404,23 @@ class OnboardingViewModel @AssistedInject constructor(
             val safeLoginWizard = loginWizard
     
             if (safeLoginWizard == null) {
    -            setState {
    -                copy(
    -                        asyncResetPassword = Fail(Throwable("Bad configuration")),
    -                        asyncResetMailConfirmed = Uninitialized
    -                )
    -            }
    +            setState { copy(isLoading = false) }
    +            _viewEvents.post(OnboardingViewEvents.Failure(Throwable("Bad configuration")))
             } else {
    -            setState {
    -                copy(
    -                        asyncResetPassword = Loading(),
    -                        asyncResetMailConfirmed = Uninitialized
    -                )
    -            }
    +            setState { copy(isLoading = true) }
     
                 currentJob = viewModelScope.launch {
                     try {
                         safeLoginWizard.resetPassword(action.email, action.newPassword)
                     } catch (failure: Throwable) {
    -                    setState {
    -                        copy(
    -                                asyncResetPassword = Fail(failure)
    -                        )
    -                    }
    +                    setState { copy(isLoading = false) }
    +                    _viewEvents.post(OnboardingViewEvents.Failure(failure))
                         return@launch
                     }
     
                     setState {
                         copy(
    -                            asyncResetPassword = Success(Unit),
    +                            isLoading = false,
                                 resetPasswordEmail = action.email
                         )
                     }
    @@ -451,34 +434,22 @@ class OnboardingViewModel @AssistedInject constructor(
             val safeLoginWizard = loginWizard
     
             if (safeLoginWizard == null) {
    -            setState {
    -                copy(
    -                        asyncResetPassword = Uninitialized,
    -                        asyncResetMailConfirmed = Fail(Throwable("Bad configuration"))
    -                )
    -            }
    +            setState { copy(isLoading = false) }
    +            _viewEvents.post(OnboardingViewEvents.Failure(Throwable("Bad configuration")))
             } else {
    -            setState {
    -                copy(
    -                        asyncResetPassword = Uninitialized,
    -                        asyncResetMailConfirmed = Loading()
    -                )
    -            }
    +            setState { copy(isLoading = false) }
     
                 currentJob = viewModelScope.launch {
                     try {
                         safeLoginWizard.resetPasswordMailConfirmed()
                     } catch (failure: Throwable) {
    -                    setState {
    -                        copy(
    -                                asyncResetMailConfirmed = Fail(failure)
    -                        )
    -                    }
    +                    setState { copy(isLoading = false) }
    +                    _viewEvents.post(OnboardingViewEvents.Failure(failure))
                         return@launch
                     }
                     setState {
                         copy(
    -                            asyncResetMailConfirmed = Success(Unit),
    +                            isLoading = false,
                                 resetPasswordEmail = null
                         )
                     }
    @@ -560,9 +531,9 @@ class OnboardingViewModel @AssistedInject constructor(
             when (failure) {
                 is MatrixIdFailure.InvalidMatrixId,
                 is Failure.UnrecognizedCertificateFailure -> {
    +                setState { copy(isLoading = false) }
                     // Display this error in a dialog
                     _viewEvents.post(OnboardingViewEvents.Failure(failure))
    -                setState { copy(isLoading = false) }
                 }
                 else                                      -> {
                     setState { copy(isLoading = false) }
    @@ -589,6 +560,7 @@ class OnboardingViewModel @AssistedInject constructor(
                         onSessionCreated(result, isAccountCreated = false)
                     } catch (failure: Throwable) {
                         setState { copy(isLoading = false) }
    +                    _viewEvents.post(OnboardingViewEvents.Failure(failure))
                     }
                 }
             }
    @@ -692,7 +664,7 @@ class OnboardingViewModel @AssistedInject constructor(
     
                 setState {
                     copy(
    -                        asyncHomeServerLoginFlowRequest = Loading(),
    +                        isLoading = true,
                             // If user has entered https://matrix.org, ensure that server type is ServerType.MatrixOrg
                             // It is also useful to set the value again in the case of a certificate error on matrix.org
                             serverType = if (homeServerConnectionConfig.homeServerUri.toString() == matrixOrgUrl) {
    @@ -706,14 +678,14 @@ class OnboardingViewModel @AssistedInject constructor(
                 val data = try {
                     authenticationService.getLoginFlow(homeServerConnectionConfig)
                 } catch (failure: Throwable) {
    -                _viewEvents.post(OnboardingViewEvents.Failure(failure))
                     setState {
                         copy(
    -                            asyncHomeServerLoginFlowRequest = Uninitialized,
    +                            isLoading = false,
                                 // If we were trying to retrieve matrix.org login flow, also reset the serverType
                                 serverType = if (serverType == ServerType.MatrixOrg) ServerType.Unknown else serverType
                         )
                     }
    +                _viewEvents.post(OnboardingViewEvents.Failure(failure))
                     null
                 }
     
    @@ -734,7 +706,7 @@ class OnboardingViewModel @AssistedInject constructor(
     
                 setState {
                     copy(
    -                        asyncHomeServerLoginFlowRequest = Uninitialized,
    +                        isLoading = false,
                             homeServerUrlFromUser = homeServerConnectionConfig.homeServerUri.toString(),
                             homeServerUrl = data.homeServerUrl,
                             loginMode = loginMode,
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    index 063c651dfd..b98e811679 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt
    @@ -18,20 +18,14 @@ package im.vector.app.features.onboarding
     
     import android.net.Uri
     import android.os.Parcelable
    -import com.airbnb.mvrx.Async
    -import com.airbnb.mvrx.Loading
     import com.airbnb.mvrx.MavericksState
     import com.airbnb.mvrx.PersistState
    -import com.airbnb.mvrx.Uninitialized
     import im.vector.app.features.login.LoginMode
     import im.vector.app.features.login.ServerType
     import im.vector.app.features.login.SignMode
     import kotlinx.parcelize.Parcelize
     
     data class OnboardingViewState(
    -        val asyncHomeServerLoginFlowRequest: Async = Uninitialized,
    -        val asyncResetPassword: Async = Uninitialized,
    -        val asyncResetMailConfirmed: Async = Uninitialized,
             val isLoading: Boolean = false,
     
             @PersistState
    @@ -68,14 +62,7 @@ data class OnboardingViewState(
     
             @PersistState
             val personalizationState: PersonalizationState = PersonalizationState()
    -) : MavericksState {
    -
    -    fun legacyIsLoading(): Boolean {
    -        return asyncHomeServerLoginFlowRequest is Loading ||
    -                asyncResetPassword is Loading ||
    -                asyncResetMailConfirmed is Loading
    -    }
    -}
    +) : MavericksState
     
     enum class OnboardingFlow {
         SignIn,
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    index 073801c920..c91dcbaf8e 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    @@ -21,8 +21,6 @@ import android.view.LayoutInflater
     import android.view.View
     import android.view.ViewGroup
     import androidx.lifecycle.lifecycleScope
    -import com.airbnb.mvrx.Fail
    -import com.airbnb.mvrx.Loading
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.hideKeyboard
    @@ -53,10 +51,13 @@ class FtueAuthResetPasswordFragment @Inject constructor() : AbstractFtueAuthFrag
     
         override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
             super.onViewCreated(view, savedInstanceState)
    -
             setupSubmitButton()
         }
     
    +    override fun showFailure(throwable: Throwable) {
    +        views.resetPasswordEmailTil.error = errorFormatter.toHumanReadable(throwable)
    +    }
    +
         private fun setupUi(state: OnboardingViewState) {
             views.resetPasswordTitle.text = getString(R.string.login_reset_password_on, state.homeServerUrlFromUser.toReducedUrl())
         }
    @@ -115,16 +116,9 @@ class FtueAuthResetPasswordFragment @Inject constructor() : AbstractFtueAuthFrag
     
         override fun updateWithState(state: OnboardingViewState) {
             setupUi(state)
    -
    -        when (state.asyncResetPassword) {
    -            is Loading -> {
    -                // Ensure new password is hidden
    -                views.passwordField.hidePassword()
    -            }
    -            is Fail    -> {
    -                views.resetPasswordEmailTil.error = errorFormatter.toHumanReadable(state.asyncResetPassword.error)
    -            }
    -            else       -> Unit
    +        if (state.isLoading) {
    +            // Ensure new password is hidden
    +            views.passwordField.hidePassword()
             }
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    index f8b3266d37..2b72c88d89 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    @@ -20,7 +20,6 @@ import android.os.Bundle
     import android.view.LayoutInflater
     import android.view.View
     import android.view.ViewGroup
    -import com.airbnb.mvrx.Fail
     import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.databinding.FragmentLoginResetPasswordMailConfirmationBinding
    @@ -58,23 +57,20 @@ class FtueAuthResetPasswordMailConfirmationFragment @Inject constructor() : Abst
     
         override fun updateWithState(state: OnboardingViewState) {
             setupUi(state)
    +    }
     
    -        when (state.asyncResetMailConfirmed) {
    -            is Fail -> {
    -                // Link in email not yet clicked ?
    -                val message = if (state.asyncResetMailConfirmed.error.is401()) {
    -                    getString(R.string.auth_reset_password_error_unauthorized)
    -                } else {
    -                    errorFormatter.toHumanReadable(state.asyncResetMailConfirmed.error)
    -                }
    -
    -                MaterialAlertDialogBuilder(requireActivity())
    -                        .setTitle(R.string.dialog_title_error)
    -                        .setMessage(message)
    -                        .setPositiveButton(R.string.ok, null)
    -                        .show()
    -            }
    -            else    -> Unit
    +    override fun showFailure(throwable: Throwable) {
    +        // Link in email not yet clicked ?
    +        val message = if (throwable.is401()) {
    +            getString(R.string.auth_reset_password_error_unauthorized)
    +        } else {
    +            errorFormatter.toHumanReadable(throwable)
             }
    +
    +        MaterialAlertDialogBuilder(requireActivity())
    +                .setTitle(R.string.dialog_title_error)
    +                .setMessage(message)
    +                .setPositiveButton(R.string.ok, null)
    +                .show()
         }
     }
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    index b8319c9f3a..2b3a43df5d 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
    @@ -121,7 +121,7 @@ class FtueAuthVariant(
     
         private fun updateWithState(viewState: OnboardingViewState) {
             isForceLoginFallbackEnabled = viewState.isForceLoginFallbackEnabled
    -        views.loginLoading.isVisible = viewState.isLoading || viewState.legacyIsLoading()
    +        views.loginLoading.isVisible = viewState.isLoading
         }
     
         override fun setIsLoading(isLoading: Boolean) = Unit
    
    From 11cc284bccbf1d370f4e5efdbffe96ea5246b210 Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Tue, 8 Mar 2022 12:02:21 +0000
    Subject: [PATCH 122/126] reusing showFailure from the base fragment instead of
     resubscribing to the view events
    
    ---
     .../ftueauth/FtueAuthLoginFragment.kt         | 44 +++++++------------
     1 file changed, 17 insertions(+), 27 deletions(-)
    
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    index a5536b1dcd..60912f754e 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    @@ -72,33 +72,6 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
         override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
             super.onViewCreated(view, savedInstanceState)
     
    -        viewModel.viewEvents
    -                .stream()
    -                .onEach {
    -                    when (it) {
    -                        is OnboardingViewEvents.Failure -> {
    -                            if (it.throwable is Failure.ServerError &&
    -                                    it.throwable.error.code == MatrixError.M_FORBIDDEN &&
    -                                    it.throwable.error.message.isEmpty()) {
    -                                // Login with email, but email unknown
    -                                views.loginFieldTil.error = getString(R.string.login_login_with_email_error)
    -                            } else {
    -                                // Trick to display the error without text.
    -                                views.loginFieldTil.error = " "
    -                                if (it.throwable.isInvalidPassword() && spaceInPassword()) {
    -                                    views.passwordFieldTil.error = getString(R.string.auth_invalid_login_param_space_in_password)
    -                                } else {
    -                                    views.passwordFieldTil.error = errorFormatter.toHumanReadable(it.throwable)
    -                                }
    -                            }
    -                        }
    -                        else                            -> {
    -                            // do nothing
    -                        }
    -                    }
    -                }
    -                .launchIn(lifecycleScope)
    -
             setupSubmitButton()
             setupForgottenPasswordButton()
     
    @@ -305,6 +278,23 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
             }
         }
     
    +    override fun showFailure(throwable: Throwable) {
    +        if (throwable is Failure.ServerError &&
    +                throwable.error.code == MatrixError.M_FORBIDDEN &&
    +                throwable.error.message.isEmpty()) {
    +            // Login with email, but email unknown
    +            views.loginFieldTil.error = getString(R.string.login_login_with_email_error)
    +        } else {
    +            // Trick to display the error without text.
    +            views.loginFieldTil.error = " "
    +            if (throwable.isInvalidPassword() && spaceInPassword()) {
    +                views.passwordFieldTil.error = getString(R.string.auth_invalid_login_param_space_in_password)
    +            } else {
    +                views.passwordFieldTil.error = errorFormatter.toHumanReadable(throwable)
    +            }
    +        }
    +    }
    +
         /**
          * Detect if password ends or starts with spaces
          */
    
    From 373385b29fbeeefd8afb510f4799b8506620739b Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Thu, 10 Mar 2022 14:37:17 +0000
    Subject: [PATCH 123/126] moving the not accepting registration error handling
     to the login fragment
    
    ---
     .../android/sdk/api/failure/Extensions.kt     |  9 ++-
     .../ftueauth/AbstractFtueAuthFragment.kt      | 19 +-----
     .../ftueauth/FtueAuthLoginFragment.kt         | 58 +++++++++++--------
     .../ftueauth/FtueAuthResetPasswordFragment.kt |  2 +-
     ...thResetPasswordMailConfirmationFragment.kt |  2 +-
     .../onboarding/OnboardingViewModelTest.kt     |  3 -
     6 files changed, 46 insertions(+), 47 deletions(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    index aabe6e0d06..5dc8965b6f 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    @@ -64,6 +64,11 @@ fun Throwable.isInvalidPassword(): Boolean {
                 error.message == "Invalid password"
     }
     
    +fun Throwable.isRegistrationDisabled(): Boolean {
    +    return this is Failure.ServerError && error.code == MatrixError.M_FORBIDDEN &&
    +            httpCode == HttpsURLConnection.HTTP_FORBIDDEN
    +}
    +
     fun Throwable.isInvalidUIAAuth(): Boolean {
         return this is Failure.ServerError &&
                 error.code == MatrixError.M_FORBIDDEN &&
    @@ -104,8 +109,8 @@ fun Throwable.isRegistrationAvailabilityError(): Boolean {
         return this is Failure.ServerError &&
                 httpCode == HttpsURLConnection.HTTP_BAD_REQUEST && /* 400 */
                 (error.code == MatrixError.M_USER_IN_USE ||
    -            error.code == MatrixError.M_INVALID_USERNAME ||
    -            error.code == MatrixError.M_EXCLUSIVE)
    +                    error.code == MatrixError.M_INVALID_USERNAME ||
    +                    error.code == MatrixError.M_EXCLUSIVE)
     }
     
     /**
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/AbstractFtueAuthFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/AbstractFtueAuthFragment.kt
    index f8f6f6cefa..64e29766c5 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/AbstractFtueAuthFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/AbstractFtueAuthFragment.kt
    @@ -34,8 +34,6 @@ import im.vector.app.features.onboarding.OnboardingViewModel
     import im.vector.app.features.onboarding.OnboardingViewState
     import kotlinx.coroutines.CancellationException
     import org.matrix.android.sdk.api.failure.Failure
    -import org.matrix.android.sdk.api.failure.MatrixError
    -import javax.net.ssl.HttpsURLConnection
     
     /**
      * Parent Fragment for all the login/registration screens
    @@ -85,21 +83,8 @@ abstract class AbstractFtueAuthFragment : VectorBaseFragment
                     /* Ignore this error, user has cancelled the action */
                     Unit
    -            is Failure.ServerError                    ->
    -                if (throwable.error.code == MatrixError.M_FORBIDDEN &&
    -                        throwable.httpCode == HttpsURLConnection.HTTP_FORBIDDEN /* 403 */) {
    -                    MaterialAlertDialogBuilder(requireActivity())
    -                            .setTitle(R.string.dialog_title_error)
    -                            .setMessage(getString(R.string.login_registration_disabled))
    -                            .setPositiveButton(R.string.ok, null)
    -                            .show()
    -                } else {
    -                    onError(throwable)
    -                }
    -            is Failure.UnrecognizedCertificateFailure ->
    -                showUnrecognizedCertificateFailure(throwable)
    -            else                                      ->
    -                onError(throwable)
    +            is Failure.UnrecognizedCertificateFailure -> showUnrecognizedCertificateFailure(throwable)
    +            else                                      -> onError(throwable)
             }
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    index 60912f754e..664346953d 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    @@ -26,6 +26,7 @@ import androidx.autofill.HintConstants
     import androidx.core.text.isDigitsOnly
     import androidx.core.view.isVisible
     import androidx.lifecycle.lifecycleScope
    +import com.google.android.material.dialog.MaterialAlertDialogBuilder
     import im.vector.app.R
     import im.vector.app.core.extensions.hideKeyboard
     import im.vector.app.core.extensions.hidePassword
    @@ -46,6 +47,7 @@ import kotlinx.coroutines.flow.onEach
     import org.matrix.android.sdk.api.failure.Failure
     import org.matrix.android.sdk.api.failure.MatrixError
     import org.matrix.android.sdk.api.failure.isInvalidPassword
    +import org.matrix.android.sdk.api.failure.isRegistrationDisabled
     import reactivecircus.flowbinding.android.widget.textChanges
     import javax.inject.Inject
     
    @@ -254,12 +256,39 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
         }
     
         override fun onError(throwable: Throwable) {
    -        // Show M_WEAK_PASSWORD error in the password field
    -        if (throwable is Failure.ServerError &&
    -                throwable.error.code == MatrixError.M_WEAK_PASSWORD) {
    -            views.passwordFieldTil.error = errorFormatter.toHumanReadable(throwable)
    -        } else {
    -            views.loginFieldTil.error = errorFormatter.toHumanReadable(throwable)
    +        // Trick to display the error without text.
    +        views.loginFieldTil.error = " "
    +        when {
    +            throwable is Failure.ServerError &&
    +                    throwable.error.code == MatrixError.M_FORBIDDEN &&
    +                    throwable.error.message.isEmpty()                                               -> {
    +                // Login with email, but email unknown
    +                views.loginFieldTil.error = getString(R.string.login_login_with_email_error)
    +            }
    +
    +            throwable is Failure.ServerError && throwable.error.code == MatrixError.M_WEAK_PASSWORD -> {
    +                views.passwordFieldTil.error = errorFormatter.toHumanReadable(throwable)
    +            }
    +
    +            throwable.isInvalidPassword() && spaceInPassword()                                      -> {
    +                views.passwordFieldTil.error = getString(R.string.auth_invalid_login_param_space_in_password)
    +            }
    +
    +            throwable.isInvalidPassword()                                                           -> {
    +                views.passwordFieldTil.error = errorFormatter.toHumanReadable(throwable)
    +            }
    +
    +            throwable.isRegistrationDisabled()                                                      -> {
    +                MaterialAlertDialogBuilder(requireActivity())
    +                        .setTitle(R.string.dialog_title_error)
    +                        .setMessage(getString(R.string.login_registration_disabled))
    +                        .setPositiveButton(R.string.ok, null)
    +                        .show()
    +            }
    +
    +            else                                                                                    -> {
    +                super.onError(throwable)
    +            }
             }
         }
     
    @@ -278,23 +307,6 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
             }
         }
     
    -    override fun showFailure(throwable: Throwable) {
    -        if (throwable is Failure.ServerError &&
    -                throwable.error.code == MatrixError.M_FORBIDDEN &&
    -                throwable.error.message.isEmpty()) {
    -            // Login with email, but email unknown
    -            views.loginFieldTil.error = getString(R.string.login_login_with_email_error)
    -        } else {
    -            // Trick to display the error without text.
    -            views.loginFieldTil.error = " "
    -            if (throwable.isInvalidPassword() && spaceInPassword()) {
    -                views.passwordFieldTil.error = getString(R.string.auth_invalid_login_param_space_in_password)
    -            } else {
    -                views.passwordFieldTil.error = errorFormatter.toHumanReadable(throwable)
    -            }
    -        }
    -    }
    -
         /**
          * Detect if password ends or starts with spaces
          */
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    index c91dcbaf8e..b612ec34b5 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordFragment.kt
    @@ -54,7 +54,7 @@ class FtueAuthResetPasswordFragment @Inject constructor() : AbstractFtueAuthFrag
             setupSubmitButton()
         }
     
    -    override fun showFailure(throwable: Throwable) {
    +    override fun onError(throwable: Throwable) {
             views.resetPasswordEmailTil.error = errorFormatter.toHumanReadable(throwable)
         }
     
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    index 2b72c88d89..f6141a4900 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordMailConfirmationFragment.kt
    @@ -59,7 +59,7 @@ class FtueAuthResetPasswordMailConfirmationFragment @Inject constructor() : Abst
             setupUi(state)
         }
     
    -    override fun showFailure(throwable: Throwable) {
    +    override fun onError(throwable: Throwable) {
             // Link in email not yet clicked ?
             val message = if (throwable.is401()) {
                 getString(R.string.auth_reset_password_error_unauthorized)
    diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    index 09cefc5ff2..df4e0de65e 100644
    --- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    +++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
    @@ -17,9 +17,6 @@
     package im.vector.app.features.onboarding
     
     import android.net.Uri
    -import com.airbnb.mvrx.Loading
    -import com.airbnb.mvrx.Success
    -import com.airbnb.mvrx.Uninitialized
     import com.airbnb.mvrx.test.MvRxTestRule
     import im.vector.app.features.login.ReAuthHelper
     import im.vector.app.features.login.SignMode
    
    From 5aa35899bc302b3854df6cff0a58a0af67ace3a5 Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Fri, 11 Mar 2022 12:52:09 +0000
    Subject: [PATCH 124/126] extracting error cases to extensions and handles
     invalid username as a specific case
    
    ---
     .../android/sdk/api/failure/Extensions.kt     | 15 ++++++++++
     .../ftueauth/FtueAuthLoginFragment.kt         | 29 +++++++------------
     2 files changed, 26 insertions(+), 18 deletions(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    index 5dc8965b6f..cfae056774 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    @@ -58,6 +58,11 @@ fun Throwable.getRetryDelay(defaultValue: Long): Long {
                 ?: defaultValue
     }
     
    +fun Throwable.isInvalidUsername(): Boolean {
    +    return this is Failure.ServerError &&
    +            error.code == MatrixError.M_INVALID_USERNAME
    +}
    +
     fun Throwable.isInvalidPassword(): Boolean {
         return this is Failure.ServerError &&
                 error.code == MatrixError.M_FORBIDDEN &&
    @@ -69,6 +74,16 @@ fun Throwable.isRegistrationDisabled(): Boolean {
                 httpCode == HttpsURLConnection.HTTP_FORBIDDEN
     }
     
    +fun Throwable.isWeakPassword(): Boolean {
    +    return this is Failure.ServerError && error.code == MatrixError.M_WEAK_PASSWORD
    +}
    +
    +fun Throwable.isLoginEmailUnknown(): Boolean {
    +    return this is Failure.ServerError &&
    +            error.code == MatrixError.M_FORBIDDEN &&
    +            error.message.isEmpty()
    +}
    +
     fun Throwable.isInvalidUIAAuth(): Boolean {
         return this is Failure.ServerError &&
                 error.code == MatrixError.M_FORBIDDEN &&
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    index 664346953d..192eb4d5f4 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    @@ -44,10 +44,11 @@ import kotlinx.coroutines.flow.combine
     import kotlinx.coroutines.flow.launchIn
     import kotlinx.coroutines.flow.map
     import kotlinx.coroutines.flow.onEach
    -import org.matrix.android.sdk.api.failure.Failure
    -import org.matrix.android.sdk.api.failure.MatrixError
     import org.matrix.android.sdk.api.failure.isInvalidPassword
    +import org.matrix.android.sdk.api.failure.isInvalidUsername
    +import org.matrix.android.sdk.api.failure.isLoginEmailUnknown
     import org.matrix.android.sdk.api.failure.isRegistrationDisabled
    +import org.matrix.android.sdk.api.failure.isWeakPassword
     import reactivecircus.flowbinding.android.widget.textChanges
     import javax.inject.Inject
     
    @@ -259,34 +260,26 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
             // Trick to display the error without text.
             views.loginFieldTil.error = " "
             when {
    -            throwable is Failure.ServerError &&
    -                    throwable.error.code == MatrixError.M_FORBIDDEN &&
    -                    throwable.error.message.isEmpty()                                               -> {
    -                // Login with email, but email unknown
    +            throwable.isInvalidUsername()                               -> {
    +                views.loginFieldTil.error = errorFormatter.toHumanReadable(throwable)
    +            }
    +            throwable.isLoginEmailUnknown()                             -> {
                     views.loginFieldTil.error = getString(R.string.login_login_with_email_error)
                 }
    -
    -            throwable is Failure.ServerError && throwable.error.code == MatrixError.M_WEAK_PASSWORD -> {
    -                views.passwordFieldTil.error = errorFormatter.toHumanReadable(throwable)
    -            }
    -
    -            throwable.isInvalidPassword() && spaceInPassword()                                      -> {
    +            throwable.isInvalidPassword() && spaceInPassword()          -> {
                     views.passwordFieldTil.error = getString(R.string.auth_invalid_login_param_space_in_password)
                 }
    -
    -            throwable.isInvalidPassword()                                                           -> {
    +            throwable.isWeakPassword() || throwable.isInvalidPassword() -> {
                     views.passwordFieldTil.error = errorFormatter.toHumanReadable(throwable)
                 }
    -
    -            throwable.isRegistrationDisabled()                                                      -> {
    +            throwable.isRegistrationDisabled()                          -> {
                     MaterialAlertDialogBuilder(requireActivity())
                             .setTitle(R.string.dialog_title_error)
                             .setMessage(getString(R.string.login_registration_disabled))
                             .setPositiveButton(R.string.ok, null)
                             .show()
                 }
    -
    -            else                                                                                    -> {
    +            else                                                        -> {
                     super.onError(throwable)
                 }
             }
    
    From e7a1c20132c25b6629b0395a8d4a088a419b56df Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Fri, 11 Mar 2022 13:22:03 +0000
    Subject: [PATCH 125/126] handling the username in use as a username field
     error
    
    ---
     .../matrix/android/sdk/api/failure/Extensions.kt    |  4 ++++
     .../onboarding/ftueauth/FtueAuthLoginFragment.kt    | 13 +++++++------
     2 files changed, 11 insertions(+), 6 deletions(-)
    
    diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    index cfae056774..89b4a343dd 100644
    --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
    @@ -58,6 +58,10 @@ fun Throwable.getRetryDelay(defaultValue: Long): Long {
                 ?: defaultValue
     }
     
    +fun Throwable.isUsernameInUse(): Boolean {
    +    return this is Failure.ServerError && error.code == MatrixError.M_USER_IN_USE
    +}
    +
     fun Throwable.isInvalidUsername(): Boolean {
         return this is Failure.ServerError &&
                 error.code == MatrixError.M_INVALID_USERNAME
    diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    index 192eb4d5f4..53c9fd4fcc 100644
    --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt
    @@ -48,6 +48,7 @@ import org.matrix.android.sdk.api.failure.isInvalidPassword
     import org.matrix.android.sdk.api.failure.isInvalidUsername
     import org.matrix.android.sdk.api.failure.isLoginEmailUnknown
     import org.matrix.android.sdk.api.failure.isRegistrationDisabled
    +import org.matrix.android.sdk.api.failure.isUsernameInUse
     import org.matrix.android.sdk.api.failure.isWeakPassword
     import reactivecircus.flowbinding.android.widget.textChanges
     import javax.inject.Inject
    @@ -260,26 +261,26 @@ class FtueAuthLoginFragment @Inject constructor() : AbstractSSOFtueAuthFragment<
             // Trick to display the error without text.
             views.loginFieldTil.error = " "
             when {
    -            throwable.isInvalidUsername()                               -> {
    +            throwable.isUsernameInUse() || throwable.isInvalidUsername() -> {
                     views.loginFieldTil.error = errorFormatter.toHumanReadable(throwable)
                 }
    -            throwable.isLoginEmailUnknown()                             -> {
    +            throwable.isLoginEmailUnknown()                              -> {
                     views.loginFieldTil.error = getString(R.string.login_login_with_email_error)
                 }
    -            throwable.isInvalidPassword() && spaceInPassword()          -> {
    +            throwable.isInvalidPassword() && spaceInPassword()           -> {
                     views.passwordFieldTil.error = getString(R.string.auth_invalid_login_param_space_in_password)
                 }
    -            throwable.isWeakPassword() || throwable.isInvalidPassword() -> {
    +            throwable.isWeakPassword() || throwable.isInvalidPassword()  -> {
                     views.passwordFieldTil.error = errorFormatter.toHumanReadable(throwable)
                 }
    -            throwable.isRegistrationDisabled()                          -> {
    +            throwable.isRegistrationDisabled()                           -> {
                     MaterialAlertDialogBuilder(requireActivity())
                             .setTitle(R.string.dialog_title_error)
                             .setMessage(getString(R.string.login_registration_disabled))
                             .setPositiveButton(R.string.ok, null)
                             .show()
                 }
    -            else                                                        -> {
    +            else                                                         -> {
                     super.onError(throwable)
                 }
             }
    
    From af90adadf3d7ea8d1fafe24e93c2bff1d17fb214 Mon Sep 17 00:00:00 2001
    From: Adam Brown 
    Date: Fri, 11 Mar 2022 13:23:34 +0000
    Subject: [PATCH 126/126] adding changelog entry
    
    ---
     changelog.d/5517.misc | 1 +
     1 file changed, 1 insertion(+)
     create mode 100644 changelog.d/5517.misc
    
    diff --git a/changelog.d/5517.misc b/changelog.d/5517.misc
    new file mode 100644
    index 0000000000..18269afcc6
    --- /dev/null
    +++ b/changelog.d/5517.misc
    @@ -0,0 +1 @@
    +Flattening the asynchronous onboarding state and passing all errors through the same pipeline
    \ No newline at end of file