From 2f6f52c25aed06ab4286222ae550c1a501ecad5a Mon Sep 17 00:00:00 2001 From: "Auri B. P" Date: Wed, 7 Sep 2022 20:23:41 +0000 Subject: [PATCH 001/131] Translated using Weblate (Catalan) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ca/ --- .../src/main/res/values-ca/strings.xml | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-ca/strings.xml b/library/ui-strings/src/main/res/values-ca/strings.xml index 13a5b6c119..a7caed0de8 100644 --- a/library/ui-strings/src/main/res/values-ca/strings.xml +++ b/library/ui-strings/src/main/res/values-ca/strings.xml @@ -2636,4 +2636,39 @@ Aquesta sala no s\'ha trobat. \nTorna-ho a provar més tard.%s Invitacions - + ${app_name} +\nHola, %s. + Nova visualització! + Prova-ho + Entra a espais + L\'aplicació de xats segurs tot en un. Per a equips, amics i organitzacions. Crea un xat o uneix-te a una sala existent per començar. + + Pensa en tancar sessió de les sessions antigues (%1$d dia o més) que ja no utilitzis. + Pensa en tancar sessió de les sessions antigues (%1$d dies o més) que ja no utilitzis. + + Prem la part superior dreta per veure l\'opció d\'enviar comentaris. + Envia comentaris + Aquí es mostraran els teus missatges no llegits, quan en tinguis. + Sense novetats. + Verifica les sessions o tanca\'n la sessió si no estan verificades. + Per simplificar ${app_name}, les pestanyes ara son opcionals. Gestiona-les mitjançant el menú de la part superior dreta. + %s +\nsembla una mica buit. + Sessions inactives + Sessions no verificades + Millora la seguretat del teu compte seguint aquestes recomanacions. + Recomanacions de seguretat + + Actiu fa %1$d dia (%2$s) + Actiu fa més de %1$d dies (%2$s) + + Aquí és on apareixeran les teves sol·licituds i invitacions. + Res de nou. + Accedeix als teus espais (part inferior dreta) més ràpid i fàcilment. + Els espais són una nova manera d\'agrupar sales i gent. Afegeix una sala o crea\'n una de nova mitjançant el botó de la part inferior dreta. + Els espais són una nova manera d\'agrupar sales i gent. Crea\'n un per començar. + Cap espai, encara. + Amaga els continguts de %s + Mostra el contingut de %s + Canvia espai + \ No newline at end of file From f53cdbb1671d5c42160a430e391538fc2807f666 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 7 Sep 2022 17:59:53 +0000 Subject: [PATCH 002/131] Translated using Weblate (Czech) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/ --- .../src/main/res/values-cs/strings.xml | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-cs/strings.xml b/library/ui-strings/src/main/res/values-cs/strings.xml index b7bfeac444..e7f0b173be 100644 --- a/library/ui-strings/src/main/res/values-cs/strings.xml +++ b/library/ui-strings/src/main/res/values-cs/strings.xml @@ -2686,4 +2686,41 @@ Je nám líto, tato místnost nebyla nalezena. \nZkuste to prosím později.%s Pozvánky - + Vyzkoušejte to + Klepnutím vpravo nahoře zobrazíte možnost zpětné vazby. + Poskytněte zpětnou vazbu + Přístup k vašim prostorům (vpravo dole) je rychlejší a snazší než kdykoli předtím. + Přístup do prostorů + Pro zjednodušení aplikace ${app_name} jsou nyní karty nepovinné. Spravujte je pomocí nabídky vpravo nahoře. + Vítejte v novém zobrazení! + Zde se zobrazí nepřečtené zprávy, pokud nějaké máte. + Nic k nahlášení. + Univerzální zabezpečená chatovací aplikace pro týmy, přátele a organizace. Vytvořte si chat nebo se připojte k existující místnosti a začněte. + Vítejte v aplikaci ${app_name}, +\n%s. + Prostory představují nový způsob seskupování místností a osob. Pomocí tlačítka vpravo dole můžete přidat stávající místnost nebo vytvořit novou. + %s +\nvypadá trochu prázdně. + + Zvažte odhlášení ze starých relací (%1$d den nebo více), které již nepoužíváte. + Zvažte odhlášení ze starých relací (%1$d dny nebo více), které již nepoužíváte. + Zvažte odhlášení ze starých relací (%1$d dnů nebo více), které již nepoužíváte. + + Neaktivní relace + Ověřte nebo se odhlaste z neověřených relací. + Neověřené relace + Zlepšete zabezpečení svého účtu dodržováním těchto doporučení. + Bezpečnostní doporučení + + Neaktivní po dobu %1$d+ dne (%2$s) + Neaktivní po dobu %1$d+ dnů (%2$s) + Neaktivní po dobu %1$d+ dnů (%2$s) + + Zde se budou nacházet vaše nové žádosti a pozvánky. + Nic nového. + Prostory představují nový způsob seskupování místností a osob. Vytvořte si prostor a začněte. + Zatím žádné prostory. + Sbalit podprostory %s + Rozbalit podprostory %s + Změnit prostor + \ No newline at end of file From 904c4e44b24e32d5ef1b087d20842ed6ae943a09 Mon Sep 17 00:00:00 2001 From: Vri Date: Fri, 9 Sep 2022 20:25:42 +0000 Subject: [PATCH 003/131] Translated using Weblate (German) Currently translated at 98.9% (2362 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- .../src/main/res/values-de/strings.xml | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 8e502a6392..715018264c 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -20,7 +20,7 @@ %s hat einen Sprachanruf getätigt. %s hat den Anruf angenommen. %s hat den Anruf beendet. - %1$s hat den zukünftigen Chatverlauf sichtbar gemacht für %2$s + %1$s hat den zukünftigen Nachrichtenverlauf sichtbar gemacht für %2$s alle Mitglieder, ab Einladung. alle Mitglieder, ab Beitritt. alle Mitglieder. @@ -265,11 +265,11 @@ Räume Logdateien übermitteln Absturzberichte übermitteln - Screenshot übermitteln + Bildschirmfoto übermitteln Problem melden Bitte beschreibe das Problem. Was hast du genau gemacht\? Was sollte passieren\? Was ist tatsächlich passiert\? Problembeschreibung - Um Probleme diagnostizieren zu können, werden Protokolle des Clients zusammen mit dem Fehlerbericht übermittelt. Dieser Fehlerbericht wird, wie die Protokolle und der Screenshot, nicht öffentlich sichtbar sein. Wenn du nur den oben eingegebenen Text senden möchtest, die nachfolgenden Haken entsprechend entfernen: + Um Probleme diagnostizieren zu können, werden Protokolle des Clients zusammen mit dem Fehlerbericht übermittelt. Dieser Fehlerbericht wird, wie die Protokolle und das Bildschirmfoto, nicht öffentlich sichtbar sein. Wenn du nur den oben eingegebenen Text senden möchtest, die nachfolgenden Haken entsprechend entfernen: Du scheinst dein Telefon frustriert zu schütteln. Möchtest du das Fenster zum Senden eines Fehlerberichts öffnen\? Dein Fehlerbericht wurde erfolgreich übermittelt Der Fehlerbericht konnte nicht übermittelt werden (%s) @@ -908,7 +908,7 @@ (bearbeitet) Nachrichtenbearbeitung Keine Änderungen gefunden - Gespräche filtern… + Konversationen filtern … Sende eine neue Direktnachricht Das Raumverzeichnis anzeigen Link in die Zwischenablage kopiert @@ -994,7 +994,7 @@ Eine Textnachricht wurde an %s gesendet. Bitte gib den Verifizierungscode ein, den sie enthält. Aktiviere ausführliche Logs. Ausführliche Logs werden der Entwicklung der App dadurch helfen, dass mehr Informationen übertragen werden, wenn du einen Fehlerbericht sendest. Auch wenn dies aktiviert ist, werden keine Nachrichteninhalte oder andere privaten Daten aufgezeichnet. - Bitte erneut versuchen, nachdem du die Nutzungsbedingungen deines Homeservers akzeptiert hast. + Bitte erneut versuchen, nachdem du die Nutzungsbedingungen deines Heimservers akzeptiert hast. Bei Benutzung könnten Cookies gesetzt werden und es könnten Daten mit %s geteilt werden: Bei Benutzung könnten Daten mit %s geteilt werden: Optionen zum Finden werden erscheinen, sobald du eine Telefonnummer hinzugefügt hast. @@ -1409,8 +1409,8 @@ nutze deinen Schlüsselbackup-Wiederherstellungsschlüssel Wenn du dein Schlüsselbackup-Passwort nicht weißt, kannst du %s. Schlüsselbackup-Wiederherstellungsschlüssel - Screenshots innerhalb der Anwendung verhindern - Das Aktivieren dieser Einstellung setzt das FLAG_SECURE in allen Aktivitäten. Starte die Anwendung neu, damit die Änderung wirksam wird. + Bildschirmfotos der Anwendung verhindern + Das Aktivieren dieser Einstellung setzt FLAG_SECURE in allen Aktivitäten. Starte die Anwendung neu, damit die Änderung wirksam wird. Neues Benutzerpasswort festlegen… Nutze die neueste Version von ${app_name} auf deinen anderen Geräten, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} für Android oder einen anderen cross-signing-fähigen Matrix-Client ${app_name} Web @@ -1461,7 +1461,7 @@ Ablehnen Erfolg Echtzeitverbindung konnte nicht hergestellt werden. -\nBitte den Administrator deines Homeservers, einen TURN-Server zu konfigurieren, dass Anrufe zuverlässig funktionieren. +\nBitte den Administrator deines Heimservers, einen TURN-Server zu konfigurieren, damit Anrufe zuverlässig funktionieren. Audiogerät auswählen Telefon Lautsprecher @@ -1744,13 +1744,13 @@ Direktnachricht Verlauf der Anfragen von Schlüsselfreigaben senden Keine weiteren Ergebnisse - Starte die Diskussion + Beginne ein Gespräch Autorisieren Meine Zustimmung widerrufen Du hast zugestimmt E-Mails und Telefonnummern an diesen Identitätsserver zu senden, um von anderen Nutzern entdeckt zu werden. E-Mails und Telefonnummern senden Vorschläge - Bekannte Nutzer + Bekannte Personen QR-Code Hinzufügen via QR-Code Gib die Erlaubnis, um auf die Kamera zu zugreifen. @@ -1794,7 +1794,7 @@ Manche Zeichen sind nicht zulässig Bitte gib eine Raumadresse an Diese Adresse ist bereits vergeben - Aktivieren, wenn der Raum nur von Mitgliedern deines Homeservers zur internen Kommunikation verwendet wird. Das kann später nicht mehr geändert werden. + Aktivieren, wenn der Raum nur von Mitgliedern deines Heimservers 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\? @@ -2188,7 +2188,7 @@ Hilfreiche Informationen zur Fehlersuche anzeigen Debug-Info anzeigen Das schaut nicht nach einer gültigen E-Mail-Adresse aus - Nach Name, ID oder E-Mail suchen + Mittels Name, ID oder E-Mail-Adresse suchen Neuen Space erstellen Zugriff Wer hat Zugriff\? @@ -2622,4 +2622,23 @@ Nicht verifiziert · Letzte Aktivität %1$s Verifiziere deine aktuelle Sitzung für besonders sichere Nachrichtenübertragung. Nicht verifizierte Sitzung + Nicht verifizierte Sitzung + Verbessere deine Kontosicherheit, indem du diese Empfehlungen beherzigst. + Sicherheitsempfehlungen + + Inaktiv seit %1$d+ Tag (%2$s) + Inaktiv seit %1$d+ Tagen (%2$s) + + Verifiziert · Letzte Aktivität %1$s + Deine aktuelle Sitzung ist für sichere Kommunikation bereit. + Verifizierte Sitzung + Unbekannter Gerätetyp + Nichts Neues. + Spaces sind eine neue Art, Räume und Personen zu organisieren. Erstelle einen Space, um zu beginnen. + Noch keine Spaces. + Hier werden deine ungelesenen Nachrichten erscheinen, wenn du welche hast. + Es gibt nichts Neues. + Alle Unterhaltungen + Space wechseln + Unterhaltung beginnen \ No newline at end of file From 118fc2ffc1daac3302544bb0ffd4bae73cf26adb Mon Sep 17 00:00:00 2001 From: Deleted User Date: Thu, 8 Sep 2022 11:39:03 +0000 Subject: [PATCH 004/131] Translated using Weblate (Spanish) Currently translated at 97.3% (2322 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/es/ --- .../src/main/res/values-es/strings.xml | 136 +++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-es/strings.xml b/library/ui-strings/src/main/res/values-es/strings.xml index 4eec90fbd6..1b63183478 100644 --- a/library/ui-strings/src/main/res/values-es/strings.xml +++ b/library/ui-strings/src/main/res/values-es/strings.xml @@ -2518,4 +2518,138 @@ El destino se ha registrado de forma satisfactoria al servidor doméstico. Registración de punto final Siguiente - + Pruébalo + Danos tu opinión + Acceder a espacios + Para simplificar ${app_name}, las pestañas son opcionales. Gestiónalas usando el menú en la esquina superior derecha. + ¡Bienvenido a una nueva interfaz! + Nada que reportar. + Bienvenido a ${app_name}, +\n%s. + %s +\nparece un poco vacío. + Sesiones inactivas + Verifica o cierra sesión de sesiones sin verificar. + Sesiones sin verificar + Mejora la seguridad de tu cuenta siguiendo estas recomendaciones. + Consejos de seguridad + + Inactiva por %1$d+ día (%2$s) + Inactiva por %1$d+ dias (%2$s) + + Sin verificar · Última actividad %1$s + Verificada · Última actividad %1$s + Ver todos (%1$d) + Sesión actual + Ver detalles + Verificar sesión + Esta sesión está lista para mensajería segura. + Sesión sin verificar + Sesión verificada + Tipo de dispositivo desconocido + Escritorio + Web + Móvil + Mostrar todas las sesiones (V2, WIP) + Auto aprovar widgets de Element Call y dar permisos de cámara y micrófono + + %d mensaje borrado + %d mensajes borrados + + Ubicación en tiempo real + Compartir ubicación + Debes tener el permiso correspondiente para compartir ubicaciones en esta sala. + No tienes permiso para compartir ubicaciones + No se pudo cargar el mapa +\nEste servidor doméstico puede que no esté configurado para mostrar mapas. + Los resultados podrán verse cuando la encuesta termine + MSC3061: Compartir claves de sala para mensajes anteriores + Abrir ajustes + Envía tu primer mensaje para invitar a %s + Los mensajes en esta sala están encriptados de extremo a extremo. + Este código QR parece incorrecto. Por favor, intente verificar con otro método. + No serás capaz de acceder al historial de mensajes encriptado. Restablece tu backup de mensajes seguro y las claves de verificación para empezar de cero. + No se ha podido verificar el dispositivo + Para más seguridad, verifica tus sesiones y cierra cualquiera que no reconozcas o hayas dejado de usar. + Otras sesiones + Sesiones + No se puede abrir este enlace: las comunidades han sido reemplazadas por espacios + Usuario / Email / Teléfono + ¿Eres una persona\? + Sigue las instrucciones enviadas a %s + Restablecer contraseña + Olvidé mi contraseña + Volver a enviar correo + ¿No recibiste ningún email\? + Sigue las instrucciones enviadas a %s + Verifica tu email + Volver a enviar código + Código enviado a %s + Confirma tu número de teléfono + Cerrar sesión en todos los dispositivos + Restablecer contraseña + Asegúrate de que tiene al menos 8 caracteres. + Elige una nueva contraseña + Nueva contraseña + Comprueba tu email. + %s te enviará un enlace de verificación + Código de confirmación + Número de teléfono + %s necesita verificar tu cuenta + Escribe tu número de teléfono + Email + %s necesita verificar tu cuenta + Introduce tu email + Por favor, lee las condiciones de uso de %s + Políticas del servidor + Ponte en contacto + ¿Deseas hospedar tu propio servidor\? + URL del servidor + ¿Cuál es la dirección de tu servidor\? + ¿Cuál es la dirección de tu servidor\? Será donde se guarden todos tus datos + Selecciona un servidor + ¡Hola de nuevo! + Editar + O + Dónde se guardarán tus conversaciones + Dónde se guardarán tus conversaciones + Debe tener al menos 8 caracteres + Otros pueden buscarte como %s + Crea tu cuenta + Abrir lista de espacios + Crear una nueva conversación o sala + Ir + Actualizando tus datos… + Personas + Favoritos + Sin leer + Todo + Lo sentimos, esta sala no se ha encontrado. +\nPor favor, inténtelo de nuevo.%s + Usar ajustes por defecto del sistema + Escoger manualmente + Tamaño automático de fuente + Escoger tamaño de la fuente + + %1$s y %2$d otro + %1$s y %2$d otros + + %1$s y %2$s + Email no verificado, comprueba tu bandeja de entrada + Aquí es donde tus nuevas solicitudes y invitaciones estarán. + Nada nuevo. + Invitaciones + Los espacios son una nueva forma de agrupar salas y personas. Crea un espacio para empezar. + No hay espacios aún. + A - Z + Actividad + Ordenar por + Mostrar recientes + Mostrar filtros + Ajustes de disposición + Explorar salas + Cambiar espacio + Crear sala + Iniciar conversación + Todas las conversaciones + \ No newline at end of file From fd76bdfa4d95327efa325b1fa590db4aada83914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 9 Sep 2022 06:34:25 +0000 Subject: [PATCH 005/131] Translated using Weblate (Estonian) Currently translated at 98.7% (2355 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/et/ --- library/ui-strings/src/main/res/values-et/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index 55fb9dfef0..18e609ff95 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -2627,4 +2627,8 @@ Vabandust, aga seda jututuba ei õnnestu leida. \nPalun proovi hiljem uuesti.%s Kutsed - + Uut teavet ei leidu. + Kogukonnad on viis jututubade ja inimeste ühendamiseks. Alustamiseks võid luua uue kogukonna. + Siin veel pole kogukondi. + Vaheta kogukonda + \ No newline at end of file From c858d31761612b00a49076c2fd0b45efa1f4ce53 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Sat, 10 Sep 2022 09:01:23 +0000 Subject: [PATCH 006/131] Translated using Weblate (Persian) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- .../src/main/res/values-fa/strings.xml | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index e104225389..2f5bf80d0c 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -2636,4 +2636,39 @@ متأسفانه این اتاق پیدا نشد. \nلطفاً بعداً دوباره تلاش کنید.%s دعوت‌ها - + زدن بالا سمت چپ برای دیدن گزینهٔ بازخورد. + دسترسی به فضاهایتان (پایین سمت چپ) سریع‌تر و ساده‌تر از همیشه. + برای ساده‌سازی ${app_name} زبانه‌ها اختیاری شده‌اند. مدیریت با استفاده از فهرست بالا سمت چپ. + این جایی است که پیام‌های ناخوانده‌تان در صورت وجود ظاهر خواهند شد. + کارهٔ گپ امن یکپارچه برای گروه‌ها، دوستان و سازمان‌ها. برای آغاز، گپی ساخته یا به اتاقی بپیوندید. + فضاها راهی جدید برای گروه‌بندی اتاق‌ها و افراد است. با استفاده از دکمهٔ پایین سمت چپ فضایی ساخته یا اتاقی را بیفزایید. + %s +\nکمی خالی به نظر می‌رسد. + + در نظر گرفتن خروج از نشست‌های قدیمی (۱ روز یا بیش‌تر) که دیگر استفاده نمی‌کنید. + در نظر گرفتن خروج از نشست‌های قدیمی (%1$d روز یا بیش‌تر) که دیگر استفاده نمی‌کنید. + + تأیید یا خروج از نشست‌های تأییدنشده. + بهبود امنیت حسابتان با پیروی از این توصیه‌ها. + + غیرفعّال برای بیش از %1$d روز (%2$s) + غیرفعّال برای بیش از %1$d روز (%2$s) + + این جایی است که درخواست‌ها و دعوت‌های جدیدتان خواهند بود. + فضاها راهی جدید برای گروه‌بندی اتاق‌ها و افراد است. برای آغاز، فضایی بسازید. + بیازماییدش + دادن بازخورد + دسترسی به فضاها + به نمایی جدید خوش آمدید! + چیزی برای گزارش نیست. + %s +\nبه ${app_name} خوش آمدی. + نشست‌های غیرفعّال + نشست‌های تأیید نشده + توصیه‌های امنیتی + چیز جدیدی نیست. + هنوز فضایی وجود ندارد. + جمع کردن فرزندان %s + گسترش فرزندان %s + تغییر فضا + \ No newline at end of file From 7645992cf19bd8ee86fc9c28babe877843488ae8 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 8 Sep 2022 19:40:53 +0000 Subject: [PATCH 007/131] Translated using Weblate (Hungarian) Currently translated at 99.8% (2382 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- .../src/main/res/values-hu/strings.xml | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index af8bf26b2e..5de54f8ae8 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -2636,4 +2636,29 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Szobák felfedezése Szoba létrehozása Chat indítása - + Próbáld ki + Visszajelzés adása + A terekhez való hozzáférés (jobbra lent) gyorsabb és egyszerűbb mint valaha. + Hozzáférés a terekhez + ${app_name} egyszerűsítéséhez a lapok mostantól választhatók. Beállítani a jobb felső menüből lehet. + Üdv az új kinézetben! + Ez az a hely ahol az olvasatlan üzeneteid megjelennek, ha lesznek. + Nincs semmi említésre méltó. + A minden-egyben biztonságos csevegő alkalmazás csapatoknak, barátoknak és szervezeteknek. Kezd egy csevegést vagy lépj be egy meglévő szobába kezdésnek. + Üdv itt: ${app_name}! +\n%s. + Szobák és emberek csoportokba rendezésének új mondja a terek használata. Létező szoba hozzáadása vagy új készítése a jobb alsó gombbal. + %s +\nkicsit üresnek tűnik. + Nem aktív munkamenetek + Ellenőrizd vagy jelentkezz ki az ellenőrizetlen munkamenetekből. + Meg nem erősített munkamenetek + Javítsa a fiókja biztonságát azzal, hogy követi a következő javaslatokat. + Biztonsági javaslatok + Semmi új. + Terekkel lehet szobákat és személyeket csoportokba rendezni. Készíts egyet indulásnak. + Nincsenek terek egyenlőre. + %s összezárása + %s kinyitása + Tér cseréje + \ No newline at end of file From 596f2d993d3873d9cb5ccb7cfee83aeea829a3b2 Mon Sep 17 00:00:00 2001 From: Linerly Date: Sat, 10 Sep 2022 03:42:54 +0000 Subject: [PATCH 008/131] Translated using Weblate (Indonesian) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/id/ --- .../src/main/res/values-in/strings.xml | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml index d1e68b4529..c1858c2805 100644 --- a/library/ui-strings/src/main/res/values-in/strings.xml +++ b/library/ui-strings/src/main/res/values-in/strings.xml @@ -2588,4 +2588,37 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Web Ponsel Undangan - + Coba + Ketuk kanan atas untuk melihat opsi untuk memberikan masukan. + Beri Masukan + Aplikasi obrolan aman untuk tim, teman, dan organisasi. Buat sebuah obrolan, atau bergabung ke ruangan yang sudah ada, untuk memulai. + Akses Space Anda (di kanan bawah) dengan lebih cepat dan lebih mudah dari sebelumnya. + Akses Space + Untuk membuat ${app_name} Anda lebih sederhana, fitur tab sekarang opsional. Kelola menggunakan menu kanan atas. + Selamat datang di tampilan yang baru! + Ini di mana pesan Anda yang belum dibaca akan ditampilkan, ketika Anda menerimanya. + Tidak ada untuk dilaporkan. + Selamat datang di ${app_name}, +\n%s. + Space adalah cara baru untuk mengelompokkan ruangan dan orang. Tambahkan ruangan yang sudah ada, atau buat yang baru, dengan tombol di kanan bawah. + %s +\nkelihatannya masih kosong. + + Pertimbangkan untuk mengeluarkan sesi lawas (%1$d hari atau lebih) yang Anda tidak gunakan lagi. + + Sesi yang tidak aktif + Verifikasi atau keluarkan sesi yang belum diverifikasi. + Sesi yang belum diverifikasi + Perbaiki keamanan akun Anda dengan mengikuti saran berikut. + Saran keamanan + + Tidak aktif selama %1$d+ hari (%2$s) + + Ini di mana permintaan dan undangan baru Anda akan berada. + Belum ada yang baru. + Space adalah cara baru untuk mengelompokkan ruangan dan orang. Buat sebuah space untuk memulai. + Belum ada space. + Tutup %s anak + Buka %s anak + Buat Space + \ No newline at end of file From 2f94162236a9100bc4169e7d93cfd13f13ec9f6e Mon Sep 17 00:00:00 2001 From: random Date: Fri, 9 Sep 2022 10:20:39 +0000 Subject: [PATCH 009/131] Translated using Weblate (Italian) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/it/ --- .../src/main/res/values-it/strings.xml | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml index ecb29d1586..4e66e7528c 100644 --- a/library/ui-strings/src/main/res/values-it/strings.xml +++ b/library/ui-strings/src/main/res/values-it/strings.xml @@ -2627,4 +2627,39 @@ Spiacenti, questa stanza non è stata trovata. \nRiprova più tardi.%s Inviti - + Provalo + Tocca in alto a destra per vedere l\'opzione feedback. + Invia un feedback + Accedi ai tuoi spazi (in basso a destra) più velocemente e più facilmente che mai. + Accedi agli spazi + Per semplificare ${app_name}, le schede ora sono opzionali. Gestiscile usando il menu in alto a destra. + Benvenuti ad una nuova panoramica! + Qui è dove verranno mostrati i messaggi non letti, quando ne avrai qualcuno. + Niente da segnalare. + L\'app di chat tutto-in-uno per team, amici e organizzazioni. Inizia una conversazione o entra in una stanza esistente per cominciare. + Benvenuto/a in ${app_name}, +\n%s. + Gli spazi sono un modo nuovo di raggruppare stanze e persone. Aggiungi una stanza esistente, o creane una nuova usando il pulsante in basso a destra. + %s +\nsembra un po\' vuoto. + + Considera di disconnettere le sessioni vecchie (%1$d giorno o più) che non usi più. + Considera di disconnettere le sessioni vecchie (%1$d giorni o più) che non usi più. + + Sessioni inattive + Verifica o disconnetti le sessioni non verificate. + Sessioni non verificate + Migliora la sicurezza del tuo account seguendo questi consigli. + Consigli di sicurezza + + Inattivo da %1$d+ giorno (%2$s) + Inattivo da %1$d+ giorni (%2$s) + + Qui è dove troverai le nuove richieste e gli inviti. + Niente di nuovo. + Gli spazi sono un modo nuovo di raggruppare stanze e persone. Crea uno spazio per iniziare. + Ancora nessuno spazio. + Riduci contenuto di %s + Espandi contenuto di %s + Cambia spazio + \ No newline at end of file From 4b980e85f4a99ce60b83ef0cd832c737d942d526 Mon Sep 17 00:00:00 2001 From: Philip Goto Date: Fri, 9 Sep 2022 17:05:45 +0000 Subject: [PATCH 010/131] Translated using Weblate (Dutch) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/nl/ --- .../src/main/res/values-nl/strings.xml | 254 +++++++++++------- 1 file changed, 153 insertions(+), 101 deletions(-) diff --git a/library/ui-strings/src/main/res/values-nl/strings.xml b/library/ui-strings/src/main/res/values-nl/strings.xml index b1d239963e..623cc89da1 100644 --- a/library/ui-strings/src/main/res/values-nl/strings.xml +++ b/library/ui-strings/src/main/res/values-nl/strings.xml @@ -3,10 +3,10 @@ Uitnodiging van %s %1$s heeft %2$s uitgenodigd %1$s heeft u uitgenodigd - %1$s neemt nu deel aan het gesprek - %1$s heeft het gesprek verlaten + %1$s is deelnemer geworden van de kamer + %1$s heeft het de kamer verlaten %1$s heeft de uitnodiging geweigerd - %1$s heeft %2$s uit het gesprek verwijderd + %1$s heeft %2$s verwijderd %1$s heeft %2$s ontbannen %1$s heeft %2$s verbannen %1$s heeft de uitnodiging van %2$s ingetrokken @@ -15,20 +15,20 @@ %1$s heeft zijn/haar naam aangepast van %2$s naar %3$s %1$s heeft zijn/haar naam verwijderd (%2$s) %1$s heeft het onderwerp veranderd naar: %2$s - %1$s heeft de gespreksnaam veranderd naar: %2$s + %1$s heeft de kamernaam veranderd naar: %2$s %s heeft een video-oproep gemaakt. %s heeft een spraakoproep gemaakt. %s heeft de oproep beantwoord. %s heeft de oproep beëindigd. - %1$s heeft de toekomstige gespreksgeschiedenis zichtbaar gemaakt voor %2$s - alle deelnemers aan het gesprek, vanaf het punt dat ze zijn uitgenodigd. - alle deelnemers aan het gesprek, vanaf het punt dat ze zijn toegetreden. - alle deelnemers aan het gesprek. + %1$s heeft de toekomstige kamergeschiedenis zichtbaar gemaakt voor %2$s + alle kamerdeelnemers, vanaf het punt dat ze zijn uitgenodigd. + alle kamerdeelnemers, vanaf het punt dat ze deelnemer zijn geworden. + alle kamerdeelnemers. iedereen. (avatar is ook veranderd) - %1$s heeft de gespreksnaam verwijderd - %1$s heeft het gespreksonderwerp verwijderd - %1$s heeft een uitnodiging naar %2$s gestuurd om het gesprek toe te treden + %1$s heeft de kamernaam verwijderd + %1$s heeft het kameronderwerp verwijderd + %1$s heeft een uitnodiging naar %2$s gestuurd om deelnemer te worden van de kamer %1$s heeft de uitnodiging voor %2$s aanvaard ** Kan niet ontsleutelen: %s ** Het apparaat van de afzender heeft geen sleutels voor dit bericht gestuurd. @@ -36,27 +36,27 @@ Matrix-fout E-mailadres Telefoonnummer - Gespreksuitnodiging + Kameruitnodiging %1$s en %2$s - Leeg gesprek + Lege kamer Initiële synchronisatie: \nAccount wordt geïmporteerd… Initiële synchronisatie: \nCrypto wordt geïmporteerd Initiële synchronisatie: -\nGesprekken worden geïmporteerd +\nKamers importeren Initiële synchronisatie: -\nDeelgenomen gesprekken worden geïmporteerd -\nDit kan enige tijd in beslag nemen +\nGesprekken worden geladen +\nAls u aan veel kamers deelneemt kan dit even duren Initiële synchronisatie: -\nUitgenodigde gesprekken worden geïmporteerd +\nUitgenodigde kamers worden geïmporteerd Initiële synchronisatie: -\nVerlaten gesprekken worden geïmporteerd +\nVerlaten kamers worden geïmporteerd Initiële synchronisatie: \nAccountgegevens worden geïmporteerd - %s heeft dit gesprek geüpgraded. + %s heeft deze kamer geüpgraded. Bericht wordt verstuurd… - %1$s heeft de uitnodiging voor %2$s om het gesprek toe te treden ingetrokken + %1$s heeft de uitnodiging voor %2$s om deelnemer te worden van de kamer ingetrokken Uitnodiging van %1$s. Reden: %2$s %1$s heeft %2$s uitgenodigd. Reden: %3$s %1$s heeft u uitgenodigd. Reden: %2$s @@ -69,8 +69,8 @@ %1$s heeft de uitnodiging voor %2$s aanvaard. Reden: %3$s %1$s heeft de uitnodiging van %2$s ingetrokken. Reden: %3$s - %1$s heeft %2$s als gespreksadres toegevoegd. - %1$s heeft %2$s als gespreksadressen toegevoegd. + %1$s heeft %2$s als kameradres toegevoegd. + %1$s heeft %2$s als kameradressen toegevoegd. %1$s heeft %2$s als gespreksadres verwijderd. @@ -123,7 +123,7 @@ Logboek versturen Crash-logboek versturen Schermafdruk versturen - Fout melden + Probleem melden Beschrijf de fout. Wat heeft u gedaan\? Wat verwachtte u dat er zou gebeuren\? Wat is er echt gebeurd\? Beschrijf hier uw probleem Om het probleem te kunnen onderzoeken worden logboeken van deze cliënt met de foutmelding verstuurd. Deze foutmelding, inclusief de logboeken en schermafdruk, zullen niet openbaar zichtbaar zijn. Indien u liever alleen de bovenstaande tekst verstuurt, haal dan het vinkje weg: @@ -132,7 +132,7 @@ Versturen van foutmelding is mislukt (%s) Voortgang (%s%%) De toepassing is de vorige keer gecrasht. Wilt u dit melden\? - Gesprek toetreden + Deelnemen aan kamer Inlognaam Afmelden Server-URL @@ -172,9 +172,9 @@ NEE Verdergaan Verwijderen - Toetreden + Deelnemen Afwijzen - Ga naar ongelezen + Naar ongelezen springen Gesprek verlaten Weet u zeker dat u het gesprek wilt verlaten\? TWEEGESPREKKEN @@ -210,7 +210,7 @@ Telefoonnummer toevoegen Toon informatie over de app in de systeeminstellingen. App-informatie - Meldingen voor deze account inschakelen + Meldingen voor dit account inschakelen Meldingen voor deze sessie inschakelen Berichten in één-op-één-gesprekken Berichten in groepsgesprekken @@ -227,7 +227,7 @@ Copyright Privacybeleid Cache wissen - Persoonsinstellingen + Gebruikersinstellingen Meldingen Genegeerde personen Overige @@ -265,7 +265,7 @@ Iedereen Alleen deelnemers (vanaf het moment dat deze optie wordt geselecteerd) Alleen deelnemers (vanaf het moment dat ze worden uitgenodigd) - Alleen deelnemers (vanaf het moment dat ze toetreden) + Alleen deelnemers (vanaf het moment dat ze deelnemer zijn geworden) Verbannen personen Geavanceerd Interne ID van dit gesprek @@ -275,7 +275,7 @@ Niet instellen als hoofdadres Ontsleutelingsfout Publieke naam - Sessie ID + Sessie-ID Sessiesleutel E2E-gesprekssleutels exporteren Gesprekssleutels exporteren @@ -294,7 +294,7 @@ Verifiëren Om te verifiëren dat deze sessie vertrouwd kan worden, contacteert u de eigenaar via een andere methode (bv. persoonlijk of via een telefoontje) en vraagt u hem/haar of de sleutel die hij/zij ziet in zijn/haar persoonsinstellingen van deze sessie overeenkomt met de sleutel hieronder: Als het overeenkomt, drukt u op de knop ‘Verifiëren’ hieronder. Als het niet overeenkomt, dan onderschept iemand anders deze sessie en zou u het beter blokkeren. In de toekomst zal dit verificatieproces verbeterd worden. - Kies een gesprekscatalogus + Kamermap kiezen Servernaam Alle gesprekken op server %s Alle lokale gesprekken op %s @@ -334,7 +334,7 @@ user_id ontbreekt in het verzoek. Gesprek %s is niet zichtbaar. Matrix-apps toevoegen - Geluidsmeldingen + Belangrijke meldingen Stille meldingen Foutmelding Foto maken @@ -423,7 +423,7 @@ Voer uw wachtwoord in. Beschrijf het probleem in het Engels, indien mogelijk. Media bekijken vóór het versturen - Toont een actie + Geeft activiteit weer Verbant persoon met gegeven ID Heft verbanning van persoon met gegeven ID op Stel het machtsniveau van een persoon in @@ -456,7 +456,7 @@ Aanvaarden Gelieve het beleid van deze server te lezen en aanvaarden: Oproepen - Gebruik de standaardbeltoon van ${app_name} voor inkomende oproepen + Standaardbeltoon van ${app_name} gebruiken voor inkomende oproepen Beltoon voor inkomende oproepen Selecteer beltoon voor oproepen: Eruit sturen @@ -551,7 +551,7 @@ ${app_name} wordt niet beperkt door accuoptimalisatie. Als een persoon een apparaat los van de oplader een tijd laat stilliggen, met het scherm uitgeschakeld, gaat het apparaat in slaapmodus. Dit verhindert apps de toegang tot het netwerk, en stelt hun taken, synchronisaties en standaardalarmen uit. Optimalisatie negeren - Lawaaiierige meldingen configureren + Belangrijke meldingen configureren Oproepmeldingen configureren Stille meldingen configureren Bepaal de LED-kleur, vibratie, geluid, … @@ -722,7 +722,7 @@ Gebruik een integratiebeheerder om bots, bruggen, widgets en stickerpakketten te beheren. \nIntegratiebeheerders ontvangen configuratiedata en kunnen widgets aanpassen, gespreksuitnodigingen versturen en bestuursniveaus instellen namens u. Ontdekken - Beheer uw ontdekinstellingen. + Beheer uw ontdekkingsinstellingen. Integraties toestaan Integratiebeheerder Widget @@ -774,18 +774,18 @@ Gebeurtenis verwijderd door persoon Gebeurtenis gemodereerd door gesprek beheerder Niet correcte gebeurtenis, kan niet weergeven - Maak een nieuw gesprek aan + Nieuwe kamer aanmaken Geen netwerk. Controleer uw internet verbinding. Wijzigen - Wijzig netwerk + Netwerk wijzigen Even wachten… - Dit gesprek kan niet worden voorvertoond + Deze kamer kan niet worden voorvertoond Gesprekken Directe Berichten AANMAKEN - Gespreksnaam + Naam Publiek - Iedereen kan deze kamer kunnen toetreden + Iedereen kan deelnemer worden van deze kamer Afspelen U heeft het hoofdadres voor dit gesprek verwijderd. U heeft %1$s uitgenodigd. Reden: %2$s @@ -861,8 +861,8 @@ U heeft een audiogesprek geopend. U heeft een videogesprek geopend. U heeft de kamernaam veranderd naar: %1$s - U heeft de kamer afbeelding aangepast - %1$s heeft de kamer afbeelding aangepast + U heeft de kamerafbeelding aangepast + %1$s heeft de kamerafbeelding aangepast U heeft het onderwerp gewijzigd naar: %1$s U heeft uw weergavenaam verwijderd (voorheen %1$s) U heeft de uitnodiging van %1$s ingetrokken @@ -891,8 +891,8 @@ U heeft %1$s als gespreksadressen verwijderd. - U heeft %1$s als gespreksadres toegevoegd. - U heeft %1$s als gespreksadressen toegevoegd. + U heeft %1$s als kameradres toegevoegd. + U heeft %1$s als kameradressen toegevoegd. U heeft de uitnodiging van %1$s ingetrokken. Reden: %2$s U heeft de uitnodiging voor %1$s aanvaard. Reden: %2$s @@ -913,12 +913,12 @@ • Servers die overeenkomen met %s zijn verbannen. U heeft hier geüpgraded. %s heeft hier geüpgraded. - U heeft toekomstige gespreksgeschiedenis zichtbaar gemaakt voor %1$s + U heeft toekomstige kamergeschiedenis zichtbaar gemaakt voor %1$s %1$ds over %s is toegetreden. Conclusie Bevestiging Kamerinstellingen - Gespreksnaam + Kamernaam Integraties Beheren %d uitnodiging @@ -940,7 +940,7 @@ PIN Bevestigen Uitnodiging intrekken Contactpersonen - Gespreksnaam + Kamernaam Beveiligingszin Instellen Beveiligde backup @@ -962,7 +962,7 @@ Sleutelverzoeken Verwijderen Bevestigen Accountgegevens - Ontwikkel Gereedschap + Ontwikkelaarsgereedschap QR-code Sleutels herstellen Gekruist Ondertekenen Initialiseren @@ -971,7 +971,7 @@ Actieve Sessies Versleuteling inschakelen Versleuteling inschakelen\? - Berichtverwerker + Berichtbewerker Gesprek Verlaten Eén persoon @@ -1043,7 +1043,7 @@ Directe Berichten Feedback Token registreren - Pushregels + Push-regels Bericht verwijderd Beveiligde Backup Actieve widgets @@ -1061,7 +1061,7 @@ SSL-fout. Camera wisselen Draadloze Koptelefoon - Spaces + Ruimten Wisselen Opwaarderen Aanbevolen @@ -1187,7 +1187,7 @@ Kopiëren Geef toestemming om de camera te gebruiken via de systeeminstellingen om deze actie uit te voeren. Sommige rechten ontbreken om deze actie uit te voeren, geeft a.u.b. toestemming via de systeeminstellingen. - Spaces + Ruimten Begin met chatten Herstellen Afwijzen @@ -1224,13 +1224,13 @@ Aan de slag Spacerechten Gespreksrechten - Door deze persoon niet meer de verbannen kan hij/zij opnieuw toetreden tot de space. - Door deze persoon niet meer de verbannen kan hij/zij opnieuw toetreden tot het gesprek. + Door de verbanning op te heffen kan deze gebruiker opnieuw deelnemer worden van de ruimte. + Door de verbanning op te heffen kan deze gebruiker opnieuw deelnemer worden van de kamer. Door deze persoon te verbannen zal hij/zij verwijderd worden uit deze space en voorkomen dat hij/zij opnieuw toetreedt. Reden voor verbanning - Door deze persoon de verwijderen zal hij/zij niet meer in deze space zitten. + De gebruiker zal worden verwijderd uit deze ruimte. \n -\nOm te voorkomen dat hij/zij opnieuw toetreedt, kunt u hem/haar ook verbannen. +\nOm te voorkomen dat ze opnieuw toetreden, kunt u ze verbannen. Door deze persoon te verwijderen zal hij/zij niet meer in dit gesprek zitten. \n \nOm te voorkomen dat hij/zij opnieuw toetreedt, kun je hem/haar ook verbannen. @@ -1241,7 +1241,7 @@ \n \nU kunt deze actie op elk moment ongedaan maken in de algemene instellingen. U kunt deze wijziging niet ongedaan maken omdat uzelf degradeert, als u de laatste persoon met rechten bent in het gesprek zal het onmogelijk zijn om opnieuw rechten te krijgen. - Dit gesprek is niet publiek. U kunt niet opnieuw toetreden zonder uitnodiging. + Deze kamer is niet publiek. U kunt niet opnieuw deelnemer worden zonder uitnodiging. Toegang verlenen tot uw contactpersonen. Om de QR-code te scannen moet u toegang verlenen tot de camera. Oproep beëindigen… @@ -1353,7 +1353,7 @@ Toevoegen aan lage prioriteit Verwijder van favorieten Toevoegen aan favorieten - Alle berichten (luidruchtig) + Alle belangrijke berichten Deze inhoud is als ongepast gerapporteerd. \n \nAls u geen inhoud van deze persoon meer wilt zien, kunt u deze negeren om hun berichten te verbergen. @@ -1396,7 +1396,7 @@ Het lijkt erop dat de server er te lang over doet om te reageren. Dit kan worden veroorzaakt door een slechte verbinding of een fout met de server. Probeer het over een tijdje opnieuw. Probeer het opnieuw zodra u de algemene voorwaarden van uw homeserver hebt geaccepteerd. Uitgebreide logboeken helpen ontwikkelaars door meer logboeken te verstrekken wanneer u een RageShake verzendt. Zelfs wanneer ingeschakeld, registreert de toepassing geen berichtinhoud of andere privégegevens. - Uitgebreide logboeken inschakelen. + Uitgebreide logboeken inschakelen Ga akkoord met de servicevoorwaarden van de identiteitsserver (%s), zodat u vindbaar bent op e-mailadres of telefoonnummer. U deelt momenteel e-mailadressen of telefoonnummers op de identiteitsserver %1$s. U moet opnieuw verbinding maken met %2$s om ze niet meer te delen. De verificatiecode is niet correct. @@ -1411,7 +1411,7 @@ Stuur e-mailadressen en telefoonnummers naar %s Toestemming geven Mijn toestemming intrekken - Uw server-beleid + Uw thuisserverbeleid Kan geen server bereiken op de URL %s. Controleer uw link of kies handmatig een server. Uw contacten zijn privé. Om personen van uw contacten te ontdekken, hebben we uw toestemming nodig om contactgegevens naar uw identiteitsserver te sturen. We hebben u een bevestigingsmail gestuurd naar %s, controleer eerst uw e-mail en klik op de bevestigingslink @@ -1467,8 +1467,8 @@ Afbeelding comprimeren… Bestand versturen (%1$s / %2$s) Miniatuur versturen (%1$s / %2$s) - Toon volledige geschiedenis in versleutelde kamers - Toon verborgen gebeurtenissen op de tijdlijn + Volledige geschiedenis in versleutelde kamers weergeven + Verborgen gebeurtenissen op de tijdlijn weergeven Geef feedback De feedback kan niet worden verzonden (%s) Bedankt, uw feedback is succesvol verzonden @@ -1479,8 +1479,8 @@ Bedankt, de suggestie is succesvol verzonden Beschrijf hier uw suggestie Schrijf hieronder uw suggestie. - Doe een suggestie - Systeem instellingen + Een voorstel doen + Systeeminstellingen Versies Hulp bij het gebruik van ${app_name} Hulp en ondersteuning @@ -1500,9 +1500,9 @@ \n \n%s Kameronderwerp (optioneel) - Aanmaken nieuwe Space - Toon een aanduiding voor verwijderde berichten - Toon verwijderde berichten + Nieuwe ruimte aanmaken + Geeft een plaatsvervangende melding weer voor verwijderde berichten. + Verwijderde berichten weergeven Beveiligde back-up instellen Beveiliging tegen verlies van toegang tot versleutelde berichten en gegevens De herstelsleutel is opgeslagen. @@ -1565,7 +1565,7 @@ Gepubliceerde adressen kunnen door iedereen op elke server worden gebruikt om lid te worden van uw kamer. Om een adres te publiceren, moet het eerst als lokaal adres worden ingesteld. Gepubliceerde adressen Adressen van deze kamer bekijken en beheren. - Spaceadressen + Ruimte-adressen Bekijk en beheer de adressen van deze kamer en de zichtbaarheid ervan in de kamerdirectory. Kameradressen Sta toe om gasten te laten deelnemen @@ -1584,7 +1584,7 @@ Deze server biedt geen beleid. Bibliotheken van derden Uw identiteitsserverbeleid - ${app_name} beleid + ${app_name}-beleid We delen geen informatie met derden We registreren of profileren geen accountgegevens hier @@ -1601,7 +1601,7 @@ Voeg een knop toe aan de invoerveld om het emoji-toetsenbord te openen Emoji-toetsenbord weergeven Gebruik /confetti commando of stuur een bericht met ❄️ of 🎉 - Toon chateffecten + Chateffecten weergeven Kamer upgrades Berichten door bot Kameruitnodigingen @@ -1754,7 +1754,7 @@ Pincode is vereist na 2 minuten ${app_name} niet te hebben gebruikt. Pincode vereist na 2 minuten Geef alleen het aantal ongelezen berichten weer in een eenvoudige melding. - Toon details zoals kamernamen en berichtinhoud. + Geeft details weer zoals kamernamen en berichtinhoud. Inhoud in meldingen weergeven Pincode is de enige manier om ${app_name} te ontgrendelen. Schakel apparaatspecifieke biometrische gegevens in, zoals vingerafdrukken en gezichtsherkenning. @@ -1831,8 +1831,8 @@ Andere beschikbare talen Deel deze code met mensen zodat ze deze kunnen scannen om u toe te voegen en te beginnen met chatten. Mijn code - Deel mijn code - Scan een QR-code + Mijn code delen + Een QR-code scannen We kunnen geen personen uitnodigen. Controleer de personen die u wilt uitnodigen en probeer het opnieuw. Uitnodigingen verzonden naar %1$s en nog één @@ -1843,7 +1843,7 @@ Uitnodiging verzonden naar %1$s 🔐️ Doe mee met ${app_name} Hé, praat met me op ${app_name}: %s - Nodig vrienden uit + Vrienden uitnodigen Mensen toevoegen We kunnen je DM niet maken. Controleer de personen die u wilt uitnodigen en probeer het opnieuw. De link %1$s brengt u naar een andere site: %2$s. @@ -1912,7 +1912,7 @@ Kan sleutels niet importeren Wachten op %s… Bijna daar! Op bevestiging wachten… - Bijna daar! Toont het andere apparaat een vinkje\? + Bijna klaar! Toont het andere apparaat een vinkje\? Een onderwerp toevoegen %s om mensen te laten weten waar deze kamer over gaat. Dit is het begin van uw privéberichtgeschiedenis met %s. @@ -1989,7 +1989,7 @@ \nWees voorzichtig, het kan leiden tot onverwacht gedrag. Vliegtuigmodus is ingeschakeld Verbinding met de server is verbroken - Bijna daar! Toont %s een vinkje\? + Bijna klaar! Toont %s een vinkje\? Totdat deze persoon deze sessie vertrouwt, worden berichten die van en naar de sessie worden verzonden, gelabeld met waarschuwingen. U kunt het ook handmatig verifiëren. %1$s (%2$s) aangemeld met een nieuwe sessie: Deze sessie wordt vertrouwd voor veilig berichtenverkeer omdat %1$s (%2$s) deze heeft geverifieerd: @@ -2011,7 +2011,7 @@ Serverversie Server naam Afmelden voor deze sessie - Toon alle sessies + Alle sessies tonen Uw serverbeheerder heeft standaard end-to-end versleuteling uitgeschakeld in privékamers en privéberichten. Kruisondertekenen is niet ingeschakeld Kruisondertekenen is ingeschakeld. @@ -2070,21 +2070,21 @@ Ze komen niet overeen Niet-vertrouwd inloggen Uw e-maildomein is niet geautoriseerd om op deze server te registreren - Space aanmaken… + Ruimte aanmaken… Kamer aanmaken… Sommige tekens zijn niet toegestaan Geef een kameradres op Dit adres is al in gebruik - Space adres + Ruimte-adres U kunt dit inschakelen als de kamer alleen wordt gebruikt voor samenwerking met interne teams op uw server. Dit kan later niet meer worden gewijzigd. Blokkeer iedereen die geen deel uitmaakt van %s om ooit deel te nemen aan deze kamer Verberg geavanceerd - Toon geavanceerd + Geavanceerd weergeven Eenmaal ingeschakeld, kan versleuteling niet worden uitgeschakeld. Voegt ( ͡° ͜ʖ ͡°) toe aan een bericht in platte tekst Voegt ¯\\_(ツ)_/¯ toe aan een bericht in platte tekst - Toon wat nuttige informatie om te helpen bij het debuggen van de applicatie - Toon debug-informatie op het scherm + Geeft wat nuttige informatie weer om te helpen bij foutopsporing van de app. + Foutopsporingsinformatie op het scherm weergeven ${app_name} kan vaker crashen als er een onverwachte fout optreedt Laat alleen de eerste resultaten zien, typ meer letters… Schud je telefoon om de detectiedrempel te testen @@ -2157,9 +2157,9 @@ Ik heb mijn e-mailadres geverifieerd Tik op de link om uw nieuwe wachtwoord te bevestigen. Klik hieronder als u de link hebt gevolgd die erin staat. Word eigenaar van uw gesprekken. - Space aanmaken - Space aanmaken… - Aanmaken een space + Ruimte aanmaken + Ruimte aanmaken… + Een ruimte aanmaken Gebeurtenis inhoud Houd er rekening mee dat bij het upgraden een nieuwe versie van de kamer wordt gemaakt. Alle huidige berichten blijven in deze gearchiveerde kamer. Iedereen in een ouderkamer kan deze kamer vinden en er lid van worden. Het is niet nodig om iedereen handmatig uit te nodigen. U kunt dit op elk moment wijzigen in de kamer instellingen. @@ -2247,7 +2247,7 @@ Experimenteel voelen\? \nU kunt bestaande spaces aan een space toevoegen. Alle kamers waarin u deelneemt, worden weergegeven in Home. - Toon alle kamers in Home + Alle kamers op startscherm weergeven Kamers en spaces beheren Markeren als aanbevolen Markeren als niet aanbevolen @@ -2300,16 +2300,16 @@ Voeg wat details toe om het te laten opvallen. U kunt deze op elk moment wijzigen. Alleen op uitnodiging, het beste voor uzelf of teams Open voor iedereen, het beste voor gemeenschappen - Een privé space voor u en uw teamgenoten + Een privé-ruimte voor u en uw teamgenoten Ik en teamgenoten Een privé space om je kamers te organiseren Alleen ik Zorg ervoor dat de juiste mensen toegang hebben tot %s. Met wie werkt u samen\? U kunt dit later wijzigen - Wat voor soort space wilt u aanmaken\? - Uw privé space - Uw openbare space + Wat voor soort ruimte wilt u aanmaken\? + Uw privé-ruimte + Uw openbare ruimte Space toevoegen Privé space Openbare space @@ -2352,7 +2352,7 @@ Locatie De versleuteling is verkeerd geconfigureerd, zodat u geen berichten kunt versturen. Klik om instellingen te openen. De versleuteling is verkeerd geconfigureerd, zodat u geen berichten kunt versturen. Neem contact op met een beheerder om de versleuteling in een geldige staat te herstellen. - Toon bericht bubbels + Berichtbubbels weergeven Kan kaart niet laden Kaart Let op: app wordt opnieuw gestart @@ -2393,7 +2393,7 @@ %1$d meer %1$d meer - Toon minder + Minder weergeven Locatie delen is bezig ${app_name} Live locatie Stop @@ -2471,8 +2471,8 @@ \n \nHoud er rekening mee dat deze actie de app opnieuw zal starten en dat dit enige tijd kan duren. Initieel synchronisatieverzoek - Toon de laatste profielinformatie (avatar en weergavenaam) voor alle berichten. - Toon laatste persoonsinformatie + Geeft de meest recente gebruikersinfo (avatar en weergavenaam) weer voor alle berichten. + Meest recente gebruikersinfo weergeven Bezet Back-up heeft een geldige handtekening van deze persoon. %1$s geleden bijgewerkt @@ -2563,7 +2563,7 @@ %s moet uw account verifiëren Vul uw e-mailadres in Lees de voorwaarden en het beleid van %s door - Serverbeleid + Serverbeleiden Neem contact op Element Matrix Services (EMS) is een robuuste en betrouwbare hostingservice voor snelle, veilige en realtime communicatie. Ontdek hoe op element.io/ems Wilt u uw eigen server hosten\? @@ -2596,7 +2596,7 @@ %1$s en %2$s E-mailadres niet geverifieerd, controleer je inbox - Toon alle sessies (V2, WIP) + Alle sessies weergeven (V2, WIP) Kan kaart niet laden \nDeze server is mogelijk niet geconfigureerd om kaarten weer te geven. Open instellingen @@ -2604,7 +2604,7 @@ Andere sessies Sessies Lijst met publieke spaces - Maak een nieuw gesprek of een nieuwe kamer + Nieuw gesprek of nieuwe kamer aanmaken Personen Favorieten Ongelezen @@ -2613,10 +2613,62 @@ Activiteit Sorteer op Recente tonen - Toon filters + Filters weergeven Lay-outvoorkeuren Ontdek kamers Kamer creëren - Start gesprek + Gesprek starten Alle gesprekken - + U kunt feedback geven via het menu rechtsboven. + Krijg sneller en gemakkelijker toegang tot uw ruimten (rechtsonder). + Om ${app_name} te versimpelen zijn tabbladen nu optioneel. U kunt ze beheren in het menu rechtsboven. + Hier zullen uw ongelezen berichten verschijnen wanneer u deze heeft. + De allesomvattende beveiligde chat-app voor teams, vrienden en organisaties. Maak een gesprek aan of word deelnemer van een bestaande kamer om te beginnen. + Ruimten zijn een nieuwe manier om kamers en personen te groeperen. Voeg een bestaande kamer toe, of maak een nieuwe aan via de knop rechtsonder. + + Overweeg uit te loggen van oude sessies (%1$d of meer dagen) welke u niet meer gebruikt. + Overweeg uit te loggen van oude sessies (%1$d of meer dagen) welke u niet meer gebruikt. + + Verifieer of log uit van ongeverifieerde sessies. + Verbeter uw accountbeveiliging door deze aanbevelingen te volgen. + + Al %1$d+ dag inactief (%2$s) + Al %1$d+ dagen inactief (%2$s) + + Verifieer uw huidige sessie voor verbeterde beveiligde berichten. + Beveiligingsaanbevelingen + Niet-geverifieerde sessies + Inactieve sessies + %s +\nziet er vrij leeg uit. + Welkom bij ${app_name}, +\n%s. + Niets te melden. + Welkom bij een nieuw uiterlijk! + Toegang tot ruimten + Feedback geven + Uitproberen + Niet-geverifieerd · Laatste activiteit %1$s + Geverifieerd · Laatste activiteit %1$s + Alle bekijken (%1$d) + Huidige sessie + Details bekijken + Sessie verifiëren + Uw huidige sessie is klaar voor beveiligde berichten. + Sorry, deze kamer kon niet worden gevonden. +\nProbeer het later opnieuw. %s + Dit is waar uw nieuwe verzoeken en uitnodigingen zullen verschijnen. + Ruimten zijn een nieuwe manier om kamers en personen te groeperen. Maak een ruimte aan om te beginnen. + Ongeverifieerde sessie + Geverifieerde sessie + Onbekend apparaattype + Desktop + Web + Mobiel + Niets nieuws. + Uitnodigingen + Nog geen ruimten. + %s subitems inklappen + %s subitems uitvouwen + Ruimte aanpassen + \ No newline at end of file From 05483d9ca084e2cc0b652b6a8cbe9c8ad5469679 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Wed, 7 Sep 2022 19:34:48 +0000 Subject: [PATCH 011/131] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/ --- .../src/main/res/values-pt-rBR/strings.xml | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml index 08c41db365..dded77f50b 100644 --- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml +++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml @@ -2636,4 +2636,39 @@ Desculpe, esta sala não tem sido encontrada. \nPor favor retente mais tarde.%s Convites - + Teste aí + Toque na direita topo para ver a opção para feedback. + Dar Feedback + Acessar seus Espaços (direito fundo) mais rápido e fácio que jamais antes. + Acessar Espaços + Para simplificar seu ${app_name}, abas são agora opcionais. Gerencie-as usando o menu direito topo. + Boas vindas a uma nova visão! + Isto é onde suas mensagens não-lidas vão aparecer, quando você tiver algumas. + Nada a reportar. + O app de chat seguro tudo-em-um para equipes, amigas(os) e organizações. Crie um chat, ou junte-se a uma sala existe, para começar. + Boas vindas a ${app_name}, +\n%s. + Espaços são uma nova maneira de agrupar salas e pessoas. Adicione uma sala existente, ou crie uma nova, usando o botão direito fundo. + %s +\nestá parecendo um pouco vazio. + + Considere fazer signout de sessões antigas (%1$d dia ou mais) que você não usa mais. + Considere fazer signout de sessões antigas (%1$d dias ou mais) que você não usa mais. + + Sessões inativas + Verificar ou fazer signout de sessões não-verificadas. + Sessões não-verificadas + Melhore a segurança de sua conta ao seguir estas recomendações. + Recomendações de segurança + + Inativa(o) por %1$d+ dia (%2$s) + Inativa(o) por %1$d+ dias (%2$s) + + Isto é onde suas novas requisições e convites vão estar. + Nada novo. + Espaços são uma nova maneira de agrupar salas e pessoas. Crie um espaço para começar. + Nenhum espaço ainda. + Colapsar filhos de %s + Expandir filhos de %s + Mudar Espaço + \ No newline at end of file From 84eb71d63fd10d25f9729f5aacf75eec9518190f Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Wed, 7 Sep 2022 18:49:36 +0000 Subject: [PATCH 012/131] Translated using Weblate (Slovak) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/ --- .../src/main/res/values-sk/strings.xml | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml index 2cc2d0280e..6a2e3c0645 100644 --- a/library/ui-strings/src/main/res/values-sk/strings.xml +++ b/library/ui-strings/src/main/res/values-sk/strings.xml @@ -2686,4 +2686,41 @@ Je nám ľúto, táto miestnosť nebola nájdená. \nProsím, skúste to neskôr.%s Pozvánky - + Vyskúšajte si to + Ťuknutím na položku vpravo hore zobrazíte možnosť spätnej väzby. + Poskytnite spätnú väzbu + Získajte prístup k svojim priestorom (vľavo dole) rýchlejšie a jednoduchšie ako kedykoľvek predtým. + Prístup k priestorom + Pre zjednodušenie vašej aplikácie ${app_name}, sú teraz karty voliteľné. Spravujte ich pomocou ponuky vpravo hore. + Vitajte v novom zobrazení! + Tu sa zobrazia neprečítané správy, ak nejaké máte. + Nič, o čom by bolo potrebné podať správu. + Kompletná zabezpečená aplikácia na komunikáciu pre tímy, priateľov a organizácie. Začnite konverzáciu alebo sa pridajte k existujúcej miestnosti. + Vitajte v aplikácii ${názov_aplikácie}, +\n%s. + Priestory sú novým spôsobom zoskupovania miestností a ľudí. Pomocou tlačidla vpravo dole môžete pridať existujúcu miestnosť alebo vytvoriť novú. + %s +\nvyzerá trochu prázdne. + + Zvážte odhlásenie zo starých relácií (%1$d deň alebo viac), ktoré už nepoužívate. + Zvážte odhlásenie zo starých relácií (%1$d dni alebo viac), ktoré už nepoužívate. + Zvážte odhlásenie zo starých relácií (%1$d dní alebo viac), ktoré už nepoužívate. + + Neaktívne relácie + Overte alebo sa odhláste z neoverených relácií. + Neoverené relácie + Zlepšite zabezpečenie svojho účtu dodržiavaním týchto odporúčaní. + Bezpečnostné odporúčania + + Neaktívny už %1$d+ deň (%2$s) + Neaktívny už %1$d+ dni (%2$s) + Neaktívny už %1$d+ dní (%2$s) + + Tu sa budú nachádzať vaše nové žiadosti a pozvánky. + Nič nové. + Priestory sú novým spôsobom zoskupovania miestností a ľudí. Vytvorte si priestor a začnite. + Zatiaľ žiadne priestory. + Zbaliť %s podpriestory + Rozbaliť %s podpriestory + Zmeniť priestor + \ No newline at end of file From aa4e830cb5f89cfaf993f1608b74039e2fa642a1 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 7 Sep 2022 23:02:02 +0000 Subject: [PATCH 013/131] Translated using Weblate (Ukrainian) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- .../src/main/res/values-uk/strings.xml | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml index 1c809fff3e..457715a3b1 100644 --- a/library/ui-strings/src/main/res/values-uk/strings.xml +++ b/library/ui-strings/src/main/res/values-uk/strings.xml @@ -2736,4 +2736,43 @@ Перепрошуємо, цю кімнату не знайдено. \nСпробуйте пізніше.%s Запрошення - + Спробувати + Клацніть праворуч вгорі, щоб побачити опцію відгуку. + Надіслати відгук + Отримуйте доступ до своїх просторів (унизу праворуч) швидше та легше, ніж раніше. + Доступ до просторів + Щоб спростити ваш ${app_name}, вкладки тепер необов’язкові. Керуйте ними у верхньому правому меню. + Вітаємо в новому вигляді! + Тут з\'являтимуться ваші непрочитані повідомлення, якщо вони є. + Немає про що звітувати. + Універсальний безпечний застосунок для спілкування з командами, друзями й організаціями. Створіть бесіду або приєднайтеся до наявної кімнати, щоб розпочати. + Вітаємо в ${app_name}, +\n%s. + Простори – це новий спосіб групувати кімнати та людей. Додайте наявну кімнату або створіть нову, використовуючи кнопку внизу праворуч. + %s +\nмає дещо порожній вигляд. + + Зважте потребу вийти зі старих сеансів (%1$d день або більше), який ви більше не використовуєте. + Зважте потребу вийти зі старих сеансів (%1$d дні або більше), які ви більше не використовуєте. + Зважте потребу вийти зі старих сеансів (%1$d днів або більше), які ви більше не використовуєте. + Зважте потребу вийти зі старих сеансів (%1$d днів або більше), які ви більше не використовуєте. + + Неактивні сеанси + Звірити або вийти з не звірених сеансів. + Не звірений сеанс + Удоскональте безпеку свого облікового запису, дотримуючись цих порад. + Поради щодо безпеки + + Без активності %1$d+ день (%2$s) + Без активності %1$d+ дні (%2$s) + Без активності %1$d+ днів (%2$s) + Без активності %1$d+ днів (%2$s) + + Тут з\'являтимуться нові запити та запрошення. + Нічого нового. + Простори – це новий спосіб групувати кімнати та людей. Створіть простір, щоб розпочати. + Ще немає просторів. + Згорнути дочірні елементи %s + Розгорнути дочірні елементи %s + Змінити простір + \ No newline at end of file From 44b656337668796a7ea76ff9a83edcb75271e9d6 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 8 Sep 2022 02:12:32 +0000 Subject: [PATCH 014/131] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- .../src/main/res/values-zh-rTW/strings.xml | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 0f5208bcde..fc380d8167 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -2586,4 +2586,37 @@ 抱歉,找不到此聊天室。 \n請稍後再試。%s 邀請 - + 試試看 + 輕點右上角來檢視回饋選項。 + 給予回饋 + 存取您的空間(右下角)比以往任何時候都更快且更輕鬆。 + 存取空間 + 為了簡化您的 ${app_name},分頁現在是選擇性的。使用右上角的選單管理它們。 + 歡迎使用新的檢視! + 當您有一些未讀的訊息時,這裡會顯示您的未讀訊息。 + 沒有要回報的東西。 + 適用於團隊、朋友與組織的多合一安全聊天應用程式。建立聊天室,或加入一個既有的聊天室。 + 歡迎使用 ${app_name}, +\n%s. + 空間是一種為聊天室與人們分組的新方式。使用右下角的按鈕新增既有的聊天室或建立新的。 + %s +\n看起來有點空。 + + 考慮登出您不再使用的舊工作階段(%1$d天或更久)。 + + 不活躍的工作階段 + 驗證或從未驗證的工作階段登出。 + 未驗證的工作階段 + 按照這些建議提高您的帳號安全性。 + 安全建議 + + 不活躍 %1$d+ 天 (%2$s) + + 這是您的新請求與邀請的所在。 + 沒有新東西。 + 空間是一種對聊天室與人們分組的新方式。建立空間以開始。 + 尚無空間。 + 折疊 %s 個子空間 + 展開 %s 個子空間 + 變更空間 + \ No newline at end of file From 7afd49b7d8bd3a5881010aa9333d54f864ec4abc Mon Sep 17 00:00:00 2001 From: Philip Goto Date: Sat, 10 Sep 2022 09:12:30 +0000 Subject: [PATCH 015/131] Translated using Weblate (Dutch) Currently translated at 25.3% (19 of 75 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/nl/ --- fastlane/metadata/android/nl-NL/changelogs/40104180.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104190.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104200.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104220.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104230.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104240.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104250.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104270.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104280.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104320.txt | 2 ++ fastlane/metadata/android/nl-NL/changelogs/40104340.txt | 2 ++ 11 files changed, 22 insertions(+) create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104180.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104190.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104200.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104220.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104230.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104240.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104250.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104270.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104280.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104320.txt create mode 100644 fastlane/metadata/android/nl-NL/changelogs/40104340.txt diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104180.txt b/fastlane/metadata/android/nl-NL/changelogs/40104180.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104180.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104190.txt b/fastlane/metadata/android/nl-NL/changelogs/40104190.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104190.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104200.txt b/fastlane/metadata/android/nl-NL/changelogs/40104200.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104200.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104220.txt b/fastlane/metadata/android/nl-NL/changelogs/40104220.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104220.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104230.txt b/fastlane/metadata/android/nl-NL/changelogs/40104230.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104230.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104240.txt b/fastlane/metadata/android/nl-NL/changelogs/40104240.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104240.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104250.txt b/fastlane/metadata/android/nl-NL/changelogs/40104250.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104250.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104270.txt b/fastlane/metadata/android/nl-NL/changelogs/40104270.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104270.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104280.txt b/fastlane/metadata/android/nl-NL/changelogs/40104280.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104280.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104320.txt b/fastlane/metadata/android/nl-NL/changelogs/40104320.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104320.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases diff --git a/fastlane/metadata/android/nl-NL/changelogs/40104340.txt b/fastlane/metadata/android/nl-NL/changelogs/40104340.txt new file mode 100644 index 0000000000..48796d85bc --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/40104340.txt @@ -0,0 +1,2 @@ +Belangrijkste veranderingen in deze versie: Verscheidene foutoplossingen en stabiliteitsverbeteringen. +Volledige lijst met veranderingen: https://github.com/vector-im/element-android/releases From 970abb4dded9c8e8abfdc7b86605466ea52b7af5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 14 Sep 2022 16:53:38 +0200 Subject: [PATCH 016/131] Rename file. --- .../{VectorEventViewModel.kt => VectorSharedActionViewModel.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename vector/src/main/java/im/vector/app/core/platform/{VectorEventViewModel.kt => VectorSharedActionViewModel.kt} (100%) diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorEventViewModel.kt b/vector/src/main/java/im/vector/app/core/platform/VectorSharedActionViewModel.kt similarity index 100% rename from vector/src/main/java/im/vector/app/core/platform/VectorEventViewModel.kt rename to vector/src/main/java/im/vector/app/core/platform/VectorSharedActionViewModel.kt From 64fb985d3bd96fdbd0216a5f0970a8de7df6ff57 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 14 Sep 2022 17:36:59 +0200 Subject: [PATCH 017/131] First draft of documentation to onboard new developers. --- docs/_developer_onboarding.md | 230 ++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 docs/_developer_onboarding.md diff --git a/docs/_developer_onboarding.md b/docs/_developer_onboarding.md new file mode 100644 index 0000000000..2b446a950d --- /dev/null +++ b/docs/_developer_onboarding.md @@ -0,0 +1,230 @@ +# Developer on boarding + + + + + +## Introduction + +This doc is a quick introduction about the project and its architecture. + +It's aim is to help new developers to understand the overall project and where to start developing. + +Other useful documentation: +- all the docs in this folder! +- the [contributing doc](../CONTRIBUTING.md), that you should also read carefully. + +### Quick introduction to Matrix + +Matrix website: [matrix.org](https://matrix.org), [discover page](https://matrix.org/discover). +*Note*: Matrix.org is also hosting a homeserver ([.well-known file](https://matrix.org/.well-known/matrix/client)). +The reference homeserver (this is how Matrix servers are called) implementation is [Synapse](https://github.com/matrix-org/synapse/). But other implementations exist. The Matrix specification is here to ensure that any Matrix client, such as Element Android and its SDK can talk to any Matrix server. + +Have a quick look to the client-server API documentation: [Client-server documentation](https://spec.matrix.org/v1.3/client-server-api/). Other network API exist, the list is here: (https://spec.matrix.org/latest/) + +Matrix is an open source protocol. Change are possible and are tracked using [this GitHub repository](https://github.com/matrix-org/matrix-doc/). Changes to the protocol are called MSC: Matrix Spec Change. These are PullRequest to this project. + +Matrix object are Json data. Unstable prefixes must be used for Json keys when the MSC is not merged (i.e. accepted). + +#### Matrix data + +There are many object and data in the Matrix worlds. Let's focus on the most important and used, `Room` and `Event` + +##### Room + +`Room` is a place which contains ordered `Event`s. They are identified with their `room_id`. Nearly all the data are stored in rooms, and shared using homeserver to all the Room Member. + +*Note*: Spaces are also Rooms with a different `type`. + +##### Event + +`Events` are item of a Room, where data is embedded. + +There are 2 types of Event: + +- Room Events: contain useful content for the user (message, image, etc.), but are not necessarily displayed as this in the timeline (reaction, message edition, call signaling). +- State Events: contain the state of the Room (name, topic, etc.). They have a non null value for the key `state_key`. + +Also all the Room Member details are State Events: one State Event per member. In this casen the `state_key` is the matrixId (= userId). + +Important Fields of an Event: +- `event_id`: unique across the Matrix universe; +- `room_id`: the room the Event belongs to; +- `type`: describe what the Event contain, especially in the `content` section, and how the SDK should handle this Event; +- `content`: dynamic Event data; depends on the `type`. + +So we have a triple `event_id`, `type`, `state_key` which uniquely defines an Event. + +#### Sync + +The `Sync` is a way for the Matrix client to be up to date regarding the user data hosted by the server. All the Events are coming through the sync response. More details can be found here: [spec.matrix.org/v1.3/client-server-api/#syncing](https://spec.matrix.org/v1.3/client-server-api/#syncing) +When the application is in foreground, this is a looping request. We are using Https requests, which offer the advantage to be compatible with any homeserver. A sync token is used as request parameter, to let the server know what the client knows. +The `SyncThread` is responsible to manage the sync request loop. + +When the application is in background, a Push will trigger a sync request. + +##### Glossary about syncs + +- **initial sync**: a sync request without a token. This is the first request a client perform after login or after a clear cache. The server will include in the response all your rooms with the full state (all the room membership Event will not be present), with the latest messages for each room. We are in the process to replace this by version 3: sliding sync. All data are inserted to the Database (currently [Realm](https://www.mongodb.com/docs/realm/sdk/java/)). +- **incremental sync**: sync request with a token. +- **gappy sync**: sync request where all the new Events are not returned for one or several Rooms. Also called `limited sync`. It can be limited per Room. To get all the missing Events, a Room pagination API has to be called. +- **sync token**: `next_batch` value in the previous sync response. Will be provided as the `since` parameter for the next sync request. + +### The Android project + +The project should compile out of the box. + +The project is split into several modules. The main ones are: +For the app +- `vector-app`: application entry point; +- `vector`: legacy application, but now a library. In the process of being splitted into several modules; +- `vector-config`: this is where all the configuration of the application should occurs. Should because we are in the process of migrating all the configuration here; +- `library/ui-strings`: this is where all the string resources are stored. Please refer to [contributing doc](../CONTRIBUTING.md) to know how to make change on this module; +- `library/ui-styles`: this is where the Android styles are defined. + +For the SDK +- `matrix-sdk-android`: the main SDK module. The sources are in this project, but are also exported to [its own project](https://github.com/matrix-org/matrix-android-sdk2). All the PRs and issues related to the SDK take place in the Element Android project; +- `matrix-sdk-android-flow`: contains some wrapper to expose `Flow` to the application. + +### Matrix SDK + +SDK exposes `Services` to the client application. `Services` are public interface, and are defined in this parent package: `org.matrix.android.sdk.api`. Default implementation are internal to the SDK, in this parent package: `org.matrix.android.sdk.internal`. Note that you also have to declare the classes as `internal` when adding classes to the `org.matrix.android.sdk.internal` package. + +Interface allows us to replace the implementation for testing purpose. + +A generated documentation of the SDK is available [here](https://matrix-org.github.io/matrix-android-sdk2/). Updated after each release. Please ensure that the documentation (KDoc) of all the SDK Services is up to date, and is clear for a SDK user. +The SDK generated documentation also contains information about the entry points of the SDK. + +[Dagger](https://dagger.dev/) is used to inject all the dependencies to the SDK classes. + +SDK is exposing data as `LiveData`, but we are progressively migrating to `Flow`. Database is the source of truth. + +Example: +- Client send an Event using the `SendService`; +- At the end a `SendEvent` task is used; +- Retrofit API is used to send data to the server; +- Goes to the server, which returns only the `event_id`; +- The `Event` is coming back from the `sync` response with eventually extra added data. + +### Application + +This is the UI part of the project. + +There are two variants of the application: `Gplay` and `Fdroid`. + +The main difference is about using Firebase on `Gplay` variant, to have Push from Google Services. `FDroid` variant cannot contain closed source dependency. + +`Fdroid` is using background polling to lack the missing of Pushed. Now a solution using UnifiedPush has ben added to the project. See refer to [the dedicated documentation](./unifiedpush.md) for more details. + +#### MvRx + +[Maverick](https://airbnb.io/mavericks/#/README) (or MvRx) is an Android MVI framework that helps to develop Reactive application on Android. + +- Activity: holder for Fragment. See the parent [VectorBaseActivity](../vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt); +- Fragment: manage screen of the application. See the parent [VectorBaseFragment](../vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt); +- BottomSheet: see the parent [VectorBaseBottomSheetDialogFragment](../vector/src/main/java/im/vector/app/core/platform/VectorBaseBottomSheetDialogFragment.kt); +- ViewModel: this is where the logic is placed. All our ViewModel has a `handle()` which takes action as parameter. See the parent [VectorViewModel](../vector/src/main/java/im/vector/app/core/platform/VectorViewModel.kt); +- VectorSharedActionViewModel: Specific ViewModel that can be used to communicate between Fragment(s) and the host Activity. See the parent [VectorSharedActionViewModel](../vector/src/main/java/im/vector/app/core/platform/VectorSharedActionViewModel.kt); +- ViewState: this are `data class`, and this represent the state of the View. Has to be copied and set to be updated. Fragment will update the UI regarding the current state (`invalidate()` method). `Async` class from MvRx can be used in the ViewState, especially for asynchronous data loading. Nullability can also be used for optional data. ViewStates have to implement `MavericksState`; +- ViewEvents: useful when the ViewModel asks the View to trigger a specific action: navigation, show dialog, etc. See the parent [VectorViewEvents](../vector/src/main/java/im/vector/app/core/platform/VectorViewEvents.kt); +- ViewAction (`VectorViewModelAction`): useful when the UI (generally the Fragment) asks the ViewModel to do something. See the parent [VectorViewModelAction](../vector/src/main/java/im/vector/app/core/platform/VectorViewModelAction.kt); +- Controller: see the `Epoxy` section just below. + +##### Behavior + +Fragment asks the ViewModel to perform an action (coming from the user, but not necessarily. ViewModel can then talk to the SDK, updates the state once or several times. Fragment update the UI regarding the new state. + +When ViewModel is instantiated, it can subscribe using the SDK Services to get live state of the data. + +`invalidate()` has to be used by default, but it's possible to listen to specific member(s) of the `ViewState` using `onEach`. TODO Add an example. +`awaitState()` method + +#### Epoxy + +[Epoxy](https://github.com/airbnb/epoxy) is an Android library for building complex screens in a RecyclerView. Please read [the introduction](https://github.com/airbnb/epoxy#epoxy). + +- Controller declares items of the RecyclerView. Controller is injected in the Fragment. Controller extends `EpoxyController`, or one of its subclass, especially `TypedEpoxyController`; +- Fragment gives the state to the controller using `setData`; +- `buildModels` will be called by the framework; +- Controller will create ordered Items. + +Epoxy does the diffing, and handle many other thing for us, like handling item type, etc. + +See for instance the controller [AccountDataEpoxyController](../vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt)) for a simple example. + +Warning: do not use twice the same item `id` or it will crash. + +#### Other frameworks + +- Dependency injection is managed by [Dagger](https://dagger.dev/) (SDK) and [Hilt](https://developer.android.com/training/dependency-injection/hilt-android) (App); +- [Retrofit](https://square.github.io/retrofit/) and [OkHttp3](https://square.github.io/okhttp/): network requests; +- [Moshi](https://github.com/square/moshi) is used to parse and serialize Json object; + +#### Push + +Please see the dedicated documentation for more details. + +This is the classical scenario: + +- App receives a Push. Note: Push is ignored if app is in foreground; +- App asks the SDK to load Event data (fastlane mode). We have a change to get the data faster and display the notification faster; +- App asks the SDK to perform a sync request. + +#### Dependencies management + +All the dependencies are declared in `build.gradle` files. But some versions are declared in [this dedicated file](../dependencies.gradle). + +When adding a new dependency, you will have to update the file [dependencies_groups.gradle](../dependencies_groups.gradle) to allow the dependency to be downloaded from the artifact repository. Sometimes subdependencies need to be added too, until the project can compile. + +[Dependabot](https://github.com/dependabot) is set up on the project. This tool will automatically create Pull Request to upgrade our dependencies one by one. +dependencies_group, gradle files, Dependabot, etc. + +### Other points + +#### Logging + +**Important warning: ** NEVER log private user data, or use the flag `LOG_PRIVATE_DATA`. Be very careful when logging `data class`, all the content will be output! + +[Timber](https://github.com/JakeWharton/timber) is used to log data to logcat. We do not use directly the `Log` class. If possible please use a tag, as per + +````kotlin +Timber.tag(loggerTag.value).d("my log") +```` + +because automatic tag (= class name) will not be available on the release version. + +Also generally it is recommended to provide the `Throwable` to the Timber log functions. + +Last point, not that `Timber.v` function may have no effect on some devices. Prefer using `Timber.d` and up. + +#### Rageshake + +Rageshake is a feature to send bug report directly from the application. Just shake your phone and you will be prompted to send a bug report. + +Bug report can contain: +- a screenshot of the current application state +- the application logs from up to 15 application starts +- the logcat logs +- the key share history (crypto data) + +The data will be sent to an internal server, which is not publicly accessible. A GitHub issue will also be created to a private GitHub repository. + +Rageshake can be very useful to get logs from a release version of the application. + +### Tips + +- Element Android has a `developer mode` in the `Settings/Advanced settings`. Other useful options are available here; +- Show hidden Events can also help to debug feature. When devepor mode is enabled, it is possible to view the source (= the Json content) of any Events; +- Type `/devtools` in Element Web to access a developer menu. On Element Android, available in the Menu of a Room timeline, after enabling developer mode; +- Hidden debug menu: when developer mode is enabled and on debug build, there are some extra screens that can be accessible using the green wheel. In those screens, it will be possible to toggle some feature flags; +- Using logcat, filtering with `onResume` can help you to understand what screen are currently displayed on your device. Searching for string displayed on the screen can also help to find the running code in the codebase. +- When this is possible, prefer using `sealed interface` instead of `sealed class`; +- When writing temporary code, using the string "DO NOT COMMIT" in a comment can help to avoid committing things by mistake. If committed and pushed, the CI will detect this String and will warn the user about it. + +## Happy coding! + +The team is here to support you, feel free to ask anything to other developers. + +Also please feel to update this documentation, if incomplete/wrong/obsolete/etc. + +**Thanks!** From c72ab3d187c5ff5e8583aab9c93e693115124cb1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 14 Sep 2022 17:38:28 +0200 Subject: [PATCH 018/131] Add link to the new doc to the README file. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7acb5aa638..abf9c9a8c5 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ Please refer to [CONTRIBUTING.md](https://github.com/vector-im/element-android/b Come chat with the community in the dedicated Matrix [room](https://matrix.to/#/#element-android:matrix.org). +Also [this documentation](./docs/_developer_onboarding.md) can hopefully help developers to start working on the project. + ## Triaging issues Issues are triaged by community members and the Android App Team, following the [triage process](https://github.com/vector-im/element-meta/wiki/Triage-process). From f67cf0d5913e33df94438e14fdb0e4b179643f5f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 14 Sep 2022 17:38:50 +0200 Subject: [PATCH 019/131] Reduce link size. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index abf9c9a8c5..e351b64927 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ If you would like to receive releases more quickly (bearing in mind that they ma ## Contributing -Please refer to [CONTRIBUTING.md](https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md) if you want to contribute on Matrix Android projects! +Please refer to [CONTRIBUTING.md](./CONTRIBUTING.md) if you want to contribute on Matrix Android projects! Come chat with the community in the dedicated Matrix [room](https://matrix.to/#/#element-android:matrix.org). From 8623b85ac8ecb19dcd18eb9b334806333a53a6d9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 14 Sep 2022 17:47:31 +0200 Subject: [PATCH 020/131] Add support to `/devtools` command --- docs/_developer_onboarding.md | 2 +- library/ui-strings/src/main/res/values/strings.xml | 1 + .../main/java/im/vector/app/features/command/Command.kt | 1 + .../java/im/vector/app/features/command/CommandParser.kt | 7 +++++++ .../java/im/vector/app/features/command/ParsedCommand.kt | 1 + .../app/features/home/room/detail/TimelineFragment.kt | 3 +++ .../home/room/detail/composer/MessageComposerViewModel.kt | 4 ++++ 7 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/_developer_onboarding.md b/docs/_developer_onboarding.md index 2b446a950d..640a2d7665 100644 --- a/docs/_developer_onboarding.md +++ b/docs/_developer_onboarding.md @@ -215,7 +215,7 @@ Rageshake can be very useful to get logs from a release version of the applicati - Element Android has a `developer mode` in the `Settings/Advanced settings`. Other useful options are available here; - Show hidden Events can also help to debug feature. When devepor mode is enabled, it is possible to view the source (= the Json content) of any Events; -- Type `/devtools` in Element Web to access a developer menu. On Element Android, available in the Menu of a Room timeline, after enabling developer mode; +- Type `/devtools` in a Room composer to access a developer menu. There are some other entry points. Developer mode has to be enabled; - Hidden debug menu: when developer mode is enabled and on debug build, there are some extra screens that can be accessible using the green wheel. In those screens, it will be possible to toggle some feature flags; - Using logcat, filtering with `onResume` can help you to understand what screen are currently displayed on your device. Searching for string displayed on the screen can also help to find the running code in the codebase. - When this is possible, prefer using `sealed interface` instead of `sealed class`; diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 6a87ce82f4..23c97661a1 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -1402,6 +1402,7 @@ Changes your avatar in this current room only On/Off markdown To fix Matrix Apps management + Open the developer tools screen Displays information about a user Markdown has been enabled. diff --git a/vector/src/main/java/im/vector/app/features/command/Command.kt b/vector/src/main/java/im/vector/app/features/command/Command.kt index 20c8f9d8fe..433ee32eeb 100644 --- a/vector/src/main/java/im/vector/app/features/command/Command.kt +++ b/vector/src/main/java/im/vector/app/features/command/Command.kt @@ -52,6 +52,7 @@ enum class Command( MARKDOWN("/markdown", null, "", R.string.command_description_markdown, false, false), RAINBOW("/rainbow", null, "", R.string.command_description_rainbow, false, true), RAINBOW_EMOTE("/rainbowme", null, "", R.string.command_description_rainbow_emote, false, true), + DEVTOOLS("/devtools", null, "", R.string.command_description_devtools, true, false), CLEAR_SCALAR_TOKEN("/clear_scalar_token", null, "", R.string.command_description_clear_scalar_token, false, false), SPOILER("/spoiler", null, "", R.string.command_description_spoiler, false, true), SHRUG("/shrug", null, "", R.string.command_description_shrug, false, true), diff --git a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt index be3cabfc18..9cbb6c7978 100644 --- a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt +++ b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt @@ -317,6 +317,13 @@ class CommandParser @Inject constructor() { ParsedCommand.ErrorSyntax(Command.MARKDOWN) } } + Command.DEVTOOLS.matches(slashCommand) -> { + if (messageParts.size == 1) { + ParsedCommand.DevTools + } else { + ParsedCommand.ErrorSyntax(Command.DEVTOOLS) + } + } Command.CLEAR_SCALAR_TOKEN.matches(slashCommand) -> { if (messageParts.size == 1) { ParsedCommand.ClearScalarToken diff --git a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt index 4571deb54f..eba9994218 100644 --- a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt +++ b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt @@ -60,6 +60,7 @@ sealed interface ParsedCommand { data class ChangeAvatarForRoom(val url: String) : ParsedCommand data class SetMarkdown(val enable: Boolean) : ParsedCommand object ClearScalarToken : ParsedCommand + object DevTools : ParsedCommand data class SendSpoiler(val message: String) : ParsedCommand data class SendShrug(val message: CharSequence) : ParsedCommand data class SendLenny(val message: CharSequence) : ParsedCommand 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 8b6429abb1..3213bf81fe 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 @@ -1810,6 +1810,9 @@ class TimelineFragment : dismissLoadingDialog() views.composerLayout.setTextIfDifferent("") when (parsedCommand) { + is ParsedCommand.DevTools -> { + navigator.openDevTools(requireContext(), timelineArgs.roomId) + } is ParsedCommand.SetMarkdown -> { showSnackWithMessage(getString(if (parsedCommand.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled)) } 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 7d67ec8c60..30e45bd40b 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 @@ -255,6 +255,10 @@ class MessageComposerViewModel @AssistedInject constructor( is ParsedCommand.SetUserPowerLevel -> { handleSetUserPowerLevel(parsedCommand) } + is ParsedCommand.DevTools -> { + _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand)) + popDraft() + } is ParsedCommand.ClearScalarToken -> { // TODO _viewEvents.post(MessageComposerViewEvents.SlashCommandNotImplemented) From b9294381b8884d2065382439d41a6e6fc6aac92d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 14 Sep 2022 17:52:11 +0200 Subject: [PATCH 021/131] Add a paragraph about test. --- docs/_developer_onboarding.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/_developer_onboarding.md b/docs/_developer_onboarding.md index 640a2d7665..bb840826a5 100644 --- a/docs/_developer_onboarding.md +++ b/docs/_developer_onboarding.md @@ -160,7 +160,7 @@ Warning: do not use twice the same item `id` or it will crash. - [Retrofit](https://square.github.io/retrofit/) and [OkHttp3](https://square.github.io/okhttp/): network requests; - [Moshi](https://github.com/square/moshi) is used to parse and serialize Json object; -#### Push +### Push Please see the dedicated documentation for more details. @@ -170,7 +170,7 @@ This is the classical scenario: - App asks the SDK to load Event data (fastlane mode). We have a change to get the data faster and display the notification faster; - App asks the SDK to perform a sync request. -#### Dependencies management +### Dependencies management All the dependencies are declared in `build.gradle` files. But some versions are declared in [this dedicated file](../dependencies.gradle). @@ -179,6 +179,12 @@ When adding a new dependency, you will have to update the file [dependencies_gro [Dependabot](https://github.com/dependabot) is set up on the project. This tool will automatically create Pull Request to upgrade our dependencies one by one. dependencies_group, gradle files, Dependabot, etc. +### Test + +Please refer to [this dedicated document](./ui-tests.md). + +TODO add link to the dedicated screenshot test documentation + ### Other points #### Logging From 7341a65410cba63b593607a79f9fc2be5b951870 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 14 Sep 2022 18:17:15 +0200 Subject: [PATCH 022/131] Run knit. --- docs/_developer_onboarding.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/_developer_onboarding.md b/docs/_developer_onboarding.md index bb840826a5..543cbeba71 100644 --- a/docs/_developer_onboarding.md +++ b/docs/_developer_onboarding.md @@ -2,6 +2,29 @@ +* [Introduction](#introduction) + * [Quick introduction to Matrix](#quick-introduction-to-matrix) + * [Matrix data](#matrix-data) + * [Room](#room) + * [Event](#event) + * [Sync](#sync) + * [Glossary about syncs](#glossary-about-syncs) + * [The Android project](#the-android-project) + * [Matrix SDK](#matrix-sdk) + * [Application](#application) + * [MvRx](#mvrx) + * [Behavior](#behavior) + * [Epoxy](#epoxy) + * [Other frameworks](#other-frameworks) + * [Push](#push) + * [Dependencies management](#dependencies-management) + * [Test](#test) + * [Other points](#other-points) + * [Logging](#logging) + * [Rageshake](#rageshake) + * [Tips](#tips) +* [Happy coding!](#happy-coding) + ## Introduction From bdda8dbc48119ebeb95afe5819b2ffba599f66e9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 14 Sep 2022 18:19:57 +0200 Subject: [PATCH 023/131] Changelogs --- changelog.d/7126.doc | 1 + changelog.d/7126.misc | 1 + 2 files changed, 2 insertions(+) create mode 100644 changelog.d/7126.doc create mode 100644 changelog.d/7126.misc diff --git a/changelog.d/7126.doc b/changelog.d/7126.doc new file mode 100644 index 0000000000..9c69350a11 --- /dev/null +++ b/changelog.d/7126.doc @@ -0,0 +1 @@ +Draft onboarding documentation of the project at `./docs/_developer_onboarding.md` diff --git a/changelog.d/7126.misc b/changelog.d/7126.misc new file mode 100644 index 0000000000..a79d61f819 --- /dev/null +++ b/changelog.d/7126.misc @@ -0,0 +1 @@ +Add support to `/devtools` command. From ea274c4df60dadf4dadb7f4e748e1df59f01806c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Aug 2022 23:11:34 +0000 Subject: [PATCH 024/131] Bump appcompat from 1.4.2 to 1.5.0 Bumps appcompat from 1.4.2 to 1.5.0. --- updated-dependencies: - dependency-name: androidx.appcompat:appcompat 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 9641a63f26..6b827e834e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -51,7 +51,7 @@ ext.libs = [ ], androidx : [ 'activity' : "androidx.activity:activity:1.5.1", - 'appCompat' : "androidx.appcompat:appcompat:1.4.2", + 'appCompat' : "androidx.appcompat:appcompat:1.5.0", 'biometric' : "androidx.biometric:biometric:1.1.0", 'core' : "androidx.core:core-ktx:1.8.0", 'recyclerview' : "androidx.recyclerview:recyclerview:1.2.1", From d9ee51a2122aaed30b1a2b85fc7befdd495909ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Aug 2022 13:16:52 +0000 Subject: [PATCH 025/131] Bump emoji2 from 1.1.0 to 1.2.0 Bumps emoji2 from 1.1.0 to 1.2.0. --- updated-dependencies: - dependency-name: androidx.emoji2:emoji2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- vector/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/build.gradle b/vector/build.gradle index ac3699454c..740f2710c0 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -232,7 +232,7 @@ dependencies { // UnifiedPush implementation 'com.github.UnifiedPush:android-connector:2.0.1' - implementation "androidx.emoji2:emoji2:1.1.0" + implementation "androidx.emoji2:emoji2:1.2.0" // WebRTC // org.webrtc:google-webrtc is for development purposes only From 8b64bd38b72b72beb49b7849058fde796e1f9a0c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 16:32:05 +0200 Subject: [PATCH 026/131] 'compileSdk': 32, 'targetSdk': 32 --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 6b827e834e..8a93950c15 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,8 +1,8 @@ ext.versions = [ 'minSdk' : 21, - 'compileSdk' : 31, - 'targetSdk' : 31, + 'compileSdk' : 32, + 'targetSdk' : 32, 'sourceCompat' : JavaVersion.VERSION_11, 'targetCompat' : JavaVersion.VERSION_11, ] From 3f3c83a43d8f380f93c3f315e9381633414b1a20 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 17:03:38 +0200 Subject: [PATCH 027/131] Remove deprecated internal class. --- .../send/queue/EventSenderProcessorThread.kt | 235 ------------------ 1 file changed, 235 deletions(-) delete mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt deleted file mode 100644 index 55363a7251..0000000000 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt +++ /dev/null @@ -1,235 +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.session.room.send.queue - -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import org.matrix.android.sdk.api.auth.data.SessionParams -import org.matrix.android.sdk.api.auth.data.sessionId -import org.matrix.android.sdk.api.extensions.tryOrNull -import org.matrix.android.sdk.api.failure.Failure -import org.matrix.android.sdk.api.failure.isLimitExceededError -import org.matrix.android.sdk.api.failure.isTokenError -import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.crypto.CryptoService -import org.matrix.android.sdk.api.session.events.model.Event -import org.matrix.android.sdk.api.session.sync.SyncState -import org.matrix.android.sdk.api.util.Cancelable -import org.matrix.android.sdk.internal.session.SessionScope -import org.matrix.android.sdk.internal.task.TaskExecutor -import timber.log.Timber -import java.io.IOException -import java.util.Timer -import java.util.TimerTask -import java.util.concurrent.LinkedBlockingQueue -import javax.inject.Inject -import kotlin.concurrent.schedule - -/** - * A simple ever running thread unique for that session responsible of sending events in order. - * Each send is retried 3 times, if there is no network (e.g if cannot ping homeserver) it will wait and - * periodically test reachability before resume (does not count as a retry) - * - * If the app is killed before all event were sent, on next wakeup the scheduled events will be re posted - */ -@Deprecated("You should know use EventSenderProcessorCoroutine instead") -@SessionScope -internal class EventSenderProcessorThread @Inject constructor( - private val cryptoService: CryptoService, - private val sessionParams: SessionParams, - private val queuedTaskFactory: QueuedTaskFactory, - private val taskExecutor: TaskExecutor, - private val memento: QueueMemento -) : Thread("Matrix-SENDER_THREAD_SID_${sessionParams.credentials.sessionId()}"), EventSenderProcessor { - - private fun markAsManaged(task: QueuedTask) { - memento.track(task) - } - - private fun markAsFinished(task: QueuedTask) { - memento.unTrack(task) - } - - override fun onSessionStarted(session: Session) { - start() - } - - override fun onSessionStopped(session: Session) { - interrupt() - } - - override fun start() { - super.start() - // We should check for sending events not handled because app was killed - // But we should be careful of only took those that was submitted to us, because if it's - // for example it's a media event it is handled by some worker and he will handle it - // This is a bit fragile :/ - // also some events cannot be retried manually by users, e.g reactions - // they were previously relying on workers to do the work :/ and was expected to always finally succeed - // Also some echos are not to be resent like redaction echos (fake event created for aggregation) - - tryOrNull { - taskExecutor.executorScope.launch { - Timber.d("## Send relaunched pending events on restart") - memento.restoreTasks(this@EventSenderProcessorThread) - } - } - } - - // API - override fun postEvent(event: Event): Cancelable { - return postEvent(event, event.roomId?.let { cryptoService.isRoomEncrypted(it) } ?: false) - } - - override fun postEvent(event: Event, encrypt: Boolean): Cancelable { - val task = queuedTaskFactory.createSendTask(event, encrypt) - return postTask(task) - } - - override fun postRedaction(redactionLocalEcho: Event, reason: String?): Cancelable { - return postRedaction(redactionLocalEcho.eventId!!, redactionLocalEcho.redacts!!, redactionLocalEcho.roomId!!, reason) - } - - override fun postRedaction(redactionLocalEchoId: String, eventToRedactId: String, roomId: String, reason: String?): Cancelable { - val task = queuedTaskFactory.createRedactTask(redactionLocalEchoId, eventToRedactId, roomId, reason) - return postTask(task) - } - - override fun postTask(task: QueuedTask): Cancelable { - // non blocking add to queue - sendingQueue.add(task) - markAsManaged(task) - return task - } - - override fun cancel(eventId: String, roomId: String) { - (currentTask as? SendEventQueuedTask) - ?.takeIf { it.event.eventId == eventId && it.event.roomId == roomId } - ?.cancel() - } - - companion object { - private const val RETRY_WAIT_TIME_MS = 10_000L - } - - private var currentTask: QueuedTask? = null - - private var sendingQueue = LinkedBlockingQueue() - - private var networkAvailableLock = Object() - private var canReachServer = true - private var retryNoNetworkTask: TimerTask? = null - - override fun run() { - Timber.v("## SendThread started") - try { - while (!isInterrupted) { - Timber.v("## SendThread wait for task to process") - val task = sendingQueue.take() - .also { currentTask = it } - Timber.v("## SendThread Found task to process $task") - - if (task.isCancelled()) { - Timber.v("## SendThread send cancelled for $task") - // we do not execute this one - continue - } - // we check for network connectivity - while (!canReachServer) { - Timber.v("## SendThread cannot reach server") - // schedule to retry - waitForNetwork() - // if thread as been killed meanwhile -// if (state == State.KILLING) break - } - Timber.v("## Server is Reachable") - // so network is available - - runBlocking { - retryLoop@ while (task.retryCount.get() < 3) { - try { - // SendPerformanceProfiler.startStage(task.event.eventId!!, SendPerformanceProfiler.Stages.SEND_WORKER) - Timber.v("## SendThread retryLoop for $task retryCount ${task.retryCount}") - task.execute() - // sendEventTask.execute(SendEventTask.Params(task.event, task.encrypt, cryptoService)) - // SendPerformanceProfiler.stopStage(task.event.eventId, SendPerformanceProfiler.Stages.SEND_WORKER) - break@retryLoop - } catch (exception: Throwable) { - when { - exception is IOException || exception is Failure.NetworkConnection -> { - canReachServer = false - if (task.retryCount.getAndIncrement() >= 3) task.onTaskFailed() - while (!canReachServer) { - Timber.v("## SendThread retryLoop cannot reach server") - // schedule to retry - waitForNetwork() - } - } - (exception.isLimitExceededError()) -> { - if (task.retryCount.getAndIncrement() >= 3) task.onTaskFailed() - Timber.v("## SendThread retryLoop retryable error for $task reason: ${exception.localizedMessage}") - // wait a bit - // Todo if its a quota exception can we get timout? - sleep(3_000) - continue@retryLoop - } - exception.isTokenError() -> { - Timber.v("## SendThread retryLoop retryable TOKEN error, interrupt") - // we can exit the loop - task.onTaskFailed() - throw InterruptedException() - } - exception is CancellationException -> { - Timber.v("## SendThread task has been cancelled") - break@retryLoop - } - else -> { - Timber.v("## SendThread retryLoop Un-Retryable error, try next task") - // this task is in error, check next one? - task.onTaskFailed() - break@retryLoop - } - } - } - } - } - markAsFinished(task) - } - } catch (interruptionException: InterruptedException) { - // will be thrown is thread is interrupted while seeping - interrupt() - Timber.v("## InterruptedException!! ${interruptionException.localizedMessage}") - } -// state = State.KILLED - // is this needed? - retryNoNetworkTask?.cancel() - Timber.w("## SendThread finished") - } - - private fun waitForNetwork() { - retryNoNetworkTask = Timer(SyncState.NoNetwork.toString(), false).schedule(RETRY_WAIT_TIME_MS) { - synchronized(networkAvailableLock) { - canReachServer = HomeServerAvailabilityChecker(sessionParams).check().also { - Timber.v("## SendThread checkHostAvailable $it") - } - networkAvailableLock.notify() - } - } - synchronized(networkAvailableLock) { networkAvailableLock.wait() } - } -} From 24e4f94e61a3da054f842450f32f57a17aea0359 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 17:30:36 +0200 Subject: [PATCH 028/131] Stop using deprecated method. --- .../uploads/media/RoomUploadsMediaFragment.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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 f53f572e38..98a28557ae 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 @@ -82,15 +82,18 @@ class RoomUploadsMediaFragment : controller.listener = this } - @Suppress("DEPRECATION") private fun getNumberOfColumns(): Int { - val displayMetrics = DisplayMetrics() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - requireContext().display?.getMetrics(displayMetrics) + val screenWidthInPx = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val a = requireActivity().windowManager.currentWindowMetrics + a.bounds.width() } else { + val displayMetrics = DisplayMetrics() + @Suppress("DEPRECATION") requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics) + displayMetrics.widthPixels } - return dimensionConverter.pxToDp(displayMetrics.widthPixels) / IMAGE_SIZE_DP + val screenWidthInDp = dimensionConverter.pxToDp(screenWidthInPx) + return screenWidthInDp / IMAGE_SIZE_DP } override fun onDestroyView() { From 536b9cf926bb9ca285a49a81a93fb91b1c78e322 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 17:38:00 +0200 Subject: [PATCH 029/131] Move `@Suppress("DEPRECATION")` closer to the deprecated usage. Will help to detect other deprecated API usage. --- .../lib/attachmentviewer/AttachmentViewerActivity.kt | 8 +++++--- .../sdk/internal/legacy/DefaultLegacySessionImporter.kt | 1 - .../im/vector/app/espresso/tools/ScreenshotFailureRule.kt | 1 - .../main/java/im/vector/app/core/extensions/Context.kt | 2 +- .../im/vector/app/core/platform/VectorBaseActivity.kt | 2 +- .../im/vector/app/core/utils/ExternalApplicationsUtil.kt | 3 +-- .../attachments/preview/AttachmentsPreviewFragment.kt | 2 +- .../lifecycle/VectorActivityLifecycleCallbacks.kt | 2 +- .../ui/fallbackprompt/FallbackBiometricDialogFragment.kt | 2 +- 9 files changed, 11 insertions(+), 12 deletions(-) diff --git a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt index 764cf8419a..0e8590f386 100644 --- a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt +++ b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt @@ -136,7 +136,6 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi } } - @Suppress("DEPRECATION") private fun setDecorViewFullScreen() { // This is important for the dispatchTouchEvent, if not we must correct // the touch coordinates @@ -155,11 +154,14 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi // new API instead of FLAG_TRANSLUCENT_NAVIGATION window.navigationBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar) } else { + @Suppress("DEPRECATION") window.decorView.systemUiVisibility = ( View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE) + @Suppress("DEPRECATION") window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) + @Suppress("DEPRECATION") window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) } } @@ -344,7 +346,6 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi ?.handleCommand(commands) } - @Suppress("DEPRECATION") private fun hideSystemUI() { systemUiVisibility = false // Enables regular immersive mode. @@ -367,6 +368,7 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi // New API instead of FLAG_TRANSLUCENT_NAVIGATION window.navigationBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar) } else { + @Suppress("DEPRECATION") window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE // Set the content to appear under the system bars so that the // content doesn't resize when the system bars hide and show. @@ -381,13 +383,13 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi // Shows the system bars by removing all the flags // except for the ones that make the content appear under the system bars. - @Suppress("DEPRECATION") private fun showSystemUI() { systemUiVisibility = true if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION window.setDecorFitsSystemWindows(false) } else { + @Suppress("DEPRECATION") window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt index 7d52d9b2bf..567f605643 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt @@ -104,7 +104,6 @@ internal class DefaultLegacySessionImporter @Inject constructor( } private suspend fun importCredentials(legacyConfig: LegacyHomeServerConnectionConfig) { - @Suppress("DEPRECATION") val sessionParams = SessionParams( credentials = Credentials( userId = legacyConfig.credentials.userId, diff --git a/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt b/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt index 068c9fb646..5e131479bf 100644 --- a/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt +++ b/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt @@ -92,7 +92,6 @@ private fun useMediaStoreScreenshotStorage( } } -@Suppress("DEPRECATION") private fun usePublicExternalScreenshotStorage( contentValues: ContentValues, contentResolver: ContentResolver, diff --git a/vector/src/main/java/im/vector/app/core/extensions/Context.kt b/vector/src/main/java/im/vector/app/core/extensions/Context.kt index 14e639bf32..1ed5aa8ba1 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/Context.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/Context.kt @@ -91,7 +91,6 @@ fun Context.safeOpenOutputStream(uri: Uri): OutputStream? { * * @return true if no active connection is found */ -@Suppress("deprecation") @SuppressLint("NewApi") // false positive fun Context.inferNoConnectivity(sdkIntProvider: BuildVersionSdkIntProvider): Boolean { val connectivityManager = getSystemService()!! @@ -104,6 +103,7 @@ fun Context.inferNoConnectivity(sdkIntProvider: BuildVersionSdkIntProvider): Boo else -> true } } else { + @Suppress("DEPRECATION") when (connectivityManager.activeNetworkInfo?.type) { ConnectivityManager.TYPE_WIFI -> false ConnectivityManager.TYPE_MOBILE -> false 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 c2c66ae69e..cb8c0ec8d1 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 @@ -464,7 +464,6 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver /** * Force to render the activity in fullscreen. */ - @Suppress("DEPRECATION") private fun setFullScreen() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION @@ -481,6 +480,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver // New API instead of FLAG_TRANSLUCENT_NAVIGATION window.navigationBarColor = ContextCompat.getColor(this, im.vector.lib.attachmentviewer.R.color.half_transparent_status_bar) } else { + @Suppress("DEPRECATION") window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN diff --git a/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt b/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt index d52b7088ff..915a8d4d0d 100644 --- a/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt +++ b/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt @@ -309,7 +309,6 @@ suspend fun saveMedia( } } -@Suppress("DEPRECATION") private fun saveMediaLegacy( context: Context, mediaMimeType: String?, @@ -340,6 +339,7 @@ private fun saveMediaLegacy( val savedFile = saveFileIntoLegacy(file, downloadDir, outputFilename, currentTimeMillis) if (savedFile != null) { val downloadManager = context.getSystemService() + @Suppress("DEPRECATION") downloadManager?.addCompletedDownload( savedFile.name, title, @@ -430,7 +430,6 @@ fun selectTxtFileToWrite( * @param currentTimeMillis the current time in milliseconds * @return the created file */ -@Suppress("DEPRECATION") fun saveFileIntoLegacy(sourceFile: File, dstDirPath: File, outputFilename: String?, currentTimeMillis: Long): File? { // defines another name for the external media var dstFileName: String diff --git a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt index 47b19a435e..20b155d11e 100644 --- a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt @@ -169,11 +169,11 @@ class AttachmentsPreviewFragment : ) } - @Suppress("DEPRECATION") private fun applyInsets() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { activity?.window?.setDecorFitsSystemWindows(false) } else { + @Suppress("DEPRECATION") view?.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION } ViewCompat.setOnApplyWindowInsetsListener(views.attachmentPreviewerBottomContainer) { v, insets -> diff --git a/vector/src/main/java/im/vector/app/features/lifecycle/VectorActivityLifecycleCallbacks.kt b/vector/src/main/java/im/vector/app/features/lifecycle/VectorActivityLifecycleCallbacks.kt index 32b4bf3f12..75f02c36d7 100644 --- a/vector/src/main/java/im/vector/app/features/lifecycle/VectorActivityLifecycleCallbacks.kt +++ b/vector/src/main/java/im/vector/app/features/lifecycle/VectorActivityLifecycleCallbacks.kt @@ -92,7 +92,6 @@ class VectorActivityLifecycleCallbacks constructor(private val popupAlertManager * @return true if an app task is corrupted by a potentially malicious activity */ @SuppressLint("NewApi") - @Suppress("DEPRECATION") private suspend fun isTaskCorrupted(activity: Activity): Boolean = withContext(Dispatchers.Default) { val context = activity.applicationContext val packageManager: PackageManager = context.packageManager @@ -120,6 +119,7 @@ class VectorActivityLifecycleCallbacks constructor(private val popupAlertManager // This was present in ActivityManager.RunningTaskInfo class since API level 1! // and it is inherited from TaskInfo since Android Q (API level 29). // API 29 changes : https://developer.android.com/sdk/api_diff/29/changes/android.app.ActivityManager.RunningTaskInfo + @Suppress("DEPRECATION") manager.getRunningTasks(10).any { runningTaskInfo -> runningTaskInfo.topActivity?.let { // Check whether the activity task affinity matches with app task affinity. diff --git a/vector/src/main/java/im/vector/app/features/pin/lockscreen/ui/fallbackprompt/FallbackBiometricDialogFragment.kt b/vector/src/main/java/im/vector/app/features/pin/lockscreen/ui/fallbackprompt/FallbackBiometricDialogFragment.kt index d50ff791ed..c778e880b2 100644 --- a/vector/src/main/java/im/vector/app/features/pin/lockscreen/ui/fallbackprompt/FallbackBiometricDialogFragment.kt +++ b/vector/src/main/java/im/vector/app/features/pin/lockscreen/ui/fallbackprompt/FallbackBiometricDialogFragment.kt @@ -50,10 +50,10 @@ class FallbackBiometricDialogFragment : DialogFragment(R.layout.fragment_biometr private val parsedArgs by args() - @Suppress("DEPRECATION") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + @Suppress("DEPRECATION") retainInstance = true setStyle(STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog) From e17f009566efde75dc02c12355a987400d763598 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 17:54:28 +0200 Subject: [PATCH 030/131] Reduce level API check, this seems not necessary. --- .../lib/attachmentviewer/AttachmentViewerActivity.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt index 0e8590f386..ca91ddb621 100644 --- a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt +++ b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt @@ -143,12 +143,7 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi // New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION window.setDecorFitsSystemWindows(false) // New API instead of SYSTEM_UI_FLAG_IMMERSIVE - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - } else { - @SuppressLint("WrongConstant") - window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE - } + window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE // New API instead of FLAG_TRANSLUCENT_STATUS window.statusBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar) // new API instead of FLAG_TRANSLUCENT_NAVIGATION From 518ec738f30e515777a231e39b51bd56060ad299 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 17:59:46 +0200 Subject: [PATCH 031/131] Reduce level API check, this seems not necessary. --- .../lib/attachmentviewer/AttachmentViewerActivity.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt index ca91ddb621..98398760d1 100644 --- a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt +++ b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt @@ -17,7 +17,6 @@ package im.vector.lib.attachmentviewer -import android.annotation.SuppressLint import android.graphics.Color import android.os.Build import android.os.Bundle @@ -352,12 +351,7 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi // new API instead of SYSTEM_UI_FLAG_HIDE_NAVIGATION window.decorView.windowInsetsController?.hide(WindowInsets.Type.navigationBars()) // New API instead of SYSTEM_UI_FLAG_IMMERSIVE - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - } else { - @SuppressLint("WrongConstant") - window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE - } + window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE // New API instead of FLAG_TRANSLUCENT_STATUS window.statusBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar) // New API instead of FLAG_TRANSLUCENT_NAVIGATION From cde709692899df5e9c9050869bee9d6ab26a9d56 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 18:02:42 +0200 Subject: [PATCH 032/131] Restore this annotation --- .../android/sdk/internal/legacy/DefaultLegacySessionImporter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt index 567f605643..7d52d9b2bf 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/legacy/DefaultLegacySessionImporter.kt @@ -104,6 +104,7 @@ internal class DefaultLegacySessionImporter @Inject constructor( } private suspend fun importCredentials(legacyConfig: LegacyHomeServerConnectionConfig) { + @Suppress("DEPRECATION") val sessionParams = SessionParams( credentials = Credentials( userId = legacyConfig.credentials.userId, From 88482c9b2edc7ea50950b24cb697d75babb836ae Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 18:06:38 +0200 Subject: [PATCH 033/131] Reduce level API check, this seems not necessary. --- .../im/vector/app/core/platform/VectorBaseActivity.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) 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 cb8c0ec8d1..b4ba384f8f 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 @@ -16,7 +16,6 @@ package im.vector.app.core.platform -import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.os.Build @@ -469,12 +468,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver // New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION window.setDecorFitsSystemWindows(false) // New API instead of SYSTEM_UI_FLAG_IMMERSIVE - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - } else { - @SuppressLint("WrongConstant") - window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE - } + window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE // New API instead of FLAG_TRANSLUCENT_STATUS window.statusBarColor = ContextCompat.getColor(this, im.vector.lib.attachmentviewer.R.color.half_transparent_status_bar) // New API instead of FLAG_TRANSLUCENT_NAVIGATION From 842a9bbd5595fc4901836f396f4b68047d6d99f4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 24 Aug 2022 19:03:29 +0200 Subject: [PATCH 034/131] Add dataExtractionRules, applicable to Android 12. Exclude everything from being backed up. Also properly support Android 11. --- tools/lint/lint.xml | 1 + vector/src/main/AndroidManifest.xml | 10 +++++----- vector/src/main/res/xml/backup_rules.xml | 18 ++++++++++++++++++ .../src/main/res/xml/data_extraction_rules.xml | 17 +++++++++++++++++ 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 vector/src/main/res/xml/backup_rules.xml create mode 100644 vector/src/main/res/xml/data_extraction_rules.xml diff --git a/tools/lint/lint.xml b/tools/lint/lint.xml index b4b6ebc12f..1776bd341f 100644 --- a/tools/lint/lint.xml +++ b/tools/lint/lint.xml @@ -87,6 +87,7 @@ + diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml index d60620dddf..c7c0d40dd7 100644 --- a/vector/src/main/AndroidManifest.xml +++ b/vector/src/main/AndroidManifest.xml @@ -318,12 +318,12 @@ - + - - - - + + + + diff --git a/vector/src/main/res/xml/backup_rules.xml b/vector/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000000..fe10b316ed --- /dev/null +++ b/vector/src/main/res/xml/backup_rules.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/vector/src/main/res/xml/data_extraction_rules.xml b/vector/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000000..fe61eb717c --- /dev/null +++ b/vector/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + From c5571c06edf2145ecc13044efa248694ea77e990 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 25 Aug 2022 09:51:32 +0200 Subject: [PATCH 035/131] Upgrade gradle plugin from 7.1.3 to 7.2.2 --- dependencies.gradle | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 8a93950c15..a402ec3135 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,10 +7,7 @@ ext.versions = [ 'targetCompat' : JavaVersion.VERSION_11, ] - -// Pinned to 7.1.3 because of https://github.com/vector-im/element-android/issues/6142 -// Please test carefully before upgrading again. -def gradle = "7.1.3" +def gradle = "7.2.2" // Ref: https://kotlinlang.org/releases.html def kotlin = "1.6.21" def kotlinCoroutines = "1.6.4" From 57db43c80a78bf9474abcab8ca6dc58fefc0b22a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 25 Aug 2022 11:30:06 +0200 Subject: [PATCH 036/131] Fix gradle warning: WARNING:API 'ApkVariantOutput.getVersionCodeOverride()' is obsolete and has been replaced with 'VariantOutput.versionCode()'. --- vector-app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector-app/build.gradle b/vector-app/build.gradle index 82c433d2df..f0f1bb81b8 100644 --- a/vector-app/build.gradle +++ b/vector-app/build.gradle @@ -191,7 +191,7 @@ android { // Known limitation: it does not modify the value in the BuildConfig.java generated file // See https://issuetracker.google.com/issues/171133218 output.versionCodeOverride = baseVariantVersion + baseAbiVersionCode - print "ABI " + output.getFilter(OutputFile.ABI) + " \t-> VersionCode = " + output.versionCodeOverride + "\n" + print "ABI " + output.getFilter(OutputFile.ABI) + " \t-> VersionCode = " + output.versionCode + "\n" output.outputFileName = output.outputFileName.replace("vector-app", "vector") } } From 892484a1b306c5ff66b442ce85bf142849b37761 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 25 Aug 2022 11:54:29 +0200 Subject: [PATCH 037/131] Upgrade kotlin from 1.6.21 to 1.7.10 and dagger (+hilt) from 2.42 to 2.43.2 --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index a402ec3135..a9fe9b4eb2 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -9,9 +9,9 @@ ext.versions = [ def gradle = "7.2.2" // Ref: https://kotlinlang.org/releases.html -def kotlin = "1.6.21" +def kotlin = "1.7.10" def kotlinCoroutines = "1.6.4" -def dagger = "2.42" +def dagger = "2.43.2" def appDistribution = "16.0.0-beta04" def retrofit = "2.9.0" def arrow = "0.8.2" From 84afa4714a792d62e4506c6b4ad37b4df5b04b21 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 12 Sep 2022 17:32:42 +0200 Subject: [PATCH 038/131] App compat 1.5.1 --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index a9fe9b4eb2..b026e79768 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -48,7 +48,7 @@ ext.libs = [ ], androidx : [ 'activity' : "androidx.activity:activity:1.5.1", - 'appCompat' : "androidx.appcompat:appcompat:1.5.0", + 'appCompat' : "androidx.appcompat:appcompat:1.5.1", 'biometric' : "androidx.biometric:biometric:1.1.0", 'core' : "androidx.core:core-ktx:1.8.0", 'recyclerview' : "androidx.recyclerview:recyclerview:1.2.1", From a1f4ffbf172315a5906c59ab821ab907d5cc2135 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 23:12:48 +0200 Subject: [PATCH 039/131] Use vanniktechEmoji "0.16.0-SNAPSHOT" --- build.gradle | 8 ++++++++ dependencies.gradle | 4 +++- dependencies_groups.gradle | 9 ++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 49dc1e7fb4..d8de6dd55f 100644 --- a/build.gradle +++ b/build.gradle @@ -71,6 +71,14 @@ allprojects { groups.mavenCentral.group.each { includeGroup it } } } + // snapshots repository + maven { + url "https://oss.sonatype.org/content/repositories/snapshots" + content { + groups.snapshot.regex.each { includeGroupByRegex it } + groups.snapshot.group.each { includeGroup it } + } + } maven { url 'https://jitpack.io' content { diff --git a/dependencies.gradle b/dependencies.gradle index b026e79768..fd758dd859 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -25,7 +25,9 @@ def mavericks = "2.7.0" def glide = "4.13.2" def bigImageViewer = "1.8.1" def jjwt = "0.11.5" -def vanniktechEmoji = "0.15.0" +// Temporary version to unblock #6929. Once 0.16.0 is released we should use it, and revert +// the whole commit which set version 0.16.0-SNAPSHOT +def vanniktechEmoji = "0.16.0-SNAPSHOT" def fragment = "1.5.2" diff --git a/dependencies_groups.gradle b/dependencies_groups.gradle index 433bc53568..e44e0bc5c2 100644 --- a/dependencies_groups.gradle +++ b/dependencies_groups.gradle @@ -38,6 +38,13 @@ ext.groups = [ 'com.google.testing.platform', ] ], + snapshot: [ + regex: [ + ], + group: [ + 'com.vanniktech', + ] + ], mavenCentral: [ regex: [ ], @@ -118,7 +125,7 @@ ext.groups = [ 'com.sun.xml.bind.mvn', 'com.sun.xml.fastinfoset', 'com.thoughtworks.qdox', - 'com.vanniktech', + // 'com.vanniktech', 'commons-cli', 'commons-codec', 'commons-io', From d4eb619d4022f7e4be139e164df746693d2de812 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 23:30:20 +0200 Subject: [PATCH 040/131] Changelog --- changelog.d/6929.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6929.misc diff --git a/changelog.d/6929.misc b/changelog.d/6929.misc new file mode 100644 index 0000000000..d12167cfea --- /dev/null +++ b/changelog.d/6929.misc @@ -0,0 +1 @@ +Target API 12 and compile with Android SDK 32. From 6bb0e68e787bde55d8ede94de471ed6b597eb804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 15 Sep 2022 19:47:07 +0000 Subject: [PATCH 041/131] Translated using Weblate (Estonian) Currently translated at 99.6% (2378 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/et/ --- .../src/main/res/values-et/strings.xml | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index 18e609ff95..5dd355758c 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -2631,4 +2631,35 @@ Kogukonnad on viis jututubade ja inimeste ühendamiseks. Alustamiseks võid luua uue kogukonna. Siin veel pole kogukondi. Vaheta kogukonda + Proovi nüüd + Tagasiside valikute nägemiseks klõpsi ülal paremal. + Jaga tagasisidet + Kogukonnad leiad alt paremalt kiiremini ja lihtsamini, kui varem. + Ligipääs kogukondadele + Et ${app_name}\'i kasutamine oleks lihtsam, siis kaardid on nüüd valikulised. Neid saad hallata ülal paremal avanevast menüüst. + Meie liidesel on nüüd uus vaade! + Kui sul on lugemata sõnumeid, siis nad on siit leitavad. + Hetkel siin polegi midagi põnevat. + Paljude võimalustega turvaline suhtlusrakendus sõprade, kogukondade ja tiimide jaoks. Alustamiseks loo mõni uus vestlus või liitu olemasoleva jututoaga. + %s, +\ntere tulemast ${app_name} kasutajaks. + Kogukonnad on võimalus jututubade ja inimeste ühendamiseks. Kasutades all paremal olevat nuppu lisa mõni olemasolev jututuba või loo uus. + %s +\ntundub olema tühjavõitu. + + Logi välja sellisest vanast sessioonist (vanem kui %1$d päev), mida sa enam ei kasuta. + Logi välja sellistest vanadest sessioonidest (vanemad kui %1$d päeva), mida sa enam ei kasuta. + + Mitteaktiivsed sessioonid + Logi verifitseerimata sessioonidest välja või verifitseeri nad. + Verifitseerimata sessioonid + Kui järgid neid soovitusi, siis sa parandad oma kasutajakonto turvalisust. + Turvalisusega seotud soovitused + + Pole olnud kasutusel %1$d+ päeva (%2$s) + Pole olnud kasutusel %1$d+ päeva (%2$s) + + Siin saavad olema sinu tulevased päringud ja kutsed. + Ahenda %s alamkogukonnad + Näita %s alamkogukondi \ No newline at end of file From 61289666bdc0bf54b4e60ad38aa079a12afd2965 Mon Sep 17 00:00:00 2001 From: Glandos Date: Sun, 11 Sep 2022 10:06:07 +0000 Subject: [PATCH 042/131] Translated using Weblate (French) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/ --- .../src/main/res/values-fr/strings.xml | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml index 55b5f88134..01e97f3630 100644 --- a/library/ui-strings/src/main/res/values-fr/strings.xml +++ b/library/ui-strings/src/main/res/values-fr/strings.xml @@ -2636,4 +2636,39 @@ Désolé, impossible de trouver ce salon. \nVeuillez réessayer plus tard.%s Invitations - + Essayez + Appuyez en haut à droite pour les options des avis. + Donner mon avis + Accédez à vos espaces (en bas à droite) plus rapidement et facilement qu’avant. + Accéder aux espaces + Pour simplifier Element, les onglets sont désormais facultatifs. Gérez les depuis le menu en haut à droite. + Bienvenu dans une nouvelle vue ! + C\'est ici que vos messages non-lus s’afficheront lorsque vous en aurez. + Rien à signaler. + La messagerie sécurisée tout-en-un pour les équipes, les amis, et les organisations. Créez une discussion ou rejoignez un salon pour démarrer. + Bienvenue dans ${app_name}, +\n%s. + Les espaces sont un nouveau moyen de grouper les salons et les gens. Ajoutez un salon, ou créez en un nouveau à l’aide du bouton en bas à droite. + %s +\na l’air un peu vide. + + Pensez à vous déconnecter des anciennes sessions (%1$d jour ou plus) que vous n’utilisez plus. + Pensez à vous déconnecter des anciennes sessions (%1$d jours ou plus) que vous n’utilisez plus. + + Sessions inactives + Vérifier ou déconnecter les sessions non vérifiées. + Sessions non vérifiées + Améliorez la sécurité de votre compte à l’aide de ces recommandations. + Recommandations de sécurité + + Inactif depuis %1$d+ jour (%2$s) + Inactif depuis %1$d+ jours (%2$s) + + C’est l’endroit où se trouveront vos nouvelles requêtes et invitations. + Rien de neuf. + Les espaces sont un nouveau moyen de regrouper les salons et les gens. Créez un espace pour commencer. + Pas d’espace pour l’instant. + Réduire %s enfants + Développer %s enfants + Changer d’espace + \ No newline at end of file From 934a6026b201a7d5ca40ea57430779c6ea7e01a8 Mon Sep 17 00:00:00 2001 From: Linerly Date: Fri, 16 Sep 2022 12:46:00 +0000 Subject: [PATCH 043/131] Translated using Weblate (Indonesian) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/id/ --- library/ui-strings/src/main/res/values-in/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml index c1858c2805..f8cb456ea6 100644 --- a/library/ui-strings/src/main/res/values-in/strings.xml +++ b/library/ui-strings/src/main/res/values-in/strings.xml @@ -593,7 +593,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Abaikan pengguna Turunkan Anda tidak akan dapat membatalkan perubahan ini karena Anda menurunkan diri sendiri, jika Anda adalah pengguna istimewa terakhir di ruangan itu akan tidak mungkin untuk mendapatkan kembali hak istimewa. - Turunkan dirimu\? + Turunkan diri Anda\? Batalkan undangan Ruangan ini tidak umum. Anda tidak akan dapat bergabung kembali tanpa undangan. Izinkan untuk mengakses kontak. From b82b47b50b3923b0cbc7efed1d746784ff59843b Mon Sep 17 00:00:00 2001 From: Anonimas Date: Fri, 16 Sep 2022 19:03:37 +0000 Subject: [PATCH 044/131] Translated using Weblate (Lithuanian) Currently translated at 51.5% (1229 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/lt/ --- .../src/main/res/values-lt/strings.xml | 734 +++++++++++++++++- 1 file changed, 731 insertions(+), 3 deletions(-) diff --git a/library/ui-strings/src/main/res/values-lt/strings.xml b/library/ui-strings/src/main/res/values-lt/strings.xml index c33f8257c6..12e0c9d67d 100644 --- a/library/ui-strings/src/main/res/values-lt/strings.xml +++ b/library/ui-strings/src/main/res/values-lt/strings.xml @@ -1,5 +1,5 @@ - + Naudotojo %s pakvietimas Jūs prisijungėte prie kambario %1$s prisijungė prie kambario @@ -668,12 +668,12 @@ Pridėjote %1$s valdiklį %1$s pridėjo %2$s valdiklį %1$s išsiuntė kvietimą %2$s prisijungti prie kambario - %1$s atšaukė %2$s kvietimą prisijungti prie kambario + %1$s atšaukė %2$s pakvietimą prisijungti prie kambario Priėmėte kvietimą į %1$s %1$s priėmė kvietimą į %2$s Atšaukėte kvietimą %1$s %1$s atšaukė %2$s kvietimą - Atšaukėte %1$s kvietimą prisijungti prie kambario + Atšaukėte %1$s pakvietimą prisijungti prie kambario Pakeitimų nėra. • Serveriai atitinkantys %s buvo pašalinti iš leidžiamų sąrašo. • Serveriai atitinkantys %s dabar yra leidžiami. @@ -681,4 +681,732 @@ • Serveriai atitinkantys %s dabar yra uždrausti. • Serveriai atitinkantys %s yra leidžiami. • Serveriai atitinkantys %s yra uždrausti. + Siųsti m.room.server_acl įvykius + Užblokuoti naudotoją + Naudotojas bus pašalintas iš šio kambario. +\n +\nKad jis negalėtų prisijungti dar kartą, turėtumėte jį užblokuoti. + Pašalinimo priežastis + Pašalinti naudotoją + Ar tikrai norite atšaukti kvietimą šiam naudotojui\? + Atšaukti kvietimą + Nebeignoruoti + Nebeignoruojant šio naudotojo, vėl bus rodomos visos jo žinutės. + Nebeignoruoti naudotojo + Ignoruodami šį naudotoją nebematysite jo žinučių bendruose kambariuose. +\n +\nŠį veiksmą bet kada galite atšaukti bendruosiuose nustatymuose. + Ignoruoti naudotoją + Pažeminti + Negalėsite atšaukti šio pakeitimo, nes pažeminsite save, o jei esate paskutinis privilegijuotas naudotojas kambaryje, bus neįmanoma susigrąžinti privilegijų. + Nuleisti save į žemesnes pareigas\? + Šio pakeitimo atšaukti negalėsite, nes padidinsite naudotojo galią, kad jis turėtų tokį patį galios lygį, kaip ir jūs pats. +\nAr esate tikri\? + Paminėti + Pašalinti iš pokalbio + Atšaukti kvietimą + Tiesioginiai pokalbiai + Šis kambarys nėra viešas. Negalėsite vėl prisijungti be kvietimo. + Ar tikrai norite palikti kambarį\? + Palikti kambarį + + %d narys + %d nariai + %d narių + + Pereiti prie neskaitytų + Nariai + Suteikite leidimą prieiti prie savo kontaktų. + Jei norite nuskaityti QR kodą, turite leisti kameros prieigą. + ${app_name} reikia leidimo prieiti prie jūsų kameros ir mikrofono, kad galėtumėte atlikti vaizdo skambučius. +\n +\nKad galėtumėte skambinti, kituose iškylančiuose languose leiskite prieigą. + Čia bus pateikiamos naujos užklausos ir kvietimai. + Nieko naujo. + Pradėti pokalbį + • Serveriai atitinkantys IP dabar yra užblokuoti. + • Serveriai atitinkantys IP dabar yra leidžiami. + + %d serverių ACL pakeitimas + %d serverių ACL pakeitimai + %d serverių ACL pakeitimų + + Pakeitėte serverių ACL šiam kambariui. + %s pakeitė serverių ACL šiam kambariui. + • Serveriai atitinkantys IP yra užblokuoti. + • Serveriai atitinkantys IP yra leidžiami. + Nustatėte serverių ACL šiam kambariui. + %s nustatė serverių ACL šiam kambariui. + Išbandyti + Bakstelėkite viršuje dešinėje, kad pamatytumėte atsiliepimų parinktį. + Pateikite atsiliepimus + Pasiekti erdves + Pasiekite erdves (apačioje dešinėje) greičiau ir paprasčiau nei bet kada anksčiau. + Siekiant supaprastinti jūsų ${app_name}, skirtukai dabar yra neprivalomi. Tvarkykite juos naudodami viršutinį dešinės pusės meniu. + Sveiki atvykę į naują vaizdą! + Čia bus rodomos jūsų neperskaitytos žinutės, kai jų turėsite. + Nėra apie ką pranešti. + \"viskas viename\" saugi pokalbių programėlė komandoms, draugams ir organizacijoms. Sukurkite pokalbį arba prisijunkite prie esamo kambario ir pradėkite. + Sveiki atvykę į ${app_name}, +\n%s. + Erdvės - tai naujas kambarių ir žmonių grupavimo būdas. Pridėkite esamą kambarį arba sukurkite naują naudodami apatinį dešinįjį mygtuką. + %s +\natrodo šiek tiek tuščia. + + Apsvarstykite galimybę atsijungti iš senų sesijų (%1$d diena ar daugiau), kurių nebenaudojate. + Apsvarstykite galimybę atsijungti iš senų sesijų (%1$d dienos ar daugiau), kurių nebenaudojate. + Apsvarstykite galimybę atsijungti iš senų sesijų (%1$d dienų ar daugiau), kurių nebenaudojate. + + Neaktyvios sesijos + Patvirtinkite nepatvirtintas sesijas arba atjunkite jas. + Nepatvirtintos sesijos + Pagerinkite savo paskyros saugumą laikydamiesi šių rekomendacijų. + Saugumo rekomendacijos + + Neaktyvus %1$d+ dieną (%2$s) + Neaktyvus %1$d+ dienas (%2$s) + Neaktyvus %1$d+ dienų (%2$s) + + Nepatvirtinta · Paskutinė veikla %1$s + Patvirtinta · Paskutinė veikla %1$s + Peržiūrėti visas (%1$d) + Dabartinė sesija + Peržiūrėti detales + Patvirtinti sesiją + Patvirtinkite dabartinę sesiją, kad galėtumėte naudotis patobulintu saugumu pokalbiams. + Dabartinė sesija paruošta saugiems pokalbiams. + Nepatvirtinta sesija + Patvirtinta sesija + Nežinomas įrenginio tipas + Stalinis kompiuteris + Naršyklė + Mobilus + + %d žinutė pašalinta + %d žinutės pašalintos + %d žinučių pašalinta + + Įjungti vietos bendrinimą + Atkreipkite dėmesį, kad tai yra laboratorinė funkcija, kuri įgyvendinama laikinai. Tai reiškia, kad negalėsite ištrinti savo buvimo vietos istorijos, o pažengę naudotojai galės matyti jūsų buvimo vietos istoriją net tada, kai nustosite bendrinti savo tiesioginę buvimo vietą su šiuo kambariu. + Tiesioginės buvimo vietos bendrinimas + Dabartiniai vartai: %s + Vartai + Nepavyksta rasti galinio taško. + Dabartinis galinis taškas: %s + Galinis taškas + Šiuo metu naudojamas %s. + Metodas + + Rastas %d metodas. + Rasti %d metodai. + Rasti %d metodų. + + Nerastas joks kitas metodas, išskyrus foninį sinchronizavimą. + Nerastas joks kitas būdas, išskyrus Google Play paslaugas. + Galimi metodai + Pranešimo metodas + Foninis sinchronizavimas + Google Paslaugos + Pasirinkite, kaip gauti pranešimus + Vyksta ekrano bendrinimas + ${app_name} Ekrano bendrinimas + Kambario pranešimas + Naudotojai + Pranešti visam kambariui + + %1$d daugiau + %1$d daugiau + %1$d daugiau + + Rodyti mažiau + Bendrinti vietą + Kurti apklausą + Atidaryti kontaktus + Siųsti lipduką + Įkelti failą + Reikalingas atnaujinimas + Atnaujinti + Būkite kantrūs, tai gali užtrukti. + Prisijungti prie pakaitinio kambario + Nepavadintas kambarys + Jūs esate vienintelis šios erdvės administratorius. Jei ją paliksite, tai reikš, kad niekas jos nebekontroliuos. + Negalėsite prisijungti vėl, nebent būsite pakviestas iš naujo. + Jūs esate vienintelis čia esantis asmuo. Jei paliksite, ateityje niekas, įskaitant jus, negalės prisijungti. + Ar tikrai norite palikti %s\? + Nepalikti nė vieno + Palikti visus + Dalykai šioje erdvėje + Vistiek prisijungti + Kol kas praleisti + Baigti nustatyti atradimą. + Šiuo metu šis pseudonimas neprieinamas. +\nPabandykite vėliau arba paprašykite kambario administratoriaus patikrinti, ar turite prieigą. + Atradimas (%s) + Užbaigti sąranka + Kvieskite el. paštu, ieškokite kontaktų ir daugiau… + Jie nebus %s dalis + Tik į šį kambarį + Šiuo metu nenaudojate tapatybės serverio. Norėdami pakviesti komandos draugus ir būti jų atrandami, sukonfigūruokite jį toliau. + Prisijungti prie erdvės + Sukurti erdvę + Prisijunkite prie mano erdvės %1$s %2$s + Jie galės tyrinėti %s + Pakvietimas į %s + Kviesti žmones į savo erdvę + Aprašymas + Kuriama erdvė… + Atsitiktinis + Bendra + Sukurkime kiekvienai iš jų po kambarį. Vėliau galite pridėti ir daugiau, įskaitant jau esamus. + Su kokiais dalykais dirbate\? + Užtikrinkite, kad prieigą prie %s kompanijos turėtų tinkami žmonės. Vėliau galite pakviesti daugiau. + Kas yra jūsų komandos draugai\? + Mes sukursime joms kambarius. Vėliau galėsite pridėti ir daugiau. + Kokias diskusijas norite turėti %s\? + Suteikite jai pavadinimą, kad galėtumėte tęsti. + Pridėkite šiek tiek detalių, kad žmonės galėtų ją atpažinti. Jas galite keisti bet kuriuo metu. + Įtraukite keletą detalių, kurios padės išsiskirti. Jas galite keisti bet kuriuo metu. + Sukurti erdvę + Privati erdvė jums & jūsų komandos draugams + Aš ir komandos draugai + Privati erdvė kambariams organizuoti + Tik aš + Užtikrinkite, kad prieigą prie %s turėtų tinkami asmenys. + Su kuo dirbate\? + Norėdami prisijungti prie esamos erdvės, turite gauti kvietimą. + Galite tai pakeisti vėliau + Kokio tipo erdvę norite sukurti\? + Jūsų privati erdvė + Jūsų vieša erdvė + Pridėti erdvę + Privati erdvė + Vieša erdvė + Prisijungti prie erdvės su nurodytu id + Pridėti prie nurodytos erdvės + Sukurti erdvę + Neteisingas naudotojo vardas ir (arba) slaptažodis. Įvestas slaptažodis prasideda arba baigiasi tarpais, patikrinkite jį. + Kuriama erdvė… + Erdvės adresas + Negalima atidaryti šios nuorodos: bendruomenės buvo pakeistos erdvėmis + Atidaryti erdvių sąrašą + Naudojate erdvių beta versiją. Jūsų atsiliepimai padės parengti kitas versijas. Jūsų platforma ir naudotojo vardas bus pažymėti, kad galėtume kuo geriau pasinaudoti jūsų atsiliepimais. + Atsiliepimai apie erdves + Sukurti naują erdvę + Kitos erdvės ar kambariai, apie kuriuos galbūt nežinote + Erdvė, apie kurią žinote, kurioje yra šis kambarys + Bakstelėkite, kad redaguoti erdves + Pasirinkti erdves + Nuspręskite, kurios erdvės gali prieit prie šio kambario. Jei pasirinkta erdvė, jos nariai galės rasti kambario pavadinimą ir prie jo prisijungti. + Erdvės, kurios gali pasiekti + Leisti erdvės nariams rasti ir pasiekti. + Erdvės %s nariai gali rasti, peržiūrėti ir prisijungti. + Kiekvienas, esantis erdvėje, kurioje yra šis kambarys, gali jį rasti ir prie jo prisijungti. Tik šio kambario administratoriai gali jį įtraukti į erdvę. + Tik erdvės nariams + Bet kas gali rasti šią erdvę ir prisijungti + Peržiūrėti ir valdyti šios erdvės adresus. + Erdvės adresai + Erdvės prieiga + + %1$s ir %2$d kitas + %1$s ir %2$d kiti + %1$s ir %2$d kitų + + Atnaujinti erdvę + Keisti erdvės pavadinimą + Įjungti erdvės šifravimą + Keisti erdvės pagrindinį adresą + Keisti erdvės avatarą + Neturite leidimo atnaujinti roles, reikalingas įvairioms šios erdvės dalims keisti + Pasirinkite roles, reikalingas įvairioms šios erdvės dalims keisti + Peržiūrėkite ir atnaujinkite roles, reikalingas įvairioms erdvės dalims keisti. + Erdvės leidimai + Atblokavus naudotoją, jis vėl galės prisijungti prie erdvės. + Užblokavus naudotoją, jis bus pašalintas iš šios erdvės ir negalės prisijungti dar kartą. + Naudotojas bus pašalintas iš šios erdvės. +\n +\nKad jis negalėtų prisijungti dar kartą, turėtumėte jį užblokuoti. + Erdvės + Erdvės - tai naujas kambarių ir žmonių grupavimo būdas. Sukurkite erdvę ir pradėkite. + Erdvių dar nėra. + Erdvės + Keisti erdvę + Atsarginė kopija turi galiojantį parašą iš nepatvirtintos sesijos %s + Atsarginė kopija turi galiojantį parašą iš patvirtintos sesijos %s. + Atsarginė kopija turi galiojantį šios sesijos parašą. + Atsarginė kopija turi galiojantį šio naudotojo parašą. + Atsarginė kopija turi nežinomos sesijos parašą su ID %s. + Jūsų raktų atsarginės kopijos iš šios sesijos nedaromos. + Šioje sesijoje raktų atsarginė kopija nėra aktyvi. + Šiai sesijai teisingai nustatyta atsarginė raktų kopija. + Ištrinti atsarginę kopiją + Atkurti iš atsarginės kopijos + Nepavyko gauti naujausios atkūrimo raktų versijos (%s). + + %d naujas raktas buvo pridėtas prie šios sesijos. + %d nauji raktai buvo pridėti prie šios sesijos. + %d naujų raktų buvo pridėta prie šios sesijos. + + + Atkurta atsarginė kopija su %d raktu. + Atkurta atsarginė kopija su %d raktais. + Atkurta atsarginė kopija su %d raktų. + + Atkurta atsarginė kopija %s ! + Atsarginės kopijos nepavyko iššifruoti naudojant šį atkūrimo raktą: patikrinkite, ar įvedėte teisingą atkūrimo raktą. + Įveskite atkūrimo raktą + Atrakinti istoriją + Importuojami raktai… + Atsisiunčiami raktai… + Apskaičiuojame atkūrimo raktą… + Atkuriama atsarginė kopija: + Atsarginės kopijos nepavyko iššifruoti naudojant šią slaptafrazę: patikrinkite, ar įvedėte teisingą atkūrimo slaptafrazę. + Pametėte atkūrimo raktą\? Galite nustatyti naują nustatymuose. + Įvesti atkūrimo raktą + Naudoti atkūrimo raktą, kad atrakinti užšifruotų žinučių istoriją + Nežinote savo atkūrimo slaptafrazės, galite %s. + naudokite savo atkūrimo raktą + Naudokite atkūrimo slaptafrazę, kad atrakintumėte užšifruotų žinučių istoriją + Gauname atsarginę versiją… + Jei atsijungsite arba prarasite šį prietaisą, galite prarasti prieigą prie savo žinučių. + Ar esate tikri\? + Netikėta klaida + Atkūrimo raktas + Generuojame atkūrimo raktą naudojant slaptafrazę, šis procesas gali užtrukti kelioliką sekundžių. + Bendrinti atkūrimo raktą su… + Prašome pasidaryti kopiją + Sustabdyti + Pakeisti + Atrodo, kad jau esate sukūrę atsarginę raktų kopiją iš kitos sesijos. Ar norite ją pakeisti kuriama\? + Jūsų namų serveryje jau yra atsarginė kopija + Atkūrimo raktas buvo išsaugotas. + Įrašyti kaip failą + Bendrinti + Išsaugoti atkūrimo raktą + Padariau kopiją + Baigta + Atkūrimo raktą laikykite labai saugioje vietoje, pvz., slaptažodžių tvarkyklėje (arba seife) + Atkūrimo raktas yra apsauginis tinklas - juo galite atkurti prieigą prie užšifruotų žinučių, jei pamiršite slaptafrazę. +\nAtkūrimo raktą laikykite labai saugioje vietoje, pvz., slaptažodžių tvarkyklėje (arba seife) + Jūsų raktų atsarginė kopija yra kuriama. + Sėkmė ! + (Išplėstinė) Nustatyti su atkūrimo raktu + Arba apsaugokite atsarginę kopiją naudodami atkūrimo raktą ir išsaugokite ją saugioje vietoje. + Atsarginės kopijos kūrimas + Nustatyti slaptafrazę + Jūsų namų serveryje išsaugosime šifruotą raktų kopiją. Apsaugokite atsarginę kopiją slaptafraze, kad ji būtų saugi. +\n +\nSiekiant maksimalaus saugumo, ji turėtų skirtis nuo jūsų paskyros slaptažodžio. + Apsaugokite atsarginę kopiją slaptafraze. + Eksportuoti raktus rankiniu būdu + (Išplėstiniai) + Pradėti naudoti raktų atsarginį kopijavimą + Užšifruotuose kambariuose siunčiamos žinutės yra apsaugotos šifravimu nuo galo iki galo. Tik jūs ir gavėjas (-ai) turite raktus, kad galėtumėte perskaityti šias žinutes. +\n +\nSaugiai kurkite atsargines raktų kopijas, kad jų neprarastumėte. + Niekada nepraraskite užšifruotų žinučių + Ištrinkite slaptafrazę, jei norite, kad ${app_name} sugeneruotų atkūrimo raktą. + Slaptafrazė yra per silpna + Įveskite slaptafrazę + Slaptafrazė nesutampa + Įvesti slaptafrazę + Patvirtinti slaptafrazę + Sukurti slaptafrazę + Nerastas galiojantis Google Play Paslaugų APK. Pranešimai gali neveikti tinkamai. + +%d + %1$s: %2$s + suskleisti + išplėsti + Atsiprašome, įvyko klaida + Jei norite toliau naudotis šia paslauga, prašome %s. + Prašome %s kad padidinti šią ribą. + Šis namų serveris pasiekė savo mėnesio aktyviųjų naudotojų limitą. + Šis namų serveris pasiekė mėnesio aktyviųjų naudotojų limitą, todėl kai kurie naudotojai negalės prisijungti. + Šis namų serveris viršijo vieną iš savo išteklių limitų. + Šis namų serveris viršijo vieną iš savo išteklių limitų, todėl kai kurie naudotojai negalės prisijungti. + kreipkitės į savo paslaugų administratorių + Spustelėkite čia, kad pamatytumėte senesnes žinutes + Šis kambarys yra kito pokalbio tęsinys + Pokalbis tęsiamas čia + Šis kambarys buvo pakeistas ir nebėra aktyvus. + Įveskite savo slaptažodį. + Įveskite naudotojo vardą. + Deaktyvuoti paskyrą + Prašau pamiršti visas mano išsiųstas žinutes, kai mano paskyra bus deaktyvuota (Įspėjimas: dėl to būsimi naudotojai matys nepilną pokalbių vaizdą) + Dėl to jūsų paskyra visam laikui taps netinkama naudoti. Negalėsite prisijungti ir niekas negalės iš naujo užregistruoti to paties naudotojo ID. Dėl to jūsų paskyra išeis iš visų kambarių, kuriuose dalyvauja, ir iš jūsų tapatybės serverio bus pašalinti jūsų paskyros duomenys. Šis veiksmas yra negrįžtamas. +\n +\nDeaktyvavus paskyrą pagal numatytuosius nustatymus nepamirštame jūsų išsiųstų žinučių. Jei norite, kad pamirštume jūsų žinutes, pažymėkite toliau esantį langelį. +\n +\nŽinučių matomumas Matrix sistemoje yra panašus į el. pašto matomumą. Mūsų jūsų žinučių užmiršimas reiškia, kad jūsų išsiųstomis žinutėmis nebus dalijamasi su jokiais naujais ar neregistruotais naudotojais, tačiau registruoti naudotojai, kurie jau turi prieigą prie šių žinučių, vis tiek turės prieigą prie jų kopijos. + Deaktyvuoti paskyrą + Peržiūrėti dabar + Norėdami toliau naudoti %1$s namų serverį, turite peržiūrėti ir sutikti su nuostatomis ir sąlygomis. + Avataras + Priežastis: %1$s + %2$s jus užblokavo iš %1$s + %2$s jus pašalino iš %1$s + Pakviestas + Kambariai + Pradžia + Sukurti + Šifruota žinutė + Triukšmingas + Tylus + Jūs neturite leidimo tai daryti šiame kambaryje. + Jūs nesate šiame kambaryje. + Pridėti Matrix programėlių + Trūksta reikalingo parametro. + Kambarys %s nėra matomas. + Blokuoti visus + Leisti + Kambario ID + Naudoti mikrofoną + Naudoti kamerą + Tvarkyti integracijas + Jūsų nepatvirtinta sesija \'%s\' prašo šifravimo raktų. + Nauja sesija prašo šifravimo raktų. +\nSesijos pavadinimas: %1$s +\nPaskutinį kartą matyta: %2$s +\nJei neprisijungėte prie kitos sesijos, ignoruokite šią užklausą. + Pridėjote naują sesiją \'%s\', kuri prašo šifravimo raktų. + Nepatvirtinta sesija prašo šifravimo raktų. +\nSesijos pavadinimas: %1$s +\nPaskutinį kartą matyta: %2$s +\nJei neprisijungėte prie kitos sesijos, ignoruokite šią užklausą. + Nustatyti naudotojo galios lygį + Nustoja ignoruoti naudotoją ir rodo jo žinutes nuo dabar + ignoruoja naudotoją, slepiant jo žinutes nuo jūsų + Atblokuoja naudotoją su nurodytu id + Užblokuoja naudotoją su nurodytu id + Rodo veiksmą + Prisijungia prie kambario su nurodytu adresu + Pakviečia naudotoją su nurodytu id į šį kambarį + Nustato kambario pavadinimą + Markdown buvo išjungtas. + Markdown buvo įjungtas. + Rodo informaciją apie naudotoją + Pakeičia šio kambario avatarą + Pakeičia jūsų rodomą slapyvardį tik šiame kambaryje + Pakeičia jūsų avatarą tik šiame kambaryje + Pakeičia jūsų rodomą slapyvardį + Pašalina naudotoją su nurodytu id iš šio kambario + Nustatyti kambario temą + Palikti kambarį + Neatpažinta komanda: %s + Pradėti patvirtinimą + Komandos klaida + Ignoruoti + Bendrinti + Komanda \"%s\" atpažįstama, bet nepalaikoma temose. + Komandai \"%s\" reikia daugiau parametrų arba kai kurie parametrai yra neteisingi. + + %d pasirinktas + %d pasirinkti + %d pasirinktų + + Keisti temą + Atnaujinti kambarį + Numatyta rolė + Neturite leidimo atnaujinti roles, reikalingas įvairioms kambario dalims keisti + Pasirinkite roles, reikalingas įvairioms kambario dalims keisti + Leidimai + Peržiūrėti ir atnaujinti roles, reikalingas įvairioms kambario dalims keisti. + Kambario leidimai + Sertifikatą priimkite tik tuo atveju, jei serverio administratorius yra paskelbęs antspaudą, atitinkantį pirmiau nurodytą. + Sertifikatas pakeistas iš anksčiau patikimo į nepatikimą. Serveris galėjo atnaujinti savo sertifikatą. Kreipkitės į serverio administratorių dėl numatyto antspaudo. + Sertifikatas pakeistas iš to, kuriuo pasitikėjo jūsų telefonas. Tai LABAI NEĮPRASTA. Rekomenduojama NEPATVIRTINTI šio naujo sertifikato. + Jei serverio administratorius nurodė, kad to tikimasi, įsitikinkite, kad toliau pateiktas antspaudas atitinka jo pateiktą antspaudą. + Tai gali reikšti, kad kažkas piktavališkai perima jūsų duomenų srautą arba kad telefonas nepasitiki nuotolinio serverio pateiktu sertifikatu. + Nepavyko patvirtinti nuotolinio serverio tapatybės. + Antspaudas (%s): + Ignoruoti + Nepasitikėti + Pasitikėti + + %d nauja žinutė + %d naujos žinutės + %d naujų žinučių + + Šifravimas buvo neteisingai sukonfigūruotas, todėl negalite siųsti žinučių. Spustelėkite, kad atidarytumėte nustatymus. + Šifravimas buvo neteisingai sukonfigūruotas, todėl negalite siųsti žinučių. Susisiekite su administratoriumi, kad būtų atkurta galiojanti šifravimo būsena. + Jūs neturite leidimo rašyti šiame kambaryje. + %1$s, %2$s ir kiti + %1$s ir %2$s + %1$s & %2$s & kiti rašo… + %1$s & %2$s rašo… + %s rašo… + Atblokavus naudotoją, jis vėl galės prisijungti prie kambario. + Užblokavus naudotoją, jis bus pašalintas iš šio kambario ir negalės prisijungti dar kartą. + Atblokuoti naudotoją + Priežastis užblokavimui + Išplėstiniai + Kita + Ignoruojami naudotojai + Naudotojo nustatymai + Išvalyti medijos talpyklą + Išvalyti talpyklą + Saugoti mediją + Privatumo politika + Autorinės teisės + Trečiųjų šalių pastabos + Terminai ir sąlygos + + %d sekundė + %d sekundės + %d sekundžių + + Uždelsimas tarp kiekvieno sinchronizavimo + Sinchronizavimo užklausos laiko limitas + Paleisti sistemos paleidimo metu + Kai programėlė yra fone, apie gautus pranešimus nebūsite informuojami. + Nėra foninio sinchronizavimo + ${app_name} sinchronizuosis fone periodiškai tiksliai nustatytu laiku (galima konfigūruoti). +\nTai turės įtakos radijo ryšio ir baterijos naudojimui, bus rodomas nuolatinis pranešimas, kad ${app_name} klausosi įvykių. + Optimizuotas realiajam laikui + ${app_name} bus sinchronizuojama fone taip, kad būtų tausojami riboti įrenginio ištekliai (akumuliatorius). +\nPriklausomai nuo įrenginio išteklių būklės, operacinė sistema gali atidėti sinchronizavimą. + Optimizuotas akumuliatoriui + Foninio sinchronizavimo režimas + Foninis sinchronizavimas + Mobiliuosiuose įrenginiuose negausite pranešimų apie užšifruotuose kambariuose esančius paminėjimus ir raktažodžius. + Kambario atnaujinimai + Boto žinutės + Kvietimai skambinti + Kvietimai į kambarį + Raktažodžiai + \@kambarys + Šifruotos grupių žinutės + Grupių žinutės + Šifruotos tiesioginės žinutės + Tiesioginės žinutės + Mano naudotojo vardas + Mano rodomas vardas + Žinutės, kuriose yra @room + Boto išsiųstos žinutės + Kai mane pakviečia į kambarį + Žinutės grupiniuose pokalbiuose + Žinutės pokalbiuose vienas su vienu + Žinutės, kuriose yra mano naudotojo vardas + Žinutės, kuriose yra mano rodomas vardas + Kai kambariai atnaujinami + Šifruotos žinutės grupiniuose pokalbiuose + Šifruotos žinutės pokalbiuose vienas su vienu + Pasirinkti LED spalvą, vibraciją, garsą… + Tyliųjų pranešimų konfigūravimas + Skambučių pranešimų konfigūravimas + Triukšmingų pranešimų konfigūravimas + Įjungti pranešimus šiai sesijai + Įjungti pranešimus šiai paskyrai + Pranešimo garsas + Ignoruoti optimizavimą + Jei naudotojas kurį laiką palieka prietaisą atjungtą nuo elektros tinklo ir nejudantį, su išjungtu ekranu, prietaisas įjungia \"Doze\" režimą. Tai neleidžia programoms prisijungti prie tinklo ir atideda jų darbus, sinchronizavimą ir standartinius žadintuvus. + Akumuliatoriaus optimizavimas neįtakoja ${app_name}. + Akumuliatoriaus optimizavimas + Išjungti apribojimus + Įjungti foniniai apribojimai ${app_name}. +\nDarbas, kurį programa bando atlikti, bus agresyviai ribojamas, kol ji yra fone, ir tai gali turėti įtakos pranešimams. +\n%1$s + Fono apribojimai išjungti ${app_name}. Šis testas turėtų būti atliekamas naudojant mobiliuosius duomenis (be WIFI). +\n%1$s + Patikrinti fono apribojimus + Įjungti paleidimą sistemos paleidimo metu + Paslauga nebus paleista iš naujo paleidus įrenginį, pranešimų negausite, kol vieną kartą nebus atidaryta ${app_name}. + Paslauga bus paleista iš naujo paleidus įrenginį. + Paleisti sistemos paleidimo metu + Pranešimas buvo paspaustas! + Spustelėkite pranešimą. Jei pranešimo nematote, patikrinkite sistemos nustatymus. + Pranešimo rodymas + Jūs žiūrite pranešimą! Spausk ant manęs! + Kai kurie pranešimai yra išjungti pasirinktiniuose nustatymuose. + Atkreipkite dėmesį, kad kai kurie pranešimų tipai nustatyti kaip tylūs (pranešimas bus be garso). + Pasirinktiniai nustatymai. + Šioje sesijoje pranešimai neįjungti. +\nPatikrinkite ${app_name} nustatymus. + Šioje sesijoje pranešimai yra įjungti. + Sesijos nustatymai. + Pranešimai jūsų paskyroje yra išjungti. +\nPatikrinkite paskyros nustatymus. + Jūsų paskyroje pranešimai yra įjungti. + Paskyros nustatymai. + Atidaryti nustatymus + Sistemos nustatymuose pranešimai yra išjungti. +\nPatikrinkite sistemos nustatymus. + Pranešimai yra įjungti sistemos nustatymuose. + Sistemos nustatymai. + Vienas ar daugiau testų nepavyko, pateikite pranešimą apie klaidą ir padėkite mums ją ištirti. + Vienas ar daugiau testų nepavyko, išbandykite siūlomą (-us) pataisymą (-us). + Pagrindinė diagnostika yra gera. Jei vis dar negaunate pranešimų, pateikite pranešimą apie klaidą ir padėkite mums ją ištirti. + Vykdoma… (%1$d iš %2$d) + Atlikti bandymus + Trikčių diagnostika + Pranešimų trikčių šalinimas + Raktažodžiai negali turėti \'%s\' + Raktažodžiai negali prasidėti su \'.\' + Pridėti naują raktažodį + Jūsų raktažodžiai + Praneškite man apie + Kita + Paminėjimai ir raktažodžiai + Numatyti pranešimai + Įjungti pranešimus el. paštu %s + Norėdami gauti pranešimą el. paštu, susiekite el. paštą su savo Matrix paskyra + Pranešimas el. paštu + Pranešimo svarba pagal įvykį + Išplėstiniai pranešimų nustatymai + Įsitikinkite, kad paspaudėte jums atsiųstame el. laiške esančią nuorodą. + Pašalinti %s\? + Telefono numeriai + Prie jūsų paskyros nepridėtas joks el. paštas + El. pašto adresai + Rodyti programos informaciją sistemos nustatymuose. + Programos informacija + Pridėti telefono numerį + Prie jūsų paskyros nepridėtas joks telefono numeris + Pridėti el. pašto adresą + Rodomas vardas + Profilio nuotrauka + Sesija buvo atjungta! + %1$s ir %2$s + Nėra rezultatų + Filtruoti užblokuotus narius + Filtruoti kambario narius + Ieškoti + Kambarys buvo paliktas! + Pridėti prie pagrindinio ekrano + Nėra + Tik paminėjimai & raktažodžiai + Visos žinutės + Filtruoti temas kambaryje + Temos artėja prie beta versijos 🎉 + Siųsti nuotraukas ir vaizdo įrašus + Atidaryti fotoaparatą + Rodyti žinučių burbulus + Tiesioginė buvimo vieta + Bendrinti vietą + Norėdami bendrinti tiesioginę buvimo vietą šiame kambaryje, turite turėti tinkamus leidimus. + Neturite leidimo bendrinti tiesioginę buvimo vietą + Atnaujinta prieš %1$s + Laikinas pritaikymas: vietos išlieka kambario istorijoje + Įjungti tiesioginį buvimo vietos bendrinimą + Bendrinama buvimo vieta + ${app_name} tiesioginė buvimo vieta + %1$s liko + Sustabdyti + Tiesiogiai iki %1$s + Žiūrėti tiesioginę buvimo vietą + Tiesioginė buvimo vieta baigėsi + Įkeliama tiesioginė vieta… + Tiesioginė buvimo vieta įjungta + Nepavyksta įkelti žemėlapio +\nŠis namų serveris gali būti nesukonfigūruotas rodyti žemėlapius. + Nepavyko įkelti žemėlapio + Atidaryti per + ${app_name} negalėjo pasiekti jūsų vietos. Prašome pabandyti vėliau. + ${app_name} negalėjo pasiekti jūsų vietos + 8 valandas + 1 valandą + 15 minučių + Bendrinti savo tiesioginę buvimo vietą + Bendrinti šią vietą + Bendrinti šią vietą + Bendrinti tiesioginę buvimo vietą + Bendrinti tiesioginę buvimo vietą + Bendrinti mano dabartinę vietą + Bendrinti mano dabartinę vietą + Priartinti esamą vietą + Pasirinktos vietos smeigtukas žemėlapyje + Žemėlapis + Rezultatai atskleidžiami tik tada, kai baigiate apklausą + Uždaryta apklausa + Balsuotojai mato rezultatus iškart po balsavimo + Atidaryti apklausą + Apklausos tipas + Redaguoti apklausą + Ar tikrai norite pašalinti šią apklausą\? Pašalinę ją negalėsite susigrąžinti. + Tai neleis žmonėms balsuoti ir bus rodomi galutiniai apklausos rezultatai. + Pašalinti apklausą + Apklausa baigėsi + Prabalsuota + Baigti apklausą + laimėtojo parinktis + Rezultatai bus matomi pasibaigus apklausai + Nėra balsų + Iš naujo paleiskite programą, kad pakeitimas įsigaliotų. + Įjungti LaTeX matematika + %s nustatymuose, kad gautumėte kvietimus tiesiogiai į ${app_name}. + Kvietimas į šią erdvę buvo išsiųstas į %s, kuris nėra susijęs su jūsų paskyra + Kvietimas į šį kambarį buvo išsiųstas į %s, kuris nėra susijęs su jūsų paskyra + Atkreipkite dėmesį, kad atnaujinus bus sukurta nauja kambario versija. Visos dabartinės žinutės liks šiame archyvuotame kambaryje. + Kiekvienas iš %s galės rasti šį kambarį ir prisijungti prie jo - nereikės visų kviesti rankiniu būdu. Tai galėsite bet kada pakeisti kambario nustatymuose. + (%1$s) + %1$s (%2$s) + Nepavyko paleisti %1$s + Pristabdyti %1$s + Paleisti %1$s + %1$d minutės %2$d sekundės + %1$s, %2$s, %3$s + %1$ds liko + Atsiprašome, bandant prisijungti įvyko klaida: %s + Atnaujinti į rekomenduojamą kambario versiją + Šiame kambaryje naudojama kambario versija %s, kurią šis namų serveris pažymėjo kaip nestabilią. + Norint atnaujinti kambarį, reikia leidimo + Jūs atnaujinsite šį kambarį iš %1$s į %2$s. + Kambario atnaujinimas yra išplėstinis veiksmas ir paprastai rekomenduojamas, kai kambarys yra nestabilus dėl klaidų, trūkstamų funkcijų ar saugumo spragų. +\nPaprastai tai turi įtakos tik tam, kaip kambarys apdorojamas serveryje. + Atnaujinti privatų kambarį + Atnaujinti viešą kambarį + Kai kurie kambariai gali būti paslėpti, nes yra privatūs ir į juos reikia pakvietimo. + Kai kurie kambariai gali būti paslėpti, nes yra privatūs ir į juos reikia pakvietimo. +\nJūs neturite leidimo pridėti kambarių. + Šioje erdvėje nėra kambarių + Dėl papildomos informacijos kreipkitės į savo namų serverio administratorių + Atrodo, kad jūsų namų serveris dar nepalaiko erdvių + Norite eksperimentuoti\? +\nĮ erdvę galite įtraukti esamas erdves. + Visi kambariai kuriuose esate, bus rodomi pradžioje. + Valdyti kambarius ir erdves + Pažymėti kaip nesiūlomą + Pažymėti kaip siūlomą + Siūlomas + Valdyti kambarius + Ieškote ko nors ne iš %s\? + %s kviečia tave + Rodyti naujausią profilio informaciją (avatarą ir rodomą vardą) visose žinutėse. + Rodyti naujausią naudotojo informaciją + Pastaba: programa bus paleista iš naujo + Įjungti temų žinutes + Jūsų sistema automatiškai išsiųs žurnalus, kai įvyks negalėjimo iššifruoti klaida + Automatiškai pranešti apie iššifravimo klaidas. + Erdvės - tai naujas kambarių ir žmonių grupavimo būdas. + Įtraukite erdvę į bet kurią valdomą erdvę. + Pridėti esamas erdves + Pridėti esamus kambarius + Pridėti esamus kambarius ir erdvę + Kai kurie rezultatai gali būti paslėpti, nes jie yra privatūs ir į juos reikia pakvietimo. + Rezultatų nerasta + Iš temos + Patarimas: Ilgai bakstelėkite žinutę ir naudokite “%s”. + Temos padeda išlaikyti pokalbių temą ir lengviau juos sekti. + Išlaikykite diskusijas organizuotas su temomis + Rodo visas temas, kuriose dalyvavote + Mano temos + Rodo visas temas iš dabartinio kambario + Visos temos + Filtras + Visos temos + Tema + Keisti leidimus + Keisti pagrindinį kambario adresą + Keisti kambario avatarą + Keisti valdiklius + Pranešti visiems + Pašalinti kitų išsiųstas žinutes + Užblokuoti naudotojus + Pašalinti naudotojus + Keisti nustatymus + Kviesti naudotojus + Siųsti žinutes + Įjungti kambario šifravimą + Keisti kambario pavadinimą + Keisti istorijos matomumą + %s atnaujino čia. \ No newline at end of file From 77fa7aea568ab96d5bbac1e5f4ed299c98dea7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Romanik?= Date: Wed, 14 Sep 2022 15:01:17 +0000 Subject: [PATCH 045/131] Translated using Weblate (Polish) Currently translated at 98.8% (2358 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/ --- library/ui-strings/src/main/res/values-pl/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/ui-strings/src/main/res/values-pl/strings.xml b/library/ui-strings/src/main/res/values-pl/strings.xml index 18b0de078c..29c50f0b37 100644 --- a/library/ui-strings/src/main/res/values-pl/strings.xml +++ b/library/ui-strings/src/main/res/values-pl/strings.xml @@ -145,7 +145,7 @@ Przejdź do pierwszej nieprzeczytanej wiadomości Opuść pokój Czy na pewno chcesz opuścić pokój? - WIADOMOŚCI BEZPOŚREDNIE + Wiadomości bezpośrednie Zaproś Blokuj Odbanuj @@ -548,7 +548,7 @@ Pokoje Dodaj reakcję Utwórz nowy pokój - Wiadomości Bezpośrednie + Wiadomości bezpośrednie STWÓRZ Nazwa Publiczny @@ -654,7 +654,7 @@ Proszę wykonać kopię Preferencje Głos i wideo - Wiadomości Bezpośrednie + Wiadomości bezpośrednie Filtruj rozmowy… Wyślij nową wiadomość bezpośrednią Wersja Matrix SDK @@ -841,7 +841,7 @@ Url: Format: Zarejestruj token - Dziękujemy, sugestia została szczęśliwie wysłana + Dziękujemy, sugestia została pomyślnie wysłana Wysłanie sugestii nie powiodło się (%s) Wyświetl ukryte wydarzenia na linii czasowej (edytowano) From 16443f957b74cbc7d4fa40cce02b5889f57017c7 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Fri, 16 Sep 2022 06:07:02 +0000 Subject: [PATCH 046/131] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/ --- library/ui-strings/src/main/res/values-pt-rBR/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml index dded77f50b..5c8ef7f720 100644 --- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml +++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml @@ -2320,7 +2320,7 @@ Enviar imagens e vídeos Abrir câmera Seu sistema vai automaticamente enviar logs quando um erro incapaz de decriptar ocorre - Auro Reportar Erros de Decriptação. + Auto Reportar Erros de Decriptação. Sobrepor cor de nome de exibição Eu já tenho uma conta Mensageria segura. @@ -2477,7 +2477,7 @@ Backup tem uma assinatura válida desta(e) usuária(o). Atualizada %1$s atrás Implementação tempoária: locais persistem em histórico de sala - Habilitar Compartilhament de Localização Ao Vivo + Habilitar Compartilhamento de Localização Ao Vivo %1$s restando Ao vivo até %1$s Ver localização ao vivo @@ -2499,7 +2499,7 @@ Endpoint Gateway Ativar compartilhamento de localização - Compartilhamento de localização em tempo real + Compartilhamento de localização ao vivo Gateway atual: %s Não foi possível encontrar o endpoint. Endpoint atual: %s @@ -2538,7 +2538,7 @@ Nome de Usuária(o) / Email / Telefone Você é um/uma humano(a)\? Siga as instruções enviadas para %s - Reset de senha + Senha resettada Esqueceu senha Reenviar email Não recebeu um email\? From a783bef1e10bf297d6360ed2c6cafc3df9650c74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rson?= Date: Sun, 11 Sep 2022 15:52:33 +0000 Subject: [PATCH 047/131] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/ --- library/ui-strings/src/main/res/values-pt-rBR/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml index 5c8ef7f720..780c7f0702 100644 --- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml +++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml @@ -1,6 +1,6 @@ - convite de %s + Convite de %s %1$s convidou %2$s %1$s convidou você %1$s juntou-se à sala From a6dc219e28cd259b77b774bb7ad2b06479712167 Mon Sep 17 00:00:00 2001 From: phardyle Date: Tue, 13 Sep 2022 10:04:03 +0000 Subject: [PATCH 048/131] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.5% (2375 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- .../src/main/res/values-zh-rCN/strings.xml | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index 4e1c8e61c8..5cae1aa34d 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -2500,7 +2500,7 @@ 若启用,即使正在使用应用,你也会对其他用户显示为离线状态。 离线模式 在场 - 动画图片一出现就在时间轴中播放 + 动画图片一出现就在时间线中播放 Threads Beta ${app_name} needs to perform a clear cache to be up to date, 原因如下: \n%s @@ -2583,4 +2583,28 @@ 已验证的会话 未知的设备类型 邀请 + 移动设备 + Web + 桌面 + 更改空间 + 尚无空间。 + 没有新的东西。 + 你的新请求和邀请会在这里。 + + %1$d+天不活跃(%2$s) + + 安全建议 + 按照这些建议改善你的账户安全。 + 未验证的会话 + 验证未验证的会话或从之登出。 + 不活跃的会话 + + 请考虑从不再使用的旧会话(%1$d天或更久)登出。 + + 欢迎来到${app_name}, +\n%s。 + 未读消息会在这里显示。 + 提供反馈 + 点击右上角查看反馈选项。 + 试用 \ No newline at end of file From 733add8d61dd8444fc76a8808c68434b9fb059d7 Mon Sep 17 00:00:00 2001 From: Anonimas Date: Sat, 17 Sep 2022 12:30:18 +0000 Subject: [PATCH 049/131] Translated using Weblate (Lithuanian) Currently translated at 4.0% (3 of 75 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/lt/ --- .../metadata/android/lt/full_description.txt | 42 +++++++++++++++++++ .../metadata/android/lt/short_description.txt | 1 + fastlane/metadata/android/lt/title.txt | 1 + 3 files changed, 44 insertions(+) create mode 100644 fastlane/metadata/android/lt/full_description.txt create mode 100644 fastlane/metadata/android/lt/short_description.txt create mode 100644 fastlane/metadata/android/lt/title.txt diff --git a/fastlane/metadata/android/lt/full_description.txt b/fastlane/metadata/android/lt/full_description.txt new file mode 100644 index 0000000000..7189008456 --- /dev/null +++ b/fastlane/metadata/android/lt/full_description.txt @@ -0,0 +1,42 @@ +Element yra ir saugaus žinučių siuntimo, ir produktyvaus komandinio bendradarbiavimo programėlė, puikiai tinkanti grupiniams pokalbiams dirbant nuotoliniu būdu. Ši pokalbių programa naudoja visapusį šifravimą, kad užtikrintų galingas vaizdo konferencijas, dalijimąsi failais ir balso skambučius. + +Element funkcijos turi: +- Išplėstinės bendravimo internetu priemonės +- Visiškai užšifruotos žinutės, kad būtų galima saugiau bendrauti su įmone, net ir su nuotoliniais darbuotojais +- Decentralizuoti pokalbiai, pagrįsti atvirojo kodo sistema Matrix +- Saugus dalijimasis failais su šifruotais duomenimis valdant projektus +- Vaizdo pokalbiai su IP balso perdavimu ir ekrano bendrinimu +- Lengva integracija su mėgstamiausiomis internetinėmis bendradarbiavimo priemonėmis, projektų valdymo įrankiais, VoIP paslaugomis ir kitomis komandinių pokalbių programomis + +Element visiškai skiriasi nuo kitų žinučių siuntimo ir bendradarbiavimo programėlių. Ji veikia Matrix - atvirame tinkle, skirtame saugiam žinučių siuntimui ir decentralizuotam bendravimui. Jame galima savarankiškai talpinti duomenis ir žinutes savo serveryje, kad naudotojai galėtų maksimaliai valdyti ir kontroliuoti savo duomenis ir žinutes. + +Privatumas ir šifruotos žinutės +Element apsaugo jus nuo nepageidaujamų reklamų, duomenų gavybos ir uždarų sodų. Jis taip pat apsaugo visus jūsų duomenis, "vienas su vienu" vaizdo ir balso ryšį, naudodamas visapusį šifravimą ir kryžmiškai pasirašytą įrenginių patvirtinimą. + +Element suteikia galimybę kontroliuoti savo privatumą ir kartu saugiai bendrauti su visais, esančiais Matrix tinkle, arba kitais verslo bendradarbiavimo įrankiais integruojantis su tokiomis programėlėmis kaip Slack. + +Element gali būti savarankiškai talpinamas +Kad galėtumėte geriau kontroliuoti savo slaptus duomenis ir pokalbius, Element gali būti savarankiškai talpinamas arba galite pasirinkti bet kurį Matrix pagrindu veikiantį serverį - atvirojo kodo decentralizuoto bendravimo standartu. Element suteikia privatumą, saugumo atititikimą ir integracijos lankstumą. + +Jūsų duomenys priklauso jums +Jūs nusprendžiate, kur laikyti savo duomenis ir žinutes. Be duomenų gavybos ar trečiųjų šalių prieigos rizikos. + +Element suteikia jums kontrolę įvairiais būdais: +1. Gaukite nemokamą paskyrą viešajame serveryje matrix.org, kurį talpina Matrix kūrėjai, arba rinkitės iš tūkstančių viešųjų serverių, kurių talpinimą teikia savanoriai +2. Savarankiškai talpinkite savo paskyrą, naudodami serverį savo IT infrastruktūroje +3. Užsisakykite paskyrą nuosavame serveryje tiesiog užsisakydami "Element Matrix Services" talpinimo paslaugą + +Atviras žinučių siuntimas ir bendradarbiavimas +Galite bendrauti su bet kuriuo Matrix tinklo nariu, nesvarbu, ar jis naudojasi Element, kita Matrix programėle, ar net jei naudoja kitą žinučių siuntimo programėlę. + +Super saugus +Tikras visapusis šifravimas (žinutes gali iššifruoti tik pokalbio dalyviai) ir kryžminiu parašu patvirtintas įrenginių patvirtinimas. + +Pilnas bendravimas ir integracija +Žinučių siuntimas, balso ir vaizdo skambučiai, failų ir ekrano bendrinimas ir daugybė integracijų, robotų ir valdiklių. Kurkite kambarius, bendruomenes, palaikykite ryšį ir atlikite darbus. + +Tęskite darbą ten, kur baigėte +Palaikykite ryšį, kad ir kur būtumėte, naudodami visiškai sinchronizuotą žinučių istoriją visuose įrenginiuose ir internete adresu https://app.element.io + +Atviras kodas +Element Android yra atvirojo kodo projektas, kurį talpina GitHub. Praneškite apie klaidas ir (arba) prisidėkite prie jo kūrimo adresu https://github.com/vector-im/element-android diff --git a/fastlane/metadata/android/lt/short_description.txt b/fastlane/metadata/android/lt/short_description.txt new file mode 100644 index 0000000000..600e76b35d --- /dev/null +++ b/fastlane/metadata/android/lt/short_description.txt @@ -0,0 +1 @@ +Grupiniai pokalbiai - šifruotos žinutės ir vaizdo skambučiai diff --git a/fastlane/metadata/android/lt/title.txt b/fastlane/metadata/android/lt/title.txt new file mode 100644 index 0000000000..d911c34bb2 --- /dev/null +++ b/fastlane/metadata/android/lt/title.txt @@ -0,0 +1 @@ +Element - Saugūs pokalbiai From af7938432bb9628fb6f654379be10420f6ff042f Mon Sep 17 00:00:00 2001 From: Szimszon Date: Sun, 18 Sep 2022 07:15:28 +0000 Subject: [PATCH 050/131] Translated using Weblate (Hungarian) Currently translated at 100.0% (2386 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- .../ui-strings/src/main/res/values-hu/strings.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index 5de54f8ae8..5c92b1ace7 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -2620,7 +2620,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Munkamenetek Nyitott területek listája Új beszélgetés vagy szoba létrehozása - Résztvevők + Emberek Kedvencek Olvasatlan Mind @@ -2661,4 +2661,14 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze %s összezárása %s kinyitása Tér cseréje + A visszajelzési lehetőségekhez koppint jobb felső sarokba. + + Fontold meg, hogy a régi már nem használt (%1$d napja vagy régebben) munkamenetből kijelentkezel. + Fontold meg, hogy a régi már nem használt (%1$d napja vagy régebben) munkamenetből kijelentkezel. + + + %1$d+ napja inaktív (%2$s) + %1$d+ napja inaktív (%2$s) + + Itt láthatók a meghívók és elvégzendő műveletek. \ No newline at end of file From c91ba06285419c2122ce2c7fa539531593e9bb4c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 19 Sep 2022 10:50:15 +0200 Subject: [PATCH 051/131] Fix lint warnings, some code has vanished dur to the rebasing of the branch... --- vector-app/src/main/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vector-app/src/main/AndroidManifest.xml b/vector-app/src/main/AndroidManifest.xml index bff594c0de..2767b20404 100644 --- a/vector-app/src/main/AndroidManifest.xml +++ b/vector-app/src/main/AndroidManifest.xml @@ -6,6 +6,8 @@ Date: Mon, 19 Sep 2022 11:56:40 +0200 Subject: [PATCH 052/131] Move xml resource in the module where they are used to avoid lint false positive `UnusedResources` issues. --- {vector => vector-app}/src/main/res/xml/backup_rules.xml | 0 {vector => vector-app}/src/main/res/xml/data_extraction_rules.xml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {vector => vector-app}/src/main/res/xml/backup_rules.xml (100%) rename {vector => vector-app}/src/main/res/xml/data_extraction_rules.xml (100%) diff --git a/vector/src/main/res/xml/backup_rules.xml b/vector-app/src/main/res/xml/backup_rules.xml similarity index 100% rename from vector/src/main/res/xml/backup_rules.xml rename to vector-app/src/main/res/xml/backup_rules.xml diff --git a/vector/src/main/res/xml/data_extraction_rules.xml b/vector-app/src/main/res/xml/data_extraction_rules.xml similarity index 100% rename from vector/src/main/res/xml/data_extraction_rules.xml rename to vector-app/src/main/res/xml/data_extraction_rules.xml From 81beccdd8e8d123106c581230166a2729e6526e4 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Wed, 14 Sep 2022 10:59:29 +0200 Subject: [PATCH 053/131] Adding changelog entry --- changelog.d/7114.wip | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7114.wip diff --git a/changelog.d/7114.wip b/changelog.d/7114.wip new file mode 100644 index 0000000000..d5bd584feb --- /dev/null +++ b/changelog.d/7114.wip @@ -0,0 +1 @@ +[Device management] Verify a session From 5759a0f7da39c55dc4507e8da6508fb66309d43e Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Wed, 14 Sep 2022 11:14:53 +0200 Subject: [PATCH 054/131] Adding click listeners on verify button --- .../settings/devices/v2/VectorSettingsDevicesFragment.kt | 3 +++ .../features/settings/devices/v2/list/SessionInfoView.kt | 1 + .../devices/v2/overview/SessionOverviewFragment.kt | 7 +++++++ 3 files changed, 11 insertions(+) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt index 1e91384c3a..01d87b4142 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt @@ -227,6 +227,9 @@ class VectorSettingsDevicesFragment : views.deviceListCurrentSession.viewDetailsButton.debouncedClicks { currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) } } + views.deviceListCurrentSession.viewVerifyButton.debouncedClicks { + // TODO show bottom Sheet verification process + } } ?: run { hideCurrentSessionView() } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt index 555d216dfc..38bc0cb5d8 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt @@ -49,6 +49,7 @@ class SessionInfoView @JvmOverloads constructor( } val viewDetailsButton = views.sessionInfoViewDetailsButton + val viewVerifyButton = views.sessionInfoVerifySessionButton fun render( sessionInfoViewState: SessionInfoViewState, diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt index 3fea7a9316..ed8ec1a55f 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt @@ -81,6 +81,7 @@ class SessionOverviewFragment : override fun invalidate() = withState(viewModel) { state -> updateToolbar(state.isCurrentSession) + updateVerifyButton() updateEntryDetails(state.deviceId) if (state.deviceInfo is Success) { renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke()) @@ -96,6 +97,12 @@ class SessionOverviewFragment : ?.setTitle(titleResId) } + private fun updateVerifyButton() { + views.sessionOverviewInfo.viewVerifyButton.debouncedClicks { + // TODO show bottom Sheet verification process + } + } + private fun updateEntryDetails(deviceId: String) { views.sessionOverviewEntryDetails.setOnClickListener { viewNavigator.navigateToSessionDetails(requireContext(), deviceId) From 8cd7b0744ae3db7f945220141223639cb64717a6 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Wed, 14 Sep 2022 15:50:11 +0200 Subject: [PATCH 055/131] Verification process for the current Session --- .../settings/devices/v2/DevicesAction.kt | 1 + .../settings/devices/v2/DevicesViewModel.kt | 17 +++++++ .../v2/VectorSettingsDevicesFragment.kt | 2 +- ...eckIfCurrentSessionCanBeVerifiedUseCase.kt | 48 +++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCase.kt diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesAction.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesAction.kt index 8c7718bfcf..c7437db44c 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesAction.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesAction.kt @@ -20,5 +20,6 @@ import im.vector.app.core.platform.VectorViewModelAction import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo sealed class DevicesAction : VectorViewModelAction { + object VerifyCurrentSession : DevicesAction() data class MarkAsManuallyVerified(val cryptoDeviceInfo: CryptoDeviceInfo) : DevicesAction() } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt index 9c1b70a7e2..44dc599765 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt @@ -25,6 +25,7 @@ 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.features.settings.devices.v2.filter.DeviceManagerFilterType +import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch @@ -37,6 +38,7 @@ class DevicesViewModel @AssistedInject constructor( private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase, private val refreshDevicesOnCryptoDevicesChangeUseCase: RefreshDevicesOnCryptoDevicesChangeUseCase, refreshDevicesUseCase: RefreshDevicesUseCase, + private val checkIfCurrentSessionCanBeVerifiedUseCase: CheckIfCurrentSessionCanBeVerifiedUseCase, ) : VectorSessionsListViewModel(initialState, activeSessionHolder, refreshDevicesUseCase) { @AssistedFactory @@ -94,10 +96,25 @@ class DevicesViewModel @AssistedInject constructor( override fun handle(action: DevicesAction) { when (action) { + is DevicesAction.VerifyCurrentSession -> handleVerifyCurrentSessionAction() is DevicesAction.MarkAsManuallyVerified -> handleMarkAsManuallyVerifiedAction() } } + // TODO add unit tests + private fun handleVerifyCurrentSessionAction() { + viewModelScope.launch { + val currentSessionCanBeVerified = checkIfCurrentSessionCanBeVerifiedUseCase.execute() + if (currentSessionCanBeVerified) { + activeSessionHolder.getSafeActiveSession()?.let { session -> + _viewEvents.post(DevicesViewEvent.SelfVerification(session)) + } + } else { + _viewEvents.post(DevicesViewEvent.PromptResetSecrets) + } + } + } + private fun handleMarkAsManuallyVerifiedAction() { // TODO implement when needed } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt index 01d87b4142..3713357b19 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt @@ -228,7 +228,7 @@ class VectorSettingsDevicesFragment : currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) } } views.deviceListCurrentSession.viewVerifyButton.debouncedClicks { - // TODO show bottom Sheet verification process + viewModel.handle(DevicesAction.VerifyCurrentSession) } } ?: run { hideCurrentSessionView() diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCase.kt new file mode 100644 index 0000000000..36e4e981df --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCase.kt @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.devices.v2.verification + +import im.vector.app.core.di.ActiveSessionHolder +import kotlinx.coroutines.flow.firstOrNull +import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.flow.flow +import timber.log.Timber +import javax.inject.Inject + +// TODO add unit tests +class CheckIfCurrentSessionCanBeVerifiedUseCase @Inject constructor( + private val activeSessionHolder: ActiveSessionHolder, +) { + + suspend fun execute(): Boolean { + val session = activeSessionHolder.getSafeActiveSession() + val cryptoSessionsCount = session?.flow() + ?.liveUserCryptoDevices(session.myUserId) + ?.firstOrNull() + ?.size + ?: 0 + val hasOtherSessions = cryptoSessionsCount > 1 + + val isRecoverySetup = session + ?.sharedSecretStorageService() + ?.isRecoverySetup() + .orFalse() + + Timber.d("hasOtherSessions=$hasOtherSessions (otherSessionsCount=$cryptoSessionsCount), isRecoverySetup=$isRecoverySetup") + return hasOtherSessions || isRecoverySetup + } +} From d8263277731ded17ac8fb1fff9135aef5d413f28 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Wed, 14 Sep 2022 17:08:27 +0200 Subject: [PATCH 056/131] Adding unit tests for CheckIfCurrentSessionCanBeVerifiedUseCase --- ...eckIfCurrentSessionCanBeVerifiedUseCase.kt | 1 - .../devices/v2/DevicesViewModelTest.kt | 3 + ...fCurrentSessionCanBeVerifiedUseCaseTest.kt | 124 ++++++++++++++++++ .../fakes/FakeSharedSecretStorageService.kt | 8 +- 4 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCaseTest.kt diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCase.kt index 36e4e981df..3fdef1a98f 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCase.kt @@ -23,7 +23,6 @@ import org.matrix.android.sdk.flow.flow import timber.log.Timber import javax.inject.Inject -// TODO add unit tests class CheckIfCurrentSessionCanBeVerifiedUseCase @Inject constructor( private val activeSessionHolder: ActiveSessionHolder, ) { diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt index 351d6b8eb0..d9a64c82ef 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt @@ -18,6 +18,7 @@ package im.vector.app.features.settings.devices.v2 import com.airbnb.mvrx.Success import com.airbnb.mvrx.test.MvRxTestRule +import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeVerificationService import im.vector.app.test.test @@ -45,6 +46,7 @@ class DevicesViewModelTest { private val getDeviceFullInfoListUseCase = mockk() private val refreshDevicesUseCase = mockk() private val refreshDevicesOnCryptoDevicesChangeUseCase = mockk() + private val checkIfCurrentSessionCanBeVerifiedUseCase = mockk() private fun createViewModel(): DevicesViewModel { return DevicesViewModel( @@ -54,6 +56,7 @@ class DevicesViewModelTest { getDeviceFullInfoListUseCase, refreshDevicesOnCryptoDevicesChangeUseCase, refreshDevicesUseCase, + checkIfCurrentSessionCanBeVerifiedUseCase, ) } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCaseTest.kt new file mode 100644 index 0000000000..22bc0edae1 --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/CheckIfCurrentSessionCanBeVerifiedUseCaseTest.kt @@ -0,0 +1,124 @@ +/* + * 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.settings.devices.v2.verification + +import im.vector.app.test.fakes.FakeActiveSessionHolder +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkStatic +import io.mockk.unmockkAll +import io.mockk.verify +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.test.runTest +import org.amshove.kluent.shouldBeEqualTo +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import org.matrix.android.sdk.flow.FlowSession +import org.matrix.android.sdk.flow.flow + +class CheckIfCurrentSessionCanBeVerifiedUseCaseTest { + + private val fakeActiveSessionHolder = FakeActiveSessionHolder() + + private val checkIfCurrentSessionCanBeVerifiedUseCase = CheckIfCurrentSessionCanBeVerifiedUseCase( + activeSessionHolder = fakeActiveSessionHolder.instance + ) + + @Before + fun setUp() { + mockkStatic("org.matrix.android.sdk.flow.FlowSessionKt") + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun `given there are other sessions when checking if session can be verified then result is true`() = runTest { + // Given + val device1 = givenACryptoDevice() + val device2 = givenACryptoDevice() + val devices = listOf(device1, device2) + val fakeSession = fakeActiveSessionHolder.fakeSession + val flowSession = mockk() + every { fakeSession.flow() } returns flowSession + every { flowSession.liveUserCryptoDevices(any()) } returns flowOf(devices) + + fakeSession.fakeSharedSecretStorageService.givenIsRecoverySetupReturns(false) + + // When + val result = checkIfCurrentSessionCanBeVerifiedUseCase.execute() + + // Then + result shouldBeEqualTo true + verify { + flowSession.liveUserCryptoDevices(fakeSession.myUserId) + fakeSession.fakeSharedSecretStorageService.isRecoverySetup() + } + } + + @Test + fun `given recovery is setup when checking if session can be verified then result is true`() = runTest { + // Given + val device1 = givenACryptoDevice() + val devices = listOf(device1) + val fakeSession = fakeActiveSessionHolder.fakeSession + val flowSession = mockk() + every { fakeSession.flow() } returns flowSession + every { flowSession.liveUserCryptoDevices(any()) } returns flowOf(devices) + + fakeSession.fakeSharedSecretStorageService.givenIsRecoverySetupReturns(true) + + // When + val result = checkIfCurrentSessionCanBeVerifiedUseCase.execute() + + // Then + result shouldBeEqualTo true + verify { + flowSession.liveUserCryptoDevices(fakeSession.myUserId) + fakeSession.fakeSharedSecretStorageService.isRecoverySetup() + } + } + + @Test + fun `given recovery is not setup and there are no other sessions when checking if session can be verified then result is false`() = runTest { + // Given + val device1 = givenACryptoDevice() + val devices = listOf(device1) + val fakeSession = fakeActiveSessionHolder.fakeSession + val flowSession = mockk() + every { fakeSession.flow() } returns flowSession + every { flowSession.liveUserCryptoDevices(any()) } returns flowOf(devices) + + fakeSession.fakeSharedSecretStorageService.givenIsRecoverySetupReturns(false) + + // When + val result = checkIfCurrentSessionCanBeVerifiedUseCase.execute() + + // Then + result shouldBeEqualTo false + verify { + flowSession.liveUserCryptoDevices(fakeSession.myUserId) + fakeSession.fakeSharedSecretStorageService.isRecoverySetup() + } + } + + private fun givenACryptoDevice(): CryptoDeviceInfo = mockk() +} diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeSharedSecretStorageService.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeSharedSecretStorageService.kt index 6ec9a4b593..1dc36de709 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeSharedSecretStorageService.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeSharedSecretStorageService.kt @@ -16,6 +16,8 @@ package im.vector.app.test.fakes +import io.mockk.every +import io.mockk.mockk import org.matrix.android.sdk.api.listeners.ProgressListener import org.matrix.android.sdk.api.session.securestorage.IntegrityResult import org.matrix.android.sdk.api.session.securestorage.KeyInfoResult @@ -26,7 +28,7 @@ import org.matrix.android.sdk.api.session.securestorage.SharedSecretStorageServi import org.matrix.android.sdk.api.session.securestorage.SsssKeyCreationInfo import org.matrix.android.sdk.api.session.securestorage.SsssKeySpec -class FakeSharedSecretStorageService : SharedSecretStorageService { +class FakeSharedSecretStorageService : SharedSecretStorageService by mockk() { var integrityResult: IntegrityResult = IntegrityResult.Error(SharedSecretStorageError.OtherError(IllegalStateException())) var _defaultKey: KeyInfoResult = KeyInfoResult.Error(SharedSecretStorageError.OtherError(IllegalStateException())) @@ -76,4 +78,8 @@ class FakeSharedSecretStorageService : SharedSecretStorageService { override suspend fun requestSecret(name: String, myOtherDeviceId: String) { TODO("Not yet implemented") } + + fun givenIsRecoverySetupReturns(isRecoverySetup: Boolean) { + every { isRecoverySetup() } returns isRecoverySetup + } } From 35db958279e51ec2599bb84a7410995f00c5cd8c Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Wed, 14 Sep 2022 17:39:41 +0200 Subject: [PATCH 057/131] Adding unit tests for new action in DevicesViewModel --- .../settings/devices/v2/DevicesViewModel.kt | 1 - .../devices/v2/DevicesViewModelTest.kt | 48 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt index 44dc599765..5667b1cc57 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt @@ -101,7 +101,6 @@ class DevicesViewModel @AssistedInject constructor( } } - // TODO add unit tests private fun handleVerifyCurrentSessionAction() { viewModelScope.launch { val currentSessionCanBeVerified = checkIfCurrentSessionCanBeVerifiedUseCase.execute() diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt index d9a64c82ef..18796191af 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt @@ -145,6 +145,54 @@ class DevicesViewModelTest { coVerify { refreshDevicesOnCryptoDevicesChangeUseCase.execute() } } + @Test + fun `given current session can be verified when handling verify current session action then self verification event is posted`() { + // Given + givenVerificationService() + givenCurrentSessionCrossSigningInfo() + givenDeviceFullInfoList() + givenRefreshDevicesOnCryptoDevicesChange() + val verifyCurrentSessionAction = DevicesAction.VerifyCurrentSession + coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns true + + // When + val viewModel = createViewModel() + val viewModelTest = viewModel.test() + viewModel.handle(verifyCurrentSessionAction) + + // Then + viewModelTest + .assertEvent { it is DevicesViewEvent.SelfVerification } + .finish() + coVerify { + checkIfCurrentSessionCanBeVerifiedUseCase.execute() + } + } + + @Test + fun `given current session cannot be verified when handling verify current session action then reset secrets event is posted`() { + // Given + givenVerificationService() + givenCurrentSessionCrossSigningInfo() + givenDeviceFullInfoList() + givenRefreshDevicesOnCryptoDevicesChange() + val verifyCurrentSessionAction = DevicesAction.VerifyCurrentSession + coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns false + + // When + val viewModel = createViewModel() + val viewModelTest = viewModel.test() + viewModel.handle(verifyCurrentSessionAction) + + // Then + viewModelTest + .assertEvent { it is DevicesViewEvent.PromptResetSecrets } + .finish() + coVerify { + checkIfCurrentSessionCanBeVerifiedUseCase.execute() + } + } + private fun givenVerificationService(): FakeVerificationService { val fakeVerificationService = fakeActiveSessionHolder .fakeSession From 32b560649844636f6830e7c48abed34df0292891 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Thu, 15 Sep 2022 11:03:01 +0200 Subject: [PATCH 058/131] Fixing missing event to start verification process --- .../features/settings/devices/VectorSettingsDevicesFragment.kt | 3 +-- .../settings/devices/v2/VectorSettingsDevicesFragment.kt | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) 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 5b19b7a8d2..135c684e76 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 @@ -85,8 +85,7 @@ class VectorSettingsDevicesFragment : ).show(childFragmentManager, "REQPOP") } is DevicesViewEvents.SelfVerification -> { - VerificationBottomSheet.forSelfVerification(it.session) - .show(childFragmentManager, "REQPOP") + navigator.requestSelfSessionVerification(requireActivity()) } is DevicesViewEvents.ShowManuallyVerify -> { ManuallyVerifyDialog.show(requireActivity(), it.cryptoDeviceInfo) { diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt index 3713357b19..7cfa218bf0 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt @@ -101,8 +101,7 @@ class VectorSettingsDevicesFragment : ).show(childFragmentManager, "REQPOP") } is DevicesViewEvent.SelfVerification -> { - VerificationBottomSheet.forSelfVerification(it.session) - .show(childFragmentManager, "REQPOP") + navigator.requestSelfSessionVerification(requireActivity()) } is DevicesViewEvent.ShowManuallyVerify -> { ManuallyVerifyDialog.show(requireActivity(), it.cryptoDeviceInfo) { From fa990351afa08d7a845d90dc3c8db659cea9da91 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Thu, 15 Sep 2022 14:00:08 +0200 Subject: [PATCH 059/131] Editing changelog entry --- changelog.d/7114.wip | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/7114.wip b/changelog.d/7114.wip index d5bd584feb..79ad705132 100644 --- a/changelog.d/7114.wip +++ b/changelog.d/7114.wip @@ -1 +1 @@ -[Device management] Verify a session +[Device management] Verify current session From 584c6994099b093da8ecaf8b7ae259d1d4ecb153 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Thu, 15 Sep 2022 14:42:22 +0200 Subject: [PATCH 060/131] Verify current session in Session overview screen --- .../devices/v2/IsCurrentSessionUseCase.kt | 30 +++++++ .../v2/overview/SessionOverviewAction.kt | 4 +- .../v2/overview/SessionOverviewFragment.kt | 21 ++++- .../v2/overview/SessionOverviewViewEvent.kt | 25 ++++++ .../v2/overview/SessionOverviewViewModel.kt | 43 ++++++++-- .../devices/v2/IsCurrentSessionUseCaseTest.kt | 82 +++++++++++++++++++ .../overview/SessionOverviewViewModelTest.kt | 77 +++++++++++++---- 7 files changed, 256 insertions(+), 26 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCase.kt create mode 100644 vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt create mode 100644 vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCase.kt new file mode 100644 index 0000000000..885908120a --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCase.kt @@ -0,0 +1,30 @@ +/* + * 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.settings.devices.v2 + +import im.vector.app.core.di.ActiveSessionHolder +import javax.inject.Inject + +class IsCurrentSessionUseCase @Inject constructor( + private val activeSessionHolder: ActiveSessionHolder, +) { + + fun execute(deviceId: String): Boolean { + val currentDeviceId = activeSessionHolder.getSafeActiveSession()?.sessionParams?.deviceId.orEmpty() + return deviceId.isNotEmpty() && deviceId == currentDeviceId + } +} diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewAction.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewAction.kt index c028c08ec4..0e923b4c9b 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewAction.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewAction.kt @@ -18,4 +18,6 @@ package im.vector.app.features.settings.devices.v2.overview import im.vector.app.core.platform.VectorViewModelAction -sealed class SessionOverviewAction : VectorViewModelAction +sealed class SessionOverviewAction : VectorViewModelAction { + data class VerifySession(val deviceId: String) : SessionOverviewAction() +} diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt index ed8ec1a55f..98f4eb823b 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt @@ -34,6 +34,7 @@ import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.DrawableProvider import im.vector.app.databinding.FragmentSessionOverviewBinding +import im.vector.app.features.crypto.recover.SetupMode import im.vector.app.features.settings.devices.v2.DeviceFullInfo import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState import javax.inject.Inject @@ -62,6 +63,7 @@ class SessionOverviewFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initSessionInfoView() + observeViewEvents() } private fun initSessionInfoView() { @@ -70,6 +72,19 @@ class SessionOverviewFragment : } } + private fun observeViewEvents() { + viewModel.observeViewEvents { + when (it) { + is SessionOverviewViewEvent.SelfVerification -> { + navigator.requestSelfSessionVerification(requireActivity()) + } + is SessionOverviewViewEvent.PromptResetSecrets -> { + navigator.open4SSetup(requireActivity(), SetupMode.PASSPHRASE_AND_NEEDED_SECRETS_RESET) + } + } + } + } + override fun onDestroyView() { cleanUpSessionInfoView() super.onDestroyView() @@ -81,7 +96,7 @@ class SessionOverviewFragment : override fun invalidate() = withState(viewModel) { state -> updateToolbar(state.isCurrentSession) - updateVerifyButton() + updateVerifyButton(state.deviceId) updateEntryDetails(state.deviceId) if (state.deviceInfo is Success) { renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke()) @@ -97,9 +112,9 @@ class SessionOverviewFragment : ?.setTitle(titleResId) } - private fun updateVerifyButton() { + private fun updateVerifyButton(deviceId: String) { views.sessionOverviewInfo.viewVerifyButton.debouncedClicks { - // TODO show bottom Sheet verification process + viewModel.handle(SessionOverviewAction.VerifySession(deviceId)) } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt new file mode 100644 index 0000000000..3b1ee2609e --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt @@ -0,0 +1,25 @@ +/* + * 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.settings.devices.v2.overview + +import im.vector.app.core.platform.VectorViewEvents +import org.matrix.android.sdk.api.session.Session + +sealed class SessionOverviewViewEvent : VectorViewEvents { + data class SelfVerification(val session: Session) : SessionOverviewViewEvent() + object PromptResetSecrets : SessionOverviewViewEvent() +} diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index bdcdc40c56..32c6aed541 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -21,19 +21,23 @@ import com.airbnb.mvrx.Success import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory -import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.settings.devices.v2.IsCurrentSessionUseCase +import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import org.matrix.android.sdk.api.session.Session +import kotlinx.coroutines.launch class SessionOverviewViewModel @AssistedInject constructor( @Assisted val initialState: SessionOverviewViewState, - session: Session, + private val activeSessionHolder: ActiveSessionHolder, + private val isCurrentSessionUseCase: IsCurrentSessionUseCase, private val getDeviceFullInfoUseCase: GetDeviceFullInfoUseCase, -) : VectorViewModel(initialState) { + private val checkIfCurrentSessionCanBeVerifiedUseCase: CheckIfCurrentSessionCanBeVerifiedUseCase, +) : VectorViewModel(initialState) { companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() @@ -43,14 +47,16 @@ class SessionOverviewViewModel @AssistedInject constructor( } init { - val currentDeviceId = session.sessionParams.deviceId.orEmpty() setState { - copy(isCurrentSession = deviceId.isNotEmpty() && deviceId == currentDeviceId) + copy(isCurrentSession = isCurrentSession(deviceId)) } - observeSessionInfo(initialState.deviceId) } + private fun isCurrentSession(deviceId: String): Boolean { + return isCurrentSessionUseCase.execute(deviceId) + } + private fun observeSessionInfo(deviceId: String) { getDeviceFullInfoUseCase.execute(deviceId) .onEach { setState { copy(deviceInfo = Success(it)) } } @@ -58,6 +64,27 @@ class SessionOverviewViewModel @AssistedInject constructor( } override fun handle(action: SessionOverviewAction) { - TODO("Implement when adding the first action") + when (action) { + is SessionOverviewAction.VerifySession -> handleVerifySessionAction(action) + } + } + + private fun handleVerifySessionAction(verifySession: SessionOverviewAction.VerifySession) { + if (isCurrentSession(verifySession.deviceId)) { + handleVerifyCurrentSession() + } + } + + private fun handleVerifyCurrentSession() { + viewModelScope.launch { + val currentSessionCanBeVerified = checkIfCurrentSessionCanBeVerifiedUseCase.execute() + if (currentSessionCanBeVerified) { + activeSessionHolder.getSafeActiveSession()?.let { session -> + _viewEvents.post(SessionOverviewViewEvent.SelfVerification(session)) + } + } else { + _viewEvents.post(SessionOverviewViewEvent.PromptResetSecrets) + } + } } } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt new file mode 100644 index 0000000000..25cd150b21 --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt @@ -0,0 +1,82 @@ +/* + * 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.settings.devices.v2 + +import im.vector.app.test.fakes.FakeActiveSessionHolder +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import org.amshove.kluent.shouldBe +import org.junit.Test +import org.matrix.android.sdk.api.auth.data.SessionParams + +private const val A_SESSION_ID_1 = "session-id-1" +private const val A_SESSION_ID_2 = "session-id-2" + +class IsCurrentSessionUseCaseTest { + + private val fakeActiveSessionHolder = FakeActiveSessionHolder() + + private val isCurrentSessionUseCase = IsCurrentSessionUseCase( + activeSessionHolder = fakeActiveSessionHolder.instance, + ) + + @Test + fun `given the session id of the current session when checking if id is current session then result is true`() { + // Given + val sessionParams = givenIdForCurrentSession(A_SESSION_ID_1) + + // When + val result = isCurrentSessionUseCase.execute(A_SESSION_ID_1) + + // Then + result shouldBe true + verify { sessionParams.deviceId } + } + + @Test + fun `given a session id different from the current session id when checking if id is current session then result is false`() { + // Given + val sessionParams = givenIdForCurrentSession(A_SESSION_ID_1) + + // When + val result = isCurrentSessionUseCase.execute(A_SESSION_ID_2) + + // Then + result shouldBe false + verify { sessionParams.deviceId } + } + + @Test + fun `given no current active session when checking if id is current session then result is false`() { + // Given + fakeActiveSessionHolder.givenGetSafeActiveSessionReturns(null) + + // When + val result = isCurrentSessionUseCase.execute(A_SESSION_ID_1) + + // Then + result shouldBe false + } + + private fun givenIdForCurrentSession(deviceId: String): SessionParams { + val sessionParams = mockk() + every { sessionParams.deviceId } returns deviceId + fakeActiveSessionHolder.fakeSession.givenSessionParams(sessionParams) + return sessionParams + } +} diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt index 8d4e49ef85..1fb14f678b 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt @@ -19,16 +19,19 @@ package im.vector.app.features.settings.devices.v2.overview import com.airbnb.mvrx.Success import com.airbnb.mvrx.test.MvRxTestRule import im.vector.app.features.settings.devices.v2.DeviceFullInfo -import im.vector.app.test.fakes.FakeSession +import im.vector.app.features.settings.devices.v2.IsCurrentSessionUseCase +import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase +import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.test import im.vector.app.test.testDispatcher +import io.mockk.coEvery +import io.mockk.coVerify import io.mockk.every import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.flow.flowOf import org.junit.Rule import org.junit.Test -import org.matrix.android.sdk.api.auth.data.SessionParams private const val A_SESSION_ID = "session-id" @@ -40,24 +43,29 @@ class SessionOverviewViewModelTest { private val args = SessionOverviewArgs( deviceId = A_SESSION_ID ) - private val fakeSession = FakeSession() + private val fakeActiveSessionHolder = FakeActiveSessionHolder() + private val isCurrentSessionUseCase = mockk() private val getDeviceFullInfoUseCase = mockk() + private val checkIfCurrentSessionCanBeVerifiedUseCase = mockk() private fun createViewModel() = SessionOverviewViewModel( initialState = SessionOverviewViewState(args), - session = fakeSession, - getDeviceFullInfoUseCase = getDeviceFullInfoUseCase + activeSessionHolder = fakeActiveSessionHolder.instance, + isCurrentSessionUseCase = isCurrentSessionUseCase, + getDeviceFullInfoUseCase = getDeviceFullInfoUseCase, + checkIfCurrentSessionCanBeVerifiedUseCase = checkIfCurrentSessionCanBeVerifiedUseCase, ) @Test fun `given the viewModel has been initialized then viewState is updated with session info`() { // Given - val sessionParams = givenIdForSession(A_SESSION_ID) val deviceFullInfo = mockk() every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + val isCurrentSession = true + every { isCurrentSessionUseCase.execute(any()) } returns isCurrentSession val expectedState = SessionOverviewViewState( deviceId = A_SESSION_ID, - isCurrentSession = true, + isCurrentSession = isCurrentSession, deviceInfo = Success(deviceFullInfo) ) @@ -68,14 +76,55 @@ class SessionOverviewViewModelTest { viewModel.test() .assertLatestState { state -> state == expectedState } .finish() - verify { sessionParams.deviceId } - verify { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } + verify { + isCurrentSessionUseCase.execute(A_SESSION_ID) + getDeviceFullInfoUseCase.execute(A_SESSION_ID) + } } - private fun givenIdForSession(deviceId: String): SessionParams { - val sessionParams = mockk() - every { sessionParams.deviceId } returns deviceId - fakeSession.givenSessionParams(sessionParams) - return sessionParams + @Test + fun `given current session can be verified when handling verify current session action then self verification event is posted`() { + // Given + val deviceFullInfo = mockk() + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { isCurrentSessionUseCase.execute(any()) } returns true + val verifySessionAction = SessionOverviewAction.VerifySession(A_SESSION_ID) + coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns true + + // When + val viewModel = createViewModel() + val viewModelTest = viewModel.test() + viewModel.handle(verifySessionAction) + + // Then + viewModelTest + .assertEvent { it is SessionOverviewViewEvent.SelfVerification } + .finish() + coVerify { + checkIfCurrentSessionCanBeVerifiedUseCase.execute() + } + } + + @Test + fun `given current session cannot be verified when handling verify current session action then reset secrets event is posted`() { + // Given + val deviceFullInfo = mockk() + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { isCurrentSessionUseCase.execute(any()) } returns true + val verifySessionAction = SessionOverviewAction.VerifySession(A_SESSION_ID) + coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns false + + // When + val viewModel = createViewModel() + val viewModelTest = viewModel.test() + viewModel.handle(verifySessionAction) + + // Then + viewModelTest + .assertEvent { it is SessionOverviewViewEvent.PromptResetSecrets } + .finish() + coVerify { + checkIfCurrentSessionCanBeVerifiedUseCase.execute() + } } } From e0c4706cf956a8056863b42a1c041ffa20c0da52 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Mon, 19 Sep 2022 09:39:30 +0200 Subject: [PATCH 061/131] Removing non necessary session arg from ViewEvent --- .../app/features/settings/devices/v2/DevicesViewEvent.kt | 3 +-- .../app/features/settings/devices/v2/DevicesViewModel.kt | 4 +--- .../devices/v2/overview/SessionOverviewViewEvent.kt | 3 +-- .../devices/v2/overview/SessionOverviewViewModel.kt | 6 +----- .../devices/v2/overview/SessionOverviewViewModelTest.kt | 3 --- 5 files changed, 4 insertions(+), 15 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewEvent.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewEvent.kt index e83004843d..c78c20f792 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewEvent.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewEvent.kt @@ -18,7 +18,6 @@ package im.vector.app.features.settings.devices.v2 import im.vector.app.core.platform.VectorViewEvents import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse -import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo @@ -28,7 +27,7 @@ sealed class DevicesViewEvent : VectorViewEvents { data class RequestReAuth(val registrationFlowResponse: RegistrationFlowResponse, val lastErrorCode: String?) : DevicesViewEvent() data class PromptRenameDevice(val deviceInfo: DeviceInfo) : DevicesViewEvent() data class ShowVerifyDevice(val userId: String, val transactionId: String?) : DevicesViewEvent() - data class SelfVerification(val session: Session) : DevicesViewEvent() + object SelfVerification : DevicesViewEvent() data class ShowManuallyVerify(val cryptoDeviceInfo: CryptoDeviceInfo) : DevicesViewEvent() object PromptResetSecrets : DevicesViewEvent() } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt index 5667b1cc57..730400bfcf 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt @@ -105,9 +105,7 @@ class DevicesViewModel @AssistedInject constructor( viewModelScope.launch { val currentSessionCanBeVerified = checkIfCurrentSessionCanBeVerifiedUseCase.execute() if (currentSessionCanBeVerified) { - activeSessionHolder.getSafeActiveSession()?.let { session -> - _viewEvents.post(DevicesViewEvent.SelfVerification(session)) - } + _viewEvents.post(DevicesViewEvent.SelfVerification) } else { _viewEvents.post(DevicesViewEvent.PromptResetSecrets) } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt index 3b1ee2609e..83d438ecb4 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt @@ -17,9 +17,8 @@ package im.vector.app.features.settings.devices.v2.overview import im.vector.app.core.platform.VectorViewEvents -import org.matrix.android.sdk.api.session.Session sealed class SessionOverviewViewEvent : VectorViewEvents { - data class SelfVerification(val session: Session) : SessionOverviewViewEvent() + object SelfVerification : SessionOverviewViewEvent() object PromptResetSecrets : SessionOverviewViewEvent() } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index 32c6aed541..5b51483afe 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -21,7 +21,6 @@ import com.airbnb.mvrx.Success import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject -import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel @@ -33,7 +32,6 @@ import kotlinx.coroutines.launch class SessionOverviewViewModel @AssistedInject constructor( @Assisted val initialState: SessionOverviewViewState, - private val activeSessionHolder: ActiveSessionHolder, private val isCurrentSessionUseCase: IsCurrentSessionUseCase, private val getDeviceFullInfoUseCase: GetDeviceFullInfoUseCase, private val checkIfCurrentSessionCanBeVerifiedUseCase: CheckIfCurrentSessionCanBeVerifiedUseCase, @@ -79,9 +77,7 @@ class SessionOverviewViewModel @AssistedInject constructor( viewModelScope.launch { val currentSessionCanBeVerified = checkIfCurrentSessionCanBeVerifiedUseCase.execute() if (currentSessionCanBeVerified) { - activeSessionHolder.getSafeActiveSession()?.let { session -> - _viewEvents.post(SessionOverviewViewEvent.SelfVerification(session)) - } + _viewEvents.post(SessionOverviewViewEvent.SelfVerification) } else { _viewEvents.post(SessionOverviewViewEvent.PromptResetSecrets) } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt index 1fb14f678b..f25c25bb8e 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt @@ -21,7 +21,6 @@ import com.airbnb.mvrx.test.MvRxTestRule import im.vector.app.features.settings.devices.v2.DeviceFullInfo import im.vector.app.features.settings.devices.v2.IsCurrentSessionUseCase import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase -import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.test import im.vector.app.test.testDispatcher import io.mockk.coEvery @@ -43,14 +42,12 @@ class SessionOverviewViewModelTest { private val args = SessionOverviewArgs( deviceId = A_SESSION_ID ) - private val fakeActiveSessionHolder = FakeActiveSessionHolder() private val isCurrentSessionUseCase = mockk() private val getDeviceFullInfoUseCase = mockk() private val checkIfCurrentSessionCanBeVerifiedUseCase = mockk() private fun createViewModel() = SessionOverviewViewModel( initialState = SessionOverviewViewState(args), - activeSessionHolder = fakeActiveSessionHolder.instance, isCurrentSessionUseCase = isCurrentSessionUseCase, getDeviceFullInfoUseCase = getDeviceFullInfoUseCase, checkIfCurrentSessionCanBeVerifiedUseCase = checkIfCurrentSessionCanBeVerifiedUseCase, From cf6b8d76a822623d7eed51338fddb3b25b4b97ff Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Mon, 19 Sep 2022 09:44:46 +0200 Subject: [PATCH 062/131] Removing non necessary session id arg from ViewAction --- .../devices/v2/overview/SessionOverviewAction.kt | 2 +- .../v2/overview/SessionOverviewFragment.kt | 16 ++++++++-------- .../v2/overview/SessionOverviewViewModel.kt | 6 +++--- .../v2/overview/SessionOverviewViewModelTest.kt | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewAction.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewAction.kt index 0e923b4c9b..1118c5dc5b 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewAction.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewAction.kt @@ -19,5 +19,5 @@ package im.vector.app.features.settings.devices.v2.overview import im.vector.app.core.platform.VectorViewModelAction sealed class SessionOverviewAction : VectorViewModelAction { - data class VerifySession(val deviceId: String) : SessionOverviewAction() + object VerifySession : SessionOverviewAction() } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt index 98f4eb823b..4c83408fe7 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt @@ -62,8 +62,9 @@ class SessionOverviewFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initSessionInfoView() observeViewEvents() + initSessionInfoView() + initVerifyButton() } private fun initSessionInfoView() { @@ -72,6 +73,12 @@ class SessionOverviewFragment : } } + private fun initVerifyButton() { + views.sessionOverviewInfo.viewVerifyButton.debouncedClicks { + viewModel.handle(SessionOverviewAction.VerifySession) + } + } + private fun observeViewEvents() { viewModel.observeViewEvents { when (it) { @@ -96,7 +103,6 @@ class SessionOverviewFragment : override fun invalidate() = withState(viewModel) { state -> updateToolbar(state.isCurrentSession) - updateVerifyButton(state.deviceId) updateEntryDetails(state.deviceId) if (state.deviceInfo is Success) { renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke()) @@ -112,12 +118,6 @@ class SessionOverviewFragment : ?.setTitle(titleResId) } - private fun updateVerifyButton(deviceId: String) { - views.sessionOverviewInfo.viewVerifyButton.debouncedClicks { - viewModel.handle(SessionOverviewAction.VerifySession(deviceId)) - } - } - private fun updateEntryDetails(deviceId: String) { views.sessionOverviewEntryDetails.setOnClickListener { viewNavigator.navigateToSessionDetails(requireContext(), deviceId) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index 5b51483afe..bcf7542783 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -63,12 +63,12 @@ class SessionOverviewViewModel @AssistedInject constructor( override fun handle(action: SessionOverviewAction) { when (action) { - is SessionOverviewAction.VerifySession -> handleVerifySessionAction(action) + is SessionOverviewAction.VerifySession -> handleVerifySessionAction() } } - private fun handleVerifySessionAction(verifySession: SessionOverviewAction.VerifySession) { - if (isCurrentSession(verifySession.deviceId)) { + private fun handleVerifySessionAction() = withState { viewState -> + if (isCurrentSession(viewState.deviceId)) { handleVerifyCurrentSession() } } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt index f25c25bb8e..71978129d3 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt @@ -85,7 +85,7 @@ class SessionOverviewViewModelTest { val deviceFullInfo = mockk() every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) every { isCurrentSessionUseCase.execute(any()) } returns true - val verifySessionAction = SessionOverviewAction.VerifySession(A_SESSION_ID) + val verifySessionAction = SessionOverviewAction.VerifySession coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns true // When @@ -108,7 +108,7 @@ class SessionOverviewViewModelTest { val deviceFullInfo = mockk() every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) every { isCurrentSessionUseCase.execute(any()) } returns true - val verifySessionAction = SessionOverviewAction.VerifySession(A_SESSION_ID) + val verifySessionAction = SessionOverviewAction.VerifySession coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns false // When From 54a4dc7e9a794fc9f85ef61a8d027e0ca044d7c3 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Mon, 19 Sep 2022 14:46:24 +0200 Subject: [PATCH 063/131] Inverting some arguments to ease readability --- .../vector/app/features/settings/devices/v2/DevicesViewModel.kt | 2 +- .../app/features/settings/devices/v2/DevicesViewModelTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt index 730400bfcf..96d169bf02 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt @@ -37,8 +37,8 @@ class DevicesViewModel @AssistedInject constructor( private val getCurrentSessionCrossSigningInfoUseCase: GetCurrentSessionCrossSigningInfoUseCase, private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase, private val refreshDevicesOnCryptoDevicesChangeUseCase: RefreshDevicesOnCryptoDevicesChangeUseCase, - refreshDevicesUseCase: RefreshDevicesUseCase, private val checkIfCurrentSessionCanBeVerifiedUseCase: CheckIfCurrentSessionCanBeVerifiedUseCase, + refreshDevicesUseCase: RefreshDevicesUseCase, ) : VectorSessionsListViewModel(initialState, activeSessionHolder, refreshDevicesUseCase) { @AssistedFactory diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt index 18796191af..0e04c2ab51 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt @@ -55,8 +55,8 @@ class DevicesViewModelTest { getCurrentSessionCrossSigningInfoUseCase, getDeviceFullInfoListUseCase, refreshDevicesOnCryptoDevicesChangeUseCase, - refreshDevicesUseCase, checkIfCurrentSessionCanBeVerifiedUseCase, + refreshDevicesUseCase, ) } From c16e1ca2916973486f1d787f06cc1fa8630f52ca Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Thu, 15 Sep 2022 16:37:05 +0200 Subject: [PATCH 064/131] Adding changelog entry --- changelog.d/7143.wip | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7143.wip diff --git a/changelog.d/7143.wip b/changelog.d/7143.wip new file mode 100644 index 0000000000..588f7fb255 --- /dev/null +++ b/changelog.d/7143.wip @@ -0,0 +1 @@ +[Device management] Verify another session From a6cb25d0c3bfd18d659dca93f87196dbae3631a7 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Fri, 16 Sep 2022 10:10:54 +0200 Subject: [PATCH 065/131] Verification of another session --- .../devices/v2/list/SessionInfoView.kt | 8 ++++--- .../devices/v2/list/SessionInfoViewState.kt | 1 + .../v2/overview/SessionOverviewFragment.kt | 14 ++++++++++--- .../v2/overview/SessionOverviewViewEvent.kt | 3 ++- .../v2/overview/SessionOverviewViewModel.kt | 9 +++++++- .../v2/overview/SessionOverviewViewState.kt | 1 + .../overview/SessionOverviewViewModelTest.kt | 21 ++++++++++++++++++- 7 files changed, 48 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt index 38bc0cb5d8..340a4f3c3a 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt @@ -62,6 +62,7 @@ class SessionInfoView @JvmOverloads constructor( sessionInfoViewState.deviceFullInfo.roomEncryptionTrustLevel, sessionInfoViewState.isCurrentSession, sessionInfoViewState.isLearnMoreLinkVisible, + sessionInfoViewState.isVerifyButtonVisible, ) renderDeviceLastSeenDetails( sessionInfoViewState.deviceFullInfo.isInactive, @@ -78,12 +79,13 @@ class SessionInfoView @JvmOverloads constructor( encryptionTrustLevel: RoomEncryptionTrustLevel, isCurrentSession: Boolean, hasLearnMoreLink: Boolean, + isVerifyButtonVisible: Boolean, ) { views.sessionInfoVerificationStatusImageView.render(encryptionTrustLevel) if (encryptionTrustLevel == RoomEncryptionTrustLevel.Trusted) { renderCrossSigningVerified(isCurrentSession) } else { - renderCrossSigningUnverified(isCurrentSession) + renderCrossSigningUnverified(isCurrentSession, isVerifyButtonVisible) } if (hasLearnMoreLink) { appendLearnMoreToVerificationStatus() @@ -120,7 +122,7 @@ class SessionInfoView @JvmOverloads constructor( views.sessionInfoVerifySessionButton.isVisible = false } - private fun renderCrossSigningUnverified(isCurrentSession: Boolean) { + private fun renderCrossSigningUnverified(isCurrentSession: Boolean, isVerifyButtonVisible: Boolean) { views.sessionInfoVerificationStatusTextView.text = context.getString(R.string.device_manager_verification_status_unverified) views.sessionInfoVerificationStatusTextView.setTextColor(ThemeUtils.getColor(context, R.attr.colorError)) val statusResId = if (isCurrentSession) { @@ -129,7 +131,7 @@ class SessionInfoView @JvmOverloads constructor( R.string.device_manager_verification_status_detail_other_session_unverified } views.sessionInfoVerificationStatusDetailTextView.text = context.getString(statusResId) - views.sessionInfoVerifySessionButton.isVisible = true + views.sessionInfoVerifySessionButton.isVisible = isVerifyButtonVisible } // TODO. We don't have this info yet. Update later accordingly. diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt index 60e1234820..287bb956f5 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt @@ -21,6 +21,7 @@ import im.vector.app.features.settings.devices.v2.DeviceFullInfo data class SessionInfoViewState( val isCurrentSession: Boolean, val deviceFullInfo: DeviceFullInfo, + val isVerifyButtonVisible: Boolean = true, val isDetailsButtonVisible: Boolean = true, val isLearnMoreLinkVisible: Boolean = false, val isLastSeenDetailsVisible: Boolean = false, diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt index 4c83408fe7..db293e88a9 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt @@ -82,9 +82,12 @@ class SessionOverviewFragment : private fun observeViewEvents() { viewModel.observeViewEvents { when (it) { - is SessionOverviewViewEvent.SelfVerification -> { + is SessionOverviewViewEvent.ShowVerifyCurrentSession -> { navigator.requestSelfSessionVerification(requireActivity()) } + is SessionOverviewViewEvent.ShowVerifyOtherSession -> { + navigator.requestSessionVerification(requireActivity(), it.deviceId) + } is SessionOverviewViewEvent.PromptResetSecrets -> { navigator.open4SSetup(requireActivity(), SetupMode.PASSPHRASE_AND_NEEDED_SECRETS_RESET) } @@ -105,7 +108,7 @@ class SessionOverviewFragment : updateToolbar(state.isCurrentSession) updateEntryDetails(state.deviceId) if (state.deviceInfo is Success) { - renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke()) + renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke(), state.isCurrentSessionTrusted) } else { hideSessionInfo() } @@ -124,11 +127,16 @@ class SessionOverviewFragment : } } - private fun renderSessionInfo(isCurrentSession: Boolean, deviceFullInfo: DeviceFullInfo) { + private fun renderSessionInfo( + isCurrentSession: Boolean, + deviceFullInfo: DeviceFullInfo, + isCurrentSessionTrusted: Boolean, + ) { views.sessionOverviewInfo.isVisible = true val viewState = SessionInfoViewState( isCurrentSession = isCurrentSession, deviceFullInfo = deviceFullInfo, + isVerifyButtonVisible = isCurrentSession || isCurrentSessionTrusted, isDetailsButtonVisible = false, isLearnMoreLinkVisible = true, isLastSeenDetailsVisible = true, diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt index 83d438ecb4..8508b395ad 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt @@ -19,6 +19,7 @@ package im.vector.app.features.settings.devices.v2.overview import im.vector.app.core.platform.VectorViewEvents sealed class SessionOverviewViewEvent : VectorViewEvents { - object SelfVerification : SessionOverviewViewEvent() + object ShowVerifyCurrentSession : SessionOverviewViewEvent() + data class ShowVerifyOtherSession(val deviceId: String) : SessionOverviewViewEvent() object PromptResetSecrets : SessionOverviewViewEvent() } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index bcf7542783..183469936f 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -45,6 +45,7 @@ class SessionOverviewViewModel @AssistedInject constructor( } init { + // TODO check if current session is trusted setState { copy(isCurrentSession = isCurrentSession(deviceId)) } @@ -70,6 +71,8 @@ class SessionOverviewViewModel @AssistedInject constructor( private fun handleVerifySessionAction() = withState { viewState -> if (isCurrentSession(viewState.deviceId)) { handleVerifyCurrentSession() + } else { + handleVerifyOtherSession(verifySession.deviceId) } } @@ -77,10 +80,14 @@ class SessionOverviewViewModel @AssistedInject constructor( viewModelScope.launch { val currentSessionCanBeVerified = checkIfCurrentSessionCanBeVerifiedUseCase.execute() if (currentSessionCanBeVerified) { - _viewEvents.post(SessionOverviewViewEvent.SelfVerification) + _viewEvents.post(SessionOverviewViewEvent.ShowVerifyCurrentSession) } else { _viewEvents.post(SessionOverviewViewEvent.PromptResetSecrets) } } } + + private fun handleVerifyOtherSession(deviceId: String) { + _viewEvents.post(SessionOverviewViewEvent.ShowVerifyOtherSession(deviceId)) + } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewState.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewState.kt index a447336c23..1cb455dd5c 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewState.kt @@ -24,6 +24,7 @@ import im.vector.app.features.settings.devices.v2.DeviceFullInfo data class SessionOverviewViewState( val deviceId: String, val isCurrentSession: Boolean = false, + val isCurrentSessionTrusted: Boolean = false, val deviceInfo: Async = Uninitialized, ) : MavericksState { constructor(args: SessionOverviewArgs) : this( diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt index 71978129d3..ed7fc766c7 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt @@ -95,7 +95,7 @@ class SessionOverviewViewModelTest { // Then viewModelTest - .assertEvent { it is SessionOverviewViewEvent.SelfVerification } + .assertEvent { it is SessionOverviewViewEvent.ShowVerifyCurrentSession } .finish() coVerify { checkIfCurrentSessionCanBeVerifiedUseCase.execute() @@ -124,4 +124,23 @@ class SessionOverviewViewModelTest { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } } + + @Test + fun `given another session when handling verify session action then verify session event is posted`() { + // Given + val deviceFullInfo = mockk() + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { isCurrentSessionUseCase.execute(any()) } returns false + val verifySessionAction = SessionOverviewAction.VerifySession(A_SESSION_ID) + + // When + val viewModel = createViewModel() + val viewModelTest = viewModel.test() + viewModel.handle(verifySessionAction) + + // Then + viewModelTest + .assertEvent { it is SessionOverviewViewEvent.ShowVerifyOtherSession } + .finish() + } } From 95d133e0e2edbf497060992f69a70ba338d12ebd Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Fri, 16 Sep 2022 14:12:38 +0200 Subject: [PATCH 066/131] Moving some components inside the verification package --- .../app/features/settings/devices/DevicesViewModel.kt | 2 +- .../devices/GetCurrentSessionCrossSigningInfoUseCase.kt | 2 +- .../app/features/settings/devices/v2/DevicesViewModel.kt | 1 + .../app/features/settings/devices/v2/DevicesViewState.kt | 1 + .../settings/devices/v2/GetDeviceFullInfoListUseCase.kt | 3 +++ .../devices/v2/overview/GetDeviceFullInfoUseCase.kt | 4 ++-- .../devices/v2/overview/SessionOverviewViewModel.kt | 1 - .../v2/{ => verification}/CurrentSessionCrossSigningInfo.kt | 2 +- .../GetCurrentSessionCrossSigningInfoUseCase.kt | 2 +- .../GetEncryptionTrustLevelForCurrentDeviceUseCase.kt | 2 +- .../GetEncryptionTrustLevelForDeviceUseCase.kt | 2 +- .../GetEncryptionTrustLevelForOtherDeviceUseCase.kt | 2 +- .../devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt | 2 +- .../features/settings/devices/v2/DevicesViewModelTest.kt | 2 ++ .../settings/devices/v2/GetDeviceFullInfoListUseCaseTest.kt | 3 +++ .../devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt | 6 +++--- .../GetCurrentSessionCrossSigningInfoUseCaseTest.kt | 2 +- .../GetEncryptionTrustLevelForCurrentDeviceUseCaseTest.kt | 2 +- .../GetEncryptionTrustLevelForDeviceUseCaseTest.kt | 2 +- .../GetEncryptionTrustLevelForOtherDeviceUseCaseTest.kt | 2 +- 20 files changed, 27 insertions(+), 18 deletions(-) rename vector/src/main/java/im/vector/app/features/settings/devices/v2/{ => verification}/CurrentSessionCrossSigningInfo.kt (93%) rename vector/src/main/java/im/vector/app/features/settings/devices/v2/{ => verification}/GetCurrentSessionCrossSigningInfoUseCase.kt (96%) rename vector/src/main/java/im/vector/app/features/settings/devices/v2/{ => verification}/GetEncryptionTrustLevelForCurrentDeviceUseCase.kt (95%) rename vector/src/main/java/im/vector/app/features/settings/devices/v2/{ => verification}/GetEncryptionTrustLevelForDeviceUseCase.kt (96%) rename vector/src/main/java/im/vector/app/features/settings/devices/v2/{ => verification}/GetEncryptionTrustLevelForOtherDeviceUseCase.kt (96%) rename vector/src/test/java/im/vector/app/features/settings/devices/v2/{ => verification}/GetCurrentSessionCrossSigningInfoUseCaseTest.kt (98%) rename vector/src/test/java/im/vector/app/features/settings/devices/v2/{ => verification}/GetEncryptionTrustLevelForCurrentDeviceUseCaseTest.kt (96%) rename vector/src/test/java/im/vector/app/features/settings/devices/v2/{ => verification}/GetEncryptionTrustLevelForDeviceUseCaseTest.kt (98%) rename vector/src/test/java/im/vector/app/features/settings/devices/v2/{ => verification}/GetEncryptionTrustLevelForOtherDeviceUseCaseTest.kt (98%) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt index 30e7727860..95b852b809 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt @@ -34,7 +34,7 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.core.utils.PublishDataSource import im.vector.app.features.auth.ReAuthActivity import im.vector.app.features.login.ReAuthHelper -import im.vector.app.features.settings.devices.v2.GetEncryptionTrustLevelForDeviceUseCase +import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.Dispatchers diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCase.kt index 8b58bd0536..a27c30379b 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCase.kt @@ -17,7 +17,7 @@ package im.vector.app.features.settings.devices import im.vector.app.core.di.ActiveSessionHolder -import im.vector.app.features.settings.devices.v2.CurrentSessionCrossSigningInfo +import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo import javax.inject.Inject class GetCurrentSessionCrossSigningInfoUseCase @Inject constructor( diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt index 96d169bf02..f1fe582e44 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewModel.kt @@ -26,6 +26,7 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase +import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewState.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewState.kt index 3fc061daa4..e8bed35e24 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/DevicesViewState.kt @@ -19,6 +19,7 @@ package im.vector.app.features.settings.devices.v2 import com.airbnb.mvrx.Async import com.airbnb.mvrx.MavericksState import com.airbnb.mvrx.Uninitialized +import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo data class DevicesViewState( val currentSessionCrossSigningInfo: CurrentSessionCrossSigningInfo = CurrentSessionCrossSigningInfo(), diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetDeviceFullInfoListUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetDeviceFullInfoListUseCase.kt index 3c0d3a5e56..ae38ba3d3f 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetDeviceFullInfoListUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetDeviceFullInfoListUseCase.kt @@ -20,6 +20,9 @@ import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType import im.vector.app.features.settings.devices.v2.filter.FilterDevicesUseCase import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase +import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo +import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase +import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt index 5a8106f2fd..bb2c4f4c6a 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt @@ -19,8 +19,8 @@ package im.vector.app.features.settings.devices.v2.overview import androidx.lifecycle.asFlow import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.settings.devices.v2.DeviceFullInfo -import im.vector.app.features.settings.devices.v2.GetCurrentSessionCrossSigningInfoUseCase -import im.vector.app.features.settings.devices.v2.GetEncryptionTrustLevelForDeviceUseCase +import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase +import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index 183469936f..335341ab07 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -45,7 +45,6 @@ class SessionOverviewViewModel @AssistedInject constructor( } init { - // TODO check if current session is trusted setState { copy(isCurrentSession = isCurrentSession(deviceId)) } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/CurrentSessionCrossSigningInfo.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CurrentSessionCrossSigningInfo.kt similarity index 93% rename from vector/src/main/java/im/vector/app/features/settings/devices/v2/CurrentSessionCrossSigningInfo.kt rename to vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CurrentSessionCrossSigningInfo.kt index cccdb23d52..1dfab06b1d 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/CurrentSessionCrossSigningInfo.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/CurrentSessionCrossSigningInfo.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification /** * Used to hold some info about the cross signing of the current Session. diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetCurrentSessionCrossSigningInfoUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCase.kt similarity index 96% rename from vector/src/main/java/im/vector/app/features/settings/devices/v2/GetCurrentSessionCrossSigningInfoUseCase.kt rename to vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCase.kt index cc848342de..182e493213 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetCurrentSessionCrossSigningInfoUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCase.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification import im.vector.app.core.di.ActiveSessionHolder import kotlinx.coroutines.flow.Flow diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForCurrentDeviceUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForCurrentDeviceUseCase.kt similarity index 95% rename from vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForCurrentDeviceUseCase.kt rename to vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForCurrentDeviceUseCase.kt index 7e56d35570..2243471a23 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForCurrentDeviceUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForCurrentDeviceUseCase.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel import javax.inject.Inject diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForDeviceUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForDeviceUseCase.kt similarity index 96% rename from vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForDeviceUseCase.kt rename to vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForDeviceUseCase.kt index 6f0dcbface..ba9a380ade 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForDeviceUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForDeviceUseCase.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForOtherDeviceUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForOtherDeviceUseCase.kt similarity index 96% rename from vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForOtherDeviceUseCase.kt rename to vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForOtherDeviceUseCase.kt index 7541b9b1d5..e674ccd8c5 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForOtherDeviceUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForOtherDeviceUseCase.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt index 1a805f4c3e..e71a11710b 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt @@ -16,7 +16,7 @@ package im.vector.app.features.settings.devices -import im.vector.app.features.settings.devices.v2.CurrentSessionCrossSigningInfo +import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo import im.vector.app.test.fakes.FakeActiveSessionHolder import io.mockk.every import io.mockk.mockk diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt index 0e04c2ab51..f4160da9fd 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/DevicesViewModelTest.kt @@ -19,6 +19,8 @@ package im.vector.app.features.settings.devices.v2 import com.airbnb.mvrx.Success import com.airbnb.mvrx.test.MvRxTestRule import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase +import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo +import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeVerificationService import im.vector.app.test.test diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetDeviceFullInfoListUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetDeviceFullInfoListUseCaseTest.kt index 54b160f196..c9dd9ddea6 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetDeviceFullInfoListUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetDeviceFullInfoListUseCaseTest.kt @@ -19,6 +19,9 @@ package im.vector.app.features.settings.devices.v2 import im.vector.app.features.settings.devices.v2.filter.DeviceManagerFilterType import im.vector.app.features.settings.devices.v2.filter.FilterDevicesUseCase import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase +import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo +import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase +import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.test import im.vector.app.test.testDispatcher diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt index 9c7515f2da..33a83cd590 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt @@ -18,10 +18,10 @@ package im.vector.app.features.settings.devices.v2.overview import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asFlow -import im.vector.app.features.settings.devices.v2.CurrentSessionCrossSigningInfo +import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo import im.vector.app.features.settings.devices.v2.DeviceFullInfo -import im.vector.app.features.settings.devices.v2.GetCurrentSessionCrossSigningInfoUseCase -import im.vector.app.features.settings.devices.v2.GetEncryptionTrustLevelForDeviceUseCase +import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase +import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeFlowLiveDataConversions diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetCurrentSessionCrossSigningInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt similarity index 98% rename from vector/src/test/java/im/vector/app/features/settings/devices/v2/GetCurrentSessionCrossSigningInfoUseCaseTest.kt rename to vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt index f8ee1231ae..25d5766774 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetCurrentSessionCrossSigningInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeSession diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForCurrentDeviceUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForCurrentDeviceUseCaseTest.kt similarity index 96% rename from vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForCurrentDeviceUseCaseTest.kt rename to vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForCurrentDeviceUseCaseTest.kt index b2ce89df33..3f82cb0dd2 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForCurrentDeviceUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForCurrentDeviceUseCaseTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification import org.amshove.kluent.shouldBeEqualTo import org.junit.Test diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForDeviceUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForDeviceUseCaseTest.kt similarity index 98% rename from vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForDeviceUseCaseTest.kt rename to vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForDeviceUseCaseTest.kt index e43fd49ffc..1b39fe5f73 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForDeviceUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForDeviceUseCaseTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification import io.mockk.every import io.mockk.mockk diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForOtherDeviceUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForOtherDeviceUseCaseTest.kt similarity index 98% rename from vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForOtherDeviceUseCaseTest.kt rename to vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForOtherDeviceUseCaseTest.kt index 2aeffbbb0d..18f998cf97 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/GetEncryptionTrustLevelForOtherDeviceUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetEncryptionTrustLevelForOtherDeviceUseCaseTest.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.settings.devices.v2 +package im.vector.app.features.settings.devices.v2.verification import org.amshove.kluent.shouldBeEqualTo import org.junit.Test From 921533e4b291b11a8b2a45c3db285ddebc3a9240 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Fri, 16 Sep 2022 15:03:14 +0200 Subject: [PATCH 067/131] Getting the current session verification status to change verify button visibility --- .../v2/overview/SessionOverviewViewModel.kt | 17 +++++++++ ...rrentSessionCrossSigningInfoUseCaseTest.kt | 7 +--- .../devices/v2/IsCurrentSessionUseCaseTest.kt | 9 +---- .../overview/SessionOverviewViewModelTest.kt | 38 +++++++++++++------ ...rrentSessionCrossSigningInfoUseCaseTest.kt | 5 +-- .../im/vector/app/test/fakes/FakeSession.kt | 7 ++++ 6 files changed, 54 insertions(+), 29 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index 335341ab07..40a78a4fd3 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -26,9 +26,12 @@ import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.settings.devices.v2.IsCurrentSessionUseCase import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel class SessionOverviewViewModel @AssistedInject constructor( @Assisted val initialState: SessionOverviewViewState, @@ -49,6 +52,7 @@ class SessionOverviewViewModel @AssistedInject constructor( copy(isCurrentSession = isCurrentSession(deviceId)) } observeSessionInfo(initialState.deviceId) + observeCurrentSessionInfo() } private fun isCurrentSession(deviceId: String): Boolean { @@ -61,6 +65,19 @@ class SessionOverviewViewModel @AssistedInject constructor( .launchIn(viewModelScope) } + private fun observeCurrentSessionInfo() { + activeSessionHolder.getSafeActiveSession() + ?.sessionParams + ?.deviceId + ?.let { deviceId -> + getDeviceFullInfoUseCase.execute(deviceId) + .map { it.roomEncryptionTrustLevel == RoomEncryptionTrustLevel.Trusted } + .distinctUntilChanged() + .onEach { setState { copy(isCurrentSessionTrusted = it) } } + .launchIn(viewModelScope) + } + } + override fun handle(action: SessionOverviewAction) { when (action) { is SessionOverviewAction.VerifySession -> handleVerifySessionAction() diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt index e71a11710b..b9ba1b1c0b 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/GetCurrentSessionCrossSigningInfoUseCaseTest.kt @@ -18,11 +18,8 @@ package im.vector.app.features.settings.devices import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo import im.vector.app.test.fakes.FakeActiveSessionHolder -import io.mockk.every -import io.mockk.mockk import org.amshove.kluent.shouldBeEqualTo import org.junit.Test -import org.matrix.android.sdk.api.auth.data.SessionParams private const val A_DEVICE_ID = "device-id" @@ -36,9 +33,7 @@ class GetCurrentSessionCrossSigningInfoUseCaseTest { @Test fun `given the active session when getting cross signing info then the result is correct`() { - val sessionParams = mockk() - every { sessionParams.deviceId } returns A_DEVICE_ID - fakeActiveSessionHolder.fakeSession.givenSessionParams(sessionParams) + fakeActiveSessionHolder.fakeSession.givenSessionId(A_DEVICE_ID) val isCrossSigningInitialized = true fakeActiveSessionHolder.fakeSession .fakeCryptoService diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt index 25cd150b21..09a94ac08b 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/IsCurrentSessionUseCaseTest.kt @@ -17,8 +17,6 @@ package im.vector.app.features.settings.devices.v2 import im.vector.app.test.fakes.FakeActiveSessionHolder -import io.mockk.every -import io.mockk.mockk import io.mockk.verify import org.amshove.kluent.shouldBe import org.junit.Test @@ -73,10 +71,7 @@ class IsCurrentSessionUseCaseTest { result shouldBe false } - private fun givenIdForCurrentSession(deviceId: String): SessionParams { - val sessionParams = mockk() - every { sessionParams.deviceId } returns deviceId - fakeActiveSessionHolder.fakeSession.givenSessionParams(sessionParams) - return sessionParams + private fun givenIdForCurrentSession(sessionId: String): SessionParams { + return fakeActiveSessionHolder.fakeSession.givenSessionId(sessionId) } } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt index ed7fc766c7..3ba3e616df 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt @@ -31,8 +31,10 @@ import io.mockk.verify import kotlinx.coroutines.flow.flowOf import org.junit.Rule import org.junit.Test +import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel -private const val A_SESSION_ID = "session-id" +private const val A_SESSION_ID_1 = "session-id-1" +private const val A_SESSION_ID_2 = "session-id-2" class SessionOverviewViewModelTest { @@ -40,7 +42,7 @@ class SessionOverviewViewModelTest { val mvRxTestRule = MvRxTestRule(testDispatcher = testDispatcher) private val args = SessionOverviewArgs( - deviceId = A_SESSION_ID + deviceId = A_SESSION_ID_1 ) private val isCurrentSessionUseCase = mockk() private val getDeviceFullInfoUseCase = mockk() @@ -54,16 +56,18 @@ class SessionOverviewViewModelTest { ) @Test - fun `given the viewModel has been initialized then viewState is updated with session info`() { + fun `given the viewModel has been initialized then viewState is updated with session info and current session verification status`() { // Given val deviceFullInfo = mockk() - every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo) val isCurrentSession = true every { isCurrentSessionUseCase.execute(any()) } returns isCurrentSession + givenCurrentSessionIsTrusted() val expectedState = SessionOverviewViewState( - deviceId = A_SESSION_ID, + deviceId = A_SESSION_ID_1, isCurrentSession = isCurrentSession, - deviceInfo = Success(deviceFullInfo) + deviceInfo = Success(deviceFullInfo), + isCurrentSessionTrusted = true, ) // When @@ -74,8 +78,8 @@ class SessionOverviewViewModelTest { .assertLatestState { state -> state == expectedState } .finish() verify { - isCurrentSessionUseCase.execute(A_SESSION_ID) - getDeviceFullInfoUseCase.execute(A_SESSION_ID) + isCurrentSessionUseCase.execute(A_SESSION_ID_1) + getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } } @@ -83,10 +87,11 @@ class SessionOverviewViewModelTest { fun `given current session can be verified when handling verify current session action then self verification event is posted`() { // Given val deviceFullInfo = mockk() - every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo) every { isCurrentSessionUseCase.execute(any()) } returns true val verifySessionAction = SessionOverviewAction.VerifySession coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns true + givenCurrentSessionIsTrusted() // When val viewModel = createViewModel() @@ -106,10 +111,11 @@ class SessionOverviewViewModelTest { fun `given current session cannot be verified when handling verify current session action then reset secrets event is posted`() { // Given val deviceFullInfo = mockk() - every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo) every { isCurrentSessionUseCase.execute(any()) } returns true val verifySessionAction = SessionOverviewAction.VerifySession coEvery { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } returns false + givenCurrentSessionIsTrusted() // When val viewModel = createViewModel() @@ -129,9 +135,10 @@ class SessionOverviewViewModelTest { fun `given another session when handling verify session action then verify session event is posted`() { // Given val deviceFullInfo = mockk() - every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_1) } returns flowOf(deviceFullInfo) every { isCurrentSessionUseCase.execute(any()) } returns false - val verifySessionAction = SessionOverviewAction.VerifySession(A_SESSION_ID) + val verifySessionAction = SessionOverviewAction.VerifySession + givenCurrentSessionIsTrusted() // When val viewModel = createViewModel() @@ -143,4 +150,11 @@ class SessionOverviewViewModelTest { .assertEvent { it is SessionOverviewViewEvent.ShowVerifyOtherSession } .finish() } + + private fun givenCurrentSessionIsTrusted() { + fakeActiveSessionHolder.fakeSession.givenSessionId(A_SESSION_ID_2) + val deviceFullInfo = mockk() + every { deviceFullInfo.roomEncryptionTrustLevel } returns RoomEncryptionTrustLevel.Trusted + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID_2) } returns flowOf(deviceFullInfo) + } } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt index 25d5766774..f566c8f55e 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt @@ -107,11 +107,8 @@ class GetCurrentSessionCrossSigningInfoUseCaseTest { } private fun givenSession(deviceId: String): FakeSession { - val sessionParams = mockk() - every { sessionParams.deviceId } returns deviceId - val fakeSession = fakeActiveSessionHolder.fakeSession - fakeSession.givenSessionParams(sessionParams) + fakeSession.givenSessionId(deviceId) return fakeSession } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt index 35d23e35e8..4171307922 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeSession.kt @@ -78,6 +78,13 @@ class FakeSession( every { this@FakeSession.sessionParams } returns sessionParams } + fun givenSessionId(sessionId: String): SessionParams { + val sessionParams = mockk() + every { sessionParams.deviceId } returns sessionId + givenSessionParams(sessionParams) + return sessionParams + } + /** * Do not forget to call mockkStatic("org.matrix.android.sdk.flow.FlowSessionKt") in the setup method of the tests. */ From 17bb14c1dc3f25f8aa9c732c06f150fc45be31f9 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Fri, 16 Sep 2022 15:05:55 +0200 Subject: [PATCH 068/131] Fixing coding style issues --- .../vector/app/features/settings/devices/DevicesViewModel.kt | 2 +- .../settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt | 2 +- .../devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt | 4 ++-- .../GetCurrentSessionCrossSigningInfoUseCaseTest.kt | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt index 95b852b809..d30d6ee270 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt @@ -34,8 +34,8 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.core.utils.PublishDataSource import im.vector.app.features.auth.ReAuthActivity import im.vector.app.features.login.ReAuthHelper -import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase +import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt index bb2c4f4c6a..8b343f5f90 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt @@ -19,9 +19,9 @@ package im.vector.app.features.settings.devices.v2.overview import androidx.lifecycle.asFlow import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.settings.devices.v2.DeviceFullInfo +import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase -import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.emptyFlow diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt index 33a83cd590..3ef1c5a515 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt @@ -18,11 +18,11 @@ package im.vector.app.features.settings.devices.v2.overview import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asFlow -import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo import im.vector.app.features.settings.devices.v2.DeviceFullInfo +import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase +import im.vector.app.features.settings.devices.v2.verification.CurrentSessionCrossSigningInfo import im.vector.app.features.settings.devices.v2.verification.GetCurrentSessionCrossSigningInfoUseCase import im.vector.app.features.settings.devices.v2.verification.GetEncryptionTrustLevelForDeviceUseCase -import im.vector.app.features.settings.devices.v2.list.CheckIfSessionIsInactiveUseCase import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeFlowLiveDataConversions import im.vector.app.test.fakes.givenAsFlow diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt index f566c8f55e..356d771d39 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/verification/GetCurrentSessionCrossSigningInfoUseCaseTest.kt @@ -30,7 +30,6 @@ import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Before import org.junit.Test -import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.session.crypto.crosssigning.MXCrossSigningInfo import org.matrix.android.sdk.api.util.toOptional From aa7f7d7111904bea73df735700ef02d6ae177da3 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Mon, 19 Sep 2022 10:00:34 +0200 Subject: [PATCH 069/131] Fix after rebase --- .../devices/v2/overview/SessionOverviewViewModel.kt | 7 +++++-- .../devices/v2/overview/SessionOverviewViewModelTest.kt | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index 40a78a4fd3..4756e1e10e 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -21,6 +21,7 @@ import com.airbnb.mvrx.Success import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel @@ -35,6 +36,7 @@ import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel class SessionOverviewViewModel @AssistedInject constructor( @Assisted val initialState: SessionOverviewViewState, + private val activeSessionHolder: ActiveSessionHolder, private val isCurrentSessionUseCase: IsCurrentSessionUseCase, private val getDeviceFullInfoUseCase: GetDeviceFullInfoUseCase, private val checkIfCurrentSessionCanBeVerifiedUseCase: CheckIfCurrentSessionCanBeVerifiedUseCase, @@ -85,10 +87,11 @@ class SessionOverviewViewModel @AssistedInject constructor( } private fun handleVerifySessionAction() = withState { viewState -> - if (isCurrentSession(viewState.deviceId)) { + val deviceId = viewState.deviceId + if (isCurrentSession(deviceId)) { handleVerifyCurrentSession() } else { - handleVerifyOtherSession(verifySession.deviceId) + handleVerifyOtherSession(deviceId) } } diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt index 3ba3e616df..857fa94ade 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt @@ -21,6 +21,7 @@ import com.airbnb.mvrx.test.MvRxTestRule import im.vector.app.features.settings.devices.v2.DeviceFullInfo import im.vector.app.features.settings.devices.v2.IsCurrentSessionUseCase import im.vector.app.features.settings.devices.v2.verification.CheckIfCurrentSessionCanBeVerifiedUseCase +import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.test import im.vector.app.test.testDispatcher import io.mockk.coEvery @@ -44,12 +45,14 @@ class SessionOverviewViewModelTest { private val args = SessionOverviewArgs( deviceId = A_SESSION_ID_1 ) + private val fakeActiveSessionHolder = FakeActiveSessionHolder() private val isCurrentSessionUseCase = mockk() private val getDeviceFullInfoUseCase = mockk() private val checkIfCurrentSessionCanBeVerifiedUseCase = mockk() private fun createViewModel() = SessionOverviewViewModel( initialState = SessionOverviewViewState(args), + activeSessionHolder = fakeActiveSessionHolder.instance, isCurrentSessionUseCase = isCurrentSessionUseCase, getDeviceFullInfoUseCase = getDeviceFullInfoUseCase, checkIfCurrentSessionCanBeVerifiedUseCase = checkIfCurrentSessionCanBeVerifiedUseCase, From 72637b465f3dca27bb6801c452a2e26757e3624f Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Mon, 19 Sep 2022 11:23:11 +0200 Subject: [PATCH 070/131] Using viewState value to check if it is current session --- .../settings/devices/v2/overview/SessionOverviewViewModel.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index 4756e1e10e..69556e039e 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -87,11 +87,10 @@ class SessionOverviewViewModel @AssistedInject constructor( } private fun handleVerifySessionAction() = withState { viewState -> - val deviceId = viewState.deviceId - if (isCurrentSession(deviceId)) { + if (viewState.isCurrentSession) { handleVerifyCurrentSession() } else { - handleVerifyOtherSession(deviceId) + handleVerifyOtherSession(viewState.deviceId) } } From 943ec7ee7505ee99c96579590923a1474953a97e Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Mon, 19 Sep 2022 11:29:39 +0200 Subject: [PATCH 071/131] Reducing argument number in session info view update method --- .../v2/overview/SessionOverviewFragment.kt | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt index db293e88a9..73991c5f20 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt @@ -35,7 +35,6 @@ import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.DrawableProvider import im.vector.app.databinding.FragmentSessionOverviewBinding import im.vector.app.features.crypto.recover.SetupMode -import im.vector.app.features.settings.devices.v2.DeviceFullInfo import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState import javax.inject.Inject @@ -107,11 +106,7 @@ class SessionOverviewFragment : override fun invalidate() = withState(viewModel) { state -> updateToolbar(state.isCurrentSession) updateEntryDetails(state.deviceId) - if (state.deviceInfo is Success) { - renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke(), state.isCurrentSessionTrusted) - } else { - hideSessionInfo() - } + updateSessionInfo(state) } private fun updateToolbar(isCurrentSession: Boolean) { @@ -127,21 +122,22 @@ class SessionOverviewFragment : } } - private fun renderSessionInfo( - isCurrentSession: Boolean, - deviceFullInfo: DeviceFullInfo, - isCurrentSessionTrusted: Boolean, - ) { - views.sessionOverviewInfo.isVisible = true - val viewState = SessionInfoViewState( - isCurrentSession = isCurrentSession, - deviceFullInfo = deviceFullInfo, - isVerifyButtonVisible = isCurrentSession || isCurrentSessionTrusted, - isDetailsButtonVisible = false, - isLearnMoreLinkVisible = true, - isLastSeenDetailsVisible = true, - ) - views.sessionOverviewInfo.render(viewState, dateFormatter, drawableProvider, colorProvider) + private fun updateSessionInfo(viewState: SessionOverviewViewState) { + if (viewState.deviceInfo is Success) { + views.sessionOverviewInfo.isVisible = true + val isCurrentSession = viewState.isCurrentSession + val infoViewState = SessionInfoViewState( + isCurrentSession = isCurrentSession, + deviceFullInfo = viewState.deviceInfo.invoke(), + isVerifyButtonVisible = isCurrentSession || viewState.isCurrentSessionTrusted, + isDetailsButtonVisible = false, + isLearnMoreLinkVisible = true, + isLastSeenDetailsVisible = true, + ) + views.sessionOverviewInfo.render(infoViewState, dateFormatter, drawableProvider, colorProvider) + } else { + hideSessionInfo() + } } private fun hideSessionInfo() { From 32536a400976ce7cb9d4731d7a779b609633d71a Mon Sep 17 00:00:00 2001 From: Nui Harime Date: Mon, 19 Sep 2022 14:26:13 +0000 Subject: [PATCH 072/131] Translated using Weblate (Russian) Currently translated at 97.9% (2338 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/ --- .../src/main/res/values-ru/strings.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/library/ui-strings/src/main/res/values-ru/strings.xml b/library/ui-strings/src/main/res/values-ru/strings.xml index 4852be1f82..bed6976f7e 100644 --- a/library/ui-strings/src/main/res/values-ru/strings.xml +++ b/library/ui-strings/src/main/res/values-ru/strings.xml @@ -2678,4 +2678,20 @@ Обзор комнат Начать беседу Создать комнату + Посмотреть все (%1$d) + Повысьте безопасность учётной записи, следуя этим рекомендациям. + Заверенная · Последняя активность %1$s + Текущая сессия + Незаверенная сессия + Заверенная сессия + Неизвестный тип устройства + Компьютер + Мобильный + Незаверенная · Последняя активность %1$s + Рекомендации по безопасности + Незаверенные сессии + Неактивные сессии + Добро пожаловать в ${app_name}, +\n%s. + Оставить отзыв \ No newline at end of file From f6dfd643261b243be872223c1dcad40b10dd23d0 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Tue, 20 Sep 2022 23:27:00 +0200 Subject: [PATCH 073/131] fixed all screens test to follow latest changes --- .../androidTest/java/im/vector/app/ui/robot/ElementRobot.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt index 9fb7fceebf..d9dfb0facf 100644 --- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt +++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt @@ -110,9 +110,6 @@ class ElementRobot( closeSoftKeyboard() block(NewDirectMessageRobot()) pressBack() - if (labsPreferences.isNewAppLayoutEnabled) { - pressBack() // close create dialog - } waitUntilViewVisible(withId(R.id.roomListContainer)) } @@ -121,9 +118,6 @@ class ElementRobot( clickOn(R.id.bottom_action_rooms) } RoomListRobot(labsPreferences).newRoom { block() } - if (labsPreferences.isNewAppLayoutEnabled) { - pressBack() // close create dialog - } waitUntilViewVisible(withId(R.id.roomListContainer)) } From fe1e74fa06b7814a50fa1d99d39e8e3f60e0707c Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Tue, 20 Sep 2022 18:22:39 -0400 Subject: [PATCH 074/131] Fixes room list not getting updated when not in focus --- .../home/room/list/home/HomeRoomListFragment.kt | 8 ++++---- .../home/room/list/home/HomeRoomListViewModel.kt | 10 +++++++++- .../home/room/list/home/HomeRoomListViewState.kt | 3 +-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt index 829634259a..a0bd2d670a 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt @@ -152,10 +152,10 @@ class HomeRoomListFragment : headersController.submitData(it) } - roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList) { roomsListLive -> - roomsListLive?.observe(viewLifecycleOwner) { roomsList -> - roomsController.submitList(roomsList) - if (roomsList.isEmpty()) { + roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList) { roomsList -> + roomsList?.let { + roomsController.submitList(it) + if (it.isEmpty()) { roomsController.requestForcedModelBuild() } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index 35b2f02917..93856abd30 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -17,6 +17,7 @@ package im.vector.app.features.home.room.list.home import android.widget.ImageView +import androidx.lifecycle.asFlow import androidx.paging.PagedList import arrow.core.Option import arrow.core.toOption @@ -43,6 +44,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach @@ -254,7 +256,13 @@ class HomeRoomListViewModel @AssistedInject constructor( .also { roomsFlow = it } .launchIn(viewModelScope) - setState { copy(roomsLivePagedList = liveResults.livePagedList) } + liveResults.livePagedList + .asFlow() + .onEach { + setState { copy(roomsLivePagedList = it) } + } + .flowOn(Dispatchers.Default) + .launchIn(viewModelScope) } private fun observeOrderPreferences() { diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt index 95625bc4b9..7b7719981f 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.list.home -import androidx.lifecycle.LiveData import androidx.paging.PagedList import com.airbnb.mvrx.MavericksState import im.vector.app.core.platform.StateView @@ -26,5 +25,5 @@ import org.matrix.android.sdk.api.session.room.model.RoomSummary data class HomeRoomListViewState( val state: StateView.State = StateView.State.Content, val headersData: RoomsHeadersData = RoomsHeadersData(), - val roomsLivePagedList: LiveData>? = null, + val roomsLivePagedList: PagedList? = null, ) : MavericksState From 1a93bbf92fb0b6c7872db7f2fb9024b6c21290c5 Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Tue, 20 Sep 2022 18:32:59 -0400 Subject: [PATCH 075/131] Renames roomsPagedList --- .../app/features/home/room/list/home/HomeRoomListFragment.kt | 2 +- .../app/features/home/room/list/home/HomeRoomListViewModel.kt | 2 +- .../app/features/home/room/list/home/HomeRoomListViewState.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt index a0bd2d670a..4d61057b59 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt @@ -152,7 +152,7 @@ class HomeRoomListFragment : headersController.submitData(it) } - roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList) { roomsList -> + roomListViewModel.onEach(HomeRoomListViewState::roomsPagedList) { roomsList -> roomsList?.let { roomsController.submitList(it) if (it.isEmpty()) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index 93856abd30..4bc5d8ba95 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -259,7 +259,7 @@ class HomeRoomListViewModel @AssistedInject constructor( liveResults.livePagedList .asFlow() .onEach { - setState { copy(roomsLivePagedList = it) } + setState { copy(roomsPagedList = it) } } .flowOn(Dispatchers.Default) .launchIn(viewModelScope) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt index 7b7719981f..db3a57e63e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt @@ -25,5 +25,5 @@ import org.matrix.android.sdk.api.session.room.model.RoomSummary data class HomeRoomListViewState( val state: StateView.State = StateView.State.Content, val headersData: RoomsHeadersData = RoomsHeadersData(), - val roomsLivePagedList: PagedList? = null, + val roomsPagedList: PagedList? = null, ) : MavericksState From 821636bcb23f2498e4f149add1bf803dae7c029c Mon Sep 17 00:00:00 2001 From: ericdecanini Date: Tue, 20 Sep 2022 18:36:25 -0400 Subject: [PATCH 076/131] Adds changelog file --- changelog.d/7186.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7186.bugfix diff --git a/changelog.d/7186.bugfix b/changelog.d/7186.bugfix new file mode 100644 index 0000000000..418dbbda9f --- /dev/null +++ b/changelog.d/7186.bugfix @@ -0,0 +1 @@ +Fixes Room List not getting updated when fragment is not in focus From e9d809d9c338b9ed3707945ba9ef4dc6e24a22a2 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Mon, 19 Sep 2022 18:50:05 +0200 Subject: [PATCH 077/131] Move and enable deferred DMs into labs settings --- library/ui-strings/src/main/res/values/strings.xml | 3 +++ .../features/debug/features/DebugFeaturesStateFactory.kt | 5 ----- .../app/features/debug/features/DebugVectorFeatures.kt | 3 --- vector-config/src/main/res/values/config-settings.xml | 1 + .../main/java/im/vector/app/features/VectorFeatures.kt | 2 -- .../features/createdirect/CreateDirectRoomViewModel.kt | 6 +++--- .../vector/app/features/createdirect/DirectRoomHelper.kt | 6 +++--- .../im/vector/app/features/settings/VectorPreferences.kt | 8 ++++++++ vector/src/main/res/xml/vector_settings_labs.xml | 6 ++++++ 9 files changed, 24 insertions(+), 16 deletions(-) diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 714b48e8b4..99ff55a93d 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -442,6 +442,9 @@ Enable new layout A simplified Element with optional tabs + Enable deferred DMs + Direct rooms will be created after sending a first message. + Invites Low priority diff --git a/vector-app/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt b/vector-app/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt index 9b2711a8c3..9118dea1e3 100644 --- a/vector-app/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt +++ b/vector-app/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt @@ -80,11 +80,6 @@ class DebugFeaturesStateFactory @Inject constructor( key = DebugFeatureKeys.forceUsageOfOpusEncoder, factory = VectorFeatures::forceUsageOfOpusEncoder ), - createBooleanFeature( - label = "Start DM on first message", - key = DebugFeatureKeys.startDmOnFirstMsg, - factory = VectorFeatures::shouldStartDmOnFirstMessage - ), createBooleanFeature( label = "Enable New App Layout", key = DebugFeatureKeys.newAppLayoutEnabled, diff --git a/vector-app/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt b/vector-app/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt index bb4cae3201..c01c058fc6 100644 --- a/vector-app/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt +++ b/vector-app/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt @@ -73,9 +73,6 @@ class DebugVectorFeatures( override fun forceUsageOfOpusEncoder(): Boolean = read(DebugFeatureKeys.forceUsageOfOpusEncoder) ?: vectorFeatures.forceUsageOfOpusEncoder() - override fun shouldStartDmOnFirstMessage(): Boolean = read(DebugFeatureKeys.startDmOnFirstMsg) - ?: vectorFeatures.shouldStartDmOnFirstMessage() - override fun isNewAppLayoutFeatureEnabled(): Boolean = read(DebugFeatureKeys.newAppLayoutEnabled) ?: vectorFeatures.isNewAppLayoutFeatureEnabled() diff --git a/vector-config/src/main/res/values/config-settings.xml b/vector-config/src/main/res/values/config-settings.xml index 8953138e5e..3342b1da14 100755 --- a/vector-config/src/main/res/values/config-settings.xml +++ b/vector-config/src/main/res/values/config-settings.xml @@ -37,6 +37,7 @@ true + true false true true diff --git a/vector/src/main/java/im/vector/app/features/VectorFeatures.kt b/vector/src/main/java/im/vector/app/features/VectorFeatures.kt index dbdb0ba1c7..e1c083db29 100644 --- a/vector/src/main/java/im/vector/app/features/VectorFeatures.kt +++ b/vector/src/main/java/im/vector/app/features/VectorFeatures.kt @@ -33,7 +33,6 @@ interface VectorFeatures { fun isScreenSharingEnabled(): Boolean fun isLocationSharingEnabled(): Boolean fun forceUsageOfOpusEncoder(): Boolean - fun shouldStartDmOnFirstMessage(): Boolean /** * This is only to enable if the labs flag should be visible and effective. @@ -56,7 +55,6 @@ class DefaultVectorFeatures : VectorFeatures { override fun isScreenSharingEnabled(): Boolean = true override fun isLocationSharingEnabled() = Config.ENABLE_LOCATION_SHARING override fun forceUsageOfOpusEncoder(): Boolean = false - override fun shouldStartDmOnFirstMessage(): Boolean = false override fun isNewAppLayoutFeatureEnabled(): Boolean = true override fun isNewDeviceManagementEnabled(): Boolean = false } 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 61ebc82767..3f67708a28 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 @@ -26,11 +26,11 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.mvrx.runCatchingToAsync import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.VectorFeatures import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.plan.CreatedRoom import im.vector.app.features.raw.wellknown.getElementWellknown import im.vector.app.features.raw.wellknown.isE2EByDefault +import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.userdirectory.PendingSelection import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -45,9 +45,9 @@ import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams class CreateDirectRoomViewModel @AssistedInject constructor( @Assisted initialState: CreateDirectRoomViewState, private val rawService: RawService, + private val vectorPreferences: VectorPreferences, val session: Session, val analyticsTracker: AnalyticsTracker, - val vectorFeatures: VectorFeatures ) : VectorViewModel(initialState) { @@ -124,7 +124,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor( } val result = runCatchingToAsync { - if (vectorFeatures.shouldStartDmOnFirstMessage()) { + if (vectorPreferences.isDeferredDmEnabled()) { session.roomService().createLocalRoom(roomParams) } else { analyticsTracker.capture(CreatedRoom(isDM = roomParams.isDirect.orFalse())) diff --git a/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt b/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt index c2cc13920f..466aca1176 100644 --- a/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt +++ b/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt @@ -16,11 +16,11 @@ package im.vector.app.features.createdirect -import im.vector.app.features.VectorFeatures import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.plan.CreatedRoom import im.vector.app.features.raw.wellknown.getElementWellknown import im.vector.app.features.raw.wellknown.isE2EByDefault +import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService @@ -32,7 +32,7 @@ class DirectRoomHelper @Inject constructor( private val rawService: RawService, private val session: Session, private val analyticsTracker: AnalyticsTracker, - private val vectorFeatures: VectorFeatures, + private val vectorPreferences: VectorPreferences, ) { suspend fun ensureDMExists(userId: String): String { @@ -50,7 +50,7 @@ class DirectRoomHelper @Inject constructor( setDirectMessage() enableEncryptionIfInvitedUsersSupportIt = adminE2EByDefault } - roomId = if (vectorFeatures.shouldStartDmOnFirstMessage()) { + roomId = if (vectorPreferences.isDeferredDmEnabled()) { session.roomService().createLocalRoom(roomParams) } else { analyticsTracker.capture(CreatedRoom(isDM = roomParams.isDirect.orFalse())) 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 fca931eaef..4da6455f74 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 @@ -66,6 +66,7 @@ class VectorPreferences @Inject constructor( const val SETTINGS_BACKGROUND_SYNC_DIVIDER_PREFERENCE_KEY = "SETTINGS_BACKGROUND_SYNC_DIVIDER_PREFERENCE_KEY" const val SETTINGS_LABS_PREFERENCE_KEY = "SETTINGS_LABS_PREFERENCE_KEY" const val SETTINGS_LABS_NEW_APP_LAYOUT_KEY = "SETTINGS_LABS_NEW_APP_LAYOUT_KEY" + const val SETTINGS_LABS_DEFERRED_DM_KEY = "SETTINGS_LABS_DEFERRED_DM_KEY" const val SETTINGS_CRYPTOGRAPHY_PREFERENCE_KEY = "SETTINGS_CRYPTOGRAPHY_PREFERENCE_KEY" const val SETTINGS_CRYPTOGRAPHY_DIVIDER_PREFERENCE_KEY = "SETTINGS_CRYPTOGRAPHY_DIVIDER_PREFERENCE_KEY" const val SETTINGS_CRYPTOGRAPHY_MANAGE_PREFERENCE_KEY = "SETTINGS_CRYPTOGRAPHY_MANAGE_PREFERENCE_KEY" @@ -1162,6 +1163,13 @@ class VectorPreferences @Inject constructor( defaultPrefs.getBoolean(SETTINGS_LABS_NEW_APP_LAYOUT_KEY, getDefault(R.bool.settings_labs_new_app_layout_default)) } + /** + * Indicates whether or not deferred DMs are enabled. + */ + fun isDeferredDmEnabled(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_LABS_DEFERRED_DM_KEY, getDefault(R.bool.settings_labs_deferred_dm_default)) + } + fun showLiveSenderInfo(): Boolean { return defaultPrefs.getBoolean(SETTINGS_TIMELINE_SHOW_LIVE_SENDER_INFO, getDefault(R.bool.settings_timeline_show_live_sender_info_default)) } diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index f61d5fe7bc..8baeaad3c6 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -89,4 +89,10 @@ android:summary="@string/labs_enable_new_app_layout_summary" android:title="@string/labs_enable_new_app_layout_title" /> + + From 3786bd9c65f6dc473393e556fc55a4f68ad2a863 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 20 Sep 2022 10:02:33 +0200 Subject: [PATCH 078/131] changelog --- changelog.d/7180.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7180.feature diff --git a/changelog.d/7180.feature b/changelog.d/7180.feature new file mode 100644 index 0000000000..bdfe090ceb --- /dev/null +++ b/changelog.d/7180.feature @@ -0,0 +1 @@ +Deferred DMs - Enable and move the feature to labs settings From dd92bb756a3c331fe6d0af12ed8e66fb00a9b9fc Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 21 Sep 2022 09:27:37 +0200 Subject: [PATCH 079/131] Add visibility setting field for lab setting --- vector-config/src/main/res/values/config-settings.xml | 1 + vector/src/main/res/xml/vector_settings_labs.xml | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/vector-config/src/main/res/values/config-settings.xml b/vector-config/src/main/res/values/config-settings.xml index 3342b1da14..c69452e3d0 100755 --- a/vector-config/src/main/res/values/config-settings.xml +++ b/vector-config/src/main/res/values/config-settings.xml @@ -37,6 +37,7 @@ true + true true false true diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index 8baeaad3c6..9fac6d722a 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -47,8 +47,8 @@ @@ -93,6 +93,7 @@ android:defaultValue="@bool/settings_labs_deferred_dm_default" android:key="SETTINGS_LABS_DEFERRED_DM_KEY" android:summary="@string/labs_enable_deferred_dm_summary" - android:title="@string/labs_enable_deferred_dm_title" /> + android:title="@string/labs_enable_deferred_dm_title" + app:isPreferenceVisible="@bool/settings_labs_deferred_dm_visible" /> From fa8b56b1ad0790f73a09661203a2f78b21a8d72d Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 21 Sep 2022 09:35:26 +0200 Subject: [PATCH 080/131] Restore tracking for deferred DMs --- .../app/features/home/room/detail/TimelineViewModel.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 a6513ffc4f..02dd2604e1 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 @@ -39,6 +39,7 @@ import im.vector.app.core.utils.BehaviorDataSource import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.DecryptionFailureTracker import im.vector.app.features.analytics.extensions.toAnalyticsJoinedRoom +import im.vector.app.features.analytics.plan.CreatedRoom import im.vector.app.features.analytics.plan.JoinedRoom import im.vector.app.features.call.conference.ConferenceEvent import im.vector.app.features.call.conference.JitsiActiveConferenceHolder @@ -78,6 +79,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.matrix.android.sdk.api.MatrixPatterns +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.raw.RawService @@ -1247,8 +1249,12 @@ class TimelineViewModel @AssistedInject constructor( LocalRoomCreationState.FAILURE -> { _viewEvents.post(RoomDetailViewEvents.HideWaitingView) } - LocalRoomCreationState.CREATED -> - _viewEvents.post(RoomDetailViewEvents.OpenRoom(room.localRoomSummary()?.replacementRoomId!!, true)) + LocalRoomCreationState.CREATED -> { + room.localRoomSummary()?.let { + analyticsTracker.capture(CreatedRoom(isDM = it.roomSummary?.isDirect.orFalse())) + _viewEvents.post(RoomDetailViewEvents.OpenRoom(it.replacementRoomId!!, true)) + } + } } } .launchIn(viewModelScope) From c252f6eb70f89559e057b61b8a79a5bb86640a6f Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 21 Sep 2022 09:50:05 +0200 Subject: [PATCH 081/131] Update lab setting wording following design review --- library/ui-strings/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 99ff55a93d..0364cc4565 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -443,7 +443,7 @@ A simplified Element with optional tabs Enable deferred DMs - Direct rooms will be created after sending a first message. + Create DM only on first message Invites From 602b378b65652334641fe81182cd577143275a15 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Wed, 21 Sep 2022 10:43:08 +0200 Subject: [PATCH 082/131] cancel flow when order is changed --- .../home/room/list/home/HomeRoomListViewModel.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index 4bc5d8ba95..18ab57dce9 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -36,6 +36,8 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.room.list.home.header.HomeRoomFilter import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow @@ -70,6 +72,7 @@ import org.matrix.android.sdk.api.session.room.state.isPublic import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.flow.flow +import java.util.concurrent.CancellationException class HomeRoomListViewModel @AssistedInject constructor( @Assisted initialState: HomeRoomListViewState, @@ -99,6 +102,8 @@ class HomeRoomListViewModel @AssistedInject constructor( private val _emptyStateFlow = MutableSharedFlow>(replay = 1) val emptyStateFlow = _emptyStateFlow.asSharedFlow() + private var roomsFlowJob: Job? = null + private var filteredPagedRoomSummariesLive: UpdatableLivePageResult? = null init { @@ -256,7 +261,9 @@ class HomeRoomListViewModel @AssistedInject constructor( .also { roomsFlow = it } .launchIn(viewModelScope) - liveResults.livePagedList + roomsFlowJob?.cancel(CancellationException()) + + roomsFlowJob = liveResults.livePagedList .asFlow() .onEach { setState { copy(roomsPagedList = it) } From d8060a7922ca65a94a56f631009713c57d418f38 Mon Sep 17 00:00:00 2001 From: NIkita Fedrunov Date: Wed, 21 Sep 2022 11:28:21 +0200 Subject: [PATCH 083/131] review fixes --- .../home/room/list/home/HomeFilteredRoomsController.kt | 8 ++++++++ .../features/home/room/list/home/HomeRoomListFragment.kt | 2 +- .../features/home/room/list/home/HomeRoomListViewModel.kt | 6 ------ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt index ebf322dc23..2b4a514750 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt @@ -16,6 +16,7 @@ package im.vector.app.features.home.room.list.home +import androidx.paging.PagedList import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.paging.PagedListEpoxyController import im.vector.app.core.platform.StateView @@ -75,6 +76,13 @@ class HomeFilteredRoomsController @Inject constructor( this.emptyStateData = state } + fun submitPagedList(newList: PagedList) { + submitList(newList) + if (newList.isEmpty()) { + requestForcedModelBuild() + } + } + override fun buildItemModel(currentPosition: Int, item: RoomSummary?): EpoxyModel<*> { return if (item == null) { val host = this diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt index 4d61057b59..9b8a686f37 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt @@ -154,7 +154,7 @@ class HomeRoomListFragment : roomListViewModel.onEach(HomeRoomListViewState::roomsPagedList) { roomsList -> roomsList?.let { - roomsController.submitList(it) + roomsController.submitPagedList(it) if (it.isEmpty()) { roomsController.requestForcedModelBuild() } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index 18ab57dce9..ad2656cec1 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -19,7 +19,6 @@ package im.vector.app.features.home.room.list.home import android.widget.ImageView import androidx.lifecycle.asFlow import androidx.paging.PagedList -import arrow.core.Option import arrow.core.toOption import com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted @@ -37,7 +36,6 @@ import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.room.list.home.header.HomeRoomFilter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow @@ -46,7 +44,6 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach @@ -90,7 +87,6 @@ class HomeRoomListViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() - private var roomsFlow: Flow>? = null private val pagedListConfig = PagedList.Config.Builder() .setPageSize(10) .setInitialLoadSizeHint(20) @@ -258,7 +254,6 @@ class HomeRoomListViewModel @AssistedInject constructor( ) emitEmptyState() } - .also { roomsFlow = it } .launchIn(viewModelScope) roomsFlowJob?.cancel(CancellationException()) @@ -268,7 +263,6 @@ class HomeRoomListViewModel @AssistedInject constructor( .onEach { setState { copy(roomsPagedList = it) } } - .flowOn(Dispatchers.Default) .launchIn(viewModelScope) } From b82b5a6979d333b031f49feb2ed33bc8142589a3 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Wed, 21 Sep 2022 08:31:22 +0000 Subject: [PATCH 084/131] Translated using Weblate (German) Currently translated at 98.9% (2362 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- library/ui-strings/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 715018264c..6c7bb03a50 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -1845,7 +1845,7 @@ Einmalanmeldung Anmelden mit %s Registrieren mit %s - Mit %s weitermachen + Weiter mit %s Knopf zum Nachrichteneditor hinzufügen, der die Emoji-Tastatur öffnet Emoji-Tastatur anzeigen Nutze /confetti oder sende Nachrichten mit ❄️ oder 🎉 From d9faad63641cddd29d90bd8ab367d73aa1e6e27b Mon Sep 17 00:00:00 2001 From: Nui Harime Date: Tue, 20 Sep 2022 23:50:31 +0000 Subject: [PATCH 085/131] Translated using Weblate (Russian) Currently translated at 98.0% (2339 of 2386 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/ --- library/ui-strings/src/main/res/values-ru/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ui-strings/src/main/res/values-ru/strings.xml b/library/ui-strings/src/main/res/values-ru/strings.xml index bed6976f7e..e321b8777d 100644 --- a/library/ui-strings/src/main/res/values-ru/strings.xml +++ b/library/ui-strings/src/main/res/values-ru/strings.xml @@ -2694,4 +2694,5 @@ Добро пожаловать в ${app_name}, \n%s. Оставить отзыв + Текущая сессия готова к безопасному обмену сообщениями. \ No newline at end of file From 793138bf1bf73782eea70ecafe88ffa4e868dfa6 Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Wed, 21 Sep 2022 16:44:47 +0300 Subject: [PATCH 086/131] Revert changes of string keys. --- library/ui-strings/src/main/res/values-ar/strings.xml | 2 +- library/ui-strings/src/main/res/values-bg/strings.xml | 2 +- .../ui-strings/src/main/res/values-bn-rBD/strings.xml | 2 +- .../ui-strings/src/main/res/values-bn-rIN/strings.xml | 2 +- library/ui-strings/src/main/res/values-ca/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-cs/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-de/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-el/strings.xml | 2 +- library/ui-strings/src/main/res/values-eo/strings.xml | 2 +- .../ui-strings/src/main/res/values-es-rMX/strings.xml | 2 +- library/ui-strings/src/main/res/values-es/strings.xml | 2 +- library/ui-strings/src/main/res/values-et/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-eu/strings.xml | 2 +- library/ui-strings/src/main/res/values-fa/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-fi/strings.xml | 2 +- .../ui-strings/src/main/res/values-fr-rCA/strings.xml | 2 +- library/ui-strings/src/main/res/values-fr/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-gl/strings.xml | 2 +- library/ui-strings/src/main/res/values-hr/strings.xml | 2 +- library/ui-strings/src/main/res/values-hu/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-in/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-is/strings.xml | 2 +- library/ui-strings/src/main/res/values-it/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-iw/strings.xml | 2 +- library/ui-strings/src/main/res/values-ja/strings.xml | 2 +- library/ui-strings/src/main/res/values-kab/strings.xml | 2 +- library/ui-strings/src/main/res/values-ko/strings.xml | 2 +- library/ui-strings/src/main/res/values-lo/strings.xml | 2 +- library/ui-strings/src/main/res/values-lv/strings.xml | 2 +- .../ui-strings/src/main/res/values-nb-rNO/strings.xml | 2 +- library/ui-strings/src/main/res/values-nl/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-nn/strings.xml | 2 +- library/ui-strings/src/main/res/values-pl/strings.xml | 6 +++--- .../ui-strings/src/main/res/values-pt-rBR/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-pt/strings.xml | 2 +- library/ui-strings/src/main/res/values-ru/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-sk/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-sq/strings.xml | 2 +- library/ui-strings/src/main/res/values-sv/strings.xml | 2 +- library/ui-strings/src/main/res/values-te/strings.xml | 2 +- library/ui-strings/src/main/res/values-tr/strings.xml | 2 +- library/ui-strings/src/main/res/values-uk/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-vi/strings.xml | 2 +- .../ui-strings/src/main/res/values-zh-rCN/strings.xml | 6 +++--- .../ui-strings/src/main/res/values-zh-rTW/strings.xml | 6 +++--- library/ui-strings/src/main/res/values/strings.xml | 9 ++++++--- .../devices/v2/details/SessionDetailsController.kt | 2 +- vector/src/main/res/layout/dialog_device_verify.xml | 2 +- vector/src/main/res/layout/fragment_other_sessions.xml | 4 ++-- vector/src/main/res/layout/fragment_settings_devices.xml | 4 ++-- .../main/res/xml/vector_settings_security_privacy.xml | 2 +- 51 files changed, 92 insertions(+), 89 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ar/strings.xml b/library/ui-strings/src/main/res/values-ar/strings.xml index 70b9a33ab5..073f961cb6 100644 --- a/library/ui-strings/src/main/res/values-ar/strings.xml +++ b/library/ui-strings/src/main/res/values-ar/strings.xml @@ -320,7 +320,7 @@ السمة خطأ في فكّ التعمية اسم الجهاز - معرّف الجهاز + معرّف الجهاز مفتاح الجهاز صدّر مفاتيح الغرفة صدّر المفاتيح إلى ملف محلي diff --git a/library/ui-strings/src/main/res/values-bg/strings.xml b/library/ui-strings/src/main/res/values-bg/strings.xml index d3e9e599bc..b29823040f 100644 --- a/library/ui-strings/src/main/res/values-bg/strings.xml +++ b/library/ui-strings/src/main/res/values-bg/strings.xml @@ -396,7 +396,7 @@ Тема Грешка при разшифроване Публично име - Сесийно ID + Сесийно ID Ключ на устройство Експортирай E2E ключове за стая Експортиране на ключове за стая diff --git a/library/ui-strings/src/main/res/values-bn-rBD/strings.xml b/library/ui-strings/src/main/res/values-bn-rBD/strings.xml index 7897da934e..2f068f1bf8 100644 --- a/library/ui-strings/src/main/res/values-bn-rBD/strings.xml +++ b/library/ui-strings/src/main/res/values-bn-rBD/strings.xml @@ -789,7 +789,7 @@ রুমের কুঞ্জিগুলি এক্সপোর্ট করুন শেষ থেকে শেষ রুমের কুঞ্জিগুলি এক্সপোর্ট করুন সেশানের কুঞ্জি - আইডি + আইডি সর্বজনীন নাম ডিক্রিপশন সমস্যা থিম diff --git a/library/ui-strings/src/main/res/values-bn-rIN/strings.xml b/library/ui-strings/src/main/res/values-bn-rIN/strings.xml index 56bde36977..828bc3bd34 100644 --- a/library/ui-strings/src/main/res/values-bn-rIN/strings.xml +++ b/library/ui-strings/src/main/res/values-bn-rIN/strings.xml @@ -693,7 +693,7 @@ ডিক্রিপশন সমস্যা সর্বজনীন নাম - আইডি + আইডি সেশানের কুঞ্জি শেষ থেকে শেষ রুমের কুঞ্জিগুলি এক্সপোর্ট করুন diff --git a/library/ui-strings/src/main/res/values-ca/strings.xml b/library/ui-strings/src/main/res/values-ca/strings.xml index 3abd45e2d3..13a5b6c119 100644 --- a/library/ui-strings/src/main/res/values-ca/strings.xml +++ b/library/ui-strings/src/main/res/values-ca/strings.xml @@ -448,7 +448,7 @@ Tema Error al desxifrar Nom públic - ID de sessió + ID de sessió Clau de sessió Exporta les claus de la sala E2E Exporta les claus de la sala @@ -2602,8 +2602,8 @@ Tots els xats Preferències de disseny Explora sales - Per estar més segur, verifica les teves sessions i tanca qualsevol sessió que no reconeguis o ja no utilitzis. - Altres sessions + Per estar més segur, verifica les teves sessions i tanca qualsevol sessió que no reconeguis o ja no utilitzis. + Altres sessions Sessions Obre la llista d\'espais Crea un nou xat o sala diff --git a/library/ui-strings/src/main/res/values-cs/strings.xml b/library/ui-strings/src/main/res/values-cs/strings.xml index 8316eab2c3..b7bfeac444 100644 --- a/library/ui-strings/src/main/res/values-cs/strings.xml +++ b/library/ui-strings/src/main/res/values-cs/strings.xml @@ -635,7 +635,7 @@ Motiv vzhledu Chyba dešifrování Veřejné jméno - ID relace + ID relace Klíč relace Export E2E klíčů místností Export klíčů místností @@ -2651,8 +2651,8 @@ Otevřít nastavení Všechny konverzace Zobrazit všechny relace (V2, WIP) - V zájmu co nejlepšího zabezpečení ověřujte své relace a odhlašujte se ze všech relací, které již nepoznáváte nebo nepoužíváte. - Ostatní relace + V zájmu co nejlepšího zabezpečení ověřujte své relace a odhlašujte se ze všech relací, které již nepoznáváte nebo nepoužíváte. + Ostatní relace Relace Seznam otevřených prostorů Vytvořit novou konverzaci nebo místnost diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 827311bde6..3753cedff2 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -418,7 +418,7 @@ Als Hauptadresse aufheben Entschlüsselungsfehler Öffentlicher Name - Sitzungs-ID + Sitzungs-ID Sitzungsschlüssel Ende-zu-Ende-Raumschlüssel exportieren Raumschlüssel exportieren @@ -2587,8 +2587,8 @@ Personen Schreibe deine erste Nachricht, um %s zur Konversation einzuladen Alle Sitzungen anzeigen (V2, in Arbeit) - Für bestmögliche Sicherheit verifiziere deine Sitzungen und melde dich von allen ab, die du nicht erkennst oder nutzt. - Andere Sitzungen + Für bestmögliche Sicherheit verifiziere deine Sitzungen und melde dich von allen ab, die du nicht erkennst oder nutzt. + Andere Sitzungen Sitzungen Space-Liste öffnen Beginne ein Gespräch oder erstelle einen Raum diff --git a/library/ui-strings/src/main/res/values-el/strings.xml b/library/ui-strings/src/main/res/values-el/strings.xml index f4973f4b95..092a01bff4 100644 --- a/library/ui-strings/src/main/res/values-el/strings.xml +++ b/library/ui-strings/src/main/res/values-el/strings.xml @@ -172,7 +172,7 @@ Θέμα Σφάλμα αποκρυπτογράφησης Όνομα συσκευής - Αναγνωριστικό συσκευής + Αναγνωριστικό συσκευής Εξαγωγή Εισαγωγή Επιλέξτε ένα ευρετήριο δωματίων diff --git a/library/ui-strings/src/main/res/values-eo/strings.xml b/library/ui-strings/src/main/res/values-eo/strings.xml index f536ca00f9..7e1925f708 100644 --- a/library/ui-strings/src/main/res/values-eo/strings.xml +++ b/library/ui-strings/src/main/res/values-eo/strings.xml @@ -1084,7 +1084,7 @@ Elporti ŝlosilojn de ĉambroj Elporti tutvoje ĉifrajn ŝlosilojn de ĉambroj Ŝlosilo de salutaĵo - Identigilo de salutaĵo + Identigilo de salutaĵo Publika nomo Eraris malĉifrado Haŭto diff --git a/library/ui-strings/src/main/res/values-es-rMX/strings.xml b/library/ui-strings/src/main/res/values-es-rMX/strings.xml index c82f9aff61..0b38fa6a19 100644 --- a/library/ui-strings/src/main/res/values-es-rMX/strings.xml +++ b/library/ui-strings/src/main/res/values-es-rMX/strings.xml @@ -249,7 +249,7 @@ Desescojer como Dirección Principal Error en descifrar Nombre del dispositivo - Identificación del dispositivo + Identificación del dispositivo Clave del dispositivo Exportar claves de cifrado de extremo-a-extremo de salas Exportar claves de salas diff --git a/library/ui-strings/src/main/res/values-es/strings.xml b/library/ui-strings/src/main/res/values-es/strings.xml index fcdd3f90a0..4eec90fbd6 100644 --- a/library/ui-strings/src/main/res/values-es/strings.xml +++ b/library/ui-strings/src/main/res/values-es/strings.xml @@ -415,7 +415,7 @@ Dejar de Establecer como dirección principal Error de descifrado Nombre público - ID de sesión + ID de sesión Clave de sesión Exportar claves de salas con cifrado Extremo-a-Extremo Exportar claves de sala diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index d9754b5dcb..55fb9dfef0 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -612,7 +612,7 @@ Need on alles katsejärgus olevad funktsionaalsused. Ole kasutamisel ettevaatlik. Dekrüptimise viga Avalik nimi - Sessiooni tunnus + Sessiooni tunnus Sessiooni võti Ekspordi jututubade läbiva krüptimise võtmed Ekspordi jututoa võtmed @@ -2592,8 +2592,8 @@ Ava seadistused Kõik vestlused Näita kõiki sessioone (V2, WIP) - Parima turvalisuse nimel verifitseeri kõik oma sessioonid ning logi välja neist, mida sa enam ei kasuta. - Muud sessioonid + Parima turvalisuse nimel verifitseeri kõik oma sessioonid ning logi välja neist, mida sa enam ei kasuta. + Muud sessioonid Sessionid Ava kogukondade loend Alusta uut vestlust või loo uus jututuba diff --git a/library/ui-strings/src/main/res/values-eu/strings.xml b/library/ui-strings/src/main/res/values-eu/strings.xml index f1f834ee04..7b27d1cc1d 100644 --- a/library/ui-strings/src/main/res/values-eu/strings.xml +++ b/library/ui-strings/src/main/res/values-eu/strings.xml @@ -406,7 +406,7 @@ Kontuan izan ekintza honek aplikazioa berrabiaraziko duela eta denbora bat behar Deszifratze errorea Izen publikoa - IDa + IDa Saioaren gakoa Esportatu E2E geletako gakoak diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index b7a818f58a..e104225389 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -678,7 +678,7 @@ این‌ها ویژگی‌های آزمایشی‌ای هستند که ممکن است به روش‌های نامنتظره‌ای حراب شوندا. با احتیاط استفاده کنید. تنظیم به عنوان نشانی اصلی نام عمومی - شناسهٔ نشست + شناسهٔ نشست کلید نشست برون‌ریزی کلید‌های اتاق‌های سرتاسری برون‌ریزی کلید‌های اتاق‌ها @@ -2601,8 +2601,8 @@ گشودن تنظیمات تمامی گپ‌ها نمایش تمامی نشست‌ها (ن۲، دح‌ت) - برای امنیت بیش‌تر، نشست‌هایتان را تأیید و از هر نشستی که تشخیصش نمی‌دهید یا دیگر استفاده نمی‌کنید خارج شوید. - دیگر نشست‌ها + برای امنیت بیش‌تر، نشست‌هایتان را تأیید و از هر نشستی که تشخیصش نمی‌دهید یا دیگر استفاده نمی‌کنید خارج شوید. + دیگر نشست‌ها نشست‌ها گشودن سیاههٔ فضاها ایجاد اتاق یا گفت‌وگویی جدید diff --git a/library/ui-strings/src/main/res/values-fi/strings.xml b/library/ui-strings/src/main/res/values-fi/strings.xml index a576e7f0dc..fde2502ae0 100644 --- a/library/ui-strings/src/main/res/values-fi/strings.xml +++ b/library/ui-strings/src/main/res/values-fi/strings.xml @@ -366,7 +366,7 @@ Kumoa pääosoitteeksi asettaminen Salauksenpurkuvirhe Julkinen nimi - Istunnon tunnus + Istunnon tunnus Istunnon avain Vie salatun huoneen avaimet Vie huoneen avaimet diff --git a/library/ui-strings/src/main/res/values-fr-rCA/strings.xml b/library/ui-strings/src/main/res/values-fr-rCA/strings.xml index 94db2935a7..29a618f415 100644 --- a/library/ui-strings/src/main/res/values-fr-rCA/strings.xml +++ b/library/ui-strings/src/main/res/values-fr-rCA/strings.xml @@ -778,7 +778,7 @@ Exporter les clés des salons Exporter les clés E2E des salons Clé de la session - Identifiant de session + Identifiant de session Nom public Erreur de déchiffrement Thème diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml index f560ddbb7b..55b5f88134 100644 --- a/library/ui-strings/src/main/res/values-fr/strings.xml +++ b/library/ui-strings/src/main/res/values-fr/strings.xml @@ -346,7 +346,7 @@ Désactiver comme adresse principale Erreur de déchiffrement Nom public - Identifiant de session + Identifiant de session Clé de la session Exporter les clés E2E des salons Exporter les clés des salons @@ -2601,8 +2601,8 @@ Ouvrir les paramètres Toutes les conversations Afficher toutes les sessions (V2, en cours) - Pour une meilleure sécurité, vérifiez vos sessions et déconnectez toutes les sessions que vous ne connaissez pas ou que vous n’utilisez plus. - Autres sessions + Pour une meilleure sécurité, vérifiez vos sessions et déconnectez toutes les sessions que vous ne connaissez pas ou que vous n’utilisez plus. + Autres sessions Sessions Ouvrir la liste des espaces Créer une nouvelle conversation ou salon diff --git a/library/ui-strings/src/main/res/values-gl/strings.xml b/library/ui-strings/src/main/res/values-gl/strings.xml index c1e4e40a81..e6d26a63e5 100644 --- a/library/ui-strings/src/main/res/values-gl/strings.xml +++ b/library/ui-strings/src/main/res/values-gl/strings.xml @@ -380,7 +380,7 @@ Tema Fallo ao descifrar Nome do dispositivo - ID de sesión + ID de sesión Chave do dispositivo Exportar chaves E2E da sala Exportar chaves da sala diff --git a/library/ui-strings/src/main/res/values-hr/strings.xml b/library/ui-strings/src/main/res/values-hr/strings.xml index 6d52e5cd96..dc5930b933 100644 --- a/library/ui-strings/src/main/res/values-hr/strings.xml +++ b/library/ui-strings/src/main/res/values-hr/strings.xml @@ -572,7 +572,7 @@ Tema Greška u dešifriranju Javni naziv - Identitet + Identitet Ključ sesije Izvezi sobne ključeve za E2E Izvezi sobne ključeve diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index 32ecfaa45c..af8bf26b2e 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -351,7 +351,7 @@ Kiszedés fő címek közül Visszafejtés hiba Nyilvános név - Munkamenet-azonosító + Munkamenet-azonosító Munkamenet kulcs E2E szoba kulcsok exportálása Szoba kulcsok exportálása @@ -2615,8 +2615,8 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Web Mobil Minden munkamenet megjelenítése (V2, WIP) - A legjobb biztonság érdekében ellenőrizd a munkameneteket, és jelentkezz ki minden olyan munkamenetből, melyet már nem ismersz fel vagy nem használsz. - Más munkamenetek + A legjobb biztonság érdekében ellenőrizd a munkameneteket, és jelentkezz ki minden olyan munkamenetből, melyet már nem ismersz fel vagy nem használsz. + Más munkamenetek Munkamenetek Nyitott területek listája Új beszélgetés vagy szoba létrehozása diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml index 8f910fab6b..d1e68b4529 100644 --- a/library/ui-strings/src/main/res/values-in/strings.xml +++ b/library/ui-strings/src/main/res/values-in/strings.xml @@ -301,7 +301,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Tema Kesalahan dekripsi Nama perangkat - ID Sesi + ID Sesi Kunci perangkat Ekspor kunci ruangan terenkripsi Ekspor ruangan kunci @@ -2553,8 +2553,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Email belum diverifikasi, periksa kotak masuk Anda Semua Obrolan Tampilkan Semua Sesi (V2, Dalam Pengembangan) - Untuk keamanan terbaik, verifikasi sesi Anda dan keluarkan sesi apa pun yang Anda tidak kenal atau Anda tidak gunakan lagi. - Sesi lainnya + Untuk keamanan terbaik, verifikasi sesi Anda dan keluarkan sesi apa pun yang Anda tidak kenal atau Anda tidak gunakan lagi. + Sesi lainnya Sesi Buka daftar space Buat percakapan atau ruangan baru diff --git a/library/ui-strings/src/main/res/values-is/strings.xml b/library/ui-strings/src/main/res/values-is/strings.xml index d25d66bfba..7818761145 100644 --- a/library/ui-strings/src/main/res/values-is/strings.xml +++ b/library/ui-strings/src/main/res/values-is/strings.xml @@ -193,7 +193,7 @@ Þema Afkóðunarvilla Heiti tækis - Auðkenni setu + Auðkenni setu Dulritunarlykill setu Flytja út Settu inn lykilsetningu diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml index 01514cef90..ecb29d1586 100644 --- a/library/ui-strings/src/main/res/values-it/strings.xml +++ b/library/ui-strings/src/main/res/values-it/strings.xml @@ -430,7 +430,7 @@ Tema Errore di decriptazione Nome pubblico - ID sessione + ID sessione Chiave sessione Esporta le chiavi di crittografia E2E delle stanze Esporta le chiavi delle stanze @@ -2592,8 +2592,8 @@ Apri le impostazioni Tutte le chat Mostra tutte le sessioni (V2, WIP) - Per una maggiore sicurezza, verifica le tue sessioni e disconnetti quelle che non riconosci o che non usi più. - Altre sessioni + Per una maggiore sicurezza, verifica le tue sessioni e disconnetti quelle che non riconosci o che non usi più. + Altre sessioni Sessioni Apri elenco spazi Crea una nuova conversazione o stanza diff --git a/library/ui-strings/src/main/res/values-iw/strings.xml b/library/ui-strings/src/main/res/values-iw/strings.xml index ff19310c8e..6d9533852b 100644 --- a/library/ui-strings/src/main/res/values-iw/strings.xml +++ b/library/ui-strings/src/main/res/values-iw/strings.xml @@ -542,7 +542,7 @@ יצא מפתחות חדר ייצא מפתחות חדר E2E מזהה מפתח - מזהה מושב + מזהה מושב שם ציבורי שגיאת פענוח ערכת נושא diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 3e817e398c..b781e4d7f0 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -197,7 +197,7 @@ これらは予期しない不具合が生じるかもしれない実験的機能です。慎重に使用してください。 メインアドレスとして設定 メインアドレスとしての設定を解除 - セッションID + セッションID 文字の大きさ とても小さい 小さい diff --git a/library/ui-strings/src/main/res/values-kab/strings.xml b/library/ui-strings/src/main/res/values-kab/strings.xml index 353fb99f53..a79b72efde 100644 --- a/library/ui-strings/src/main/res/values-kab/strings.xml +++ b/library/ui-strings/src/main/res/values-kab/strings.xml @@ -291,7 +291,7 @@ Talqayt Tinarimin Asentel - Asulay n tqimit + Asulay n tqimit Tasarut n tɣimit Sifeḍ tisura n texxamt E2E Sifeḍ tisura n texxamt diff --git a/library/ui-strings/src/main/res/values-ko/strings.xml b/library/ui-strings/src/main/res/values-ko/strings.xml index 37e8849fa8..ba0cbe5abd 100644 --- a/library/ui-strings/src/main/res/values-ko/strings.xml +++ b/library/ui-strings/src/main/res/values-ko/strings.xml @@ -431,7 +431,7 @@ 테마 암호 복호화 오류 공개 이름 - ID + ID 기기 키 종단간 암호화 방 키 내보내기 방 키 내보내기 diff --git a/library/ui-strings/src/main/res/values-lo/strings.xml b/library/ui-strings/src/main/res/values-lo/strings.xml index a92adb0225..1a9a2820b8 100644 --- a/library/ui-strings/src/main/res/values-lo/strings.xml +++ b/library/ui-strings/src/main/res/values-lo/strings.xml @@ -909,7 +909,7 @@ ສົ່ງອອກກະແຈຫ້ອງ ສົ່ງອອກກະແຈຫ້ອງ E2E ລະຫັດລະບົບ - ID ລະບົບ + ID ລະບົບ ຊື່ສາທາລະນະ ການຖອດລະຫັດຜິດພາດ ຫົວຂໍ້ diff --git a/library/ui-strings/src/main/res/values-lv/strings.xml b/library/ui-strings/src/main/res/values-lv/strings.xml index 1787653fae..f1fa1502c1 100644 --- a/library/ui-strings/src/main/res/values-lv/strings.xml +++ b/library/ui-strings/src/main/res/values-lv/strings.xml @@ -469,7 +469,7 @@ Tēma Atšifrēšanas kļūda Ierīces nosaukums - Sesijas ID + Sesijas ID Sesijas atslēga Eksportēt istabas šifrēšanas atslēgas Eksportēt istabas atslēgas diff --git a/library/ui-strings/src/main/res/values-nb-rNO/strings.xml b/library/ui-strings/src/main/res/values-nb-rNO/strings.xml index 7af718d920..031b380c7e 100644 --- a/library/ui-strings/src/main/res/values-nb-rNO/strings.xml +++ b/library/ui-strings/src/main/res/values-nb-rNO/strings.xml @@ -119,7 +119,7 @@ Bannlyste brukere Avansert Tema - Økt-ID + Økt-ID Øktnøkkel Eksporter Importer diff --git a/library/ui-strings/src/main/res/values-nl/strings.xml b/library/ui-strings/src/main/res/values-nl/strings.xml index af2aa291fc..b1d239963e 100644 --- a/library/ui-strings/src/main/res/values-nl/strings.xml +++ b/library/ui-strings/src/main/res/values-nl/strings.xml @@ -275,7 +275,7 @@ Niet instellen als hoofdadres Ontsleutelingsfout Publieke naam - Sessie ID + Sessie ID Sessiesleutel E2E-gesprekssleutels exporteren Gesprekssleutels exporteren @@ -2600,8 +2600,8 @@ Kan kaart niet laden \nDeze server is mogelijk niet geconfigureerd om kaarten weer te geven. Open instellingen - Voor de beste beveiliging verifieert u uw sessies en meldt u zich af bij elke sessie die u niet meer herkent of gebruikt. - Andere sessies + Voor de beste beveiliging verifieert u uw sessies en meldt u zich af bij elke sessie die u niet meer herkent of gebruikt. + Andere sessies Sessies Lijst met publieke spaces Maak een nieuw gesprek of een nieuwe kamer diff --git a/library/ui-strings/src/main/res/values-nn/strings.xml b/library/ui-strings/src/main/res/values-nn/strings.xml index 45c8679736..a56ba0ac30 100644 --- a/library/ui-strings/src/main/res/values-nn/strings.xml +++ b/library/ui-strings/src/main/res/values-nn/strings.xml @@ -310,7 +310,7 @@ Preg Noko gjekk gale med dekrypteringa Offentleg namn - Økt-ID + Økt-ID Sesjonsnøkkel Eksporter E2E-romnøkklar Eksporter romnøkklar diff --git a/library/ui-strings/src/main/res/values-pl/strings.xml b/library/ui-strings/src/main/res/values-pl/strings.xml index e6b3a0c35c..a657709543 100644 --- a/library/ui-strings/src/main/res/values-pl/strings.xml +++ b/library/ui-strings/src/main/res/values-pl/strings.xml @@ -231,7 +231,7 @@ Ustaw jako główny adres Motyw Nazwa publiczna - ID sesji + ID sesji Eksportuj Wprowadź hasło Potwierdź hasło @@ -2697,8 +2697,8 @@ Nie można wczytać mapy. \nTen serwer macierzysty może nie być skonfigurowany do wyświetlania map. Otwórz ustawienia - Aby zapewnić najlepsze bezpieczeństwo, zweryfikuj swoje sesje i wyloguj się z każdej sesji, której już nie rozpoznajesz lub której już nie używasz. - Inne sesje + Aby zapewnić najlepsze bezpieczeństwo, zweryfikuj swoje sesje i wyloguj się z każdej sesji, której już nie rozpoznajesz lub której już nie używasz. + Inne sesje Sesje Lista otwartych przestrzeni Utwórz nową rozmowę lub pokój diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml index b45de27933..08c41db365 100644 --- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml +++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml @@ -418,7 +418,7 @@ Des-definir como endereço principal Erro de decriptação Nome público - ID de sessão + ID de sessão Chave de sessão Exportar chaves de sala E2E Exportar chaves de sala @@ -2601,8 +2601,8 @@ Abrir configurações Todos os Chats Mostrar Todas Sessões (V2, WIP) - Para a melhor segurança, verifique suas sessões e faça signout de qualquer sessão que você não reconhece ou usa mais. - Outras sessões + Para a melhor segurança, verifique suas sessões e faça signout de qualquer sessão que você não reconhece ou usa mais. + Outras sessões Sessões Abrir lista de espaços Criar uma nova conversa ou sala diff --git a/library/ui-strings/src/main/res/values-pt/strings.xml b/library/ui-strings/src/main/res/values-pt/strings.xml index 87b6297b2b..4daaef83b0 100644 --- a/library/ui-strings/src/main/res/values-pt/strings.xml +++ b/library/ui-strings/src/main/res/values-pt/strings.xml @@ -246,7 +246,7 @@ Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.< Erro de decifragem Nome do dispositivo - ID do dispositivo + ID do dispositivo Chave do dispositivo Exportar chaves E2E da sala Exportar chaves de sala diff --git a/library/ui-strings/src/main/res/values-ru/strings.xml b/library/ui-strings/src/main/res/values-ru/strings.xml index f503fec55c..8d223bae5e 100644 --- a/library/ui-strings/src/main/res/values-ru/strings.xml +++ b/library/ui-strings/src/main/res/values-ru/strings.xml @@ -432,7 +432,7 @@ Сбросить основной адрес Ошибка дешифровки Публичное имя - ID сессии + ID сессии Ключ сессии Экспорт E2E ключей комнаты Экспорт ключей комнаты @@ -2660,8 +2660,8 @@ Не удалось загрузить карту \nВозможно, этот домашний сервер не настроен для отображения карт. Все беседы - Для лучшей безопасности заверьте свои сессии и выйдите из тех, которые более не признаёте или не используете. - Другие сессии + Для лучшей безопасности заверьте свои сессии и выйдите из тех, которые более не признаёте или не используете. + Другие сессии Сессии Создать беседу или комнату Показать все сессии (V2, в разработке) diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml index 3b2392a610..2cc2d0280e 100644 --- a/library/ui-strings/src/main/res/values-sk/strings.xml +++ b/library/ui-strings/src/main/res/values-sk/strings.xml @@ -388,7 +388,7 @@ Vzhľad Chyba dešifrovania Verejné meno - ID relácie + ID relácie Kľúč relácie Exportovať šifrovacie kľúče miestnosti Exportovať kľúče miestnosti @@ -2651,8 +2651,8 @@ Otvoriť nastavenia Všetky konverzácie Zobraziť všetky relácie (V2, WIP) - V záujme čo najlepšieho zabezpečenia overte svoje relácie a odhláste sa z každej relácie, ktorú už nepoznáte alebo nepoužívate. - Iné relácie + V záujme čo najlepšieho zabezpečenia overte svoje relácie a odhláste sa z každej relácie, ktorú už nepoznáte alebo nepoužívate. + Iné relácie Relácie Otvoriť zoznam priestorov Vytvoriť novú konverzáciu alebo miestnosť diff --git a/library/ui-strings/src/main/res/values-sq/strings.xml b/library/ui-strings/src/main/res/values-sq/strings.xml index a6af0a4921..8fdf4ee310 100644 --- a/library/ui-strings/src/main/res/values-sq/strings.xml +++ b/library/ui-strings/src/main/res/values-sq/strings.xml @@ -431,7 +431,7 @@ Temë Gabim shfshehtëzimi Emër publik - ID Sesioni + ID Sesioni Kyç sesioni Eksporto kyçe dhome E2E Eksporto kyçe dhome diff --git a/library/ui-strings/src/main/res/values-sv/strings.xml b/library/ui-strings/src/main/res/values-sv/strings.xml index 30b63c213c..025713272c 100644 --- a/library/ui-strings/src/main/res/values-sv/strings.xml +++ b/library/ui-strings/src/main/res/values-sv/strings.xml @@ -918,7 +918,7 @@ Sätt upp på den här enheten Generera en ny säkerhetskopia eller sätt en ny lösenfras för din existerande säkerhetskopia. Detta är experimentella funktioner som kan gå sönder på oväntade sätt. Använd varsamt. - Sessions-ID + Sessions-ID Sessionsnyckel Exportera krypteringsnycklar Exportera rumsnycklar diff --git a/library/ui-strings/src/main/res/values-te/strings.xml b/library/ui-strings/src/main/res/values-te/strings.xml index 0154d54c2e..5ed2462ce8 100644 --- a/library/ui-strings/src/main/res/values-te/strings.xml +++ b/library/ui-strings/src/main/res/values-te/strings.xml @@ -260,7 +260,7 @@ ప్రధాన చిరునామాగా సెట్ చేయండి పరికరం పేరు - పరికరం ID + పరికరం ID పరికరం కీ E2E గది కీలను ఎగుమతి చేయండి diff --git a/library/ui-strings/src/main/res/values-tr/strings.xml b/library/ui-strings/src/main/res/values-tr/strings.xml index 1f0e5be153..c097bfce6a 100644 --- a/library/ui-strings/src/main/res/values-tr/strings.xml +++ b/library/ui-strings/src/main/res/values-tr/strings.xml @@ -376,7 +376,7 @@ Tema Çözme hatası Görünür Ad - Oturum kimliği + Oturum kimliği Oturum anahtarı E2E Oda anahtarlarını dışa aktar Oda anahtarlarını dışa aktar diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml index 1162fc2a90..1c809fff3e 100644 --- a/library/ui-strings/src/main/res/values-uk/strings.xml +++ b/library/ui-strings/src/main/res/values-uk/strings.xml @@ -354,7 +354,7 @@ Зробити не основною адресою Помилка розшифрування Загальнодоступна назва - ID сеансу + ID сеансу Ключ сеансу Експортувати E2E ключі кімнати Експортувати ключі кімнати @@ -2701,8 +2701,8 @@ Відкрити налаштування Усі бесіди Показати всі сеанси (V2, WIP) - Для найкращої безпеки перевірте свої сеанси та вийдіть з усіх сеансів, які ви більше не розпізнаєте або не використовуєте. - Інші сеанси + Для найкращої безпеки перевірте свої сеанси та вийдіть з усіх сеансів, які ви більше не розпізнаєте або не використовуєте. + Інші сеанси Сеанси Відкрити список кімнат Створити нову розмову або кімнату diff --git a/library/ui-strings/src/main/res/values-vi/strings.xml b/library/ui-strings/src/main/res/values-vi/strings.xml index c6dc97f782..2803128843 100644 --- a/library/ui-strings/src/main/res/values-vi/strings.xml +++ b/library/ui-strings/src/main/res/values-vi/strings.xml @@ -594,7 +594,7 @@ Hủy tài khoản Xem lại ngay Chìa khóa phiên - Mã phiên + Mã phiên Tên công khai Lỗi giải mã Những chức năng này mang tính thí nghiệm có thể còn nhiều lỗi. Lưu ý khi dùng. diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index e05949ff7d..ee0e95d648 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -242,7 +242,7 @@ 你的密码已更新 解密错误 公开名称 - 会话 ID + 会话 ID 会话密钥 导入 已验证 @@ -2551,8 +2551,8 @@ 打开设置 全部聊天 显示全部会话(V2, WIP) - 为获得最佳安全性,请验证你的会话,并从任何你不认识或不再使用的会话登出。 - 其他会话 + 为获得最佳安全性,请验证你的会话,并从任何你不认识或不再使用的会话登出。 + 其他会话 会话 打开空间列表 创建新对话或房间 diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index a2503f66f9..0f5208bcde 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -469,7 +469,7 @@ 主題 解密錯誤 公開名稱 - 工作階段 ID + 工作階段 ID 工作階段金鑰 匯出聊天室的端到端加密金鑰 匯出聊天室的加密金鑰 @@ -2551,8 +2551,8 @@ 開啟設定 所有聊天 顯示所有工作階段 (V2, WIP) - 為了取得最佳安全性,請驗證您的工作階段並登出任何您無法識別或不再使用的工作階段。 - 其他工作階段 + 為了取得最佳安全性,請驗證您的工作階段並登出任何您無法識別或不再使用的工作階段。 + 其他工作階段 工作階段 開啟空間清單 建立新的對話或聊天室 diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 0364cc4565..1c6150bf9c 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -2364,8 +2364,10 @@ Manage Sessions Sign out of this session Sessions - Other sessions - For best security, verify your sessions and sign out from any session that you don’t recognize or use anymore. + + Other sessions + + For best security, verify your sessions and sign out from any session that you don’t recognize or use anymore. Server name Server version @@ -3296,7 +3298,8 @@ Session details Application, device, and activity information. Session name - Session ID + + Session ID Last activity IP address diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/details/SessionDetailsController.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/details/SessionDetailsController.kt index 1fb5be4d78..3d3b6dfdcb 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/details/SessionDetailsController.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/details/SessionDetailsController.kt @@ -95,7 +95,7 @@ class SessionDetailsController @Inject constructor( } sessionId?.let { val hasDivider = sessionLastSeenTs != null - buildContentItem(R.string.device_manager_session_details_session_id, it, hasDivider) + buildContentItem(R.string.encryption_information_device_id, it, hasDivider) } sessionLastSeenTs?.let { val formattedDate = dateFormatter.format(it, DateFormatKind.MESSAGE_DETAIL) diff --git a/vector/src/main/res/layout/dialog_device_verify.xml b/vector/src/main/res/layout/dialog_device_verify.xml index 475ffc69af..82432a892a 100644 --- a/vector/src/main/res/layout/dialog_device_verify.xml +++ b/vector/src/main/res/layout/dialog_device_verify.xml @@ -39,7 +39,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" - android:text="@string/device_manager_session_details_session_id" + android:text="@string/encryption_information_device_id" android:textStyle="bold" /> + app:title="@string/settings_sessions_other_title"> diff --git a/vector/src/main/res/xml/vector_settings_security_privacy.xml b/vector/src/main/res/xml/vector_settings_security_privacy.xml index 1e8997e9c8..c246a40f71 100644 --- a/vector/src/main/res/xml/vector_settings_security_privacy.xml +++ b/vector/src/main/res/xml/vector_settings_security_privacy.xml @@ -35,7 +35,7 @@ Date: Wed, 21 Sep 2022 14:25:26 +0100 Subject: [PATCH 087/131] lifting the sync timeout to the matrix configuration --- .../android/sdk/api/MatrixConfiguration.kt | 4 ++++ .../org/matrix/android/sdk/api/SyncConfig.kt | 24 +++++++++++++++++++ .../internal/session/sync/job/SyncThread.kt | 7 +++--- 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt 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 893e90fb3e..3b4b3b624d 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 @@ -70,4 +70,8 @@ data class MatrixConfiguration( * List of network interceptors, they will be added when building an OkHttp client. */ val networkInterceptors: List = emptyList(), + /** + * Sync configuration. + */ + val syncConfig: SyncConfig = SyncConfig() ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt new file mode 100644 index 0000000000..b5547896d4 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2022 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.matrix.android.sdk.api + +data class SyncConfig( + /** + * Time to keep sync connection alive for before making another request in milliseconds. + */ + val longPollTimeout: Long = 30_000L +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt index b47b215655..d3f2a3f044 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt @@ -30,6 +30,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +import org.matrix.android.sdk.api.MatrixConfiguration import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.failure.isTokenError @@ -52,7 +53,6 @@ import javax.inject.Inject import kotlin.concurrent.schedule private const val RETRY_WAIT_TIME_MS = 10_000L -private const val DEFAULT_LONG_POOL_TIMEOUT = 30_000L private val loggerTag = LoggerTag("SyncThread", LoggerTag.SYNC) @@ -61,7 +61,8 @@ internal class SyncThread @Inject constructor( private val networkConnectivityChecker: NetworkConnectivityChecker, private val backgroundDetectionObserver: BackgroundDetectionObserver, private val activeCallHandler: ActiveCallHandler, - private val lightweightSettingsStorage: DefaultLightweightSettingsStorage + private val lightweightSettingsStorage: DefaultLightweightSettingsStorage, + private val matrixConfiguration: MatrixConfiguration, ) : Thread("Matrix-SyncThread"), NetworkConnectivityChecker.Listener, BackgroundDetectionObserver.Listener { private var state: SyncState = SyncState.Idle @@ -181,7 +182,7 @@ internal class SyncThread @Inject constructor( val timeout = when { previousSyncResponseHasToDevice -> 0L /* Force timeout to 0 */ afterPause -> 0L /* No timeout after a pause */ - else -> DEFAULT_LONG_POOL_TIMEOUT + else -> matrixConfiguration.syncConfig.longPollTimeout } Timber.tag(loggerTag.value).d("Execute sync request with timeout $timeout") val presence = lightweightSettingsStorage.getSyncPresenceStatus() From 9ab78c93e2e8fe4ed618926473d734ad65906175 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 21 Sep 2022 14:36:27 +0100 Subject: [PATCH 088/131] reducing sync timeout for instrumentation tests to speed them up --- .../java/org/matrix/android/sdk/common/CommonTestHelper.kt | 4 +++- .../java/im/vector/app/core/utils/TestMatrixHelper.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt index a78953caac..d30cee0eab 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt @@ -36,6 +36,7 @@ import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.MatrixConfiguration +import org.matrix.android.sdk.api.SyncConfig import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig import org.matrix.android.sdk.api.auth.registration.RegistrationResult import org.matrix.android.sdk.api.session.Session @@ -103,7 +104,8 @@ class CommonTestHelper internal constructor(context: Context) { context, MatrixConfiguration( applicationFlavor = "TestFlavor", - roomDisplayNameFallbackProvider = TestRoomDisplayNameFallbackProvider() + roomDisplayNameFallbackProvider = TestRoomDisplayNameFallbackProvider(), + syncConfig = SyncConfig(longPollTimeout = 5_000L) ) ) } diff --git a/vector-app/src/androidTest/java/im/vector/app/core/utils/TestMatrixHelper.kt b/vector-app/src/androidTest/java/im/vector/app/core/utils/TestMatrixHelper.kt index 48fc1343b1..9bdb0f863a 100644 --- a/vector-app/src/androidTest/java/im/vector/app/core/utils/TestMatrixHelper.kt +++ b/vector-app/src/androidTest/java/im/vector/app/core/utils/TestMatrixHelper.kt @@ -20,11 +20,13 @@ import androidx.test.platform.app.InstrumentationRegistry import im.vector.app.features.room.VectorRoomDisplayNameFallbackProvider import org.matrix.android.sdk.api.Matrix import org.matrix.android.sdk.api.MatrixConfiguration +import org.matrix.android.sdk.api.SyncConfig fun getMatrixInstance(): Matrix { val context = InstrumentationRegistry.getInstrumentation().targetContext val configuration = MatrixConfiguration( - roomDisplayNameFallbackProvider = VectorRoomDisplayNameFallbackProvider(context) + roomDisplayNameFallbackProvider = VectorRoomDisplayNameFallbackProvider(context), + syncConfig = SyncConfig(longPollTimeout = 5_000L) ) return Matrix(context, configuration) } From d75e37966c318058ca399b99a1ae099e384f93d8 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 21 Sep 2022 15:37:16 +0100 Subject: [PATCH 089/131] adding changelog entry --- changelog.d/7198.sdk | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7198.sdk diff --git a/changelog.d/7198.sdk b/changelog.d/7198.sdk new file mode 100644 index 0000000000..115b8d6113 --- /dev/null +++ b/changelog.d/7198.sdk @@ -0,0 +1 @@ +Allow the sync timeout to be configured (mainly useful for testing) From 0a8e6c175862b842829953a415324da6468fada8 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 21 Sep 2022 16:38:44 +0200 Subject: [PATCH 090/131] Weblate: fix conflict --- library/ui-strings/src/main/res/values-de/strings.xml | 2 +- library/ui-strings/src/main/res/values-ru/strings.xml | 2 +- library/ui-strings/src/main/res/values-zh-rCN/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 3753cedff2..8e502a6392 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -2622,4 +2622,4 @@ Nicht verifiziert · Letzte Aktivität %1$s Verifiziere deine aktuelle Sitzung für besonders sichere Nachrichtenübertragung. Nicht verifizierte Sitzung - + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-ru/strings.xml b/library/ui-strings/src/main/res/values-ru/strings.xml index 8d223bae5e..4852be1f82 100644 --- a/library/ui-strings/src/main/res/values-ru/strings.xml +++ b/library/ui-strings/src/main/res/values-ru/strings.xml @@ -2678,4 +2678,4 @@ Обзор комнат Начать беседу Создать комнату - + \ No newline at end of file diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index ee0e95d648..4e1c8e61c8 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -2583,4 +2583,4 @@ 已验证的会话 未知的设备类型 邀请 - + \ No newline at end of file From 600588dbbba66b736e9b659b735e85de56035d24 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 21 Sep 2022 16:37:31 +0100 Subject: [PATCH 091/131] adding trailing commas --- .../java/org/matrix/android/sdk/common/CommonTestHelper.kt | 2 +- .../main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt | 2 +- .../src/main/java/org/matrix/android/sdk/api/SyncConfig.kt | 2 +- .../java/im/vector/app/core/utils/TestMatrixHelper.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt index d30cee0eab..b179c6027e 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt @@ -105,7 +105,7 @@ class CommonTestHelper internal constructor(context: Context) { MatrixConfiguration( applicationFlavor = "TestFlavor", roomDisplayNameFallbackProvider = TestRoomDisplayNameFallbackProvider(), - syncConfig = SyncConfig(longPollTimeout = 5_000L) + syncConfig = SyncConfig(longPollTimeout = 5_000L), ) ) } 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 3b4b3b624d..7119563617 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 @@ -73,5 +73,5 @@ data class MatrixConfiguration( /** * Sync configuration. */ - val syncConfig: SyncConfig = SyncConfig() + val syncConfig: SyncConfig = SyncConfig(), ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt index b5547896d4..a9753e2407 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt @@ -20,5 +20,5 @@ data class SyncConfig( /** * Time to keep sync connection alive for before making another request in milliseconds. */ - val longPollTimeout: Long = 30_000L + val longPollTimeout: Long = 30_000L, ) diff --git a/vector-app/src/androidTest/java/im/vector/app/core/utils/TestMatrixHelper.kt b/vector-app/src/androidTest/java/im/vector/app/core/utils/TestMatrixHelper.kt index 9bdb0f863a..d8873a71a4 100644 --- a/vector-app/src/androidTest/java/im/vector/app/core/utils/TestMatrixHelper.kt +++ b/vector-app/src/androidTest/java/im/vector/app/core/utils/TestMatrixHelper.kt @@ -26,7 +26,7 @@ fun getMatrixInstance(): Matrix { val context = InstrumentationRegistry.getInstrumentation().targetContext val configuration = MatrixConfiguration( roomDisplayNameFallbackProvider = VectorRoomDisplayNameFallbackProvider(context), - syncConfig = SyncConfig(longPollTimeout = 5_000L) + syncConfig = SyncConfig(longPollTimeout = 5_000L), ) return Matrix(context, configuration) } From 03d843ac5198179c51f9e3eaf38d5d68d23ed00f Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 21 Sep 2022 18:04:32 +0200 Subject: [PATCH 092/131] Rename device_manager strings --- library/ui-strings/src/main/res/values-ca/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-cs/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-de/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-es/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-et/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-fa/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-fr/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-hu/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-in/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-it/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-nl/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-pl/strings.xml | 4 ++-- library/ui-strings/src/main/res/values-pt-rBR/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-ru/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-sk/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-uk/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-zh-rCN/strings.xml | 6 +++--- library/ui-strings/src/main/res/values-zh-rTW/strings.xml | 6 +++--- library/ui-strings/src/main/res/values/strings.xml | 6 ++---- vector/src/main/res/layout/fragment_other_sessions.xml | 4 ++-- vector/src/main/res/layout/fragment_settings_devices.xml | 4 ++-- 21 files changed, 59 insertions(+), 61 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ca/strings.xml b/library/ui-strings/src/main/res/values-ca/strings.xml index a7caed0de8..5c036a9e7e 100644 --- a/library/ui-strings/src/main/res/values-ca/strings.xml +++ b/library/ui-strings/src/main/res/values-ca/strings.xml @@ -2602,8 +2602,8 @@ Tots els xats Preferències de disseny Explora sales - Per estar més segur, verifica les teves sessions i tanca qualsevol sessió que no reconeguis o ja no utilitzis. - Altres sessions + Per estar més segur, verifica les teves sessions i tanca qualsevol sessió que no reconeguis o ja no utilitzis. + Altres sessions Sessions Obre la llista d\'espais Crea un nou xat o sala @@ -2671,4 +2671,4 @@ Amaga els continguts de %s Mostra el contingut de %s Canvia espai - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-cs/strings.xml b/library/ui-strings/src/main/res/values-cs/strings.xml index e7f0b173be..7c73303c69 100644 --- a/library/ui-strings/src/main/res/values-cs/strings.xml +++ b/library/ui-strings/src/main/res/values-cs/strings.xml @@ -2651,8 +2651,8 @@ Otevřít nastavení Všechny konverzace Zobrazit všechny relace (V2, WIP) - V zájmu co nejlepšího zabezpečení ověřujte své relace a odhlašujte se ze všech relací, které již nepoznáváte nebo nepoužíváte. - Ostatní relace + V zájmu co nejlepšího zabezpečení ověřujte své relace a odhlašujte se ze všech relací, které již nepoznáváte nebo nepoužíváte. + Ostatní relace Relace Seznam otevřených prostorů Vytvořit novou konverzaci nebo místnost @@ -2723,4 +2723,4 @@ Sbalit podprostory %s Rozbalit podprostory %s Změnit prostor - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 6c7bb03a50..e0bdc8c8d4 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -2587,8 +2587,8 @@ Personen Schreibe deine erste Nachricht, um %s zur Konversation einzuladen Alle Sitzungen anzeigen (V2, in Arbeit) - Für bestmögliche Sicherheit verifiziere deine Sitzungen und melde dich von allen ab, die du nicht erkennst oder nutzt. - Andere Sitzungen + Für bestmögliche Sicherheit verifiziere deine Sitzungen und melde dich von allen ab, die du nicht erkennst oder nutzt. + Andere Sitzungen Sitzungen Space-Liste öffnen Beginne ein Gespräch oder erstelle einen Raum @@ -2641,4 +2641,4 @@ Alle Unterhaltungen Space wechseln Unterhaltung beginnen - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-es/strings.xml b/library/ui-strings/src/main/res/values-es/strings.xml index 1b63183478..a1f1a6e626 100644 --- a/library/ui-strings/src/main/res/values-es/strings.xml +++ b/library/ui-strings/src/main/res/values-es/strings.xml @@ -2570,8 +2570,8 @@ Este código QR parece incorrecto. Por favor, intente verificar con otro método. No serás capaz de acceder al historial de mensajes encriptado. Restablece tu backup de mensajes seguro y las claves de verificación para empezar de cero. No se ha podido verificar el dispositivo - Para más seguridad, verifica tus sesiones y cierra cualquiera que no reconozcas o hayas dejado de usar. - Otras sesiones + Para más seguridad, verifica tus sesiones y cierra cualquiera que no reconozcas o hayas dejado de usar. + Otras sesiones Sesiones No se puede abrir este enlace: las comunidades han sido reemplazadas por espacios Usuario / Email / Teléfono @@ -2652,4 +2652,4 @@ Crear sala Iniciar conversación Todas las conversaciones - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index 5dd355758c..bf7c7653c8 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -2592,8 +2592,8 @@ Ava seadistused Kõik vestlused Näita kõiki sessioone (V2, WIP) - Parima turvalisuse nimel verifitseeri kõik oma sessioonid ning logi välja neist, mida sa enam ei kasuta. - Muud sessioonid + Parima turvalisuse nimel verifitseeri kõik oma sessioonid ning logi välja neist, mida sa enam ei kasuta. + Muud sessioonid Sessionid Ava kogukondade loend Alusta uut vestlust või loo uus jututuba @@ -2662,4 +2662,4 @@ Siin saavad olema sinu tulevased päringud ja kutsed. Ahenda %s alamkogukonnad Näita %s alamkogukondi - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index 2f5bf80d0c..75b3ab128c 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -2601,8 +2601,8 @@ گشودن تنظیمات تمامی گپ‌ها نمایش تمامی نشست‌ها (ن۲، دح‌ت) - برای امنیت بیش‌تر، نشست‌هایتان را تأیید و از هر نشستی که تشخیصش نمی‌دهید یا دیگر استفاده نمی‌کنید خارج شوید. - دیگر نشست‌ها + برای امنیت بیش‌تر، نشست‌هایتان را تأیید و از هر نشستی که تشخیصش نمی‌دهید یا دیگر استفاده نمی‌کنید خارج شوید. + دیگر نشست‌ها نشست‌ها گشودن سیاههٔ فضاها ایجاد اتاق یا گفت‌وگویی جدید @@ -2671,4 +2671,4 @@ جمع کردن فرزندان %s گسترش فرزندان %s تغییر فضا - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml index 01e97f3630..0df8272fe5 100644 --- a/library/ui-strings/src/main/res/values-fr/strings.xml +++ b/library/ui-strings/src/main/res/values-fr/strings.xml @@ -2601,8 +2601,8 @@ Ouvrir les paramètres Toutes les conversations Afficher toutes les sessions (V2, en cours) - Pour une meilleure sécurité, vérifiez vos sessions et déconnectez toutes les sessions que vous ne connaissez pas ou que vous n’utilisez plus. - Autres sessions + Pour une meilleure sécurité, vérifiez vos sessions et déconnectez toutes les sessions que vous ne connaissez pas ou que vous n’utilisez plus. + Autres sessions Sessions Ouvrir la liste des espaces Créer une nouvelle conversation ou salon @@ -2671,4 +2671,4 @@ Réduire %s enfants Développer %s enfants Changer d’espace - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index 5c92b1ace7..d8bdbb09fd 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -2615,8 +2615,8 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Web Mobil Minden munkamenet megjelenítése (V2, WIP) - A legjobb biztonság érdekében ellenőrizd a munkameneteket, és jelentkezz ki minden olyan munkamenetből, melyet már nem ismersz fel vagy nem használsz. - Más munkamenetek + A legjobb biztonság érdekében ellenőrizd a munkameneteket, és jelentkezz ki minden olyan munkamenetből, melyet már nem ismersz fel vagy nem használsz. + Más munkamenetek Munkamenetek Nyitott területek listája Új beszélgetés vagy szoba létrehozása @@ -2671,4 +2671,4 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze %1$d+ napja inaktív (%2$s) Itt láthatók a meghívók és elvégzendő műveletek. - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml index f8cb456ea6..3cec03dc75 100644 --- a/library/ui-strings/src/main/res/values-in/strings.xml +++ b/library/ui-strings/src/main/res/values-in/strings.xml @@ -2553,8 +2553,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Email belum diverifikasi, periksa kotak masuk Anda Semua Obrolan Tampilkan Semua Sesi (V2, Dalam Pengembangan) - Untuk keamanan terbaik, verifikasi sesi Anda dan keluarkan sesi apa pun yang Anda tidak kenal atau Anda tidak gunakan lagi. - Sesi lainnya + Untuk keamanan terbaik, verifikasi sesi Anda dan keluarkan sesi apa pun yang Anda tidak kenal atau Anda tidak gunakan lagi. + Sesi lainnya Sesi Buka daftar space Buat percakapan atau ruangan baru @@ -2621,4 +2621,4 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Tutup %s anak Buka %s anak Buat Space - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml index 4e66e7528c..422dfc2a3a 100644 --- a/library/ui-strings/src/main/res/values-it/strings.xml +++ b/library/ui-strings/src/main/res/values-it/strings.xml @@ -2592,8 +2592,8 @@ Apri le impostazioni Tutte le chat Mostra tutte le sessioni (V2, WIP) - Per una maggiore sicurezza, verifica le tue sessioni e disconnetti quelle che non riconosci o che non usi più. - Altre sessioni + Per una maggiore sicurezza, verifica le tue sessioni e disconnetti quelle che non riconosci o che non usi più. + Altre sessioni Sessioni Apri elenco spazi Crea una nuova conversazione o stanza @@ -2662,4 +2662,4 @@ Riduci contenuto di %s Espandi contenuto di %s Cambia spazio - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-nl/strings.xml b/library/ui-strings/src/main/res/values-nl/strings.xml index 623cc89da1..d9f36739d3 100644 --- a/library/ui-strings/src/main/res/values-nl/strings.xml +++ b/library/ui-strings/src/main/res/values-nl/strings.xml @@ -2600,8 +2600,8 @@ Kan kaart niet laden \nDeze server is mogelijk niet geconfigureerd om kaarten weer te geven. Open instellingen - Voor de beste beveiliging verifieert u uw sessies en meldt u zich af bij elke sessie die u niet meer herkent of gebruikt. - Andere sessies + Voor de beste beveiliging verifieert u uw sessies en meldt u zich af bij elke sessie die u niet meer herkent of gebruikt. + Andere sessies Sessies Lijst met publieke spaces Nieuw gesprek of nieuwe kamer aanmaken @@ -2671,4 +2671,4 @@ %s subitems inklappen %s subitems uitvouwen Ruimte aanpassen - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-pl/strings.xml b/library/ui-strings/src/main/res/values-pl/strings.xml index 7f1a059df4..5959abc804 100644 --- a/library/ui-strings/src/main/res/values-pl/strings.xml +++ b/library/ui-strings/src/main/res/values-pl/strings.xml @@ -2697,8 +2697,8 @@ Nie można wczytać mapy. \nTen serwer macierzysty może nie być skonfigurowany do wyświetlania map. Otwórz ustawienia - Aby zapewnić najlepsze bezpieczeństwo, zweryfikuj swoje sesje i wyloguj się z każdej sesji, której już nie rozpoznajesz lub której już nie używasz. - Inne sesje + Aby zapewnić najlepsze bezpieczeństwo, zweryfikuj swoje sesje i wyloguj się z każdej sesji, której już nie rozpoznajesz lub której już nie używasz. + Inne sesje Sesje Lista otwartych przestrzeni Utwórz nową rozmowę lub pokój diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml index 780c7f0702..c17f9c0b57 100644 --- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml +++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml @@ -2601,8 +2601,8 @@ Abrir configurações Todos os Chats Mostrar Todas Sessões (V2, WIP) - Para a melhor segurança, verifique suas sessões e faça signout de qualquer sessão que você não reconhece ou usa mais. - Outras sessões + Para a melhor segurança, verifique suas sessões e faça signout de qualquer sessão que você não reconhece ou usa mais. + Outras sessões Sessões Abrir lista de espaços Criar uma nova conversa ou sala @@ -2671,4 +2671,4 @@ Colapsar filhos de %s Expandir filhos de %s Mudar Espaço - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-ru/strings.xml b/library/ui-strings/src/main/res/values-ru/strings.xml index e321b8777d..39795ef99a 100644 --- a/library/ui-strings/src/main/res/values-ru/strings.xml +++ b/library/ui-strings/src/main/res/values-ru/strings.xml @@ -2660,8 +2660,8 @@ Не удалось загрузить карту \nВозможно, этот домашний сервер не настроен для отображения карт. Все беседы - Для лучшей безопасности заверьте свои сессии и выйдите из тех, которые более не признаёте или не используете. - Другие сессии + Для лучшей безопасности заверьте свои сессии и выйдите из тех, которые более не признаёте или не используете. + Другие сессии Сессии Создать беседу или комнату Показать все сессии (V2, в разработке) @@ -2695,4 +2695,4 @@ \n%s. Оставить отзыв Текущая сессия готова к безопасному обмену сообщениями. - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml index 6a2e3c0645..19058ac656 100644 --- a/library/ui-strings/src/main/res/values-sk/strings.xml +++ b/library/ui-strings/src/main/res/values-sk/strings.xml @@ -2651,8 +2651,8 @@ Otvoriť nastavenia Všetky konverzácie Zobraziť všetky relácie (V2, WIP) - V záujme čo najlepšieho zabezpečenia overte svoje relácie a odhláste sa z každej relácie, ktorú už nepoznáte alebo nepoužívate. - Iné relácie + V záujme čo najlepšieho zabezpečenia overte svoje relácie a odhláste sa z každej relácie, ktorú už nepoznáte alebo nepoužívate. + Iné relácie Relácie Otvoriť zoznam priestorov Vytvoriť novú konverzáciu alebo miestnosť @@ -2723,4 +2723,4 @@ Zbaliť %s podpriestory Rozbaliť %s podpriestory Zmeniť priestor - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml index 457715a3b1..3ba8f96674 100644 --- a/library/ui-strings/src/main/res/values-uk/strings.xml +++ b/library/ui-strings/src/main/res/values-uk/strings.xml @@ -2701,8 +2701,8 @@ Відкрити налаштування Усі бесіди Показати всі сеанси (V2, WIP) - Для найкращої безпеки перевірте свої сеанси та вийдіть з усіх сеансів, які ви більше не розпізнаєте або не використовуєте. - Інші сеанси + Для найкращої безпеки перевірте свої сеанси та вийдіть з усіх сеансів, які ви більше не розпізнаєте або не використовуєте. + Інші сеанси Сеанси Відкрити список кімнат Створити нову розмову або кімнату @@ -2775,4 +2775,4 @@ Згорнути дочірні елементи %s Розгорнути дочірні елементи %s Змінити простір - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index 5cae1aa34d..2a99ad240b 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -2551,8 +2551,8 @@ 打开设置 全部聊天 显示全部会话(V2, WIP) - 为获得最佳安全性,请验证你的会话,并从任何你不认识或不再使用的会话登出。 - 其他会话 + 为获得最佳安全性,请验证你的会话,并从任何你不认识或不再使用的会话登出。 + 其他会话 会话 打开空间列表 创建新对话或房间 @@ -2607,4 +2607,4 @@ 提供反馈 点击右上角查看反馈选项。 试用 - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index fc380d8167..8a07ae94f9 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -2551,8 +2551,8 @@ 開啟設定 所有聊天 顯示所有工作階段 (V2, WIP) - 為了取得最佳安全性,請驗證您的工作階段並登出任何您無法識別或不再使用的工作階段。 - 其他工作階段 + 為了取得最佳安全性,請驗證您的工作階段並登出任何您無法識別或不再使用的工作階段。 + 其他工作階段 工作階段 開啟空間清單 建立新的對話或聊天室 @@ -2619,4 +2619,4 @@ 折疊 %s 個子空間 展開 %s 個子空間 變更空間 - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 1c6150bf9c..e6b6a6acc1 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -2364,10 +2364,8 @@ Manage Sessions Sign out of this session Sessions - - Other sessions - - For best security, verify your sessions and sign out from any session that you don’t recognize or use anymore. + Other sessions + For best security, verify your sessions and sign out from any session that you don’t recognize or use anymore. Server name Server version diff --git a/vector/src/main/res/layout/fragment_other_sessions.xml b/vector/src/main/res/layout/fragment_other_sessions.xml index 7fbc92529a..037f85ad28 100644 --- a/vector/src/main/res/layout/fragment_other_sessions.xml +++ b/vector/src/main/res/layout/fragment_other_sessions.xml @@ -18,7 +18,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" app:navigationIcon="@drawable/ic_back_24dp" - app:title="@string/settings_sessions_other_title"> + app:title="@string/device_manager_sessions_other_title"> From feb33ce32b53724d22e2418020b639d538f6b5ef Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 21 Sep 2022 19:43:47 +0200 Subject: [PATCH 093/131] Translation: cleanup remaining TODOs --- library/ui-strings/src/main/res/values-ar/strings.xml | 2 +- library/ui-strings/src/main/res/values-bg/strings.xml | 2 +- .../ui-strings/src/main/res/values-bn-rBD/strings.xml | 2 +- .../ui-strings/src/main/res/values-bn-rIN/strings.xml | 2 +- library/ui-strings/src/main/res/values-ca/strings.xml | 5 +---- library/ui-strings/src/main/res/values-cs/strings.xml | 5 +---- library/ui-strings/src/main/res/values-de/strings.xml | 4 +--- library/ui-strings/src/main/res/values-el/strings.xml | 2 +- library/ui-strings/src/main/res/values-eo/strings.xml | 2 +- .../ui-strings/src/main/res/values-es-rMX/strings.xml | 2 +- library/ui-strings/src/main/res/values-es/strings.xml | 4 +--- library/ui-strings/src/main/res/values-et/strings.xml | 5 +---- library/ui-strings/src/main/res/values-eu/strings.xml | 2 +- library/ui-strings/src/main/res/values-fa/strings.xml | 5 +---- library/ui-strings/src/main/res/values-fi/strings.xml | 2 +- .../ui-strings/src/main/res/values-fr-rCA/strings.xml | 2 +- library/ui-strings/src/main/res/values-fr/strings.xml | 5 +---- library/ui-strings/src/main/res/values-gl/strings.xml | 2 +- library/ui-strings/src/main/res/values-hr/strings.xml | 2 +- library/ui-strings/src/main/res/values-hu/strings.xml | 5 +---- library/ui-strings/src/main/res/values-in/strings.xml | 5 +---- library/ui-strings/src/main/res/values-is/strings.xml | 2 +- library/ui-strings/src/main/res/values-it/strings.xml | 5 +---- library/ui-strings/src/main/res/values-iw/strings.xml | 2 +- library/ui-strings/src/main/res/values-ja/strings.xml | 2 +- library/ui-strings/src/main/res/values-kab/strings.xml | 2 +- library/ui-strings/src/main/res/values-ko/strings.xml | 2 +- library/ui-strings/src/main/res/values-lo/strings.xml | 2 +- library/ui-strings/src/main/res/values-lt/strings.xml | 5 +---- library/ui-strings/src/main/res/values-lv/strings.xml | 2 +- .../ui-strings/src/main/res/values-nb-rNO/strings.xml | 2 +- library/ui-strings/src/main/res/values-nl/strings.xml | 5 +---- library/ui-strings/src/main/res/values-nn/strings.xml | 2 +- library/ui-strings/src/main/res/values-pl/strings.xml | 4 +--- .../ui-strings/src/main/res/values-pt-rBR/strings.xml | 5 +---- library/ui-strings/src/main/res/values-pt/strings.xml | 2 +- library/ui-strings/src/main/res/values-ru/strings.xml | 4 +--- library/ui-strings/src/main/res/values-sk/strings.xml | 5 +---- library/ui-strings/src/main/res/values-sq/strings.xml | 2 +- library/ui-strings/src/main/res/values-sv/strings.xml | 2 +- library/ui-strings/src/main/res/values-te/strings.xml | 2 +- library/ui-strings/src/main/res/values-tr/strings.xml | 2 +- library/ui-strings/src/main/res/values-uk/strings.xml | 5 +---- library/ui-strings/src/main/res/values-vi/strings.xml | 2 +- .../ui-strings/src/main/res/values-zh-rCN/strings.xml | 5 +---- .../ui-strings/src/main/res/values-zh-rTW/strings.xml | 5 +---- library/ui-strings/src/main/res/values/strings.xml | 9 +-------- .../devices/v2/details/SessionDetailsController.kt | 2 +- vector/src/main/res/layout/dialog_device_verify.xml | 2 +- .../main/res/xml/vector_settings_security_privacy.xml | 2 +- 50 files changed, 50 insertions(+), 110 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ar/strings.xml b/library/ui-strings/src/main/res/values-ar/strings.xml index 073f961cb6..70b9a33ab5 100644 --- a/library/ui-strings/src/main/res/values-ar/strings.xml +++ b/library/ui-strings/src/main/res/values-ar/strings.xml @@ -320,7 +320,7 @@ السمة خطأ في فكّ التعمية اسم الجهاز - معرّف الجهاز + معرّف الجهاز مفتاح الجهاز صدّر مفاتيح الغرفة صدّر المفاتيح إلى ملف محلي diff --git a/library/ui-strings/src/main/res/values-bg/strings.xml b/library/ui-strings/src/main/res/values-bg/strings.xml index b29823040f..d3e9e599bc 100644 --- a/library/ui-strings/src/main/res/values-bg/strings.xml +++ b/library/ui-strings/src/main/res/values-bg/strings.xml @@ -396,7 +396,7 @@ Тема Грешка при разшифроване Публично име - Сесийно ID + Сесийно ID Ключ на устройство Експортирай E2E ключове за стая Експортиране на ключове за стая diff --git a/library/ui-strings/src/main/res/values-bn-rBD/strings.xml b/library/ui-strings/src/main/res/values-bn-rBD/strings.xml index 2f068f1bf8..7897da934e 100644 --- a/library/ui-strings/src/main/res/values-bn-rBD/strings.xml +++ b/library/ui-strings/src/main/res/values-bn-rBD/strings.xml @@ -789,7 +789,7 @@ রুমের কুঞ্জিগুলি এক্সপোর্ট করুন শেষ থেকে শেষ রুমের কুঞ্জিগুলি এক্সপোর্ট করুন সেশানের কুঞ্জি - আইডি + আইডি সর্বজনীন নাম ডিক্রিপশন সমস্যা থিম diff --git a/library/ui-strings/src/main/res/values-bn-rIN/strings.xml b/library/ui-strings/src/main/res/values-bn-rIN/strings.xml index 828bc3bd34..56bde36977 100644 --- a/library/ui-strings/src/main/res/values-bn-rIN/strings.xml +++ b/library/ui-strings/src/main/res/values-bn-rIN/strings.xml @@ -693,7 +693,7 @@ ডিক্রিপশন সমস্যা সর্বজনীন নাম - আইডি + আইডি সেশানের কুঞ্জি শেষ থেকে শেষ রুমের কুঞ্জিগুলি এক্সপোর্ট করুন diff --git a/library/ui-strings/src/main/res/values-ca/strings.xml b/library/ui-strings/src/main/res/values-ca/strings.xml index 5c036a9e7e..4765eb11e5 100644 --- a/library/ui-strings/src/main/res/values-ca/strings.xml +++ b/library/ui-strings/src/main/res/values-ca/strings.xml @@ -448,7 +448,7 @@ Tema Error al desxifrar Nom públic - ID de sessió + ID de sessió Clau de sessió Exporta les claus de la sala E2E Exporta les claus de la sala @@ -2619,14 +2619,11 @@ Mostra totes les sessions (V2, WIP) Crea sala Inicia xat - Verifica la teva sessió actual per a missatges segurs millorats. Verificada · Última activitat %1$s No verificada · Última activitat %1$s Veure-ho tot (%1$d) - Sessió actual Veure detalls Verifica sessió - La sessió actual està llesta per la missatgeria segura. Sessió no verificada Sessió verificada Tipus de dispositiu desconegut diff --git a/library/ui-strings/src/main/res/values-cs/strings.xml b/library/ui-strings/src/main/res/values-cs/strings.xml index 7c73303c69..79f8311159 100644 --- a/library/ui-strings/src/main/res/values-cs/strings.xml +++ b/library/ui-strings/src/main/res/values-cs/strings.xml @@ -635,7 +635,7 @@ Motiv vzhledu Chyba dešifrování Veřejné jméno - ID relace + ID relace Klíč relace Export E2E klíčů místností Export klíčů místností @@ -2672,11 +2672,8 @@ Neověřeno · Poslední aktivita %1$s Ověřeno · Poslední aktivita %1$s Zobrazit všechny (%1$d) - Aktuální relace Zobrazit podrobnosti Ověřit relaci - Ověřte svou aktuální relaci pro vylepšené zabezpečené zasílání zpráv. - Vaše aktuální relace je připravena pro bezpečné zasílání zpráv. Neověřená relace Ověřená relace Neznámý typ zařízení diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index e0bdc8c8d4..e01fc898a3 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -418,7 +418,7 @@ Als Hauptadresse aufheben Entschlüsselungsfehler Öffentlicher Name - Sitzungs-ID + Sitzungs-ID Sitzungsschlüssel Ende-zu-Ende-Raumschlüssel exportieren Raumschlüssel exportieren @@ -2620,7 +2620,6 @@ \nBitte versuche es später erneut.%s Einladungen Nicht verifiziert · Letzte Aktivität %1$s - Verifiziere deine aktuelle Sitzung für besonders sichere Nachrichtenübertragung. Nicht verifizierte Sitzung Nicht verifizierte Sitzung Verbessere deine Kontosicherheit, indem du diese Empfehlungen beherzigst. @@ -2630,7 +2629,6 @@ Inaktiv seit %1$d+ Tagen (%2$s) Verifiziert · Letzte Aktivität %1$s - Deine aktuelle Sitzung ist für sichere Kommunikation bereit. Verifizierte Sitzung Unbekannter Gerätetyp Nichts Neues. diff --git a/library/ui-strings/src/main/res/values-el/strings.xml b/library/ui-strings/src/main/res/values-el/strings.xml index 092a01bff4..f4973f4b95 100644 --- a/library/ui-strings/src/main/res/values-el/strings.xml +++ b/library/ui-strings/src/main/res/values-el/strings.xml @@ -172,7 +172,7 @@ Θέμα Σφάλμα αποκρυπτογράφησης Όνομα συσκευής - Αναγνωριστικό συσκευής + Αναγνωριστικό συσκευής Εξαγωγή Εισαγωγή Επιλέξτε ένα ευρετήριο δωματίων diff --git a/library/ui-strings/src/main/res/values-eo/strings.xml b/library/ui-strings/src/main/res/values-eo/strings.xml index 7e1925f708..f536ca00f9 100644 --- a/library/ui-strings/src/main/res/values-eo/strings.xml +++ b/library/ui-strings/src/main/res/values-eo/strings.xml @@ -1084,7 +1084,7 @@ Elporti ŝlosilojn de ĉambroj Elporti tutvoje ĉifrajn ŝlosilojn de ĉambroj Ŝlosilo de salutaĵo - Identigilo de salutaĵo + Identigilo de salutaĵo Publika nomo Eraris malĉifrado Haŭto diff --git a/library/ui-strings/src/main/res/values-es-rMX/strings.xml b/library/ui-strings/src/main/res/values-es-rMX/strings.xml index 0b38fa6a19..c82f9aff61 100644 --- a/library/ui-strings/src/main/res/values-es-rMX/strings.xml +++ b/library/ui-strings/src/main/res/values-es-rMX/strings.xml @@ -249,7 +249,7 @@ Desescojer como Dirección Principal Error en descifrar Nombre del dispositivo - Identificación del dispositivo + Identificación del dispositivo Clave del dispositivo Exportar claves de cifrado de extremo-a-extremo de salas Exportar claves de salas diff --git a/library/ui-strings/src/main/res/values-es/strings.xml b/library/ui-strings/src/main/res/values-es/strings.xml index a1f1a6e626..86143d9fa4 100644 --- a/library/ui-strings/src/main/res/values-es/strings.xml +++ b/library/ui-strings/src/main/res/values-es/strings.xml @@ -415,7 +415,7 @@ Dejar de Establecer como dirección principal Error de descifrado Nombre público - ID de sesión + ID de sesión Clave de sesión Exportar claves de salas con cifrado Extremo-a-Extremo Exportar claves de sala @@ -2540,10 +2540,8 @@ Sin verificar · Última actividad %1$s Verificada · Última actividad %1$s Ver todos (%1$d) - Sesión actual Ver detalles Verificar sesión - Esta sesión está lista para mensajería segura. Sesión sin verificar Sesión verificada Tipo de dispositivo desconocido diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml index bf7c7653c8..9bd1dd23b7 100644 --- a/library/ui-strings/src/main/res/values-et/strings.xml +++ b/library/ui-strings/src/main/res/values-et/strings.xml @@ -612,7 +612,7 @@ Need on alles katsejärgus olevad funktsionaalsused. Ole kasutamisel ettevaatlik. Dekrüptimise viga Avalik nimi - Sessiooni tunnus + Sessiooni tunnus Sessiooni võti Ekspordi jututubade läbiva krüptimise võtmed Ekspordi jututoa võtmed @@ -2613,11 +2613,8 @@ Verifitseerimata · Viimati kasutusel %1$s Verifitseeritud · Viimati kasutusel %1$s Näita kõiki (%1$d) - Praegune sessioon Vaata lisateavet Verifitseeri sessioon - Turvalise sõnumivahetuse nimel palun verifitseeri oma praegune sessioon. - Sinu praegune sessioon on valmis turvaliseks sõnumivahetuseks. Verifitseerimata sessioon Verifitseeritud sessioon Tundmatu seadme tüüp diff --git a/library/ui-strings/src/main/res/values-eu/strings.xml b/library/ui-strings/src/main/res/values-eu/strings.xml index 7b27d1cc1d..f1f834ee04 100644 --- a/library/ui-strings/src/main/res/values-eu/strings.xml +++ b/library/ui-strings/src/main/res/values-eu/strings.xml @@ -406,7 +406,7 @@ Kontuan izan ekintza honek aplikazioa berrabiaraziko duela eta denbora bat behar Deszifratze errorea Izen publikoa - IDa + IDa Saioaren gakoa Esportatu E2E geletako gakoak diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index 75b3ab128c..a3f1ea9a80 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -678,7 +678,7 @@ این‌ها ویژگی‌های آزمایشی‌ای هستند که ممکن است به روش‌های نامنتظره‌ای حراب شوندا. با احتیاط استفاده کنید. تنظیم به عنوان نشانی اصلی نام عمومی - شناسهٔ نشست + شناسهٔ نشست کلید نشست برون‌ریزی کلید‌های اتاق‌های سرتاسری برون‌ریزی کلید‌های اتاق‌ها @@ -2622,11 +2622,8 @@ تأیید نشده · آخرین فعّالیت %1$s تأیید شده · آخرین فعّالیت %1$s دیدن همه (%1$d) - نشست کنونی دیدن جزییات تأیید نشست - نشست کنونیتان را برای پیام‌رسانی امن بهبود یافته تأیید کنید. - نشست کنونیتان برای پیام‌رسانی امن آماده است. نشست تأیید نشده نشست تأیید شده گونهٔ افزاره ناشناخته diff --git a/library/ui-strings/src/main/res/values-fi/strings.xml b/library/ui-strings/src/main/res/values-fi/strings.xml index fde2502ae0..a576e7f0dc 100644 --- a/library/ui-strings/src/main/res/values-fi/strings.xml +++ b/library/ui-strings/src/main/res/values-fi/strings.xml @@ -366,7 +366,7 @@ Kumoa pääosoitteeksi asettaminen Salauksenpurkuvirhe Julkinen nimi - Istunnon tunnus + Istunnon tunnus Istunnon avain Vie salatun huoneen avaimet Vie huoneen avaimet diff --git a/library/ui-strings/src/main/res/values-fr-rCA/strings.xml b/library/ui-strings/src/main/res/values-fr-rCA/strings.xml index 29a618f415..94db2935a7 100644 --- a/library/ui-strings/src/main/res/values-fr-rCA/strings.xml +++ b/library/ui-strings/src/main/res/values-fr-rCA/strings.xml @@ -778,7 +778,7 @@ Exporter les clés des salons Exporter les clés E2E des salons Clé de la session - Identifiant de session + Identifiant de session Nom public Erreur de déchiffrement Thème diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml index 0df8272fe5..5a19ccf2da 100644 --- a/library/ui-strings/src/main/res/values-fr/strings.xml +++ b/library/ui-strings/src/main/res/values-fr/strings.xml @@ -346,7 +346,7 @@ Désactiver comme adresse principale Erreur de déchiffrement Nom public - Identifiant de session + Identifiant de session Clé de la session Exporter les clés E2E des salons Exporter les clés des salons @@ -2622,11 +2622,8 @@ Non vérifiée · Dernière activité %1$s Vérifié · Dernière activité %1$s Tout voir (%1$d) - Cette session Voir les détails Vérifier la session - Vérifiez votre session pour une sécurité renforcée de votre messagerie. - Votre session est prête pour l’envoi de messages sécurisés. Session non vérifiée Session vérifiée Type de périphérique inconnu diff --git a/library/ui-strings/src/main/res/values-gl/strings.xml b/library/ui-strings/src/main/res/values-gl/strings.xml index e6d26a63e5..c1e4e40a81 100644 --- a/library/ui-strings/src/main/res/values-gl/strings.xml +++ b/library/ui-strings/src/main/res/values-gl/strings.xml @@ -380,7 +380,7 @@ Tema Fallo ao descifrar Nome do dispositivo - ID de sesión + ID de sesión Chave do dispositivo Exportar chaves E2E da sala Exportar chaves da sala diff --git a/library/ui-strings/src/main/res/values-hr/strings.xml b/library/ui-strings/src/main/res/values-hr/strings.xml index dc5930b933..6d52e5cd96 100644 --- a/library/ui-strings/src/main/res/values-hr/strings.xml +++ b/library/ui-strings/src/main/res/values-hr/strings.xml @@ -572,7 +572,7 @@ Tema Greška u dešifriranju Javni naziv - Identitet + Identitet Ključ sesije Izvezi sobne ključeve za E2E Izvezi sobne ključeve diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index d8bdbb09fd..8fcea0caef 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -351,7 +351,7 @@ Kiszedés fő címek közül Visszafejtés hiba Nyilvános név - Munkamenet-azonosító + Munkamenet-azonosító Munkamenet kulcs E2E szoba kulcsok exportálása Szoba kulcsok exportálása @@ -2603,11 +2603,8 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Nem ellenőrzött - Utolsó aktivitás %1$s Ellenőrzött - Utolsó tevékenység %1$s Összes megtekintése (%1$d) - Jelenlegi munkamenet Részletek megtekintése Munkamenet hitelesítése - Az aktuális munkamenet készen áll a biztonságos üzenetküldésre. - Az aktuális munkamenet készen áll a biztonságos üzenetküldésre. Ellenőrizetlen munkamenet Ellenőrzött munkamenet Ismeretlen eszköztípus diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml index 3cec03dc75..3b30950bd1 100644 --- a/library/ui-strings/src/main/res/values-in/strings.xml +++ b/library/ui-strings/src/main/res/values-in/strings.xml @@ -301,7 +301,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Tema Kesalahan dekripsi Nama perangkat - ID Sesi + ID Sesi Kunci perangkat Ekspor kunci ruangan terenkripsi Ekspor ruangan kunci @@ -2576,11 +2576,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Belum diverifikasi · Aktivitas terakhir %1$s Terverifikasi · Aktivitas terakhir %1$s Tampilkan Semua (%1$d) - Sesi Saat Ini Tampilkan Detail Verifikasi Sesi - Verifikasi sesi Anda saat ini untuk perpesanan yang aman. - Sesi Anda saat ini siap untuk perpesanan yang aman. Sesi belum diverifikasi Sesi terverifikasi Tipe perangkat tidak diketahui diff --git a/library/ui-strings/src/main/res/values-is/strings.xml b/library/ui-strings/src/main/res/values-is/strings.xml index 7818761145..d25d66bfba 100644 --- a/library/ui-strings/src/main/res/values-is/strings.xml +++ b/library/ui-strings/src/main/res/values-is/strings.xml @@ -193,7 +193,7 @@ Þema Afkóðunarvilla Heiti tækis - Auðkenni setu + Auðkenni setu Dulritunarlykill setu Flytja út Settu inn lykilsetningu diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml index 422dfc2a3a..b7b0fe91af 100644 --- a/library/ui-strings/src/main/res/values-it/strings.xml +++ b/library/ui-strings/src/main/res/values-it/strings.xml @@ -430,7 +430,7 @@ Tema Errore di decriptazione Nome pubblico - ID sessione + ID sessione Chiave sessione Esporta le chiavi di crittografia E2E delle stanze Esporta le chiavi delle stanze @@ -2613,11 +2613,8 @@ Non verificata · Ultima attività %1$s Verificata · Ultima attività %1$s Vedi tutte (%1$d) - Sessione attuale Vedi dettagli Verifica la sessione - Verifica la tua sessione attuale per messaggi più sicuri. - La tua sessione attuale è pronta per i messaggi sicuri. Sessione non verificata Sessione verificata Tipo di dispositivo sconosciuto diff --git a/library/ui-strings/src/main/res/values-iw/strings.xml b/library/ui-strings/src/main/res/values-iw/strings.xml index 6d9533852b..ff19310c8e 100644 --- a/library/ui-strings/src/main/res/values-iw/strings.xml +++ b/library/ui-strings/src/main/res/values-iw/strings.xml @@ -542,7 +542,7 @@ יצא מפתחות חדר ייצא מפתחות חדר E2E מזהה מפתח - מזהה מושב + מזהה מושב שם ציבורי שגיאת פענוח ערכת נושא diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index b781e4d7f0..3e817e398c 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -197,7 +197,7 @@ これらは予期しない不具合が生じるかもしれない実験的機能です。慎重に使用してください。 メインアドレスとして設定 メインアドレスとしての設定を解除 - セッションID + セッションID 文字の大きさ とても小さい 小さい diff --git a/library/ui-strings/src/main/res/values-kab/strings.xml b/library/ui-strings/src/main/res/values-kab/strings.xml index a79b72efde..353fb99f53 100644 --- a/library/ui-strings/src/main/res/values-kab/strings.xml +++ b/library/ui-strings/src/main/res/values-kab/strings.xml @@ -291,7 +291,7 @@ Talqayt Tinarimin Asentel - Asulay n tqimit + Asulay n tqimit Tasarut n tɣimit Sifeḍ tisura n texxamt E2E Sifeḍ tisura n texxamt diff --git a/library/ui-strings/src/main/res/values-ko/strings.xml b/library/ui-strings/src/main/res/values-ko/strings.xml index ba0cbe5abd..37e8849fa8 100644 --- a/library/ui-strings/src/main/res/values-ko/strings.xml +++ b/library/ui-strings/src/main/res/values-ko/strings.xml @@ -431,7 +431,7 @@ 테마 암호 복호화 오류 공개 이름 - ID + ID 기기 키 종단간 암호화 방 키 내보내기 방 키 내보내기 diff --git a/library/ui-strings/src/main/res/values-lo/strings.xml b/library/ui-strings/src/main/res/values-lo/strings.xml index 1a9a2820b8..a92adb0225 100644 --- a/library/ui-strings/src/main/res/values-lo/strings.xml +++ b/library/ui-strings/src/main/res/values-lo/strings.xml @@ -909,7 +909,7 @@ ສົ່ງອອກກະແຈຫ້ອງ ສົ່ງອອກກະແຈຫ້ອງ E2E ລະຫັດລະບົບ - ID ລະບົບ + ID ລະບົບ ຊື່ສາທາລະນະ ການຖອດລະຫັດຜິດພາດ ຫົວຂໍ້ diff --git a/library/ui-strings/src/main/res/values-lt/strings.xml b/library/ui-strings/src/main/res/values-lt/strings.xml index 12e0c9d67d..adfc70c36e 100644 --- a/library/ui-strings/src/main/res/values-lt/strings.xml +++ b/library/ui-strings/src/main/res/values-lt/strings.xml @@ -770,11 +770,8 @@ Nepatvirtinta · Paskutinė veikla %1$s Patvirtinta · Paskutinė veikla %1$s Peržiūrėti visas (%1$d) - Dabartinė sesija Peržiūrėti detales Patvirtinti sesiją - Patvirtinkite dabartinę sesiją, kad galėtumėte naudotis patobulintu saugumu pokalbiams. - Dabartinė sesija paruošta saugiems pokalbiams. Nepatvirtinta sesija Patvirtinta sesija Nežinomas įrenginio tipas @@ -1409,4 +1406,4 @@ Keisti kambario pavadinimą Keisti istorijos matomumą %s atnaujino čia. - \ No newline at end of file + diff --git a/library/ui-strings/src/main/res/values-lv/strings.xml b/library/ui-strings/src/main/res/values-lv/strings.xml index f1fa1502c1..1787653fae 100644 --- a/library/ui-strings/src/main/res/values-lv/strings.xml +++ b/library/ui-strings/src/main/res/values-lv/strings.xml @@ -469,7 +469,7 @@ Tēma Atšifrēšanas kļūda Ierīces nosaukums - Sesijas ID + Sesijas ID Sesijas atslēga Eksportēt istabas šifrēšanas atslēgas Eksportēt istabas atslēgas diff --git a/library/ui-strings/src/main/res/values-nb-rNO/strings.xml b/library/ui-strings/src/main/res/values-nb-rNO/strings.xml index 031b380c7e..7af718d920 100644 --- a/library/ui-strings/src/main/res/values-nb-rNO/strings.xml +++ b/library/ui-strings/src/main/res/values-nb-rNO/strings.xml @@ -119,7 +119,7 @@ Bannlyste brukere Avansert Tema - Økt-ID + Økt-ID Øktnøkkel Eksporter Importer diff --git a/library/ui-strings/src/main/res/values-nl/strings.xml b/library/ui-strings/src/main/res/values-nl/strings.xml index d9f36739d3..ce122b0646 100644 --- a/library/ui-strings/src/main/res/values-nl/strings.xml +++ b/library/ui-strings/src/main/res/values-nl/strings.xml @@ -275,7 +275,7 @@ Niet instellen als hoofdadres Ontsleutelingsfout Publieke naam - Sessie-ID + Sessie-ID Sessiesleutel E2E-gesprekssleutels exporteren Gesprekssleutels exporteren @@ -2635,7 +2635,6 @@ Al %1$d+ dag inactief (%2$s) Al %1$d+ dagen inactief (%2$s) - Verifieer uw huidige sessie voor verbeterde beveiligde berichten. Beveiligingsaanbevelingen Niet-geverifieerde sessies Inactieve sessies @@ -2651,10 +2650,8 @@ Niet-geverifieerd · Laatste activiteit %1$s Geverifieerd · Laatste activiteit %1$s Alle bekijken (%1$d) - Huidige sessie Details bekijken Sessie verifiëren - Uw huidige sessie is klaar voor beveiligde berichten. Sorry, deze kamer kon niet worden gevonden. \nProbeer het later opnieuw. %s Dit is waar uw nieuwe verzoeken en uitnodigingen zullen verschijnen. diff --git a/library/ui-strings/src/main/res/values-nn/strings.xml b/library/ui-strings/src/main/res/values-nn/strings.xml index a56ba0ac30..45c8679736 100644 --- a/library/ui-strings/src/main/res/values-nn/strings.xml +++ b/library/ui-strings/src/main/res/values-nn/strings.xml @@ -310,7 +310,7 @@ Preg Noko gjekk gale med dekrypteringa Offentleg namn - Økt-ID + Økt-ID Sesjonsnøkkel Eksporter E2E-romnøkklar Eksporter romnøkklar diff --git a/library/ui-strings/src/main/res/values-pl/strings.xml b/library/ui-strings/src/main/res/values-pl/strings.xml index 5959abc804..b7b73eb9e6 100644 --- a/library/ui-strings/src/main/res/values-pl/strings.xml +++ b/library/ui-strings/src/main/res/values-pl/strings.xml @@ -231,7 +231,7 @@ Ustaw jako główny adres Motyw Nazwa publiczna - ID sesji + ID sesji Eksportuj Wprowadź hasło Potwierdź hasło @@ -2721,10 +2721,8 @@ Nie zweryfikowano · Ostatnia aktywność %1$s Zweryfikowano · Ostatnia aktywność %1$s Pokaż wszystkie (%1$d) - Obecna sesja Pokaż szczegóły Zweryfikuj sesję - Twoja obecna sesja jest przygotowana do bezpiecznej komunikacji. Niezweryfikowana sesja Zweryfikowana sesja Nieznany typ urządzenia diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml index c17f9c0b57..7e2fcb10e8 100644 --- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml +++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml @@ -418,7 +418,7 @@ Des-definir como endereço principal Erro de decriptação Nome público - ID de sessão + ID de sessão Chave de sessão Exportar chaves de sala E2E Exportar chaves de sala @@ -2622,11 +2622,8 @@ Não-verificada · Última atividade %1$s Verificada · Última atividade %1$s Ver Todas (%1$d) - Sessão Atual Visualizar Detalhes Verificar Sessão - Verifique sua sessão atual para mensageria segura melhorada. - Sua sessão atual está pronta para mensageria segura. Sessão não-verificada Sessão verificada Tipo de dispositivo desconhecido diff --git a/library/ui-strings/src/main/res/values-pt/strings.xml b/library/ui-strings/src/main/res/values-pt/strings.xml index 4daaef83b0..87b6297b2b 100644 --- a/library/ui-strings/src/main/res/values-pt/strings.xml +++ b/library/ui-strings/src/main/res/values-pt/strings.xml @@ -246,7 +246,7 @@ Note que esta acção irá reiniciar a aplicação e poderá levar algum tempo.< Erro de decifragem Nome do dispositivo - ID do dispositivo + ID do dispositivo Chave do dispositivo Exportar chaves E2E da sala Exportar chaves de sala diff --git a/library/ui-strings/src/main/res/values-ru/strings.xml b/library/ui-strings/src/main/res/values-ru/strings.xml index 39795ef99a..7c9d073035 100644 --- a/library/ui-strings/src/main/res/values-ru/strings.xml +++ b/library/ui-strings/src/main/res/values-ru/strings.xml @@ -432,7 +432,7 @@ Сбросить основной адрес Ошибка дешифровки Публичное имя - ID сессии + ID сессии Ключ сессии Экспорт E2E ключей комнаты Экспорт ключей комнаты @@ -2681,7 +2681,6 @@ Посмотреть все (%1$d) Повысьте безопасность учётной записи, следуя этим рекомендациям. Заверенная · Последняя активность %1$s - Текущая сессия Незаверенная сессия Заверенная сессия Неизвестный тип устройства @@ -2694,5 +2693,4 @@ Добро пожаловать в ${app_name}, \n%s. Оставить отзыв - Текущая сессия готова к безопасному обмену сообщениями. diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml index 19058ac656..9eb22e3ae3 100644 --- a/library/ui-strings/src/main/res/values-sk/strings.xml +++ b/library/ui-strings/src/main/res/values-sk/strings.xml @@ -388,7 +388,7 @@ Vzhľad Chyba dešifrovania Verejné meno - ID relácie + ID relácie Kľúč relácie Exportovať šifrovacie kľúče miestnosti Exportovať kľúče miestnosti @@ -2672,11 +2672,8 @@ Neoverené - Posledná aktivita %1$s Overené - Posledná aktivita %1$s Zobraziť všetky (%1$d) - Aktuálna relácia Zobraziť podrobnosti Overiť reláciu - Overte svoju aktuálnu reláciu pre vylepšené bezpečné zasielanie správ. - Vaša aktuálna relácia je pripravená na bezpečné zasielanie správ. Neoverená relácia Overená relácia Neznámy typ zariadenia diff --git a/library/ui-strings/src/main/res/values-sq/strings.xml b/library/ui-strings/src/main/res/values-sq/strings.xml index 8fdf4ee310..a6af0a4921 100644 --- a/library/ui-strings/src/main/res/values-sq/strings.xml +++ b/library/ui-strings/src/main/res/values-sq/strings.xml @@ -431,7 +431,7 @@ Temë Gabim shfshehtëzimi Emër publik - ID Sesioni + ID Sesioni Kyç sesioni Eksporto kyçe dhome E2E Eksporto kyçe dhome diff --git a/library/ui-strings/src/main/res/values-sv/strings.xml b/library/ui-strings/src/main/res/values-sv/strings.xml index 025713272c..30b63c213c 100644 --- a/library/ui-strings/src/main/res/values-sv/strings.xml +++ b/library/ui-strings/src/main/res/values-sv/strings.xml @@ -918,7 +918,7 @@ Sätt upp på den här enheten Generera en ny säkerhetskopia eller sätt en ny lösenfras för din existerande säkerhetskopia. Detta är experimentella funktioner som kan gå sönder på oväntade sätt. Använd varsamt. - Sessions-ID + Sessions-ID Sessionsnyckel Exportera krypteringsnycklar Exportera rumsnycklar diff --git a/library/ui-strings/src/main/res/values-te/strings.xml b/library/ui-strings/src/main/res/values-te/strings.xml index 5ed2462ce8..0154d54c2e 100644 --- a/library/ui-strings/src/main/res/values-te/strings.xml +++ b/library/ui-strings/src/main/res/values-te/strings.xml @@ -260,7 +260,7 @@ ప్రధాన చిరునామాగా సెట్ చేయండి పరికరం పేరు - పరికరం ID + పరికరం ID పరికరం కీ E2E గది కీలను ఎగుమతి చేయండి diff --git a/library/ui-strings/src/main/res/values-tr/strings.xml b/library/ui-strings/src/main/res/values-tr/strings.xml index c097bfce6a..1f0e5be153 100644 --- a/library/ui-strings/src/main/res/values-tr/strings.xml +++ b/library/ui-strings/src/main/res/values-tr/strings.xml @@ -376,7 +376,7 @@ Tema Çözme hatası Görünür Ad - Oturum kimliği + Oturum kimliği Oturum anahtarı E2E Oda anahtarlarını dışa aktar Oda anahtarlarını dışa aktar diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml index 3ba8f96674..3e511f8459 100644 --- a/library/ui-strings/src/main/res/values-uk/strings.xml +++ b/library/ui-strings/src/main/res/values-uk/strings.xml @@ -354,7 +354,7 @@ Зробити не основною адресою Помилка розшифрування Загальнодоступна назва - ID сеансу + ID сеансу Ключ сеансу Експортувати E2E ключі кімнати Експортувати ключі кімнати @@ -2722,11 +2722,8 @@ Не звірений · Остання активність %1$s Звірений · Остання активність %1$s Переглянути всі (%1$d) - Поточний сеанс Переглянути подробиці Звірити сеанс - Звірте свій поточний сеанс для безпечнішого обміну повідомленнями. - Ваш поточний сеанс готовий для безпечного обміну повідомленнями. Не звірений сеанс Звірений сеанс Невідомий тип пристрою diff --git a/library/ui-strings/src/main/res/values-vi/strings.xml b/library/ui-strings/src/main/res/values-vi/strings.xml index 2803128843..c6dc97f782 100644 --- a/library/ui-strings/src/main/res/values-vi/strings.xml +++ b/library/ui-strings/src/main/res/values-vi/strings.xml @@ -594,7 +594,7 @@ Hủy tài khoản Xem lại ngay Chìa khóa phiên - Mã phiên + Mã phiên Tên công khai Lỗi giải mã Những chức năng này mang tính thí nghiệm có thể còn nhiều lỗi. Lưu ý khi dùng. diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index 2a99ad240b..db1dab92e2 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -242,7 +242,7 @@ 你的密码已更新 解密错误 公开名称 - 会话 ID + 会话 ID 会话密钥 导入 已验证 @@ -2574,11 +2574,8 @@ 未验证 · 上次活跃 %1$s 已验证 · 上次活跃 %1$s 查看全部(%1$d) - 当前会话 查看详情 验证会话 - 为了获得增强的安全的消息传送,请验证你当前的会话。 - 你的当前会话已准备好安全地收发消息。 未验证的会话 已验证的会话 未知的设备类型 diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml index 8a07ae94f9..78caa2cc2e 100644 --- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml @@ -469,7 +469,7 @@ 主題 解密錯誤 公開名稱 - 工作階段 ID + 工作階段 ID 工作階段金鑰 匯出聊天室的端到端加密金鑰 匯出聊天室的加密金鑰 @@ -2572,11 +2572,8 @@ 未驗證 · 最後活動 %1$s 已驗證 · 最後活動 %1$s 檢視全部 (%1$d) - 目前工作階段 檢視詳細資訊 驗證工作階段 - 驗證您目前的工作階段以強化安全通訊。 - 您目前的工作階段已準備好進行安全通訊。 未驗證的工作階段 已驗證的工作階段 未知的裝置類型 diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index e6b6a6acc1..dec46159dd 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -3232,18 +3232,12 @@ Unknown device type Verified session Unverified session - - Your current session is ready for secure messaging. - - Verify your current session for enhanced secure messaging. Your current session is ready for secure messaging. This session is ready for secure messaging. Verify your current session for enhanced secure messaging. Verify or sign out from this session for best security and reliability. Verify Session View Details - - Current Session View All (%1$d) Verified · Last activity %1$s @@ -3296,8 +3290,7 @@ Session details Application, device, and activity information. Session name - - Session ID + Session ID Last activity IP address diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/details/SessionDetailsController.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/details/SessionDetailsController.kt index 3d3b6dfdcb..1fb5be4d78 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/details/SessionDetailsController.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/details/SessionDetailsController.kt @@ -95,7 +95,7 @@ class SessionDetailsController @Inject constructor( } sessionId?.let { val hasDivider = sessionLastSeenTs != null - buildContentItem(R.string.encryption_information_device_id, it, hasDivider) + buildContentItem(R.string.device_manager_session_details_session_id, it, hasDivider) } sessionLastSeenTs?.let { val formattedDate = dateFormatter.format(it, DateFormatKind.MESSAGE_DETAIL) diff --git a/vector/src/main/res/layout/dialog_device_verify.xml b/vector/src/main/res/layout/dialog_device_verify.xml index 82432a892a..475ffc69af 100644 --- a/vector/src/main/res/layout/dialog_device_verify.xml +++ b/vector/src/main/res/layout/dialog_device_verify.xml @@ -39,7 +39,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="6dp" - android:text="@string/encryption_information_device_id" + android:text="@string/device_manager_session_details_session_id" android:textStyle="bold" /> Date: Wed, 21 Sep 2022 18:22:06 +0000 Subject: [PATCH 094/131] Translated using Weblate (Catalan) Currently translated at 98.7% (2389 of 2419 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ca/ --- .../ui-strings/src/main/res/values-ca/strings.xml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ca/strings.xml b/library/ui-strings/src/main/res/values-ca/strings.xml index 4765eb11e5..863fa13fbb 100644 --- a/library/ui-strings/src/main/res/values-ca/strings.xml +++ b/library/ui-strings/src/main/res/values-ca/strings.xml @@ -1470,7 +1470,7 @@ %d sessió activa %d sessions actives - Aquesta sessió és de confiança per a xats segurs ja que l\'has verificada tu: + Aquesta sessió és de confiança per a missatges segurs ja que l\'has verificada tu: Desconnecta aquesta sessió Gestió de sessions Veure totes les sessions @@ -1844,7 +1844,7 @@ Altres idiomes disponibles Idioma actual Motiu de l\'eliminació - Aquesta sessió és de confiança per a xats segurs ja que %1$s (%2$s) l\'ha verificat: + Aquesta sessió és de confiança per a missatges segurs ja que %1$s (%2$s) l\'ha verificat: Obtenint clau de corba No s\'ha pogut crear el xat. Comprova els usuaris que vols convidar i torna-ho a provar. Verifica manualment mitjançant text @@ -2225,7 +2225,7 @@ Tria on es desen les teves converses, et dona control i independència. Connectat a través de Matrix. Comunicació segura i independent que t\'ofereix el mateix nivell de privadesa que una conversa cara a cara a casa teva. Missatgeria pel teu equip. - Missatgeria segura. + Missatges segurs. Ets propietari de les teves converses. Tu tens el control. Trucada finalitzada • %1$s @@ -2668,4 +2668,10 @@ Amaga els continguts de %s Mostra el contingut de %s Canvia espai - + Verifica les teves sessions per obtenir missatges segurs millorats o tanca les sessions que no reconeguis o ja no utilitzis. + No llest per a missatges segurs + Llest per a missatges segurs + Aquesta sessió està llesta per a missatges segurs. + La teva sessió actual està llesta per a missatges segurs. + Verifica la teva sessió actual obtenir missatges segurs millorats. + \ No newline at end of file From 1446e8f50b14b4dee8df015329ad0835a13247c7 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Wed, 21 Sep 2022 19:11:24 +0000 Subject: [PATCH 095/131] Translated using Weblate (Persian) Currently translated at 99.8% (2415 of 2419 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- .../src/main/res/values-fa/strings.xml | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml index a3f1ea9a80..400a8121f9 100644 --- a/library/ui-strings/src/main/res/values-fa/strings.xml +++ b/library/ui-strings/src/main/res/values-fa/strings.xml @@ -2668,4 +2668,36 @@ جمع کردن فرزندان %s گسترش فرزندان %s تغییر فضا - + نشانی آی‌پی + واپسین فعّالیت + نام نشست + اطّلاعات برنامه، افزاره و فعّالیت. + جزییات نشست + پاک‌سازی پالایه + هیچ نشست غیرفعّالی پیدا نشد. + هیچ نشست تأیید نشده‌ای پیدا نشد. + هیچ نشست تأیید نشده‌ای پیدا نشد. + غیرفعّال + تأیید نشده + برای بهترین امنیت، از هرنشستی که تشخیصش نمی‌دهید یا دیگر استفاده نمی‌کنید، خارج شوید. + تأیید شده + پالایه + غیرفعّال + نا آماده برای پیام‌رسانی امن + تأیید نشده + آمادهٔ پیام‌رسانی امن + تأیید شده + تمامی نشست‌ها + پالایه + آخرین فعّالیت %1$s + افزاره + نشست + نشست کنونی + برای بهترین امنیت و اطمینان این نشست را تأیید کرده یا خارج شوید. + تأیید نشست کنونیتان برای پیام‌رسانی امن. + این نشست برای پیام‌رسانی امن آماده است. + نشست کنونیتان برای پیام‌رسانی امن آماده است. + ایجاد پیام خصوصی فقط در نخستین پیام + المنتی ساده شده با زبانه‌های انتخابی + به کار انداختن چینش جدید + \ No newline at end of file From d08b33ec075de639b818968207abc4c0a6520f8b Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 22 Sep 2022 09:45:06 +0200 Subject: [PATCH 096/131] Translations: fix some mispells --- library/ui-strings/src/main/res/values-es/strings.xml | 2 +- library/ui-strings/src/main/res/values-hu/strings.xml | 2 +- library/ui-strings/src/main/res/values-pt-rBR/strings.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/library/ui-strings/src/main/res/values-es/strings.xml b/library/ui-strings/src/main/res/values-es/strings.xml index 86143d9fa4..bc4299c1bd 100644 --- a/library/ui-strings/src/main/res/values-es/strings.xml +++ b/library/ui-strings/src/main/res/values-es/strings.xml @@ -2535,7 +2535,7 @@ Consejos de seguridad Inactiva por %1$d+ día (%2$s) - Inactiva por %1$d+ dias (%2$s) + Inactiva por %1$d+ días (%2$s) Sin verificar · Última actividad %1$s Verificada · Última actividad %1$s diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml index 8fcea0caef..3068556fe4 100644 --- a/library/ui-strings/src/main/res/values-hu/strings.xml +++ b/library/ui-strings/src/main/res/values-hu/strings.xml @@ -2654,7 +2654,7 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze Biztonsági javaslatok Semmi új. Terekkel lehet szobákat és személyeket csoportokba rendezni. Készíts egyet indulásnak. - Nincsenek terek egyenlőre. + Nincsenek terek egyelőre. %s összezárása %s kinyitása Tér cseréje diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml index 7e2fcb10e8..817c7646df 100644 --- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml +++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml @@ -2639,11 +2639,11 @@ Acessar seus Espaços (direito fundo) mais rápido e fácio que jamais antes. Acessar Espaços Para simplificar seu ${app_name}, abas são agora opcionais. Gerencie-as usando o menu direito topo. - Boas vindas a uma nova visão! + Boas-vindas a uma nova visão! Isto é onde suas mensagens não-lidas vão aparecer, quando você tiver algumas. Nada a reportar. O app de chat seguro tudo-em-um para equipes, amigas(os) e organizações. Crie um chat, ou junte-se a uma sala existe, para começar. - Boas vindas a ${app_name}, + Boas-vindas a ${app_name}, \n%s. Espaços são uma nova maneira de agrupar salas e pessoas. Adicione uma sala existente, ou crie uma nova, usando o botão direito fundo. %s From 14e7c913df8edc05ace2604eb2871ab12be05be8 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 21 Sep 2022 20:22:54 +0200 Subject: [PATCH 097/131] Release 1.5.0: update CHANGES --- CHANGES.md | 38 +++++++++++++++++++ changelog.d/5424.bugfix | 1 - changelog.d/6776.bugfix | 1 - changelog.d/6779.misc | 1 - changelog.d/6970.wip | 1 - changelog.d/7035.misc | 1 - changelog.d/7045.wip | 1 - changelog.d/7077.wip | 1 - changelog.d/7079.bugfix | 1 - changelog.d/7102.bugfix | 1 - changelog.d/7103.bugfix | 1 - changelog.d/7108.misc | 1 - changelog.d/7121.wip | 1 - changelog.d/7122.bugfix | 1 - changelog.d/7130.bugfix | 1 - changelog.d/7132.bugfix | 1 - changelog.d/7140.misc | 1 - changelog.d/7142.misc | 1 - changelog.d/7153.wip | 1 - changelog.d/7157.misc | 1 - changelog.d/7166.misc | 1 - changelog.d/7180.feature | 1 - changelog.d/7186.bugfix | 1 - .../android/en-US/changelogs/40105000.txt | 2 + 24 files changed, 40 insertions(+), 22 deletions(-) delete mode 100644 changelog.d/5424.bugfix delete mode 100644 changelog.d/6776.bugfix delete mode 100644 changelog.d/6779.misc delete mode 100644 changelog.d/6970.wip delete mode 100644 changelog.d/7035.misc delete mode 100644 changelog.d/7045.wip delete mode 100644 changelog.d/7077.wip delete mode 100644 changelog.d/7079.bugfix delete mode 100644 changelog.d/7102.bugfix delete mode 100644 changelog.d/7103.bugfix delete mode 100644 changelog.d/7108.misc delete mode 100644 changelog.d/7121.wip delete mode 100644 changelog.d/7122.bugfix delete mode 100644 changelog.d/7130.bugfix delete mode 100644 changelog.d/7132.bugfix delete mode 100644 changelog.d/7140.misc delete mode 100644 changelog.d/7142.misc delete mode 100644 changelog.d/7153.wip delete mode 100644 changelog.d/7157.misc delete mode 100644 changelog.d/7166.misc delete mode 100644 changelog.d/7180.feature delete mode 100644 changelog.d/7186.bugfix create mode 100644 fastlane/metadata/android/en-US/changelogs/40105000.txt diff --git a/CHANGES.md b/CHANGES.md index 518bbd8b67..f0ecb5fc04 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,41 @@ +Changes in Element v1.5.0 (2022-09-21) +====================================== + +Features ✨ +---------- + - Deferred DMs - Enable and move the feature to labs settings ([#7180](https://github.com/vector-im/element-android/issues/7180)) + +Bugfixes 🐛 +---------- + - Fix text margin in QR code view when no display name is set ([#5424](https://github.com/vector-im/element-android/issues/5424)) + - [App Layout] Recents carousel now scrolled to first position when new item added to or moved to this position ([#6776](https://github.com/vector-im/element-android/issues/6776)) + - Fixed problem when room list's scroll did jump after rooms placeholders were replaced with rooms summary items ([#7079](https://github.com/vector-im/element-android/issues/7079)) + - Fixes crash when quickly double clicking FABs in the new app layout ([#7102](https://github.com/vector-im/element-android/issues/7102)) + - Fixes space list and new chat bottom sheets showing too small in New App Layout (especially evident in landscape) ([#7103](https://github.com/vector-im/element-android/issues/7103)) + - [App Layout] Room leaving prompt dialog now waits user to confirm leaving before do so ([#7122](https://github.com/vector-im/element-android/issues/7122)) + - Fix empty verification bottom sheet. ([#7130](https://github.com/vector-im/element-android/issues/7130)) + - [New Layout] Fixes new chat dialog not getting dismissed after selecting its actions ([#7132](https://github.com/vector-im/element-android/issues/7132)) + - Fixes Room List not getting updated when fragment is not in focus ([#7186](https://github.com/vector-im/element-android/issues/7186)) + +In development 🚧 +---------------- + - Create DM room only on first message - Add a spinner when sending the first message ([#6970](https://github.com/vector-im/element-android/issues/6970)) + - [Device Manager] Filter Other Sessions ([#7045](https://github.com/vector-im/element-android/issues/7045)) + - [Device management] Session details screen ([#7077](https://github.com/vector-im/element-android/issues/7077)) + - Create DM room only on first message - Fix glitch in the room list ([#7121](https://github.com/vector-im/element-android/issues/7121)) + - Create DM room only on first message - Handle the local rooms within the new AppLayout ([#7153](https://github.com/vector-im/element-android/issues/7153)) + +Other changes +------------- + - [Modules] Lifts the application variants to the app module ([#6779](https://github.com/vector-im/element-android/issues/6779)) + - Ensure that we do not expect all the Event fields when requesting `rooms/{roomId}/hierarchy` endpoint. ([#7035](https://github.com/vector-im/element-android/issues/7035)) + - Move some GitHub actions to buildjet runners, and remove the second attempt to run integration tests. ([#7108](https://github.com/vector-im/element-android/issues/7108)) + - Exclude legacy android support annotation library ([#7140](https://github.com/vector-im/element-android/issues/7140)) + - Pulling no longer hosted im.dlg:android-dialer directly into the repository and removing legacy support library usages ([#7142](https://github.com/vector-im/element-android/issues/7142)) + - Fixing build cache misses when compiling the vector module ([#7157](https://github.com/vector-im/element-android/issues/7157)) + - New App Layout is now enabled by default! Go to the Settings > Labs to toggle this ([#7166](https://github.com/vector-im/element-android/issues/7166)) + + Changes in Element v1.4.36 (2022-09-10) ======================================= diff --git a/changelog.d/5424.bugfix b/changelog.d/5424.bugfix deleted file mode 100644 index 88ebd828f1..0000000000 --- a/changelog.d/5424.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix text margin in QR code view when no display name is set \ No newline at end of file diff --git a/changelog.d/6776.bugfix b/changelog.d/6776.bugfix deleted file mode 100644 index ceb1d52ebf..0000000000 --- a/changelog.d/6776.bugfix +++ /dev/null @@ -1 +0,0 @@ -[App Layout] Recents carousel now scrolled to first position when new item added to or moved to this position diff --git a/changelog.d/6779.misc b/changelog.d/6779.misc deleted file mode 100644 index 70eda0eb2f..0000000000 --- a/changelog.d/6779.misc +++ /dev/null @@ -1 +0,0 @@ -[Modules] Lifts the application variants to the app module diff --git a/changelog.d/6970.wip b/changelog.d/6970.wip deleted file mode 100644 index 4ec53e0d53..0000000000 --- a/changelog.d/6970.wip +++ /dev/null @@ -1 +0,0 @@ -Create DM room only on first message - Add a spinner when sending the first message diff --git a/changelog.d/7035.misc b/changelog.d/7035.misc deleted file mode 100644 index 0a446b09d5..0000000000 --- a/changelog.d/7035.misc +++ /dev/null @@ -1 +0,0 @@ -Ensure that we do not expect all the Event fields when requesting `rooms/{roomId}/hierarchy` endpoint. diff --git a/changelog.d/7045.wip b/changelog.d/7045.wip deleted file mode 100644 index 8976ca9744..0000000000 --- a/changelog.d/7045.wip +++ /dev/null @@ -1 +0,0 @@ -[Device Manager] Filter Other Sessions diff --git a/changelog.d/7077.wip b/changelog.d/7077.wip deleted file mode 100644 index 907993c76f..0000000000 --- a/changelog.d/7077.wip +++ /dev/null @@ -1 +0,0 @@ -[Device management] Session details screen diff --git a/changelog.d/7079.bugfix b/changelog.d/7079.bugfix deleted file mode 100644 index b63d491e4b..0000000000 --- a/changelog.d/7079.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fixed problem when room list's scroll did jump after rooms placeholders were replaced with rooms summary items diff --git a/changelog.d/7102.bugfix b/changelog.d/7102.bugfix deleted file mode 100644 index 73d1bbc7d6..0000000000 --- a/changelog.d/7102.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fixes crash when quickly double clicking FABs in the new app layout diff --git a/changelog.d/7103.bugfix b/changelog.d/7103.bugfix deleted file mode 100644 index 12a07b79e5..0000000000 --- a/changelog.d/7103.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fixes space list and new chat bottom sheets showing too small in New App Layout (especially evident in landscape) diff --git a/changelog.d/7108.misc b/changelog.d/7108.misc deleted file mode 100644 index 165bd52e57..0000000000 --- a/changelog.d/7108.misc +++ /dev/null @@ -1 +0,0 @@ -Move some GitHub actions to buildjet runners, and remove the second attempt to run integration tests. diff --git a/changelog.d/7121.wip b/changelog.d/7121.wip deleted file mode 100644 index 2081b0d77a..0000000000 --- a/changelog.d/7121.wip +++ /dev/null @@ -1 +0,0 @@ -Create DM room only on first message - Fix glitch in the room list diff --git a/changelog.d/7122.bugfix b/changelog.d/7122.bugfix deleted file mode 100644 index f088eed4b0..0000000000 --- a/changelog.d/7122.bugfix +++ /dev/null @@ -1 +0,0 @@ -[App Layout] Room leaving prompt dialog now waits user to confirm leaving before do so diff --git a/changelog.d/7130.bugfix b/changelog.d/7130.bugfix deleted file mode 100644 index 1e4045ad76..0000000000 --- a/changelog.d/7130.bugfix +++ /dev/null @@ -1 +0,0 @@ - Fix empty verification bottom sheet. diff --git a/changelog.d/7132.bugfix b/changelog.d/7132.bugfix deleted file mode 100644 index 1ef925d1d3..0000000000 --- a/changelog.d/7132.bugfix +++ /dev/null @@ -1 +0,0 @@ -[New Layout] Fixes new chat dialog not getting dismissed after selecting its actions diff --git a/changelog.d/7140.misc b/changelog.d/7140.misc deleted file mode 100644 index 8f364e59bc..0000000000 --- a/changelog.d/7140.misc +++ /dev/null @@ -1 +0,0 @@ -Exclude legacy android support annotation library diff --git a/changelog.d/7142.misc b/changelog.d/7142.misc deleted file mode 100644 index d3424185e4..0000000000 --- a/changelog.d/7142.misc +++ /dev/null @@ -1 +0,0 @@ -Pulling no longer hosted im.dlg:android-dialer directly into the repository and removing legacy support library usages diff --git a/changelog.d/7153.wip b/changelog.d/7153.wip deleted file mode 100644 index fd12a4197b..0000000000 --- a/changelog.d/7153.wip +++ /dev/null @@ -1 +0,0 @@ -Create DM room only on first message - Handle the local rooms within the new AppLayout diff --git a/changelog.d/7157.misc b/changelog.d/7157.misc deleted file mode 100644 index dc52ed73cd..0000000000 --- a/changelog.d/7157.misc +++ /dev/null @@ -1 +0,0 @@ -Fixing build cache misses when compiling the vector module diff --git a/changelog.d/7166.misc b/changelog.d/7166.misc deleted file mode 100644 index d223208853..0000000000 --- a/changelog.d/7166.misc +++ /dev/null @@ -1 +0,0 @@ -New App Layout is now enabled by default! Go to the Settings > Labs to toggle this diff --git a/changelog.d/7180.feature b/changelog.d/7180.feature deleted file mode 100644 index bdfe090ceb..0000000000 --- a/changelog.d/7180.feature +++ /dev/null @@ -1 +0,0 @@ -Deferred DMs - Enable and move the feature to labs settings diff --git a/changelog.d/7186.bugfix b/changelog.d/7186.bugfix deleted file mode 100644 index 418dbbda9f..0000000000 --- a/changelog.d/7186.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fixes Room List not getting updated when fragment is not in focus diff --git a/fastlane/metadata/android/en-US/changelogs/40105000.txt b/fastlane/metadata/android/en-US/changelogs/40105000.txt new file mode 100644 index 0000000000..1bfa2b3dea --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40105000.txt @@ -0,0 +1,2 @@ +Main changes in this version: New App Layout and Deferred DM enabled by default. +Full changelog: https://github.com/vector-im/element-android/releases \ No newline at end of file From fabfe36eded8a37e7235b86cb96c423e4da9e9ef Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 22 Sep 2022 10:31:31 +0200 Subject: [PATCH 098/131] Update versions to 1.5.2 --- matrix-sdk-android/build.gradle | 2 +- vector-app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index 65f8baee7b..5c800f720e 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -60,7 +60,7 @@ android { // that the app's state is completely cleared between tests. testInstrumentationRunnerArguments clearPackageData: 'true' - buildConfigField "String", "SDK_VERSION", "\"1.5.0\"" + buildConfigField "String", "SDK_VERSION", "\"1.5.2\"" buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\"" buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\"" diff --git a/vector-app/build.gradle b/vector-app/build.gradle index dacd1416fd..f3618f030d 100644 --- a/vector-app/build.gradle +++ b/vector-app/build.gradle @@ -36,7 +36,7 @@ ext.versionMinor = 5 // Note: even values are reserved for regular release, odd values for hotfix release. // When creating a hotfix, you should decrease the value, since the current value // is the value for the next regular release. -ext.versionPatch = 0 +ext.versionPatch = 2 static def getGitTimestamp() { def cmd = 'git show -s --format=%ct' From 2aa9382fbad21eac0f227475990eb70fa840322d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Sep 2022 14:31:16 +0000 Subject: [PATCH 099/131] Bump android-connector from 2.0.1 to 2.1.0 Bumps [android-connector](https://github.com/UnifiedPush/android-connector) from 2.0.1 to 2.1.0. - [Release notes](https://github.com/UnifiedPush/android-connector/releases) - [Commits](https://github.com/UnifiedPush/android-connector/compare/2.0.1...2.1.0) --- updated-dependencies: - dependency-name: com.github.UnifiedPush:android-connector dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- vector/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/build.gradle b/vector/build.gradle index 740f2710c0..c0ff2009f5 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -230,7 +230,7 @@ dependencies { } // UnifiedPush - implementation 'com.github.UnifiedPush:android-connector:2.0.1' + implementation 'com.github.UnifiedPush:android-connector:2.1.0' implementation "androidx.emoji2:emoji2:1.2.0" From 1ff4a5f212739502b05071e10f8c77dbc8330826 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 15 Sep 2022 15:36:21 +0200 Subject: [PATCH 100/131] Ignore `AlwaysShowAction` lint issue. Also make it an error, so that developer has to explicitly disable the warning. --- library/ui-styles/src/debug/res/menu/menu_debug.xml | 5 +++-- tools/lint/lint.xml | 3 +++ .../app/features/home/room/detail/TimelineFragment.kt | 1 + vector/src/main/res/menu/menu_home.xml | 3 ++- vector/src/main/res/menu/menu_manage_space.xml | 8 +++++--- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/library/ui-styles/src/debug/res/menu/menu_debug.xml b/library/ui-styles/src/debug/res/menu/menu_debug.xml index c58a29db8f..ac98ce8e2c 100644 --- a/library/ui-styles/src/debug/res/menu/menu_debug.xml +++ b/library/ui-styles/src/debug/res/menu/menu_debug.xml @@ -14,6 +14,7 @@ android:id="@+id/menuDebug2" android:icon="@drawable/ic_debug_icon" android:title="Send" - app:showAsAction="always" /> + app:showAsAction="always" + tools:ignore="AlwaysShowAction" /> - \ No newline at end of file + diff --git a/tools/lint/lint.xml b/tools/lint/lint.xml index 1776bd341f..84f55bb715 100644 --- a/tools/lint/lint.xml +++ b/tools/lint/lint.xml @@ -19,6 +19,9 @@ + + + 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 5eb90dde4b..726d1230db 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 @@ -1124,6 +1124,7 @@ class TimelineFragment : .findViewById(R.id.action_view_icon_image) .setColorFilter(colorProvider.getColorFromAttribute(R.attr.colorPrimary)) actionView.findViewById(R.id.cart_badge).setTextOrHide("$widgetsCount") + @Suppress("AlwaysShowAction") matrixAppsMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) } diff --git a/vector/src/main/res/menu/menu_home.xml b/vector/src/main/res/menu/menu_home.xml index f15c31b4e9..a78907bd93 100644 --- a/vector/src/main/res/menu/menu_home.xml +++ b/vector/src/main/res/menu/menu_home.xml @@ -34,6 +34,7 @@ android:icon="@drawable/ic_filter" android:title="@string/home_filter_placeholder_home" app:iconTint="?vctr_content_secondary" - app:showAsAction="always" /> + app:showAsAction="always" + tools:ignore="AlwaysShowAction" /> diff --git a/vector/src/main/res/menu/menu_manage_space.xml b/vector/src/main/res/menu/menu_manage_space.xml index 86defa7869..171614ef3f 100644 --- a/vector/src/main/res/menu/menu_manage_space.xml +++ b/vector/src/main/res/menu/menu_manage_space.xml @@ -1,12 +1,14 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + app:showAsAction="always" + tools:ignore="AlwaysShowAction" /> - \ No newline at end of file + From bb2eb56ee69928cd90df43121f89b3c9713bda11 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 15 Sep 2022 15:51:27 +0200 Subject: [PATCH 101/131] Add `@ChecksSdkIntAtLeast` annotation. --- .../matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt | 3 +++ .../main/java/im/vector/app/features/home/ShortcutCreator.kt | 2 ++ .../im/vector/app/features/notifications/NotificationUtils.kt | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt index 900a2e237f..acbf9ca061 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt @@ -16,6 +16,8 @@ package org.matrix.android.sdk.api.util +import androidx.annotation.ChecksSdkIntAtLeast + interface BuildVersionSdkIntProvider { /** * Return the current version of the Android SDK. @@ -26,6 +28,7 @@ interface BuildVersionSdkIntProvider { * Checks the if the current OS version is equal or greater than [version]. * @return A `non-null` result if true, `null` otherwise. */ + @ChecksSdkIntAtLeast(parameter = 0, lambda = 1) fun whenAtLeast(version: Int, result: () -> T): T? { return if (get() >= version) { result() diff --git a/vector/src/main/java/im/vector/app/features/home/ShortcutCreator.kt b/vector/src/main/java/im/vector/app/features/home/ShortcutCreator.kt index 861fdc64b2..e0565debf2 100644 --- a/vector/src/main/java/im/vector/app/features/home/ShortcutCreator.kt +++ b/vector/src/main/java/im/vector/app/features/home/ShortcutCreator.kt @@ -20,6 +20,7 @@ import android.content.Context import android.content.pm.ShortcutInfo import android.graphics.Bitmap import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast import androidx.annotation.WorkerThread import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat @@ -32,6 +33,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.util.toMatrixItem import javax.inject.Inject +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O) private val useAdaptiveIcon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O private const val adaptiveIconSizeDp = 108 private const val adaptiveIconOuterSidesDp = 18 diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt index 8f05819fc4..6d1c77d9e9 100755 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt @@ -34,6 +34,7 @@ import android.text.Spannable import android.text.SpannableString import android.text.style.ForegroundColorSpan import androidx.annotation.AttrRes +import androidx.annotation.ChecksSdkIntAtLeast import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.core.app.NotificationCompat @@ -102,6 +103,7 @@ class NotificationUtils @Inject constructor( const val SILENT_NOTIFICATION_CHANNEL_ID = "DEFAULT_SILENT_NOTIFICATION_CHANNEL_ID_V2" private const val CALL_NOTIFICATION_CHANNEL_ID = "CALL_NOTIFICATION_CHANNEL_ID_V2" + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O) fun supportNotificationChannels() = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) fun openSystemSettingsForSilentCategory(fragment: Fragment) { @@ -126,7 +128,6 @@ class NotificationUtils @Inject constructor( /** * Create notification channels. */ - @TargetApi(Build.VERSION_CODES.O) fun createNotificationChannels() { if (!supportNotificationChannels()) { return From 832a472b574faf1ca683034a78e453dcca2130fb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 15:22:21 +0200 Subject: [PATCH 102/131] Add `@ChecksSdkIntAtLeast` annotation, to be able to remove `AndroidVersionTestOverrider` --- .../vector/app/AndroidVersionTestOverrider.kt | 46 ------------------- .../voice/VoiceRecorderProviderTests.kt | 17 +++---- .../features/voice/VoiceRecorderProvider.kt | 8 +++- 3 files changed, 13 insertions(+), 58 deletions(-) delete mode 100644 vector/src/androidTest/java/im/vector/app/AndroidVersionTestOverrider.kt diff --git a/vector/src/androidTest/java/im/vector/app/AndroidVersionTestOverrider.kt b/vector/src/androidTest/java/im/vector/app/AndroidVersionTestOverrider.kt deleted file mode 100644 index 97333b7c98..0000000000 --- a/vector/src/androidTest/java/im/vector/app/AndroidVersionTestOverrider.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 - -import android.os.Build -import java.lang.reflect.Field - -/** - * Used to override [Build.VERSION.SDK_INT]. Ideally an interface should be used instead, but that approach forces us to either add suppress lint annotations - * and potentially miss an API version issue or write a custom lint rule, which seems like an overkill. - */ -object AndroidVersionTestOverrider { - - private var initialValue: Int? = null - - fun override(newVersion: Int) { - if (initialValue == null) { - initialValue = Build.VERSION.SDK_INT - } - val field = Build.VERSION::class.java.getField("SDK_INT") - setStaticField(field, newVersion) - } - - fun restore() { - initialValue?.let { override(it) } - } - - private fun setStaticField(field: Field, value: Any) { - field.isAccessible = true - field.set(null, value) - } -} diff --git a/vector/src/androidTest/java/im/vector/app/features/voice/VoiceRecorderProviderTests.kt b/vector/src/androidTest/java/im/vector/app/features/voice/VoiceRecorderProviderTests.kt index 65f81b145b..0610496dfe 100644 --- a/vector/src/androidTest/java/im/vector/app/features/voice/VoiceRecorderProviderTests.kt +++ b/vector/src/androidTest/java/im/vector/app/features/voice/VoiceRecorderProviderTests.kt @@ -18,41 +18,36 @@ package im.vector.app.features.voice import android.os.Build import androidx.test.platform.app.InstrumentationRegistry -import im.vector.app.AndroidVersionTestOverrider +import im.vector.app.TestBuildVersionSdkIntProvider import im.vector.app.features.DefaultVectorFeatures import io.mockk.every import io.mockk.spyk import org.amshove.kluent.shouldBeInstanceOf -import org.junit.After import org.junit.Test class VoiceRecorderProviderTests { private val context = InstrumentationRegistry.getInstrumentation().targetContext - private val provider = spyk(VoiceRecorderProvider(context, DefaultVectorFeatures())) - - @After - fun tearDown() { - AndroidVersionTestOverrider.restore() - } + private val buildVersionSdkIntProvider = TestBuildVersionSdkIntProvider() + private val provider = spyk(VoiceRecorderProvider(context, DefaultVectorFeatures(), buildVersionSdkIntProvider)) @Test fun provideVoiceRecorderOnAndroidQAndCodecReturnsQRecorder() { - AndroidVersionTestOverrider.override(Build.VERSION_CODES.Q) + buildVersionSdkIntProvider.value = Build.VERSION_CODES.Q every { provider.hasOpusEncoder() } returns true provider.provideVoiceRecorder().shouldBeInstanceOf(VoiceRecorderQ::class) } @Test fun provideVoiceRecorderOnAndroidQButNoCodecReturnsLRecorder() { - AndroidVersionTestOverrider.override(Build.VERSION_CODES.Q) + buildVersionSdkIntProvider.value = Build.VERSION_CODES.Q every { provider.hasOpusEncoder() } returns false provider.provideVoiceRecorder().shouldBeInstanceOf(VoiceRecorderL::class) } @Test fun provideVoiceRecorderOnOlderAndroidVersionReturnsLRecorder() { - AndroidVersionTestOverrider.override(Build.VERSION_CODES.LOLLIPOP) + buildVersionSdkIntProvider.value = Build.VERSION_CODES.LOLLIPOP provider.provideVoiceRecorder().shouldBeInstanceOf(VoiceRecorderL::class) } } diff --git a/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt b/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt index 1bf289fb4c..c024e0c6d4 100644 --- a/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt +++ b/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt @@ -20,14 +20,17 @@ import android.content.Context import android.media.MediaCodecList import android.media.MediaFormat import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast import androidx.annotation.VisibleForTesting import im.vector.app.features.VectorFeatures import kotlinx.coroutines.Dispatchers +import org.matrix.android.sdk.api.util.BuildVersionSdkIntProvider import javax.inject.Inject class VoiceRecorderProvider @Inject constructor( private val context: Context, private val vectorFeatures: VectorFeatures, + private val buildVersionSdkIntProvider: BuildVersionSdkIntProvider, ) { fun provideVoiceRecorder(): VoiceRecorder { return if (useFallbackRecorder()) { @@ -37,8 +40,11 @@ class VoiceRecorderProvider @Inject constructor( } } + @ChecksSdkIntAtLeast(api = 29) private fun useFallbackRecorder(): Boolean { - return Build.VERSION.SDK_INT < Build.VERSION_CODES.Q || !hasOpusEncoder() || vectorFeatures.forceUsageOfOpusEncoder() + return buildVersionSdkIntProvider.get() < Build.VERSION_CODES.Q || + !hasOpusEncoder() || + vectorFeatures.forceUsageOfOpusEncoder() } @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) From 7e8a39e6de80ff749e55b5b78cf2c6dc59b80b8e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 15 Sep 2022 16:02:28 +0200 Subject: [PATCH 103/131] Suppress `LaunchActivityFromNotification`. This is fine here, this is the notification for the diagnostic, we do not want to start an Activity. --- tools/lint/lint.xml | 3 +++ .../im/vector/app/features/notifications/NotificationUtils.kt | 1 + 2 files changed, 4 insertions(+) diff --git a/tools/lint/lint.xml b/tools/lint/lint.xml index 84f55bb715..8b4b6ef617 100644 --- a/tools/lint/lint.xml +++ b/tools/lint/lint.xml @@ -108,6 +108,9 @@ + + + diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt index 6d1c77d9e9..d00c1dcc42 100755 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt @@ -967,6 +967,7 @@ class NotificationUtils @Inject constructor( } } + @SuppressLint("LaunchActivityFromNotification") fun displayDiagnosticNotification() { val testActionIntent = Intent(context, TestNotificationReceiver::class.java) testActionIntent.action = actionIds.diagnostic From d8436874e2c2d3338c128c9234701639965ae23d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 11:41:41 +0200 Subject: [PATCH 104/131] Fix `StaticFieldLeak` issue (context). Make VectorLocal an injectable class. --- tools/lint/lint.xml | 1 + .../java/im/vector/app/VectorApplication.kt | 3 +- .../app/core/platform/VectorBaseActivity.kt | 4 ++- .../features/call/conference/JitsiService.kt | 3 +- .../call/dialpad/CallDialPadBottomSheet.kt | 7 ++++- .../features/call/dialpad/PstnDialActivity.kt | 2 +- .../call/transfer/CallTransferActivity.kt | 2 +- .../call/transfer/CallTransferPagerAdapter.kt | 5 ++-- .../configuration/VectorConfiguration.kt | 15 +++++----- .../setup/KeysBackupSetupStep2Fragment.kt | 7 +++-- .../BootstrapEnterPassphraseFragment.kt | 7 +++-- .../app/features/home/HomeDetailFragment.kt | 3 +- .../app/features/rageshake/BugReporter.kt | 3 +- .../app/features/settings/VectorLocale.kt | 29 ++++++++++--------- .../VectorSettingsPreferencesFragment.kt | 3 +- .../settings/locale/LocalePickerController.kt | 16 +++++----- .../settings/locale/LocalePickerViewModel.kt | 12 ++++++-- .../settings/locale/LocalePickerViewState.kt | 3 +- 18 files changed, 78 insertions(+), 47 deletions(-) diff --git a/tools/lint/lint.xml b/tools/lint/lint.xml index 8b4b6ef617..3d3b073749 100644 --- a/tools/lint/lint.xml +++ b/tools/lint/lint.xml @@ -80,6 +80,7 @@ + diff --git a/vector-app/src/main/java/im/vector/app/VectorApplication.kt b/vector-app/src/main/java/im/vector/app/VectorApplication.kt index ee04d908e8..5e789d9504 100644 --- a/vector-app/src/main/java/im/vector/app/VectorApplication.kt +++ b/vector-app/src/main/java/im/vector/app/VectorApplication.kt @@ -109,6 +109,7 @@ class VectorApplication : @Inject lateinit var fcmHelper: FcmHelper @Inject lateinit var buildMeta: BuildMeta @Inject lateinit var leakDetector: LeakDetector + @Inject lateinit var vectorLocale: VectorLocale // font thread handler private var fontThreadHandler: Handler? = null @@ -159,7 +160,7 @@ class VectorApplication : R.array.com_google_android_gms_fonts_certs ) FontsContractCompat.requestFont(this, fontRequest, emojiCompatFontProvider, getFontThreadHandler()) - VectorLocale.init(this, buildMeta) + vectorLocale.init() ThemeUtils.init(this) vectorConfiguration.applyToApplicationContext() 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 b4ba384f8f..fbcfd69610 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 @@ -84,6 +84,7 @@ import im.vector.app.features.rageshake.RageShake import im.vector.app.features.session.SessionListener import im.vector.app.features.settings.FontScalePreferences import im.vector.app.features.settings.FontScalePreferencesImpl +import im.vector.app.features.settings.VectorLocale import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.themes.ActivityOtherThemes import im.vector.app.features.themes.ThemeUtils @@ -155,6 +156,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver @Inject lateinit var rageShake: RageShake @Inject lateinit var buildMeta: BuildMeta @Inject lateinit var fontScalePreferences: FontScalePreferences + @Inject lateinit var vectorLocale: VectorLocale // For debug only @Inject lateinit var debugReceiver: DebugReceiver @@ -177,7 +179,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver override fun attachBaseContext(base: Context) { val fontScalePreferences = FontScalePreferencesImpl(PreferenceManager.getDefaultSharedPreferences(base), AndroidSystemSettingsProvider(base)) - val vectorConfiguration = VectorConfiguration(this, fontScalePreferences) + val vectorConfiguration = VectorConfiguration(this, fontScalePreferences, vectorLocale) super.attachBaseContext(vectorConfiguration.getLocalisedContext(base)) } diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt index b0da4f0e18..bdb6cfb0d0 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt @@ -49,6 +49,7 @@ class JitsiService @Inject constructor( private val themeProvider: ThemeProvider, private val jitsiJWTFactory: JitsiJWTFactory, private val clock: Clock, + private val vectorLocale: VectorLocale, ) { companion object { @@ -163,7 +164,7 @@ class JitsiService @Inject constructor( if (widgetSessionId.length > 8) { widgetSessionId = widgetSessionId.substring(0, 7) } - roomId.substring(1, roomId.indexOf(":") - 1) + widgetSessionId.lowercase(VectorLocale.applicationLocale) + roomId.substring(1, roomId.indexOf(":") - 1) + widgetSessionId.lowercase(vectorLocale.applicationLocale) } } diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt index 8bf2ce47bd..be38f7d509 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt @@ -20,12 +20,15 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.extensions.addChildFragment import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment import im.vector.app.databinding.BottomSheetCallDialPadBinding import im.vector.app.features.settings.VectorLocale +import javax.inject.Inject +@AndroidEntryPoint class CallDialPadBottomSheet : VectorBaseBottomSheetDialogFragment() { companion object { @@ -41,6 +44,8 @@ class CallDialPadBottomSheet : VectorBaseBottomSheetDialogFragment() { } } - sectionsPagerAdapter = CallTransferPagerAdapter(this) + sectionsPagerAdapter = CallTransferPagerAdapter(this, vectorLocale) views.callTransferViewPager.adapter = sectionsPagerAdapter TabLayoutMediator(views.callTransferTabLayout, views.callTransferViewPager) { tab, position -> diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferPagerAdapter.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferPagerAdapter.kt index 3ec8f61978..f5ab172585 100644 --- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferPagerAdapter.kt +++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferPagerAdapter.kt @@ -27,7 +27,8 @@ import im.vector.app.features.userdirectory.UserListFragment import im.vector.app.features.userdirectory.UserListFragmentArgs class CallTransferPagerAdapter( - private val fragmentActivity: FragmentActivity + private val fragmentActivity: FragmentActivity, + private val vectorLocale: VectorLocale, ) : FragmentStateAdapter(fragmentActivity) { companion object { @@ -61,7 +62,7 @@ class CallTransferPagerAdapter( arguments = Bundle().apply { putBoolean(DialPadFragment.EXTRA_ENABLE_DELETE, true) putBoolean(DialPadFragment.EXTRA_ENABLE_OK, false) - putString(DialPadFragment.EXTRA_REGION_CODE, VectorLocale.applicationLocale.country) + putString(DialPadFragment.EXTRA_REGION_CODE, vectorLocale.applicationLocale.country) } } } diff --git a/vector/src/main/java/im/vector/app/features/configuration/VectorConfiguration.kt b/vector/src/main/java/im/vector/app/features/configuration/VectorConfiguration.kt index a3d801e534..f67706dbd7 100644 --- a/vector/src/main/java/im/vector/app/features/configuration/VectorConfiguration.kt +++ b/vector/src/main/java/im/vector/app/features/configuration/VectorConfiguration.kt @@ -33,21 +33,22 @@ import javax.inject.Inject */ class VectorConfiguration @Inject constructor( private val context: Context, - private val fontScalePreferences: FontScalePreferences + private val fontScalePreferences: FontScalePreferences, + private val vectorLocale: VectorLocale, ) { fun onConfigurationChanged() { - if (Locale.getDefault().toString() != VectorLocale.applicationLocale.toString()) { + if (Locale.getDefault().toString() != vectorLocale.applicationLocale.toString()) { Timber.v("## onConfigurationChanged(): the locale has been updated to ${Locale.getDefault()}") - Timber.v("## onConfigurationChanged(): restore the expected value ${VectorLocale.applicationLocale}") - Locale.setDefault(VectorLocale.applicationLocale) + Timber.v("## onConfigurationChanged(): restore the expected value ${vectorLocale.applicationLocale}") + Locale.setDefault(vectorLocale.applicationLocale) } // Night mode may have changed ThemeUtils.init(context) } fun applyToApplicationContext() { - val locale = VectorLocale.applicationLocale + val locale = vectorLocale.applicationLocale val fontScale = fontScalePreferences.getResolvedFontScaleValue() Locale.setDefault(locale) @@ -67,7 +68,7 @@ class VectorConfiguration @Inject constructor( */ fun getLocalisedContext(context: Context): Context { try { - val locale = VectorLocale.applicationLocale + val locale = vectorLocale.applicationLocale // create new configuration passing old configuration from original Context val configuration = Configuration(context.resources.configuration) @@ -107,7 +108,7 @@ class VectorConfiguration @Inject constructor( * @return the local status value */ fun getHash(): String { - return (VectorLocale.applicationLocale.toString() + + return (vectorLocale.applicationLocale.toString() + "_" + fontScalePreferences.getResolvedFontScaleValue().preferenceValue + "_" + ThemeUtils.getApplicationTheme(context)) } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt index cf92afcc2e..4ee6126fb7 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupStep2Fragment.kt @@ -32,6 +32,7 @@ import im.vector.app.databinding.FragmentKeysBackupSetupStep2Binding import im.vector.app.features.settings.VectorLocale import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import javax.inject.Inject @AndroidEntryPoint class KeysBackupSetupStep2Fragment : @@ -43,6 +44,8 @@ class KeysBackupSetupStep2Fragment : private val zxcvbn = Zxcvbn() + @Inject lateinit var vectorLocale: VectorLocale + private fun onPassphraseChanged() { viewModel.passphrase.value = views.keysBackupSetupStep2PassphraseEnterEdittext.text.toString() viewModel.confirmPassphraseError.value = null @@ -78,12 +81,12 @@ class KeysBackupSetupStep2Fragment : views.keysBackupSetupStep2PassphraseStrengthLevel.strength = score if (score in 1..3) { - val warning = strength.feedback?.getWarning(VectorLocale.applicationLocale) + val warning = strength.feedback?.getWarning(vectorLocale.applicationLocale) if (warning != null) { views.keysBackupSetupStep2PassphraseEnterTil.error = warning } - val suggestions = strength.feedback?.getSuggestions(VectorLocale.applicationLocale) + val suggestions = strength.feedback?.getSuggestions(vectorLocale.applicationLocale) if (suggestions != null) { views.keysBackupSetupStep2PassphraseEnterTil.error = suggestions.firstOrNull() } diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt index 43cc25f195..de04e59245 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt @@ -34,6 +34,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import reactivecircus.flowbinding.android.widget.editorActionEvents import reactivecircus.flowbinding.android.widget.textChanges +import javax.inject.Inject @AndroidEntryPoint class BootstrapEnterPassphraseFragment : @@ -43,6 +44,8 @@ class BootstrapEnterPassphraseFragment : return FragmentBootstrapEnterPassphraseBinding.inflate(inflater, container, false) } + @Inject lateinit var vectorLocale: VectorLocale + val sharedViewModel: BootstrapSharedViewModel by parentFragmentViewModel() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -105,8 +108,8 @@ class BootstrapEnterPassphraseFragment : views.ssssPassphraseSecurityProgress.strength = score if (score in 1..3) { val hint = - strength.feedback?.getWarning(VectorLocale.applicationLocale)?.takeIf { it.isNotBlank() } - ?: strength.feedback?.getSuggestions(VectorLocale.applicationLocale)?.firstOrNull() + strength.feedback?.getWarning(vectorLocale.applicationLocale)?.takeIf { it.isNotBlank() } + ?: strength.feedback?.getSuggestions(vectorLocale.applicationLocale)?.firstOrNull() if (hint != null && hint != views.ssssPassphraseEnterTil.error.toString()) { views.ssssPassphraseEnterTil.error = hint } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt index 8eab759fcd..e4fa267af6 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt @@ -75,6 +75,7 @@ class HomeDetailFragment : @Inject lateinit var callManager: WebRtcCallManager @Inject lateinit var vectorPreferences: VectorPreferences @Inject lateinit var spaceStateHandler: SpaceStateHandler + @Inject lateinit var vectorLocale: VectorLocale private val viewModel: HomeDetailViewModel by fragmentViewModel() private val unknownDeviceDetectorSharedViewModel: UnknownDeviceDetectorSharedViewModel by activityViewModel() @@ -378,7 +379,7 @@ class HomeDetailFragment : arguments = Bundle().apply { putBoolean(DialPadFragment.EXTRA_ENABLE_DELETE, true) putBoolean(DialPadFragment.EXTRA_ENABLE_OK, true) - putString(DialPadFragment.EXTRA_REGION_CODE, VectorLocale.applicationLocale.country) + putString(DialPadFragment.EXTRA_REGION_CODE, vectorLocale.applicationLocale.country) } applyCallback() } diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt index eefbf63a12..d22f3f9b58 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt @@ -80,6 +80,7 @@ class BugReporter @Inject constructor( private val buildMeta: BuildMeta, private val processInfo: ProcessInfo, private val sdkIntProvider: BuildVersionSdkIntProvider, + private val vectorLocale: VectorLocale, ) { var inMultiWindowMode = false @@ -294,7 +295,7 @@ class BugReporter @Inject constructor( Build.VERSION.INCREMENTAL + "-" + Build.VERSION.CODENAME ) .addFormDataPart("locale", Locale.getDefault().toString()) - .addFormDataPart("app_language", VectorLocale.applicationLocale.toString()) + .addFormDataPart("app_language", vectorLocale.applicationLocale.toString()) .addFormDataPart("default_app_language", systemLocaleProvider.getSystemLocale().toString()) .addFormDataPart("theme", ThemeUtils.getApplicationTheme(context)) .addFormDataPart("server_version", serverVersion) diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt b/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt index 4666d586d3..438434ed3c 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt @@ -27,19 +27,27 @@ import kotlinx.coroutines.withContext import timber.log.Timber import java.util.IllformedLocaleException import java.util.Locale +import javax.inject.Inject +import javax.inject.Singleton /** * Object to manage the Locale choice of the user. */ -object VectorLocale { - private const val APPLICATION_LOCALE_COUNTRY_KEY = "APPLICATION_LOCALE_COUNTRY_KEY" - private const val APPLICATION_LOCALE_VARIANT_KEY = "APPLICATION_LOCALE_VARIANT_KEY" - private const val APPLICATION_LOCALE_LANGUAGE_KEY = "APPLICATION_LOCALE_LANGUAGE_KEY" - private const val APPLICATION_LOCALE_SCRIPT_KEY = "APPLICATION_LOCALE_SCRIPT_KEY" +@Singleton +class VectorLocale @Inject constructor( + private val context: Context, + private val buildMeta: BuildMeta, +) { + companion object { + private const val APPLICATION_LOCALE_COUNTRY_KEY = "APPLICATION_LOCALE_COUNTRY_KEY" + private const val APPLICATION_LOCALE_VARIANT_KEY = "APPLICATION_LOCALE_VARIANT_KEY" + private const val APPLICATION_LOCALE_LANGUAGE_KEY = "APPLICATION_LOCALE_LANGUAGE_KEY" + private const val APPLICATION_LOCALE_SCRIPT_KEY = "APPLICATION_LOCALE_SCRIPT_KEY" + private const val ISO_15924_LATN = "Latn" + } private val defaultLocale = Locale("en", "US") - private const val ISO_15924_LATN = "Latn" /** * The cache of supported application languages. @@ -52,15 +60,10 @@ object VectorLocale { var applicationLocale = defaultLocale private set - private lateinit var context: Context - private lateinit var buildMeta: BuildMeta - /** - * Init this object. + * Init this singleton. */ - fun init(context: Context, buildMeta: BuildMeta) { - this.context = context - this.buildMeta = buildMeta + fun init() { val preferences = DefaultSharedPreferences.getInstance(context) if (preferences.contains(APPLICATION_LOCALE_LANGUAGE_KEY)) { diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt index 3c8ec56713..073d5f7468 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsPreferencesFragment.kt @@ -46,6 +46,7 @@ class VectorSettingsPreferencesFragment : @Inject lateinit var vectorPreferences: VectorPreferences @Inject lateinit var fontScalePreferences: FontScalePreferences @Inject lateinit var vectorFeatures: VectorFeatures + @Inject lateinit var vectorLocale: VectorLocale override var titleRes = R.string.settings_preferences override val preferenceXmlRes = R.xml.vector_settings_preferences @@ -198,7 +199,7 @@ class VectorSettingsPreferencesFragment : private fun setUserInterfacePreferences() { // Selected language - selectedLanguagePreference.summary = VectorLocale.localeToLocalisedString(VectorLocale.applicationLocale) + selectedLanguagePreference.summary = vectorLocale.localeToLocalisedString(vectorLocale.applicationLocale) // Text size textSizePreference.summary = getString(fontScalePreferences.getResolvedFontScaleValue().nameResId) 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 9853b28aae..0cbfef7495 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 @@ -37,13 +37,15 @@ import javax.inject.Inject class LocalePickerController @Inject constructor( private val vectorPreferences: VectorPreferences, private val stringProvider: StringProvider, - private val errorFormatter: ErrorFormatter + private val errorFormatter: ErrorFormatter, + private val vectorLocale: VectorLocale, ) : TypedEpoxyController() { var listener: Listener? = null override fun buildModels(data: LocalePickerViewState?) { val list = data?.locales ?: return + val currentLocale = data.currentLocale ?: return val host = this profileSectionItem { @@ -51,10 +53,10 @@ class LocalePickerController @Inject constructor( title(host.stringProvider.getString(R.string.choose_locale_current_locale_title)) } localeItem { - id(data.currentLocale.toString()) - title(VectorLocale.localeToLocalisedString(data.currentLocale).safeCapitalize(data.currentLocale)) + id(currentLocale.toString()) + title(host.vectorLocale.localeToLocalisedString(currentLocale).safeCapitalize(currentLocale)) if (host.vectorPreferences.developerMode()) { - subtitle(VectorLocale.localeToLocalisedStringInfo(data.currentLocale)) + subtitle(host.vectorLocale.localeToLocalisedStringInfo(currentLocale)) } clickListener { host.listener?.onUseCurrentClicked() } } @@ -78,13 +80,13 @@ class LocalePickerController @Inject constructor( } } else { list() - .filter { it.toString() != data.currentLocale.toString() } + .filter { it.toString() != currentLocale.toString() } .forEach { locale -> localeItem { id(locale.toString()) - title(VectorLocale.localeToLocalisedString(locale).safeCapitalize(locale)) + title(host.vectorLocale.localeToLocalisedString(locale).safeCapitalize(locale)) if (host.vectorPreferences.developerMode()) { - subtitle(VectorLocale.localeToLocalisedStringInfo(locale)) + subtitle(host.vectorLocale.localeToLocalisedStringInfo(locale)) } clickListener { host.listener?.onLocaleClicked(locale) } } 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 0bbbc323e0..c38f9b5b87 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 @@ -30,7 +30,8 @@ import kotlinx.coroutines.launch class LocalePickerViewModel @AssistedInject constructor( @Assisted initialState: LocalePickerViewState, - private val vectorConfiguration: VectorConfiguration + private val vectorConfiguration: VectorConfiguration, + private val vectorLocale: VectorLocale, ) : VectorViewModel(initialState) { @AssistedFactory @@ -39,8 +40,13 @@ class LocalePickerViewModel @AssistedInject constructor( } init { + setState { + copy( + currentLocale = vectorLocale.applicationLocale + ) + } viewModelScope.launch { - val result = VectorLocale.getSupportedLocales() + val result = vectorLocale.getSupportedLocales() setState { copy( @@ -59,7 +65,7 @@ class LocalePickerViewModel @AssistedInject constructor( } private fun handleSelectLocale(action: LocalePickerAction.SelectLocale) { - VectorLocale.saveApplicationLocale(action.locale) + vectorLocale.saveApplicationLocale(action.locale) vectorConfiguration.applyToApplicationContext() _viewEvents.post(LocalePickerViewEvents.RestartActivity) } diff --git a/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerViewState.kt b/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerViewState.kt index 8cb5978393..f981e7a444 100644 --- a/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/locale/LocalePickerViewState.kt @@ -19,10 +19,9 @@ package im.vector.app.features.settings.locale import com.airbnb.mvrx.Async import com.airbnb.mvrx.MavericksState import com.airbnb.mvrx.Uninitialized -import im.vector.app.features.settings.VectorLocale import java.util.Locale data class LocalePickerViewState( - val currentLocale: Locale = VectorLocale.applicationLocale, + val currentLocale: Locale? = null, val locales: Async> = Uninitialized ) : MavericksState From 0324927b04d384797f2e03df5acb1edbba922f8d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 15:20:23 +0200 Subject: [PATCH 105/131] Create VectorLocaleProvider, to just read the current Locale from the SharedPreference --- .../app/core/platform/VectorBaseActivity.kt | 10 +++-- .../features/call/conference/JitsiService.kt | 4 +- .../call/dialpad/CallDialPadBottomSheet.kt | 4 +- .../features/call/dialpad/PstnDialActivity.kt | 1 - .../call/transfer/CallTransferPagerAdapter.kt | 4 +- .../configuration/VectorConfiguration.kt | 4 +- .../setup/KeysBackupSetupStep2Fragment.kt | 4 +- .../BootstrapEnterPassphraseFragment.kt | 4 +- .../app/features/home/HomeDetailFragment.kt | 4 +- .../notifications/NotificationUtils.kt | 1 - .../app/features/rageshake/BugReporter.kt | 4 +- .../app/features/settings/VectorLocale.kt | 7 ++-- .../features/settings/VectorLocaleProvider.kt | 41 +++++++++++++++++++ 13 files changed, 66 insertions(+), 26 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/settings/VectorLocaleProvider.kt 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 fbcfd69610..0b8d6698d2 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 @@ -84,7 +84,7 @@ import im.vector.app.features.rageshake.RageShake import im.vector.app.features.session.SessionListener import im.vector.app.features.settings.FontScalePreferences import im.vector.app.features.settings.FontScalePreferencesImpl -import im.vector.app.features.settings.VectorLocale +import im.vector.app.features.settings.VectorLocaleProvider import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.themes.ActivityOtherThemes import im.vector.app.features.themes.ThemeUtils @@ -156,7 +156,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver @Inject lateinit var rageShake: RageShake @Inject lateinit var buildMeta: BuildMeta @Inject lateinit var fontScalePreferences: FontScalePreferences - @Inject lateinit var vectorLocale: VectorLocale + @Inject lateinit var vectorLocale: VectorLocaleProvider // For debug only @Inject lateinit var debugReceiver: DebugReceiver @@ -178,8 +178,10 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver private val restorables = ArrayList() override fun attachBaseContext(base: Context) { - val fontScalePreferences = FontScalePreferencesImpl(PreferenceManager.getDefaultSharedPreferences(base), AndroidSystemSettingsProvider(base)) - val vectorConfiguration = VectorConfiguration(this, fontScalePreferences, vectorLocale) + val preferences = PreferenceManager.getDefaultSharedPreferences(base) + val fontScalePreferences = FontScalePreferencesImpl(preferences, AndroidSystemSettingsProvider(base)) + val vectorLocaleProvider = VectorLocaleProvider(preferences) + val vectorConfiguration = VectorConfiguration(this, fontScalePreferences, vectorLocaleProvider) super.attachBaseContext(vectorConfiguration.getLocalisedContext(base)) } diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt index bdb6cfb0d0..d14f358801 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt @@ -25,7 +25,7 @@ import im.vector.app.core.utils.toBase32String import im.vector.app.features.call.conference.jwt.JitsiJWTFactory import im.vector.app.features.displayname.getBestName import im.vector.app.features.raw.wellknown.getElementWellknown -import im.vector.app.features.settings.VectorLocale +import im.vector.app.features.settings.VectorLocaleProvider import im.vector.app.features.themes.ThemeProvider import okhttp3.Request import org.jitsi.meet.sdk.JitsiMeetUserInfo @@ -49,7 +49,7 @@ class JitsiService @Inject constructor( private val themeProvider: ThemeProvider, private val jitsiJWTFactory: JitsiJWTFactory, private val clock: Clock, - private val vectorLocale: VectorLocale, + private val vectorLocale: VectorLocaleProvider, ) { companion object { diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt index be38f7d509..c157ee42b8 100644 --- a/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/call/dialpad/CallDialPadBottomSheet.kt @@ -25,7 +25,7 @@ import im.vector.app.R import im.vector.app.core.extensions.addChildFragment import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment import im.vector.app.databinding.BottomSheetCallDialPadBinding -import im.vector.app.features.settings.VectorLocale +import im.vector.app.features.settings.VectorLocaleProvider import javax.inject.Inject @AndroidEntryPoint @@ -44,7 +44,7 @@ class CallDialPadBottomSheet : VectorBaseBottomSheetDialogFragment Date: Fri, 16 Sep 2022 16:06:49 +0200 Subject: [PATCH 106/131] Remove `DefaultSharedPreferences` since we now have @DefaultPreferences which provide a singleton. Some fun has been moved to injectable classes due to this change. Not compiling, still work to do, but I prefer to split into 2 separate commits. --- .../java/im/vector/app/VectorApplication.kt | 5 +- .../app/core/di/DefaultSharedPreferences.kt | 31 ---- .../app/core/pushers/UnifiedPushStore.kt | 9 +- .../app/core/ui/views/KeysBackupBanner.kt | 1 - .../im/vector/app/core/utils/RingtoneUtils.kt | 166 +++++++++--------- .../features/disclaimer/DisclaimerDialog.kt | 50 +++--- .../vector/app/features/home/HomeActivity.kt | 5 +- .../homeserver/ServerUrlsRepository.kt | 48 ++--- .../VectorUncaughtExceptionHandler.kt | 11 +- .../app/features/settings/VectorLocale.kt | 9 +- .../features/settings/VectorPreferences.kt | 16 +- .../VectorSettingsVoiceVideoFragment.kt | 23 +-- .../vector/app/features/themes/ThemeUtils.kt | 4 +- 13 files changed, 183 insertions(+), 195 deletions(-) delete mode 100644 vector/src/main/java/im/vector/app/core/di/DefaultSharedPreferences.kt diff --git a/vector-app/src/main/java/im/vector/app/VectorApplication.kt b/vector-app/src/main/java/im/vector/app/VectorApplication.kt index 5e789d9504..ec0a6cb2a4 100644 --- a/vector-app/src/main/java/im/vector/app/VectorApplication.kt +++ b/vector-app/src/main/java/im/vector/app/VectorApplication.kt @@ -53,7 +53,7 @@ import im.vector.app.core.resources.BuildMeta import im.vector.app.features.analytics.VectorAnalytics import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.configuration.VectorConfiguration -import im.vector.app.features.disclaimer.doNotShowDisclaimerDialog +import im.vector.app.features.disclaimer.DisclaimerDialog import im.vector.app.features.invite.InvitesAcceptor import im.vector.app.features.lifecycle.VectorActivityLifecycleCallbacks import im.vector.app.features.notifications.NotificationDrawerManager @@ -110,6 +110,7 @@ class VectorApplication : @Inject lateinit var buildMeta: BuildMeta @Inject lateinit var leakDetector: LeakDetector @Inject lateinit var vectorLocale: VectorLocale + @Inject lateinit var disclaimerDialog: DisclaimerDialog // font thread handler private var fontThreadHandler: Handler? = null @@ -172,7 +173,7 @@ class VectorApplication : val sessionImported = legacySessionImporter.process() if (!sessionImported) { // Do not display the name change popup - doNotShowDisclaimerDialog(this) + disclaimerDialog.doNotShowDisclaimerDialog() } ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver { diff --git a/vector/src/main/java/im/vector/app/core/di/DefaultSharedPreferences.kt b/vector/src/main/java/im/vector/app/core/di/DefaultSharedPreferences.kt deleted file mode 100644 index abee0cb2e7..0000000000 --- a/vector/src/main/java/im/vector/app/core/di/DefaultSharedPreferences.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2020 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.core.di - -import android.content.Context -import android.content.SharedPreferences -import androidx.preference.PreferenceManager - -object DefaultSharedPreferences { - - @Volatile private var INSTANCE: SharedPreferences? = null - - fun getInstance(context: Context): SharedPreferences = - INSTANCE ?: synchronized(this) { - INSTANCE ?: PreferenceManager.getDefaultSharedPreferences(context.applicationContext).also { INSTANCE = it } - } -} diff --git a/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushStore.kt b/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushStore.kt index d9c6bf3159..0bdfbe8e22 100644 --- a/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushStore.kt +++ b/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushStore.kt @@ -17,16 +17,17 @@ package im.vector.app.core.pushers import android.content.Context +import android.content.SharedPreferences import androidx.core.content.edit -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences import javax.inject.Inject class UnifiedPushStore @Inject constructor( val context: Context, - val fcmHelper: FcmHelper + val fcmHelper: FcmHelper, + @DefaultPreferences + private val defaultPrefs: SharedPreferences, ) { - private val defaultPrefs = DefaultSharedPreferences.getInstance(context) - /** * Retrieves the UnifiedPush Endpoint. * 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 e789585b63..a753139c66 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 @@ -23,7 +23,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.edit import androidx.core.view.isVisible import im.vector.app.R -import im.vector.app.core.di.DefaultSharedPreferences import im.vector.app.databinding.ViewKeysBackupBannerBinding import timber.log.Timber diff --git a/vector/src/main/java/im/vector/app/core/utils/RingtoneUtils.kt b/vector/src/main/java/im/vector/app/core/utils/RingtoneUtils.kt index bbed2f6000..915d840637 100644 --- a/vector/src/main/java/im/vector/app/core/utils/RingtoneUtils.kt +++ b/vector/src/main/java/im/vector/app/core/utils/RingtoneUtils.kt @@ -17,103 +17,109 @@ package im.vector.app.core.utils import android.content.Context +import android.content.SharedPreferences import android.media.Ringtone import android.media.RingtoneManager import android.net.Uri import androidx.core.content.edit -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences import im.vector.app.features.settings.VectorPreferences +import javax.inject.Inject /** - * This file manages the sound ringtone for calls. - * It allows you to use the default Riot Ringtone, or the standard ringtone or set a different one from the available choices + * This class manages the sound ringtone for calls. + * It allows you to use the default Element Ringtone, or the standard ringtone or set a different one from the available choices * in Android. */ +class RingtoneUtils @Inject constructor( + @DefaultPreferences + private val sharedPreferences: SharedPreferences, + private val context: Context, +) { + /** + * Returns a Uri object that points to a specific Ringtone. + * + * If no Ringtone was explicitly set using Riot, it will return the Uri for the current system + * ringtone for calls. + * + * @return the [Uri] of the currently set [Ringtone] + * @see Ringtone + */ + fun getCallRingtoneUri(): Uri? { + val callRingtone: String? = sharedPreferences + .getString(VectorPreferences.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY, null) -/** - * Returns a Uri object that points to a specific Ringtone. - * - * If no Ringtone was explicitly set using Riot, it will return the Uri for the current system - * ringtone for calls. - * - * @return the [Uri] of the currently set [Ringtone] - * @see Ringtone - */ -fun getCallRingtoneUri(context: Context): Uri? { - val callRingtone: String? = DefaultSharedPreferences.getInstance(context) - .getString(VectorPreferences.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY, null) + callRingtone?.let { + return Uri.parse(it) + } - callRingtone?.let { - return Uri.parse(it) + return try { + // Use current system notification sound for incoming calls per default (note that it can return null) + RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE) + } catch (e: SecurityException) { + // Ignore for now + null + } } - return try { - // Use current system notification sound for incoming calls per default (note that it can return null) - RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE) - } catch (e: SecurityException) { - // Ignore for now - null - } -} + /** + * Returns a Ringtone object that can then be played. + * + * If no Ringtone was explicitly set using Riot, it will return the current system ringtone + * for calls. + * + * @return the currently set [Ringtone] + * @see Ringtone + */ + fun getCallRingtone(): Ringtone? { + getCallRingtoneUri()?.let { + // Note that it can also return null + return RingtoneManager.getRingtone(context, it) + } -/** - * Returns a Ringtone object that can then be played. - * - * If no Ringtone was explicitly set using Riot, it will return the current system ringtone - * for calls. - * - * @return the currently set [Ringtone] - * @see Ringtone - */ -fun getCallRingtone(context: Context): Ringtone? { - getCallRingtoneUri(context)?.let { - // Note that it can also return null - return RingtoneManager.getRingtone(context, it) + return null } - return null -} + /** + * Returns a String with the name of the current Ringtone. + * + * If no Ringtone was explicitly set using Riot, it will return the name of the current system + * ringtone for calls. + * + * @return the name of the currently set [Ringtone], or null + * @see Ringtone + */ + fun getCallRingtoneName(): String? { + return getCallRingtone()?.getTitle(context) + } -/** - * Returns a String with the name of the current Ringtone. - * - * If no Ringtone was explicitly set using Riot, it will return the name of the current system - * ringtone for calls. - * - * @return the name of the currently set [Ringtone], or null - * @see Ringtone - */ -fun getCallRingtoneName(context: Context): String? { - return getCallRingtone(context)?.getTitle(context) -} + /** + * Sets the selected ringtone for riot calls. + * + * @param ringtoneUri + * @see Ringtone + */ + fun setCallRingtoneUri(ringtoneUri: Uri) { + sharedPreferences + .edit { + putString(VectorPreferences.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY, ringtoneUri.toString()) + } + } -/** - * Sets the selected ringtone for riot calls. - * - * @param context Android context - * @param ringtoneUri - * @see Ringtone - */ -fun setCallRingtoneUri(context: Context, ringtoneUri: Uri) { - DefaultSharedPreferences.getInstance(context) - .edit { - putString(VectorPreferences.SETTINGS_CALL_RINGTONE_URI_PREFERENCE_KEY, ringtoneUri.toString()) - } -} + /** + * Set using Riot default ringtone. + */ + fun useRiotDefaultRingtone(): Boolean { + return sharedPreferences.getBoolean(VectorPreferences.SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY, true) + } -/** - * Set using Riot default ringtone. - */ -fun useRiotDefaultRingtone(context: Context): Boolean { - return DefaultSharedPreferences.getInstance(context).getBoolean(VectorPreferences.SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY, true) -} - -/** - * Ask if default Riot ringtone has to be used. - */ -fun setUseRiotDefaultRingtone(context: Context, useRiotDefault: Boolean) { - DefaultSharedPreferences.getInstance(context) - .edit { - putBoolean(VectorPreferences.SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY, useRiotDefault) - } + /** + * Ask if default Riot ringtone has to be used. + */ + fun setUseRiotDefaultRingtone(useRiotDefault: Boolean) { + sharedPreferences + .edit { + putBoolean(VectorPreferences.SETTINGS_CALL_RINGTONE_USE_RIOT_PREFERENCE_KEY, useRiotDefault) + } + } } diff --git a/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt b/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt index 1c6afb30b2..8214ab7120 100644 --- a/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt +++ b/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt @@ -17,44 +17,46 @@ package im.vector.app.features.disclaimer import android.app.Activity -import android.content.Context +import android.content.SharedPreferences import androidx.core.content.edit import com.google.android.material.dialog.MaterialAlertDialogBuilder import im.vector.app.R -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.utils.openUrlInChromeCustomTab import im.vector.app.features.settings.VectorSettingsUrls +import javax.inject.Inject // Increase this value to show again the disclaimer dialog after an upgrade of the application private const val CURRENT_DISCLAIMER_VALUE = 2 const val SHARED_PREF_KEY = "LAST_DISCLAIMER_VERSION_VALUE" -fun showDisclaimerDialog(activity: Activity) { - val sharedPrefs = DefaultSharedPreferences.getInstance(activity) +class DisclaimerDialog @Inject constructor( + @DefaultPreferences + private val sharedPrefs: SharedPreferences, +) { + fun showDisclaimerDialog(activity: Activity) { + if (sharedPrefs.getInt(SHARED_PREF_KEY, 0) < CURRENT_DISCLAIMER_VALUE) { + sharedPrefs.edit { + putInt(SHARED_PREF_KEY, CURRENT_DISCLAIMER_VALUE) + } - if (sharedPrefs.getInt(SHARED_PREF_KEY, 0) < CURRENT_DISCLAIMER_VALUE) { + val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_disclaimer_content, null) + + MaterialAlertDialogBuilder(activity) + .setView(dialogLayout) + .setCancelable(false) + .setNegativeButton(R.string.disclaimer_negative_button, null) + .setPositiveButton(R.string.disclaimer_positive_button) { _, _ -> + openUrlInChromeCustomTab(activity, null, VectorSettingsUrls.DISCLAIMER_URL) + } + .show() + } + } + + fun doNotShowDisclaimerDialog() { sharedPrefs.edit { putInt(SHARED_PREF_KEY, CURRENT_DISCLAIMER_VALUE) } - - val dialogLayout = activity.layoutInflater.inflate(R.layout.dialog_disclaimer_content, null) - - MaterialAlertDialogBuilder(activity) - .setView(dialogLayout) - .setCancelable(false) - .setNegativeButton(R.string.disclaimer_negative_button, null) - .setPositiveButton(R.string.disclaimer_positive_button) { _, _ -> - openUrlInChromeCustomTab(activity, null, VectorSettingsUrls.DISCLAIMER_URL) - } - .show() - } -} - -fun doNotShowDisclaimerDialog(context: Context) { - val sharedPrefs = DefaultSharedPreferences.getInstance(context) - - sharedPrefs.edit { - putInt(SHARED_PREF_KEY, CURRENT_DISCLAIMER_VALUE) } } 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 8fb73d6571..10e8447a2b 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 @@ -56,7 +56,7 @@ import im.vector.app.features.analytics.accountdata.AnalyticsAccountDataViewMode import im.vector.app.features.analytics.plan.MobileScreen import im.vector.app.features.analytics.plan.ViewRoom import im.vector.app.features.crypto.recover.SetupMode -import im.vector.app.features.disclaimer.showDisclaimerDialog +import im.vector.app.features.disclaimer.DisclaimerDialog import im.vector.app.features.home.room.list.actions.RoomListSharedAction import im.vector.app.features.home.room.list.actions.RoomListSharedActionViewModel import im.vector.app.features.home.room.list.home.layout.HomeLayoutSettingBottomDialogFragment @@ -141,6 +141,7 @@ class HomeActivity : @Inject lateinit var unifiedPushHelper: UnifiedPushHelper @Inject lateinit var fcmHelper: FcmHelper @Inject lateinit var nightlyProxy: NightlyProxy + @Inject lateinit var disclaimerDialog: DisclaimerDialog private var isNewAppLayoutEnabled: Boolean = false // delete once old app layout is removed @@ -570,7 +571,7 @@ class HomeActivity : .setNegativeButton(R.string.no) { _, _ -> bugReporter.deleteCrashFile() } .show() } else { - showDisclaimerDialog(this) + disclaimerDialog.showDisclaimerDialog(this) } // Force remote backup state update to update the banner if needed diff --git a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt index 4eca377e28..95e2aeedd1 100644 --- a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt +++ b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt @@ -17,28 +17,36 @@ package im.vector.app.features.homeserver import android.content.Context +import android.content.SharedPreferences import androidx.core.content.edit import im.vector.app.R -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences +import im.vector.app.core.resources.StringProvider +import javax.inject.Inject /** * Object to store and retrieve home and identity server urls. */ -object ServerUrlsRepository { +class ServerUrlsRepository @Inject constructor( + @DefaultPreferences + private val sharedPreferences: SharedPreferences, + private val stringProvider: StringProvider, +) { + companion object { + // Keys used to store default servers urls from the referrer + private const val DEFAULT_REFERRER_HOME_SERVER_URL_PREF = "default_referrer_home_server_url" + private const val DEFAULT_REFERRER_IDENTITY_SERVER_URL_PREF = "default_referrer_identity_server_url" - // Keys used to store default servers urls from the referrer - private const val DEFAULT_REFERRER_HOME_SERVER_URL_PREF = "default_referrer_home_server_url" - private const val DEFAULT_REFERRER_IDENTITY_SERVER_URL_PREF = "default_referrer_identity_server_url" - - // Keys used to store current homeserver url and identity url - const val HOME_SERVER_URL_PREF = "home_server_url" - const val IDENTITY_SERVER_URL_PREF = "identity_server_url" + // Keys used to store current homeserver url and identity url + const val HOME_SERVER_URL_PREF = "home_server_url" + const val IDENTITY_SERVER_URL_PREF = "identity_server_url" + } /** * Save home and identity sever urls received by the Referrer receiver. */ - fun setDefaultUrlsFromReferrer(context: Context, homeServerUrl: String, identityServerUrl: String) { - DefaultSharedPreferences.getInstance(context) + fun setDefaultUrlsFromReferrer(homeServerUrl: String, identityServerUrl: String) { + sharedPreferences .edit { if (homeServerUrl.isNotEmpty()) { putString(DEFAULT_REFERRER_HOME_SERVER_URL_PREF, homeServerUrl) @@ -53,8 +61,8 @@ object ServerUrlsRepository { /** * Save home and identity sever urls entered by the user. May be custom or default value. */ - fun saveServerUrls(context: Context, homeServerUrl: String, identityServerUrl: String) { - DefaultSharedPreferences.getInstance(context) + fun saveServerUrls(homeServerUrl: String, identityServerUrl: String) { + sharedPreferences .edit { putString(HOME_SERVER_URL_PREF, homeServerUrl) putString(IDENTITY_SERVER_URL_PREF, identityServerUrl) @@ -64,14 +72,12 @@ object ServerUrlsRepository { /** * Return last used homeserver url, or the default one from referrer or the default one from resources. */ - fun getLastHomeServerUrl(context: Context): String { - val prefs = DefaultSharedPreferences.getInstance(context) - - return prefs.getString( + fun getLastHomeServerUrl(): String { + return sharedPreferences.getString( HOME_SERVER_URL_PREF, - prefs.getString( + sharedPreferences.getString( DEFAULT_REFERRER_HOME_SERVER_URL_PREF, - getDefaultHomeServerUrl(context) + getDefaultHomeServerUrl() )!! )!! } @@ -79,10 +85,10 @@ object ServerUrlsRepository { /** * Return true if url is the default homeserver url form resources. */ - fun isDefaultHomeServerUrl(context: Context, url: String) = url == getDefaultHomeServerUrl(context) + fun isDefaultHomeServerUrl(context: Context, url: String) = url == getDefaultHomeServerUrl() /** * Return default homeserver url from resources. */ - fun getDefaultHomeServerUrl(context: Context): String = context.getString(R.string.matrix_org_server_url) + fun getDefaultHomeServerUrl() = stringProvider.getString(R.string.matrix_org_server_url) } diff --git a/vector/src/main/java/im/vector/app/features/rageshake/VectorUncaughtExceptionHandler.kt b/vector/src/main/java/im/vector/app/features/rageshake/VectorUncaughtExceptionHandler.kt index 5496ff4a94..23b4fe04a8 100644 --- a/vector/src/main/java/im/vector/app/features/rageshake/VectorUncaughtExceptionHandler.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/VectorUncaughtExceptionHandler.kt @@ -16,10 +16,10 @@ package im.vector.app.features.rageshake -import android.content.Context +import android.content.SharedPreferences import android.os.Build import androidx.core.content.edit -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.resources.VersionCodeProvider import im.vector.app.features.version.VersionProvider import org.matrix.android.sdk.api.Matrix @@ -31,10 +31,11 @@ import javax.inject.Singleton @Singleton class VectorUncaughtExceptionHandler @Inject constructor( - context: Context, + @DefaultPreferences + private val preferences: SharedPreferences, private val bugReporter: BugReporter, private val versionProvider: VersionProvider, - private val versionCodeProvider: VersionCodeProvider + private val versionCodeProvider: VersionCodeProvider, ) : Thread.UncaughtExceptionHandler { // key to save the crash status @@ -44,8 +45,6 @@ class VectorUncaughtExceptionHandler @Inject constructor( private var previousHandler: Thread.UncaughtExceptionHandler? = null - private val preferences = DefaultSharedPreferences.getInstance(context) - /** * Activate this handler. */ diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt b/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt index b7caac11c3..b1a3fa9566 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorLocale.kt @@ -17,10 +17,11 @@ package im.vector.app.features.settings import android.content.Context +import android.content.SharedPreferences import android.content.res.Configuration import androidx.core.content.edit import im.vector.app.R -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.resources.BuildMeta import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -37,6 +38,8 @@ import javax.inject.Singleton class VectorLocale @Inject constructor( private val context: Context, private val buildMeta: BuildMeta, + @DefaultPreferences + private val preferences: SharedPreferences, ) { companion object { const val APPLICATION_LOCALE_COUNTRY_KEY = "APPLICATION_LOCALE_COUNTRY_KEY" @@ -63,8 +66,6 @@ class VectorLocale @Inject constructor( * Init this singleton. */ fun init() { - val preferences = DefaultSharedPreferences.getInstance(context) - if (preferences.contains(APPLICATION_LOCALE_LANGUAGE_KEY)) { applicationLocale = Locale( preferences.getString(APPLICATION_LOCALE_LANGUAGE_KEY, "")!!, @@ -90,7 +91,7 @@ class VectorLocale @Inject constructor( fun saveApplicationLocale(locale: Locale) { applicationLocale = locale - DefaultSharedPreferences.getInstance(context).edit { + preferences.edit { val language = locale.language if (language.isEmpty()) { remove(APPLICATION_LOCALE_LANGUAGE_KEY) 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 4da6455f74..16d3210b45 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 @@ -24,8 +24,9 @@ import androidx.annotation.BoolRes import androidx.core.content.edit import com.squareup.seismic.ShakeDetector import im.vector.app.R -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.resources.BuildMeta +import im.vector.app.core.resources.StringProvider import im.vector.app.core.time.Clock import im.vector.app.features.VectorFeatures import im.vector.app.features.disclaimer.SHARED_PREF_KEY @@ -41,6 +42,9 @@ class VectorPreferences @Inject constructor( private val clock: Clock, private val buildMeta: BuildMeta, private val vectorFeatures: VectorFeatures, + @DefaultPreferences + private val defaultPrefs: SharedPreferences, + private val stringProvider: StringProvider, ) { companion object { @@ -289,8 +293,6 @@ class VectorPreferences @Inject constructor( ) } - private val defaultPrefs = DefaultSharedPreferences.getInstance(context) - /** * Allow subscribing and unsubscribing to configuration changes. This is * particularly useful when you need to be notified of a configuration change @@ -716,10 +718,10 @@ class VectorPreferences @Inject constructor( */ fun getSelectedMediasSavingPeriodString(): String { return when (getSelectedMediasSavingPeriod()) { - MEDIA_SAVING_3_DAYS -> context.getString(R.string.media_saving_period_3_days) - MEDIA_SAVING_1_WEEK -> context.getString(R.string.media_saving_period_1_week) - MEDIA_SAVING_1_MONTH -> context.getString(R.string.media_saving_period_1_month) - MEDIA_SAVING_FOREVER -> context.getString(R.string.media_saving_period_forever) + MEDIA_SAVING_3_DAYS -> stringProvider.getString(R.string.media_saving_period_3_days) + MEDIA_SAVING_1_WEEK -> stringProvider.getString(R.string.media_saving_period_1_week) + MEDIA_SAVING_1_MONTH -> stringProvider.getString(R.string.media_saving_period_1_month) + MEDIA_SAVING_FOREVER -> stringProvider.getString(R.string.media_saving_period_forever) else -> "?" } } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsVoiceVideoFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsVoiceVideoFragment.kt index fbf54479fc..28e167779d 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsVoiceVideoFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsVoiceVideoFragment.kt @@ -23,17 +23,19 @@ import android.net.Uri import android.os.Bundle import androidx.preference.Preference import androidx.preference.SwitchPreference +import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.preference.VectorPreference -import im.vector.app.core.utils.getCallRingtoneName -import im.vector.app.core.utils.getCallRingtoneUri -import im.vector.app.core.utils.setCallRingtoneUri -import im.vector.app.core.utils.setUseRiotDefaultRingtone +import im.vector.app.core.utils.RingtoneUtils import im.vector.app.features.analytics.plan.MobileScreen +import javax.inject.Inject +@AndroidEntryPoint class VectorSettingsVoiceVideoFragment : VectorSettingsBaseFragment() { + @Inject lateinit var ringtoneUtils: RingtoneUtils + override var titleRes = R.string.preference_voice_and_video override val preferenceXmlRes = R.xml.vector_settings_voice_video @@ -52,12 +54,12 @@ class VectorSettingsVoiceVideoFragment : VectorSettingsBaseFragment() { override fun bindPref() { // Incoming call sounds mUseRiotCallRingtonePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { - activity?.let { setUseRiotDefaultRingtone(it, mUseRiotCallRingtonePreference.isChecked) } + ringtoneUtils.setUseRiotDefaultRingtone(mUseRiotCallRingtonePreference.isChecked) false } mCallRingtonePreference.let { - activity?.let { activity -> it.summary = getCallRingtoneName(activity) } + it.summary = ringtoneUtils.getCallRingtoneName() it.onPreferenceClickListener = Preference.OnPreferenceClickListener { displayRingtonePicker() false @@ -68,10 +70,9 @@ class VectorSettingsVoiceVideoFragment : VectorSettingsBaseFragment() { private val ringtoneStartForActivityResult = registerStartForActivityResult { activityResult -> if (activityResult.resultCode == Activity.RESULT_OK) { val callRingtoneUri: Uri? = activityResult.data?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) - val thisActivity = activity - if (callRingtoneUri != null && thisActivity != null) { - setCallRingtoneUri(thisActivity, callRingtoneUri) - mCallRingtonePreference.summary = getCallRingtoneName(thisActivity) + if (callRingtoneUri != null) { + ringtoneUtils.setCallRingtoneUri(callRingtoneUri) + mCallRingtonePreference.summary = ringtoneUtils.getCallRingtoneName() } } } @@ -82,7 +83,7 @@ class VectorSettingsVoiceVideoFragment : VectorSettingsBaseFragment() { putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false) putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true) putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE) - activity?.let { putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, getCallRingtoneUri(it)) } + putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, ringtoneUtils.getCallRingtoneUri()) } ringtoneStartForActivityResult.launch(intent) } diff --git a/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt b/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt index 96af7906e2..b5c7b162d8 100644 --- a/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt +++ b/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt @@ -27,8 +27,8 @@ import androidx.annotation.ColorInt import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.core.graphics.drawable.DrawableCompat +import androidx.preference.PreferenceManager import im.vector.app.R -import im.vector.app.core.di.DefaultSharedPreferences import timber.log.Timber import java.util.concurrent.atomic.AtomicReference @@ -84,7 +84,7 @@ object ThemeUtils { fun getApplicationTheme(context: Context): String { val currentTheme = this.currentTheme.get() return if (currentTheme == null) { - val prefs = DefaultSharedPreferences.getInstance(context) + val prefs = PreferenceManager.getDefaultSharedPreferences(context.applicationContext) var themeFromPref = prefs.getString(APPLICATION_THEME_KEY, DEFAULT_THEME) ?: DEFAULT_THEME if (themeFromPref == "status") { // Migrate to the default theme From b4494ee8eafa84879a66e28cbdeca91fc2faa8fe Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 16:41:00 +0200 Subject: [PATCH 107/131] Remove `DefaultSharedPreferences` since we now have @DefaultPreferences which provide a singleton. Some fun has been moved to injectable classes due to this change. Not compiling, still work to do, but I prefer to split into 2 separate commits. --- .../im/vector/app/features/homeserver/ServerUrlsRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt index 95e2aeedd1..65bf24dc45 100644 --- a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt +++ b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt @@ -85,7 +85,7 @@ class ServerUrlsRepository @Inject constructor( /** * Return true if url is the default homeserver url form resources. */ - fun isDefaultHomeServerUrl(context: Context, url: String) = url == getDefaultHomeServerUrl() + fun isDefaultHomeServerUrl(url: String) = url == getDefaultHomeServerUrl() /** * Return default homeserver url from resources. From c735ea5e3de53627d4c7d459bae837904d25b9ec Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 16:49:07 +0200 Subject: [PATCH 108/131] Remove duplication between `KeysBackupBanner.State` and `ServerBackupStatusViewModel.BannerState` and move the some logic to the ViewModel --- .../app/core/ui/views/KeysBackupBanner.kt | 116 +++--------------- .../restore/KeysBackupRestoreActivity.kt | 8 +- .../app/features/home/HomeDetailFragment.kt | 15 ++- .../features/home/NewHomeDetailFragment.kt | 15 ++- .../signout/ServerBackupStatusAction.kt | 25 ++++ .../signout/ServerBackupStatusViewModel.kt | 93 ++++++++++++-- 6 files changed, 156 insertions(+), 116 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusAction.kt 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 a753139c66..f0a42dd78d 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 @@ -20,10 +20,10 @@ import android.content.Context import android.util.AttributeSet import android.view.View import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.edit import androidx.core.view.isVisible import im.vector.app.R import im.vector.app.databinding.ViewKeysBackupBannerBinding +import im.vector.app.features.workers.signout.BannerState import timber.log.Timber /** @@ -37,16 +37,12 @@ class KeysBackupBanner @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr), View.OnClickListener { var delegate: Delegate? = null - private var state: State = State.Initial + private var state: BannerState = BannerState.Initial private lateinit var views: ViewKeysBackupBannerBinding init { setupView() - DefaultSharedPreferences.getInstance(context).edit { - putBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, false) - putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, "") - } } /** @@ -55,7 +51,7 @@ class KeysBackupBanner @JvmOverloads constructor( * @param newState the newState representing the view * @param force true to force the rendering of the view */ - fun render(newState: State, force: Boolean = false) { + fun render(newState: BannerState, force: Boolean = false) { if (newState == state && !force) { Timber.v("State unchanged") return @@ -66,48 +62,26 @@ class KeysBackupBanner @JvmOverloads constructor( hideAll() when (newState) { - State.Initial -> renderInitial() - State.Hidden -> renderHidden() - is State.Setup -> renderSetup(newState.numberOfKeys) - is State.Recover -> renderRecover(newState.version) - is State.Update -> renderUpdate(newState.version) - State.BackingUp -> renderBackingUp() + BannerState.Initial -> renderInitial() + BannerState.Hidden -> renderHidden() + is BannerState.Setup -> renderSetup(newState) + is BannerState.Recover -> renderRecover(newState) + is BannerState.Update -> renderUpdate(newState) + BannerState.BackingUp -> renderBackingUp() } } override fun onClick(v: View?) { when (state) { - is State.Setup -> delegate?.setupKeysBackup() - is State.Update, - is State.Recover -> delegate?.recoverKeysBackup() + is BannerState.Setup -> delegate?.setupKeysBackup() + is BannerState.Update, + is BannerState.Recover -> delegate?.recoverKeysBackup() else -> Unit } } private fun onCloseClicked() { - state.let { - when (it) { - is State.Setup -> { - DefaultSharedPreferences.getInstance(context).edit { - putBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, true) - } - } - is State.Recover -> { - DefaultSharedPreferences.getInstance(context).edit { - putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, it.version) - } - } - is State.Update -> { - DefaultSharedPreferences.getInstance(context).edit { - putString(BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION, it.version) - } - } - else -> { - // Should not happen, close button is not displayed in other cases - } - } - } - + delegate?.onCloseClicked() // Force refresh render(state, true) } @@ -132,9 +106,8 @@ class KeysBackupBanner @JvmOverloads constructor( isVisible = false } - private fun renderSetup(nbOfKeys: Int) { - if (nbOfKeys == 0 || - DefaultSharedPreferences.getInstance(context).getBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, false)) { + private fun renderSetup(state: BannerState.Setup) { + if (state.numberOfKeys == 0 || state.doNotShowAgain) { // Do not display the setup banner if there is no keys to backup, or if the user has already closed it isVisible = false } else { @@ -147,8 +120,8 @@ class KeysBackupBanner @JvmOverloads constructor( } } - private fun renderRecover(version: String) { - if (version == DefaultSharedPreferences.getInstance(context).getString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, null)) { + private fun renderRecover(state: BannerState.Recover) { + if (state.version == state.doNotShowForVersion) { isVisible = false } else { isVisible = true @@ -160,8 +133,8 @@ class KeysBackupBanner @JvmOverloads constructor( } } - private fun renderUpdate(version: String) { - if (version == DefaultSharedPreferences.getInstance(context).getString(BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION, null)) { + private fun renderUpdate(state: BannerState.Update) { + if (state.version == state.doNotShowForVersion) { isVisible = false } else { isVisible = true @@ -190,61 +163,12 @@ class KeysBackupBanner @JvmOverloads constructor( views.viewKeysBackupBannerLoading.isVisible = false } - /** - * The state representing the view. - * It can take one state at a time. - */ - sealed class State { - // Not yet rendered - object Initial : State() - - // View will be Gone - object Hidden : State() - - // Keys backup is not setup, numberOfKeys is the number of locally stored keys - data class Setup(val numberOfKeys: Int) : State() - - // Keys backup can be recovered, with version from the server - data class Recover(val version: String) : State() - - // Keys backup can be updated - data class Update(val version: String) : State() - - // Keys are backing up - object BackingUp : State() - } - /** * An interface to delegate some actions to another object. */ interface Delegate { + fun onCloseClicked() fun setupKeysBackup() fun recoverKeysBackup() } - - companion object { - /** - * Preference key for setup. Value is a boolean. - */ - private const val BANNER_SETUP_DO_NOT_SHOW_AGAIN = "BANNER_SETUP_DO_NOT_SHOW_AGAIN" - - /** - * Preference key for recover. Value is a backup version (String). - */ - private const val BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION = "BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION" - - /** - * Preference key for update. Value is a backup version (String). - */ - private const val BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION = "BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION" - - /** - * Inform the banner that a Recover has been done for this version, so do not show the Recover banner for this version. - */ - fun onRecoverDoneForVersion(context: Context, version: String) { - DefaultSharedPreferences.getInstance(context).edit { - putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, version) - } - } - } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt index 3089481255..c6e86f6f6b 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt @@ -18,6 +18,7 @@ package im.vector.app.features.crypto.keysbackup.restore import android.app.Activity import android.content.Context import android.content.Intent +import com.airbnb.mvrx.viewModel import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R @@ -27,8 +28,9 @@ import im.vector.app.core.extensions.observeEvent import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.extensions.replaceFragment import im.vector.app.core.platform.SimpleFragmentActivity -import im.vector.app.core.ui.views.KeysBackupBanner import im.vector.app.features.crypto.quads.SharedSecureStorageActivity +import im.vector.app.features.workers.signout.ServerBackupStatusAction +import im.vector.app.features.workers.signout.ServerBackupStatusViewModel import org.matrix.android.sdk.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME import javax.inject.Inject @@ -46,6 +48,7 @@ class KeysBackupRestoreActivity : SimpleFragmentActivity() { override fun getTitleRes() = R.string.title_activity_keys_backup_restore private lateinit var viewModel: KeysBackupRestoreSharedViewModel + private val serverBackupStatusViewModel: ServerBackupStatusViewModel by viewModel() override fun onBackPressed() { hideWaitingView() @@ -95,7 +98,8 @@ class KeysBackupRestoreActivity : SimpleFragmentActivity() { } KeysBackupRestoreSharedViewModel.NAVIGATE_TO_SUCCESS -> { viewModel.keyVersionResult.value?.version?.let { - KeysBackupBanner.onRecoverDoneForVersion(this, it) + // Inform the banner that a Recover has been done for this version, so do not show the Recover banner for this version. + serverBackupStatusViewModel.handle(ServerBackupStatusAction.OnRecoverDoneForVersion(it)) } replaceFragment(views.container, KeysBackupRestoreSuccessFragment::class.java, allowStateLoss = true) } diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt index a2544a2fde..e824dc1820 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt @@ -56,6 +56,7 @@ import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS import im.vector.app.features.themes.ThemeUtils import im.vector.app.features.workers.signout.BannerState +import im.vector.app.features.workers.signout.ServerBackupStatusAction import im.vector.app.features.workers.signout.ServerBackupStatusViewModel import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo import org.matrix.android.sdk.api.session.room.model.RoomSummary @@ -289,13 +290,15 @@ class HomeDetailFragment : } private fun setupKeysBackupBanner() { + serverBackupStatusViewModel.handle(ServerBackupStatusAction.OnBannerDisplayed) serverBackupStatusViewModel .onEach { when (val banState = it.bannerState.invoke()) { - is BannerState.Setup -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.Setup(banState.numberOfKeys), false) - BannerState.BackingUp -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.BackingUp, false) - null, - BannerState.Hidden -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.Hidden, false) + is BannerState.Setup, + BannerState.BackingUp, + BannerState.Hidden -> views.homeKeysBackupBanner.render(banState, false) + null -> views.homeKeysBackupBanner.render(BannerState.Hidden, false) + else -> Unit /* No op? */ } } views.homeKeysBackupBanner.delegate = this @@ -402,6 +405,10 @@ class HomeDetailFragment : * KeysBackupBanner Listener * ========================================================================================== */ + override fun onCloseClicked() { + serverBackupStatusViewModel.handle(ServerBackupStatusAction.OnBannerClosed) + } + override fun setupKeysBackup() { navigator.openKeysBackupSetup(requireActivity(), false) } diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt index f31f8a7d92..66bb9ef876 100644 --- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt @@ -57,6 +57,7 @@ import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorSettingsActivity.Companion.EXTRA_DIRECT_ACCESS_SECURITY_PRIVACY_MANAGE_SESSIONS import im.vector.app.features.spaces.SpaceListBottomSheet import im.vector.app.features.workers.signout.BannerState +import im.vector.app.features.workers.signout.ServerBackupStatusAction import im.vector.app.features.workers.signout.ServerBackupStatusViewModel import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -300,13 +301,15 @@ class NewHomeDetailFragment : } private fun setupKeysBackupBanner() { + serverBackupStatusViewModel.handle(ServerBackupStatusAction.OnBannerDisplayed) serverBackupStatusViewModel .onEach { when (val banState = it.bannerState.invoke()) { - is BannerState.Setup -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.Setup(banState.numberOfKeys), false) - BannerState.BackingUp -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.BackingUp, false) - null, - BannerState.Hidden -> views.homeKeysBackupBanner.render(KeysBackupBanner.State.Hidden, false) + is BannerState.Setup, + BannerState.BackingUp, + BannerState.Hidden -> views.homeKeysBackupBanner.render(banState, false) + null -> views.homeKeysBackupBanner.render(BannerState.Hidden, false) + else -> Unit /* No op? */ } } views.homeKeysBackupBanner.delegate = this @@ -348,6 +351,10 @@ class NewHomeDetailFragment : * KeysBackupBanner Listener * ========================================================================================== */ + override fun onCloseClicked() { + serverBackupStatusViewModel.handle(ServerBackupStatusAction.OnBannerClosed) + } + override fun setupKeysBackup() { navigator.openKeysBackupSetup(requireActivity(), false) } diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusAction.kt b/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusAction.kt new file mode 100644 index 0000000000..2c59a80964 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusAction.kt @@ -0,0 +1,25 @@ +/* + * 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.workers.signout + +import im.vector.app.core.platform.VectorViewModelAction + +sealed interface ServerBackupStatusAction : VectorViewModelAction { + data class OnRecoverDoneForVersion(val version: String) : ServerBackupStatusAction + object OnBannerDisplayed : ServerBackupStatusAction + object OnBannerClosed : ServerBackupStatusAction +} diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt b/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt index d2a4b3193a..81cf48a832 100644 --- a/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt @@ -16,6 +16,8 @@ package im.vector.app.features.workers.signout +import android.content.SharedPreferences +import androidx.core.content.edit import androidx.lifecycle.MutableLiveData import com.airbnb.mvrx.Async import com.airbnb.mvrx.MavericksState @@ -24,9 +26,9 @@ import com.airbnb.mvrx.Uninitialized import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory -import im.vector.app.core.platform.EmptyAction import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel import kotlinx.coroutines.flow.MutableSharedFlow @@ -51,29 +53,55 @@ data class ServerBackupStatusViewState( * The state representing the view. * It can take one state at a time. */ -sealed class BannerState { +sealed interface BannerState { + // Not yet rendered + object Initial : BannerState - object Hidden : BannerState() + // View will be Gone + object Hidden : BannerState // Keys backup is not setup, numberOfKeys is the number of locally stored keys - data class Setup(val numberOfKeys: Int) : BannerState() + data class Setup(val numberOfKeys: Int, val doNotShowAgain: Boolean) : BannerState + + // Keys backup can be recovered, with version from the server + data class Recover(val version: String, val doNotShowForVersion: String) : BannerState + + // Keys backup can be updated + data class Update(val version: String, val doNotShowForVersion: String) : BannerState // Keys are backing up - object BackingUp : BannerState() + object BackingUp : BannerState } class ServerBackupStatusViewModel @AssistedInject constructor( @Assisted initialState: ServerBackupStatusViewState, - private val session: Session + private val session: Session, + @DefaultPreferences + private val sharedPreferences: SharedPreferences, ) : - VectorViewModel(initialState), KeysBackupStateListener { + VectorViewModel(initialState), KeysBackupStateListener { @AssistedFactory interface Factory : MavericksAssistedViewModelFactory { override fun create(initialState: ServerBackupStatusViewState): ServerBackupStatusViewModel } - companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() + companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() { + /** + * Preference key for setup. Value is a boolean. + */ + private const val BANNER_SETUP_DO_NOT_SHOW_AGAIN = "BANNER_SETUP_DO_NOT_SHOW_AGAIN" + + /** + * Preference key for recover. Value is a backup version (String). + */ + private const val BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION = "BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION" + + /** + * Preference key for update. Value is a backup version (String). + */ + private const val BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION = "BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION" + } // Keys exported manually val keysExportedToFile = MutableLiveData() @@ -105,7 +133,10 @@ class ServerBackupStatusViewModel @AssistedInject constructor( pInfo.getOrNull()?.allKnown().orFalse()) ) { // So 4S is not setup and we have local secrets, - return@combine BannerState.Setup(numberOfKeys = getNumberOfKeysToBackup()) + return@combine BannerState.Setup( + numberOfKeys = getNumberOfKeysToBackup(), + doNotShowAgain = sharedPreferences.getBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, false) + ) } BannerState.Hidden } @@ -161,5 +192,47 @@ class ServerBackupStatusViewModel @AssistedInject constructor( } } - override fun handle(action: EmptyAction) {} + override fun handle(action: ServerBackupStatusAction) { + when (action) { + is ServerBackupStatusAction.OnRecoverDoneForVersion -> handleOnRecoverDoneForVersion(action) + ServerBackupStatusAction.OnBannerDisplayed -> handleOnBannerDisplayed() + ServerBackupStatusAction.OnBannerClosed -> handleOnBannerClosed() + } + } + + private fun handleOnRecoverDoneForVersion(action: ServerBackupStatusAction.OnRecoverDoneForVersion) { + sharedPreferences.edit { + putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, action.version) + } + } + + private fun handleOnBannerDisplayed() { + sharedPreferences.edit { + putBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, false) + putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, "") + } + } + + private fun handleOnBannerClosed() = withState { state -> + when (val bannerState = state.bannerState()) { + is BannerState.Setup -> { + sharedPreferences.edit { + putBoolean(BANNER_SETUP_DO_NOT_SHOW_AGAIN, true) + } + } + is BannerState.Recover -> { + sharedPreferences.edit { + putString(BANNER_RECOVER_DO_NOT_SHOW_FOR_VERSION, bannerState.version) + } + } + is BannerState.Update -> { + sharedPreferences.edit { + putString(BANNER_UPDATE_DO_NOT_SHOW_FOR_VERSION, bannerState.version) + } + } + else -> { + // Should not happen, close button is not displayed in other cases + } + } + } } From 226672378959e970db25a09f418fa6653a8dd5c8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 17:03:46 +0200 Subject: [PATCH 109/131] Remove `DefaultSharedPreferences` since we now have @DefaultPreferences which provide a singleton. --- .../app/receivers/VectorDebugReceiver.kt | 19 +++++++++++-------- .../im/vector/app/push/fcm/GoogleFcmHelper.kt | 8 ++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/vector-app/src/debug/java/im/vector/app/receivers/VectorDebugReceiver.kt b/vector-app/src/debug/java/im/vector/app/receivers/VectorDebugReceiver.kt index 550dc055d9..4edbdd0591 100644 --- a/vector-app/src/debug/java/im/vector/app/receivers/VectorDebugReceiver.kt +++ b/vector-app/src/debug/java/im/vector/app/receivers/VectorDebugReceiver.kt @@ -23,7 +23,7 @@ import android.content.IntentFilter import android.content.SharedPreferences import androidx.core.content.edit import im.vector.app.core.debug.DebugReceiver -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.utils.lsFiles import timber.log.Timber import javax.inject.Inject @@ -31,7 +31,10 @@ import javax.inject.Inject /** * Receiver to handle some command from ADB */ -class VectorDebugReceiver @Inject constructor() : BroadcastReceiver(), DebugReceiver { +class VectorDebugReceiver @Inject constructor( + @DefaultPreferences + private val sharedPreferences: SharedPreferences, +) : BroadcastReceiver(), DebugReceiver { override fun register(context: Context) { context.registerReceiver(this, getIntentFilter(context)) @@ -47,14 +50,14 @@ class VectorDebugReceiver @Inject constructor() : BroadcastReceiver(), DebugRece intent.action?.let { when { it.endsWith(DEBUG_ACTION_DUMP_FILESYSTEM) -> lsFiles(context) - it.endsWith(DEBUG_ACTION_DUMP_PREFERENCES) -> dumpPreferences(context) - it.endsWith(DEBUG_ACTION_ALTER_SCALAR_TOKEN) -> alterScalarToken(context) + it.endsWith(DEBUG_ACTION_DUMP_PREFERENCES) -> dumpPreferences() + it.endsWith(DEBUG_ACTION_ALTER_SCALAR_TOKEN) -> alterScalarToken() } } } - private fun dumpPreferences(context: Context) { - logPrefs("DefaultSharedPreferences", DefaultSharedPreferences.getInstance(context)) + private fun dumpPreferences() { + logPrefs("DefaultSharedPreferences", sharedPreferences) } private fun logPrefs(name: String, sharedPreferences: SharedPreferences?) { @@ -67,8 +70,8 @@ class VectorDebugReceiver @Inject constructor() : BroadcastReceiver(), DebugRece } } - private fun alterScalarToken(context: Context) { - DefaultSharedPreferences.getInstance(context).edit { + private fun alterScalarToken() { + sharedPreferences.edit { // putString("SCALAR_TOKEN_PREFERENCE_KEY" + Matrix.getInstance(context).defaultSession.myUserId, "bad_token") } } diff --git a/vector-app/src/gplay/java/im/vector/app/push/fcm/GoogleFcmHelper.kt b/vector-app/src/gplay/java/im/vector/app/push/fcm/GoogleFcmHelper.kt index d64847c124..7cf90cf874 100755 --- a/vector-app/src/gplay/java/im/vector/app/push/fcm/GoogleFcmHelper.kt +++ b/vector-app/src/gplay/java/im/vector/app/push/fcm/GoogleFcmHelper.kt @@ -17,6 +17,7 @@ package im.vector.app.push.fcm import android.app.Activity import android.content.Context +import android.content.SharedPreferences import android.widget.Toast import androidx.core.content.edit import com.google.android.gms.common.ConnectionResult @@ -24,7 +25,7 @@ import com.google.android.gms.common.GoogleApiAvailability import com.google.firebase.messaging.FirebaseMessaging import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder -import im.vector.app.core.di.DefaultSharedPreferences +import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.pushers.FcmHelper import im.vector.app.core.pushers.PushersManager import timber.log.Timber @@ -35,14 +36,13 @@ import javax.inject.Inject * It has an alter ego in the fdroid variant. */ class GoogleFcmHelper @Inject constructor( - context: Context, + @DefaultPreferences + private val sharedPrefs: SharedPreferences, ) : FcmHelper { companion object { private const val PREFS_KEY_FCM_TOKEN = "FCM_TOKEN" } - private val sharedPrefs = DefaultSharedPreferences.getInstance(context) - override fun isFirebaseAvailable(): Boolean = true override fun getFcmToken(): String? { From 2bda97224cbf174759f4e81e1aa79f57db1dc7ed Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 17:15:43 +0200 Subject: [PATCH 110/131] Cleanup --- .../im/vector/app/features/homeserver/ServerUrlsRepository.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt index 65bf24dc45..636c557da9 100644 --- a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt +++ b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt @@ -16,7 +16,6 @@ package im.vector.app.features.homeserver -import android.content.Context import android.content.SharedPreferences import androidx.core.content.edit import im.vector.app.R From 0910b118ffa33b13421f017d356c2a9d8ba94671 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 17:20:03 +0200 Subject: [PATCH 111/131] Changelog --- changelog.d/7159.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7159.misc diff --git a/changelog.d/7159.misc b/changelog.d/7159.misc new file mode 100644 index 0000000000..76f5f45c40 --- /dev/null +++ b/changelog.d/7159.misc @@ -0,0 +1 @@ +Fix lint warning, and cleanup the code From 5886245bbffb6a77be4c864610b6f5ab305ca80b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 17:35:26 +0200 Subject: [PATCH 112/131] Reverse condition for code clarity with `ChecksSdkIntAtLeast` --- .../app/features/voice/VoiceRecorderProvider.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt b/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt index c024e0c6d4..05e537b2b0 100644 --- a/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt +++ b/vector/src/main/java/im/vector/app/features/voice/VoiceRecorderProvider.kt @@ -33,18 +33,18 @@ class VoiceRecorderProvider @Inject constructor( private val buildVersionSdkIntProvider: BuildVersionSdkIntProvider, ) { fun provideVoiceRecorder(): VoiceRecorder { - return if (useFallbackRecorder()) { - VoiceRecorderL(context, Dispatchers.IO) - } else { + return if (useNativeRecorder()) { VoiceRecorderQ(context) + } else { + VoiceRecorderL(context, Dispatchers.IO) } } - @ChecksSdkIntAtLeast(api = 29) - private fun useFallbackRecorder(): Boolean { - return buildVersionSdkIntProvider.get() < Build.VERSION_CODES.Q || - !hasOpusEncoder() || - vectorFeatures.forceUsageOfOpusEncoder() + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.Q) + private fun useNativeRecorder(): Boolean { + return buildVersionSdkIntProvider.get() >= Build.VERSION_CODES.Q && + hasOpusEncoder() && + !vectorFeatures.forceUsageOfOpusEncoder() } @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) From 658a09ea6aa24464b75646f0e82cca51d85d1c5a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 17:50:17 +0200 Subject: [PATCH 113/131] No need to use `@SuppressLint("NewApi")` when `@ChecksSdkIntAtLeast` is used. --- .../matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt | 3 +++ .../features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt index acbf9ca061..c8c328c92c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/util/BuildVersionSdkIntProvider.kt @@ -34,4 +34,7 @@ interface BuildVersionSdkIntProvider { result() } else null } + + @ChecksSdkIntAtLeast(parameter = 0) + fun isAtLeast(version: Int) = get() >= version } diff --git a/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt b/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt index bb55ceb1b7..84e98785f4 100644 --- a/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt +++ b/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt @@ -36,14 +36,13 @@ class LockScreenKeysMigrator @Inject constructor( /** * Performs any needed migrations in order. */ - @SuppressLint("NewApi") suspend fun migrateIfNeeded() { if (legacyPinCodeMigrator.isMigrationNeeded()) { legacyPinCodeMigrator.migrate() missingSystemKeyMigrator.migrateIfNeeded() } - if (systemKeyV1Migrator.isMigrationNeeded() && versionProvider.get() >= Build.VERSION_CODES.M) { + if (systemKeyV1Migrator.isMigrationNeeded() && versionProvider.isAtLeast(Build.VERSION_CODES.M)) { systemKeyV1Migrator.migrate() } } From 7f5c712e88b47261591408ac1009dba78ca47cfe Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 18:02:40 +0200 Subject: [PATCH 114/131] No need to use `@SuppressLint("NewApi")` when `@ChecksSdkIntAtLeast` is used - more cleanup --- .../api/securestorage/SecretStoringUtils.kt | 7 ++----- .../im/vector/app/core/extensions/Context.kt | 4 +--- .../VectorActivityLifecycleCallbacks.kt | 2 -- .../features/login/LoginCaptchaFragment.kt | 1 - .../notifications/NotificationUtils.kt | 3 --- .../onboarding/ftueauth/CaptchaWebview.kt | 1 - .../lockscreen/biometrics/BiometricHelper.kt | 2 -- .../pin/lockscreen/crypto/KeyStoreCrypto.kt | 5 +---- .../crypto/LockScreenKeysMigrator.kt | 1 - .../migrations/MissingSystemKeyMigrator.kt | 5 ++--- .../pin/lockscreen/ui/LockScreenViewModel.kt | 20 +++++++++---------- .../VectorSettingsSecurityPrivacyFragment.kt | 2 -- .../features/widgets/webview/WidgetWebView.kt | 2 -- 13 files changed, 15 insertions(+), 40 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/securestorage/SecretStoringUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/securestorage/SecretStoringUtils.kt index e701e0f3ba..234a8eee98 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/securestorage/SecretStoringUtils.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/securestorage/SecretStoringUtils.kt @@ -131,11 +131,10 @@ class SecretStoringUtils @Inject constructor( * * The secret is encrypted using the following method: AES/GCM/NoPadding */ - @SuppressLint("NewApi") @Throws(Exception::class) fun securelyStoreBytes(secret: ByteArray, keyAlias: String): ByteArray { return when { - buildVersionSdkIntProvider.get() >= Build.VERSION_CODES.M -> encryptBytesM(secret, keyAlias) + buildVersionSdkIntProvider.isAtLeast(Build.VERSION_CODES.M) -> encryptBytesM(secret, keyAlias) else -> encryptBytes(secret, keyAlias) } } @@ -156,10 +155,9 @@ class SecretStoringUtils @Inject constructor( } } - @SuppressLint("NewApi") fun securelyStoreObject(any: Any, keyAlias: String, output: OutputStream) { when { - buildVersionSdkIntProvider.get() >= Build.VERSION_CODES.M -> saveSecureObjectM(keyAlias, output, any) + buildVersionSdkIntProvider.isAtLeast(Build.VERSION_CODES.M) -> saveSecureObjectM(keyAlias, output, any) else -> saveSecureObject(keyAlias, output, any) } } @@ -189,7 +187,6 @@ class SecretStoringUtils @Inject constructor( return cipher } - @SuppressLint("NewApi") @RequiresApi(Build.VERSION_CODES.M) private fun getOrGenerateSymmetricKeyForAliasM(alias: String): SecretKey { val secretKeyEntry = (keyStore.getEntry(alias, null) as? KeyStore.SecretKeyEntry) diff --git a/vector/src/main/java/im/vector/app/core/extensions/Context.kt b/vector/src/main/java/im/vector/app/core/extensions/Context.kt index 1ed5aa8ba1..2e3e8c9306 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/Context.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/Context.kt @@ -16,7 +16,6 @@ package im.vector.app.core.extensions -import android.annotation.SuppressLint import android.content.Context import android.graphics.drawable.Drawable import android.net.ConnectivityManager @@ -91,10 +90,9 @@ fun Context.safeOpenOutputStream(uri: Uri): OutputStream? { * * @return true if no active connection is found */ -@SuppressLint("NewApi") // false positive fun Context.inferNoConnectivity(sdkIntProvider: BuildVersionSdkIntProvider): Boolean { val connectivityManager = getSystemService()!! - return if (sdkIntProvider.get() > Build.VERSION_CODES.M) { + return if (sdkIntProvider.isAtLeast(Build.VERSION_CODES.M)) { val networkCapabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) when { networkCapabilities?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> false diff --git a/vector/src/main/java/im/vector/app/features/lifecycle/VectorActivityLifecycleCallbacks.kt b/vector/src/main/java/im/vector/app/features/lifecycle/VectorActivityLifecycleCallbacks.kt index 75f02c36d7..c884843f5c 100644 --- a/vector/src/main/java/im/vector/app/features/lifecycle/VectorActivityLifecycleCallbacks.kt +++ b/vector/src/main/java/im/vector/app/features/lifecycle/VectorActivityLifecycleCallbacks.kt @@ -16,7 +16,6 @@ package im.vector.app.features.lifecycle -import android.annotation.SuppressLint import android.app.Activity import android.app.ActivityManager import android.app.Application @@ -91,7 +90,6 @@ class VectorActivityLifecycleCallbacks constructor(private val popupAlertManager * * @return true if an app task is corrupted by a potentially malicious activity */ - @SuppressLint("NewApi") private suspend fun isTaskCorrupted(activity: Activity): Boolean = withContext(Dispatchers.Default) { val context = activity.applicationContext val packageManager: PackageManager = context.packageManager diff --git a/vector/src/main/java/im/vector/app/features/login/LoginCaptchaFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginCaptchaFragment.kt index 25403b06f3..b082e37933 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginCaptchaFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginCaptchaFragment.kt @@ -144,7 +144,6 @@ class LoginCaptchaFragment : // runOnUiThread(Runnable { finish() }) } - @SuppressLint("NewApi") override fun onReceivedHttpError(view: WebView, request: WebResourceRequest, errorResponse: WebResourceResponse) { super.onReceivedHttpError(view, request, errorResponse) diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt index cef94b5db2..7e91a89603 100755 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt @@ -218,7 +218,6 @@ class NotificationUtils @Inject constructor( * @param withProgress true to show indeterminate progress on the notification * @return the polling thread listener notification */ - @SuppressLint("NewApi") fun buildForegroundServiceNotification(@StringRes subTitleResId: Int, withProgress: Boolean = true): Notification { // build the pending intent go to the home screen if this is clicked. val i = HomeActivity.newIntent(context, firstStartMainActivity = false) @@ -287,7 +286,6 @@ class NotificationUtils @Inject constructor( * @param fromBg true if the app is in background when posting the notification * @return the call notification. */ - @SuppressLint("NewApi") fun buildIncomingCallNotification( call: WebRtcCall, title: String, @@ -420,7 +418,6 @@ class NotificationUtils @Inject constructor( * @param title title of the notification * @return the call notification. */ - @SuppressLint("NewApi") fun buildPendingCallNotification( call: WebRtcCall, title: String diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/CaptchaWebview.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/CaptchaWebview.kt index 23c6c13b5e..11f257c4e8 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/CaptchaWebview.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/CaptchaWebview.kt @@ -92,7 +92,6 @@ class CaptchaWebview @Inject constructor( Timber.e("## onError() : $errorMessage") } - @SuppressLint("NewApi") override fun onReceivedHttpError(view: WebView, request: WebResourceRequest, errorResponse: WebResourceResponse) { super.onReceivedHttpError(view, request, errorResponse) when { diff --git a/vector/src/main/java/im/vector/app/features/pin/lockscreen/biometrics/BiometricHelper.kt b/vector/src/main/java/im/vector/app/features/pin/lockscreen/biometrics/BiometricHelper.kt index 9bcf6e4264..026ee159ed 100644 --- a/vector/src/main/java/im/vector/app/features/pin/lockscreen/biometrics/BiometricHelper.kt +++ b/vector/src/main/java/im/vector/app/features/pin/lockscreen/biometrics/BiometricHelper.kt @@ -16,7 +16,6 @@ package im.vector.app.features.pin.lockscreen.biometrics -import android.annotation.SuppressLint import android.content.Context import android.os.Build import androidx.annotation.MainThread @@ -156,7 +155,6 @@ class BiometricHelper @AssistedInject constructor( return authenticate(activity) } - @SuppressLint("NewApi") @OptIn(ExperimentalCoroutinesApi::class) private fun authenticateInternal( activity: FragmentActivity, diff --git a/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/KeyStoreCrypto.kt b/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/KeyStoreCrypto.kt index a42ce3a9b7..fd676f1662 100644 --- a/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/KeyStoreCrypto.kt +++ b/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/KeyStoreCrypto.kt @@ -16,7 +16,6 @@ package im.vector.app.features.pin.lockscreen.crypto -import android.annotation.SuppressLint import android.content.Context import android.os.Build import android.security.keystore.KeyPermanentlyInvalidatedException @@ -55,7 +54,6 @@ class KeyStoreCrypto @AssistedInject constructor( * Ensures a [Key] for the [alias] exists and validates it. * @throws KeyPermanentlyInvalidatedException if key is not valid. */ - @SuppressLint("NewApi") @Throws(KeyPermanentlyInvalidatedException::class) fun ensureKey() = secretStoringUtils.ensureKey(alias).also { // Check validity of Key by initializing an encryption Cipher @@ -109,10 +107,9 @@ class KeyStoreCrypto @AssistedInject constructor( /** * Check if the key associated with the [alias] is valid. */ - @SuppressLint("NewApi") fun hasValidKey(): Boolean { val keyExists = hasKey() - return if (buildVersionSdkIntProvider.get() >= Build.VERSION_CODES.M && keyExists) { + return if (buildVersionSdkIntProvider.isAtLeast(Build.VERSION_CODES.M) && keyExists) { val initializedKey = tryOrNull("Error validating lockscreen system key.") { ensureKey() } initializedKey != null } else { diff --git a/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt b/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt index 84e98785f4..c2d70a3734 100644 --- a/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt +++ b/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/LockScreenKeysMigrator.kt @@ -16,7 +16,6 @@ package im.vector.app.features.pin.lockscreen.crypto -import android.annotation.SuppressLint import android.os.Build import im.vector.app.features.pin.lockscreen.crypto.migrations.LegacyPinCodeMigrator import im.vector.app.features.pin.lockscreen.crypto.migrations.MissingSystemKeyMigrator diff --git a/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/migrations/MissingSystemKeyMigrator.kt b/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/migrations/MissingSystemKeyMigrator.kt index 4c33c14954..7593aa6de3 100644 --- a/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/migrations/MissingSystemKeyMigrator.kt +++ b/vector/src/main/java/im/vector/app/features/pin/lockscreen/crypto/migrations/MissingSystemKeyMigrator.kt @@ -16,7 +16,6 @@ package im.vector.app.features.pin.lockscreen.crypto.migrations -import android.annotation.SuppressLint import android.os.Build import im.vector.app.features.pin.lockscreen.crypto.KeyStoreCrypto import im.vector.app.features.pin.lockscreen.di.BiometricKeyAlias @@ -38,9 +37,9 @@ class MissingSystemKeyMigrator @Inject constructor( /** * If user had biometric auth enabled, ensure system key exists, creating one if needed. */ - @SuppressLint("NewApi") fun migrateIfNeeded() { - if (buildVersionSdkIntProvider.get() >= Build.VERSION_CODES.M && vectorPreferences.useBiometricsToUnlock()) { + if (buildVersionSdkIntProvider.isAtLeast(Build.VERSION_CODES.M) && + vectorPreferences.useBiometricsToUnlock()) { val systemKeyStoreCrypto = keystoreCryptoFactory.provide(systemKeyAlias, true) runCatching { systemKeyStoreCrypto.ensureKey() diff --git a/vector/src/main/java/im/vector/app/features/pin/lockscreen/ui/LockScreenViewModel.kt b/vector/src/main/java/im/vector/app/features/pin/lockscreen/ui/LockScreenViewModel.kt index 33ea590f1d..87d3f93f9b 100644 --- a/vector/src/main/java/im/vector/app/features/pin/lockscreen/ui/LockScreenViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/pin/lockscreen/ui/LockScreenViewModel.kt @@ -16,7 +16,6 @@ package im.vector.app.features.pin.lockscreen.ui -import android.annotation.SuppressLint import android.app.KeyguardManager import android.os.Build import android.security.keystore.KeyPermanentlyInvalidatedException @@ -139,12 +138,12 @@ class LockScreenViewModel @AssistedInject constructor( } }.launchIn(viewModelScope) - @SuppressLint("NewApi") private fun showBiometricPrompt(activity: FragmentActivity) = flow { emitAll(biometricHelper.authenticate(activity)) }.catch { error -> when { - versionProvider.get() >= Build.VERSION_CODES.M && error is KeyPermanentlyInvalidatedException -> { + versionProvider.isAtLeast(Build.VERSION_CODES.M) && + error is KeyPermanentlyInvalidatedException -> { onBiometricKeyInvalidated() } else -> { @@ -168,15 +167,14 @@ class LockScreenViewModel @AssistedInject constructor( _viewEvents.post(LockScreenViewEvent.ShowBiometricKeyInvalidatedMessage) } - @SuppressLint("NewApi") private suspend fun updateStateWithBiometricInfo() { // This is a terrible hack, but I found no other way to ensure this would be called only after the device is considered unlocked on Android 12+ waitUntilKeyguardIsUnlocked() setState { val isBiometricKeyInvalidated = biometricHelper.hasSystemKey && !biometricHelper.isSystemKeyValid val canUseBiometricAuth = lockScreenConfiguration.mode == LockScreenMode.VERIFY && - !isSystemAuthTemporarilyDisabledByBiometricPrompt && - biometricHelper.isSystemAuthEnabledAndValid + !isSystemAuthTemporarilyDisabledByBiometricPrompt && + biometricHelper.isSystemAuthEnabledAndValid val showBiometricPromptAutomatically = canUseBiometricAuth && lockScreenConfiguration.autoStartBiometric copy( canUseBiometricAuth = canUseBiometricAuth, @@ -191,12 +189,12 @@ class LockScreenViewModel @AssistedInject constructor( * after an Activity's `onResume` method. If we mix that with the system keys needing the device to be unlocked before they're used, we get crashes. * See issue [#6768](https://github.com/vector-im/element-android/issues/6768). */ - @SuppressLint("NewApi") private suspend fun waitUntilKeyguardIsUnlocked() { - if (versionProvider.get() < Build.VERSION_CODES.S) return - withTimeoutOrNull(5.seconds) { - while (keyguardManager.isDeviceLocked) { - delay(50.milliseconds) + if (versionProvider.isAtLeast(Build.VERSION_CODES.S)) { + withTimeoutOrNull(5.seconds) { + while (keyguardManager.isDeviceLocked) { + delay(50.milliseconds) + } } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt index ecb1779a4a..5cbdf114a5 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt @@ -17,7 +17,6 @@ package im.vector.app.features.settings -import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.net.Uri @@ -448,7 +447,6 @@ class VectorSettingsSecurityPrivacyFragment : /** * Manage the e2e keys import. */ - @SuppressLint("NewApi") private fun importKeys() { openFileSelection( requireActivity(), diff --git a/vector/src/main/java/im/vector/app/features/widgets/webview/WidgetWebView.kt b/vector/src/main/java/im/vector/app/features/widgets/webview/WidgetWebView.kt index ac9930866f..254a7f97f5 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/webview/WidgetWebView.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/webview/WidgetWebView.kt @@ -16,7 +16,6 @@ package im.vector.app.features.widgets.webview -import android.annotation.SuppressLint import android.app.Activity import android.view.ViewGroup import android.webkit.CookieManager @@ -29,7 +28,6 @@ import im.vector.app.features.themes.ThemeUtils import im.vector.app.features.webview.VectorWebViewClient import im.vector.app.features.webview.WebEventListener -@SuppressLint("NewApi") fun WebView.setupForWidget(activity: Activity, checkWebViewPermissionsUseCase: CheckWebViewPermissionsUseCase, eventListener: WebEventListener, From 0559911f39e7cf537b1c3cdaad6b207d1699478d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 22:53:32 +0200 Subject: [PATCH 115/131] Fix non passing tests --- .../app/TestBuildVersionSdkIntProvider.kt | 4 +--- .../migrations/LegacyPinCodeMigratorTests.kt | 23 +++++++++---------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/vector/src/androidTest/java/im/vector/app/TestBuildVersionSdkIntProvider.kt b/vector/src/androidTest/java/im/vector/app/TestBuildVersionSdkIntProvider.kt index ddf89b5e46..b3f9c65800 100644 --- a/vector/src/androidTest/java/im/vector/app/TestBuildVersionSdkIntProvider.kt +++ b/vector/src/androidTest/java/im/vector/app/TestBuildVersionSdkIntProvider.kt @@ -18,8 +18,6 @@ package im.vector.app import org.matrix.android.sdk.api.util.BuildVersionSdkIntProvider -class TestBuildVersionSdkIntProvider : BuildVersionSdkIntProvider { - var value: Int = 0 - +class TestBuildVersionSdkIntProvider(var value: Int = 0) : BuildVersionSdkIntProvider { override fun get() = value } diff --git a/vector/src/androidTest/java/im/vector/app/features/pin/lockscreen/crypto/migrations/LegacyPinCodeMigratorTests.kt b/vector/src/androidTest/java/im/vector/app/features/pin/lockscreen/crypto/migrations/LegacyPinCodeMigratorTests.kt index 44c5db89c8..5f1ba8876a 100644 --- a/vector/src/androidTest/java/im/vector/app/features/pin/lockscreen/crypto/migrations/LegacyPinCodeMigratorTests.kt +++ b/vector/src/androidTest/java/im/vector/app/features/pin/lockscreen/crypto/migrations/LegacyPinCodeMigratorTests.kt @@ -25,6 +25,7 @@ import android.security.keystore.KeyProperties import android.util.Base64 import androidx.preference.PreferenceManager import androidx.test.platform.app.InstrumentationRegistry +import im.vector.app.TestBuildVersionSdkIntProvider import im.vector.app.features.pin.PinCodeStore import im.vector.app.features.pin.SharedPrefPinCodeStore import im.vector.app.features.pin.lockscreen.crypto.LockScreenCryptoConstants.ANDROID_KEY_STORE @@ -32,7 +33,6 @@ import im.vector.app.features.pin.lockscreen.crypto.LockScreenCryptoConstants.LE import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every -import io.mockk.mockk import io.mockk.spyk import io.mockk.verify import kotlinx.coroutines.runBlocking @@ -42,7 +42,6 @@ import org.amshove.kluent.shouldBeEqualTo import org.junit.After import org.junit.Test import org.matrix.android.sdk.api.securestorage.SecretStoringUtils -import org.matrix.android.sdk.api.util.BuildVersionSdkIntProvider import java.math.BigInteger import java.security.KeyFactory import java.security.KeyPairGenerator @@ -66,9 +65,7 @@ class LegacyPinCodeMigratorTests { SharedPrefPinCodeStore(PreferenceManager.getDefaultSharedPreferences(InstrumentationRegistry.getInstrumentation().context)) ) private val keyStore: KeyStore = spyk(KeyStore.getInstance(ANDROID_KEY_STORE)).also { it.load(null) } - private val buildVersionSdkIntProvider: BuildVersionSdkIntProvider = mockk { - every { get() } returns Build.VERSION_CODES.M - } + private val buildVersionSdkIntProvider = TestBuildVersionSdkIntProvider(Build.VERSION_CODES.M) private val secretStoringUtils: SecretStoringUtils = spyk( SecretStoringUtils(context, keyStore, buildVersionSdkIntProvider) ) @@ -126,6 +123,7 @@ class LegacyPinCodeMigratorTests { @Test fun migratePinCodeM() = runTest { val pinCode = "1234" + buildVersionSdkIntProvider.value = Build.VERSION_CODES.M saveLegacyPinCode(pinCode) legacyPinCodeMigrator.migrate() @@ -144,7 +142,7 @@ class LegacyPinCodeMigratorTests { @Test fun migratePinCodeL() = runTest { val pinCode = "1234" - every { buildVersionSdkIntProvider.get() } returns Build.VERSION_CODES.LOLLIPOP + buildVersionSdkIntProvider.value = Build.VERSION_CODES.LOLLIPOP saveLegacyPinCode(pinCode) legacyPinCodeMigrator.migrate() @@ -163,7 +161,7 @@ class LegacyPinCodeMigratorTests { private fun generateLegacyKey() { if (keyStore.containsAlias(LEGACY_PIN_CODE_KEY_ALIAS)) return - if (buildVersionSdkIntProvider.get() >= Build.VERSION_CODES.M) { + if (buildVersionSdkIntProvider.isAtLeast(Build.VERSION_CODES.M)) { generateLegacyKeyM() } else { generateLegacyKeyL() @@ -206,7 +204,7 @@ class LegacyPinCodeMigratorTests { generateLegacyKey() val publicKey = keyStore.getCertificate(LEGACY_PIN_CODE_KEY_ALIAS).publicKey val cipher = getLegacyCipher() - if (buildVersionSdkIntProvider.get() >= Build.VERSION_CODES.M) { + if (buildVersionSdkIntProvider.isAtLeast(Build.VERSION_CODES.M)) { val unrestrictedKey = KeyFactory.getInstance(publicKey.algorithm).generatePublic(X509EncodedKeySpec(publicKey.encoded)) val spec = OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT) cipher.init(Cipher.ENCRYPT_MODE, unrestrictedKey, spec) @@ -219,14 +217,15 @@ class LegacyPinCodeMigratorTests { } private fun getLegacyCipher(): Cipher { - return when (buildVersionSdkIntProvider.get()) { - Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.LOLLIPOP_MR1 -> getCipherL() - else -> getCipherM() + return if (buildVersionSdkIntProvider.isAtLeast(Build.VERSION_CODES.M)) { + getCipherM() + } else { + getCipherL() } } private fun getCipherL(): Cipher { - val provider = if (buildVersionSdkIntProvider.get() < Build.VERSION_CODES.M) "AndroidOpenSSL" else "AndroidKeyStoreBCWorkaround" + val provider = if (buildVersionSdkIntProvider.isAtLeast(Build.VERSION_CODES.M)) "AndroidKeyStoreBCWorkaround" else "AndroidOpenSSL" val transformation = "RSA/ECB/PKCS1Padding" return Cipher.getInstance(transformation, provider) } From 3600e374f2a20f3536e228ab312fb7025d563e30 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 16 Sep 2022 22:54:49 +0200 Subject: [PATCH 116/131] Avoid code duplication --- .../migrations/LegacyPinCodeMigratorTests.kt | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/vector/src/androidTest/java/im/vector/app/features/pin/lockscreen/crypto/migrations/LegacyPinCodeMigratorTests.kt b/vector/src/androidTest/java/im/vector/app/features/pin/lockscreen/crypto/migrations/LegacyPinCodeMigratorTests.kt index 5f1ba8876a..8c50806fd9 100644 --- a/vector/src/androidTest/java/im/vector/app/features/pin/lockscreen/crypto/migrations/LegacyPinCodeMigratorTests.kt +++ b/vector/src/androidTest/java/im/vector/app/features/pin/lockscreen/crypto/migrations/LegacyPinCodeMigratorTests.kt @@ -122,27 +122,18 @@ class LegacyPinCodeMigratorTests { @Test fun migratePinCodeM() = runTest { - val pinCode = "1234" buildVersionSdkIntProvider.value = Build.VERSION_CODES.M - saveLegacyPinCode(pinCode) - - legacyPinCodeMigrator.migrate() - - coVerify { legacyPinCodeMigrator.getDecryptedPinCode() } - verify { secretStoringUtils.securelyStoreBytes(any(), any()) } - coVerify { pinCodeStore.savePinCode(any()) } - verify { keyStore.deleteEntry(LEGACY_PIN_CODE_KEY_ALIAS) } - - val decodedPinCode = String(secretStoringUtils.loadSecureSecretBytes(Base64.decode(pinCodeStore.getPinCode().orEmpty(), Base64.NO_WRAP), alias)) - decodedPinCode shouldBeEqualTo pinCode - keyStore.containsAlias(LEGACY_PIN_CODE_KEY_ALIAS) shouldBe false - keyStore.containsAlias(alias) shouldBe true + migratePinCode() } @Test fun migratePinCodeL() = runTest { - val pinCode = "1234" buildVersionSdkIntProvider.value = Build.VERSION_CODES.LOLLIPOP + migratePinCode() + } + + private suspend fun migratePinCode() { + val pinCode = "1234" saveLegacyPinCode(pinCode) legacyPinCodeMigrator.migrate() From 086a6ee9a1ec233223d7420a1769e8ff6787f024 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 16:39:35 +0200 Subject: [PATCH 117/131] Update after Ganfra's review --- docs/_developer_onboarding.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/_developer_onboarding.md b/docs/_developer_onboarding.md index 543cbeba71..8836b019b7 100644 --- a/docs/_developer_onboarding.md +++ b/docs/_developer_onboarding.md @@ -61,14 +61,14 @@ There are many object and data in the Matrix worlds. Let's focus on the most imp ##### Event -`Events` are item of a Room, where data is embedded. +`Events` are items of a Room, where data is embedded. -There are 2 types of Event: +There are 2 types of Room Event: -- Room Events: contain useful content for the user (message, image, etc.), but are not necessarily displayed as this in the timeline (reaction, message edition, call signaling). +- Regular Events: contain useful content for the user (message, image, etc.), but are not necessarily displayed as this in the timeline (reaction, message edition, call signaling). - State Events: contain the state of the Room (name, topic, etc.). They have a non null value for the key `state_key`. -Also all the Room Member details are State Events: one State Event per member. In this casen the `state_key` is the matrixId (= userId). +Also all the Room Member details are in State Events: one State Event per member. In this case, the `state_key` is the matrixId (= userId). Important Fields of an Event: - `event_id`: unique across the Matrix universe; From 828413c2c5b4b7a28f6d7a5b30a5bbed6bda3fbb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 16:40:34 +0200 Subject: [PATCH 118/131] Fix some typo --- docs/_developer_onboarding.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_developer_onboarding.md b/docs/_developer_onboarding.md index 8836b019b7..2f414063e3 100644 --- a/docs/_developer_onboarding.md +++ b/docs/_developer_onboarding.md @@ -100,7 +100,7 @@ The project should compile out of the box. The project is split into several modules. The main ones are: For the app - `vector-app`: application entry point; -- `vector`: legacy application, but now a library. In the process of being splitted into several modules; +- `vector`: legacy application, but now a library. In the process of being split into several modules; - `vector-config`: this is where all the configuration of the application should occurs. Should because we are in the process of migrating all the configuration here; - `library/ui-strings`: this is where all the string resources are stored. Please refer to [contributing doc](../CONTRIBUTING.md) to know how to make change on this module; - `library/ui-styles`: this is where the Android styles are defined. @@ -197,7 +197,7 @@ This is the classical scenario: All the dependencies are declared in `build.gradle` files. But some versions are declared in [this dedicated file](../dependencies.gradle). -When adding a new dependency, you will have to update the file [dependencies_groups.gradle](../dependencies_groups.gradle) to allow the dependency to be downloaded from the artifact repository. Sometimes subdependencies need to be added too, until the project can compile. +When adding a new dependency, you will have to update the file [dependencies_groups.gradle](../dependencies_groups.gradle) to allow the dependency to be downloaded from the artifact repository. Sometimes sub-dependencies need to be added too, until the project can compile. [Dependabot](https://github.com/dependabot) is set up on the project. This tool will automatically create Pull Request to upgrade our dependencies one by one. dependencies_group, gradle files, Dependabot, etc. @@ -243,7 +243,7 @@ Rageshake can be very useful to get logs from a release version of the applicati ### Tips - Element Android has a `developer mode` in the `Settings/Advanced settings`. Other useful options are available here; -- Show hidden Events can also help to debug feature. When devepor mode is enabled, it is possible to view the source (= the Json content) of any Events; +- Show hidden Events can also help to debug feature. When developer mode is enabled, it is possible to view the source (= the Json content) of any Events; - Type `/devtools` in a Room composer to access a developer menu. There are some other entry points. Developer mode has to be enabled; - Hidden debug menu: when developer mode is enabled and on debug build, there are some extra screens that can be accessible using the green wheel. In those screens, it will be possible to toggle some feature flags; - Using logcat, filtering with `onResume` can help you to understand what screen are currently displayed on your device. Searching for string displayed on the screen can also help to find the running code in the codebase. From cefe2e9ef49fff5cc5b0566a642dff4e3237ebae Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 17:03:45 +0200 Subject: [PATCH 119/131] Add a rule to Danger to check that translation files are not modified by developers. --- docs/danger.md | 1 + tools/danger/dangerfile.js | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/docs/danger.md b/docs/danger.md index afa3555469..34baa62e9e 100644 --- a/docs/danger.md +++ b/docs/danger.md @@ -28,6 +28,7 @@ Here are the checks that Danger does so far: - PR with change on layout should include screenshot in the description - PR which adds png file warn about the usage of vector drawables - non draft PR should have a reviewer +- files containing translations are not modified by developers ### Quality check diff --git a/tools/danger/dangerfile.js b/tools/danger/dangerfile.js index c7db52fa19..6314ec8f68 100644 --- a/tools/danger/dangerfile.js +++ b/tools/danger/dangerfile.js @@ -118,3 +118,10 @@ if (hasPngs) { if (github.requested_reviewers.users.length == 0 && !pr.draft) { warn("Please add a reviewer to your PR.") } + +// Check that translations have not been modified by developers +if (user != "RiotTranslateBot") { + if (editedFiles.some(file => file.endsWith("strings.xml") && !file.endsWith("values/strings.xml"))) { + fail("Some translation files have been edited. Only user `RiotTranslateBot` (i.e. translations coming from Weblate) is allowed to do that.\nPlease read more about translations management [in the doc](https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#internationalisation).") + } +} From a7856db218db6c24fb186383a364259db522f092 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 17:10:46 +0200 Subject: [PATCH 120/131] Add a section about renaming id of String resource --- CONTRIBUTING.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 52ccf47e6a..e01e1affe8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -120,7 +120,7 @@ You should consider adding Unit tests with your PR, and also integration tests ( Translations are handled using an external tool: [Weblate](https://translate.element.io/projects/element-android/) -As a general rule, please never edit or add or remove translations to the project in a Pull Request. It can lead to merge conflict if the translations are also modified in Weblate side. +**As a general rule, please never edit or add or remove translations to the project in a Pull Request**. It can lead to merge conflict if the translations are also modified in Weblate side. Pull Request containing change(s) on the translation files cannot be merged. #### Adding new string @@ -150,6 +150,17 @@ And add `tools:ignore="UnusedResources"` to the string, to let lint ignore that The string will be removed during the next sync with Weblate. +#### Renaming string ids + +This is possible to rename ids of the String resources, but since translation files cannot be edited, add TODO in the main strings.xml file above the strings you want to rename. + +```xml + +Hello Matrix world! +``` + +The string id(s) will be renamed during the next Weblate sync. + ### Accessibility Please consider accessibility as an important point. As a minimum requirement, in layout XML files please use attributes such as `android:contentDescription` and `android:importantForAccessibility`, and test with a screen reader if it's working well. You can add new string resources, dedicated to accessibility, in this case, please prefix theirs id with `a11y_`. From 729eba750ba5f5faf0241627dd8e018dfcfd12f1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 17:19:57 +0200 Subject: [PATCH 121/131] Add link to the file values/strings.xml, and fix typo in the path. --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e01e1affe8..11f6a93dd1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -124,11 +124,11 @@ Translations are handled using an external tool: [Weblate](https://translate.ele #### Adding new string -When adding new string resources, please only add new entries in the file `value/strings.xml`. Translations will be added later by the community of translators using Weblate. +When adding new string resources, please only add new entries in the file `values/strings.xml` ([this file](./library/ui-strings/src/main/res/values/strings.xml)). Translations will be added later by the community of translators using Weblate. -The file `value/strings.xml` must only contain American English (U. S. English) values, as this is the default language of the Android operating system. So for instance, please use "color" instead of "colour". Element Android will still use the language set on the system by the user, like any other Android applications which provide translations. The system language can be any other English language variants, or any other languages. Note that this is also possible to override the system language using the Element Android in-app language settings. +The file `values/strings.xml` must only contain American English (U. S. English) values, as this is the default language of the Android operating system. So for instance, please use "color" instead of "colour". Element Android will still use the language set on the system by the user, like any other Android applications which provide translations. The system language can be any other English language variants, or any other languages. Note that this is also possible to override the system language using the Element Android in-app language settings. -New strings can be added anywhere in the file `value/strings.xml`, not necessarily at the end of the file. Generally, it's even better to add the new strings in some dedicated section per feature, and not at the end of the file, to avoid merge conflict between 2 PR adding strings at the end of the same file. +New strings can be added anywhere in the file `values/strings.xml`, not necessarily at the end of the file. Generally, it's even better to add the new strings in some dedicated section per feature, and not at the end of the file, to avoid merge conflict between 2 PR adding strings at the end of the same file. Do not hesitate to use plurals when appropriate. From 97c3623f89af7fece9674c410eb3af8ab1b7cbea Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 17:15:13 +0200 Subject: [PATCH 122/131] Add a note for plurals --- CONTRIBUTING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 11f6a93dd1..c3df2b7101 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -130,7 +130,11 @@ The file `values/strings.xml` must only contain American English (U. S. English) New strings can be added anywhere in the file `values/strings.xml`, not necessarily at the end of the file. Generally, it's even better to add the new strings in some dedicated section per feature, and not at the end of the file, to avoid merge conflict between 2 PR adding strings at the end of the same file. -Do not hesitate to use plurals when appropriate. +##### Plurals + +Please use `plurals` resources when appropriate, and note that some languages have specific rules for `plurals`, so even if the string will always be at the plural form for English, please always create a `plurals` resource. + +Specific plural forms can be found [here](https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_plural_rules.html). #### Editing existing strings From 6e2ce10f655a16532c57ca464744e282c2c43e24 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 17:22:17 +0200 Subject: [PATCH 123/131] Add a note for string reordering --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c3df2b7101..8f193c4b72 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -165,6 +165,12 @@ This is possible to rename ids of the String resources, but since translation fi The string id(s) will be renamed during the next Weblate sync. +#### Reordering strings + +To group strings per feature, or for any other reasons, it is possible to reorder string resources, but only in the [main strings.xml file](./library/ui-strings/src/main/res/values/strings.xml). ). We do not mind about ordering in the translation files, and anyway this is forbidden to edit manually the translation files. + +It is also possible to add empty lines between string resources, and to add XML comments. Please note that the XML comment just above a String resource will also appear on Weblate and be visible to the translators. + ### Accessibility Please consider accessibility as an important point. As a minimum requirement, in layout XML files please use attributes such as `android:contentDescription` and `android:importantForAccessibility`, and test with a screen reader if it's working well. You can add new string resources, dedicated to accessibility, in this case, please prefix theirs id with `a11y_`. From c56f33a9398c37db74cf5ba84975f27ce58431c8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 17:36:08 +0200 Subject: [PATCH 124/131] Add changelog --- changelog.d/7211.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7211.misc diff --git a/changelog.d/7211.misc b/changelog.d/7211.misc new file mode 100644 index 0000000000..44abd3d59d --- /dev/null +++ b/changelog.d/7211.misc @@ -0,0 +1 @@ + CI: Prevent modification of translations by developer. From a07761dedb25a73085cc13159e6378077ee5a6c7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 17:48:38 +0200 Subject: [PATCH 125/131] Fix issue with knit. --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8f193c4b72..b71e697636 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -159,7 +159,7 @@ The string will be removed during the next sync with Weblate. This is possible to rename ids of the String resources, but since translation files cannot be edited, add TODO in the main strings.xml file above the strings you want to rename. ```xml - + Hello Matrix world! ``` From a5ab942097cbf462b56e99e5457cccc8a61d4d4b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 22 Sep 2022 17:52:52 +0200 Subject: [PATCH 126/131] Add TOC to CONTRIBUTING.md --- CONTRIBUTING.md | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b71e697636..6e3c784dac 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,10 +1,42 @@ -# Contributing code to Matrix +# Contributing to Element Android + + + +* [Contributing code to Matrix](#contributing-code-to-matrix) +* [Android Studio settings](#android-studio-settings) + * [Template](#template) +* [Compilation](#compilation) +* [I want to help translating Element](#i-want-to-help-translating-element) +* [I want to submit a PR to fix an issue](#i-want-to-submit-a-pr-to-fix-an-issue) + * [Kotlin](#kotlin) + * [Changelog](#changelog) + * [Code quality](#code-quality) + * [Internal tool](#internal-tool) + * [ktlint](#ktlint) + * [lint](#lint) + * [Unit tests](#unit-tests) + * [Tests](#tests) + * [Internationalisation](#internationalisation) + * [Adding new string](#adding-new-string) + * [Plurals](#plurals) + * [Editing existing strings](#editing-existing-strings) + * [Removing existing strings](#removing-existing-strings) + * [Renaming string ids](#renaming-string-ids) + * [Reordering strings](#reordering-strings) + * [Accessibility](#accessibility) + * [Layout](#layout) + * [Authors](#authors) +* [Thanks](#thanks) + + + +## Contributing code to Matrix Please read https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.md Element Android support can be found in this room: [![Element Android Matrix room #element-android:matrix.org](https://img.shields.io/matrix/element-android:matrix.org.svg?label=%23element-android:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#element-android:matrix.org). -# Specific rules for Matrix Android projects +The rest of the document contains specific rules for Matrix Android projects ## Android Studio settings From 8d94643ff78bdac683423afb6479b26bf7e673cd Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 22 Sep 2022 15:58:49 +0200 Subject: [PATCH 127/131] RoomList: revert changes on LiveData and fix previous issues (not updated list) --- .../list/home/HomeFilteredRoomsController.kt | 8 ---- .../room/list/home/HomeRoomListFragment.kt | 10 ++--- .../room/list/home/HomeRoomListViewModel.kt | 38 +++++++++++-------- .../room/list/home/HomeRoomListViewState.kt | 3 -- 4 files changed, 26 insertions(+), 33 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt index 2b4a514750..ebf322dc23 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt @@ -16,7 +16,6 @@ package im.vector.app.features.home.room.list.home -import androidx.paging.PagedList import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.paging.PagedListEpoxyController import im.vector.app.core.platform.StateView @@ -76,13 +75,6 @@ class HomeFilteredRoomsController @Inject constructor( this.emptyStateData = state } - fun submitPagedList(newList: PagedList) { - submitList(newList) - if (newList.isEmpty()) { - requestForcedModelBuild() - } - } - override fun buildItemModel(currentPosition: Int, item: RoomSummary?): EpoxyModel<*> { return if (item == null) { val host = this diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt index 9b8a686f37..767da24388 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt @@ -152,12 +152,10 @@ class HomeRoomListFragment : headersController.submitData(it) } - roomListViewModel.onEach(HomeRoomListViewState::roomsPagedList) { roomsList -> - roomsList?.let { - roomsController.submitPagedList(it) - if (it.isEmpty()) { - roomsController.requestForcedModelBuild() - } + roomListViewModel.roomsLivePagedList.observe(viewLifecycleOwner) { roomsList -> + roomsController.submitList(roomsList) + if (roomsList.isEmpty()) { + roomsController.requestForcedModelBuild() } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt index ad2656cec1..41cf2189c0 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt @@ -17,8 +17,11 @@ package im.vector.app.features.home.room.list.home import android.widget.ImageView -import androidx.lifecycle.asFlow +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Observer import androidx.paging.PagedList +import arrow.core.Option import arrow.core.toOption import com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted @@ -35,7 +38,6 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.room.list.home.header.HomeRoomFilter import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow @@ -69,7 +71,6 @@ import org.matrix.android.sdk.api.session.room.state.isPublic import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.flow.flow -import java.util.concurrent.CancellationException class HomeRoomListViewModel @AssistedInject constructor( @Assisted initialState: HomeRoomListViewState, @@ -87,19 +88,24 @@ class HomeRoomListViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() + private var roomsFlow: Flow>? = null private val pagedListConfig = PagedList.Config.Builder() .setPageSize(10) .setInitialLoadSizeHint(20) .setEnablePlaceholders(true) - .setPrefetchDistance(10) .build() + private val _roomsLivePagedList = MutableLiveData>() + val roomsLivePagedList: LiveData> = _roomsLivePagedList + + private val internalPagedListObserver = Observer> { + _roomsLivePagedList.postValue(it) + } + private var currentFilter: HomeRoomFilter = HomeRoomFilter.ALL private val _emptyStateFlow = MutableSharedFlow>(replay = 1) val emptyStateFlow = _emptyStateFlow.asSharedFlow() - private var roomsFlowJob: Job? = null - private var filteredPagedRoomSummariesLive: UpdatableLivePageResult? = null init { @@ -223,6 +229,8 @@ class HomeRoomListViewModel @AssistedInject constructor( } private fun observeRooms() = viewModelScope.launch { + filteredPagedRoomSummariesLive?.livePagedList?.removeObserver(internalPagedListObserver) + val builder = RoomSummaryQueryParams.Builder().also { it.memberships = listOf(Membership.JOIN) } @@ -233,7 +241,6 @@ class HomeRoomListViewModel @AssistedInject constructor( } else { RoomSortOrder.ACTIVITY } - val liveResults = session.roomService().getFilteredPagedRoomSummariesLive( params, pagedListConfig, @@ -249,21 +256,15 @@ class HomeRoomListViewModel @AssistedInject constructor( } .onEach { selectedSpaceOption -> val selectedSpace = selectedSpaceOption.orNull() - liveResults.queryParams = liveResults.queryParams.copy( + filteredPagedRoomSummariesLive?.queryParams = liveResults.queryParams.copy( spaceFilter = selectedSpace?.roomId.toActiveSpaceOrNoFilter() ) emitEmptyState() } + .also { roomsFlow = it } .launchIn(viewModelScope) - roomsFlowJob?.cancel(CancellationException()) - - roomsFlowJob = liveResults.livePagedList - .asFlow() - .onEach { - setState { copy(roomsPagedList = it) } - } - .launchIn(viewModelScope) + liveResults.livePagedList.observeForever(internalPagedListObserver) } private fun observeOrderPreferences() { @@ -344,6 +345,11 @@ class HomeRoomListViewModel @AssistedInject constructor( } } + override fun onCleared() { + super.onCleared() + filteredPagedRoomSummariesLive?.livePagedList?.removeObserver(internalPagedListObserver) + } + private fun handleChangeRoomFilter(newFilter: HomeRoomFilter) { if (currentFilter == newFilter) { return diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt index db3a57e63e..c05e285ddb 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewState.kt @@ -16,14 +16,11 @@ package im.vector.app.features.home.room.list.home -import androidx.paging.PagedList import com.airbnb.mvrx.MavericksState import im.vector.app.core.platform.StateView import im.vector.app.features.home.room.list.home.header.RoomsHeadersData -import org.matrix.android.sdk.api.session.room.model.RoomSummary data class HomeRoomListViewState( val state: StateView.State = StateView.State.Content, val headersData: RoomsHeadersData = RoomsHeadersData(), - val roomsPagedList: PagedList? = null, ) : MavericksState From f8ed3520f57cd6d419488c18258aba46bc166a42 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 23 Sep 2022 11:45:34 +0200 Subject: [PATCH 128/131] Applayout: disable applayout by default --- CHANGES.md | 4 +--- .../java/im/vector/app/VerifySessionInteractiveTest.kt | 4 ++-- .../androidTest/java/im/vector/app/ui/robot/ElementRobot.kt | 2 +- vector-config/src/main/res/values/config-settings.xml | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f0ecb5fc04..65e1616e2d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,4 @@ -Changes in Element v1.5.0 (2022-09-21) +Changes in Element v1.5.0 (2022-09-23) ====================================== Features ✨ @@ -33,8 +33,6 @@ Other changes - Exclude legacy android support annotation library ([#7140](https://github.com/vector-im/element-android/issues/7140)) - Pulling no longer hosted im.dlg:android-dialer directly into the repository and removing legacy support library usages ([#7142](https://github.com/vector-im/element-android/issues/7142)) - Fixing build cache misses when compiling the vector module ([#7157](https://github.com/vector-im/element-android/issues/7157)) - - New App Layout is now enabled by default! Go to the Settings > Labs to toggle this ([#7166](https://github.com/vector-im/element-android/issues/7166)) - Changes in Element v1.4.36 (2022-09-10) ======================================= diff --git a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt index 901ef8e4c1..da13e49e84 100644 --- a/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/VerifySessionInteractiveTest.kt @@ -225,8 +225,8 @@ class VerifySessionInteractiveTest : VerificationTestBase() { // Wait until local secrets are known (gossip) withIdlingResource(allSecretsKnownIdling(uiSession)) { - onView(withId(R.id.roomListContainer)) - .check(matches(isDisplayed())) + onView(withId(R.id.groupToolbarAvatarImageView)) + .perform(click()) } } diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt index d9dfb0facf..86709a75a5 100644 --- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt +++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt @@ -50,7 +50,7 @@ import im.vector.app.withIdlingResource import timber.log.Timber class ElementRobot( - private val labsPreferences: LabFeaturesPreferences = LabFeaturesPreferences(true) + private val labsPreferences: LabFeaturesPreferences = LabFeaturesPreferences(false) ) { fun onboarding(block: OnboardingRobot.() -> Unit) { block(OnboardingRobot()) diff --git a/vector-config/src/main/res/values/config-settings.xml b/vector-config/src/main/res/values/config-settings.xml index c69452e3d0..d7017375d5 100755 --- a/vector-config/src/main/res/values/config-settings.xml +++ b/vector-config/src/main/res/values/config-settings.xml @@ -40,7 +40,7 @@ true true false - true + false true false From 56f3ecc4aff54dc5d6d3176fa539549f90a24a96 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 23 Sep 2022 11:46:40 +0200 Subject: [PATCH 129/131] Disable flaky CantVerifyTest, for the time we are investigating the issue. --- vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt b/vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt index 6f9d6cdde9..3f82ce1ef0 100644 --- a/vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt +++ b/vector-app/src/androidTest/java/im/vector/app/CantVerifyTest.kt @@ -26,6 +26,7 @@ import androidx.test.filters.LargeTest import com.adevinta.android.barista.internal.viewaction.SleepViewAction import im.vector.app.features.MainActivity import im.vector.app.ui.robot.ElementRobot +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.rules.RuleChain @@ -34,6 +35,7 @@ import java.util.UUID @RunWith(AndroidJUnit4::class) @LargeTest +@Ignore("Disabled temporarily so that we can unblock other PRs.") class CantVerifyTest { @get:Rule From 97b3b2363ba9f9cdc076d19a2d658ab39ce6470e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 23 Sep 2022 14:09:44 +0200 Subject: [PATCH 130/131] Disable not passing VoiceRecorderLTests, for the time we are investigating the issue. --- .../java/im/vector/app/features/voice/VoiceRecorderLTests.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vector/src/androidTest/java/im/vector/app/features/voice/VoiceRecorderLTests.kt b/vector/src/androidTest/java/im/vector/app/features/voice/VoiceRecorderLTests.kt index 1687ee4388..3d7ac3971c 100644 --- a/vector/src/androidTest/java/im/vector/app/features/voice/VoiceRecorderLTests.kt +++ b/vector/src/androidTest/java/im/vector/app/features/voice/VoiceRecorderLTests.kt @@ -26,10 +26,12 @@ import org.amshove.kluent.shouldBeNull import org.amshove.kluent.shouldExist import org.amshove.kluent.shouldNotBeNull import org.amshove.kluent.shouldNotExist +import org.junit.Ignore import org.junit.Rule import org.junit.Test import java.io.File +@Ignore("Disabled temporarily so that we can unblock other PRs.") class VoiceRecorderLTests { @get:Rule From 6cba51eff3de5220e12406b8260f706e8befaaf8 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 23 Sep 2022 15:09:17 +0200 Subject: [PATCH 131/131] Update changelog 1.5.0 for fastlane --- fastlane/metadata/android/en-US/changelogs/40105000.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/en-US/changelogs/40105000.txt b/fastlane/metadata/android/en-US/changelogs/40105000.txt index 1bfa2b3dea..e86519e6e9 100644 --- a/fastlane/metadata/android/en-US/changelogs/40105000.txt +++ b/fastlane/metadata/android/en-US/changelogs/40105000.txt @@ -1,2 +1,2 @@ -Main changes in this version: New App Layout and Deferred DM enabled by default. -Full changelog: https://github.com/vector-im/element-android/releases \ No newline at end of file +Main changes in this version: Deferred DM enabled by default. +Full changelog: https://github.com/vector-im/element-android/releases