From acc9874bdfb9040cef09434307f3a392a0bbd0d1 Mon Sep 17 00:00:00 2001
From: Michael Kaye <1917473+michaelkaye@users.noreply.github.com>
Date: Wed, 30 Mar 2022 16:46:44 +0100
Subject: [PATCH 001/198] Move to using hookshot to send notifications, rather
than logging into matrix room.
---
.github/workflows/nightly.yml | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index b875a57abe..045df203cc 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -330,10 +330,9 @@ jobs:
if: always() && github.event_name != 'workflow_dispatch'
# No concurrency required, runs every time on a schedule.
steps:
- - uses: michaelkaye/matrix-hookshot-action@v0.3.0
+ - uses: michaelkaye/matrix-hookshot-action@v1.0.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- matrix_access_token: ${{ secrets.ELEMENT_ANDROID_NOTIFICATION_ACCESS_TOKEN }}
- matrix_room_id: ${{ secrets.ELEMENT_ANDROID_INTERNAL_ROOM_ID }}
+ hookshot_url: ${{ secrets.ELEMENT_ANDROID_HOOKSHOT_URL }}
text_template: "{{#if '${{ github.event_name }}' == 'schedule' }}Nightly test run{{else}}Test run (on ${{ github.ref }}){{/if }}: {{#each job_statuses }}{{#with this }}{{#if completed }} {{name}} {{conclusion}} at {{completed_at}}, {{/if}}{{/with}}{{/each}}"
html_template: "{{#if '${{ github.event_name }}' == 'schedule' }}Nightly test run{{else}}Test run (on ${{ github.ref }}){{/if }}: {{#each job_statuses }}{{#with this }}{{#if completed }} {{icon conclusion}} {{name}} {{conclusion}} at {{completed_at}} [details]{{/if}}{{/with}}{{/each}}"
From 4c059e781920b24d7a9920cc93400b83b433b744 Mon Sep 17 00:00:00 2001
From: NIkita Fedrunov
Date: Mon, 4 Apr 2022 09:49:47 +0200
Subject: [PATCH 002/198] add text to spinner when click on space member (dm)
---
.../vector/app/features/spaces/people/SpacePeopleActivity.kt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleActivity.kt
index f5832a8547..23a76b4b68 100644
--- a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleActivity.kt
@@ -24,6 +24,7 @@ import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.airbnb.mvrx.Mavericks
import dagger.hilt.android.AndroidEntryPoint
+import im.vector.app.R
import im.vector.app.core.extensions.hideKeyboard
import im.vector.app.core.extensions.replaceFragment
import im.vector.app.core.platform.GenericIdArgs
@@ -79,7 +80,7 @@ class SpacePeopleActivity : VectorBaseActivity() {
is SpacePeopleSharedAction.NavigateToRoom -> navigateToRooms(sharedAction)
SpacePeopleSharedAction.HideModalLoading -> hideWaitingView()
SpacePeopleSharedAction.ShowModalLoading -> {
- showWaitingView()
+ showWaitingView(getString(R.string.please_wait))
}
is SpacePeopleSharedAction.NavigateToInvite -> {
ShareSpaceBottomSheet.show(supportFragmentManager, sharedAction.spaceId)
From 3d64f13c7e5170ea2e752acb763d2bdf39b0e6a8 Mon Sep 17 00:00:00 2001
From: maciejek997
Date: Tue, 5 Apr 2022 13:04:45 +0000
Subject: [PATCH 003/198] Translated using Weblate (Polish)
Currently translated at 92.6% (2030 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index fe98d6b6a1..8974f1798c 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2334,4 +2334,5 @@
Odkrywanie (%s)Dokończ konfigurację odkrywania.Usuń wszystkie nieudane wiadomości
+ Nie znasz swojego hasła zapasowego klucza\? Możesz %s
\ No newline at end of file
From 232c400c082c8c141cf668e84ab3cc907afaaa8e Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 13:01:35 +0000
Subject: [PATCH 004/198] Translated using Weblate (Polish)
Currently translated at 92.6% (2030 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 95 ++++++++++++-----------
1 file changed, 50 insertions(+), 45 deletions(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 8974f1798c..df3253a462 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -287,22 +287,21 @@
${app_name} wymaga dostępu do kamery i mikrofonu, aby przeprowadzać rozmowy wideo.
\n
\nPrzyznaj dostęp w następnym oknie.
- Lista uczestników
+ Członkowie
- 1 członek
- kilku członków
+ %d członek
+ %d członków%d członków
-
+ %d członkówNie będziesz w stanie cofnąć tej zmiany, ponieważ przyznajesz użytkownikowi uprawnienia równe swoim.
-\n
\nJesteś pewien\?
- Zbanowanie użytkownika usunie go z tego pokoju i uniemożliwi ponowne dołączenie.
+ Zablokowanie użytkownika usunie go z tego pokoju i uniemożliwi ponowne dołączenie.
- Nowa wiadomość
- Kilka nowych wiadomości
+ %d nowa wiadomość
+ %d nowe wiadomości%d nowych wiadomości
-
+ %d nowych wiadomościMoże to oznaczać że ktoś zakłóca twoje połączenie, lub Twój telefon nie ufa certyfikatowi dostarczonemu przez zdalny serwer.Jeśli administrator serwera oświadczył, że jest to oczekiwane, upewnij się, że poniższy odcisk palca odpowiada odciskowi palca dostarczonemu przez niego.
@@ -539,7 +538,8 @@
Przywrócono kopię zapasową z %d kluczem.Przywrócono kopię zapasową z %d kluczami.
-
+ Przywrócono kopię zapasową z %d kluczami.
+ Przywrócono kopię zapasową z %d kluczami.Użyj kopii zapasowej kluczaUruchamianie… (%1$d z %2$d)
@@ -736,7 +736,7 @@
\nMenedżerzy integracji odbierają dane konfiguracji, modyfikują widżety, wysyłają zaproszenia do pokojów i ustawiają poziomy uprawnień w Twoim imieniu.
Pokaż podgląd linków wewnątrz czatu jeśli twój serwer wspiera tę funkcję.Formatuj wiadomości używając składni Markdown zanim zostaną wysłane. Pozwala to na zaawansowane formatowanie takie jak używanie asterysków do wyświetlania tekstu w kursywie.
- Nie wpływa to na zaproszenia, wyrzucenia oraz bany.
+ Zaproszenia, usunięcia i bany pozostają nienaruszone.Wysyłaj wiadomości za pomocą klawisza enterPrzycisk enter na klawiaturze programowej wyśle wiadomość zamiast wprowadzania łamanania liniiZnajdź
@@ -747,13 +747,14 @@
%1$s: %2$d wiadomość%1$s: %2$d wiadomości
-
-
+ %1$s: %2$d wiadomości
+ %1$s: %2$d wiadomości%d powiadomienie
- %d powiadomień
-
+ %d powiadomienia
+ %d powiadomień
+ %d powiadomieńNowe wydarzenieNowe wiadomości
@@ -825,9 +826,10 @@
Zarządzaj w Kopii Zapasowej KluczyTworzenei kopii zapasowej kluczy…
- Kopiowanie %d klucza…
- Kopiowanie %d kluczy…
-
+ Tworzenie kopii zapasowej %d klucza…
+ Tworzenie kopii zapasowej %d kluczy…
+ Tworzenie kopii zapasowej %d kluczy…
+ Tworzenie kopii zapasowej %d kluczy…Niektóre powiadomienia są wyłączone w osobistej konfiguracji.Usługi Google Play są aktualne.
@@ -888,8 +890,8 @@
%d użytkownik odczytał%d użytkowników odczytało
-
-
+ %d użytkowników odczytało
+ %d użytkowników odczytałoWystąpił błąd poczas otrzymywania załącznika.Nie można obsłużyć otrzymanych danych
@@ -999,9 +1001,10 @@
Wprowadzony kod jest nieprawidłowy. Sprawdź.Nieaktualny serwer domowy
- Zostało wysłane zbyt wiele żądań. Możesz spróbować ponownie za %1$d sekundę…
- Zostało wysłane zbyt wiele żądań. Możesz spróbować ponownie za %1$d sekundy…
-
+ Wysłano zbyt wiele próśb. Możesz spróbować ponownie za %1$d sekundę…
+ Wysłano zbyt wiele próśb. Możesz spróbować ponownie za %1$d sekundy…
+ Wysłano zbyt wiele próśb. Możesz spróbować ponownie za %1$d sekund…
+ Wysłano zbyt wiele próśb. Możesz spróbować ponownie za %1$d sekund…Wylogowałeś(-łaś) sięMogło to się stać z wielu powodów:
@@ -1081,8 +1084,9 @@
Dowiedz się więcejJedna osoba
- %1$d osób
-
+ %1$d osoby
+ %1$d osób
+ %1$d osóbOpuszczanie pokoju…Administratorzy
@@ -1104,8 +1108,7 @@
Oś czasuEdycja wiadomościAktywować szyfrowanie\?
- Raz włączone szyfrowanie w pokoju nie może zostać wyłączone. Wiadomości wysłane w zaszyfrowanym pokoju nie są widziane przez serwer, a jedynie przez uczestników w pokoju.
-\nAktywowanie szyfrowania może uniemożliwić wielu botom i mostom prawidłowe działanie.
+ Raz włączone szyfrowanie w pokoju nie może zostać wyłączone. Wiadomości wysłane w zaszyfrowanym pokoju nie są widziane przez serwer, a jedynie przez uczestników w pokoju. Aktywowanie szyfrowania może uniemożliwić wielu botom i mostkom prawidłowe działanie.Aktywuj szyfrowanieAby być bezpiecznym, zweryfikuj %s poprzez sprawdzenie jednorazowego kodu.Aby być bezpiecznym, zrób to osobiście lub użyj innej metody komunikacji.
@@ -1131,8 +1134,9 @@
Zweryfikuj tą sesję aby oznaczyć ją jako zaufaną i przyznać jej dostęp do zaszyfrowanych wiadomości. Jeżeli nie logowałeś(-łaś) się do tej sesji, twoje konto mogło zostać naruszone:%d aktywna sesja
- %d aktywnych sesji
-
+ %d aktywne sesje
+ %d aktywnych sesji
+ %d aktywnych sesjiZweryfikuj tą sesjęOtwórz obecną sesję i użyj jej do zweryfikowania obecnej, przyznając jej dostęp do zaszyfrowanych wiadomości.
@@ -1161,7 +1165,8 @@
Wyślij obraz w oryginalnym rozmiarzeWyślij obrazy w oryginalnym rozmiarze
-
+ Wyślij obrazów w oryginalnym rozmiarze
+ Wyślij obrazów w oryginalnym rozmiarzePotwierdź UsunięcieJesteś pewny(-na), że chcesz usunąć to wydarzenie\? Jeżeli usuniesz nazwę pokoju lub zmienisz temat, wciąż będzie możliwe cofnięcie zmiany.
@@ -1354,9 +1359,9 @@
WIDOK%d sekunda
- %d sek.
- %d sek.
- %d sek.
+ %d sekundy
+ %d sekund
+ %d sekundAplikacja odebrała PUSHPrzetestuj powiadomienia push
@@ -1581,10 +1586,10 @@
Naklejka%1$s wymaga otrzymania zaproszenia do dołączenia.
- %1$s, %2$s i %3$d czyta
- %1$s, %2$s i %3$d czytają
-
-
+ %1$s, %2$s i %3$d inny czyta
+ %1$s, %2$s i %3$d innych czyta
+ %1$s, %2$s i %3$d innych czyta
+ %1$s, %2$s i %3$d innych czytaNie udało się uzyskać widoczności katalogu bieżącego pokoju (%1$s).Skonfiguruj na tym urządzeniu
@@ -1825,7 +1830,7 @@
Uprawnienia PrzestrzeniUprawnienia pokojuOdblokowanie użytkownika pozwoli mu na ponowne dołączenie do tej przestrzeni.
- Blokowanie użytkowników wyrzuci ich z tej przestrzeni i uniemożliwi im dołączenie ponownie.
+ Zablokowanie użytkownika usunie go z tego miejsca i uniemożliwi ponowne dołączenie.Ten pokój jest prywatny. Nie będziesz w stanie dołączyć bez zaproszenia.Zakańczanie połączenia…Brak odpowiedzi
@@ -1975,7 +1980,7 @@
Nie będziesz w stanie ponownie dołączyć, do momentu kiedy nie zostaniesz ponownie zaproszony.Jesteś jedyną osoba tutaj. Jeśli wyjdziesz, nikt nie będzie w stanie dołączyć w przyszłości, włączając Ciebie.Czy jesteś pewny, że chcesz opuścić %s\?
- Opuść przestrzeń
+ OpuśćDodawaj pokojePrzeglądaj pokojeUkończ konfigurację
@@ -1985,7 +1990,7 @@
\nSpróbuj ponownie później lub zapytaj administratora tego pokoju czy masz dostęp.Dołącz pomimo toDołącz do przestrzeni
- Stwórz przestrzeń
+ Utwórz przestrzeńNa razie pomińDołącz do mojej przestrzeni %1$s %2$sNie będą częścią %s
@@ -2016,7 +2021,7 @@
Ja i moi znajomiPrywatna przestrzeń do organizacji Twoich pokojówTylko ja
- Upewnij się, że odpowiednie osoby mają dostęp do %s. Możesz zmienić to później.
+ Upewnij się, że odpowiednie osoby mają dostęp do %s.Z kim pracujesz\?Aby dołączyć do istniejącej przestrzeni, potrzebujesz zaproszenia.Możesz zmienić to później
@@ -2028,10 +2033,10 @@
\nCzekanie na odpowiedź serwera…
Pusty pokój (było %s)
- %1$s, %2$s, %3$s i %4$d innych
+ %1$s, %2$s, %3$s i %4$d inny%1$s, %2$s, %3$s i %4$d innych
-
-
+ %1$s, %2$s, %3$s i %4$d innych
+ %1$s, %2$s, %3$s i %4$d innych%1$s, %2$s, %3$s i %4$sNiestandardowe
@@ -2208,7 +2213,7 @@
Dodano %1$s jako adresy dla tego pokoju.pojedyncze logowanie
- Pokój opuszczony!
+ Pokój został opuszczony!Błąd podczas wyszukiwania numeru telefonuPrzekaż%1$s dotknij by powrócić
From 8f751af7e49164335d7339ffa44b51635325d2c5 Mon Sep 17 00:00:00 2001
From: m1chj <8hm0nutuhsa9@opayq.com>
Date: Tue, 5 Apr 2022 12:52:35 +0000
Subject: [PATCH 005/198] Translated using Weblate (Polish)
Currently translated at 92.6% (2030 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index df3253a462..c8578f359e 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2110,7 +2110,7 @@
Zdecyduj kto może odnaleźć i dołączyć do tego pokoju.Dotknij, aby edytować przestrzenieWybierz przestrzenie
- Zdecyduj które przestrzenie mogą mieć dostęp do tego pokoju. Członkowie wybranej przestrzeni będą mogli ją odnaleźć i dołączyć do Pokoju przez nazwę.
+ Zdecyduj, które przestrzenie mogą mieć dostęp do tego pokoju. Członkowie zaznaczonej przestrzeni będą mogli odnaleźć i dołączyć do nazwy pokoju.Przestrzenie mogące uzyskać dostępZezwól użytkownikom przestrzeni na znalezienie i dostęp.Ulepszenia pokoju
From b19b10015057131c2760c9007981a8f9e6d1bc0d Mon Sep 17 00:00:00 2001
From: maciejek997
Date: Tue, 5 Apr 2022 13:05:31 +0000
Subject: [PATCH 006/198] Translated using Weblate (Polish)
Currently translated at 92.7% (2031 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index c8578f359e..8c6a559c42 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2340,4 +2340,10 @@
Dokończ konfigurację odkrywania.Usuń wszystkie nieudane wiadomościNie znasz swojego hasła zapasowego klucza\? Możesz %s
+
+ wpis
+ wpisów
+ wpisy
+ wpisy
+
\ No newline at end of file
From 2b9dd885546d056907a1ee49d531761b61e920a8 Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 13:05:13 +0000
Subject: [PATCH 007/198] Translated using Weblate (Polish)
Currently translated at 92.7% (2031 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 8c6a559c42..236ea514c0 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2339,7 +2339,7 @@
Odkrywanie (%s)Dokończ konfigurację odkrywania.Usuń wszystkie nieudane wiadomości
- Nie znasz swojego hasła zapasowego klucza\? Możesz %s
+ Nie znasz hasła swojego zapasowego klucza\? Możesz %s.wpiswpisów
From da32eb8a99c98aeadfdbfb846a74a2a289b5183e Mon Sep 17 00:00:00 2001
From: maciejek997
Date: Tue, 5 Apr 2022 13:10:11 +0000
Subject: [PATCH 008/198] Translated using Weblate (Polish)
Currently translated at 93.1% (2039 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 236ea514c0..95e7115b44 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2346,4 +2346,12 @@
wpisywpisy
+
+ %d osoba którą znasz już dołączyła
+ %d osoby które znasz już dołączyły
+
+
+
+ Brakujący typ wiadomości
+ Brak zawartości
\ No newline at end of file
From be3b75e1368cf6bdd87bb64509397866df6e86e1 Mon Sep 17 00:00:00 2001
From: m1chj <8hm0nutuhsa9@opayq.com>
Date: Tue, 5 Apr 2022 13:07:46 +0000
Subject: [PATCH 009/198] Translated using Weblate (Polish)
Currently translated at 93.1% (2039 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 95e7115b44..ffec372c06 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2333,8 +2333,8 @@
Uzyskaj pomoc w korzystaniu z ${app_name}Nie masz uprawnień by dołączyć do tego pokojuTyp
- Niedostępny
- Dostępny
+ Offline
+ OnlinePokaż znaczniki odczytaniaOdkrywanie (%s)Dokończ konfigurację odkrywania.
@@ -2354,4 +2354,7 @@
Brakujący typ wiadomościBrak zawartości
+ Wyślij wydarzenie niestandardowe
+ Ostrzegawczy poziom zaufania
+ Upewnij się najpierw
\ No newline at end of file
From 3d9974ed82aaafa03de75002bbc3ab95296c489d Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 13:07:23 +0000
Subject: [PATCH 010/198] Translated using Weblate (Polish)
Currently translated at 93.1% (2039 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index ffec372c06..c4aa40884a 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2335,16 +2335,16 @@
TypOfflineOnline
- Pokaż znaczniki odczytania
+ Wyświetl znaczniki odczytaniaOdkrywanie (%s)Dokończ konfigurację odkrywania.Usuń wszystkie nieudane wiadomościNie znasz hasła swojego zapasowego klucza\? Możesz %s.
- wpis
- wpisów
- wpisy
- wpisy
+ %d wpis
+ %d wpisy
+ %d wpisów
+ %d wpisów%d osoba którą znasz już dołączyła
@@ -2357,4 +2357,6 @@
Wyślij wydarzenie niestandardoweOstrzegawczy poziom zaufaniaUpewnij się najpierw
+ Nie sprawdzono
+ Sprawdzono
\ No newline at end of file
From 2e81f2ab2af08d46c5a058c771783dd0fa732f51 Mon Sep 17 00:00:00 2001
From: maciejek997
Date: Tue, 5 Apr 2022 13:11:25 +0000
Subject: [PATCH 011/198] Translated using Weblate (Polish)
Currently translated at 93.1% (2041 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index c4aa40884a..9965c6e629 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2349,8 +2349,8 @@
%d osoba którą znasz już dołączyła%d osoby które znasz już dołączyły
-
-
+
+ Brakujący typ wiadomościBrak zawartości
@@ -2359,4 +2359,5 @@
Upewnij się najpierwNie sprawdzonoSprawdzono
+ Aby zmiany weszły w życie, należy uruchomić ponownie aplikację.
\ No newline at end of file
From 5e035267178c79c500d2137bd3d5da0fb676b19d Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 13:10:57 +0000
Subject: [PATCH 012/198] Translated using Weblate (Polish)
Currently translated at 93.1% (2041 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 9965c6e629..eef2755808 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2347,10 +2347,10 @@
%d wpisów
- %d osoba którą znasz już dołączyła
- %d osoby które znasz już dołączyły
-
-
+ %d osoba, którą znasz, już dołączyła
+ %d osoby, które znasz, już dołączyły
+ %d osób, które znasz, już dołączyły
+ %d osób, które znasz, już dołączyłyBrakujący typ wiadomościBrak zawartości
@@ -2360,4 +2360,5 @@
Nie sprawdzonoSprawdzonoAby zmiany weszły w życie, należy uruchomić ponownie aplikację.
+ Włącz matematykę LaTeX
\ No newline at end of file
From aaf3f080d02faf3ae2a174230056f3da5db51fff Mon Sep 17 00:00:00 2001
From: maciejek997
Date: Tue, 5 Apr 2022 13:11:56 +0000
Subject: [PATCH 013/198] Translated using Weblate (Polish)
Currently translated at 93.2% (2042 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index eef2755808..5766aafc73 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2361,4 +2361,5 @@
SprawdzonoAby zmiany weszły w życie, należy uruchomić ponownie aplikację.Włącz matematykę LaTeX
+ Zakończ ankietę.
\ No newline at end of file
From 67159f7dc9e33fe8dc5b67a60de092d8f79d3a27 Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 13:11:46 +0000
Subject: [PATCH 014/198] Translated using Weblate (Polish)
Currently translated at 93.2% (2042 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 5766aafc73..8609f13af4 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2359,7 +2359,7 @@
Upewnij się najpierwNie sprawdzonoSprawdzono
- Aby zmiany weszły w życie, należy uruchomić ponownie aplikację.
+ Aby zmiany zostały zastosowane, należy uruchomić ponownie aplikację.Włącz matematykę LaTeXZakończ ankietę.
\ No newline at end of file
From 99ad49498d8e953e859566faee621df1ca4c2c1d Mon Sep 17 00:00:00 2001
From: maciejek997
Date: Tue, 5 Apr 2022 13:12:09 +0000
Subject: [PATCH 015/198] Translated using Weblate (Polish)
Currently translated at 93.2% (2043 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 8609f13af4..6328703475 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2362,4 +2362,5 @@
Aby zmiany zostały zastosowane, należy uruchomić ponownie aplikację.Włącz matematykę LaTeXZakończ ankietę.
+ Zakończyć ankietę\?
\ No newline at end of file
From 7dd56244a974c76300fcb9ced9d8339b48133a3f Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 13:12:03 +0000
Subject: [PATCH 016/198] Translated using Weblate (Polish)
Currently translated at 93.2% (2043 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 6328703475..2d6a1d2abb 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2361,6 +2361,6 @@
SprawdzonoAby zmiany zostały zastosowane, należy uruchomić ponownie aplikację.Włącz matematykę LaTeX
- Zakończ ankietę.
+ Zakończ ankietęZakończyć ankietę\?
\ No newline at end of file
From bad0c0a2e1e823346d6d4952e84a10e5b4ead3b3 Mon Sep 17 00:00:00 2001
From: maciejek997
Date: Tue, 5 Apr 2022 13:12:32 +0000
Subject: [PATCH 017/198] Translated using Weblate (Polish)
Currently translated at 93.3% (2044 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 2d6a1d2abb..f829f7f307 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2363,4 +2363,5 @@
Włącz matematykę LaTeXZakończ ankietęZakończyć ankietę\?
+ To powstrzyma użytkowników od głosowania i wyświetli finalny wynik ankiety.
\ No newline at end of file
From 157a14fdc24b748c57384e95b4b318f84fc2bb7e Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 13:12:20 +0000
Subject: [PATCH 018/198] Translated using Weblate (Polish)
Currently translated at 93.3% (2044 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index f829f7f307..e4b7b28a01 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2362,6 +2362,6 @@
Aby zmiany zostały zastosowane, należy uruchomić ponownie aplikację.Włącz matematykę LaTeXZakończ ankietę
- Zakończyć ankietę\?
+ Czy zakończyć ankietę\?To powstrzyma użytkowników od głosowania i wyświetli finalny wynik ankiety.
\ No newline at end of file
From ff7c19537ec3df5c86de633497daea5edce01c0f Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 13:37:38 +0000
Subject: [PATCH 019/198] Translated using Weblate (Polish)
Currently translated at 12.7% (7 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/pl/
---
fastlane/metadata/android/pl-PL/changelogs/40103070.txt | 4 ++--
fastlane/metadata/android/pl-PL/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40104080.txt | 2 ++
4 files changed, 8 insertions(+), 2 deletions(-)
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103070.txt b/fastlane/metadata/android/pl-PL/changelogs/40103070.txt
index 2cb20a9570..08d9d2193e 100644
--- a/fastlane/metadata/android/pl-PL/changelogs/40103070.txt
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103070.txt
@@ -1,2 +1,2 @@
-Główne zmiany w tej wersji: Poprawki błędów dotyczące głównie powiadomień
-Pełny changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.7
+Główne zmiany w tej wersji: Poprawki błędów dotyczące głównie powiadomień.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.7-RC2
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40104060.txt b/fastlane/metadata/android/pl-PL/changelogs/40104060.txt
new file mode 100644
index 0000000000..216842ada0
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Oś czasu wątku jest teraz aktywna i szybsza. Różne poprawki błędów i ulepszenia stabilności.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40104070.txt b/fastlane/metadata/android/pl-PL/changelogs/40104070.txt
new file mode 100644
index 0000000000..91c13d3d79
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Różne poprawki błędów i ulepszenia stabilności.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40104080.txt b/fastlane/metadata/android/pl-PL/changelogs/40104080.txt
new file mode 100644
index 0000000000..5286f40de5
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Oś czasu wątku jest teraz aktywna i szybsza. Różne poprawki błędów i ulepszenia stabilności.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases
From 23cdd4fac396a4f3ce92156d3eb3261e53cd5ac7 Mon Sep 17 00:00:00 2001
From: Linerly
Date: Tue, 5 Apr 2022 22:54:35 +0000
Subject: [PATCH 020/198] Translated using Weblate (Indonesian)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/id/
---
vector/src/main/res/values-in/strings.xml | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml
index 29831c1377..5ca1a361d4 100644
--- a/vector/src/main/res/values-in/strings.xml
+++ b/vector/src/main/res/values-in/strings.xml
@@ -1742,7 +1742,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
\nCoba lagi nanti, atau tanyakan ke admin ruangan untuk mengecek jika Anda punya akses.
Bergabung SajaBergabung ke Space
- Buat Space
+ Buat spaceLewat untuk sekarangBergabung ke space saya %1$s %2$sMereka tidak akan menjadi bagian dari %s
@@ -1784,7 +1784,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Tipe space apa yang Anda ingin buat\?Space privat AndaSpace publik Anda
- Tambahkan Space
+ Tambahkan spaceSpace privatSpace publikApakah Anda yakin untuk menghapus semua pesan yang belum dikirim di ruangan ini\?
@@ -2393,4 +2393,23 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
\n
\nIni hanya transisi sekali, utasan sekarang sebagai bagian dari spesifikasi Matrix.
Utasan Mencapai Beta 🎉
+ Penbagian lokasi sedang dilakukan
+ ${app_name} Lokasi langsung
+ Homeserver tidak menerima nama pengguna dengan hanya angka.
+ Lewati
+ Simpan dan lanjutkan
+ Preferensi Anda telah disimpan.
+ Anda siap!
+ Ayo
+ Anda dapat mengubahnya kapan saja.
+ Tambahkan sebuah foto profil
+ Anda dapat mengubahnya nanti
+ Nama Tampilan
+ Ini akan ditampilkan ketika Anda mengirim pesan.
+ Pilih nama tampilan
+ Akun %s Anda telah dibuat.
+ Selamat!
+ Kembalikan saya ke beranda
+ Ubah profil
+ Nonaktifkan
\ No newline at end of file
From f2bbcddd5f219390ed7aba8af02c1ab8188f8e51 Mon Sep 17 00:00:00 2001
From: random
Date: Wed, 6 Apr 2022 08:26:44 +0000
Subject: [PATCH 021/198] Translated using Weblate (Italian)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/it/
---
vector/src/main/res/values-it/strings.xml | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml
index d14aa3c671..15f08ba6da 100644
--- a/vector/src/main/res/values-it/strings.xml
+++ b/vector/src/main/res/values-it/strings.xml
@@ -1959,7 +1959,7 @@
\nRiprova più tardi, o chiedi a un amministratore della stanza di controllare se hai l\'accesso.
Unisciti comunqueUnisciti a uno Spazio
- Crea Spazio
+ Crea spazioPer il momento, saltaUnisciti al mio Spazio %1$s %2$sNon faranno parte di %s
@@ -1998,7 +1998,7 @@
Che tipo di Spazio vuoi creare\?Il tuo Spazio privatoIl tuo Spazio pubblico
- Aggiungi Spazio
+ Aggiungi spazioEsci dalla stanza con un ID (o dalla stanza attuale se vuota)Unisciti allo Spazio con un IDCrea uno Spazio
@@ -2429,4 +2429,23 @@
\n
\nSarà una transizione una-tantum, dato che le conversazioni ora sono parte delle specifiche di Matrix.
I messaggi in conversazioni entrano in beta 🎉
+ Portami a casa
+ Stai condividendo la posizione
+ Posizione in tempo reale di ${app_name}
+ L\'homeserver non accetta nomi utente con solo numeri.
+ Salta questo passo
+ Salva e continua
+ Le tue preferenze sono state salvate.
+ Tutto pronto!
+ Andiamo
+ Puoi cambiarla in qualsiasi momento.
+ Aggiungi un\'immagine del profilo
+ Puoi cambiarlo in seguito
+ Nome da mostrare
+ Verrà mostrato quando invii messaggi.
+ Scegli un nome da mostrare
+ Il tuo account %s è stato creato.
+ Congratulazioni!
+ Personalizza profilo
+ Disattiva
\ No newline at end of file
From 21231127631edd497bd29c9dfc4ccf0b9d248f9b Mon Sep 17 00:00:00 2001
From: lvre <7uu3qrbvm@relay.firefox.com>
Date: Tue, 5 Apr 2022 16:51:26 +0000
Subject: [PATCH 022/198] Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/pt_BR/
---
fastlane/metadata/android/pt-BR/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/pt-BR/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/pt-BR/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104060.txt b/fastlane/metadata/android/pt-BR/changelogs/40104060.txt
new file mode 100644
index 0000000000..17d8225c0d
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: Timeline de Thread estão agora ao vivo e mais rápidas. Vários consertos de bugs e melhorias de estabilidade.
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104070.txt b/fastlane/metadata/android/pt-BR/changelogs/40104070.txt
new file mode 100644
index 0000000000..fad9bfe739
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade.
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104080.txt b/fastlane/metadata/android/pt-BR/changelogs/40104080.txt
new file mode 100644
index 0000000000..ca2b54f2f2
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: Timeline de Thread estão agora ao vivo e mais rápidas. Vários consertos de bugs e melhorias de estabilidade.
+Changelog completo: https://github.com/vector-im/element-android/releases
From 8b125923e9429388074e3327a8dbbbb953221b23 Mon Sep 17 00:00:00 2001
From: Jozef Gaal
Date: Tue, 5 Apr 2022 19:07:18 +0000
Subject: [PATCH 023/198] Translated using Weblate (Slovak)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/
---
vector/src/main/res/values-sk/strings.xml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
index bd3e86e40c..0807657f8e 100644
--- a/vector/src/main/res/values-sk/strings.xml
+++ b/vector/src/main/res/values-sk/strings.xml
@@ -2485,4 +2485,23 @@
\n
\nPôjde o jednorazový prechod, keďže vlákna sú teraz súčasťou špecifikácie Matrix.
Vlákna sa blížia k beta verzii 🎉
+ Váš účet %s bol vytvorený.
+ Prebieha zdieľanie polohy
+ ${app_name} Poloha v reálnom čase
+ Domovský server neakceptuje používateľské meno obsahujúce iba číslice.
+ Vynechať tento krok
+ Uložiť a pokračovať
+ Vaše nastavenia boli uložené.
+ Všetko je pripravené!
+ Poďme na to
+ Toto môžete kedykoľvek zmeniť.
+ Pridať profilový obrázok
+ Neskôr to môžete zmeniť
+ Zobrazované meno
+ Toto sa zobrazí pri odosielaní správ.
+ Vyberte si zobrazované meno
+ Gratulujeme!
+ Zober ma domov
+ Prispôsobiť profil
+ Zakázať
\ No newline at end of file
From 661d95cf29068d8027bd3a5f74cf91687c6e0886 Mon Sep 17 00:00:00 2001
From: Ihor Hordiichuk
Date: Tue, 5 Apr 2022 17:26:00 +0000
Subject: [PATCH 024/198] Translated using Weblate (Ukrainian)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/
---
fastlane/metadata/android/uk/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/uk/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/uk/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/uk/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/uk/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/uk/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/uk/changelogs/40104060.txt b/fastlane/metadata/android/uk/changelogs/40104060.txt
new file mode 100644
index 0000000000..28f051724a
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: Хронологія тредів працює наживо і швидше. Усунуто різні вади й поліпшено стабільність.
+Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/uk/changelogs/40104070.txt b/fastlane/metadata/android/uk/changelogs/40104070.txt
new file mode 100644
index 0000000000..dff28b7825
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: Усунуто різні вади й поліпшено стабільність.
+Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/uk/changelogs/40104080.txt b/fastlane/metadata/android/uk/changelogs/40104080.txt
new file mode 100644
index 0000000000..e5f7e7b271
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: Хронологія тредів працює наживо і швидше. Усунуто різні вади й поліпшено стабільність.
+Вичерпний перелік змін: https://github.com/vector-im/element-android/releases
From d538e2d9a9ac0e0a2c1d7b3ae5c1cdf29938765e Mon Sep 17 00:00:00 2001
From: waclaw66
Date: Tue, 5 Apr 2022 17:09:57 +0000
Subject: [PATCH 025/198] Translated using Weblate (Czech)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/
---
vector/src/main/res/values-cs/strings.xml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml
index c66ff56b3e..3121f859f3 100644
--- a/vector/src/main/res/values-cs/strings.xml
+++ b/vector/src/main/res/values-cs/strings.xml
@@ -2485,4 +2485,23 @@
\n
\nPůjde o jednorázový přechod, protože vlákna jsou nyní součástí Matrix specifikace.
Vlákna se blíží k betaverzi 🎉
+ Probíhá sdílení polohy
+ ${app_name} poloha živě
+ Domovský server neakceptuje uživatelská jména obsahující pouze číslice.
+ Přeskočit tento krok
+ Uložit a pokračovat
+ Vaše předvolby byly uloženy.
+ Vše je připraveno!
+ Jdeme na to
+ Tuto můžete kdykoli změnit.
+ Přidat profilový obrázek
+ Později to můžete změnit
+ Zobrazované jméno
+ Toto se zobrazí při odesílání zpráv.
+ Zvolte si zobrazované jméno
+ Váš účet %s byl založen.
+ Gratulujeme!
+ Vezmi mě domů
+ Přizpůsobit profil
+ Zakázat
\ No newline at end of file
From c09cb3358a1a3f86325d086db7e50da0cf2bd7b3 Mon Sep 17 00:00:00 2001
From: waclaw66
Date: Tue, 5 Apr 2022 17:02:53 +0000
Subject: [PATCH 026/198] Translated using Weblate (Czech)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/
---
fastlane/metadata/android/cs-CZ/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/cs-CZ/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/cs-CZ/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40104060.txt b/fastlane/metadata/android/cs-CZ/changelogs/40104060.txt
new file mode 100644
index 0000000000..3eda022464
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Časová osa vláken je nyní živá a rychlejší. Opravy různých chyb a vylepšení stability.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40104070.txt b/fastlane/metadata/android/cs-CZ/changelogs/40104070.txt
new file mode 100644
index 0000000000..cba2012c1c
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Opravy různých chyb a vylepšení stability.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40104080.txt b/fastlane/metadata/android/cs-CZ/changelogs/40104080.txt
new file mode 100644
index 0000000000..61e7fd7940
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Časová osa vlákna je nyní živá a rychlejší. Opravy různých chyb a vylepšení stability.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases
From 833798bd252b3536ccf50bc4ac7eeb50c571c7e3 Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Tue, 5 Apr 2022 15:14:46 +0000
Subject: [PATCH 027/198] Translated using Weblate (Polish)
Currently translated at 97.4% (2135 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 93 +++++++++++++++++++++--
1 file changed, 87 insertions(+), 6 deletions(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index e4b7b28a01..ef24d6e62b 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -1798,18 +1798,18 @@
%1$s, %2$s i %3$s%s w Ustawieniach, aby otrzymywać zaproszenia bezpośrednio w ${app_name}.Zmiana tematu
- Aktualizacja Przestrzeni
+ Aktualizacja przestrzeniAktualizacja pokojuWysyłanie zdarzeń m.room.server_aclZmiana uprawnień
- Zmiana nazwy Przestrzeni
+ Zmiana nazwy przestrzeniZmiana nazwy pokojuZmiana widoczności historiiWłączanie szyfrowania przestrzeniWłączanie szyfrowania pokoju
- Zmiana głównego adresu Przestrzeni
+ Zmiana głównego adresu przestrzeniZmiana głównego adresu pokoju
- Zmiana awatara Przestrzeni
+ Zmiana awatara przestrzeniZmiana awatara pokojuModyfikowanie widgetówPowiadamianie wszystkich
@@ -2354,7 +2354,7 @@
Brakujący typ wiadomościBrak zawartości
- Wyślij wydarzenie niestandardowe
+ Wyślij zdarzenie niestandardoweOstrzegawczy poziom zaufaniaUpewnij się najpierwNie sprawdzono
@@ -2363,5 +2363,86 @@
Włącz matematykę LaTeXZakończ ankietęCzy zakończyć ankietę\?
- To powstrzyma użytkowników od głosowania i wyświetli finalny wynik ankiety.
+ To powstrzyma użytkowników od głosowania i wyświetli ostateczny wynik ankiety.
+ Uwaga: aplikacja zostanie uruchomiona ponownie
+ Włącz wątkowanie wiadomości
+ Upewnij się, że odpowiednie osoby mają dostęp do firmy %s. Więcej osób możesz zaprosić później.
+ Wyślij niestandardowe zdarzenie stanowe
+ Wyślij zdarzenie stanowe
+ Zdarzenia stanowe
+ Zawartość zdarzenia
+ Zdarzenie stanowe wysłane!
+ Zdarzenie wysłane!
+ Nieprawidłowe zdarzenie
+ Zawartość wydarzenia
+ Klucz stanu
+ Konsultacja z %1$s
+ Serwer domowy nie akceptuje nazwy użytkownika zawierającej tylko cyfry.
+ Wymusza odrzucenie bieżącej sesji grupy wychodzącej w zaszyfrowanym pokoju
+ Pobieranie krzywego klucza
+ Szyfrowanie jest błędnie skonfigurowane
+ Przywróć szyfrowanie
+ Skontaktuj się z administratorem, aby przywrócić szyfrowanie do prawidłowego stanu.
+ Szyfrowanie zostało błędnie skonfigurowane.
+ Utwórz konto
+ Pomiń ten krok
+ Zapisz i kontynuuj
+ Twoje ustawienia zostały zapisane.
+ Wszystko ustawiłeś!
+ Chodźmy
+ Możesz go zmienić w każdym momencie.
+ Dodaj obraz profilu
+ Możesz zmienić ją później
+ Powiadomienie pokoju
+ Wyświetlana nazwa
+ Będzie ona widoczna podczas wysyłania wiadomości.
+ Wybierz wyświetlaną nazwę
+ Twoje konto %s zostało utworzone.
+ Gratulacje!
+ Zabierz mnie do domu
+ Spersonalizuj profil
+ Połącz się z serwerem
+ Chcesz dołączyć do istniejącego serwera\?
+ pominąć to pytanie
+ Nie wiesz jeszcze\? Możesz %s
+ Społeczności
+ Zespoły
+ Przyjaciele i rodzina
+ Pomożemy Ci się połączyć.
+ Z kim będziesz najczęściej rozmawiać\?
+ Szyfrowane od-końca-do-końca i nie wymaga numeru telefonu. Brak reklam i dataminingu.
+ Wybierz, gdzie prowadzone są Twoje rozmowy, dając Ci kontrolę i niezależność. Połączenie przez sieć Matrix.
+ Bezpieczna i niezależna komunikacja, która zapewnia ten sam poziom prywatności, co rozmowa twarzą w twarz we własnym domu.
+ Wiadomości dla Twojego zespołu.
+ Położenie
+ Zagadnienia prawne
+ Już przeglądasz ten wątek!
+ Wyświetl w pokoju
+ Odpowiedz w wątku
+ Polecenie „%s” jest rozpoznawane, ale nie jest obsługiwane w wątkach.
+ Ten serwer nie zapewnia żadnych zasad.
+ Polityka Twojego serwera tożsamości
+ Polityka Twojego serwera domowego
+ Polityka ${app_name}
+ Wątki zbliżają się do wersji beta 🎉
+ Z wątku
+ Wskazówka: naciśnij i przytrzymaj wiadomość i użyj „%s”.
+ Dzięki wątkom Twoje rozmowy są aktualne i łatwe do śledzenia.
+ Organizuj dyskusje za pomocą wątków
+ Pokazuje wszystkie wątki, w których brałeś udział
+ Pokazuje wszystkie wątki z bieżącego pokoju
+ Moje wątki
+ Wszystkie wątki
+ Filtr
+ Wątki
+ Wątek
+ Filtruj wątki w pokoju
+ Szyfrowanie zostało źle skonfigurowane, więc nie możesz wysyłać wiadomości. Kliknij, aby otworzyć ustawienia.
+ Szyfrowanie zostało źle skonfigurowane, więc nie możesz wysyłać wiadomości. Skontaktuj się z administratorem, aby przywrócić szyfrowanie do prawidłowego stanu.
+ %1$s, %2$s i inni
+ %1$s i %2$s
+ Skopiuj odnośnik do wątku
+ Zobacz w pokoju
+ Wyłącz
+ Wyświetl wątki
\ No newline at end of file
From de109c9772458f1f0c2f41480e08c2c8cfcbebd9 Mon Sep 17 00:00:00 2001
From: maciejek997
Date: Tue, 5 Apr 2022 13:13:52 +0000
Subject: [PATCH 028/198] Translated using Weblate (Polish)
Currently translated at 97.4% (2135 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index ef24d6e62b..662574536f 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -2445,4 +2445,14 @@
Zobacz w pokojuWyłączWyświetl wątki
+ Utwórz ankietę
+ Otwórz kontakty
+ Wyślij naklejkę
+ Prześlij plik
+ Wyślij obrazy oraz wideo
+ Otwórz kamerę
+ Usuń ankietę
+ Ankieta zakończona
+ Oddano głos
+ Zakończ ankietę
\ No newline at end of file
From fca0b042e879f5c6fba76fccef851bfffacd572c Mon Sep 17 00:00:00 2001
From: Jeff Huang
Date: Wed, 6 Apr 2022 04:13:09 +0000
Subject: [PATCH 029/198] Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/
---
vector/src/main/res/values-zh-rTW/strings.xml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml
index 781591ace7..ea0c677168 100644
--- a/vector/src/main/res/values-zh-rTW/strings.xml
+++ b/vector/src/main/res/values-zh-rTW/strings.xml
@@ -2391,4 +2391,23 @@
\n
\n這會是一次性的過渡,因為討論串現在是 Matrix 規範的一部分了。
討論串接近測試版了 🎉
+ 正在進行位置分享
+ ${app_name} 即時位置
+ 家伺服器不接受僅有數字的使用者名稱。
+ 略過此步驟
+ 儲存並繼續
+ 您的偏好設定已儲存。
+ 準備好了!
+ 走吧
+ 您可以在任何時候變更這個。
+ 新增個人資訊照片
+ 您可以在稍後變更這個
+ 顯示名稱
+ 這將會在您傳送訊息時顯示。
+ 選擇顯示名稱
+ 您的帳號 %s 已建立。
+ 恭喜!
+ 帶我回家
+ 個人化檔案
+ 停用
\ No newline at end of file
From 0167e3a222b7cab6396928a6efcc7d73b4f5531a Mon Sep 17 00:00:00 2001
From: Danial Behzadi
Date: Tue, 5 Apr 2022 12:34:02 +0000
Subject: [PATCH 030/198] Translated using Weblate (Persian)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/
---
vector/src/main/res/values-fa/strings.xml | 29 ++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml
index ab6bac5c1b..9a23913f76 100644
--- a/vector/src/main/res/values-fa/strings.xml
+++ b/vector/src/main/res/values-fa/strings.xml
@@ -1247,7 +1247,7 @@
نتیجهای در پی نداشتفیلترکردن کاربران مسدود شده
- %d مورد
+ ۱ مورد%d موردتنها اگر مدیر کارساز، اثرانگشتی منتشر کرده که با بالایی مطابق است، بپذیرید.
@@ -2430,4 +2430,31 @@
همرسانی مکان کنونیمبزرگنمایی به مکان کنونیسنجاق مکان گزیده روی نقشه
+ داریم به ارائه یک بتای عمومی برای رشتهها نزدیکتر میشویم.
+\n
+\nهمینطور که برایش آماده میشویم، نیاز به انجام چند تغییر است: رشتههایی که پیش از این ایجاد شدهاند،به شکل پاسخهای عادی نشان داده خواهند شد.
+\n
+\nاین کار، یک تبدیل یک باره است؛ چرا که رشتهها اکنون بخشی از مشخّصات ماتریکسند.
+ رشتهها به بتا می رسند 🎉
+ همرساین مکان در حال انجام است
+ مکان زندهٔ ${app_name}
+ اگر میخواهید مکانتان را همرسانی کنید، ${app_name} نیاز به دسترسی همیشگی مکان هنگام در پسزمینه بودن کاره دارد.
+\nفقط برای مدتی که برمیگزینید، به مکانتان دسترسی خواهیم داشت.
+ کارساز خانگی، نامهای کاربری فقط رقمی را نمیپذیرد.
+ پرش از این گام
+ ذخیره و ادامه
+ ترجیحاتتان ذخیره شد.
+ همهچیز تنظیم شده!
+ بزن بریم
+ میتوانید هرزمانی تغییرش دهید.
+ گزینش نامی نمایشی
+ افزودن یک تصویر نمایه
+ میتوانید بعدها تغییرش دهید
+ نام نمایشی
+ هنگامی که پیام میفرستید نشان داده خواهد شد.
+ حسابتان %s ایجاد شد.
+ تبریک!
+ مرا به خانه ببر
+ شخصی سازی نمایه
+ از کار انداختن
\ No newline at end of file
From 1a6de70d927891891d4da4000c946e16ebf2b915 Mon Sep 17 00:00:00 2001
From: random
Date: Wed, 6 Apr 2022 08:29:04 +0000
Subject: [PATCH 031/198] Translated using Weblate (Italian)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/it/
---
fastlane/metadata/android/it-IT/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/it-IT/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/it-IT/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/it-IT/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/it-IT/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/it-IT/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/it-IT/changelogs/40104060.txt b/fastlane/metadata/android/it-IT/changelogs/40104060.txt
new file mode 100644
index 0000000000..c9ea8af2cc
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: la linea temporale per argomenti è ora attiva e più veloce. Varie correzioni e miglioramenti.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/it-IT/changelogs/40104070.txt b/fastlane/metadata/android/it-IT/changelogs/40104070.txt
new file mode 100644
index 0000000000..2dfd415920
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: varie correzioni di errori e miglioramenti della stabilità.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/it-IT/changelogs/40104080.txt b/fastlane/metadata/android/it-IT/changelogs/40104080.txt
new file mode 100644
index 0000000000..8427e3d3fe
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: la linea temporale per argomenti è ora attiva e più veloce. Varie correzioni e miglioramenti.
+Cronologia completa: https://github.com/vector-im/element-android/releases
From 5f30a66929a3faf79e0f191cabf13788174b10a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?=
Date: Tue, 5 Apr 2022 16:38:40 +0000
Subject: [PATCH 032/198] Translated using Weblate (Estonian)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/et/
---
fastlane/metadata/android/et/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/et/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/et/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/et/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/et/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/et/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/et/changelogs/40104060.txt b/fastlane/metadata/android/et/changelogs/40104060.txt
new file mode 100644
index 0000000000..f506b617ed
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: jutulõngad on nüüd kasutatavad ja toimivad kiiremini, lisaks pisiparandused ja stabiilsust parandavad kohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/et/changelogs/40104070.txt b/fastlane/metadata/android/et/changelogs/40104070.txt
new file mode 100644
index 0000000000..ea3582678d
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: pisiparandused ja stabiilsust parandavad kohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/et/changelogs/40104080.txt b/fastlane/metadata/android/et/changelogs/40104080.txt
new file mode 100644
index 0000000000..a35fded9b6
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: jutulõngad on nüüd kasutatavad ja toimivad kiiremini, lisaks pisiparandused ja stabiilsust parandavad kohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases
From 9e39df111d8aadf26cf914503565b51f9150bd90 Mon Sep 17 00:00:00 2001
From: LinAGKar
Date: Wed, 6 Apr 2022 19:38:40 +0000
Subject: [PATCH 033/198] Translated using Weblate (Swedish)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/sv/
---
vector/src/main/res/values-sv/strings.xml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml
index 2b4e3502f8..c6c8b45441 100644
--- a/vector/src/main/res/values-sv/strings.xml
+++ b/vector/src/main/res/values-sv/strings.xml
@@ -2438,4 +2438,23 @@
\nMedan vi förbereder den så behöver vi göra några ändringar: trådar skapade innan den här tidpunkten kommer att visas som vanliga svar.
\n
\nDet kommer att vara en engångshändelse, eftersom trådar nu är en del av Matrixspecifikationen.
+ Platsdelning pågår
+ ${app_name} Kontinuerlig plats
+ Hemservern accepterar inte användarnamn med bara siffror.
+ Hoppa över det här steget
+ Spara och fortsätt
+ Dina inställningar har sparats.
+ Du är redo!
+ Nu kör vi
+ Du kan ändra detta när som helst.
+ Lägg till en profilbild
+ Du kan ändra detta senare
+ Visningsnamn
+ Det här kommer att visas när du skickar meddelanden.
+ Välj ett visningsnamn
+ Ditt konto %s har skapats.
+ Grattis!
+ För mig hem
+ Anpassa profil
+ Inaktivera
\ No newline at end of file
From b2b1e1ca0a51a9d4df3f8468ea7db1959d921f4d Mon Sep 17 00:00:00 2001
From: Jozef Gaal
Date: Tue, 5 Apr 2022 18:26:33 +0000
Subject: [PATCH 034/198] Translated using Weblate (Slovak)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/sk/
---
fastlane/metadata/android/sk/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/sk/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/sk/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/sk/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/sk/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/sk/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/sk/changelogs/40104060.txt b/fastlane/metadata/android/sk/changelogs/40104060.txt
new file mode 100644
index 0000000000..53e192fe7c
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Vlákna na časovej osi sú teraz živé a rýchlejšie. Rôzne opravy chýb a vylepšenia stability.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/sk/changelogs/40104070.txt b/fastlane/metadata/android/sk/changelogs/40104070.txt
new file mode 100644
index 0000000000..1e056cf32f
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Rôzne opravy chýb a vylepšenia stability.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/sk/changelogs/40104080.txt b/fastlane/metadata/android/sk/changelogs/40104080.txt
new file mode 100644
index 0000000000..7f42250fb9
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Vlákna na časovej osi sú teraz živé a rýchlejšie. Rôzne opravy chýb a vylepšenia stability.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases
From 9e85abe8e61c6a985459a659407b85f1adf39c98 Mon Sep 17 00:00:00 2001
From: Danial Behzadi
Date: Tue, 5 Apr 2022 12:21:05 +0000
Subject: [PATCH 035/198] Translated using Weblate (Persian)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/
---
fastlane/metadata/android/fa/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/fa/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/fa/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/fa/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/fa/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/fa/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/fa/changelogs/40104060.txt b/fastlane/metadata/android/fa/changelogs/40104060.txt
new file mode 100644
index 0000000000..5a1188b370
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: خط زمانی رشتهها اکنون زنده و سریعتر است. چندین رفع اشکال و بهبود پایداری.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/fa/changelogs/40104070.txt b/fastlane/metadata/android/fa/changelogs/40104070.txt
new file mode 100644
index 0000000000..d35ded337b
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: چندین رفع اشکال و بهبود پایداری.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/fa/changelogs/40104080.txt b/fastlane/metadata/android/fa/changelogs/40104080.txt
new file mode 100644
index 0000000000..673a46a10d
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: خط زمانی رشتهها اکنون زنده و سریعتر است. چندین رفع اشکال و بهبود پایداری.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases
From 9fb71130a40675a54573ade48cdf9a399a1fe383 Mon Sep 17 00:00:00 2001
From: lvre <7uu3qrbvm@relay.firefox.com>
Date: Tue, 5 Apr 2022 17:13:06 +0000
Subject: [PATCH 036/198] Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/
---
vector/src/main/res/values-pt-rBR/strings.xml | 43 +++++++++++++------
1 file changed, 31 insertions(+), 12 deletions(-)
diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml
index d06937fb64..f682a123f4 100644
--- a/vector/src/main/res/values-pt-rBR/strings.xml
+++ b/vector/src/main/res/values-pt-rBR/strings.xml
@@ -1953,11 +1953,11 @@
%d entradasLimite de upload de arquivo do servidor
- Qualquer pessoa num espaço com esta sala pode encontrá-la e juntar-se a ela. Somente admins desta sala podem adicioná-la a um espaço.
+ Qualquer pessoa num espaço com esta sala pode achá-la e se juntar a ela. Somente admins desta sala podem adicioná-la a um espaço.Membros de espaço somente
- Qualquer pessoa pode encontrar a sala e juntar-se
+ Qualquer pessoa pode achar a sala e se juntarPública
- Somente pessoas convidadas podem encontrar e juntar-se
+ Somente pessoas convidadas podem achar e se juntarPrivadaConfiguração de acesso desconhecida (%s)Qualquer pessoa pode tocar na sala, membros podem então aceitar ou rejeitar
@@ -2024,7 +2024,7 @@
%d pessoas que você conhece já têm se juntadoJuntar-Se a Espaço
- Criar Espaço
+ Criar espaçoJunte-se a meu espaço %1$s %2$sElas vão ser capazes de explorar %sConvidar para %s
@@ -2058,7 +2058,7 @@
Que tipo de espaço você quer criar\?Seu espaço privadoSeu espaço público
- Adicionar Espaço
+ Adicionar espaçoEspaço privadoEspaço públicoCriar um Espaço
@@ -2111,8 +2111,8 @@
%d chamadas de áudio perdidasPor favor note que fazer upgrade vai fazer uma nova versão da sala. Todas as mensagens atuais vão permanecer nesta sala arquivada.
- Qualquer pessoa em um espaço pai vai ser capaz de encontrar e juntar-se a esta sala - não precisa convidar manualmente todo mundo. Você vai ser capaz de mudar isto em configurações de sala a qualquer hora.
- Qualquer pessoa em %s vai ser capaz de encontrar e juntar-se a esta sala - não precisa convidar todo mundo. Você vai ser capaz de mudar isto em configurações de sala a qualquer hora.
+ Qualquer pessoa em um espaço pai vai ser capaz de achar e se juntar a esta sala - não precisa convidar manualmente todo mundo. Você vai ser capaz de mudar isto em configurações de sala a qualquer hora.
+ Qualquer pessoa em %s vai ser capaz de achar e se juntar a esta sala - não precisa convidar todo mundo. Você vai ser capaz de mudar isto em configurações de sala a qualquer hora.Mensagem de Voz (%1$s)Não dá para responder ou editar enquanto mensagem de voz está ativaNão dá para gravar uma mensagem de voz
@@ -2130,13 +2130,13 @@
VozOutros espaços ou salas que você poderia não saberEspaço que você sabe que contém esta sala
- Decida quem pode encontrar e juntar-se a esta sala.
+ Decida quem pode achar e se juntar a esta sala.Toque para editar espaçosSelecionar espaços
- Decida que espaços podem acessar esta sala. Se um espaço é selecionado seus membros vão ser capazes de encontrar e juntar-se a Nome de sala.
+ Decida que espaços podem acessar esta sala. Se um espaço é selecionado seus membros vão ser capazes de achar e se juntar a Nome de sala.Espaços que podem acessarPermitir membros de espaço a encontrar e acessar.
- Membros de Escpaço %s podem encontrar, previsualizar e juntar-se.
+ Membros de Espaço %s podem achar, previsualizar e se juntar.Privada (Convite Somente)Para enviar mensagens de voz, por favor conceda a permissão Microfone.Notifique-me para
@@ -2222,7 +2222,7 @@
Abrir Configurações de DescobertaPesquisar por nome, ID ou mailCriar Novo Espaço
- Qualquer pessoa pode encontrar o espaço e se juntar
+ Qualquer pessoa pode achar o espaço e se juntarAcesso a espaçoQuem pode acessar\?Habilitar notificações de email para %s
@@ -2392,7 +2392,7 @@
O comando \"%s\" é reconhecido mas não suportado em threads.De uma ThreadDica: Toque longo numa mensagem e use “%s”.
- Threads ajudam a manter suas conversas em-tópico e fáceis de rastrear.
+ Threads ajudam manter suas conversas em-tópico e fáceis de rastrear.Mantenha discussões organizadas com threadsMostra todas as threads nas quais você tem participadoMinhas Threads
@@ -2438,4 +2438,23 @@
\n
\nIsto vai ser uma transição única visto que Threads são agora parte da especificação Matrix.
Threads Aproximando-Se a Beta 🎉
+ ${app_name} Localização ao Vivo
+ Compartilhamento de localização está em progresso
+ O servidorcasa não aceita nome de usuária(o) com somente dígitos.
+ Pular este passo
+ Salvar e continuar
+ Suas preferências têm sido salvas.
+ Você está pronta(o)!
+ Vamo lá
+ Você pode mudar isto a qualquer hora.
+ Adicione uma imagem de perfil
+ Você pode mudar isto mais tarde
+ Nome de Exibição
+ Isto vai ser mostrado quando você enviar mensagens.
+ Escolha um nome de exibição
+ Sua conta %s tem sido criada.
+ Parabéns!
+ Me leve para casa
+ Personalizar perfil
+ Desabilitar
\ No newline at end of file
From e6e9681856d8898a2a57a2b946152742c4dea5c2 Mon Sep 17 00:00:00 2001
From: Jeff Huang
Date: Wed, 6 Apr 2022 04:04:09 +0000
Subject: [PATCH 037/198] Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/
---
fastlane/metadata/android/zh-TW/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/zh-TW/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/zh-TW/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104060.txt b/fastlane/metadata/android/zh-TW/changelogs/40104060.txt
new file mode 100644
index 0000000000..316fad3363
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:討論串時間軸現已更新,而且更快了。多個臭蟲修復與穩定性改善。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104070.txt b/fastlane/metadata/android/zh-TW/changelogs/40104070.txt
new file mode 100644
index 0000000000..2cd9da666e
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:多個臭蟲修復與穩定性改善。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104080.txt b/fastlane/metadata/android/zh-TW/changelogs/40104080.txt
new file mode 100644
index 0000000000..c036aa7d56
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:討論串時間軸現已更新,而且更快了。多個臭蟲修復與穩定性改善。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases
From 2b3e3cf7e69c36a08b347fe687e34c521d862447 Mon Sep 17 00:00:00 2001
From: LinAGKar
Date: Wed, 6 Apr 2022 19:27:48 +0000
Subject: [PATCH 038/198] Translated using Weblate (Swedish)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/sv/
---
fastlane/metadata/android/sv-SE/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/sv-SE/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/sv-SE/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40104060.txt b/fastlane/metadata/android/sv-SE/changelogs/40104060.txt
new file mode 100644
index 0000000000..16a49fa3bc
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Trådtidslinje är nu live och snabbare. Diverse buggfixar och stabilitetsförbättringar.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40104070.txt b/fastlane/metadata/android/sv-SE/changelogs/40104070.txt
new file mode 100644
index 0000000000..01f79e85d6
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Diverse buggfixar och stabilitetsförbättringar.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40104080.txt b/fastlane/metadata/android/sv-SE/changelogs/40104080.txt
new file mode 100644
index 0000000000..2ac7df2cda
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Trådtidslinje är nu live och snabbare. Diverse buggfixar och stabilitetsförbättringar.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.4.8
From 7ae42d81c15cecd51a03f6f50466a4429701d546 Mon Sep 17 00:00:00 2001
From: Ihor Hordiichuk
Date: Tue, 5 Apr 2022 17:34:15 +0000
Subject: [PATCH 039/198] Translated using Weblate (Ukrainian)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/
---
vector/src/main/res/values-uk/strings.xml | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml
index 26d090e3ef..ce1781cb9c 100644
--- a/vector/src/main/res/values-uk/strings.xml
+++ b/vector/src/main/res/values-uk/strings.xml
@@ -1490,7 +1490,7 @@
Невідоме налаштування доступу (%s)Будь-хто може попроситися до кімнати, учасники можуть прийняти або відхилитиУсе одно приєднатися
- Створити Простір
+ Створити простірПриєднатися до ПросторуПоділитися посиланнямЗапросити електронним листом
@@ -2530,4 +2530,23 @@
\n
\nЦе буде одноразовий перехід, оскільки треди — тепер частина специфікації Matrix.
Незабаром бета-версія тредів 🎉
+ Триває передавання місцеперебування
+ ${app_name} Місцеперебування наживо
+ Домашній сервер не приймає ім\'я користувача лише з цифр.
+ Пропустити цей крок
+ Зберегти й продовжити
+ Ваші налаштування збережено.
+ Усе налаштовано!
+ Поїхали
+ Ви можете змінити його будь-коли.
+ Додати зображення профілю
+ Ви можете змінити його пізніше
+ Показуване ім\'я
+ Його буде показано у надісланих повідомленнях.
+ Виберіть показуване ім\'я
+ Ваш обліковий запис %s створено.
+ Вітаємо!
+ На головну
+ Персоналізувати профіль
+ Вимкнути
\ No newline at end of file
From 051cf101d1f6e3335b7fb86ed2e2a55d259da7f6 Mon Sep 17 00:00:00 2001
From: Linerly
Date: Tue, 5 Apr 2022 22:59:01 +0000
Subject: [PATCH 040/198] Translated using Weblate (Indonesian)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/id/
---
fastlane/metadata/android/id/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/id/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/id/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/id/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/id/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/id/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/id/changelogs/40104060.txt b/fastlane/metadata/android/id/changelogs/40104060.txt
new file mode 100644
index 0000000000..3b4ce82497
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Linimasa utasan sekarang langsung dan lebih cepat. Banyak perbaikan kutu dan perbaikan stabilitas.
+Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/id/changelogs/40104070.txt b/fastlane/metadata/android/id/changelogs/40104070.txt
new file mode 100644
index 0000000000..39daf31eb6
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Banyak perbaikan kutu dan perbaikan stabilitas.
+Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/id/changelogs/40104080.txt b/fastlane/metadata/android/id/changelogs/40104080.txt
new file mode 100644
index 0000000000..0a5ae82096
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Linimasa utasan sekarang langsung dan lebih cepat. Banyak perbaikan kutu dan perbaikan stabilitas.
+Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases
From c54a124d34ae2ae7524ab9445573723361c49cec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?=
Date: Wed, 6 Apr 2022 17:24:09 +0000
Subject: [PATCH 041/198] Translated using Weblate (Estonian)
Currently translated at 99.9% (2188 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/et/
---
vector/src/main/res/values-et/strings.xml | 27 +++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml
index e320550323..19b4d37102 100644
--- a/vector/src/main/res/values-et/strings.xml
+++ b/vector/src/main/res/values-et/strings.xml
@@ -245,7 +245,7 @@
Kas sa oled kindel\?VarundaKui sa enne väljalogimist ei varunda oma võtmeid, siis sa kaotad ligipääsu oma krüptitud sõnumitele.
- Laeme…
+ Laadime…SobibTühistaSalvesta
@@ -1958,7 +1958,7 @@
Kogukonnakeskused on uus võimalus siduda jututubasid ja inimesi.Lisa olemasolevaid jututubasid ja kogukonnakeskuseidLahku kogukonnast
- Lisa jututuba
+ Lisa jututubeTutvu jututubadega%d sinu tuttav on juba liitunud
@@ -1968,7 +1968,7 @@
\nProovi hiljem uuesti või küsi jututoa haldajalt, kas sul on olemas selleks vajalikud õigused.
Liitu ikkagiLiitu kogukonnakeskusega
- Loo kogukonnakeskus
+ Loo kogukondHetkel jäta vahelePalun liitu %1$s kogukonnakeskusega %2$sNad ei saa osalema %s jututoas
@@ -2007,7 +2007,7 @@
Missugust kogukonnakeskust sooviksid sa luua\?Sinu privaatne kogukonnakeskusSinu avalik kogukonnakeskus
- Lisa kogukonnakeskus
+ Lisa kogukondLahku antud tunnusega jututoast (tunnuse puudumisel jututoast, kus hetkel asud)Liitu kogukonnakeskusega tema tunnuse aluselLoo kogukonnakeskus
@@ -2438,4 +2438,23 @@
\n
\nKuna jutulõngad on nüüd osa Matrix\'i spetsifikatsioonist, siis see on ühekordne muudatus.
Jutulõngad on peaaegu valmis 🎉
+ Asukoha reaalajas jagamine on hetkel kasutusel
+ Asukoht reaalajas - ${app_name}
+ Koduserver ei võimalda ainult numbritest koosneva kasutajanime loomist.
+ Jäta see samm vahele
+ Salvesta ja jätka
+ Sinu eelistused on salvestatud.
+ Kõik on valmis!
+ Alustame nüüd
+ Sa võid seda hiljem alati muuta.
+ Lisa profiilipilt
+ Sa võid seda hiljem muuta
+ Kuvatav nimi
+ Seda näidatakse sõnumite saatmisel.
+ Vali kuvatav nimi
+ Sinu kasutajakonto %s on nüüd olemas.
+ Õnnitlused!
+ Mine avalehele
+ Isikupärasta oma profiili
+ Lülita välja
\ No newline at end of file
From f9a9c72c7b3ca0cff88d041ced8f8d6bfcfd6948 Mon Sep 17 00:00:00 2001
From: Besnik Bleta
Date: Fri, 8 Apr 2022 12:14:36 +0000
Subject: [PATCH 042/198] Translated using Weblate (Albanian)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/sq/
---
fastlane/metadata/android/sq/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/sq/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/sq/changelogs/40104080.txt | 2 ++
3 files changed, 6 insertions(+)
create mode 100644 fastlane/metadata/android/sq/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/sq/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/sq/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/sq/changelogs/40104060.txt b/fastlane/metadata/android/sq/changelogs/40104060.txt
new file mode 100644
index 0000000000..48cbd2150c
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Vijat kohore të rrjedhave tani janë në punë dhe më të shpejta. Ndreqje të metash të ndryshme dhe përmirësime qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/sq/changelogs/40104070.txt b/fastlane/metadata/android/sq/changelogs/40104070.txt
new file mode 100644
index 0000000000..ad487c57ee
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash të ndryshme dhe përmirësime qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/sq/changelogs/40104080.txt b/fastlane/metadata/android/sq/changelogs/40104080.txt
new file mode 100644
index 0000000000..49156d0c96
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Vijat kohore të rrjedhave tani janë në punë dhe më të shpejta. Ndreqje të metash të ndryshme dhe përmirësime qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
From b4e8b073812d62a4540f00f580f25d5b57b69731 Mon Sep 17 00:00:00 2001
From: Besnik Bleta
Date: Fri, 8 Apr 2022 12:19:14 +0000
Subject: [PATCH 043/198] Translated using Weblate (Albanian)
Currently translated at 99.4% (2177 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/sq/
---
vector/src/main/res/values-sq/strings.xml | 24 +++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml
index fb7fb1448e..ddb492016c 100644
--- a/vector/src/main/res/values-sq/strings.xml
+++ b/vector/src/main/res/values-sq/strings.xml
@@ -1957,7 +1957,7 @@
\nRiprovoni më vonë, ose kërkojini një përgjegjësi dhome të kontrollojë nëse keni leje për hyrje.
Hyni, Sido QoftëHyni te Hapësirë
- Krijo Hapësirën
+ Krijo hapësirënHëpërhë anashkalojeEjani në hapësirën time %1$s %2$sS’do të jenë pjesë e %s
@@ -1996,7 +1996,7 @@
Ç’lloj hapësire doni të krijoni\?Hapësira juaj privateHapësira juaj publike
- Shtoni Hapësirë
+ Shtoni hapësirëBraktiseni dhomën me ID-në e dhënë (ose dhomën e tanishme, në qoftë nul)Hyni te Hapësira me ID-në e dhënëKrijoni një Hapësirë
@@ -2425,4 +2425,24 @@
\n
\nKy do të jetë tranzicion vetëm për një herë, meqë tanimë Rrjedhat janë pjesë e protokollit Matrix.
Rrjedhat Po i Afrohen Beta-s 🎉
+ Tregimi i vendndodhjes është në punë e sipër
+ Jepe vendndodhjen “live”
+ Jepe vendndodhjen “live”
+ Shërbyesi Home s’pranon emër përdorues vetëm me shifra.
+ Anashkalojeni këtë hap
+ Ruajeni dhe vazhdoni
+ Parapëlqimet tuaja u ruajtën.
+ Kaq qe!
+ Shkojmë
+ Këtë mund ta ndryshoni kurdo.
+ Shtoni një foto profili
+ Këtë mund ta ndryshoni më vonë
+ Emër Në Ekran
+ Kjo do të shfaqet kur dërgoni mesazhe.
+ Zgjidhni një emër për në ekran
+ Llogaria juaj %s u krijua.
+ Përgëzime!
+ Shpjemëni në shtëpi
+ Personalizoni profil
+ Çaktivizoje
\ No newline at end of file
From 323954be333e490ce335baccd4f79d9f32f02034 Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Fri, 8 Apr 2022 09:15:21 +0000
Subject: [PATCH 044/198] Translated using Weblate (Polish)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
---
vector/src/main/res/values-pl/strings.xml | 99 ++++++++++++++++++++++-
1 file changed, 97 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml
index 662574536f..9c1e9a9264 100644
--- a/vector/src/main/res/values-pl/strings.xml
+++ b/vector/src/main/res/values-pl/strings.xml
@@ -1,5 +1,5 @@
-
+Zaproszenie od %s%1$s zaprosił(a) %2$s%1$s zaprosił(a) Cię
@@ -1952,7 +1952,7 @@
Niektóre pokoje mogą być ukryte, gdyż są prywatne i wymagają od Ciebie zaproszenia.Niektóre pokoje mogą być ukryte, gdyż są prywatne i wymagają od Ciebie zaproszenia.
\nNie masz uprawnień aby dodawać pokoje.
- W tej Przestrzeni nie ma żadnych pokojów
+ W tej przestrzeni nie ma żadnych pokojówProszę skontaktować się z administratorem Twojego serwera domowego aby uzyskać więcej informacjiWygląda na to, że Twój serwer domowy jeszcze nie obsługuje PrzestrzeniLubisz eksperymentować\?
@@ -2455,4 +2455,99 @@
Ankieta zakończonaOddano głosZakończ ankietę
+
+ I jeszcze %1$d
+ I jeszcze %1$d
+ I jeszcze %1$d
+ I jeszcze %1$d
+
+
+ Wynik końcowy na podstawie %1$d głosu
+ Wynik końcowy na podstawie %1$d głosów
+ Wynik końcowy na podstawie %1$d głosów
+ Wynik końcowy na podstawie %1$d głosów
+
+
+ Oddano %1$d głos. Głosuj, aby zobaczyć wyniki
+ Oddano %1$d głosy. Głosuj, aby zobaczyć wyniki
+ Oddano %1$d głosów. Głosuj, aby zobaczyć wyniki
+ Oddano %1$d głosów. Głosuj, aby zobaczyć wyniki
+
+
+ W oparciu o %1$d głos
+ W oparciu o %1$d głosy
+ W oparciu o %1$d głosów
+ W oparciu o %1$d głosów
+
+
+ %1$d głos
+ %1$d głosy
+ %1$d głosów
+ %1$d głosów
+
+
+ Wymagana jest co najmniej %1$s opcja
+ Wymagane są co najmniej %1$s opcje
+ Wymaganych jest co najmniej %1$s opcji
+ Wymaganych jest co najmniej %1$s opcji
+
+ Zbliżamy się do udostępnienia publicznej wersji beta dla wątków.
+\n
+\nPrzygotowując się do tego, musimy wprowadzić pewne zmiany: wątki utworzone przed tym punktem będą wyświetlane jako zwykłe odpowiedzi.
+\n
+\nBędzie to jednorazowe przejście, ponieważ wątki są teraz częścią specyfikacji Matrix.
+
+ %d zmieniony ACL serwera
+ %d zmienione ACL serwera
+ %d zmienionych ACL serwera
+ %d zmienionych ACL serwera
+
+ Pokaż mniej
+ Udostępnij lokalizację
+ Pokaż dymki wiadomości
+ Trwa udostępnianie lokalizacji
+ Lokalizacja na żywo ${app_name}
+ Zatrzymaj
+ Włączona lokalizacja na żywo
+ Nie udało się wczytać mapy
+ Renderuj lokalizacje użytkowników na osi czasu
+ Po włączeniu będziesz mógł wysłać swoją lokalizację do dowolnego pokoju
+ Włącz udostępnianie lokalizacji
+ Otwórz za pomocą
+ ${app_name} nie może uzyskać dostępu do Twojej lokalizacji. Spróbuj ponownie później.
+ ${app_name} nie może uzyskać dostępu do Twojej lokalizacji
+ Jeśli chcesz udostępniać swoją lokalizację na żywo, ${app_name} potrzebuje dostępu do lokalizacji przez cały czas, gdy aplikacja działa w tle.
+\n Będziemy mieć dostęp do Twojej lokalizacji tylko przez wybrany przez Ciebie okres.
+ Zgoda na dostęp
+ Udostępnij tę lokalizację
+ Udostępnij tę lokalizację
+ Udostępnij lokalizację na żywo
+ Udostępnij lokalizację na żywo
+ Udostępnij moją aktualną lokalizację
+ Udostępnij moją aktualną lokalizację
+ Powiększ do bieżącej lokalizacji
+ Przypnij na mapie wybraną lokalizację
+ Udostępnij lokalizację
+ Mapa
+ Udostępnij lokalizację
+ Lokalizacja
+ Udostępnij lokalizację
+ Wyniki są ujawniane dopiero po zakończeniu ankiety
+ Ankieta zamknięta
+ Głosujący widzą wyniki zaraz po oddaniu głosu
+ Otwarta ankieta
+ Rodzaj ankiety
+ Modyfikacja ankiety
+ opcja zwyciężająca
+ Brak głosów
+ Zaproszenie do tej przestrzeni zostało wysłane do %s, które nie jest powiązane z Twoim kontem
+ Zaproszenie do tego pokoju zostało wysłane do %s, które nie jest powiązane z Twoim kontem
+ Każdy w przestrzeni nadrzędnej będzie mógł znaleźć ten pokój i dołączyć do niego — nie ma potrzeby ręcznego zapraszania wszystkich. W każdej chwili możesz to zmienić w ustawieniach pokoju.
+ Automatycznie aktualizuj nadrzędną przestrzeń
+ Twój system automatycznie wyśle dzienniki, gdy wystąpi błąd niemożności odszyfrowania
+ Błędy automatycznego deszyfrowania raportów.
+ Opuść pokój o podanym identyfikatorze (lub aktualny pokój, jeśli null)
+ Udostępnili swoją lokalizację
+ Powiadom cały pokój
+ Użytkownicy
\ No newline at end of file
From 44446ce3959e80d7d82e9250d5852d6dc674b161 Mon Sep 17 00:00:00 2001
From: Piotr Strebski
Date: Fri, 8 Apr 2022 09:41:07 +0000
Subject: [PATCH 045/198] Translated using Weblate (Polish)
Currently translated at 40.0% (22 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/pl/
---
fastlane/metadata/android/pl-PL/changelogs/40103060.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103080.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103090.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103100.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103110.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103120.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103130.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103140.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103150.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103160.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103170.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40103180.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40104000.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40104020.txt | 2 ++
fastlane/metadata/android/pl-PL/changelogs/40104040.txt | 2 ++
fastlane/metadata/android/pl-PL/title.txt | 2 +-
16 files changed, 31 insertions(+), 1 deletion(-)
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103060.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103080.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103090.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103100.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103110.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103120.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103130.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103140.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103150.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103160.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103170.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40103180.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40104000.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40104020.txt
create mode 100644 fastlane/metadata/android/pl-PL/changelogs/40104040.txt
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103060.txt b/fastlane/metadata/android/pl-PL/changelogs/40103060.txt
new file mode 100644
index 0000000000..9dc1e9e297
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103060.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Dodanie obsługi obecności, dla pokoju wiadomości bezpośrednich (uwaga: obecność jest wyłączona na matrix.org). Dodano ponownie obsługę Android Auto.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.6
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103080.txt b/fastlane/metadata/android/pl-PL/changelogs/40103080.txt
new file mode 100644
index 0000000000..c850479f59
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103080.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Poprawki błędów!
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.8
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103090.txt b/fastlane/metadata/android/pl-PL/changelogs/40103090.txt
new file mode 100644
index 0000000000..13e1aed51e
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103090.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Dodano obsługę wersji roboczej wiadomości głosowych. Wiele poprawek!
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.9
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103100.txt b/fastlane/metadata/android/pl-PL/changelogs/40103100.txt
new file mode 100644
index 0000000000..406f07f70f
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103100.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Dodano obsługę ankiet (w laboratoriach). Nowy projekt podglądu adresu URL.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.10
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103110.txt b/fastlane/metadata/android/pl-PL/changelogs/40103110.txt
new file mode 100644
index 0000000000..f9b38673c7
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103110.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Poprawki błędów!
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.11
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103120.txt b/fastlane/metadata/android/pl-PL/changelogs/40103120.txt
new file mode 100644
index 0000000000..db6c1c86bd
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103120.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Poprawki błędów!
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.12
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103130.txt b/fastlane/metadata/android/pl-PL/changelogs/40103130.txt
new file mode 100644
index 0000000000..affd085177
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103130.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Pierwsza zmiana na ekranach rejestracji, w tym możliwość włączenia Analytics. Dodano obsługę dla wydarzeń z dodatkiem matematyki w laboratoriach.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.13
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103140.txt b/fastlane/metadata/android/pl-PL/changelogs/40103140.txt
new file mode 100644
index 0000000000..0727d3b4ff
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103140.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Pierwsza zmiana na ekranach rejestracji, w tym możliwość włączenia Analytics. Dodano obsługę dla wydarzeń z dodatkiem matematyki w laboratoriach.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.14
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103150.txt b/fastlane/metadata/android/pl-PL/changelogs/40103150.txt
new file mode 100644
index 0000000000..48d6d0feb3
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103150.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Pierwsza zmiana na ekranach rejestracji, w tym możliwość włączenia Analytics. Dodano obsługę dla wydarzeń z dodatkiem matematyki w laboratoriach.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.15
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103160.txt b/fastlane/metadata/android/pl-PL/changelogs/40103160.txt
new file mode 100644
index 0000000000..df66e3042a
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103160.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: wyślij swoją lokalizację do dowolnego pokoju. Edytuj ankietę.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.16
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103170.txt b/fastlane/metadata/android/pl-PL/changelogs/40103170.txt
new file mode 100644
index 0000000000..77d40898a6
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103170.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: wyślij swoją lokalizację do dowolnego pokoju. Edytuj ankietę.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.17
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40103180.txt b/fastlane/metadata/android/pl-PL/changelogs/40103180.txt
new file mode 100644
index 0000000000..c0f671a58e
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40103180.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: wyślij swoją lokalizację do dowolnego pokoju. Edytuj ankietę.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.3.18
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40104000.txt b/fastlane/metadata/android/pl-PL/changelogs/40104000.txt
new file mode 100644
index 0000000000..f9f4c80cf9
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40104000.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Wstępna implementacja komunikatów wątków. Bąbelki wiadomości.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.4.0
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40104020.txt b/fastlane/metadata/android/pl-PL/changelogs/40104020.txt
new file mode 100644
index 0000000000..190427d548
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40104020.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: dodanie obsługi @room i nieujawnionych ankiet, i wiele innych drobnych zmian.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.4.2
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40104040.txt b/fastlane/metadata/android/pl-PL/changelogs/40104040.txt
new file mode 100644
index 0000000000..9894e54c03
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40104040.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: aktualizacje interfejsu użytkownika wskaźnika pisania. Różne poprawki błędów i ulepszenia stabilności.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases/tag/v1.4.4
diff --git a/fastlane/metadata/android/pl-PL/title.txt b/fastlane/metadata/android/pl-PL/title.txt
index 907f907f99..500e9c04e8 100644
--- a/fastlane/metadata/android/pl-PL/title.txt
+++ b/fastlane/metadata/android/pl-PL/title.txt
@@ -1 +1 @@
-Element
+Element - Bezpieczny komunikator
From 19328db2de4b4a58da07265e41fa35808b117217 Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Mon, 11 Apr 2022 11:06:15 +0200
Subject: [PATCH 046/198] Adds editorconfig for current code style
---
.editorconfig | 911 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 899 insertions(+), 12 deletions(-)
diff --git a/.editorconfig b/.editorconfig
index 1966f91763..60d4fd6cae 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,14 +1,901 @@
-# For ktlint configuration. Ref: https://ktlint.github.io/
+[*]
+charset = utf-8
+end_of_line = crlf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+max_line_length = 160
+tab_width = 4
+ij_continuation_indent_size = 8
+ij_formatter_off_tag = @formatter:off
+ij_formatter_on_tag = @formatter:on
+ij_formatter_tags_enabled = false
+ij_smart_tabs = false
+ij_visual_guides = none
+ij_wrap_on_typing = false
-[*.{kt,kts}]
-# possible values: number (e.g. 2), "unset" (makes ktlint ignore indentation completely)
-indent_size=unset
-# true (recommended) / false
-insert_final_newline=true
-# possible values: number (e.g. 120) (package name, imports & comments are ignored), "off"
-# it's automatically set to 100 on `ktlint --android ...` (per Android Kotlin Style Guide)
-max_line_length=off
+[*.java]
+ij_java_align_consecutive_assignments = false
+ij_java_align_consecutive_variable_declarations = false
+ij_java_align_group_field_declarations = false
+ij_java_align_multiline_annotation_parameters = false
+ij_java_align_multiline_array_initializer_expression = false
+ij_java_align_multiline_assignment = false
+ij_java_align_multiline_binary_operation = false
+ij_java_align_multiline_chained_methods = false
+ij_java_align_multiline_extends_list = false
+ij_java_align_multiline_for = true
+ij_java_align_multiline_method_parentheses = false
+ij_java_align_multiline_parameters = true
+ij_java_align_multiline_parameters_in_calls = false
+ij_java_align_multiline_parenthesized_expression = false
+ij_java_align_multiline_records = true
+ij_java_align_multiline_resources = true
+ij_java_align_multiline_ternary_operation = false
+ij_java_align_multiline_text_blocks = false
+ij_java_align_multiline_throws_list = false
+ij_java_align_subsequent_simple_methods = false
+ij_java_align_throws_keyword = false
+ij_java_annotation_parameter_wrap = off
+ij_java_array_initializer_new_line_after_left_brace = false
+ij_java_array_initializer_right_brace_on_new_line = false
+ij_java_array_initializer_wrap = off
+ij_java_assert_statement_colon_on_next_line = false
+ij_java_assert_statement_wrap = off
+ij_java_assignment_wrap = off
+ij_java_binary_operation_sign_on_next_line = false
+ij_java_binary_operation_wrap = off
+ij_java_blank_lines_after_anonymous_class_header = 0
+ij_java_blank_lines_after_class_header = 0
+ij_java_blank_lines_after_imports = 1
+ij_java_blank_lines_after_package = 1
+ij_java_blank_lines_around_class = 1
+ij_java_blank_lines_around_field = 0
+ij_java_blank_lines_around_field_in_interface = 0
+ij_java_blank_lines_around_initializer = 1
+ij_java_blank_lines_around_method = 1
+ij_java_blank_lines_around_method_in_interface = 1
+ij_java_blank_lines_before_class_end = 0
+ij_java_blank_lines_before_imports = 1
+ij_java_blank_lines_before_method_body = 0
+ij_java_blank_lines_before_package = 0
+ij_java_block_brace_style = end_of_line
+ij_java_block_comment_at_first_column = true
+ij_java_builder_methods = none
+ij_java_call_parameters_new_line_after_left_paren = false
+ij_java_call_parameters_right_paren_on_new_line = false
+ij_java_call_parameters_wrap = off
+ij_java_case_statement_on_separate_line = true
+ij_java_catch_on_new_line = false
+ij_java_class_annotation_wrap = split_into_lines
+ij_java_class_brace_style = end_of_line
+ij_java_class_count_to_use_import_on_demand = 99
+ij_java_class_names_in_javadoc = 1
+ij_java_do_not_indent_top_level_class_members = false
+ij_java_do_not_wrap_after_single_annotation = false
+ij_java_do_while_brace_force = never
+ij_java_doc_add_blank_line_after_description = true
+ij_java_doc_add_blank_line_after_param_comments = false
+ij_java_doc_add_blank_line_after_return = false
+ij_java_doc_add_p_tag_on_empty_lines = true
+ij_java_doc_align_exception_comments = true
+ij_java_doc_align_param_comments = true
+ij_java_doc_do_not_wrap_if_one_line = false
+ij_java_doc_enable_formatting = true
+ij_java_doc_enable_leading_asterisks = true
+ij_java_doc_indent_on_continuation = false
+ij_java_doc_keep_empty_lines = true
+ij_java_doc_keep_empty_parameter_tag = true
+ij_java_doc_keep_empty_return_tag = true
+ij_java_doc_keep_empty_throws_tag = true
+ij_java_doc_keep_invalid_tags = true
+ij_java_doc_param_description_on_new_line = false
+ij_java_doc_preserve_line_breaks = false
+ij_java_doc_use_throws_not_exception_tag = true
+ij_java_else_on_new_line = false
+ij_java_enum_constants_wrap = off
+ij_java_extends_keyword_wrap = off
+ij_java_extends_list_wrap = off
+ij_java_field_annotation_wrap = split_into_lines
+ij_java_finally_on_new_line = false
+ij_java_for_brace_force = never
+ij_java_for_statement_new_line_after_left_paren = false
+ij_java_for_statement_right_paren_on_new_line = false
+ij_java_for_statement_wrap = off
+ij_java_generate_final_locals = false
+ij_java_generate_final_parameters = false
+ij_java_if_brace_force = never
+ij_java_imports_layout = $android.**,$androidx.**,$com.**,$junit.**,$net.**,$org.**,$java.**,$javax.**,$*,|,android.**,|,androidx.**,|,com.**,|,junit.**,|,net.**,|,org.**,|,java.**,|,javax.**,|,*,|
+ij_java_indent_case_from_switch = true
+ij_java_insert_inner_class_imports = false
+ij_java_insert_override_annotation = true
+ij_java_keep_blank_lines_before_right_brace = 2
+ij_java_keep_blank_lines_between_package_declaration_and_header = 2
+ij_java_keep_blank_lines_in_code = 2
+ij_java_keep_blank_lines_in_declarations = 2
+ij_java_keep_builder_methods_indents = false
+ij_java_keep_control_statement_in_one_line = true
+ij_java_keep_first_column_comment = true
+ij_java_keep_indents_on_empty_lines = false
+ij_java_keep_line_breaks = true
+ij_java_keep_multiple_expressions_in_one_line = false
+ij_java_keep_simple_blocks_in_one_line = false
+ij_java_keep_simple_classes_in_one_line = false
+ij_java_keep_simple_lambdas_in_one_line = false
+ij_java_keep_simple_methods_in_one_line = false
+ij_java_label_indent_absolute = false
+ij_java_label_indent_size = 0
+ij_java_lambda_brace_style = end_of_line
+ij_java_layout_static_imports_separately = true
+ij_java_line_comment_add_space = false
+ij_java_line_comment_at_first_column = true
+ij_java_method_annotation_wrap = split_into_lines
+ij_java_method_brace_style = end_of_line
+ij_java_method_call_chain_wrap = off
+ij_java_method_parameters_new_line_after_left_paren = false
+ij_java_method_parameters_right_paren_on_new_line = false
+ij_java_method_parameters_wrap = off
+ij_java_modifier_list_wrap = false
+ij_java_names_count_to_use_import_on_demand = 99
+ij_java_new_line_after_lparen_in_record_header = false
+ij_java_parameter_annotation_wrap = off
+ij_java_parentheses_expression_new_line_after_left_paren = false
+ij_java_parentheses_expression_right_paren_on_new_line = false
+ij_java_place_assignment_sign_on_next_line = false
+ij_java_prefer_longer_names = true
+ij_java_prefer_parameters_wrap = false
+ij_java_record_components_wrap = normal
+ij_java_repeat_synchronized = true
+ij_java_replace_instanceof_and_cast = false
+ij_java_replace_null_check = true
+ij_java_replace_sum_lambda_with_method_ref = true
+ij_java_resource_list_new_line_after_left_paren = false
+ij_java_resource_list_right_paren_on_new_line = false
+ij_java_resource_list_wrap = off
+ij_java_rparen_on_new_line_in_record_header = false
+ij_java_space_after_closing_angle_bracket_in_type_argument = false
+ij_java_space_after_colon = true
+ij_java_space_after_comma = true
+ij_java_space_after_comma_in_type_arguments = true
+ij_java_space_after_for_semicolon = true
+ij_java_space_after_quest = true
+ij_java_space_after_type_cast = true
+ij_java_space_before_annotation_array_initializer_left_brace = false
+ij_java_space_before_annotation_parameter_list = false
+ij_java_space_before_array_initializer_left_brace = false
+ij_java_space_before_catch_keyword = true
+ij_java_space_before_catch_left_brace = true
+ij_java_space_before_catch_parentheses = true
+ij_java_space_before_class_left_brace = true
+ij_java_space_before_colon = true
+ij_java_space_before_colon_in_foreach = true
+ij_java_space_before_comma = false
+ij_java_space_before_do_left_brace = true
+ij_java_space_before_else_keyword = true
+ij_java_space_before_else_left_brace = true
+ij_java_space_before_finally_keyword = true
+ij_java_space_before_finally_left_brace = true
+ij_java_space_before_for_left_brace = true
+ij_java_space_before_for_parentheses = true
+ij_java_space_before_for_semicolon = false
+ij_java_space_before_if_left_brace = true
+ij_java_space_before_if_parentheses = true
+ij_java_space_before_method_call_parentheses = false
+ij_java_space_before_method_left_brace = true
+ij_java_space_before_method_parentheses = false
+ij_java_space_before_opening_angle_bracket_in_type_parameter = false
+ij_java_space_before_quest = true
+ij_java_space_before_switch_left_brace = true
+ij_java_space_before_switch_parentheses = true
+ij_java_space_before_synchronized_left_brace = true
+ij_java_space_before_synchronized_parentheses = true
+ij_java_space_before_try_left_brace = true
+ij_java_space_before_try_parentheses = true
+ij_java_space_before_type_parameter_list = false
+ij_java_space_before_while_keyword = true
+ij_java_space_before_while_left_brace = true
+ij_java_space_before_while_parentheses = true
+ij_java_space_inside_one_line_enum_braces = false
+ij_java_space_within_empty_array_initializer_braces = false
+ij_java_space_within_empty_method_call_parentheses = false
+ij_java_space_within_empty_method_parentheses = false
+ij_java_spaces_around_additive_operators = true
+ij_java_spaces_around_assignment_operators = true
+ij_java_spaces_around_bitwise_operators = true
+ij_java_spaces_around_equality_operators = true
+ij_java_spaces_around_lambda_arrow = true
+ij_java_spaces_around_logical_operators = true
+ij_java_spaces_around_method_ref_dbl_colon = false
+ij_java_spaces_around_multiplicative_operators = true
+ij_java_spaces_around_relational_operators = true
+ij_java_spaces_around_shift_operators = true
+ij_java_spaces_around_type_bounds_in_type_parameters = true
+ij_java_spaces_around_unary_operator = false
+ij_java_spaces_within_angle_brackets = false
+ij_java_spaces_within_annotation_parentheses = false
+ij_java_spaces_within_array_initializer_braces = false
+ij_java_spaces_within_braces = false
+ij_java_spaces_within_brackets = false
+ij_java_spaces_within_cast_parentheses = false
+ij_java_spaces_within_catch_parentheses = false
+ij_java_spaces_within_for_parentheses = false
+ij_java_spaces_within_if_parentheses = false
+ij_java_spaces_within_method_call_parentheses = false
+ij_java_spaces_within_method_parentheses = false
+ij_java_spaces_within_parentheses = false
+ij_java_spaces_within_record_header = false
+ij_java_spaces_within_switch_parentheses = false
+ij_java_spaces_within_synchronized_parentheses = false
+ij_java_spaces_within_try_parentheses = false
+ij_java_spaces_within_while_parentheses = false
+ij_java_special_else_if_treatment = true
+ij_java_subclass_name_suffix = Impl
+ij_java_ternary_operation_signs_on_next_line = false
+ij_java_ternary_operation_wrap = off
+ij_java_test_name_suffix = Test
+ij_java_throws_keyword_wrap = off
+ij_java_throws_list_wrap = off
+ij_java_use_external_annotations = false
+ij_java_use_fq_class_names = false
+ij_java_use_relative_indents = false
+ij_java_use_single_class_imports = true
+ij_java_variable_annotation_wrap = off
+ij_java_visibility = public
+ij_java_while_brace_force = never
+ij_java_while_on_new_line = false
+ij_java_wrap_comments = false
+ij_java_wrap_first_method_in_call_chain = false
+ij_java_wrap_long_lines = false
-# From https://github.com/pinterest/ktlint#custom-ktlint-specific-editorconfig-properties
-# default IntelliJ IDEA style, same as alphabetical, but with "java", "javax", "kotlin" and alias imports in the end of the imports list
-ij_kotlin_imports_layout=*,java.**,javax.**,kotlin.**,^
+[*.properties]
+ij_properties_align_group_field_declarations = false
+ij_properties_keep_blank_lines = false
+ij_properties_key_value_delimiter = equals
+ij_properties_spaces_around_key_value_delimiter = false
+
+[.editorconfig]
+ij_editorconfig_align_group_field_declarations = false
+ij_editorconfig_space_after_colon = false
+ij_editorconfig_space_after_comma = true
+ij_editorconfig_space_before_colon = false
+ij_editorconfig_space_before_comma = false
+ij_editorconfig_spaces_around_assignment_operators = true
+
+[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
+ij_continuation_indent_size = 4
+ij_xml_align_attributes = false
+ij_xml_align_text = false
+ij_xml_attribute_wrap = normal
+ij_xml_block_comment_at_first_column = true
+ij_xml_keep_blank_lines = 2
+ij_xml_keep_indents_on_empty_lines = false
+ij_xml_keep_line_breaks = false
+ij_xml_keep_line_breaks_in_text = true
+ij_xml_keep_whitespaces = false
+ij_xml_keep_whitespaces_around_cdata = preserve
+ij_xml_keep_whitespaces_inside_cdata = false
+ij_xml_line_comment_at_first_column = true
+ij_xml_space_after_tag_name = false
+ij_xml_space_around_equals_in_attribute = false
+ij_xml_space_inside_empty_tag = true
+ij_xml_text_wrap = normal
+ij_xml_use_custom_settings = true
+
+[{*.bash,*.sh,*.zsh}]
+indent_size = 2
+tab_width = 2
+ij_shell_binary_ops_start_line = false
+ij_shell_keep_column_alignment_padding = false
+ij_shell_minify_program = false
+ij_shell_redirect_followed_by_space = false
+ij_shell_switch_cases_indented = false
+ij_shell_use_unix_line_separator = true
+
+[{*.c,*.c++,*.cc,*.cp,*.cpp,*.cu,*.cuh,*.cxx,*.h,*.h++,*.hh,*.hp,*.hpp,*.hxx,*.i,*.icc,*.ii,*.inl,*.ino,*.ipp,*.m,*.mm,*.pch,*.tcc,*.tpp}]
+ij_c_add_brief_tag = false
+ij_c_add_getter_prefix = true
+ij_c_add_setter_prefix = true
+ij_c_align_dictionary_pair_values = false
+ij_c_align_group_field_declarations = false
+ij_c_align_init_list_in_columns = true
+ij_c_align_multiline_array_initializer_expression = true
+ij_c_align_multiline_assignment = true
+ij_c_align_multiline_binary_operation = true
+ij_c_align_multiline_chained_methods = false
+ij_c_align_multiline_for = true
+ij_c_align_multiline_ternary_operation = true
+ij_c_array_initializer_comma_on_next_line = false
+ij_c_array_initializer_new_line_after_left_brace = false
+ij_c_array_initializer_right_brace_on_new_line = false
+ij_c_array_initializer_wrap = normal
+ij_c_assignment_wrap = off
+ij_c_binary_operation_sign_on_next_line = false
+ij_c_binary_operation_wrap = normal
+ij_c_blank_lines_after_class_header = 0
+ij_c_blank_lines_after_imports = 1
+ij_c_blank_lines_around_class = 1
+ij_c_blank_lines_around_field = 0
+ij_c_blank_lines_around_field_in_interface = 0
+ij_c_blank_lines_around_method = 1
+ij_c_blank_lines_around_method_in_interface = 1
+ij_c_blank_lines_around_namespace = 0
+ij_c_blank_lines_around_properties_in_declaration = 0
+ij_c_blank_lines_around_properties_in_interface = 0
+ij_c_blank_lines_before_imports = 1
+ij_c_blank_lines_before_method_body = 0
+ij_c_block_brace_placement = end_of_line
+ij_c_block_brace_style = end_of_line
+ij_c_block_comment_at_first_column = true
+ij_c_catch_on_new_line = false
+ij_c_class_brace_style = end_of_line
+ij_c_class_constructor_init_list_align_multiline = true
+ij_c_class_constructor_init_list_comma_on_next_line = false
+ij_c_class_constructor_init_list_new_line_after_colon = never
+ij_c_class_constructor_init_list_new_line_before_colon = if_long
+ij_c_class_constructor_init_list_wrap = normal
+ij_c_copy_is_deep = false
+ij_c_create_interface_for_categories = true
+ij_c_declare_generated_methods = true
+ij_c_description_include_member_names = true
+ij_c_discharged_short_ternary_operator = false
+ij_c_do_not_add_breaks = false
+ij_c_do_while_brace_force = never
+ij_c_else_on_new_line = false
+ij_c_enum_constants_comma_on_next_line = false
+ij_c_enum_constants_wrap = on_every_item
+ij_c_for_brace_force = never
+ij_c_for_statement_new_line_after_left_paren = false
+ij_c_for_statement_right_paren_on_new_line = false
+ij_c_for_statement_wrap = off
+ij_c_function_brace_placement = end_of_line
+ij_c_function_call_arguments_align_multiline = true
+ij_c_function_call_arguments_align_multiline_pars = false
+ij_c_function_call_arguments_comma_on_next_line = false
+ij_c_function_call_arguments_new_line_after_lpar = false
+ij_c_function_call_arguments_new_line_before_rpar = false
+ij_c_function_call_arguments_wrap = normal
+ij_c_function_non_top_after_return_type_wrap = normal
+ij_c_function_parameters_align_multiline = true
+ij_c_function_parameters_align_multiline_pars = false
+ij_c_function_parameters_comma_on_next_line = false
+ij_c_function_parameters_new_line_after_lpar = false
+ij_c_function_parameters_new_line_before_rpar = false
+ij_c_function_parameters_wrap = normal
+ij_c_function_top_after_return_type_wrap = normal
+ij_c_generate_additional_eq_operators = true
+ij_c_generate_additional_rel_operators = true
+ij_c_generate_class_constructor = true
+ij_c_generate_comparison_operators_use_std_tie = false
+ij_c_generate_instance_variables_for_properties = ask
+ij_c_generate_operators_as_members = true
+ij_c_header_guard_style_pattern = ${PROJECT_NAME}_${FILE_NAME}_${EXT}
+ij_c_if_brace_force = never
+ij_c_in_line_short_ternary_operator = true
+ij_c_indent_block_comment = true
+ij_c_indent_c_struct_members = 4
+ij_c_indent_case_from_switch = true
+ij_c_indent_class_members = 4
+ij_c_indent_directive_as_code = false
+ij_c_indent_implementation_members = 0
+ij_c_indent_inside_code_block = 4
+ij_c_indent_interface_members = 0
+ij_c_indent_interface_members_except_ivars_block = false
+ij_c_indent_namespace_members = 4
+ij_c_indent_preprocessor_directive = 0
+ij_c_indent_visibility_keywords = 0
+ij_c_insert_override = true
+ij_c_insert_virtual_with_override = false
+ij_c_introduce_auto_vars = false
+ij_c_introduce_const_params = false
+ij_c_introduce_const_vars = false
+ij_c_introduce_generate_property = false
+ij_c_introduce_generate_synthesize = true
+ij_c_introduce_globals_to_header = true
+ij_c_introduce_prop_to_private_category = false
+ij_c_introduce_static_consts = true
+ij_c_introduce_use_ns_types = false
+ij_c_ivars_prefix = _
+ij_c_keep_blank_lines_before_end = 2
+ij_c_keep_blank_lines_before_right_brace = 2
+ij_c_keep_blank_lines_in_code = 2
+ij_c_keep_blank_lines_in_declarations = 2
+ij_c_keep_case_expressions_in_one_line = false
+ij_c_keep_control_statement_in_one_line = true
+ij_c_keep_directive_at_first_column = true
+ij_c_keep_first_column_comment = true
+ij_c_keep_line_breaks = true
+ij_c_keep_nested_namespaces_in_one_line = false
+ij_c_keep_simple_blocks_in_one_line = true
+ij_c_keep_simple_methods_in_one_line = true
+ij_c_keep_structures_in_one_line = false
+ij_c_lambda_capture_list_align_multiline = false
+ij_c_lambda_capture_list_align_multiline_bracket = false
+ij_c_lambda_capture_list_comma_on_next_line = false
+ij_c_lambda_capture_list_new_line_after_lbracket = false
+ij_c_lambda_capture_list_new_line_before_rbracket = false
+ij_c_lambda_capture_list_wrap = off
+ij_c_line_comment_add_space = false
+ij_c_line_comment_at_first_column = true
+ij_c_method_brace_placement = end_of_line
+ij_c_method_call_arguments_align_by_colons = true
+ij_c_method_call_arguments_align_multiline = false
+ij_c_method_call_arguments_special_dictionary_pairs_treatment = true
+ij_c_method_call_arguments_wrap = off
+ij_c_method_call_chain_wrap = off
+ij_c_method_parameters_align_by_colons = true
+ij_c_method_parameters_align_multiline = false
+ij_c_method_parameters_wrap = off
+ij_c_namespace_brace_placement = end_of_line
+ij_c_parentheses_expression_new_line_after_left_paren = false
+ij_c_parentheses_expression_right_paren_on_new_line = false
+ij_c_place_assignment_sign_on_next_line = false
+ij_c_property_nonatomic = true
+ij_c_put_ivars_to_implementation = true
+ij_c_refactor_compatibility_aliases_and_classes = true
+ij_c_refactor_properties_and_ivars = true
+ij_c_release_style = ivar
+ij_c_retain_object_parameters_in_constructor = true
+ij_c_semicolon_after_method_signature = false
+ij_c_shift_operation_align_multiline = true
+ij_c_shift_operation_wrap = normal
+ij_c_show_non_virtual_functions = false
+ij_c_space_after_colon = true
+ij_c_space_after_colon_in_selector = false
+ij_c_space_after_comma = true
+ij_c_space_after_cup_in_blocks = false
+ij_c_space_after_dictionary_literal_colon = true
+ij_c_space_after_for_semicolon = true
+ij_c_space_after_init_list_colon = true
+ij_c_space_after_method_parameter_type_parentheses = false
+ij_c_space_after_method_return_type_parentheses = false
+ij_c_space_after_pointer_in_declaration = false
+ij_c_space_after_quest = true
+ij_c_space_after_reference_in_declaration = false
+ij_c_space_after_reference_in_rvalue = false
+ij_c_space_after_structures_rbrace = true
+ij_c_space_after_superclass_colon = true
+ij_c_space_after_type_cast = true
+ij_c_space_after_visibility_sign_in_method_declaration = true
+ij_c_space_before_autorelease_pool_lbrace = true
+ij_c_space_before_catch_keyword = true
+ij_c_space_before_catch_left_brace = true
+ij_c_space_before_catch_parentheses = true
+ij_c_space_before_category_parentheses = true
+ij_c_space_before_chained_send_message = true
+ij_c_space_before_class_left_brace = true
+ij_c_space_before_colon = true
+ij_c_space_before_comma = false
+ij_c_space_before_dictionary_literal_colon = false
+ij_c_space_before_do_left_brace = true
+ij_c_space_before_else_keyword = true
+ij_c_space_before_else_left_brace = true
+ij_c_space_before_for_left_brace = true
+ij_c_space_before_for_parentheses = true
+ij_c_space_before_for_semicolon = false
+ij_c_space_before_if_left_brace = true
+ij_c_space_before_if_parentheses = true
+ij_c_space_before_init_list = false
+ij_c_space_before_init_list_colon = true
+ij_c_space_before_method_call_parentheses = false
+ij_c_space_before_method_left_brace = true
+ij_c_space_before_method_parentheses = false
+ij_c_space_before_namespace_lbrace = true
+ij_c_space_before_pointer_in_declaration = true
+ij_c_space_before_property_attributes_parentheses = false
+ij_c_space_before_protocols_brackets = true
+ij_c_space_before_quest = true
+ij_c_space_before_reference_in_declaration = true
+ij_c_space_before_superclass_colon = true
+ij_c_space_before_switch_left_brace = true
+ij_c_space_before_switch_parentheses = true
+ij_c_space_before_template_call_lt = false
+ij_c_space_before_template_declaration_lt = false
+ij_c_space_before_try_left_brace = true
+ij_c_space_before_while_keyword = true
+ij_c_space_before_while_left_brace = true
+ij_c_space_before_while_parentheses = true
+ij_c_space_between_adjacent_brackets = false
+ij_c_space_between_operator_and_punctuator = false
+ij_c_space_within_empty_array_initializer_braces = false
+ij_c_spaces_around_additive_operators = true
+ij_c_spaces_around_assignment_operators = true
+ij_c_spaces_around_bitwise_operators = true
+ij_c_spaces_around_equality_operators = true
+ij_c_spaces_around_lambda_arrow = true
+ij_c_spaces_around_logical_operators = true
+ij_c_spaces_around_multiplicative_operators = true
+ij_c_spaces_around_pm_operators = false
+ij_c_spaces_around_relational_operators = true
+ij_c_spaces_around_shift_operators = true
+ij_c_spaces_around_unary_operator = false
+ij_c_spaces_within_array_initializer_braces = false
+ij_c_spaces_within_braces = true
+ij_c_spaces_within_brackets = false
+ij_c_spaces_within_cast_parentheses = false
+ij_c_spaces_within_catch_parentheses = false
+ij_c_spaces_within_category_parentheses = false
+ij_c_spaces_within_empty_braces = false
+ij_c_spaces_within_empty_function_call_parentheses = false
+ij_c_spaces_within_empty_function_declaration_parentheses = false
+ij_c_spaces_within_empty_lambda_capture_list_bracket = false
+ij_c_spaces_within_empty_template_call_ltgt = false
+ij_c_spaces_within_empty_template_declaration_ltgt = false
+ij_c_spaces_within_for_parentheses = false
+ij_c_spaces_within_function_call_parentheses = false
+ij_c_spaces_within_function_declaration_parentheses = false
+ij_c_spaces_within_if_parentheses = false
+ij_c_spaces_within_lambda_capture_list_bracket = false
+ij_c_spaces_within_method_parameter_type_parentheses = false
+ij_c_spaces_within_method_return_type_parentheses = false
+ij_c_spaces_within_parentheses = false
+ij_c_spaces_within_property_attributes_parentheses = false
+ij_c_spaces_within_protocols_brackets = false
+ij_c_spaces_within_send_message_brackets = false
+ij_c_spaces_within_switch_parentheses = false
+ij_c_spaces_within_template_call_ltgt = false
+ij_c_spaces_within_template_declaration_ltgt = false
+ij_c_spaces_within_template_double_gt = true
+ij_c_spaces_within_while_parentheses = false
+ij_c_special_else_if_treatment = true
+ij_c_superclass_list_after_colon = never
+ij_c_superclass_list_align_multiline = true
+ij_c_superclass_list_before_colon = if_long
+ij_c_superclass_list_comma_on_next_line = false
+ij_c_superclass_list_wrap = on_every_item
+ij_c_tag_prefix_of_block_comment = at
+ij_c_tag_prefix_of_line_comment = back_slash
+ij_c_template_call_arguments_align_multiline = false
+ij_c_template_call_arguments_align_multiline_pars = false
+ij_c_template_call_arguments_comma_on_next_line = false
+ij_c_template_call_arguments_new_line_after_lt = false
+ij_c_template_call_arguments_new_line_before_gt = false
+ij_c_template_call_arguments_wrap = off
+ij_c_template_declaration_function_body_indent = false
+ij_c_template_declaration_function_wrap = split_into_lines
+ij_c_template_declaration_struct_body_indent = false
+ij_c_template_declaration_struct_wrap = split_into_lines
+ij_c_template_parameters_align_multiline = false
+ij_c_template_parameters_align_multiline_pars = false
+ij_c_template_parameters_comma_on_next_line = false
+ij_c_template_parameters_new_line_after_lt = false
+ij_c_template_parameters_new_line_before_gt = false
+ij_c_template_parameters_wrap = off
+ij_c_ternary_operation_signs_on_next_line = true
+ij_c_ternary_operation_wrap = normal
+ij_c_type_qualifiers_placement = before
+ij_c_use_modern_casts = true
+ij_c_use_setters_in_constructor = true
+ij_c_while_brace_force = never
+ij_c_while_on_new_line = false
+ij_c_wrap_property_declaration = off
+
+[{*.cmake,CMakeLists.txt}]
+ij_cmake_align_multiline_parameters_in_calls = false
+ij_cmake_force_commands_case = 2
+ij_cmake_keep_blank_lines_in_code = 2
+ij_cmake_space_before_for_parentheses = true
+ij_cmake_space_before_if_parentheses = true
+ij_cmake_space_before_method_call_parentheses = false
+ij_cmake_space_before_method_parentheses = false
+ij_cmake_space_before_while_parentheses = true
+ij_cmake_spaces_within_for_parentheses = false
+ij_cmake_spaces_within_if_parentheses = false
+ij_cmake_spaces_within_method_call_parentheses = false
+ij_cmake_spaces_within_method_parentheses = false
+ij_cmake_spaces_within_while_parentheses = false
+
+[{*.gant,*.gradle,*.groovy,*.gy}]
+ij_groovy_align_group_field_declarations = false
+ij_groovy_align_multiline_array_initializer_expression = false
+ij_groovy_align_multiline_assignment = false
+ij_groovy_align_multiline_binary_operation = false
+ij_groovy_align_multiline_chained_methods = false
+ij_groovy_align_multiline_extends_list = false
+ij_groovy_align_multiline_for = true
+ij_groovy_align_multiline_list_or_map = true
+ij_groovy_align_multiline_method_parentheses = false
+ij_groovy_align_multiline_parameters = true
+ij_groovy_align_multiline_parameters_in_calls = false
+ij_groovy_align_multiline_resources = true
+ij_groovy_align_multiline_ternary_operation = false
+ij_groovy_align_multiline_throws_list = false
+ij_groovy_align_named_args_in_map = true
+ij_groovy_align_throws_keyword = false
+ij_groovy_array_initializer_new_line_after_left_brace = false
+ij_groovy_array_initializer_right_brace_on_new_line = false
+ij_groovy_array_initializer_wrap = off
+ij_groovy_assert_statement_wrap = off
+ij_groovy_assignment_wrap = off
+ij_groovy_binary_operation_wrap = off
+ij_groovy_blank_lines_after_class_header = 0
+ij_groovy_blank_lines_after_imports = 1
+ij_groovy_blank_lines_after_package = 1
+ij_groovy_blank_lines_around_class = 1
+ij_groovy_blank_lines_around_field = 0
+ij_groovy_blank_lines_around_field_in_interface = 0
+ij_groovy_blank_lines_around_method = 1
+ij_groovy_blank_lines_around_method_in_interface = 1
+ij_groovy_blank_lines_before_imports = 1
+ij_groovy_blank_lines_before_method_body = 0
+ij_groovy_blank_lines_before_package = 0
+ij_groovy_block_brace_style = end_of_line
+ij_groovy_block_comment_at_first_column = true
+ij_groovy_call_parameters_new_line_after_left_paren = false
+ij_groovy_call_parameters_right_paren_on_new_line = false
+ij_groovy_call_parameters_wrap = off
+ij_groovy_catch_on_new_line = false
+ij_groovy_class_annotation_wrap = split_into_lines
+ij_groovy_class_brace_style = end_of_line
+ij_groovy_class_count_to_use_import_on_demand = 5
+ij_groovy_do_while_brace_force = never
+ij_groovy_else_on_new_line = false
+ij_groovy_enum_constants_wrap = off
+ij_groovy_extends_keyword_wrap = off
+ij_groovy_extends_list_wrap = off
+ij_groovy_field_annotation_wrap = split_into_lines
+ij_groovy_finally_on_new_line = false
+ij_groovy_for_brace_force = never
+ij_groovy_for_statement_new_line_after_left_paren = false
+ij_groovy_for_statement_right_paren_on_new_line = false
+ij_groovy_for_statement_wrap = off
+ij_groovy_if_brace_force = never
+ij_groovy_import_annotation_wrap = 2
+ij_groovy_imports_layout = *,|,javax.**,java.**,|,$*
+ij_groovy_indent_case_from_switch = true
+ij_groovy_indent_label_blocks = true
+ij_groovy_insert_inner_class_imports = false
+ij_groovy_keep_blank_lines_before_right_brace = 2
+ij_groovy_keep_blank_lines_in_code = 2
+ij_groovy_keep_blank_lines_in_declarations = 2
+ij_groovy_keep_control_statement_in_one_line = true
+ij_groovy_keep_first_column_comment = true
+ij_groovy_keep_indents_on_empty_lines = false
+ij_groovy_keep_line_breaks = true
+ij_groovy_keep_multiple_expressions_in_one_line = false
+ij_groovy_keep_simple_blocks_in_one_line = false
+ij_groovy_keep_simple_classes_in_one_line = true
+ij_groovy_keep_simple_lambdas_in_one_line = true
+ij_groovy_keep_simple_methods_in_one_line = true
+ij_groovy_label_indent_absolute = false
+ij_groovy_label_indent_size = 0
+ij_groovy_lambda_brace_style = end_of_line
+ij_groovy_layout_static_imports_separately = true
+ij_groovy_line_comment_add_space = false
+ij_groovy_line_comment_at_first_column = true
+ij_groovy_method_annotation_wrap = split_into_lines
+ij_groovy_method_brace_style = end_of_line
+ij_groovy_method_call_chain_wrap = off
+ij_groovy_method_parameters_new_line_after_left_paren = false
+ij_groovy_method_parameters_right_paren_on_new_line = false
+ij_groovy_method_parameters_wrap = off
+ij_groovy_modifier_list_wrap = false
+ij_groovy_names_count_to_use_import_on_demand = 3
+ij_groovy_parameter_annotation_wrap = off
+ij_groovy_parentheses_expression_new_line_after_left_paren = false
+ij_groovy_parentheses_expression_right_paren_on_new_line = false
+ij_groovy_prefer_parameters_wrap = false
+ij_groovy_resource_list_new_line_after_left_paren = false
+ij_groovy_resource_list_right_paren_on_new_line = false
+ij_groovy_resource_list_wrap = off
+ij_groovy_space_after_assert_separator = true
+ij_groovy_space_after_colon = true
+ij_groovy_space_after_comma = true
+ij_groovy_space_after_comma_in_type_arguments = true
+ij_groovy_space_after_for_semicolon = true
+ij_groovy_space_after_quest = true
+ij_groovy_space_after_type_cast = true
+ij_groovy_space_before_annotation_parameter_list = false
+ij_groovy_space_before_array_initializer_left_brace = false
+ij_groovy_space_before_assert_separator = false
+ij_groovy_space_before_catch_keyword = true
+ij_groovy_space_before_catch_left_brace = true
+ij_groovy_space_before_catch_parentheses = true
+ij_groovy_space_before_class_left_brace = true
+ij_groovy_space_before_closure_left_brace = true
+ij_groovy_space_before_colon = true
+ij_groovy_space_before_comma = false
+ij_groovy_space_before_do_left_brace = true
+ij_groovy_space_before_else_keyword = true
+ij_groovy_space_before_else_left_brace = true
+ij_groovy_space_before_finally_keyword = true
+ij_groovy_space_before_finally_left_brace = true
+ij_groovy_space_before_for_left_brace = true
+ij_groovy_space_before_for_parentheses = true
+ij_groovy_space_before_for_semicolon = false
+ij_groovy_space_before_if_left_brace = true
+ij_groovy_space_before_if_parentheses = true
+ij_groovy_space_before_method_call_parentheses = false
+ij_groovy_space_before_method_left_brace = true
+ij_groovy_space_before_method_parentheses = false
+ij_groovy_space_before_quest = true
+ij_groovy_space_before_switch_left_brace = true
+ij_groovy_space_before_switch_parentheses = true
+ij_groovy_space_before_synchronized_left_brace = true
+ij_groovy_space_before_synchronized_parentheses = true
+ij_groovy_space_before_try_left_brace = true
+ij_groovy_space_before_try_parentheses = true
+ij_groovy_space_before_while_keyword = true
+ij_groovy_space_before_while_left_brace = true
+ij_groovy_space_before_while_parentheses = true
+ij_groovy_space_in_named_argument = true
+ij_groovy_space_in_named_argument_before_colon = false
+ij_groovy_space_within_empty_array_initializer_braces = false
+ij_groovy_space_within_empty_method_call_parentheses = false
+ij_groovy_spaces_around_additive_operators = true
+ij_groovy_spaces_around_assignment_operators = true
+ij_groovy_spaces_around_bitwise_operators = true
+ij_groovy_spaces_around_equality_operators = true
+ij_groovy_spaces_around_lambda_arrow = true
+ij_groovy_spaces_around_logical_operators = true
+ij_groovy_spaces_around_multiplicative_operators = true
+ij_groovy_spaces_around_regex_operators = true
+ij_groovy_spaces_around_relational_operators = true
+ij_groovy_spaces_around_shift_operators = true
+ij_groovy_spaces_within_annotation_parentheses = false
+ij_groovy_spaces_within_array_initializer_braces = false
+ij_groovy_spaces_within_braces = true
+ij_groovy_spaces_within_brackets = false
+ij_groovy_spaces_within_cast_parentheses = false
+ij_groovy_spaces_within_catch_parentheses = false
+ij_groovy_spaces_within_for_parentheses = false
+ij_groovy_spaces_within_gstring_injection_braces = false
+ij_groovy_spaces_within_if_parentheses = false
+ij_groovy_spaces_within_list_or_map = false
+ij_groovy_spaces_within_method_call_parentheses = false
+ij_groovy_spaces_within_method_parentheses = false
+ij_groovy_spaces_within_parentheses = false
+ij_groovy_spaces_within_switch_parentheses = false
+ij_groovy_spaces_within_synchronized_parentheses = false
+ij_groovy_spaces_within_try_parentheses = false
+ij_groovy_spaces_within_tuple_expression = false
+ij_groovy_spaces_within_while_parentheses = false
+ij_groovy_special_else_if_treatment = true
+ij_groovy_ternary_operation_wrap = off
+ij_groovy_throws_keyword_wrap = off
+ij_groovy_throws_list_wrap = off
+ij_groovy_use_flying_geese_braces = false
+ij_groovy_use_fq_class_names = false
+ij_groovy_use_fq_class_names_in_javadoc = true
+ij_groovy_use_relative_indents = false
+ij_groovy_use_single_class_imports = true
+ij_groovy_variable_annotation_wrap = off
+ij_groovy_while_brace_force = never
+ij_groovy_while_on_new_line = false
+ij_groovy_wrap_long_lines = false
+
+[{*.gradle.kts,*.kt,*.kts,*.main.kts}]
+ij_kotlin_align_in_columns_case_branch = true
+ij_kotlin_align_multiline_binary_operation = false
+ij_kotlin_align_multiline_extends_list = false
+ij_kotlin_align_multiline_method_parentheses = false
+ij_kotlin_align_multiline_parameters = true
+ij_kotlin_align_multiline_parameters_in_calls = false
+ij_kotlin_allow_trailing_comma = false
+ij_kotlin_allow_trailing_comma_on_call_site = false
+ij_kotlin_assignment_wrap = off
+ij_kotlin_blank_lines_after_class_header = 0
+ij_kotlin_blank_lines_around_block_when_branches = 0
+ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1
+ij_kotlin_block_comment_at_first_column = true
+ij_kotlin_call_parameters_new_line_after_left_paren = false
+ij_kotlin_call_parameters_right_paren_on_new_line = false
+ij_kotlin_call_parameters_wrap = off
+ij_kotlin_catch_on_new_line = false
+ij_kotlin_class_annotation_wrap = off
+ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL
+ij_kotlin_continuation_indent_for_chained_calls = true
+ij_kotlin_continuation_indent_for_expression_bodies = true
+ij_kotlin_continuation_indent_in_argument_lists = true
+ij_kotlin_continuation_indent_in_elvis = true
+ij_kotlin_continuation_indent_in_if_conditions = true
+ij_kotlin_continuation_indent_in_parameter_lists = true
+ij_kotlin_continuation_indent_in_supertype_lists = true
+ij_kotlin_else_on_new_line = false
+ij_kotlin_enum_constants_wrap = off
+ij_kotlin_extends_list_wrap = off
+ij_kotlin_field_annotation_wrap = normal
+ij_kotlin_finally_on_new_line = false
+ij_kotlin_if_rparen_on_new_line = false
+ij_kotlin_import_nested_classes = false
+ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^
+ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
+ij_kotlin_keep_blank_lines_before_right_brace = 0
+ij_kotlin_keep_blank_lines_in_code = 1
+ij_kotlin_keep_blank_lines_in_declarations = 1
+ij_kotlin_keep_first_column_comment = true
+ij_kotlin_keep_indents_on_empty_lines = false
+ij_kotlin_keep_line_breaks = true
+ij_kotlin_lbrace_on_next_line = false
+ij_kotlin_line_comment_add_space = false
+ij_kotlin_line_comment_at_first_column = true
+ij_kotlin_method_annotation_wrap = split_into_lines
+ij_kotlin_method_call_chain_wrap = off
+ij_kotlin_method_parameters_new_line_after_left_paren = false
+ij_kotlin_method_parameters_right_paren_on_new_line = false
+ij_kotlin_method_parameters_wrap = off
+ij_kotlin_name_count_to_use_star_import = 2147483647
+ij_kotlin_name_count_to_use_star_import_for_members = 2147483647
+ij_kotlin_packages_to_use_import_on_demand = kotlinx.android.synthetic.**
+ij_kotlin_parameter_annotation_wrap = off
+ij_kotlin_space_after_comma = true
+ij_kotlin_space_after_extend_colon = true
+ij_kotlin_space_after_type_colon = true
+ij_kotlin_space_before_catch_parentheses = true
+ij_kotlin_space_before_comma = false
+ij_kotlin_space_before_extend_colon = true
+ij_kotlin_space_before_for_parentheses = true
+ij_kotlin_space_before_if_parentheses = true
+ij_kotlin_space_before_lambda_arrow = true
+ij_kotlin_space_before_type_colon = false
+ij_kotlin_space_before_when_parentheses = true
+ij_kotlin_space_before_while_parentheses = true
+ij_kotlin_spaces_around_additive_operators = true
+ij_kotlin_spaces_around_assignment_operators = true
+ij_kotlin_spaces_around_equality_operators = true
+ij_kotlin_spaces_around_function_type_arrow = true
+ij_kotlin_spaces_around_logical_operators = true
+ij_kotlin_spaces_around_multiplicative_operators = true
+ij_kotlin_spaces_around_range = false
+ij_kotlin_spaces_around_relational_operators = true
+ij_kotlin_spaces_around_unary_operator = false
+ij_kotlin_spaces_around_when_arrow = true
+ij_kotlin_use_custom_formatting_for_modifiers = true
+ij_kotlin_variable_annotation_wrap = off
+ij_kotlin_while_on_new_line = false
+ij_kotlin_wrap_elvis_expressions = 1
+ij_kotlin_wrap_expression_body_functions = 0
+ij_kotlin_wrap_first_method_in_call_chain = false
+
+[{*.har,*.json}]
+indent_size = 2
+ij_json_keep_blank_lines_in_code = 0
+ij_json_keep_indents_on_empty_lines = false
+ij_json_keep_line_breaks = true
+ij_json_space_after_colon = true
+ij_json_space_after_comma = true
+ij_json_space_before_colon = true
+ij_json_space_before_comma = false
+ij_json_spaces_within_braces = false
+ij_json_spaces_within_brackets = false
+ij_json_wrap_long_lines = false
+
+[{*.htm,*.html,*.sht,*.shtm,*.shtml}]
+ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
+ij_html_align_attributes = true
+ij_html_align_text = false
+ij_html_attribute_wrap = normal
+ij_html_block_comment_at_first_column = true
+ij_html_do_not_align_children_of_min_lines = 0
+ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p
+ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot
+ij_html_enforce_quotes = false
+ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var
+ij_html_keep_blank_lines = 2
+ij_html_keep_indents_on_empty_lines = false
+ij_html_keep_line_breaks = true
+ij_html_keep_line_breaks_in_text = true
+ij_html_keep_whitespaces = false
+ij_html_keep_whitespaces_inside = span,pre,textarea
+ij_html_line_comment_at_first_column = true
+ij_html_new_line_after_last_attribute = never
+ij_html_new_line_before_first_attribute = never
+ij_html_quote_style = double
+ij_html_remove_new_line_before_tags = br
+ij_html_space_after_tag_name = false
+ij_html_space_around_equality_in_attribute = false
+ij_html_space_inside_empty_tag = false
+ij_html_text_wrap = normal
+ij_html_uniform_ident = false
+
+[{*.yaml,*.yml}]
+indent_size = 2
+ij_yaml_align_values_properties = do_not_align
+ij_yaml_autoinsert_sequence_marker = true
+ij_yaml_block_mapping_on_new_line = false
+ij_yaml_indent_sequence_value = true
+ij_yaml_keep_indents_on_empty_lines = false
+ij_yaml_keep_line_breaks = true
+ij_yaml_sequence_on_new_line = false
+ij_yaml_space_before_colon = false
+ij_yaml_spaces_within_braces = true
+ij_yaml_spaces_within_brackets = true
From e1452c7d03d527046a540e9b0855831a393a6899 Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Tue, 12 Apr 2022 11:12:14 +0200
Subject: [PATCH 047/198] disables indent ktlint rule
---
build.gradle | 1 +
1 file changed, 1 insertion(+)
diff --git a/build.gradle b/build.gradle
index 352b82c457..32bb1f4332 100644
--- a/build.gradle
+++ b/build.gradle
@@ -105,6 +105,7 @@ allprojects {
// display the corresponding rule
verbose = true
disabledRules = [
+ "indent",
"spacing-between-declarations-with-comments",
"no-multi-spaces",
"experimental:spacing-between-declarations-with-annotations",
From ff6f03b0d48f98e2a0635080c7da939c98c9c61a Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Tue, 12 Apr 2022 11:18:01 +0200
Subject: [PATCH 048/198] disables argument list wrapping ktlint rule
---
build.gradle | 1 +
1 file changed, 1 insertion(+)
diff --git a/build.gradle b/build.gradle
index 32bb1f4332..c70b4fba94 100644
--- a/build.gradle
+++ b/build.gradle
@@ -106,6 +106,7 @@ allprojects {
verbose = true
disabledRules = [
"indent",
+ "experimental:argument-list-wrapping",
"spacing-between-declarations-with-comments",
"no-multi-spaces",
"experimental:spacing-between-declarations-with-annotations",
From 0e4762e3de2f2d56ca1f8c959a4bff40a307038f Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Tue, 12 Apr 2022 11:25:35 +0200
Subject: [PATCH 049/198] disables max line length and parameter list wrapping
ktlint rules
---
build.gradle | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/build.gradle b/build.gradle
index c70b4fba94..ec54bc48b5 100644
--- a/build.gradle
+++ b/build.gradle
@@ -105,8 +105,12 @@ allprojects {
// display the corresponding rule
verbose = true
disabledRules = [
+ // TODO: Re-enable these 4 rules after reformatting project
"indent",
"experimental:argument-list-wrapping",
+ "max-line-length",
+ "parameter-list-wrapping",
+
"spacing-between-declarations-with-comments",
"no-multi-spaces",
"experimental:spacing-between-declarations-with-annotations",
From 9c696b8778a79190a656a1390e75e6a362b70777 Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Tue, 12 Apr 2022 12:02:30 +0200
Subject: [PATCH 050/198] Adds changelog file
---
changelog.d/5727.misc | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5727.misc
diff --git a/changelog.d/5727.misc b/changelog.d/5727.misc
new file mode 100644
index 0000000000..fd90a08b17
--- /dev/null
+++ b/changelog.d/5727.misc
@@ -0,0 +1 @@
+Adds a complete editor config file for our current code style
From 1526c73dae925c32b20528074864bd3571e574c0 Mon Sep 17 00:00:00 2001
From: NIkita Fedrunov
Date: Tue, 12 Apr 2022 14:39:13 +0200
Subject: [PATCH 051/198] added changelog
---
changelog.d/4305.bugfix | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 changelog.d/4305.bugfix
diff --git a/changelog.d/4305.bugfix b/changelog.d/4305.bugfix
new file mode 100644
index 0000000000..e69de29bb2
From 8ae130c0d051c220c5effef6512467c234f5cdc1 Mon Sep 17 00:00:00 2001
From: NIkita Fedrunov
Date: Tue, 12 Apr 2022 14:42:53 +0200
Subject: [PATCH 052/198] changelog fixed
---
changelog.d/4305.bugfix | 1 +
1 file changed, 1 insertion(+)
diff --git a/changelog.d/4305.bugfix b/changelog.d/4305.bugfix
index e69de29bb2..95e4a966fc 100644
--- a/changelog.d/4305.bugfix
+++ b/changelog.d/4305.bugfix
@@ -0,0 +1 @@
+Added text next to spinner when loading information after user is clicked on space members screen
\ No newline at end of file
From 4bc75b25749f575c9df16118250ef5a6e583fc9e Mon Sep 17 00:00:00 2001
From: Kagami Sascha Rosylight
Date: Sun, 10 Apr 2022 11:05:41 +0000
Subject: [PATCH 053/198] Translated using Weblate (Korean)
Currently translated at 38.4% (842 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ko/
---
vector/src/main/res/values-ko/strings.xml | 59 ++++++++---------------
1 file changed, 21 insertions(+), 38 deletions(-)
diff --git a/vector/src/main/res/values-ko/strings.xml b/vector/src/main/res/values-ko/strings.xml
index 900fa23a1c..b57bfd40d7 100644
--- a/vector/src/main/res/values-ko/strings.xml
+++ b/vector/src/main/res/values-ko/strings.xml
@@ -20,10 +20,10 @@
%s님이 음성 통화를 걸었습니다.%s님이 전화를 받았습니다.%s님이 전화를 끊었습니다.
- %1$s님이 이후 %2$s에게 방 기록을 공개했습니다
- 초대된 시점부터 모든 방 구성원.
- 들어온 시점부터 모든 방 구성원.
- 모든 방 구성원.
+ %1$s님이 이 시점 이후 방 기록을 %2$s님이 볼 수 있도록 공개했습니다
+ 방 참여자 모두, 다만 초대받은 시점부터.
+ 방 참여자 모두, 다만 들어온 시점부터.
+ 방 참여자 모두.누구나.%s님이 방을 업그레이드했습니다.(아바타도 변경됨)
@@ -39,7 +39,6 @@
전화번호방 초대%1$s님과 %2$s님
-
빈 방초기 동기화:
\n계정 가져오는 중…
@@ -134,7 +133,6 @@
완료정말 로그아웃하시겠습니까\?읽음으로 표시
-
커뮤니티최근에 애플리케이션이 충돌한 것 같습니다. 충돌 보고서를 열까요\?사용자 이름
@@ -145,7 +143,6 @@
알맞지 않은 사용자 이름이나 비밀번호올바른 이메일 주소가 아닙니다비밀번호를 잊어버리셨나요\?
-
이벤트 청취하기키 백업이 진행 중입니다. 지금 로그아웃하면 암호화된 메시지에 접근할 수 없습니다.암호화된 메시지에 대한 접근을 읽지 않도록 모든 장치에서 보안 키 백업이 활성화되어 있어야 합니다.
@@ -153,7 +150,6 @@
키 백업 중…로그아웃하기 전에 키를 백업하지 않으면 암호화된 메시지에 접근할 수 없습니다.후
-
수락하기차단초대
@@ -168,7 +164,6 @@
죄송합니다, 이 작업을 완료하기 위한 외부 애플리케이션이 없습니다.통합 인증으로 로그인이 이메일 주소는 이미 정의되었습니다.
-
이 홈서버는 당신이 로봇인지 아닌 지를 확인하고 싶습니다계정에 연결된 이메일 주소를 입력해야 합니다.이메일 주소를 확인할 수 없습니다: 이메일에 있는 링크를 클릭했는 지 확인하세요
@@ -199,14 +194,10 @@
영상 통화 진행 중…상대방이 전화를 받지 못했습니다.정보
-
-
음성 통화를 하려면 ${app_name}은 마이크에 접근하는 권한이 필요합니다.
-
영상 통화를 하려면 ${app_name}은 카메라와 마이크에 접근하는 권한이 필요합니다.
\n
\n전화를 하려면 다음 팝업에서 접근을 허용해주세요.
-
네아니오계속
@@ -215,15 +206,9 @@
받지 않기구성원 목록읽지 않은 첫 부분으로 이동하기.
-
-
%d명의 구성원
-
-
-
-
방 떠나기방을 떠나겠습니까\?다이렉트 대화
@@ -258,12 +243,9 @@
%d개 선택됨
-
검색방 구성원 필터결과 없음
-
-
모든 메시지홈 화면에 단축 아이콘 추가프로필 사진
@@ -396,7 +378,6 @@
가상 키보드의 엔터 버튼으로 줄 바꿈을 하는 대신 메시지를 보냅니다계정 비활성화내 계정 비활성화
-
정보 분석정보 분석 데이터 보내기${app_name}은 애플리케이션을 개선할 수 있도록 익명의 분석을 수집합니다.
@@ -405,7 +386,6 @@
공개 이름 업데이트마지막으로 본 순간%1$s @ %2$s
-
인증이것으로 로그인홈서버
@@ -453,7 +433,6 @@
예기치 않은 방식으로 중단될 수 있는 실험적인 기능들입니다. 주의해서 사용하세요.메인 주소로 설정메인 주소로 설정 해제
-
테마암호 복호화 오류공개 이름
@@ -464,7 +443,6 @@
로컬 파일로 키 내보내기내보내기내보낸 키를 암호화하는 암호를 만드세요. 키를 가져오려면 같은 암호를 입력해야 합니다.
-
암호화된 메시지 복구키 백업 관리종단간 암호화 방 키 가져오기
@@ -479,7 +457,6 @@
확인이 기기가 신뢰할 수 있는 지 확인하려면, 다른 방법을 사용하여 소유자에게 연락하세요 (예: 현실에서 혹은 전화로) 그리고 이 기기의 사용자 설정에서 표시된 키가 아래에 있는 키와 맞는지 물어보세요:그것이 맞다면, 아래의 확인 버튼을 누르세요. 맞지 않다면, 다른 사람이 이 기기를 가로채고 있는 것이고 블랙리스트에 올려야 합니다. 앞으로 이 확인 절차는 더 정교해질 것입니다.
-
방 목록 선택홈서버 URL%s 서버의 모든 방
@@ -487,7 +464,6 @@
%d개의 읽지 않은 알림 메시지
-
%d개의 방
@@ -569,8 +545,6 @@
홈방초대받음
-
-
%2$s님에 의해 %1$s 방에서 추방당했습니다%2$s님에 의해 %1$s 방에서 출입 금지당했습니다이유: %1$s
@@ -636,7 +610,6 @@
복구 키 저장공유파일로 저장
-
백업이 이미 홈서버에 존재합니다이미 키 백업을 다른 기기에 설정한 모양입니다. 만들고 있는 것으로 바꾸겠습니까\?바꾸기
@@ -687,7 +660,6 @@
백업 상태 확인하기백업 삭제서버에서 백업한 암호화 키를 삭제하겠습니까\? 더 이상 복구 키를 사용해 암호화된 메시지 기록을 읽을 수 없습니다.
-
암호화된 메시지를 잃지 마세요키 백업하기새 암호화된 메시지 키
@@ -700,11 +672,8 @@
버전알고리즘서명
-
확인되었습니다!알겠습니다
-
-
확인 요청%s님이 당신의 기기를 확인하고 싶습니다알 수 없는 오류
@@ -795,7 +764,6 @@
없음취소연결 해제
-
이 URL로는 홈서버에 접근할 수 없습니다, 확인해주세요백그라운드 동기화 모드 (실험적)배터리에 최적화됨
@@ -806,7 +774,6 @@
\n이는 라디오와 배터리 사용에 영향을 주며 ${app_name}이 이벤트를 수신하고 있는 상태라는 알림이 영구적으로 표시됩니다.
백그라운드 동기화 없음앱이 백그라운드에 있을 때 수신 메시지의 알림을 받지 않습니다.
-
탐색탐색 설정을 관리합니다.ID 서버를 사용하고 있지 않습니다
@@ -875,7 +842,6 @@
이 내용을 부적절한 문자로 신고했습니다.
\n
\n이 사용자의 내용을 더 이상 보고 싶지 않다면, 사용자를 차단하거나 메시지를 감출 수 있습니다.
-
통합통합 수락설명
@@ -982,4 +948,21 @@
주제를 다음으로 변경했습니다: %1$s표시 이름을 삭제했습니다 (이전 이름: %1$s)표시 이름을 %1$s에서 %2$s(으)로 변경했습니다
+ 서버 접근제어목록을 설정했습니다.
+ %s님이 서버 접근제어목록을 설정했습니다.
+ 이곳을 업그레이드했습니다.
+ %s님이 이곳을 업그레이드했습니다.
+ 방을 업그레이드했습니다.
+ 이 시점 이후 메시지를 %1$s님이 볼 수 있도록 공개했습니다
+ %1$s님이 이 시점 이후 메시지를 %2$s님이 볼 수 있도록 공개했습니다
+ 이 시점 이후 방 기록을 %1$s님이 볼 수 있도록 공개했습니다
+ 전화를 끊었습니다.
+ 전화를 받았습니다.
+ 통화 연결을 위한 데이터를 보냈습니다.
+ %s님이 통화 연결을 위한 데이터를 보냈습니다.
+ 음성 통화를 시작했습니다.
+ 영상 통화를 시작했습니다.
+ 방 이름을 바꾸었습니다: %1$s
+ 방 사진을 바꾸었습니다
+ %1$s님이 방 사진을 바꾸었습니다
\ No newline at end of file
From 6f2cdd2a9d26a4c7513636d9c7c642aa3a69c847 Mon Sep 17 00:00:00 2001
From: Johan Smits
Date: Mon, 11 Apr 2022 09:47:57 +0000
Subject: [PATCH 054/198] Translated using Weblate (Dutch)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/nl/
---
vector/src/main/res/values-nl/strings.xml | 431 +++++++++++-----------
1 file changed, 221 insertions(+), 210 deletions(-)
diff --git a/vector/src/main/res/values-nl/strings.xml b/vector/src/main/res/values-nl/strings.xml
index a87aeefe2e..80f819157e 100644
--- a/vector/src/main/res/values-nl/strings.xml
+++ b/vector/src/main/res/values-nl/strings.xml
@@ -32,14 +32,13 @@
%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.
- Kan bericht niet verzenden
+ Kan bericht niet versturenMatrix-foutE-mailadresTelefoonnummerGespreksuitnodiging%1$s en %2$sLeeg gesprek
-
Initiële synchronisatie:
\nAccount wordt geïmporteerd…Initiële synchronisatie:
@@ -101,7 +100,6 @@
VerwijderenHernoemenInhoud melden
-
ofUitnodigenAfmelden
@@ -124,7 +122,6 @@
Alleen Matrix-contactenGeen resultatenGesprekken
-
Logboek versturenCrash-logboek versturenSchermafdruk versturen
@@ -134,13 +131,13 @@
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:Het ziet er naar uit dat u de telefoon in frustratie schudt. Wilt u een probleem melden\?De foutmelding is verzonden
- Verzenden van foutmelding is mislukt (%s)
+ Versturen van foutmelding is mislukt (%s)Voortgang (%s%%)De toepassing is de vorige keer gecrasht. Wilt u dit melden\?Gesprek toetreden
- Gebruikersnaam
+ InlognaamAfmelden
- Thuisserver-URL
+ Server-URLZoekenSpraakoproep beginnenVideo-oproep beginnen
@@ -148,15 +145,13 @@
Foto of video makenAanmeldenIndienen
- Verkeerde gebruikersnaam en/of wachtwoord
+ Verkeerde inlognaam en/of wachtwoordDit is geen geldig e-mailadresDit e-mailadres is al in gebruik.Wachtwoord vergeten?
-
- Deze thuisserver wil graag weten of u geen robot bent
+ Deze server wil graag weten of u geen robot bentHet e-mailadres dat aan uw account gekoppeld is moet ingevoerd worden.Verifiëren van het e-mailadres is mislukt: zorg dat u op de koppeling in de e-mail hebt geklikt
-
Voer een geldige URL inOngeldige JSONBevatte geen geldige JSON
@@ -172,14 +167,10 @@
Oproep gaande…De andere kant heeft niet opgenomen.Informatie
-
-
${app_name} heeft toegang nodig tot uw microfoon om spraakoproepen te maken.
-
${app_name} heeft toegang nodig tot uw camera en microfoon om video-oproepen te maken.
\n
\nVerleen toegang op de volgende pop-ups om de oproep te maken.
-
JANEEVerdergaan
@@ -187,17 +178,16 @@
ToetredenAfwijzenGa naar ongelezen
-
Gesprek verlatenWeet u zeker dat u het gesprek wilt verlaten\?TWEEGESPREKKENUitnodigenVerbannenOntbannen
- Alle berichten van deze gebruiker verbergen
- Alle berichten van deze gebruiker tonen
+ Alle berichten van deze persoon verbergen
+ Alle berichten van deze persoon tonenVermelden
- U kunt deze veranderingen niet ongedaan maken aangezien u de gebruiker tot hetzelfde niveau als uzelf promoveert.
+ U kunt deze veranderingen niet ongedaan maken aangezien u de persoon tot hetzelfde niveau als uzelf promoveert.
\nWeet u het zeker\?%s is aan het typen…%1$s en %2$s zijn aan het typen…
@@ -214,7 +204,6 @@
Het certificaat is veranderd van één dat door uw telefoon werd vertrouwd naar een ander. Dit is HEEL ONGEBRUIKELIJK. Het wordt aangeraden om dit nieuwe certificaat NIET TE AANVAARDEN.Het certificaat is veranderd van een vertrouwd naar een onvertrouwd certificaat. De server heeft misschien zijn certificaat vernieuwd. Contacteer de serverbeheerder voor de verwachte vingerafdruk.Aanvaard het certificaat alleen als de serverbeheerder een vingerafdruk heeft gepubliceerd die overeenkomt met degene hierboven.
-
ZoekenGespreksleden filterenGeen resultaten
@@ -241,9 +230,9 @@
CopyrightPrivacybeleidCache wissen
- Gebruikersinstellingen
+ PersoonsinstellingenMeldingen
- Genegeerde gebruikers
+ Genegeerde personenOverigeGeavanceerdCryptografie
@@ -259,10 +248,9 @@
Publieke naam bijwerkenLaatst gezien%1$s @ %2$s
-
AuthenticatieAangemeld als
- Thuisserver
+ ServerIdentiteitsserverBekijk uw e-mail en tik op de koppeling erin. Tik zodra dit gedaan is op Verdergaan.Dit e-mailadres is al in gebruik.
@@ -283,14 +271,13 @@
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)
- Verbannen gebruikers
+ Verbannen personenGeavanceerdInterne ID van dit gesprekExperimenteelDit zijn experimentele functies die zich op onverwachte manieren kunnen gedragen. Wees behoedzaam bij het gebruik van deze functies.Instellen als hoofdadresNiet instellen als hoofdadres
-
OntsleutelingsfoutPublieke naamSessie ID
@@ -301,7 +288,6 @@
ExporterenVoer wachtwoord inWachtwoord bevestigen
-
E2E-gesprekssleutels importerenGesprekssleutels importerenImporteer de sleutels uit een lokaal bestand
@@ -311,11 +297,10 @@
NIET geverifieerdGeverifieerdVerifië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 Gebruikersinstellingen van deze sessie overeenkomt met de sleutel hieronder:
+ 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
- Thuisserver-naam
+ ServernaamAlle gesprekken op server %sAlle lokale gesprekken op %sStarten bij opstarten
@@ -361,7 +346,7 @@
Video makenBellenBerichten die mijn weergavenaam bevatten
- Berichten die mijn gebruikersnaam bevatten
+ Berichten die mijn inlognaam bevattenStatistische gegevensSysteemcamera gebruikenU heeft een nieuwe sessie ‘%s’ toegevoegd, die versleutelingssleutels aanvraagt.
@@ -381,25 +366,21 @@
%d verandering in lidmaatschap%d veranderingen in lidmaatschap
- Ledenlijst
-
+ Leden%d deelnemer%d deelnemers
- Als een gebruiker wordt verbannen, wordt deze uit deze kamer verwijderd en wordt er voorkomen dat hij opnieuw lid wordt.
+ Als een persoon wordt verbannen, wordt deze uit deze kamer verwijderd en wordt er voorkomen dat hij opnieuw lid wordt.%d nieuw bericht%d nieuwe berichten
-
-
Alle berichtenSnelkoppeling aan thuisscherm toevoegenInline URL-voorvertoning
- Trillen bij vermelden van een gebruiker
+ Trillen bij vermelden van een persoonBadge
-
%d gesprek%d gesprekken
@@ -431,15 +412,15 @@
Statistische gegevens (analytics) versturen${app_name} verzamelt anonieme statistische gegevens (analytics) om het voor ons mogelijk te maken om de app te verbeteren.Er ontbreekt een vereiste parameter.
- Om de %1$s-thuisserver verder te blijven gebruiken, dient u de voorwaarden te lezen en ermee akkoord te gaan.
+ Om de %1$s-server verder te blijven gebruiken, dient u de voorwaarden te lezen en ermee akkoord te gaan.Nu doorlezenAccount deactiveren
- Dit zal uw account voorgoed onbruikbaar maken. U zult zich niet meer kunnen aanmelden, en niemand anders zal met dezelfde gebruikers-ID kunnen registreren. Dit zal er voor zorgen dat uw account alle gesprekken verlaat waar deze momenteel lid van is, en het verwijdert de accountgegevens van de identiteitsserver. Deze actie is onomkeerbaar.
-\n
-\nHet deactiveren van uw account zal er niet standaard voor zorgen dat de berichten die u hebt verzonden worden vergeten. Indien u wilt dat wij de berichten vergeten, vinkt u het vakje hieronder aan.
-\n
+ Dit zal uw account voorgoed onbruikbaar maken. U zult zich niet meer kunnen aanmelden, en niemand anders zal met dezelfde persoon-ID kunnen registreren. Dit zal er voor zorgen dat uw account alle gesprekken verlaat waar deze momenteel lid van is, en het verwijdert de accountgegevens van de identiteitsserver. Deze actie is onomkeerbaar.
+\n
+\nHet deactiveren van uw account zal er niet standaard voor zorgen dat de berichten die u hebt verzonden worden vergeten. Indien u wilt dat wij de berichten vergeten, vinkt u het vakje hieronder aan.
+\n
\nDe zichtbaarheid van berichten in Matrix is gelijkaardig aan e-mails. Het vergeten van uw berichten betekent dat berichten die u verstuurd heeft niet meer gedeeld worden met nieuwe of ongeregistreerde gebruikers, maar geregistreerde gebruikers die al toegang hebben tot deze berichten zullen alsnog toegang hebben tot hun eigen kopie ervan.
- Vergeet alle berichten die ik heb verstuurd wanneer mijn account gedeactiveerd is (Let op: dit zal er voor zorgen dat toekomstige gebruikers een onvolledig beeld krijgen van gesprekken)
+ Vergeet alle berichten die ik heb verstuurd wanneer mijn account gedeactiveerd is (Let op: dit zal er voor zorgen dat toekomstige personen een onvolledig beeld krijgen van gesprekken)Account deactiverenDownloadenBeveiligingssleutels van uw sessies opnieuw aanvragen.
@@ -450,15 +431,15 @@
Beschrijf het probleem in het Engels, indien mogelijk.Media bekijken vóór het versturenToont een actie
- Verbant gebruiker met gegeven ID
- Heft verbanning van gebruiker met gegeven ID op
- Stel het machtsniveau van een gebruiker in
- Neemt rechten van gebruiker met gegeven ID af
- Nodigt gebruiker met gegeven ID uit in het huidige gesprek
+ Verbant persoon met gegeven ID
+ Heft verbanning van persoon met gegeven ID op
+ Stel het machtsniveau van een persoon in
+ Neemt rechten van persoon met gegeven ID af
+ Nodigt persoon met gegeven ID uit in het huidige gesprekVoegt een kamer toe met het opgegeven adresGesprek verlatenOnderwerp van het gesprek instellen
- Stuurt gebruiker met gegeven ID eruit
+ Stuurt persoon met gegeven ID eruitWijzigt uw weergavenaamMarkdown aan/uitDit gesprek is vervangen en is niet langer actief.
@@ -466,35 +447,29 @@
Dit gesprek is een voortzetting van een ander gesprekKlik hier om oudere berichten te zienSysteemmeldingen
-
-
-
-
%d geselecteerd%d geselecteerdOm Matrix-appbeheer te herstellen
-
-
contact op te nemen met uw dienstbeheerder
- Deze thuisserver heeft een van zijn bronlimieten overschreden, dus sommige gebruikers zullen zich niet kunnen aanmelden.
- Deze thuisserver heeft een van zijn bronlimieten overschreden.
- Deze thuisserver heeft zijn limiet voor maandelijks actieve gebruikers overschreden, dus sommige gebruikers zullen zich niet kunnen aanmelden.
- Deze thuisserver heeft zijn limiet voor maandelijks actieve gebruikers overschreden.
+ Deze server heeft een van zijn bronlimieten overschreden, dus sommige personen zullen zich niet kunnen aanmelden.
+ Deze server heeft een van zijn bronlimieten overschreden.
+ Deze server heeft zijn limiet voor maandelijks actieve personen overschreden, dus sommige personen zullen zich niet kunnen aanmelden.
+ Deze server heeft zijn limiet voor maandelijks actieve personen overschreden.Gelieve %s om deze limiet te verhogen.Gelieve %s om deze dienst te blijven gebruiken.FoutmeldingAanvaarden
- Gelieve het beleid van deze thuisserver te lezen en aanvaarden:
+ Gelieve het beleid van deze server te lezen en aanvaarden:OproepenGebruik de standaardbeltoon van ${app_name} voor inkomende oproepenBeltoon voor inkomende oproepenSelecteer beltoon voor oproepen:Eruit sturen
- Voorvertoning van koppelingen in het gesprek tonen (als uw thuisserver deze functie ondersteunt).
+ Voorvertoning van koppelingen in het gesprek tonen (als uw server deze functie ondersteunt).Typmeldingen versturen
- Laat andere gebruikers weten dat u aan het typen bent.
+ Laat andere personen weten dat u aan het typen bent.Markdown-opmaakMaak berichten op met Markdown-syntax voordat ze verstuurd worden. Hiermee kunt u uitgebreide opmaak gebruiken, zoals sterretjes voor schuingedrukte tekst.Leesbevestigingen weergeven
@@ -558,15 +533,15 @@
Het FCM-bewijs is niet opgehaald:
\n%1$s[%1$s]
-\nDeze fout is onafhankelijk van ${app_name}. Volgens Google betekent deze fout dat het apparaat te veel apps heeft geregistreerd met FCM. De fout treedt enkel op ingeval er een enorm aantal apps is, dus zou dit de gemiddelde gebruiker niet mogen hinderen.
+\nDeze fout is onafhankelijk van ${app_name}. Volgens Google betekent deze fout dat het apparaat te veel apps heeft geregistreerd met FCM. De fout treedt enkel op ingeval er een enorm aantal apps is, dus zou dit de gemiddelde persoon niet mogen hinderen.[%1$s]
\nDeze fout is onafhankelijk van ${app_name}. Ze kan verschillende oorzaken hebben. Misschien werkt het als u het later opnieuw probeert. U kunt ook controleren of het gegevensverbruik van Google Play Services niet wordt beperkt in de systeeminstellingen, of dat de klok van uw apparaat wel juist staat, of dat het misschien aan een aangepaste ROM ligt.[%1$s]
\nDeze fout is onafhankelijk van ${app_name}. Er is geen Google-account verbonden met de telefoon. Open het accountbeheer en voeg er een Google-account toe.Account toevoegenBewijsregistratie
- FCM-bewijs geregistreerd bij thuisserver.
- FCM-bewijs niet geregistreerd bij thuisserver:
+ FCM-bewijs geregistreerd bij server.
+ FCM-bewijs niet geregistreerd bij server:
\n%1$sStarten bij opstarten van apparaatDe dienst zal starten wanneer het apparaat wordt herstart.
@@ -581,7 +556,7 @@
Beperkingen uitschakelenAccuoptimalisatie${app_name} wordt niet beperkt door accuoptimalisatie.
- Als een gebruiker een apparaat los van de oplader een tijd laat stilliggen, met het scherm uitgeschakeld, gaat het apparaat in slaapmodus. Dit verhindert apps de toegang tot het netwerk, en stelt hun taken, synchronisaties en standaardalarmen uit.
+ 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 negerenLawaaiierige meldingen configurerenOproepmeldingen configureren
@@ -590,7 +565,6 @@
Beheer van cryptografische sleutelsBerichten versturen met EnterDe Enter-knop van het toetsenbord zal berichten versturen in plaats van een regeleinde in te voegen
-
WachtwoordHet wachtwoord is ongeldigMedia
@@ -621,7 +595,7 @@
Markdown is ingeschakeld.Markdown is uitgeschakeld.Stil
- Voer een gebruikersnaam in.
+ Voer een inlognaam in.Sorry, er is een fout opgetredenuitvouweninvouwen
@@ -641,7 +615,7 @@
(Geavanceerd)Sleutels handmatig exporterenBeveilig uw back-up met een wachtwoord.
- We bewaren een versleutelde kopie van uw sleutels op onze thuisserver. Bescherm uw back-up met een wachtwoord om deze veilig te houden.
+ We bewaren een versleutelde kopie van uw sleutels op onze server. Bescherm uw back-up met een wachtwoord om deze veilig te houden.
\n
\nVoor een maximale beveiliging zou deze sleutel moeten verschillen van uw accountwachtwoord.Wachtwoord instellen
@@ -658,7 +632,6 @@
Herstelsleutel opslaanDelenOpslaan als bestand
-
Gelieve er een kopie van te makenHerstelsleutel delen met…Herstelsleutel wordt gegenereerd met wachtwoord, dit proces kan enkele seconden duren.
@@ -706,7 +679,6 @@
Back-up wordt verwijderd…Back-up verwijderenUw geback-upte versleutelingssleutels verwijderen van de server\? U zult uw herstelsleutel niet meer kunnen gebruiken om de versleutelde berichtgeschiedenis te lezen.
-
Verlies nooit uw versleutelde berichtenSleutelback-up gebruikenNieuwe sleutels voor versleutelde berichten
@@ -720,7 +692,6 @@
VersieAlgoritmeOndertekening
-
Sorry, vergadergesprekken met Jitsi worden nog niet ondersteund op oudere apparaten (met een Android-versie lager dan 6.0)onbekend IP-adresEen nieuwe sessie vraagt versleutelingssleutels aan.
@@ -736,8 +707,6 @@
NegerenGeverifieerd!Ik snap het
-
-
Verificatieverzoek%s wil uw sessie verifiërenOnbekende fout
@@ -745,9 +714,8 @@
IntrekkenVerbinding verbrekenWeigeren
-
Dit is geen geldig Matrix-serveradres
- Kan geen verbinding maken met een thuisserver op deze URL, controleer de URL
+ Kan geen verbinding maken met een server op deze URL, controleer de URLSynchroniseren op de achtergrondGeoptimaliseerd voor batterij${app_name} zal op een batterijzuinige manier synchroniseren op de achtergrond.
@@ -757,7 +725,6 @@
\nDit heeft een negatieve impact op uw batterij- en datagebruik. Er zal een melding getoond worden ter informatie.Geen achtergrondssynchronisatieU zal geen melding van berichten ontvangen als de app zich in de achtergrond bevindt.
-
IntegratiesGebruik een integratiebeheerder om bots, bruggen, widgets en stickerpakketten te beheren.
\nIntegratiebeheerders ontvangen configuratiedata en kunnen widgets aanpassen, gespreksuitnodigingen versturen en bestuursniveaus instellen namens u.
@@ -777,7 +744,7 @@
Toegang intrekken voor mijUw weergavenaamUw profielfoto-URL
- Uw gebruikers-ID
+ Uw persoon-IDUw themaWidget-IDGespreks-ID
@@ -788,13 +755,13 @@
Microfoon gebruikenDRM-beschermde media lezenOm verder te gaan dient u de dienstvoorwaarden te aanvaarden.
- Er bestaat al een back-up op uw thuisserver
+ Er bestaat al een back-up op uw serverHet lijkt erop dat u al een back-up van uw herstelsleutel heeft uit een andere sessie. Wilt u deze vervangen door degene die u nu aanmaakt\?VervangenStoppenBack-upstatus wordt gecontroleerdU gebruikt geen identiteitsserver
- Het lijkt er op dat u probeert verbinding te maken met een andere thuisserver. Wil je uitloggen\?
+ Het lijkt er op dat u probeert verbinding te maken met een andere server. Wil je uitloggen\?BewerkenBeantwoordenOpnieuw proberen
@@ -811,7 +778,7 @@
Reactie ToevoegenReacties BekijkenReacties
- Gebeurtenis verwijderd door gebruiker
+ Gebeurtenis verwijderd door persoonGebeurtenis gemodereerd door gesprek beheerderNiet correcte gebeurtenis, kan niet weergevenMaak een nieuw gesprek aan
@@ -914,7 +881,7 @@
%1$s sluit aanU heeft de kamer betredenDruk op uw opname om te stoppen of om te luisteren
- Houd ingedrukt om op te nemen, laat los om te verzenden
+ Houd ingedrukt om op te nemen, laat los om te versturenVerwijder opnameStembericht aan het opnemenPauzeer stembericht
@@ -989,8 +956,8 @@
Rol instellen%1$s gebruikenHuidige taal
- Gebruikers Uitnodigen
- Gebruikers uitnodigen…
+ Personen uitnodigen
+ Personen uitnodigen…Leden toevoegenLogin bevestigenBestand Gebruiken
@@ -1045,9 +1012,9 @@
InloggenGezien doorMatrix-ID
- Verouderde thuisserver
+ Verouderde serverSelecteer matrix.org
- Opnieuw verzenden
+ Opnieuw versturenCode invoerenTelefoonnummerEmail (optioneel)
@@ -1058,23 +1025,23 @@
Ongelezen berichtenAlleen vermeldingenBeveiligde Backup
- Verbanning gebruiker ongedaan maken
- Gebruiker verbannen
- Gebruiker verwijderen
+ Verbanning persoon ongedaan maken
+ Persoon verbannen
+ Persoon verwijderenUitnodiging annuleren
- Gebruiker niet meer negeren
+ Persoon niet meer negerenStemonstabielstabielAlle berichten
- Gebruiker negeren
+ Persoon negerenInhoud gerapporteerd
- GEBRUIKER NEGEREN
+ PERSOON NEGERENAangepast rapport…Dit is ongepastDit is spamGelezen door %s
- Bijlage verzenden
+ Bijlage versturenIdentiteitsserverKamer aanmaken…Gesprekken filteren…
@@ -1095,7 +1062,7 @@
\@roomOverigeGeen
- Gebruiker negeren
+ Persoon negerenUzelf degraderen\?Uitnodiging annulerenIn de wacht zetten
@@ -1113,7 +1080,7 @@
PubliekMisluktVerzonden
- Verzenden
+ VersturenTypeOngecontroleerdGecontroleerd
@@ -1121,7 +1088,7 @@
VideoAfbeeldingSchermafbeelding
- Gebruikers
+ PersonenOverdragenVerbindenOnderwerp
@@ -1159,7 +1126,7 @@
Gekruist OndertekenenTijdlijnNegeren opheffen
- Gebruikers
+ PersonenGenodigdenAangepastModeratoren
@@ -1181,7 +1148,7 @@
WaarschuwingVolgendeWachtwoord
- Gebruikersnaam
+ InlognaamVolgendeVolgendeVolgende
@@ -1265,30 +1232,30 @@
Aan de slagSpacerechtenGespreksrechten
- Door deze gebruiker niet meer de verbannen kan hij/zij opnieuw toetreden tot de space.
- Door deze gebruiker niet meer de verbannen kan hij/zij opnieuw toetreden tot het gesprek.
- Door deze gebruiker te verbannen zal hij/zij verwijderd worden uit deze space en voorkomen dat hij/zij opnieuw toetreedt.
+ 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 deze persoon te verbannen zal hij/zij verwijderd worden uit deze space en voorkomen dat hij/zij opnieuw toetreedt.Reden voor verbanning
- door deze gebruiker de verwijderen zal hij/zij niet meer in deze space zitten.
+ Door deze persoon de verwijderen zal hij/zij niet meer in deze space zitten.
\n
\nOm te voorkomen dat hij/zij opnieuw toetreedt, kunt u hem/haar ook verbannen.
- door deze gebruiker te verwijderen zal hij/zij niet meer in dit gesprek zitten.
+ 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.Reden voor verwijdering
- Weet u zeker dat u uitnodiging voor deze gebruiker wilt annuleren\?
- Het niet meer negeren van deze gebruiker zal al zijn/haar berichten opnieuw doen weergeven.
- Door deze gebruiker te negeren worden zijn/haar berichten verwijderd uit gesprekken die jullie delen.
+ Weet u zeker dat u uitnodiging voor deze persoon wilt annuleren\?
+ Het niet meer negeren van deze persoon zal al zijn/haar berichten opnieuw doen weergeven.
+ Door deze persoon te negeren worden zijn/haar berichten verwijderd uit gesprekken die jullie delen.
\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 gebruiker met rechten bent in het gesprek zal het onmogelijk zijn om opnieuw rechten te krijgen.
+ 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.Toegang verlenen tot uw contactpersonen.Om de QR-code te scannen moet u toegang verlenen tot de camera.Oproep beëindigen…Geen antwoord
- De gebruiker die u heeft gebeld is bezig.
- Gebruiker bezig
+ De persoon die u heeft gebeld is bezet.
+ Persoon bezetU heeft de oproep in de wacht gezet%s heeft de oproep in de wacht gezetBellen met %s
@@ -1313,10 +1280,10 @@
HD uitschakelenGeluidsapparaat SelecterenKan geen realtime verbinding tot stand brengen.
-\nVraag de beheerder van uw thuisserver om een TURN-server te configureren om gesprekken betrouwbaar te laten werken.
+\nVraag de beheerder van uw server om een TURN-server te configureren om gesprekken betrouwbaar te laten werken.${app_name} Oproep Mislukt
- Thuisserver API URL
- Sleutel deelverzoekgeschiedenis verzenden
+ Server API URL
+ Sleutel deelverzoekgeschiedenis versturenAlle gesprekken in de lijst tonen, waaronder gesprekken met expliciete inhoud.Gesprekken tonen met expliciete inhoudGesprekslijst
@@ -1345,11 +1312,11 @@
Er wordt een verificatie-e-mail naar uw inbox gestuurd om het instellen van uw nieuwe wachtwoord te bevestigen.Wachtwoord opnieuw instellen op %1$sDit e-mailadres is niet gekoppeld aan een account.
- De applicatie kan geen account aanmaken op deze thuisserver.
+ De applicatie kan geen account aanmaken op deze server.
\n
\nWilt u zich aanmelden met een webclient\?Sorry, deze server accepteert geen nieuwe accounts.
- De applicatie kan niet inloggen op deze thuisserver. De thuisserver ondersteunt de volgende aanmeldingstype(s): %1$s.
+ De applicatie kan niet inloggen op deze server. De thuisserver ondersteunt de volgende aanmeldingstype(s): %1$s.
\n
\nWil je inloggen met een webclient\?Er is een fout opgetreden bij het laden van de pagina: %1$s (%2$d)
@@ -1381,7 +1348,7 @@
Je hebt de kamer alleen op uitnodiging gemaakt.%1$s heeft de kamer alleen voor uitnodigingen ingesteld.U heeft de kamer openbaar gemaakt voor iedereen die de link kent.
- U negeert geen enkele gebruiker
+ U negeert geen enkele persoon%1$s heeft de kamer openbaar gemaakt voor iedereen die de link kent.Klik lang op een kamer om meer opties te zienSchrijf trefwoorden om een reactie te vinden.
@@ -1395,18 +1362,17 @@
Verwijder van favorietenToevoegen aan favorietenAlle berichten (luidruchtig)
-
Deze inhoud is als ongepast gerapporteerd.
\n
-\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen.
+\nAls u geen inhoud van deze persoon meer wilt zien, kunt u deze negeren om hun berichten te verbergen.Gemeld als ongepastDeze inhoud is gerapporteerd als spam.
\n
-\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen.
+\nAls u geen inhoud van deze persoon meer wilt zien, kunt u deze negeren om hun berichten te verbergen.Gerapporteerd als spamDeze inhoud is gemeld.
\n
-\nAls u geen inhoud van deze gebruiker meer wilt zien, kunt u deze negeren om hun berichten te verbergen.
+\nAls u geen inhoud van deze persoon meer wilt zien, kunt u deze negeren om hun berichten te verbergen.Reden voor het rapporteren van deze inhoudDeze inhoud rapporterenEr zijn geen bestanden in deze kamer
@@ -1420,8 +1386,8 @@
Er is een fout opgetreden bij het ophalen van de bijlage.Het bestand is te groot om te uploaden.
- %d gebruiker gelezen
- %d gebruikers gelezen
+ %d persoon gelezen
+ %d personen gelezen%1$s en %2$s gelezen%1$s, %2$s en %3$s gelezen
@@ -1449,16 +1415,14 @@
Voer de URL van de identiteitsserver inKan geen verbinding maken met identiteitsserverVoer een identiteitsserver URL in
- Gaat u akkoord met het verzenden van deze informatie\?
+ Gaat u akkoord met het versturen van deze informatie\?Om bestaande contacten te ontdekken, moet u contactgegevens (e-mailadressen en telefoonnummers) naar uw identiteitsserver sturen. We hashen uw gegevens voordat ze worden verzonden vanwege privacy.
-
-
Stuur e-mailadressen en telefoonnummers naar %sToestemming gevenMijn toestemming intrekken
- Uw thuisserver-beleid
- Kan geen thuisserver bereiken op de URL %s. Controleer uw link of kies handmatig een thuisserver.
- Uw contacten zijn privé. Om gebruikers van uw contacten te ontdekken, hebben we uw toestemming nodig om contactgegevens naar uw identiteitsserver te sturen.
+ Uw server-beleid
+ 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 bevestigingslinkWe hebben u een bevestigingsmail gestuurd naar %s, controleer uw e-mail en klik op de bevestigingslinkOntdekkingsopties verschijnen zodra u een e-mail heeft toegevoegd.
@@ -1471,14 +1435,14 @@
Verander uw schermnaam alleen in de huidige kamerAndere spaces of kamers die u misschien niet kentSpace die u kent die deze kamer bevat
- Stel adressen in voor deze kamer zodat gebruikers deze kamer kunnen vinden via uw thuisserver (%1$s)
+ Stel adressen in voor deze kamer zodat personen deze kamer kunnen vinden via uw server (%1$s)U kunt dit op elk moment uitschakelen in de instellingenU krijgt geen meldingen voor vermeldingen en trefwoorden in versleutelde kamers op uw mobiel.Zorg ervoor dat u op de link heeft geklikt in de e-mail die we u hebben gestuurd.
- U hebt uw toestemming gegeven om e-mails en telefoonnummers naar deze identiteitsserver te sturen om andere gebruikers van uw contacten te ontdekken.
- E-mails en telefoonnummers verzenden
+ U hebt uw toestemming gegeven om e-mails en telefoonnummers naar deze identiteitsserver te sturen om andere personen van uw contacten te ontdekken.
+ E-mailadressen en telefoonnummers versturenVindbare telefoonnummers
- Als u de verbinding met uw identiteitsserver verbreekt, betekent dit dat u niet door andere gebruikers kan worden gevonden en dat u anderen niet per e-mail of telefoon kunt uitnodigen.
+ Als u de verbinding met uw identiteitsserver verbreekt, betekent dit dat u niet door andere personen kan worden gevonden en dat u anderen niet per e-mail of telefoon kunt uitnodigen.Ontdekkingsopties verschijnen zodra u een telefoonnummer heeft toegevoegd.Vindbare e-mailadressenU gebruikt momenteel geen identiteitsserver. Om te ontdekken en vindbaar te zijn door bestaande contacten die u kent, configureert u er een hieronder.
@@ -1493,7 +1457,7 @@
Vindbaar zijn voor anderenServicevoorwaardenBekijken Bewerken Geschiedenis
- Bekende gebruikers
+ Bekende personenQR-codeToevoegen via QR-codeLink gekopieerd naar klembord
@@ -1503,22 +1467,22 @@
Zoeken op naam, ID of e-mailNaam of ID (#voorbeeld:matrix.org)Bekijk de kamer directory
- Een nieuw privébericht verzenden
+ Een nieuw privébericht versturenNieuwe kamer aanmakenKunt u niet vinden wat u zoekt\?Geen bewerkingen gevondenBestand %1$s is gedownload!Video comprimeren %d%%Afbeelding comprimeren…
- Bestand verzenden (%1$s / %2$s)
- Miniatuur verzenden (%1$s / %2$s)
+ Bestand versturen (%1$s / %2$s)
+ Miniatuur versturen (%1$s / %2$s)Toon volledige geschiedenis in versleutelde kamersToon verborgen gebeurtenissen op de tijdlijnGeef feedbackDe feedback kan niet worden verzonden (%s)Bedankt, uw feedback is succesvol verzondenU kunt contact met mij opnemen als u vervolgvragen heeft
- U gebruikt een bètaversie van spaces. Uw feedback zal helpen bij het informeren van de volgende versies. Uw platform en gebruikersnaam worden genoteerd om ons te helpen uw feedback zoveel mogelijk te gebruiken.
+ U gebruikt een bètaversie van spaces. Uw feedback zal helpen bij het informeren van de volgende versies. Uw platform en inlognaam worden genoteerd om ons te helpen uw feedback zoveel mogelijk te gebruiken.Spaces feedbackDe suggestie kan niet worden verzonden (%s)Bedankt, de suggestie is succesvol verzonden
@@ -1551,11 +1515,11 @@
Beveiligde back-up instellenBeveiliging tegen verlies van toegang tot versleutelde berichten en gegevensDe herstelsleutel is opgeslagen.
- Toont informatie over een gebruiker
+ Toont informatie over een persoonVerandert de avatar van de huidige kamerStelt de kamernaam in
- Stopt met het negeren van een gebruiker, toon hun berichten in de toekomst
- Negeer een gebruiker en verberg hun berichten voor jou
+ Stopt met het negeren van een persoon, toon hun berichten in de toekomst
+ Negeer een persoon en verberg hun berichten voor jouGeen actieve widgetsDe huidige conferentie verlaten en naar de andere overschakelen\?Sorry, er is een fout opgetreden bij het deelnemen aan de conferentie
@@ -1574,8 +1538,8 @@
Sleutels succesvol geëxporteerdKamer versie
- %d verbannen gebruiker
- %d verbannen gebruikers
+ %d verbannen persoon
+ %d verbannen personenBepaal wie deze kamer kan vinden en er lid van kan worden.Tik om spaces te bewerken
@@ -1654,7 +1618,7 @@
GroepsberichtenVersleutelde directe berichtenDirecte berichten
- Mijn gebruikersnaam
+ Mijn inlognaamMijn weergavenaamBerichten bevatten @roomWanneer kamers worden opgewaardeerd
@@ -1681,7 +1645,7 @@
De sessie is afgemeld!De kamer is verlaten!Alleen vermeldingen en trefwoorden
- Filter verbannen gebruikers
+ Filter verbannen personenVerander onderwerpSpace upgradenKamer upgraden
@@ -1699,10 +1663,10 @@
Widgets wijzigenIedereen informerenBerichten verwijderen die door anderen zijn verzonden
- Gebruikers verbannen
- Kick gebruikers
+ Personen verbannen
+ Kick personenInstellingen veranderen
- Gebruikers uitnodigen
+ Personen uitnodigenBerichten sturenStandaardrolU bent niet gemachtigd om de rollen bij te werken die nodig zijn om verschillende delen van deze space te wijzigen
@@ -1711,7 +1675,7 @@
Selecteer de rollen die nodig zijn om verschillende delen van de kamer te veranderenBekijk en update de rollen die nodig zijn om verschillende delen van de kamer te veranderen.Bekijk en update de rollen die nodig zijn om verschillende delen van de kamer te veranderen.
- Kies thuisserver
+ Kies serverNiet nuInschakelenLuisteren naar notificaties
@@ -1723,12 +1687,12 @@
Geen contentEvent inhoudStatussleutel
- Aangepaste statusgebeurtenis verzenden
+ Aangepaste statusgebeurtenis versturenInhoud bewerkenStaat gebeurtenissen
- Statusgebeurtenis verzenden
- Aangepaste gebeurtenis verzenden
- Kamerstatus verkennen
+ Statusgebeurtenis versturen
+ Aangepaste gebeurtenis versturen
+ Kamer status ontdekkenOntwikkel toolsNiet beschikbaarOffline
@@ -1765,8 +1729,6 @@
Actieve oproep ·%1$d actieve gesprekken ·
-
-
Actieve oproep (%1$s)Er is een fout opgetreden bij het opzoeken van het telefoonnummerToetsenblok
@@ -1827,7 +1789,7 @@
Controleer uw instellingen om pushmeldingen in te schakelenPushmeldingen zijn uitgeschakeld
- Kan gebruiker verbanning niet opheffen
+ Kan persoon verbanning niet opheffenVerbannen door %1$sUitnodiging voor %1$s intrekken\?Zoeken naar contacten op Matrix
@@ -1863,14 +1825,14 @@
De microfoon dempenVoer de URL van een identiteitsserver inU kunt ook een andere identiteitsserver URL invoeren
- Uw thuisserver (%1$s) stelt voor om %2$s te gebruiken voor uw identiteitsserver
- De toestemming van de gebruiker is niet gegeven.
+ Uw server (%1$s) stelt voor om %2$s te gebruiken voor uw identiteitsserver
+ De toestemming van de persoon is niet gegeven.Er is geen huidige associatie met dit id.De associatie heeft gefaald.
- Voor uw privacy ondersteunt ${app_name} alleen het verzenden van gehashte e-mailadressen en telefoonnummers van gebruikers.
+ Voor uw privacy ondersteunt ${app_name} alleen het versturen van gehashte e-mailadressen en telefoonnummers van personen.Accepteer eerst de voorwaarden van de identiteitsserver in de instellingen.Configureer eerst een identiteitsserver.
- Deze operatie is niet mogelijk. De thuisserver is verouderd.
+ Deze operatie is niet mogelijk. De server is verouderd.Deze identiteitsserver is verouderd. ${app_name} ondersteunt alleen API V2.Verbinding met identiteitsserver %s verbreken\?Open voorwaarden van %s
@@ -1880,7 +1842,7 @@
Mijn codeDeel mijn codeScan een QR-code
- We kunnen geen gebruikers uitnodigen. Controleer de gebruikers die u wilt uitnodigen en probeer het opnieuw.
+ We kunnen geen personen uitnodigen. Controleer de personen die u wilt uitnodigen en probeer het opnieuw.Uitnodigingen verzonden naar %1$s en nog éénUitnodigingen verzonden naar %1$s en %2$d meer
@@ -1892,13 +1854,13 @@
Hé, praat met me op ${app_name}: %sNodig vrienden uitMensen toevoegen
- We kunnen je DM niet maken. Controleer de gebruikers die u wilt uitnodigen en probeer het opnieuw.
+ 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.
\n
\nWeet u zeker dat u door wilt gaan\?Dubbelcheck deze linkKies een wachtwoord.
- Kies een gebruikersnaam.
+ Kies een inlognaam.Kan kruislingsondertekenen niet instellenBevestig uw identiteit door deze login te verifiëren en deze toegang te verlenen tot versleutelde berichten.Bevestig uw identiteit door deze login van een van uw andere sessies te verifiëren en toegang te verlenen tot versleutelde berichten.
@@ -1916,7 +1878,7 @@
Laat het apparaat zien waarmee u nu kunt verifiëren%d apparaten weergeven waarmee u nu kunt verifiëren
- U start opnieuw op zonder geschiedenis, geen berichten, vertrouwde apparaten of vertrouwde gebruikers
+ U start opnieuw op zonder geschiedenis, geen berichten, vertrouwde apparaten of vertrouwde personenAls je alles resetDoe dit alleen als u geen ander apparaat heeft waarmee u dit apparaat kunt verifiëren.Alle herstelopties vergeten of verloren\? Alles resetten
@@ -1954,7 +1916,7 @@
Verifieer uzelf en anderen om uw chats veilig te houdenEncryptie upgrade beschikbaarDit account is gedeactiveerd.
- Onjuiste gebruikersnaam en/of wachtwoord. Het ingevoerde wachtwoord begint of eindigt met spaties, controleer dit alstublieft.
+ Onjuiste inlognaam en/of wachtwoord. Het ingevoerde wachtwoord begint of eindigt met spaties, controleer dit alstublieft.Verzendt een bericht als platte tekst, zonder het als markdown te interpreterenKan sleutels niet importerenWachten op %s…
@@ -1970,11 +1932,10 @@
De versleuteling die door deze kamer wordt gebruikt, wordt niet ondersteundVersleuteling niet ingeschakeldBerichten in deze kamer zijn end-to-end-versleuteld.
- Berichten in deze kamer zijn end-to-end-versleuteld. Lees meer en verifieer gebruikers in hun profiel.
+ Berichten in deze kamer zijn eind-tot-eind-versleuteld. Lees meer en verifieer persoon in hun profiel.Als u nu annuleert, kunt u versleutelde berichten en gegevens kwijtraken als u de toegang tot uw aanmeldingen verliest.
\n
\nU kunt ook Veilige back-up instellen en uw sleutels beheren in Instellingen.
-
Kopieer het naar uw persoonlijke cloudopslagBewaar het op een USB-stick of back-upstationPrint het uit en bewaar het ergens veilig
@@ -1983,7 +1944,7 @@
\nHoud ze veilig! U heeft ze nodig om versleutelde berichten te ontgrendelen en informatie te beveiligen als u al uw actieve sessies verliest.
Sleutelback-up instellenZelfondertekenende sleutel synchroniseren
- Gebruikerssleutel synchroniseren
+ Persoonssleutel synchroniserenHoofdsleutel synchroniserenSSSS standaardsleutel definiërenBeveiligde sleutel genereren op basis van wachtwoordzin
@@ -1998,14 +1959,14 @@
Een van de volgende zaken kan worden aangetast:
\n
\n- Uw wachtwoord
-\n- Uw thuisserver
+\n- Uw server
\n- Dit apparaat, of het andere apparaat
\n- De internetverbinding die elk apparaat gebruikt
\n
\nWe raden u aan uw wachtwoord en herstelsleutel onmiddellijk in Instellingen te wijzigen.
- U verifieert %1$s (%2$s) niet als u nu annuleert. Begin opnieuw in hun gebruikersprofiel.
- Als u annuleert, kunt u geen versleutelde berichten op dit apparaat lezen en zullen andere gebruikers het niet vertrouwen
- Als u annuleert, kunt u geen versleutelde berichten lezen op je nieuwe apparaat en zullen andere gebruikers het niet vertrouwen
+ U verifieert %1$s (%2$s) niet als u nu annuleert. Begin opnieuw in hun profiel.
+ Als u annuleert, kunt u geen versleutelde berichten op dit apparaat lezen en zullen andere personen het niet vertrouwen
+ Als u annuleert, kunt u geen versleutelde berichten lezen op je nieuwe apparaat en zullen andere personen het niet vertrouwenUw account is mogelijk gecompromitteerdDit was ik nietGebruik deze sessie om uw nieuwe te verifiëren en deze toegang te verlenen tot versleutelde berichten.
@@ -2015,11 +1976,11 @@
${app_name} AndroidSleutels zijn al up-to-date!Gebeurtenis gemodereerd door kamer beheerder, reden: %1$s
- Gebeurtenis verwijderd door gebruiker, reden: %1$s
+ Gebeurtenis verwijderd door persoon, reden: %1$sReden voor redigerenGeef een reden opWeet u zeker dat u deze gebeurtenis wilt verwijderen (wissen)\? Houd er rekening mee dat als u een kamer naam of onderwerpwijziging verwijdert, de wijziging ongedaan kan worden gemaakt.
- Media verzenden in het originele formaat
+ Media versturen in het originele formaatStuur video in het originele formaatStuur video\'s in het originele formaat
@@ -2038,7 +1999,7 @@
Vliegtuigmodus is ingeschakeldVerbinding met de server is verbrokenBijna daar! Toont %s een vinkje\?
- Totdat deze gebruiker deze sessie vertrouwt, worden berichten die van en naar de sessie worden verzonden, gelabeld met waarschuwingen. U kunt het ook handmatig verifiëren.
+ 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:Kan geen sessies ophalen
@@ -2054,7 +2015,7 @@
StandaardversieKamerversies 👓De limiet is onbekend.
- Uw thuisserver accepteert bijlagen (bestanden, media, enz.) met een grootte tot %s.
+ Uw server accepteert bijlagen (bestanden, media, enz.) met een grootte tot %s.Server limiet voor het uploaden van bestandenServerversieServer naam
@@ -2069,9 +2030,9 @@
\nPrivésleutels zijn niet bekend
Kruisondertekening is ingeschakeld
\nPrivésleutels op het apparaat.
- Uw nieuwe sessie is nu geverifieerd. Het heeft toegang tot uw gecodeerde berichten en andere gebruikers zullen het als vertrouwd zien.
- Berichten met deze gebruiker zijn end-to-end-versleuteld en kunnen niet door derden worden gelezen.
- Vergelijk de code met die op het scherm van de andere gebruiker.
+ Uw nieuwe sessie is nu geverifieerd. Het heeft toegang tot uw gecodeerde berichten en andere personen zullen het als vertrouwd zien.
+ Berichten met deze persoon zijn end-to-end-versleuteld en kunnen niet door derden worden gelezen.
+ Vergelijk de code met die op het scherm van de andere persoon.Vergelijk de unieke emoji en zorg ervoor dat ze in dezelfde volgorde verschijnen.Doe dit voor de zekerheid persoonlijk of gebruik een andere manier om te communiceren.Om veilig te zijn, verifieert u %s door een eenmalige code te controleren.
@@ -2099,7 +2060,6 @@
\nUw berichten zijn beveiligd met sloten en alleen u en de ontvanger hebben de unieke sleutels om ze te ontgrendelen.
Berichten hier zijn niet end-to-end-versleuteld.Berichten in deze kamer zijn niet end-to-end-versleuteld.
-
Wachten op %s…Verifieer door emoji\'s te vergelijkenVerifieer door emoji te vergelijken
@@ -2107,15 +2067,15 @@
Scannen met dit apparaatScan hun codeScan de code met uw ander apparaat of wissel en scan met dit apparaat
- Scan de code met het apparaat van de andere gebruiker om elkaar veilig te verifiëren
+ Scan de code met het apparaat van de andere persoon om elkaar veilig te verifiërenDeze sessie verifiërenGereageerd met: %s"Een van de volgende zaken kan worden aangetast:
\n
-\n - Uw thuisserver
-\n - De thuisserver waarmee de gebruiker die u verifieert is verbonden
-\n - De internetverbinding van u of de andere gebruikers
-\n - Het apparaat van u of van andere gebruikers"
+\n - Uw server
+\n - De server waarmee de gebruiker die u verifieert is verbonden
+\n - De internetverbinding van u of de andere personen
+\n - Het apparaat van u of van andere personen"
Ze komen niet overeenNiet-vertrouwd inloggenUw e-maildomein is niet geautoriseerd om op deze server te registreren
@@ -2125,7 +2085,7 @@
Geef een kameradres opDit adres is al in gebruikSpace adres
- U kunt dit inschakelen als de kamer alleen wordt gebruikt voor samenwerking met interne teams op uw thuisserver. Dit kan later niet meer worden gewijzigd.
+ 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 kamerVerberg geavanceerdToon geavanceerd
@@ -2140,7 +2100,7 @@
De ontwikkelaarsmodus activeert verborgen functies en kan de applicatie ook minder stabiel maken. Alleen voor ontwikkelaars!De beschrijving is te kortUw matrix.to link is onjuist opgemaakt
- De huidige sessie is voor gebruiker %1$s en u geeft inloggegevens op voor gebruiker %2$s. Dit wordt niet ondersteund door ${app_name}.
+ De huidige sessie is voor gebruiker %1$s en u geeft inloggegevens op voor persoon %2$s. Dit wordt niet ondersteund door ${app_name}.
\nWis eerst de gegevens en meld u vervolgens opnieuw aan met een ander account.U raakt de toegang tot beveiligde berichten kwijt, tenzij u zich aanmeldt om uw versleutelingssleutels te herstellen.Alle gegevens wissen die momenteel op dit apparaat zijn opgeslagen\?
@@ -2151,7 +2111,7 @@
\nWis het als u klaar bent met het gebruik van dit apparaat of als u zich wilt aanmelden bij een ander account.Persoonlijke gegevens wissenLog in om versleutelingssleutels te herstellen die exclusief op dit apparaat zijn opgeslagen. Je hebt ze nodig om al uw beveiligde berichten op elk apparaat te lezen.
- Uw thuisserver (%1$s) beheerder heeft u uitgelogd van uw account %2$s (%3$s).
+ Uw server (%1$s) beheerder heeft u uitgelogd van uw account %2$s (%3$s).Je bent uitgelogdOpnieuw inloggenHet kan verschillende redenen hebben:
@@ -2162,30 +2122,30 @@
\n
\n• De beheerder van uw server heeft uw toegang om veiligheidsredenen ongeldig gemaakt.Je bent uitgelogd
- Kan geen geldige thuisserver vinden. Controleer uw ID a.u.b.
- Dit is geen geldige gebruikers-ID. Verwacht formaat: \'@gebruiker:thuisserver.org\'
+ Kan geen geldige server vinden. Controleer uw ID a.u.b.
+ Dit is geen geldige persoon-ID. Verwacht formaat: \'@persoon:server.org\'Als u uw wachtwoord niet weet, gaat u terug om het opnieuw in te stellen.
- Als je een account aanmaakt op een thuisserver, gebruik dan je Matrix ID (bijv. @gebruiker:domein.nl) en wachtwoord hieronder.
+ Als je een account aanmaakt op een server, gebruik dan je Matrix ID (bijv. @persoon:domein.nl) en wachtwoord hieronder.Aanmelden met Matrix IDAanmelden met Matrix IDEr zijn te veel verzoeken verzonden. Je kunt het over %1$d seconde opnieuw proberen…Er zijn te veel verzoeken verzonden. Je kunt het over %1$d seconden opnieuw proberen…
- Deze thuisserver draait op een oude versie. Vraag uw thuisserver beheerder om te upgraden. U kunt doorgaan, maar sommige functies werken mogelijk niet correct.
+ Deze server draait op een oude versie. Vraag uw server beheerder om te upgraden. U kunt doorgaan, maar sommige functies werken mogelijk niet correct.De ingevoerde code is niet correct. Gelieve dit te controleren.We hebben zojuist een e-mail gestuurd naar %1$s.
\nKlik op de link die deze bevat om door te gaan met het aanmaken van een account.Controleer uw e-mailAccepteer de voorwaarden om door te gaanVoer de captcha uitdaging uit
- Selecteer een aangepaste thuisserver
+ Selecteer een aangepaste serverSelecteer Element Matrix ServicesUw account is nog niet aangemaakt.
\n
\nHet registratieproces stoppen\?
- Die gebruikersnaam is in gebruik
- Gebruikersnaam of e-mail
+ Deze inlognaam is in gebruik
+ Inlognaam of e-mailadresMeld u aan bij %1$sTelefoonnummer lijkt ongeldig. Controleer het alstublieftInternationale telefoonnummers moeten beginnen met \'+\'
@@ -2216,7 +2176,6 @@
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.Het upgraden van een kamer is een geavanceerde actie en wordt meestal aanbevolen wanneer een kamer onstabiel is vanwege bugs, ontbrekende functies of beveiligingsproblemen.
\nDit heeft meestal alleen invloed op hoe de kamer op de server wordt verwerkt.
-
Beheer kamersU bent de enige beheerder van deze kamer. Als u het verlaat, betekent dit dat niemand er controle over heeft.Deze alias is momenteel niet toegankelijk.
@@ -2229,7 +2188,7 @@
Contacten openenStuur stickerUpload bestand
- Afbeeldingen en video\'s verzenden
+ Afbeeldingen en video\'s versturenOpen cameraWeet u zeker dat u deze poll wilt verwijderen\? U kunt het niet meer herstellen nadat het is verwijderd.Poll verwijderen
@@ -2279,10 +2238,10 @@
Spraakbericht opnemenSorry, er is een fout opgetreden bij het proberen deel te nemen aan: %sUpgrade naar de aanbevolen kamerversie
- In deze kamer wordt versie %s gebruikt, die door deze thuisserver als onstabiel is gemarkeerd.
+ In deze kamer wordt versie %s gebruikt, die door deze server als onstabiel is gemarkeerd.U heeft toestemming nodig om een kamer te upgradenBovenliggende space automatisch bijwerken
- Gebruikers automatisch uitnodigen
+ Personen automatisch uitnodigenU update de kamer van %1$s naar %2$s.Upgrade privékamerUpgrade openbare kamer
@@ -2294,8 +2253,8 @@
Sommige kamers zijn mogelijk verborgen omdat ze privé zijn en u een uitnodiging nodig heeft.
\nU heeft geen rechten om kamers toe te voegen.Deze space heeft geen kamers
- Neem contact op met uw thuisserver beheerder voor meer informatie
- Het lijkt erop dat je thuisserver nog geen Spaces ondersteunt
+ Neem contact op met uw server beheerder voor meer informatie
+ Het lijkt erop dat je server nog geen Spaces ondersteuntExperimenteel voelen\?
\nU kunt bestaande spaces aan een space toevoegen.Alle kamers waarin u deelneemt, worden weergegeven in Home.
@@ -2319,9 +2278,9 @@
U kunt pas weer deelnemen als u opnieuw wordt uitgenodigd.U bent de enige persoon hier. Als u weggaat, kan niemand meer meedoen, ook u niet.Weet u zeker dat u %s wilt verlaten\?
- Verlaat Space
+ VerlaatKamers toevoegen
- Kamers verkennen
+ Kamers ontdekken%d persoon die u kent is al lid geworden%d mensen die u kent zijn al lid geworden
@@ -2336,10 +2295,10 @@
Voor nu overslaanZe zullen geen deel uitmaken van %sAlleen voor deze kamer
- Ze kunnen %s verkennen
+ Ze kunnen %s ontdekkenUitnodigen voor %sDeel link
- Uitnodigen via gebruikersnaam of e-mail
+ Uitnodigen via inlognaam of e-mailadresuitnodiging via e-mailHet is alleen u op dit moment. %s zal nog beter zijn met anderen.Uitnodigen voor %s
@@ -2360,10 +2319,10 @@
Ik en teamgenotenEen privé space om je kamers te organiserenAlleen ik
- Zorg ervoor dat de juiste mensen toegang hebben tot %s. U kunt dit later wijzigen.
+ 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 creëren\?
+ Wat voor soort space wilt u aanmaken\?Uw privé spaceUw openbare spaceSpace toevoegen
@@ -2371,7 +2330,7 @@
Openbare spaceNiet verzonden berichten verwijderenBerichten kunnen niet worden verzonden
- Wilt u het verzenden van een bericht annuleren\?
+ Wilt u het versturen van een bericht annuleren\?Alle mislukte berichten verwijderenUpgrade een kamer naar een nieuwe versieVerlaat kamer met gegeven id (of huidige kamer indien leeg)
@@ -2383,7 +2342,7 @@
Veilig berichtenverkeer.U heeft de controle.Deel locatie
- Gebruikerslocaties in de tijdlijn weergeven
+ Persoonslocaties in de tijdlijn weergevenEenmaal ingeschakeld, kun je je locatie naar elke kamer sturenLocatie delen inschakelenOpen met
@@ -2411,8 +2370,8 @@
Kies waar je gesprekken worden bewaard, zodat u controle en onafhankelijkheid heeft. Verbonden via Matrix.Veilige en onafhankelijke communicatie die u dezelfde mate van privacy geeft als een persoonlijk gesprek in uw eigen huis.Locatie
- De versleuteling is verkeerd geconfigureerd, zodat u geen berichten kunt verzenden. Klik om instellingen te openen.
- De versleuteling is verkeerd geconfigureerd, zodat u geen berichten kunt verzenden. Neem contact op met een beheerder om de versleuteling in een geldige staat te herstellen.
+ 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 bubbelsKan kaart niet ladenKaart
@@ -2446,4 +2405,56 @@
Kopieer link naar discussieBekijk in kamerDiscussies bekijken
+ Personen
+ De server accepteert geen inlognaam met alleen cijfers.
+ Kamer notificatie
+ Breng de hele kamer op de hoogte
+
+ %1$d meer
+ %1$d meer
+
+ Toon minder
+ Locatie delen is bezig
+ ${app_name} Live locatie
+ Stop
+ Live locatie ingeschakeld
+ Als u de Live-locatie wilt delen, heeft ${app_name} altijd locatietoegang nodig als de app op de achtergrond actief is.
+\nWe hebben alleen toegang tot uw locatie voor de duur die u kiest.
+ Toegang te verlenen
+ Deel deze locatie
+ Deel deze locatie
+ Live locatie delen
+ Live locatie delen
+ Deel mijn huidige locatie
+ Deel mijn huidige locatie
+ Zoom naar huidige locatie
+ Pin van geselecteerde locatie op kaart
+ Sla deze stap over
+ Opslaan en doorgaan
+ Je voorkeuren zijn opgeslagen.
+ Alles gereed!
+ Laten we beginnen
+ U kunt dit op elk moment wijzigen.
+ Voeg een profielfoto toe
+ U kunt dit later wijzigen
+ Weergavenaam
+ Dit wordt weergegeven wanneer u berichten verzendt.
+ Kies een weergavenaam
+ Uw account %s is aangemaakt.
+ Gefeliciteerd!
+ Breng me naar het begin
+ Personaliseer profiel
+ We komen dichter bij het uitbrengen van een openbare bèta voor Discussies.
+\n
+\nTerwijl we ons erop voorbereiden, moeten we enkele wijzigingen aanbrengen: discussies die vóór dit punt zijn gemaakt, worden weergegeven als gewone antwoorden.
+\n
+\nDit zal een eenmalige overgang zijn, aangezien Discussies nu deel uitmaken van de Matrix-specificatie.
+ Discussies die bèta naderen 🎉
+ %1$s, %2$s en anderen
+ %1$s en %2$s
+ Uitzetten
+
+ %d server ACL\'s veranderen
+ %d server ACL\'s wijzigingen
+
\ No newline at end of file
From 4131465ff6f1f89724401217c2d382fcb0779333 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=AD=D0=B4=D1=83=D0=B0=D1=80=D0=B4=20=D0=93=D0=B5=D1=80?=
=?UTF-8?q?=D0=B0?=
Date: Sun, 10 Apr 2022 11:42:08 +0000
Subject: [PATCH 055/198] Translated using Weblate (Hebrew)
Currently translated at 97.8% (2144 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/he/
---
vector/src/main/res/values-iw/strings.xml | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
index 2e1f521ff1..d4eb42a095 100644
--- a/vector/src/main/res/values-iw/strings.xml
+++ b/vector/src/main/res/values-iw/strings.xml
@@ -1952,8 +1952,8 @@
שיחה שלא נענתה
- "%d שיחות שלא נענו"
- "%d שיחות שלא נענו"
+ %d שיחות שלא נענו
+ %d שיחות שלא נענושיחה שלא נענתהצלצול שיחה…
@@ -2099,8 +2099,8 @@
שיחה פעילה ·%1$d שיחות פעילות ·
-
-
+ %1$d שיחות פעילות ·
+ %1$d שיחות פעילות ·שיחה פעילה (%1$s)אירעה שגיאה בחיפוש מספר הטלפון
@@ -2132,9 +2132,9 @@
%1$s ו %2$s%d שינוי ברשימות ACL בשרתים
-
-
-
+ %d שינוים ברשימות ACL בשרתים
+ %d שינוים ברשימות ACL בשרתים
+ %d שינוים ברשימות ACL בשרתיםנהל חדריםהחלט מי יכול לראות ולהצטרף לחדר זה.
From eb3f70474580e69699026517096d1f9695c29a7c Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Wed, 13 Apr 2022 12:42:21 +0200
Subject: [PATCH 056/198] Adds mkdirs to TemporaryFileCreator
---
.../matrix/android/sdk/internal/util/TemporaryFileCreator.kt | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt
index 2790ffba36..c2705916e0 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt
@@ -28,7 +28,10 @@ internal class TemporaryFileCreator @Inject constructor(
) {
suspend fun create(): File {
return withContext(Dispatchers.IO) {
- File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir)
+ runCatching {
+ File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir)
+ .apply { mkdirs() }
+ }.getOrThrow()
}
}
}
From 8b66034af510fe6a017587d7261d92e222ab3f69 Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Wed, 13 Apr 2022 15:16:34 +0200
Subject: [PATCH 057/198] Adds mkdirs fix to CameraPicker and CameraVideoPicker
---
.../im/vector/lib/multipicker/CameraPicker.kt | 20 ++-------
.../lib/multipicker/CameraVideoPicker.kt | 20 ++-------
.../lib/multipicker/utils/MediaFileUtils.kt | 45 +++++++++++++++++++
3 files changed, 53 insertions(+), 32 deletions(-)
create mode 100644 library/multipicker/src/main/java/im/vector/lib/multipicker/utils/MediaFileUtils.kt
diff --git a/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraPicker.kt b/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraPicker.kt
index b1442a56e1..4b10a7ceae 100644
--- a/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraPicker.kt
+++ b/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraPicker.kt
@@ -23,11 +23,9 @@ import android.provider.MediaStore
import androidx.activity.result.ActivityResultLauncher
import androidx.core.content.FileProvider
import im.vector.lib.multipicker.entity.MultiPickerImageType
+import im.vector.lib.multipicker.utils.MediaFileUtils.MediaType.IMAGE
+import im.vector.lib.multipicker.utils.MediaFileUtils.createTemporaryMediaFile
import im.vector.lib.multipicker.utils.toMultiPickerImageType
-import java.io.File
-import java.text.SimpleDateFormat
-import java.util.Date
-import java.util.Locale
/**
* Implementation of taking a photo with Camera
@@ -38,7 +36,7 @@ class CameraPicker {
* Start camera by using a ActivityResultLauncher
* @return Uri of taken photo or null if the operation is cancelled.
*/
- fun startWithExpectingFile(context: Context, activityResultLauncher: ActivityResultLauncher): Uri? {
+ fun startWithExpectingFile(context: Context, activityResultLauncher: ActivityResultLauncher): Uri {
val photoUri = createPhotoUri(context)
val intent = createIntent().apply {
putExtra(MediaStore.EXTRA_OUTPUT, photoUri)
@@ -63,19 +61,9 @@ class CameraPicker {
companion object {
fun createPhotoUri(context: Context): Uri {
- val file = createImageFile(context)
+ val file = createTemporaryMediaFile(context, IMAGE)
val authority = context.packageName + ".multipicker.fileprovider"
return FileProvider.getUriForFile(context, authority, file)
}
-
- private fun createImageFile(context: Context): File {
- val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
- val storageDir: File = context.filesDir
- return File.createTempFile(
- "${timeStamp}_", /* prefix */
- ".jpg", /* suffix */
- storageDir /* directory */
- )
- }
}
}
diff --git a/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraVideoPicker.kt b/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraVideoPicker.kt
index 76342b6e2e..2cf98e9638 100644
--- a/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraVideoPicker.kt
+++ b/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraVideoPicker.kt
@@ -23,11 +23,9 @@ import android.provider.MediaStore
import androidx.activity.result.ActivityResultLauncher
import androidx.core.content.FileProvider
import im.vector.lib.multipicker.entity.MultiPickerVideoType
+import im.vector.lib.multipicker.utils.MediaFileUtils.MediaType.VIDEO
+import im.vector.lib.multipicker.utils.MediaFileUtils.createTemporaryMediaFile
import im.vector.lib.multipicker.utils.toMultiPickerVideoType
-import java.io.File
-import java.text.SimpleDateFormat
-import java.util.Date
-import java.util.Locale
/**
* Implementation of taking a video with Camera
@@ -38,7 +36,7 @@ class CameraVideoPicker {
* Start camera by using a ActivityResultLauncher
* @return Uri of taken photo or null if the operation is cancelled.
*/
- fun startWithExpectingFile(context: Context, activityResultLauncher: ActivityResultLauncher): Uri? {
+ fun startWithExpectingFile(context: Context, activityResultLauncher: ActivityResultLauncher): Uri {
val videoUri = createVideoUri(context)
val intent = createIntent().apply {
putExtra(MediaStore.EXTRA_OUTPUT, videoUri)
@@ -63,19 +61,9 @@ class CameraVideoPicker {
companion object {
fun createVideoUri(context: Context): Uri {
- val file = createVideoFile(context)
+ val file = createTemporaryMediaFile(context, VIDEO)
val authority = context.packageName + ".multipicker.fileprovider"
return FileProvider.getUriForFile(context, authority, file)
}
-
- private fun createVideoFile(context: Context): File {
- val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
- val storageDir: File = context.filesDir
- return File.createTempFile(
- "${timeStamp}_", /* prefix */
- ".mp4", /* suffix */
- storageDir /* directory */
- )
- }
}
}
diff --git a/library/multipicker/src/main/java/im/vector/lib/multipicker/utils/MediaFileUtils.kt b/library/multipicker/src/main/java/im/vector/lib/multipicker/utils/MediaFileUtils.kt
new file mode 100644
index 0000000000..f1dbfbbb33
--- /dev/null
+++ b/library/multipicker/src/main/java/im/vector/lib/multipicker/utils/MediaFileUtils.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.lib.multipicker.utils
+
+import android.content.Context
+import java.io.File
+import java.text.SimpleDateFormat
+import java.util.Date
+import java.util.Locale
+
+object MediaFileUtils {
+
+ fun createTemporaryMediaFile(context: Context, mediaType: MediaType): File {
+ val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
+ val storageDir: File = context.filesDir.also { it.mkdirs() }
+ val fileSuffix = when (mediaType) {
+ MediaType.IMAGE -> ".jpg"
+ MediaType.VIDEO -> ".mp4"
+ }
+
+ return File.createTempFile(
+ "${timeStamp}_",
+ fileSuffix,
+ storageDir
+ )
+ }
+
+ enum class MediaType {
+ IMAGE, VIDEO
+ }
+}
From c98fe59965ba54d335c2e78d80c7481403351267 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Tue, 5 Apr 2022 16:34:32 +0100
Subject: [PATCH 058/198] formatting
---
.../onboarding/ftueauth/FtueAuthVariant.kt | 24 ++++++++++++-------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
index ea479b1cdc..a35014ca64 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
@@ -382,26 +382,34 @@ class FtueAuthVariant(
supportFragmentManager.popBackStack(FRAGMENT_REGISTRATION_STAGE_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)
when (stage) {
- is Stage.ReCaptcha -> activity.addFragmentToBackstack(views.loginFragmentContainer,
+ is Stage.ReCaptcha -> activity.addFragmentToBackstack(
+ views.loginFragmentContainer,
FtueAuthCaptchaFragment::class.java,
FtueAuthCaptchaFragmentArgument(stage.publicKey),
tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption)
- is Stage.Email -> activity.addFragmentToBackstack(views.loginFragmentContainer,
+ option = commonOption
+ )
+ is Stage.Email -> activity.addFragmentToBackstack(
+ views.loginFragmentContainer,
FtueAuthGenericTextInputFormFragment::class.java,
FtueAuthGenericTextInputFormFragmentArgument(TextInputFormFragmentMode.SetEmail, stage.mandatory),
tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption)
- is Stage.Msisdn -> activity.addFragmentToBackstack(views.loginFragmentContainer,
+ option = commonOption
+ )
+ is Stage.Msisdn -> activity.addFragmentToBackstack(
+ views.loginFragmentContainer,
FtueAuthGenericTextInputFormFragment::class.java,
FtueAuthGenericTextInputFormFragmentArgument(TextInputFormFragmentMode.SetMsisdn, stage.mandatory),
tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption)
- is Stage.Terms -> activity.addFragmentToBackstack(views.loginFragmentContainer,
+ option = commonOption
+ )
+ is Stage.Terms -> activity.addFragmentToBackstack(
+ views.loginFragmentContainer,
FtueAuthTermsFragment::class.java,
FtueAuthTermsFragmentArgument(stage.policies.toLocalizedLoginTerms(activity.getString(R.string.resources_language))),
tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption)
+ option = commonOption
+ )
else -> Unit // Should not happen
}
}
From 81a325b769f57f11c1d4678cbc115e9920fb0786 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 6 Apr 2022 09:49:01 +0100
Subject: [PATCH 059/198] extracting the captcha webview logic to a reusable
class
---
.../onboarding/ftueauth/CaptchaWebview.kt | 177 ++++++++++++++++++
.../ftueauth/FtueAuthCaptchaFragment.kt | 151 +--------------
2 files changed, 182 insertions(+), 146 deletions(-)
create mode 100644 vector/src/main/java/im/vector/app/features/onboarding/ftueauth/CaptchaWebview.kt
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
new file mode 100644
index 0000000000..52cec44a68
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/CaptchaWebview.kt
@@ -0,0 +1,177 @@
+/*
+ * 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.onboarding.ftueauth
+
+import android.annotation.SuppressLint
+import android.content.DialogInterface
+import android.graphics.Bitmap
+import android.net.http.SslError
+import android.os.Build
+import android.view.KeyEvent
+import android.view.View
+import android.webkit.SslErrorHandler
+import android.webkit.WebResourceRequest
+import android.webkit.WebResourceResponse
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import androidx.core.view.isVisible
+import androidx.fragment.app.Fragment
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import im.vector.app.R
+import im.vector.app.core.utils.AssetReader
+import im.vector.app.features.login.JavascriptResponse
+import im.vector.app.features.onboarding.OnboardingViewState
+import org.matrix.android.sdk.api.util.MatrixJsonParser
+import timber.log.Timber
+import java.net.URLDecoder
+import java.util.Formatter
+import javax.inject.Inject
+
+class CaptchaWebview @Inject constructor(
+ private val assetReader: AssetReader
+) {
+
+ @SuppressLint("SetJavaScriptEnabled")
+ fun setupWebView(
+ container: Fragment,
+ webView: WebView,
+ progressView: View,
+ siteKey: String,
+ state: OnboardingViewState,
+ onSuccess: (String) -> Unit
+ ) {
+ webView.settings.javaScriptEnabled = true
+
+ val reCaptchaPage = assetReader.readAssetFile("reCaptchaPage.html") ?: error("missing asset reCaptchaPage.html")
+
+ val html = Formatter().format(reCaptchaPage, siteKey).toString()
+ val mime = "text/html"
+ val encoding = "utf-8"
+
+ val homeServerUrl = state.selectedHomeserver.upstreamUrl ?: error("missing url of homeserver")
+ webView.loadDataWithBaseURL(homeServerUrl, html, mime, encoding, null)
+ webView.requestLayout()
+
+ webView.webViewClient = object : WebViewClient() {
+ override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
+ super.onPageStarted(view, url, favicon)
+
+ if (!container.isAdded) {
+ return
+ }
+
+ // Show loader
+ progressView.isVisible = true
+ }
+
+ override fun onPageFinished(view: WebView, url: String) {
+ super.onPageFinished(view, url)
+
+ if (!container.isAdded) {
+ return
+ }
+
+ // Hide loader
+ progressView.isVisible = false
+ }
+
+ override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) {
+ Timber.d("## onReceivedSslError() : ${error.certificate}")
+
+ if (!container.isAdded) {
+ return
+ }
+
+ MaterialAlertDialogBuilder(container.requireActivity())
+ .setMessage(R.string.ssl_could_not_verify)
+ .setPositiveButton(R.string.ssl_trust) { _, _ ->
+ Timber.d("## onReceivedSslError() : the user trusted")
+ handler.proceed()
+ }
+ .setNegativeButton(R.string.ssl_do_not_trust) { _, _ ->
+ Timber.d("## onReceivedSslError() : the user did not trust")
+ handler.cancel()
+ }
+ .setOnKeyListener(DialogInterface.OnKeyListener { dialog, keyCode, event ->
+ if (event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
+ handler.cancel()
+ Timber.d("## onReceivedSslError() : the user dismisses the trust dialog.")
+ dialog.dismiss()
+ return@OnKeyListener true
+ }
+ false
+ })
+ .setCancelable(false)
+ .show()
+ }
+
+ // common error message
+ private fun onError(errorMessage: String) {
+ Timber.e("## onError() : $errorMessage")
+
+ // TODO
+ // Toast.makeText(this@AccountCreationCaptchaActivity, errorMessage, Toast.LENGTH_LONG).show()
+
+ // on error case, close this activity
+ // runOnUiThread(Runnable { finish() })
+ }
+
+ @SuppressLint("NewApi")
+ override fun onReceivedHttpError(view: WebView, request: WebResourceRequest, errorResponse: WebResourceResponse) {
+ super.onReceivedHttpError(view, request, errorResponse)
+
+ if (request.url.toString().endsWith("favicon.ico")) {
+ // Ignore this error
+ return
+ }
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ onError(errorResponse.reasonPhrase)
+ } else {
+ onError(errorResponse.toString())
+ }
+ }
+
+ override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) {
+ @Suppress("DEPRECATION")
+ super.onReceivedError(view, errorCode, description, failingUrl)
+ onError(description)
+ }
+
+ override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
+ if (url?.startsWith("js:") == true) {
+ var json = url.substring(3)
+ var javascriptResponse: JavascriptResponse? = null
+
+ try {
+ // URL decode
+ json = URLDecoder.decode(json, "UTF-8")
+ javascriptResponse = MatrixJsonParser.getMoshi().adapter(JavascriptResponse::class.java).fromJson(json)
+ } catch (e: Exception) {
+ Timber.e(e, "## shouldOverrideUrlLoading(): failed")
+ }
+
+ val response = javascriptResponse?.response
+ if (javascriptResponse?.action == "verifyCallback" && response != null) {
+ onSuccess(response)
+ }
+ }
+ return true
+ }
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
index c8bec3776a..4c8dd8e932 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
@@ -16,35 +16,15 @@
package im.vector.app.features.onboarding.ftueauth
-import android.annotation.SuppressLint
-import android.content.DialogInterface
-import android.graphics.Bitmap
-import android.net.http.SslError
-import android.os.Build
import android.os.Parcelable
-import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.ViewGroup
-import android.webkit.SslErrorHandler
-import android.webkit.WebResourceRequest
-import android.webkit.WebResourceResponse
-import android.webkit.WebView
-import android.webkit.WebViewClient
-import androidx.core.view.isVisible
import com.airbnb.mvrx.args
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
-import im.vector.app.R
-import im.vector.app.core.utils.AssetReader
import im.vector.app.databinding.FragmentLoginCaptchaBinding
-import im.vector.app.features.login.JavascriptResponse
import im.vector.app.features.onboarding.OnboardingAction
import im.vector.app.features.onboarding.OnboardingViewState
import im.vector.app.features.onboarding.RegisterAction
import kotlinx.parcelize.Parcelize
-import org.matrix.android.sdk.api.util.MatrixJsonParser
-import timber.log.Timber
-import java.net.URLDecoder
-import java.util.Formatter
import javax.inject.Inject
@Parcelize
@@ -53,10 +33,10 @@ data class FtueAuthCaptchaFragmentArgument(
) : Parcelable
/**
- * In this screen, the user is asked to confirm he is not a robot
+ * In this screen, the user is asked to confirm they are not a robot
*/
class FtueAuthCaptchaFragment @Inject constructor(
- private val assetReader: AssetReader
+ private val captchaWebview: CaptchaWebview
) : AbstractFtueAuthFragment() {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginCaptchaBinding {
@@ -67,136 +47,15 @@ class FtueAuthCaptchaFragment @Inject constructor(
private var isWebViewLoaded = false
- @SuppressLint("SetJavaScriptEnabled")
- private fun setupWebView(state: OnboardingViewState) {
- views.loginCaptchaWevView.settings.javaScriptEnabled = true
-
- val reCaptchaPage = assetReader.readAssetFile("reCaptchaPage.html") ?: error("missing asset reCaptchaPage.html")
-
- val html = Formatter().format(reCaptchaPage, params.siteKey).toString()
- val mime = "text/html"
- val encoding = "utf-8"
-
- val homeServerUrl = state.selectedHomeserver.upstreamUrl ?: error("missing url of homeserver")
- views.loginCaptchaWevView.loadDataWithBaseURL(homeServerUrl, html, mime, encoding, null)
- views.loginCaptchaWevView.requestLayout()
-
- views.loginCaptchaWevView.webViewClient = object : WebViewClient() {
- override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
- super.onPageStarted(view, url, favicon)
-
- if (!isAdded) {
- return
- }
-
- // Show loader
- views.loginCaptchaProgress.isVisible = true
- }
-
- override fun onPageFinished(view: WebView, url: String) {
- super.onPageFinished(view, url)
-
- if (!isAdded) {
- return
- }
-
- // Hide loader
- views.loginCaptchaProgress.isVisible = false
- }
-
- override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) {
- Timber.d("## onReceivedSslError() : ${error.certificate}")
-
- if (!isAdded) {
- return
- }
-
- MaterialAlertDialogBuilder(requireActivity())
- .setMessage(R.string.ssl_could_not_verify)
- .setPositiveButton(R.string.ssl_trust) { _, _ ->
- Timber.d("## onReceivedSslError() : the user trusted")
- handler.proceed()
- }
- .setNegativeButton(R.string.ssl_do_not_trust) { _, _ ->
- Timber.d("## onReceivedSslError() : the user did not trust")
- handler.cancel()
- }
- .setOnKeyListener(DialogInterface.OnKeyListener { dialog, keyCode, event ->
- if (event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
- handler.cancel()
- Timber.d("## onReceivedSslError() : the user dismisses the trust dialog.")
- dialog.dismiss()
- return@OnKeyListener true
- }
- false
- })
- .setCancelable(false)
- .show()
- }
-
- // common error message
- private fun onError(errorMessage: String) {
- Timber.e("## onError() : $errorMessage")
-
- // TODO
- // Toast.makeText(this@AccountCreationCaptchaActivity, errorMessage, Toast.LENGTH_LONG).show()
-
- // on error case, close this activity
- // runOnUiThread(Runnable { finish() })
- }
-
- @SuppressLint("NewApi")
- override fun onReceivedHttpError(view: WebView, request: WebResourceRequest, errorResponse: WebResourceResponse) {
- super.onReceivedHttpError(view, request, errorResponse)
-
- if (request.url.toString().endsWith("favicon.ico")) {
- // Ignore this error
- return
- }
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- onError(errorResponse.reasonPhrase)
- } else {
- onError(errorResponse.toString())
- }
- }
-
- override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) {
- @Suppress("DEPRECATION")
- super.onReceivedError(view, errorCode, description, failingUrl)
- onError(description)
- }
-
- override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
- if (url?.startsWith("js:") == true) {
- var json = url.substring(3)
- var javascriptResponse: JavascriptResponse? = null
-
- try {
- // URL decode
- json = URLDecoder.decode(json, "UTF-8")
- javascriptResponse = MatrixJsonParser.getMoshi().adapter(JavascriptResponse::class.java).fromJson(json)
- } catch (e: Exception) {
- Timber.e(e, "## shouldOverrideUrlLoading(): failed")
- }
-
- val response = javascriptResponse?.response
- if (javascriptResponse?.action == "verifyCallback" && response != null) {
- viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.CaptchaDone(response)))
- }
- }
- return true
- }
- }
- }
-
override fun resetViewModel() {
viewModel.handle(OnboardingAction.ResetAuthenticationAttempt)
}
override fun updateWithState(state: OnboardingViewState) {
if (!isWebViewLoaded) {
- setupWebView(state)
+ captchaWebview.setupWebView(this, views.loginCaptchaWevView, views.loginCaptchaProgress, params.siteKey, state) {
+ viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.CaptchaDone(it)))
+ }
isWebViewLoaded = true
}
}
From 863b4b810f83da099cb450ab37e6b3c6ca4e199b Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 6 Apr 2022 09:59:25 +0100
Subject: [PATCH 060/198] duplicating the captcha fragment to style separately
for the combined register flow
---
.../im/vector/app/core/di/FragmentModule.kt | 6 ++
.../ftueauth/FtueAuthCaptchaFragment.kt | 22 +++----
.../FtueAuthCombinedRegisterFragment.kt | 8 +--
.../FtueAuthLegacyStyleCaptchaFragment.kt | 61 +++++++++++++++++++
.../onboarding/ftueauth/FtueAuthVariant.kt | 2 +-
...ml => fragment_ftue_combined_register.xml} | 0
.../layout/fragment_ftue_login_captcha.xml | 50 +++++++++++++++
7 files changed, 129 insertions(+), 20 deletions(-)
create mode 100644 vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLegacyStyleCaptchaFragment.kt
rename vector/src/main/res/layout/{fragment_ftue_sign_up_combined.xml => fragment_ftue_combined_register.xml} (100%)
create mode 100644 vector/src/main/res/layout/fragment_ftue_login_captcha.xml
diff --git a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
index 4dcfbe16f8..7a04a4c8b8 100644
--- a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
+++ b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
@@ -102,6 +102,7 @@ import im.vector.app.features.onboarding.ftueauth.FtueAuthCaptchaFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthChooseDisplayNameFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthChooseProfilePictureFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthGenericTextInputFormFragment
+import im.vector.app.features.onboarding.ftueauth.FtueAuthLegacyStyleCaptchaFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthLoginFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthPersonalizationCompleteFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthResetPasswordFragment
@@ -407,6 +408,11 @@ interface FragmentModule {
@FragmentKey(LoginWaitForEmailFragment2::class)
fun bindLoginWaitForEmailFragment2(fragment: LoginWaitForEmailFragment2): Fragment
+ @Binds
+ @IntoMap
+ @FragmentKey(FtueAuthLegacyStyleCaptchaFragment::class)
+ fun bindFtueAuthLegacyStyleCaptchaFragment(fragment: FtueAuthLegacyStyleCaptchaFragment): Fragment
+
@Binds
@IntoMap
@FragmentKey(FtueAuthCaptchaFragment::class)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
index 4c8dd8e932..e658c4948e 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022 New Vector Ltd
+ * 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.
@@ -16,37 +16,29 @@
package im.vector.app.features.onboarding.ftueauth
-import android.os.Parcelable
import android.view.LayoutInflater
import android.view.ViewGroup
import com.airbnb.mvrx.args
-import im.vector.app.databinding.FragmentLoginCaptchaBinding
+import im.vector.app.databinding.FragmentFtueLoginCaptchaBinding
import im.vector.app.features.onboarding.OnboardingAction
import im.vector.app.features.onboarding.OnboardingViewState
import im.vector.app.features.onboarding.RegisterAction
-import kotlinx.parcelize.Parcelize
import javax.inject.Inject
-@Parcelize
-data class FtueAuthCaptchaFragmentArgument(
- val siteKey: String
-) : Parcelable
-
/**
* In this screen, the user is asked to confirm they are not a robot
*/
class FtueAuthCaptchaFragment @Inject constructor(
private val captchaWebview: CaptchaWebview
-) : AbstractFtueAuthFragment() {
-
- override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginCaptchaBinding {
- return FragmentLoginCaptchaBinding.inflate(inflater, container, false)
- }
+) : AbstractFtueAuthFragment() {
private val params: FtueAuthCaptchaFragmentArgument by args()
-
private var isWebViewLoaded = false
+ override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFtueLoginCaptchaBinding {
+ return FragmentFtueLoginCaptchaBinding.inflate(inflater, container, false)
+ }
+
override fun resetViewModel() {
viewModel.handle(OnboardingAction.ResetAuthenticationAttempt)
}
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt
index 441fd64b0b..0755f18c8c 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt
@@ -37,7 +37,7 @@ import im.vector.app.core.extensions.hideKeyboard
import im.vector.app.core.extensions.hidePassword
import im.vector.app.core.extensions.realignPercentagesToParent
import im.vector.app.core.extensions.toReducedUrl
-import im.vector.app.databinding.FragmentFtueSignUpCombinedBinding
+import im.vector.app.databinding.FragmentFtueCombinedRegisterBinding
import im.vector.app.features.login.LoginMode
import im.vector.app.features.login.SSORedirectRouterActivity
import im.vector.app.features.login.SocialLoginButtonsView
@@ -56,10 +56,10 @@ import org.matrix.android.sdk.api.failure.isUsernameInUse
import org.matrix.android.sdk.api.failure.isWeakPassword
import javax.inject.Inject
-class FtueAuthCombinedRegisterFragment @Inject constructor() : AbstractSSOFtueAuthFragment() {
+class FtueAuthCombinedRegisterFragment @Inject constructor() : AbstractSSOFtueAuthFragment() {
- override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFtueSignUpCombinedBinding {
- return FragmentFtueSignUpCombinedBinding.inflate(inflater, container, false)
+ override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFtueCombinedRegisterBinding {
+ return FragmentFtueCombinedRegisterBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLegacyStyleCaptchaFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLegacyStyleCaptchaFragment.kt
new file mode 100644
index 0000000000..dc17ab1cb8
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLegacyStyleCaptchaFragment.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright 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.onboarding.ftueauth
+
+import android.os.Parcelable
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.airbnb.mvrx.args
+import im.vector.app.databinding.FragmentLoginCaptchaBinding
+import im.vector.app.features.onboarding.OnboardingAction
+import im.vector.app.features.onboarding.OnboardingViewState
+import im.vector.app.features.onboarding.RegisterAction
+import kotlinx.parcelize.Parcelize
+import javax.inject.Inject
+
+@Parcelize
+data class FtueAuthCaptchaFragmentArgument(
+ val siteKey: String
+) : Parcelable
+
+/**
+ * In this screen, the user is asked to confirm they are not a robot
+ */
+class FtueAuthLegacyStyleCaptchaFragment @Inject constructor(
+ private val captchaWebview: CaptchaWebview
+) : AbstractFtueAuthFragment() {
+
+ private val params: FtueAuthCaptchaFragmentArgument by args()
+ private var isWebViewLoaded = false
+
+ override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginCaptchaBinding {
+ return FragmentLoginCaptchaBinding.inflate(inflater, container, false)
+ }
+
+ override fun resetViewModel() {
+ viewModel.handle(OnboardingAction.ResetAuthenticationAttempt)
+ }
+
+ override fun updateWithState(state: OnboardingViewState) {
+ if (!isWebViewLoaded) {
+ captchaWebview.setupWebView(this, views.loginCaptchaWevView, views.loginCaptchaProgress, params.siteKey, state) {
+ viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.CaptchaDone(it)))
+ }
+ isWebViewLoaded = true
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
index a35014ca64..461975ed07 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
@@ -384,7 +384,7 @@ class FtueAuthVariant(
when (stage) {
is Stage.ReCaptcha -> activity.addFragmentToBackstack(
views.loginFragmentContainer,
- FtueAuthCaptchaFragment::class.java,
+ FtueAuthLegacyStyleCaptchaFragment::class.java,
FtueAuthCaptchaFragmentArgument(stage.publicKey),
tag = FRAGMENT_REGISTRATION_STAGE_TAG,
option = commonOption
diff --git a/vector/src/main/res/layout/fragment_ftue_sign_up_combined.xml b/vector/src/main/res/layout/fragment_ftue_combined_register.xml
similarity index 100%
rename from vector/src/main/res/layout/fragment_ftue_sign_up_combined.xml
rename to vector/src/main/res/layout/fragment_ftue_combined_register.xml
diff --git a/vector/src/main/res/layout/fragment_ftue_login_captcha.xml b/vector/src/main/res/layout/fragment_ftue_login_captcha.xml
new file mode 100644
index 0000000000..655bd98097
--- /dev/null
+++ b/vector/src/main/res/layout/fragment_ftue_login_captcha.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From f4747aa06911518779dd5b39934f3d7a37e6b5bd Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 6 Apr 2022 11:44:50 +0100
Subject: [PATCH 061/198] styling the captcha wth the update designs
---
.../ftueauth/FtueAuthCaptchaFragment.kt | 7 ++
.../FtueAuthLegacyStyleCaptchaFragment.kt | 4 +-
.../onboarding/ftueauth/FtueAuthVariant.kt | 27 ++--
.../layout/fragment_ftue_login_captcha.xml | 117 +++++++++++++-----
4 files changed, 117 insertions(+), 38 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
index e658c4948e..a3665a8f40 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCaptchaFragment.kt
@@ -16,6 +16,7 @@
package im.vector.app.features.onboarding.ftueauth
+import android.os.Parcelable
import android.view.LayoutInflater
import android.view.ViewGroup
import com.airbnb.mvrx.args
@@ -23,8 +24,14 @@ import im.vector.app.databinding.FragmentFtueLoginCaptchaBinding
import im.vector.app.features.onboarding.OnboardingAction
import im.vector.app.features.onboarding.OnboardingViewState
import im.vector.app.features.onboarding.RegisterAction
+import kotlinx.parcelize.Parcelize
import javax.inject.Inject
+@Parcelize
+data class FtueAuthCaptchaFragmentArgument(
+ val siteKey: String
+) : Parcelable
+
/**
* In this screen, the user is asked to confirm they are not a robot
*/
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLegacyStyleCaptchaFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLegacyStyleCaptchaFragment.kt
index dc17ab1cb8..2accab00e0 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLegacyStyleCaptchaFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLegacyStyleCaptchaFragment.kt
@@ -28,7 +28,7 @@ import kotlinx.parcelize.Parcelize
import javax.inject.Inject
@Parcelize
-data class FtueAuthCaptchaFragmentArgument(
+data class FtueAuthLegacyStyleCaptchaFragmentArgument(
val siteKey: String
) : Parcelable
@@ -39,7 +39,7 @@ class FtueAuthLegacyStyleCaptchaFragment @Inject constructor(
private val captchaWebview: CaptchaWebview
) : AbstractFtueAuthFragment() {
- private val params: FtueAuthCaptchaFragmentArgument by args()
+ private val params: FtueAuthLegacyStyleCaptchaFragmentArgument by args()
private var isWebViewLoaded = false
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginCaptchaBinding {
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
index 461975ed07..80343afa97 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
@@ -382,13 +382,7 @@ class FtueAuthVariant(
supportFragmentManager.popBackStack(FRAGMENT_REGISTRATION_STAGE_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)
when (stage) {
- is Stage.ReCaptcha -> activity.addFragmentToBackstack(
- views.loginFragmentContainer,
- FtueAuthLegacyStyleCaptchaFragment::class.java,
- FtueAuthCaptchaFragmentArgument(stage.publicKey),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption
- )
+ is Stage.ReCaptcha -> onCaptcha(stage)
is Stage.Email -> activity.addFragmentToBackstack(
views.loginFragmentContainer,
FtueAuthGenericTextInputFormFragment::class.java,
@@ -414,6 +408,25 @@ class FtueAuthVariant(
}
}
+ private fun onCaptcha(stage: Stage.ReCaptcha) {
+ when {
+ vectorFeatures.isOnboardingCombinedRegisterEnabled() -> activity.addFragmentToBackstack(
+ views.loginFragmentContainer,
+ FtueAuthCaptchaFragment::class.java,
+ FtueAuthCaptchaFragmentArgument(stage.publicKey),
+ tag = FRAGMENT_REGISTRATION_STAGE_TAG,
+ option = commonOption
+ )
+ else -> activity.addFragmentToBackstack(
+ views.loginFragmentContainer,
+ FtueAuthLegacyStyleCaptchaFragment::class.java,
+ FtueAuthLegacyStyleCaptchaFragmentArgument(stage.publicKey),
+ tag = FRAGMENT_REGISTRATION_STAGE_TAG,
+ option = commonOption
+ )
+ }
+ }
+
private fun onAccountSignedIn() {
navigateToHome(createdAccount = false)
}
diff --git a/vector/src/main/res/layout/fragment_ftue_login_captcha.xml b/vector/src/main/res/layout/fragment_ftue_login_captcha.xml
index 655bd98097..c07d03a64c 100644
--- a/vector/src/main/res/layout/fragment_ftue_login_captcha.xml
+++ b/vector/src/main/res/layout/fragment_ftue_login_captcha.xml
@@ -1,50 +1,109 @@
-
-
-
+ app:layout_constraintGuide_percent="@dimen/ftue_auth_gutter_start_percent" />
-
+
-
+
-
-
+
-
+
+
+
+
+
+
+
+
-
+
+
From 11dbd0e80cfbda80d118c4eb79ad3586befa1a10 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 6 Apr 2022 14:14:29 +0100
Subject: [PATCH 062/198] renaming the terms fragment in prep to duplicate with
the new style
---
.../src/main/java/im/vector/app/core/di/FragmentModule.kt | 6 +++---
.../app/features/onboarding/ftueauth/FtueAuthVariant.kt | 8 ++++----
...rmsFragment.kt => FtueAuthLegacyStyleTermsFragment.kt} | 6 +++---
3 files changed, 10 insertions(+), 10 deletions(-)
rename vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/{FtueAuthTermsFragment.kt => FtueAuthLegacyStyleTermsFragment.kt} (95%)
diff --git a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
index 7a04a4c8b8..91831fc56b 100644
--- a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
+++ b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
@@ -115,7 +115,7 @@ import im.vector.app.features.onboarding.ftueauth.FtueAuthSplashFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthUseCaseFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthWaitForEmailFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthWebFragment
-import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthTermsFragment
+import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthLegacyStyleTermsFragment
import im.vector.app.features.pin.PinFragment
import im.vector.app.features.poll.create.CreatePollFragment
import im.vector.app.features.qrcode.QrCodeScannerFragment
@@ -480,8 +480,8 @@ interface FragmentModule {
@Binds
@IntoMap
- @FragmentKey(FtueAuthTermsFragment::class)
- fun bindFtueAuthTermsFragment(fragment: FtueAuthTermsFragment): Fragment
+ @FragmentKey(FtueAuthLegacyStyleTermsFragment::class)
+ fun bindFtueAuthTermsFragment(fragment: FtueAuthLegacyStyleTermsFragment): Fragment
@Binds
@IntoMap
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
index 80343afa97..be6d30e5ce 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
@@ -51,8 +51,8 @@ import im.vector.app.features.onboarding.OnboardingVariant
import im.vector.app.features.onboarding.OnboardingViewEvents
import im.vector.app.features.onboarding.OnboardingViewModel
import im.vector.app.features.onboarding.OnboardingViewState
-import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthTermsFragment
-import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthTermsFragmentArgument
+import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthLegacyStyleTermsFragment
+import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthTermsLegacyStyleFragmentArgument
import org.matrix.android.sdk.api.auth.registration.FlowResult
import org.matrix.android.sdk.api.auth.registration.Stage
import org.matrix.android.sdk.api.extensions.tryOrNull
@@ -399,8 +399,8 @@ class FtueAuthVariant(
)
is Stage.Terms -> activity.addFragmentToBackstack(
views.loginFragmentContainer,
- FtueAuthTermsFragment::class.java,
- FtueAuthTermsFragmentArgument(stage.policies.toLocalizedLoginTerms(activity.getString(R.string.resources_language))),
+ FtueAuthLegacyStyleTermsFragment::class.java,
+ FtueAuthTermsLegacyStyleFragmentArgument(stage.policies.toLocalizedLoginTerms(activity.getString(R.string.resources_language))),
tag = FRAGMENT_REGISTRATION_STAGE_TAG,
option = commonOption
)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthLegacyStyleTermsFragment.kt
similarity index 95%
rename from vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
rename to vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthLegacyStyleTermsFragment.kt
index e5f0b0f167..f306289a5a 100755
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthLegacyStyleTermsFragment.kt
@@ -39,19 +39,19 @@ import org.matrix.android.sdk.api.auth.data.LocalizedFlowDataLoginTerms
import javax.inject.Inject
@Parcelize
-data class FtueAuthTermsFragmentArgument(
+data class FtueAuthTermsLegacyStyleFragmentArgument(
val localizedFlowDataLoginTerms: List
) : Parcelable
/**
* LoginTermsFragment displays the list of policies the user has to accept
*/
-class FtueAuthTermsFragment @Inject constructor(
+class FtueAuthLegacyStyleTermsFragment @Inject constructor(
private val policyController: PolicyController
) : AbstractFtueAuthFragment(),
PolicyController.PolicyControllerListener {
- private val params: FtueAuthTermsFragmentArgument by args()
+ private val params: FtueAuthTermsLegacyStyleFragmentArgument by args()
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentLoginTermsBinding {
return FragmentLoginTermsBinding.inflate(inflater, container, false)
From 06147967a4257d8d3b7bc4facbd66a71e8148673 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 6 Apr 2022 16:37:48 +0100
Subject: [PATCH 063/198] creating a ftue version of the policy fragment
---
.../im/vector/app/core/di/FragmentModule.kt | 8 +-
.../onboarding/ftueauth/FtueAuthVariant.kt | 18 ++-
.../ftueauth/terms/FtueAuthTermsFragment.kt | 120 +++++++++++++++++
.../res/layout/fragment_ftue_login_terms.xml | 121 ++++++++++++++++++
4 files changed, 264 insertions(+), 3 deletions(-)
create mode 100644 vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
create mode 100644 vector/src/main/res/layout/fragment_ftue_login_terms.xml
diff --git a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
index 91831fc56b..e3e64063f3 100644
--- a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
+++ b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
@@ -116,6 +116,7 @@ import im.vector.app.features.onboarding.ftueauth.FtueAuthUseCaseFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthWaitForEmailFragment
import im.vector.app.features.onboarding.ftueauth.FtueAuthWebFragment
import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthLegacyStyleTermsFragment
+import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthTermsFragment
import im.vector.app.features.pin.PinFragment
import im.vector.app.features.poll.create.CreatePollFragment
import im.vector.app.features.qrcode.QrCodeScannerFragment
@@ -481,7 +482,12 @@ interface FragmentModule {
@Binds
@IntoMap
@FragmentKey(FtueAuthLegacyStyleTermsFragment::class)
- fun bindFtueAuthTermsFragment(fragment: FtueAuthLegacyStyleTermsFragment): Fragment
+ fun bindFtueAuthLegacyStyleTermsFragment(fragment: FtueAuthLegacyStyleTermsFragment): Fragment
+
+ @Binds
+ @IntoMap
+ @FragmentKey(FtueAuthTermsFragment::class)
+ fun bindFtueAuthTermsFragment(fragment: FtueAuthTermsFragment): Fragment
@Binds
@IntoMap
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
index be6d30e5ce..c8f88280d6 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
@@ -52,6 +52,7 @@ import im.vector.app.features.onboarding.OnboardingViewEvents
import im.vector.app.features.onboarding.OnboardingViewModel
import im.vector.app.features.onboarding.OnboardingViewState
import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthLegacyStyleTermsFragment
+import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthTermsFragment
import im.vector.app.features.onboarding.ftueauth.terms.FtueAuthTermsLegacyStyleFragmentArgument
import org.matrix.android.sdk.api.auth.registration.FlowResult
import org.matrix.android.sdk.api.auth.registration.Stage
@@ -397,14 +398,27 @@ class FtueAuthVariant(
tag = FRAGMENT_REGISTRATION_STAGE_TAG,
option = commonOption
)
- is Stage.Terms -> activity.addFragmentToBackstack(
+ is Stage.Terms -> onTerms(stage)
+ else -> Unit // Should not happen
+ }
+ }
+
+ private fun onTerms(stage: Stage.Terms) {
+ when {
+ vectorFeatures.isOnboardingCombinedRegisterEnabled() -> activity.addFragmentToBackstack(
+ views.loginFragmentContainer,
+ FtueAuthTermsFragment::class.java,
+ FtueAuthTermsLegacyStyleFragmentArgument(stage.policies.toLocalizedLoginTerms(activity.getString(R.string.resources_language))),
+ tag = FRAGMENT_REGISTRATION_STAGE_TAG,
+ option = commonOption
+ )
+ else -> activity.addFragmentToBackstack(
views.loginFragmentContainer,
FtueAuthLegacyStyleTermsFragment::class.java,
FtueAuthTermsLegacyStyleFragmentArgument(stage.policies.toLocalizedLoginTerms(activity.getString(R.string.resources_language))),
tag = FRAGMENT_REGISTRATION_STAGE_TAG,
option = commonOption
)
- else -> Unit // Should not happen
}
}
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
new file mode 100644
index 0000000000..0ba84e32c8
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
@@ -0,0 +1,120 @@
+/*
+ * 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.onboarding.ftueauth.terms
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.airbnb.mvrx.args
+import im.vector.app.core.extensions.cleanup
+import im.vector.app.core.extensions.configureWith
+import im.vector.app.core.extensions.toReducedUrl
+import im.vector.app.core.utils.openUrlInChromeCustomTab
+import im.vector.app.databinding.FragmentFtueLoginTermsBinding
+import im.vector.app.features.login.terms.LocalizedFlowDataLoginTermsChecked
+import im.vector.app.features.login.terms.LoginTermsViewState
+import im.vector.app.features.login.terms.PolicyController
+import im.vector.app.features.onboarding.OnboardingAction
+import im.vector.app.features.onboarding.OnboardingViewState
+import im.vector.app.features.onboarding.RegisterAction
+import im.vector.app.features.onboarding.ftueauth.AbstractFtueAuthFragment
+import org.matrix.android.sdk.internal.auth.registration.LocalizedFlowDataLoginTerms
+import javax.inject.Inject
+
+/**
+ * LoginTermsFragment displays the list of policies the user has to accept
+ */
+class FtueAuthTermsFragment @Inject constructor(
+ private val policyController: PolicyController
+) : AbstractFtueAuthFragment(),
+ PolicyController.PolicyControllerListener {
+
+ private val params: FtueAuthTermsLegacyStyleFragmentArgument by args()
+
+ override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentFtueLoginTermsBinding {
+ return FragmentFtueLoginTermsBinding.inflate(inflater, container, false)
+ }
+
+ private var loginTermsViewState: LoginTermsViewState = LoginTermsViewState(emptyList())
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ setupViews()
+ views.loginTermsPolicyList.configureWith(policyController, hasFixedSize = false)
+ policyController.listener = this
+
+ val list = ArrayList()
+
+ params.localizedFlowDataLoginTerms
+ .forEach {
+ list.add(LocalizedFlowDataLoginTermsChecked(it))
+ }
+
+ loginTermsViewState = LoginTermsViewState(list)
+ }
+
+ private fun setupViews() {
+ views.displayNameSubmit.setOnClickListener { submit() }
+ views.loginTermsPolicyList.setHasFixedSize(false)
+ }
+
+ override fun onDestroyView() {
+ views.loginTermsPolicyList.cleanup()
+ policyController.listener = null
+ super.onDestroyView()
+ }
+
+ private fun renderState() {
+ policyController.setData(loginTermsViewState.localizedFlowDataLoginTermsChecked)
+
+ // Button is enabled only if all checkboxes are checked
+ views.displayNameSubmit.isEnabled = loginTermsViewState.allChecked()
+ }
+
+ override fun setChecked(localizedFlowDataLoginTerms: LocalizedFlowDataLoginTerms, isChecked: Boolean) {
+ if (isChecked) {
+ loginTermsViewState.check(localizedFlowDataLoginTerms)
+ } else {
+ loginTermsViewState.uncheck(localizedFlowDataLoginTerms)
+ }
+
+ renderState()
+ }
+
+ override fun openPolicy(localizedFlowDataLoginTerms: LocalizedFlowDataLoginTerms) {
+ localizedFlowDataLoginTerms.localizedUrl
+ ?.takeIf { it.isNotBlank() }
+ ?.let {
+ openUrlInChromeCustomTab(requireContext(), null, it)
+ }
+ }
+
+ private fun submit() {
+ viewModel.handle(OnboardingAction.PostRegisterAction(RegisterAction.AcceptTerms))
+ }
+
+ override fun updateWithState(state: OnboardingViewState) {
+ policyController.homeServer = state.selectedHomeserver.userFacingUrl.toReducedUrl()
+ renderState()
+ }
+
+ override fun resetViewModel() {
+ viewModel.handle(OnboardingAction.ResetAuthenticationAttempt)
+ }
+}
diff --git a/vector/src/main/res/layout/fragment_ftue_login_terms.xml b/vector/src/main/res/layout/fragment_ftue_login_terms.xml
new file mode 100644
index 0000000000..1a6de5e1ec
--- /dev/null
+++ b/vector/src/main/res/layout/fragment_ftue_login_terms.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From f45de34db4914496c2e131275d9afe644ad7e90c Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Fri, 8 Apr 2022 16:19:57 +0100
Subject: [PATCH 064/198] dynamically setting the terms item padding
---
.../app/features/login/terms/PolicyController.kt | 2 ++
.../app/features/login/terms/PolicyItem.kt | 9 +++++++++
.../ftueauth/terms/FtueAuthTermsFragment.kt | 16 ++++++++++------
.../src/main/res/layout/fragment_login_terms.xml | 2 ++
.../main/res/layout/fragment_login_terms_2.xml | 2 ++
vector/src/main/res/layout/item_policy.xml | 12 ++++--------
6 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/login/terms/PolicyController.kt b/vector/src/main/java/im/vector/app/features/login/terms/PolicyController.kt
index 405f7b09c5..42c39efdac 100644
--- a/vector/src/main/java/im/vector/app/features/login/terms/PolicyController.kt
+++ b/vector/src/main/java/im/vector/app/features/login/terms/PolicyController.kt
@@ -24,6 +24,7 @@ class PolicyController @Inject constructor() : TypedEpoxyController) {
@@ -32,6 +33,7 @@ class PolicyController @Inject constructor() : TypedEpoxyController() {
@EpoxyAttribute
var subtitle: String? = null
+ @EpoxyAttribute
+ var horizontalPadding: Int? = null
+
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var checkChangeListener: CompoundButton.OnCheckedChangeListener? = null
@@ -47,6 +50,12 @@ abstract class PolicyItem : EpoxyModelWithHolder() {
override fun bind(holder: Holder) {
super.bind(holder)
holder.let {
+ it.view.setPadding(
+ horizontalPadding ?: it.view.paddingLeft,
+ it.view.paddingTop,
+ horizontalPadding ?: it.view.paddingRight,
+ it.view.paddingBottom
+ )
it.checkbox.isChecked = checked
it.checkbox.setOnCheckedChangeListener(checkChangeListener)
it.title.text = title
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
index 0ba84e32c8..877a85126a 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
@@ -20,7 +20,10 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.doOnLayout
import com.airbnb.mvrx.args
+import im.vector.app.R
import im.vector.app.core.extensions.cleanup
import im.vector.app.core.extensions.configureWith
import im.vector.app.core.extensions.toReducedUrl
@@ -35,6 +38,7 @@ import im.vector.app.features.onboarding.RegisterAction
import im.vector.app.features.onboarding.ftueauth.AbstractFtueAuthFragment
import org.matrix.android.sdk.internal.auth.registration.LocalizedFlowDataLoginTerms
import javax.inject.Inject
+import kotlin.math.roundToInt
/**
* LoginTermsFragment displays the list of policies the user has to accept
@@ -54,24 +58,24 @@ class FtueAuthTermsFragment @Inject constructor(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
-
setupViews()
- views.loginTermsPolicyList.configureWith(policyController, hasFixedSize = false)
- policyController.listener = this
-
val list = ArrayList()
-
params.localizedFlowDataLoginTerms
.forEach {
list.add(LocalizedFlowDataLoginTermsChecked(it))
}
-
loginTermsViewState = LoginTermsViewState(list)
}
private fun setupViews() {
views.displayNameSubmit.setOnClickListener { submit() }
views.loginTermsPolicyList.setHasFixedSize(false)
+ views.loginTermsPolicyList.configureWith(policyController, hasFixedSize = false, dividerDrawable = R.drawable.divider_horizontal)
+ views.displayNameGutterStart.doOnLayout {
+ val gutterSize = views.contentRoot.width * (views.displayNameGutterStart.layoutParams as ConstraintLayout.LayoutParams).guidePercent
+ policyController.horizontalPadding = gutterSize.roundToInt()
+ }
+ policyController.listener = this
}
override fun onDestroyView() {
diff --git a/vector/src/main/res/layout/fragment_login_terms.xml b/vector/src/main/res/layout/fragment_login_terms.xml
index a0af01eda8..51facb0d81 100644
--- a/vector/src/main/res/layout/fragment_login_terms.xml
+++ b/vector/src/main/res/layout/fragment_login_terms.xml
@@ -48,6 +48,8 @@
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="16dp"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp"
app:layout_constraintBottom_toTopOf="@id/loginTermsSubmit"
app:layout_constraintTop_toBottomOf="@id/loginTermsNotice"
tools:listitem="@layout/item_policy" />
diff --git a/vector/src/main/res/layout/fragment_login_terms_2.xml b/vector/src/main/res/layout/fragment_login_terms_2.xml
index a64ec08184..18b7df3880 100644
--- a/vector/src/main/res/layout/fragment_login_terms_2.xml
+++ b/vector/src/main/res/layout/fragment_login_terms_2.xml
@@ -52,6 +52,8 @@
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="16dp"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp"
app:layout_constraintBottom_toTopOf="@id/loginTermsSubmit"
app:layout_constraintTop_toBottomOf="@id/loginTermsNotice"
tools:listitem="@layout/item_policy" />
diff --git a/vector/src/main/res/layout/item_policy.xml b/vector/src/main/res/layout/item_policy.xml
index 7f4a90b5d0..679a2d0a14 100644
--- a/vector/src/main/res/layout/item_policy.xml
+++ b/vector/src/main/res/layout/item_policy.xml
@@ -6,8 +6,6 @@
android:layout_height="wrap_content"
android:foreground="?attr/selectableItemBackground"
android:minHeight="72dp"
- android:paddingStart="16dp"
- android:paddingEnd="16dp"
tools:viewBindingIgnore="true">
\ No newline at end of file
From 059b2a5424c7766bcf3f7e88ac8043428206c134 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Fri, 8 Apr 2022 16:20:25 +0100
Subject: [PATCH 065/198] updating copy and spacing to match designs
---
.../src/main/res/layout/fragment_ftue_login_terms.xml | 10 +++++-----
vector/src/main/res/values/donottranslate.xml | 3 +++
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/vector/src/main/res/layout/fragment_ftue_login_terms.xml b/vector/src/main/res/layout/fragment_ftue_login_terms.xml
index 1a6de5e1ec..7101ba7546 100644
--- a/vector/src/main/res/layout/fragment_ftue_login_terms.xml
+++ b/vector/src/main/res/layout/fragment_ftue_login_terms.xml
@@ -59,7 +59,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
- android:text="Our privacy policy"
+ android:text="@string/ftue_auth_terms_title"
android:textColor="?vctr_content_primary"
app:layout_constraintBottom_toTopOf="@id/displayNameHeaderSubtitle"
app:layout_constraintEnd_toEndOf="@id/displayNameGutterEnd"
@@ -73,7 +73,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
- android:text="@string/auth_accept_policies"
+ android:text="@string/ftue_auth_terms_subtitle"
android:textColor="?vctr_content_secondary"
app:layout_constraintBottom_toTopOf="@id/titleContentSpacing"
app:layout_constraintEnd_toEndOf="@id/displayNameGutterEnd"
@@ -93,8 +93,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/entrySpacing"
- app:layout_constraintEnd_toEndOf="@id/displayNameGutterEnd"
- app:layout_constraintStart_toStartOf="@id/displayNameGutterStart"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/titleContentSpacing" />
Get in touch
+ Our privacy policy
+ Please read through T&C. You must accept in order to continue.
+
From 1f6068976da88f4009f680816de96fabdade4e12 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Fri, 8 Apr 2022 17:52:45 +0100
Subject: [PATCH 066/198] updating terms ids and applying design specified
colours to the checkbox
---
.../main/res/color/checkbox_tint_selector.xml | 5 +++
.../ftueauth/terms/FtueAuthTermsFragment.kt | 8 ++--
.../main/res/drawable/ic_privacy_policy.xml | 10 +++++
.../res/layout/fragment_ftue_login_terms.xml | 44 +++++++++----------
vector/src/main/res/layout/item_policy.xml | 5 ++-
5 files changed, 44 insertions(+), 28 deletions(-)
create mode 100644 library/ui-styles/src/main/res/color/checkbox_tint_selector.xml
create mode 100644 vector/src/main/res/drawable/ic_privacy_policy.xml
diff --git a/library/ui-styles/src/main/res/color/checkbox_tint_selector.xml b/library/ui-styles/src/main/res/color/checkbox_tint_selector.xml
new file mode 100644
index 0000000000..67e2e68570
--- /dev/null
+++ b/library/ui-styles/src/main/res/color/checkbox_tint_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
index 877a85126a..0c3c480cfe 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
@@ -68,11 +68,11 @@ class FtueAuthTermsFragment @Inject constructor(
}
private fun setupViews() {
- views.displayNameSubmit.setOnClickListener { submit() }
+ views.termsSubmit.setOnClickListener { submit() }
views.loginTermsPolicyList.setHasFixedSize(false)
views.loginTermsPolicyList.configureWith(policyController, hasFixedSize = false, dividerDrawable = R.drawable.divider_horizontal)
- views.displayNameGutterStart.doOnLayout {
- val gutterSize = views.contentRoot.width * (views.displayNameGutterStart.layoutParams as ConstraintLayout.LayoutParams).guidePercent
+ views.termsGutterStart.doOnLayout {
+ val gutterSize = views.contentRoot.width * (views.termsGutterStart.layoutParams as ConstraintLayout.LayoutParams).guidePercent
policyController.horizontalPadding = gutterSize.roundToInt()
}
policyController.listener = this
@@ -88,7 +88,7 @@ class FtueAuthTermsFragment @Inject constructor(
policyController.setData(loginTermsViewState.localizedFlowDataLoginTermsChecked)
// Button is enabled only if all checkboxes are checked
- views.displayNameSubmit.isEnabled = loginTermsViewState.allChecked()
+ views.termsSubmit.isEnabled = loginTermsViewState.allChecked()
}
override fun setChecked(localizedFlowDataLoginTerms: LocalizedFlowDataLoginTerms, isChecked: Boolean) {
diff --git a/vector/src/main/res/drawable/ic_privacy_policy.xml b/vector/src/main/res/drawable/ic_privacy_policy.xml
new file mode 100644
index 0000000000..08c63ba44b
--- /dev/null
+++ b/vector/src/main/res/drawable/ic_privacy_policy.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/vector/src/main/res/layout/fragment_ftue_login_terms.xml b/vector/src/main/res/layout/fragment_ftue_login_terms.xml
index 7101ba7546..c388b963d9 100644
--- a/vector/src/main/res/layout/fragment_ftue_login_terms.xml
+++ b/vector/src/main/res/layout/fragment_ftue_login_terms.xml
@@ -14,14 +14,14 @@
android:layout_height="wrap_content">
+ app:layout_constraintBottom_toTopOf="@id/termsHeaderSubtitle"
+ app:layout_constraintEnd_toEndOf="@id/termsGutterEnd"
+ app:layout_constraintStart_toStartOf="@id/termsGutterStart"
+ app:layout_constraintTop_toBottomOf="@id/termsHeaderIcon" />
+ app:layout_constraintEnd_toEndOf="@id/termsGutterEnd"
+ app:layout_constraintStart_toStartOf="@id/termsGutterStart"
+ app:layout_constraintTop_toBottomOf="@id/termsHeaderTitle" />
+ app:layout_constraintTop_toBottomOf="@id/termsHeaderSubtitle" />
diff --git a/vector/src/main/res/layout/item_policy.xml b/vector/src/main/res/layout/item_policy.xml
index 679a2d0a14..d60286101e 100644
--- a/vector/src/main/res/layout/item_policy.xml
+++ b/vector/src/main/res/layout/item_policy.xml
@@ -12,6 +12,7 @@
android:id="@+id/adapter_item_policy_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:buttonTint="@color/checkbox_tint_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -47,9 +48,9 @@
Date: Mon, 11 Apr 2022 09:24:23 +0100
Subject: [PATCH 067/198] extracting helper for setting horizontal padding
---
.../src/main/java/im/vector/app/core/extensions/View.kt | 9 +++++++++
.../im/vector/app/features/login/terms/PolicyItem.kt | 8 ++------
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/core/extensions/View.kt b/vector/src/main/java/im/vector/app/core/extensions/View.kt
index 7ec86d3508..8b30f9e015 100644
--- a/vector/src/main/java/im/vector/app/core/extensions/View.kt
+++ b/vector/src/main/java/im/vector/app/core/extensions/View.kt
@@ -32,3 +32,12 @@ fun View.showKeyboard(andRequestFocus: Boolean = false) {
val imm = context?.getSystemService()
imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
+
+fun View.setHorizontalPadding(padding: Int?) {
+ setPadding(
+ padding ?: paddingLeft,
+ paddingTop,
+ padding ?: paddingRight,
+ paddingBottom
+ )
+}
diff --git a/vector/src/main/java/im/vector/app/features/login/terms/PolicyItem.kt b/vector/src/main/java/im/vector/app/features/login/terms/PolicyItem.kt
index da1b68c976..a1cd64db40 100644
--- a/vector/src/main/java/im/vector/app/features/login/terms/PolicyItem.kt
+++ b/vector/src/main/java/im/vector/app/features/login/terms/PolicyItem.kt
@@ -26,6 +26,7 @@ import im.vector.app.R
import im.vector.app.core.epoxy.ClickListener
import im.vector.app.core.epoxy.VectorEpoxyHolder
import im.vector.app.core.epoxy.onClick
+import im.vector.app.core.extensions.setHorizontalPadding
@EpoxyModelClass(layout = R.layout.item_policy)
abstract class PolicyItem : EpoxyModelWithHolder() {
@@ -50,12 +51,7 @@ abstract class PolicyItem : EpoxyModelWithHolder() {
override fun bind(holder: Holder) {
super.bind(holder)
holder.let {
- it.view.setPadding(
- horizontalPadding ?: it.view.paddingLeft,
- it.view.paddingTop,
- horizontalPadding ?: it.view.paddingRight,
- it.view.paddingBottom
- )
+ it.view.setHorizontalPadding(horizontalPadding)
it.checkbox.isChecked = checked
it.checkbox.setOnCheckedChangeListener(checkChangeListener)
it.title.text = title
From 4e56136993a747046d8bbcbfb29b9f515b513156 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Mon, 11 Apr 2022 09:40:27 +0100
Subject: [PATCH 068/198] extracting common fragment behaviour to a function
---
.../onboarding/ftueauth/FtueAuthVariant.kt | 58 +++++++------------
1 file changed, 22 insertions(+), 36 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
index c8f88280d6..d5816762df 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt
@@ -17,6 +17,7 @@
package im.vector.app.features.onboarding.ftueauth
import android.content.Intent
+import android.os.Parcelable
import android.view.View
import android.view.ViewGroup
import androidx.core.view.ViewCompat
@@ -202,20 +203,18 @@ class FtueAuthVariant(
is OnboardingViewEvents.OnSendEmailSuccess -> {
// Pop the enter email Fragment
supportFragmentManager.popBackStack(FRAGMENT_REGISTRATION_STAGE_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)
- activity.addFragmentToBackstack(views.loginFragmentContainer,
+ addRegistrationStageFragmentToBackstack(
FtueAuthWaitForEmailFragment::class.java,
FtueAuthWaitForEmailFragmentArgument(viewEvents.email),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption)
+ )
}
is OnboardingViewEvents.OnSendMsisdnSuccess -> {
// Pop the enter Msisdn Fragment
supportFragmentManager.popBackStack(FRAGMENT_REGISTRATION_STAGE_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)
- activity.addFragmentToBackstack(views.loginFragmentContainer,
+ addRegistrationStageFragmentToBackstack(
FtueAuthGenericTextInputFormFragment::class.java,
FtueAuthGenericTextInputFormFragmentArgument(TextInputFormFragmentMode.ConfirmMsisdn, true, viewEvents.msisdn),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption)
+ )
}
is OnboardingViewEvents.Failure,
is OnboardingViewEvents.Loading ->
@@ -246,12 +245,7 @@ class FtueAuthVariant(
}
private fun openCombinedRegister() {
- activity.addFragmentToBackstack(
- views.loginFragmentContainer,
- FtueAuthCombinedRegisterFragment::class.java,
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption
- )
+ addRegistrationStageFragmentToBackstack(FtueAuthCombinedRegisterFragment::class.java)
}
private fun registrationShouldFallback(registrationFlowResult: OnboardingViewEvents.RegistrationFlowResult) =
@@ -384,19 +378,13 @@ class FtueAuthVariant(
when (stage) {
is Stage.ReCaptcha -> onCaptcha(stage)
- is Stage.Email -> activity.addFragmentToBackstack(
- views.loginFragmentContainer,
+ is Stage.Email -> addRegistrationStageFragmentToBackstack(
FtueAuthGenericTextInputFormFragment::class.java,
FtueAuthGenericTextInputFormFragmentArgument(TextInputFormFragmentMode.SetEmail, stage.mandatory),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption
)
- is Stage.Msisdn -> activity.addFragmentToBackstack(
- views.loginFragmentContainer,
+ is Stage.Msisdn -> addRegistrationStageFragmentToBackstack(
FtueAuthGenericTextInputFormFragment::class.java,
FtueAuthGenericTextInputFormFragmentArgument(TextInputFormFragmentMode.SetMsisdn, stage.mandatory),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption
)
is Stage.Terms -> onTerms(stage)
else -> Unit // Should not happen
@@ -405,38 +393,26 @@ class FtueAuthVariant(
private fun onTerms(stage: Stage.Terms) {
when {
- vectorFeatures.isOnboardingCombinedRegisterEnabled() -> activity.addFragmentToBackstack(
- views.loginFragmentContainer,
+ vectorFeatures.isOnboardingCombinedRegisterEnabled() -> addRegistrationStageFragmentToBackstack(
FtueAuthTermsFragment::class.java,
FtueAuthTermsLegacyStyleFragmentArgument(stage.policies.toLocalizedLoginTerms(activity.getString(R.string.resources_language))),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption
)
- else -> activity.addFragmentToBackstack(
- views.loginFragmentContainer,
+ else -> addRegistrationStageFragmentToBackstack(
FtueAuthLegacyStyleTermsFragment::class.java,
FtueAuthTermsLegacyStyleFragmentArgument(stage.policies.toLocalizedLoginTerms(activity.getString(R.string.resources_language))),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption
)
}
}
private fun onCaptcha(stage: Stage.ReCaptcha) {
when {
- vectorFeatures.isOnboardingCombinedRegisterEnabled() -> activity.addFragmentToBackstack(
- views.loginFragmentContainer,
+ vectorFeatures.isOnboardingCombinedRegisterEnabled() -> addRegistrationStageFragmentToBackstack(
FtueAuthCaptchaFragment::class.java,
FtueAuthCaptchaFragmentArgument(stage.publicKey),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption
)
- else -> activity.addFragmentToBackstack(
- views.loginFragmentContainer,
+ else -> addRegistrationStageFragmentToBackstack(
FtueAuthLegacyStyleCaptchaFragment::class.java,
FtueAuthLegacyStyleCaptchaFragmentArgument(stage.publicKey),
- tag = FRAGMENT_REGISTRATION_STAGE_TAG,
- option = commonOption
)
}
}
@@ -482,4 +458,14 @@ class FtueAuthVariant(
useCustomAnimation = true
)
}
+
+ private fun addRegistrationStageFragmentToBackstack(fragmentClass: Class, params: Parcelable? = null) {
+ activity.addFragmentToBackstack(
+ views.loginFragmentContainer,
+ fragmentClass,
+ params,
+ tag = FRAGMENT_REGISTRATION_STAGE_TAG,
+ option = commonOption
+ )
+ }
}
From f23d7f60b2bb9c5212fde2027e7243accd6570aa Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Mon, 11 Apr 2022 14:45:00 +0100
Subject: [PATCH 069/198] adding changelog entry
---
changelog.d/5279.wip | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5279.wip
diff --git a/changelog.d/5279.wip b/changelog.d/5279.wip
new file mode 100644
index 0000000000..0c08081cf9
--- /dev/null
+++ b/changelog.d/5279.wip
@@ -0,0 +1 @@
+Updates the Captcha and T&Cs registration screens in the FTUE flow to match the updated UI style
\ No newline at end of file
From 45f6633e49447ad6b1f0ccf8a639bf3291d4fae7 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 13 Apr 2022 10:19:46 +0100
Subject: [PATCH 070/198] cleaning up the captcha webview logic, extracting
function, removing redundant comments
---
.../onboarding/ftueauth/CaptchaWebview.kt | 91 ++++++++-----------
.../ftueauth/terms/FtueAuthTermsFragment.kt | 2 +-
2 files changed, 40 insertions(+), 53 deletions(-)
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 52cec44a68..4643fb97bb 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
@@ -73,8 +73,6 @@ class CaptchaWebview @Inject constructor(
if (!container.isAdded) {
return
}
-
- // Show loader
progressView.isVisible = true
}
@@ -84,66 +82,29 @@ class CaptchaWebview @Inject constructor(
if (!container.isAdded) {
return
}
-
- // Hide loader
progressView.isVisible = false
}
override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) {
Timber.d("## onReceivedSslError() : ${error.certificate}")
-
if (!container.isAdded) {
return
}
-
- MaterialAlertDialogBuilder(container.requireActivity())
- .setMessage(R.string.ssl_could_not_verify)
- .setPositiveButton(R.string.ssl_trust) { _, _ ->
- Timber.d("## onReceivedSslError() : the user trusted")
- handler.proceed()
- }
- .setNegativeButton(R.string.ssl_do_not_trust) { _, _ ->
- Timber.d("## onReceivedSslError() : the user did not trust")
- handler.cancel()
- }
- .setOnKeyListener(DialogInterface.OnKeyListener { dialog, keyCode, event ->
- if (event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
- handler.cancel()
- Timber.d("## onReceivedSslError() : the user dismisses the trust dialog.")
- dialog.dismiss()
- return@OnKeyListener true
- }
- false
- })
- .setCancelable(false)
- .show()
+ showSslErrorDialog(container, handler)
}
- // common error message
private fun onError(errorMessage: String) {
Timber.e("## onError() : $errorMessage")
-
- // TODO
- // Toast.makeText(this@AccountCreationCaptchaActivity, errorMessage, Toast.LENGTH_LONG).show()
-
- // on error case, close this activity
- // runOnUiThread(Runnable { finish() })
}
@SuppressLint("NewApi")
override fun onReceivedHttpError(view: WebView, request: WebResourceRequest, errorResponse: WebResourceResponse) {
super.onReceivedHttpError(view, request, errorResponse)
-
if (request.url.toString().endsWith("favicon.ico")) {
// Ignore this error
return
}
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- onError(errorResponse.reasonPhrase)
- } else {
- onError(errorResponse.toString())
- }
+ onError(errorResponse.toText())
}
override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) {
@@ -154,17 +115,7 @@ class CaptchaWebview @Inject constructor(
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
if (url?.startsWith("js:") == true) {
- var json = url.substring(3)
- var javascriptResponse: JavascriptResponse? = null
-
- try {
- // URL decode
- json = URLDecoder.decode(json, "UTF-8")
- javascriptResponse = MatrixJsonParser.getMoshi().adapter(JavascriptResponse::class.java).fromJson(json)
- } catch (e: Exception) {
- Timber.e(e, "## shouldOverrideUrlLoading(): failed")
- }
-
+ val javascriptResponse = parseJsonFromUrl(url)
val response = javascriptResponse?.response
if (javascriptResponse?.action == "verifyCallback" && response != null) {
onSuccess(response)
@@ -172,6 +123,42 @@ class CaptchaWebview @Inject constructor(
}
return true
}
+
+ private fun parseJsonFromUrl(url: String): JavascriptResponse? {
+ return try {
+ val json = URLDecoder.decode(url.substringAfter("js:"), "UTF-8")
+ MatrixJsonParser.getMoshi().adapter(JavascriptResponse::class.java).fromJson(json)
+ } catch (e: Exception) {
+ Timber.e(e, "## shouldOverrideUrlLoading(): failed")
+ null
+ }
+ }
}
}
+
+ private fun showSslErrorDialog(container: Fragment, handler: SslErrorHandler) {
+ MaterialAlertDialogBuilder(container.requireActivity())
+ .setMessage(R.string.ssl_could_not_verify)
+ .setPositiveButton(R.string.ssl_trust) { _, _ ->
+ Timber.d("## onReceivedSslError() : the user trusted")
+ handler.proceed()
+ }
+ .setNegativeButton(R.string.ssl_do_not_trust) { _, _ ->
+ Timber.d("## onReceivedSslError() : the user did not trust")
+ handler.cancel()
+ }
+ .setOnKeyListener(DialogInterface.OnKeyListener { dialog, keyCode, event ->
+ if (event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
+ handler.cancel()
+ Timber.d("## onReceivedSslError() : the user dismisses the trust dialog.")
+ dialog.dismiss()
+ return@OnKeyListener true
+ }
+ false
+ })
+ .setCancelable(false)
+ .show()
+ }
}
+
+private fun WebResourceResponse.toText() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) reasonPhrase else toString()
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
index 0c3c480cfe..4a25e35537 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthTermsFragment.kt
@@ -36,7 +36,7 @@ import im.vector.app.features.onboarding.OnboardingAction
import im.vector.app.features.onboarding.OnboardingViewState
import im.vector.app.features.onboarding.RegisterAction
import im.vector.app.features.onboarding.ftueauth.AbstractFtueAuthFragment
-import org.matrix.android.sdk.internal.auth.registration.LocalizedFlowDataLoginTerms
+import org.matrix.android.sdk.api.auth.data.LocalizedFlowDataLoginTerms
import javax.inject.Inject
import kotlin.math.roundToInt
From 1ba838a58de9242d204d9af9824f7006bf066316 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 13 Apr 2022 10:33:50 +0100
Subject: [PATCH 071/198] inverting quick returns and inlining logic since the
scope is small
---
.../onboarding/ftueauth/CaptchaWebview.kt | 26 ++++++++-----------
1 file changed, 11 insertions(+), 15 deletions(-)
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 4643fb97bb..558c26fe56 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
@@ -69,28 +69,23 @@ class CaptchaWebview @Inject constructor(
webView.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
-
- if (!container.isAdded) {
- return
+ if (container.isAdded) {
+ progressView.isVisible = true
}
- progressView.isVisible = true
}
override fun onPageFinished(view: WebView, url: String) {
super.onPageFinished(view, url)
-
- if (!container.isAdded) {
- return
+ if (container.isAdded) {
+ progressView.isVisible = false
}
- progressView.isVisible = false
}
override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) {
Timber.d("## onReceivedSslError() : ${error.certificate}")
- if (!container.isAdded) {
- return
+ if (container.isAdded) {
+ showSslErrorDialog(container, handler)
}
- showSslErrorDialog(container, handler)
}
private fun onError(errorMessage: String) {
@@ -100,11 +95,12 @@ class CaptchaWebview @Inject constructor(
@SuppressLint("NewApi")
override fun onReceivedHttpError(view: WebView, request: WebResourceRequest, errorResponse: WebResourceResponse) {
super.onReceivedHttpError(view, request, errorResponse)
- if (request.url.toString().endsWith("favicon.ico")) {
- // Ignore this error
- return
+ when {
+ request.url.toString().endsWith("favicon.ico") -> {
+ // ignore favicon errors
+ }
+ else -> onError(errorResponse.toText())
}
- onError(errorResponse.toText())
}
override fun onReceivedError(view: WebView, errorCode: Int, description: String, failingUrl: String) {
From 77da82c3105c1b1adf98bd39325e94b4d52eb5c6 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 13 Apr 2022 10:48:22 +0100
Subject: [PATCH 072/198] removing confusing comment questions and fixing xml
formatting
---
.../ftueauth/terms/FtueAuthLegacyStyleTermsFragment.kt | 2 --
vector/src/main/res/layout/fragment_ftue_login_captcha.xml | 3 ---
vector/src/main/res/layout/fragment_login_captcha.xml | 1 -
vector/src/main/res/layout/item_policy.xml | 2 +-
4 files changed, 1 insertion(+), 7 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthLegacyStyleTermsFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthLegacyStyleTermsFragment.kt
index f306289a5a..727e3d5cbd 100755
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthLegacyStyleTermsFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/terms/FtueAuthLegacyStyleTermsFragment.kt
@@ -88,8 +88,6 @@ class FtueAuthLegacyStyleTermsFragment @Inject constructor(
private fun renderState() {
policyController.setData(loginTermsViewState.localizedFlowDataLoginTermsChecked)
-
- // Button is enabled only if all checkboxes are checked
views.loginTermsSubmit.isEnabled = loginTermsViewState.allChecked()
}
diff --git a/vector/src/main/res/layout/fragment_ftue_login_captcha.xml b/vector/src/main/res/layout/fragment_ftue_login_captcha.xml
index c07d03a64c..d07e8e2b97 100644
--- a/vector/src/main/res/layout/fragment_ftue_login_captcha.xml
+++ b/vector/src/main/res/layout/fragment_ftue_login_captcha.xml
@@ -82,7 +82,6 @@
app:layout_constraintHeight_percent="0.03"
app:layout_constraintTop_toBottomOf="@id/captchaHeaderSubtitle" />
-
-
-
diff --git a/vector/src/main/res/layout/fragment_login_captcha.xml b/vector/src/main/res/layout/fragment_login_captcha.xml
index 655bd98097..d7e5e17aa0 100644
--- a/vector/src/main/res/layout/fragment_login_captcha.xml
+++ b/vector/src/main/res/layout/fragment_login_captcha.xml
@@ -29,7 +29,6 @@
android:text="@string/auth_recaptcha_message"
android:textColor="?vctr_content_secondary" />
-
-
\ No newline at end of file
+
From 4ee733297322aa5737cc6dc7e85f829397749343 Mon Sep 17 00:00:00 2001
From: Onuray Sahin
Date: Wed, 13 Apr 2022 16:59:42 +0300
Subject: [PATCH 073/198] Update beacon info state event by setting live as
false.
---
.../api/session/room/state/StateService.kt | 6 +++++
.../session/room/state/DefaultStateService.kt | 24 +++++++++++++++++++
2 files changed, 30 insertions(+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
index e9b0e4f676..9d03b5d941 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
@@ -66,6 +66,12 @@ interface StateService {
*/
suspend fun deleteAvatar()
+ /**
+ * Stops sharing live location in the room
+ * @param beaconInfoStateEvent Initial beacon info state event
+ */
+ suspend fun stopLiveLocation(beaconInfoStateEvent: Event)
+
/**
* Send a state event to the room
* @param eventType The type of event to send.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
index 417417f439..f9976a1559 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
@@ -25,12 +25,15 @@ import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toContent
+import org.matrix.android.sdk.api.session.events.model.toModel
import org.matrix.android.sdk.api.session.room.model.GuestAccess
import org.matrix.android.sdk.api.session.room.model.RoomCanonicalAliasContent
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
+import org.matrix.android.sdk.api.session.room.model.livelocation.BeaconInfo
+import org.matrix.android.sdk.api.session.room.model.livelocation.LiveLocationBeaconContent
import org.matrix.android.sdk.api.session.room.state.StateService
import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.api.util.MimeTypes
@@ -186,4 +189,25 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private
}
updateJoinRule(RoomJoinRules.RESTRICTED, null, allowEntries)
}
+
+ override suspend fun stopLiveLocation(beaconInfoStateEvent: Event) {
+ beaconInfoStateEvent.getClearContent()?.toModel()?.let { content ->
+ val beaconContent = LiveLocationBeaconContent(
+ unstableBeaconInfo = BeaconInfo(
+ description = content.getBestBeaconInfo()?.description,
+ timeout = content.getBestBeaconInfo()?.timeout,
+ isLive = false,
+ ),
+ unstableTimestampAsMilliseconds = System.currentTimeMillis()
+ ).toContent()
+
+ beaconInfoStateEvent.stateKey?.let {
+ sendStateEvent(
+ eventType = EventType.STATE_ROOM_BEACON_INFO.first(),
+ body = beaconContent,
+ stateKey = it
+ )
+ }
+ }
+ }
}
From 33e735cbdd1c421484a75b8dc476f1dfbb8b6822 Mon Sep 17 00:00:00 2001
From: Onuray Sahin
Date: Wed, 13 Apr 2022 17:00:37 +0300
Subject: [PATCH 074/198] Stop live location sharing.
---
.../home/room/detail/RoomDetailAction.kt | 3 +++
.../home/room/detail/TimelineFragment.kt | 7 +++++++
.../home/room/detail/TimelineViewModel.kt | 18 ++++++++++++++++++
.../location/LocationSharingService.kt | 2 +-
.../LocationSharingServiceConnection.kt | 6 ++++++
5 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt
index d10b363519..f6ea8b76ef 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt
@@ -111,4 +111,7 @@ sealed class RoomDetailAction : VectorViewModelAction {
// Poll
data class EndPoll(val eventId: String) : RoomDetailAction()
+
+ // Live Location
+ object StopLiveLocationSharing : RoomDetailAction()
}
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 8a90295967..226221d42c 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
@@ -385,6 +385,7 @@ class TimelineFragment @Inject constructor(
setupEmojiButton()
setupRemoveJitsiWidgetView()
setupVoiceMessageView()
+ setupLiveLocationIndicator()
views.includeRoomToolbar.roomToolbarContentView.debouncedClicks {
navigator.openRoomProfile(requireActivity(), timelineArgs.roomId)
@@ -810,6 +811,12 @@ class TimelineFragment @Inject constructor(
}
}
+ private fun setupLiveLocationIndicator() {
+ views.locationLiveStatusIndicator.stopButton.debouncedClicks {
+ timelineViewModel.handle(RoomDetailAction.StopLiveLocationSharing)
+ }
+ }
+
private fun joinJitsiRoom(jitsiWidget: Widget, enableVideo: Boolean) {
navigator.openRoomWidget(requireContext(), timelineArgs.roomId, jitsiWidget, mapOf(JitsiCallViewModel.ENABLE_VIDEO_OPTION to enableVideo))
}
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 755df16c1e..a07afaa74b 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
@@ -444,6 +444,7 @@ class TimelineViewModel @AssistedInject constructor(
_viewEvents.post(RoomDetailViewEvents.OpenRoom(action.replacementRoomId, closeCurrentRoom = true))
}
is RoomDetailAction.EndPoll -> handleEndPoll(action.eventId)
+ RoomDetailAction.StopLiveLocationSharing -> handleStopLiveLocationSharing()
}
}
@@ -1093,6 +1094,23 @@ class TimelineViewModel @AssistedInject constructor(
}
}
+ private fun handleStopLiveLocationSharing() {
+ viewModelScope.launch {
+ EventType
+ .STATE_ROOM_BEACON_INFO
+ .mapNotNull {
+ room.getStateEvent(it, QueryStringValue.Equals(session.myUserId))
+ }
+ .firstOrNull()
+ ?.let { beaconInfoEvent ->
+ room.stopLiveLocation(beaconInfoEvent)
+ }
+ ?.also {
+ locationSharingServiceConnection.stopLiveLocationSharing(room.roomId)
+ }
+ }
+ }
+
private fun observeRoomSummary() {
room.flow().liveRoomSummary()
.unwrap()
diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
index 85679e34a7..3256844bba 100644
--- a/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
+++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
@@ -129,7 +129,7 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
}
}
- private fun stopSharingLocation(roomId: String) {
+ fun stopSharingLocation(roomId: String) {
Timber.i("### LocationSharingService.stopSharingLocation for $roomId")
synchronized(roomArgsList) {
roomArgsList.removeAll { it.roomId == roomId }
diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
index 9af6b1539a..6c1b72960d 100644
--- a/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
+++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
@@ -34,6 +34,7 @@ class LocationSharingServiceConnection @Inject constructor(
private var callback: Callback? = null
private var isBound = false
+ private var locationSharingService: LocationSharingService? = null
fun bind(callback: Callback) {
this.callback = callback
@@ -51,7 +52,12 @@ class LocationSharingServiceConnection @Inject constructor(
callback = null
}
+ fun stopLiveLocationSharing(roomId: String) {
+ locationSharingService?.stopSharingLocation(roomId)
+ }
+
override fun onServiceConnected(className: ComponentName, binder: IBinder) {
+ locationSharingService = (binder as LocationSharingService.LocalBinder).getService()
isBound = true
callback?.onLocationServiceRunning()
}
From daaca4e46a2f938113f4d2678053f33256b84384 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olive=CC=81r=20Falvai?=
Date: Wed, 13 Apr 2022 17:24:26 +0200
Subject: [PATCH 075/198] Fix sorting of uploads in encrypted rooms
---
.../android/sdk/internal/session/room/uploads/GetUploadsTask.kt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/uploads/GetUploadsTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/uploads/GetUploadsTask.kt
index 028c3e9193..7daf506c14 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/uploads/GetUploadsTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/uploads/GetUploadsTask.kt
@@ -17,6 +17,7 @@
package org.matrix.android.sdk.internal.session.room.uploads
import com.zhuinden.monarchy.Monarchy
+import io.realm.Sort
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toModel
@@ -75,6 +76,7 @@ internal class DefaultGetUploadsTask @Inject constructor(
monarchy.doWithRealm { realm ->
eventsFromRealm = EventEntity.whereType(realm, EventType.ENCRYPTED, params.roomId)
.like(EventEntityFields.DECRYPTION_RESULT_JSON, TimelineEventFilter.DecryptedContent.URL)
+ .sort(EventEntityFields.ORIGIN_SERVER_TS, Sort.DESCENDING)
.findAll()
.map { it.asDomain() }
// Exclude stickers
From 3f735e43465818e3ebc65db29572ef99d87a5c89 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Olive=CC=81r=20Falvai?=
Date: Wed, 13 Apr 2022 17:40:41 +0200
Subject: [PATCH 076/198] Add changelog info
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Olivér Falvai
---
changelog.d/5757.bugfix | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5757.bugfix
diff --git a/changelog.d/5757.bugfix b/changelog.d/5757.bugfix
new file mode 100644
index 0000000000..089cc23b4c
--- /dev/null
+++ b/changelog.d/5757.bugfix
@@ -0,0 +1 @@
+Fix sorting of uploads in encrypted rooms
\ No newline at end of file
From 36ad59dc0f863d2c90c7bcd965a84e31d2b5f488 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 13 Apr 2022 16:52:12 +0100
Subject: [PATCH 077/198] handling server urls as texturis to avoid auto
spacing and applying errors to the input field error section
---
.../FtueAuthCombinedServerSelectionFragment.kt | 18 ++++++++++++++++++
...fragment_ftue_server_selection_combined.xml | 2 +-
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt
index d1560d7be0..97e2db2123 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt
@@ -21,6 +21,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
+import androidx.lifecycle.lifecycleScope
import im.vector.app.R
import im.vector.app.core.extensions.content
import im.vector.app.core.extensions.editText
@@ -33,6 +34,11 @@ import im.vector.app.databinding.FragmentFtueServerSelectionCombinedBinding
import im.vector.app.features.onboarding.OnboardingAction
import im.vector.app.features.onboarding.OnboardingViewEvents
import im.vector.app.features.onboarding.OnboardingViewState
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.onEach
+import org.matrix.android.sdk.api.failure.Failure
+import reactivecircus.flowbinding.android.widget.textChanges
+import java.net.UnknownHostException
import javax.inject.Inject
class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractFtueAuthFragment() {
@@ -61,6 +67,9 @@ class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractFt
}
views.chooseServerGetInTouch.debouncedClicks { openUrlInExternalBrowser(requireContext(), getString(R.string.ftue_ems_url)) }
views.chooseServerSubmit.debouncedClicks { updateServerUrl() }
+ views.chooseServerInput.editText().textChanges()
+ .onEach { views.chooseServerInput.error = null }
+ .launchIn(lifecycleScope)
}
private fun updateServerUrl() {
@@ -78,5 +87,14 @@ class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractFt
}
}
+ override fun onError(throwable: Throwable) {
+ views.chooseServerInput.error = if (throwable is Failure.NetworkConnection &&
+ throwable.ioException is UnknownHostException) {
+ getString(R.string.login_error_homeserver_not_found)
+ } else {
+ errorFormatter.toHumanReadable(throwable)
+ }
+ }
+
private fun String.toReducedUrlKeepingSchemaIfInsecure() = toReducedUrl(keepSchema = this.startsWith("http://"))
}
diff --git a/vector/src/main/res/layout/fragment_ftue_server_selection_combined.xml b/vector/src/main/res/layout/fragment_ftue_server_selection_combined.xml
index 8f4902a577..5a60632e86 100644
--- a/vector/src/main/res/layout/fragment_ftue_server_selection_combined.xml
+++ b/vector/src/main/res/layout/fragment_ftue_server_selection_combined.xml
@@ -106,7 +106,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:imeOptions="actionDone"
- android:inputType="text"
+ android:inputType="textUri"
android:maxLines="1" />
From c7065fc123d956fdde4782681e4fdd56e50e301e Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 13 Apr 2022 16:54:16 +0100
Subject: [PATCH 078/198] splitting the success action from the
handleRegisterAction, allowing the homeserver editing to start the
registation flow
---
.../onboarding/OnboardingViewModel.kt | 119 ++++++++++--------
1 file changed, 67 insertions(+), 52 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index 54aea0185c..e5bbf39127 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -147,7 +147,7 @@ class OnboardingViewModel @AssistedInject constructor(
is OnboardingAction.WebLoginSuccess -> handleWebLoginSuccess(action)
is OnboardingAction.ResetPassword -> handleResetPassword(action)
is OnboardingAction.ResetPasswordMailConfirmed -> handleResetPasswordMailConfirmed()
- is OnboardingAction.PostRegisterAction -> handleRegisterAction(action.registerAction)
+ is OnboardingAction.PostRegisterAction -> handleRegisterAction(action.registerAction, ::emitFlowResultViewEvent)
is OnboardingAction.ResetAction -> handleResetAction(action)
is OnboardingAction.UserAcceptCertificate -> handleUserAcceptCertificate(action)
OnboardingAction.ClearHomeServerHistory -> handleClearHomeServerHistory()
@@ -211,7 +211,7 @@ class OnboardingViewModel @AssistedInject constructor(
?.let { it.copy(allowedFingerprints = it.allowedFingerprints + action.fingerprint) }
?.let { startAuthenticationFlow(it) }
}
- is OnboardingAction.LoginOrRegister ->
+ is OnboardingAction.LoginOrRegister ->
handleDirectLogin(
finalLastAction,
HomeServerConnectionConfig.Builder()
@@ -220,7 +220,7 @@ class OnboardingViewModel @AssistedInject constructor(
.withAllowedFingerPrints(listOf(action.fingerprint))
.build()
)
- else -> Unit
+ else -> Unit
}
}
@@ -255,11 +255,12 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
- private fun handleRegisterAction(action: RegisterAction) {
+ private fun handleRegisterAction(action: RegisterAction, onNextRegistrationStepAction: (FlowResult) -> Unit) {
currentJob = viewModelScope.launch {
if (action.hasLoadingState()) {
setState { copy(isLoading = true) }
}
+
runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) }
.fold(
onSuccess = {
@@ -269,7 +270,7 @@ class OnboardingViewModel @AssistedInject constructor(
}
else -> when (it) {
is RegistrationResult.Success -> onSessionCreated(it.session, isAccountCreated = true)
- is RegistrationResult.FlowResponse -> onFlowResponse(it.flowResult)
+ is RegistrationResult.FlowResponse -> onFlowResponse(it.flowResult, onNextRegistrationStepAction)
}
}
},
@@ -283,13 +284,20 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
+ private fun emitFlowResultViewEvent(flowResult: FlowResult) {
+ _viewEvents.post(OnboardingViewEvents.RegistrationFlowResult(flowResult, isRegistrationStarted))
+ }
+
private fun handleRegisterWith(action: OnboardingAction.Register) {
reAuthHelper.data = action.password
- handleRegisterAction(RegisterAction.CreateAccount(
- action.username,
- action.password,
- action.initialDeviceName
- ))
+ handleRegisterAction(
+ RegisterAction.CreateAccount(
+ action.username,
+ action.password,
+ action.initialDeviceName
+ ),
+ ::emitFlowResultViewEvent
+ )
}
private fun handleResetAction(action: OnboardingAction.ResetAction) {
@@ -344,7 +352,7 @@ class OnboardingViewModel @AssistedInject constructor(
}
when (action.signMode) {
- SignMode.SignUp -> handleRegisterAction(RegisterAction.StartRegistration)
+ SignMode.SignUp -> handleRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
SignMode.SignIn -> startAuthenticationFlow()
SignMode.SignInWithMatrixId -> _viewEvents.post(OnboardingViewEvents.OnSignModeSelected(SignMode.SignInWithMatrixId))
SignMode.Unknown -> Unit
@@ -509,18 +517,17 @@ class OnboardingViewModel @AssistedInject constructor(
_viewEvents.post(OnboardingViewEvents.OnSignModeSelected(SignMode.SignIn))
}
- private fun onFlowResponse(flowResult: FlowResult) {
+ private fun onFlowResponse(flowResult: FlowResult, onNextRegistrationStepAction: (FlowResult) -> Unit) {
// If dummy stage is mandatory, and password is already sent, do the dummy stage now
if (isRegistrationStarted && flowResult.missingStages.any { it is Stage.Dummy && it.mandatory }) {
- handleRegisterDummy()
+ handleRegisterDummy(onNextRegistrationStepAction)
} else {
- // Notify the user
- _viewEvents.post(OnboardingViewEvents.RegistrationFlowResult(flowResult, isRegistrationStarted))
+ onNextRegistrationStepAction(flowResult)
}
}
- private fun handleRegisterDummy() {
- handleRegisterAction(RegisterAction.RegisterDummy)
+ private fun handleRegisterDummy(onNextRegistrationStepAction: (FlowResult) -> Unit) {
+ handleRegisterAction(RegisterAction.RegisterDummy, onNextRegistrationStepAction)
}
private suspend fun onSessionCreated(session: Session, isAccountCreated: Boolean) {
@@ -599,19 +606,7 @@ class OnboardingViewModel @AssistedInject constructor(
runCatching { startAuthenticationFlowUseCase.execute(homeServerConnectionConfig) }.fold(
onSuccess = {
- rememberHomeServer(homeServerConnectionConfig.homeServerUri.toString())
- if (it.isHomeserverOutdated) {
- _viewEvents.post(OnboardingViewEvents.OutdatedHomeserver)
- }
-
- setState {
- copy(
- serverType = alignServerTypeAfterSubmission(homeServerConnectionConfig, serverTypeOverride),
- selectedHomeserver = it.selectedHomeserver,
- isLoading = false,
- )
- }
- onAuthenticationStartedSuccess()
+ onAuthenticationStartedSuccess(homeServerConnectionConfig, it, serverTypeOverride)
},
onFailure = {
setState { copy(isLoading = false) }
@@ -621,6 +616,48 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
+ private fun onAuthenticationStartedSuccess(config: HomeServerConnectionConfig, authResult: StartAuthenticationFlowUseCase.StartAuthenticationResult, serverTypeOverride: ServerType?) {
+ rememberHomeServer(config.homeServerUri.toString())
+ if (authResult.isHomeserverOutdated) {
+ _viewEvents.post(OnboardingViewEvents.OutdatedHomeserver)
+ }
+
+ setState {
+ copy(
+ serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
+ selectedHomeserver = authResult.selectedHomeserver,
+ isLoading = false
+ )
+ }
+ withState {
+ when (lastAction) {
+ is OnboardingAction.HomeServerChange.EditHomeServer -> {
+ when (it.onboardingFlow) {
+ OnboardingFlow.SignUp -> handleRegisterAction(RegisterAction.StartRegistration) { _ ->
+ _viewEvents.post(OnboardingViewEvents.OnHomeserverEdited)
+ }
+ else -> throw IllegalArgumentException("developer error")
+ }
+ }
+ is OnboardingAction.HomeServerChange.SelectHomeServer -> {
+ if (it.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
+ when (it.onboardingFlow) {
+ OnboardingFlow.SignIn -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignIn))
+ OnboardingFlow.SignUp -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignUp))
+ OnboardingFlow.SignInSignUp,
+ null -> {
+ _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
+ }
+ }
+ } else {
+ _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
+ }
+ }
+ else -> _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
+ }
+ }
+ }
+
/**
* If user has entered https://matrix.org, ensure that server type is ServerType.MatrixOrg
* It is also useful to set the value again in the case of a certificate error on matrix.org
@@ -633,28 +670,6 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
- private fun onAuthenticationStartedSuccess() {
- withState {
- when (lastAction) {
- is OnboardingAction.HomeServerChange.EditHomeServer -> _viewEvents.post(OnboardingViewEvents.OnHomeserverEdited)
- is OnboardingAction.HomeServerChange.SelectHomeServer -> {
- if (it.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
- when (it.onboardingFlow) {
- OnboardingFlow.SignIn -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignIn))
- OnboardingFlow.SignUp -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignUp))
- OnboardingFlow.SignInSignUp,
- null -> {
- _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
- }
- }
- } else {
- _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
- }
- }
- else -> _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
- }
- }
- }
fun getInitialHomeServerUrl(): String? {
return loginConfig?.homeServerUrl
From 2ac7c94cbb3854a3fb61c9bdf414fda0ba6e2b4c Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Wed, 13 Apr 2022 18:08:06 +0200
Subject: [PATCH 079/198] Be able to run `dokkaJavadoc` task
---
dependencies_groups.gradle | 1 +
1 file changed, 1 insertion(+)
diff --git a/dependencies_groups.gradle b/dependencies_groups.gradle
index 60f53e709c..2c3f6a0219 100644
--- a/dependencies_groups.gradle
+++ b/dependencies_groups.gradle
@@ -50,6 +50,7 @@ ext.groups = [
'com.beust',
'com.davemorrissey.labs',
'com.dropbox.core',
+ 'com.soywiz.korlibs.korte',
'com.facebook.fbjni',
'com.facebook.fresco',
'com.facebook.infer.annotation',
From 91c896f566e5d6c7f239a107617b2c4fecff84a4 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Wed, 13 Apr 2022 18:08:43 +0200
Subject: [PATCH 080/198] Add missing internal keyword
---
.../livelocation/LiveLocationAggregationProcessor.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/LiveLocationAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/LiveLocationAggregationProcessor.kt
index 447eed21b0..7b5f23e243 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/LiveLocationAggregationProcessor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/LiveLocationAggregationProcessor.kt
@@ -20,7 +20,7 @@ import io.realm.Realm
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.room.model.message.MessageLiveLocationContent
-interface LiveLocationAggregationProcessor {
+internal interface LiveLocationAggregationProcessor {
fun handleLiveLocation(realm: Realm,
event: Event,
content: MessageLiveLocationContent,
From 10be5920943e894d200156bdb7d7634351fdfd05 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 13 Apr 2022 17:03:09 +0100
Subject: [PATCH 081/198] flattening nested scope.launch
---
.../onboarding/OnboardingViewModel.kt | 120 +++++++++---------
1 file changed, 62 insertions(+), 58 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index e5bbf39127..617896ee0c 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -257,31 +257,35 @@ class OnboardingViewModel @AssistedInject constructor(
private fun handleRegisterAction(action: RegisterAction, onNextRegistrationStepAction: (FlowResult) -> Unit) {
currentJob = viewModelScope.launch {
- if (action.hasLoadingState()) {
- setState { copy(isLoading = true) }
- }
+ internalRegisterAction(action, onNextRegistrationStepAction)
+ }
+ }
- runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) }
- .fold(
- onSuccess = {
- when {
- action.ignoresResult() -> {
- // do nothing
- }
- else -> when (it) {
- is RegistrationResult.Success -> onSessionCreated(it.session, isAccountCreated = true)
- is RegistrationResult.FlowResponse -> onFlowResponse(it.flowResult, onNextRegistrationStepAction)
- }
+ private suspend fun internalRegisterAction(action: RegisterAction, onNextRegistrationStepAction: (FlowResult) -> Unit) {
+ if (action.hasLoadingState()) {
+ setState { copy(isLoading = true) }
+ }
+
+ runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) }
+ .fold(
+ onSuccess = {
+ when {
+ action.ignoresResult() -> {
+ // do nothing
}
- },
- onFailure = {
- if (it !is CancellationException) {
- _viewEvents.post(OnboardingViewEvents.Failure(it))
+ else -> when (it) {
+ is RegistrationResult.Success -> onSessionCreated(it.session, isAccountCreated = true)
+ is RegistrationResult.FlowResponse -> onFlowResponse(it.flowResult, onNextRegistrationStepAction)
}
}
- )
- setState { copy(isLoading = false) }
- }
+ },
+ onFailure = {
+ if (it !is CancellationException) {
+ _viewEvents.post(OnboardingViewEvents.Failure(it))
+ }
+ }
+ )
+ setState { copy(isLoading = false) }
}
private fun emitFlowResultViewEvent(flowResult: FlowResult) {
@@ -289,15 +293,17 @@ class OnboardingViewModel @AssistedInject constructor(
}
private fun handleRegisterWith(action: OnboardingAction.Register) {
- reAuthHelper.data = action.password
- handleRegisterAction(
- RegisterAction.CreateAccount(
- action.username,
- action.password,
- action.initialDeviceName
- ),
- ::emitFlowResultViewEvent
- )
+ currentJob = viewModelScope.launch {
+ reAuthHelper.data = action.password
+ internalRegisterAction(
+ RegisterAction.CreateAccount(
+ action.username,
+ action.password,
+ action.initialDeviceName
+ ),
+ ::emitFlowResultViewEvent
+ )
+ }
}
private fun handleResetAction(action: OnboardingAction.ResetAction) {
@@ -517,7 +523,7 @@ class OnboardingViewModel @AssistedInject constructor(
_viewEvents.post(OnboardingViewEvents.OnSignModeSelected(SignMode.SignIn))
}
- private fun onFlowResponse(flowResult: FlowResult, onNextRegistrationStepAction: (FlowResult) -> Unit) {
+ private suspend fun onFlowResponse(flowResult: FlowResult, onNextRegistrationStepAction: (FlowResult) -> Unit) {
// If dummy stage is mandatory, and password is already sent, do the dummy stage now
if (isRegistrationStarted && flowResult.missingStages.any { it is Stage.Dummy && it.mandatory }) {
handleRegisterDummy(onNextRegistrationStepAction)
@@ -526,8 +532,8 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
- private fun handleRegisterDummy(onNextRegistrationStepAction: (FlowResult) -> Unit) {
- handleRegisterAction(RegisterAction.RegisterDummy, onNextRegistrationStepAction)
+ private suspend fun handleRegisterDummy(onNextRegistrationStepAction: (FlowResult) -> Unit) {
+ internalRegisterAction(RegisterAction.RegisterDummy, onNextRegistrationStepAction)
}
private suspend fun onSessionCreated(session: Session, isAccountCreated: Boolean) {
@@ -616,7 +622,7 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
- private fun onAuthenticationStartedSuccess(config: HomeServerConnectionConfig, authResult: StartAuthenticationFlowUseCase.StartAuthenticationResult, serverTypeOverride: ServerType?) {
+ private suspend fun onAuthenticationStartedSuccess(config: HomeServerConnectionConfig, authResult: StartAuthenticationFlowUseCase.StartAuthenticationResult, serverTypeOverride: ServerType?) {
rememberHomeServer(config.homeServerUri.toString())
if (authResult.isHomeserverOutdated) {
_viewEvents.post(OnboardingViewEvents.OutdatedHomeserver)
@@ -629,32 +635,31 @@ class OnboardingViewModel @AssistedInject constructor(
isLoading = false
)
}
- withState {
- when (lastAction) {
- is OnboardingAction.HomeServerChange.EditHomeServer -> {
- when (it.onboardingFlow) {
- OnboardingFlow.SignUp -> handleRegisterAction(RegisterAction.StartRegistration) { _ ->
- _viewEvents.post(OnboardingViewEvents.OnHomeserverEdited)
- }
- else -> throw IllegalArgumentException("developer error")
+ val state = awaitState()
+ when (lastAction) {
+ is OnboardingAction.HomeServerChange.EditHomeServer -> {
+ when (state.onboardingFlow) {
+ OnboardingFlow.SignUp -> handleRegisterAction(RegisterAction.StartRegistration) { _ ->
+ _viewEvents.post(OnboardingViewEvents.OnHomeserverEdited)
}
+ else -> throw IllegalArgumentException("developer error")
}
- is OnboardingAction.HomeServerChange.SelectHomeServer -> {
- if (it.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
- when (it.onboardingFlow) {
- OnboardingFlow.SignIn -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignIn))
- OnboardingFlow.SignUp -> handleUpdateSignMode(OnboardingAction.UpdateSignMode(SignMode.SignUp))
- OnboardingFlow.SignInSignUp,
- null -> {
- _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
- }
- }
- } else {
- _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
- }
- }
- else -> _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
}
+ is OnboardingAction.HomeServerChange.SelectHomeServer -> {
+ if (state.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
+ when (state.onboardingFlow) {
+ OnboardingFlow.SignIn -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
+ OnboardingFlow.SignUp -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
+ OnboardingFlow.SignInSignUp,
+ null -> {
+ _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
+ }
+ }
+ } else {
+ _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
+ }
+ }
+ else -> _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
}
}
@@ -670,7 +675,6 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
-
fun getInitialHomeServerUrl(): String? {
return loginConfig?.homeServerUrl
}
From 86b87e12d7de3678a15cc85d64dcc007f6a1f43d Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Wed, 13 Apr 2022 17:27:04 +0100
Subject: [PATCH 082/198] flattening nested loading state changes to avoid
flashing
---
.../im/vector/app/features/onboarding/OnboardingViewModel.kt | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index 617896ee0c..7ce25190cd 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -615,10 +615,10 @@ class OnboardingViewModel @AssistedInject constructor(
onAuthenticationStartedSuccess(homeServerConnectionConfig, it, serverTypeOverride)
},
onFailure = {
- setState { copy(isLoading = false) }
_viewEvents.post(OnboardingViewEvents.Failure(it))
}
)
+ setState { copy(isLoading = false) }
}
}
@@ -632,7 +632,6 @@ class OnboardingViewModel @AssistedInject constructor(
copy(
serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
selectedHomeserver = authResult.selectedHomeserver,
- isLoading = false
)
}
val state = awaitState()
From 2858401a12d035a4fe328e603355f2f5706c6418 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Wed, 13 Apr 2022 18:52:20 +0200
Subject: [PATCH 083/198] Immutable data class. var -> val, MutableList -> List
---
.../crypto/keysbackup/KeysBackupVersionTrust.kt | 5 ++---
.../keysbackup/DefaultKeysBackupService.kt | 17 +++++++++++------
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
index 042a626d28..37a36f78a7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
@@ -18,17 +18,16 @@ package org.matrix.android.sdk.api.session.crypto.keysbackup
/**
* Data model for response to [KeysBackup.getKeysBackupTrust()].
- * TODO Members should be only val
*/
data class KeysBackupVersionTrust(
/**
* Flag to indicate if the backup is trusted.
* true if there is a signature that is valid & from a trusted device.
*/
- var usable: Boolean = false,
+ val usable: Boolean = false,
/**
* Signatures found in the backup version.
*/
- var signatures: MutableList = ArrayList()
+ val signatures: List = emptyList()
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
index f1929dea53..9a4868aa2b 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
@@ -409,20 +409,22 @@ internal class DefaultKeysBackupService @Inject constructor(
*/
@WorkerThread
private fun getKeysBackupTrustBg(keysBackupVersion: KeysVersionResult): KeysBackupVersionTrust {
- val keysBackupVersionTrust = KeysBackupVersionTrust()
val authData = keysBackupVersion.getAuthDataAsMegolmBackupAuthData()
if (authData == null || authData.publicKey.isEmpty() || authData.signatures.isNullOrEmpty()) {
Timber.v("getKeysBackupTrust: Key backup is absent or missing required data")
- return keysBackupVersionTrust
+ return KeysBackupVersionTrust()
}
val mySigs = authData.signatures[userId]
if (mySigs.isNullOrEmpty()) {
Timber.v("getKeysBackupTrust: Ignoring key backup because it lacks any signatures from this user")
- return keysBackupVersionTrust
+ return KeysBackupVersionTrust()
}
+ var keysBackupVersionTrustIsUsable = false
+ val keysBackupVersionTrustSignatures = mutableListOf()
+
for ((keyId, mySignature) in mySigs) {
// XXX: is this how we're supposed to get the device id?
var deviceId: String? = null
@@ -449,7 +451,7 @@ internal class DefaultKeysBackupService @Inject constructor(
}
if (isSignatureValid && device.isVerified) {
- keysBackupVersionTrust.usable = true
+ keysBackupVersionTrustIsUsable = true
}
}
@@ -457,11 +459,14 @@ internal class DefaultKeysBackupService @Inject constructor(
signature.device = device
signature.valid = isSignatureValid
signature.deviceId = deviceId
- keysBackupVersionTrust.signatures.add(signature)
+ keysBackupVersionTrustSignatures.add(signature)
}
}
- return keysBackupVersionTrust
+ return KeysBackupVersionTrust(
+ usable = keysBackupVersionTrustIsUsable,
+ signatures = keysBackupVersionTrustSignatures
+ )
}
override fun trustKeysBackupVersion(keysBackupVersion: KeysVersionResult,
From 13cf510e8aa352506ff62b84188d19a85925f59f Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Wed, 13 Apr 2022 18:53:27 +0200
Subject: [PATCH 084/198] Better contract. Explicit parameter usage
---
.../api/session/crypto/keysbackup/KeysBackupVersionTrust.kt | 2 +-
.../internal/crypto/keysbackup/DefaultKeysBackupService.kt | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
index 37a36f78a7..c9a2d4e7a5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
@@ -24,7 +24,7 @@ data class KeysBackupVersionTrust(
* Flag to indicate if the backup is trusted.
* true if there is a signature that is valid & from a trusted device.
*/
- val usable: Boolean = false,
+ val usable: Boolean,
/**
* Signatures found in the backup version.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
index 9a4868aa2b..0720696d26 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
@@ -413,13 +413,13 @@ internal class DefaultKeysBackupService @Inject constructor(
if (authData == null || authData.publicKey.isEmpty() || authData.signatures.isNullOrEmpty()) {
Timber.v("getKeysBackupTrust: Key backup is absent or missing required data")
- return KeysBackupVersionTrust()
+ return KeysBackupVersionTrust(usable = false)
}
val mySigs = authData.signatures[userId]
if (mySigs.isNullOrEmpty()) {
Timber.v("getKeysBackupTrust: Ignoring key backup because it lacks any signatures from this user")
- return KeysBackupVersionTrust()
+ return KeysBackupVersionTrust(usable = false)
}
var keysBackupVersionTrustIsUsable = false
From 10b47c33d113f49474bbb2a50c3554967ed4afdf Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Wed, 13 Apr 2022 18:53:59 +0200
Subject: [PATCH 085/198] Small formatting issue
---
.../sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
index 0720696d26..15f6d3b75d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
@@ -1108,7 +1108,7 @@ internal class DefaultKeysBackupService @Inject constructor(
privateKeySalt: String,
privateKeyIterations: Int,
progressListener: ProgressListener): ByteArray {
- return deriveKey(passphrase, privateKeySalt, privateKeyIterations, progressListener)
+ return deriveKey(passphrase, privateKeySalt, privateKeyIterations, progressListener)
}
/**
From 3435357b1c200a42019776cde8eb0ccd7ae15a4e Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Wed, 13 Apr 2022 18:55:56 +0200
Subject: [PATCH 086/198] Immutable data class. var -> val
---
.../KeysBackupVersionTrustSignature.kt | 32 +++++++++----------
.../keysbackup/DefaultKeysBackupService.kt | 9 +++---
2 files changed, 20 insertions(+), 21 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrustSignature.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrustSignature.kt
index 52c6fa7132..219a328cfd 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrustSignature.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrustSignature.kt
@@ -20,23 +20,21 @@ import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
/**
* A signature in a `KeysBackupVersionTrust` object.
- * TODO Make it a data class with only val
*/
-class KeysBackupVersionTrustSignature {
+data class KeysBackupVersionTrustSignature(
+ /**
+ * The id of the device that signed the backup version.
+ */
+ val deviceId: String?,
- /**
- * The id of the device that signed the backup version.
- */
- var deviceId: String? = null
+ /**
+ * The device that signed the backup version.
+ * Can be null if the device is not known.
+ */
+ val device: CryptoDeviceInfo?,
- /**
- * The device that signed the backup version.
- * Can be null if the device is not known.
- */
- var device: CryptoDeviceInfo? = null
-
- /**
- * Flag to indicate the signature from this device is valid.
- */
- var valid = false
-}
+ /**
+ * Flag to indicate the signature from this device is valid.
+ */
+ val valid: Boolean,
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
index 15f6d3b75d..e63a6dc791 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
@@ -455,10 +455,11 @@ internal class DefaultKeysBackupService @Inject constructor(
}
}
- val signature = KeysBackupVersionTrustSignature()
- signature.device = device
- signature.valid = isSignatureValid
- signature.deviceId = deviceId
+ val signature = KeysBackupVersionTrustSignature(
+ deviceId = deviceId,
+ device = device,
+ valid = isSignatureValid,
+ )
keysBackupVersionTrustSignatures.add(signature)
}
}
From 7773b75834d2366f5bafc81bb90cd2fdb229d0b5 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Wed, 13 Apr 2022 19:08:31 +0200
Subject: [PATCH 087/198] Immutable data class. var -> val
---
.../sdk/internal/crypto/attachments/EncryptionResult.kt | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/EncryptionResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/EncryptionResult.kt
index dbbc10a92c..80090cf4a8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/EncryptionResult.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/EncryptionResult.kt
@@ -20,9 +20,8 @@ import org.matrix.android.sdk.api.session.crypto.model.EncryptedFileInfo
/**
* Define the result of an encryption file
- * TODO var should be val
*/
internal data class EncryptionResult(
- var encryptedFileInfo: EncryptedFileInfo,
- var encryptedByteArray: ByteArray
+ val encryptedFileInfo: EncryptedFileInfo,
+ val encryptedByteArray: ByteArray
)
From 137d5e40936cd34654b61ffd2f2a6698bf959b4f Mon Sep 17 00:00:00 2001
From: Onuray Sahin
Date: Wed, 13 Apr 2022 20:10:24 +0300
Subject: [PATCH 088/198] Set live as false when live location sharing is times
up.
---
.../home/room/detail/TimelineViewModel.kt | 15 +-----------
.../location/LocationSharingService.kt | 24 +++++++++++++++++++
2 files changed, 25 insertions(+), 14 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 a07afaa74b..76c6ecc86d 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
@@ -1095,20 +1095,7 @@ class TimelineViewModel @AssistedInject constructor(
}
private fun handleStopLiveLocationSharing() {
- viewModelScope.launch {
- EventType
- .STATE_ROOM_BEACON_INFO
- .mapNotNull {
- room.getStateEvent(it, QueryStringValue.Equals(session.myUserId))
- }
- .firstOrNull()
- ?.let { beaconInfoEvent ->
- room.stopLiveLocation(beaconInfoEvent)
- }
- ?.also {
- locationSharingServiceConnection.stopLiveLocationSharing(room.roomId)
- }
- }
+ locationSharingServiceConnection.stopLiveLocationSharing(room.roomId)
}
private fun observeRoomSummary() {
diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
index 3256844bba..f215a82c71 100644
--- a/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
+++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
@@ -28,6 +28,7 @@ import im.vector.app.features.notifications.NotificationUtils
import im.vector.app.features.session.coroutineScope
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
+import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toContent
@@ -131,6 +132,10 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
fun stopSharingLocation(roomId: String) {
Timber.i("### LocationSharingService.stopSharingLocation for $roomId")
+
+ // Send a new beacon info state by setting live field as false
+ updateStoppedBeaconInfo(roomId)
+
synchronized(roomArgsList) {
roomArgsList.removeAll { it.roomId == roomId }
if (roomArgsList.isEmpty()) {
@@ -140,6 +145,25 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
}
}
+ private fun updateStoppedBeaconInfo(roomId: String) {
+ activeSessionHolder
+ .getSafeActiveSession()
+ ?.let { session ->
+ session.coroutineScope.launch(session.coroutineDispatchers.io) {
+ val room = session.getRoom(roomId)
+ EventType
+ .STATE_ROOM_BEACON_INFO
+ .mapNotNull {
+ room?.getStateEvent(it, QueryStringValue.Equals(session.myUserId))
+ }
+ .firstOrNull()
+ ?.let { beaconInfoEvent ->
+ room?.stopLiveLocation(beaconInfoEvent)
+ }
+ }
+ }
+ }
+
override fun onLocationUpdate(locationData: LocationData) {
Timber.i("### LocationSharingService.onLocationUpdate. Uncertainty: ${locationData.uncertainty}")
From 023a00d1603f2d4dcc2d7c04c9c19c81a31f3c6b Mon Sep 17 00:00:00 2001
From: Onuray Sahin
Date: Wed, 13 Apr 2022 20:13:22 +0300
Subject: [PATCH 089/198] Changelog added.
---
changelog.d/5758.feature | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5758.feature
diff --git a/changelog.d/5758.feature b/changelog.d/5758.feature
new file mode 100644
index 0000000000..512b5c3868
--- /dev/null
+++ b/changelog.d/5758.feature
@@ -0,0 +1 @@
+Live Location Sharing - Update beacon info state event when sharing is ended
\ No newline at end of file
From 015438289e25cf540342bebf6d2d63d47f9339ba Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Wed, 13 Apr 2022 19:25:08 +0200
Subject: [PATCH 090/198] Immutable data class. var -> val
---
.../auth/data/LocalizedFlowDataLoginTerms.kt | 8 +++---
.../session/crypto/model/CryptoDeviceInfo.kt | 4 +--
.../crypto/model/OutgoingRoomKeyRequest.kt | 16 +++++------
.../room/model/EventAnnotationsSummary.kt | 10 +++----
.../model/PollResponseAggregatedSummary.kt | 8 +++---
.../session/room/timeline/TimelineEvent.kt | 2 +-
.../securestorage/SsssKeyCreationInfo.kt | 2 +-
.../sdk/api/session/threads/ThreadDetails.kt | 2 +-
.../crypto/OutgoingGossipingRequest.kt | 6 ++---
.../session/profile/BindThreePidBody.kt | 6 ++---
.../app/features/login/terms/converter.kt | 27 ++++++++++++-------
11 files changed, 46 insertions(+), 45 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LocalizedFlowDataLoginTerms.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LocalizedFlowDataLoginTerms.kt
index 863abf7f51..1e844a1d94 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LocalizedFlowDataLoginTerms.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LocalizedFlowDataLoginTerms.kt
@@ -24,8 +24,8 @@ import kotlinx.parcelize.Parcelize
*/
@Parcelize
data class LocalizedFlowDataLoginTerms(
- var policyName: String? = null,
- var version: String? = null,
- var localizedUrl: String? = null,
- var localizedName: String? = null
+ val policyName: String?,
+ val version: String?,
+ val localizedUrl: String?,
+ val localizedName: String?
) : Parcelable
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt
index 3fa8c31cf5..418b1e6ce3 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt
@@ -22,12 +22,12 @@ import org.matrix.android.sdk.internal.crypto.model.CryptoInfo
data class CryptoDeviceInfo(
val deviceId: String,
override val userId: String,
- var algorithms: List? = null,
+ val algorithms: List? = null,
override val keys: Map? = null,
override val signatures: Map>? = null,
val unsigned: UnsignedDeviceInfo? = null,
var trustLevel: DeviceTrustLevel? = null,
- var isBlocked: Boolean = false,
+ val isBlocked: Boolean = false,
val firstTimeSeenLocalTs: Long? = null
) : CryptoInfo {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/OutgoingRoomKeyRequest.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/OutgoingRoomKeyRequest.kt
index f0a4b24c5f..5f35cc908f 100755
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/OutgoingRoomKeyRequest.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/OutgoingRoomKeyRequest.kt
@@ -25,14 +25,14 @@ import org.matrix.android.sdk.internal.crypto.OutgoingGossipingRequest
@JsonClass(generateAdapter = true)
data class OutgoingRoomKeyRequest(
// RequestBody
- var requestBody: RoomKeyRequestBody?,
+ val requestBody: RoomKeyRequestBody?,
// list of recipients for the request
- override var recipients: Map>,
+ override val recipients: Map>,
// Unique id for this request. Used for both
// an id within the request for later pairing with a cancellation, and for
// the transaction id when sending the to_device messages to our local
- override var requestId: String, // current state of this request
- override var state: OutgoingGossipingRequestState
+ override val requestId: String, // current state of this request
+ override val state: OutgoingGossipingRequestState
// transaction id for the cancellation, if any
// override var cancellationTxnId: String? = null
) : OutgoingGossipingRequest {
@@ -43,9 +43,7 @@ data class OutgoingRoomKeyRequest(
* @return the room id.
*/
val roomId: String?
- get() = if (null != requestBody) {
- requestBody!!.roomId
- } else null
+ get() = requestBody?.roomId
/**
* Used only for log.
@@ -53,7 +51,5 @@ data class OutgoingRoomKeyRequest(
* @return the session id
*/
val sessionId: String?
- get() = if (null != requestBody) {
- requestBody!!.sessionId
- } else null
+ get() = requestBody?.sessionId
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EventAnnotationsSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EventAnnotationsSummary.kt
index 3a4912e457..0238eb6c8d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EventAnnotationsSummary.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EventAnnotationsSummary.kt
@@ -16,9 +16,9 @@
package org.matrix.android.sdk.api.session.room.model
data class EventAnnotationsSummary(
- var eventId: String,
- var reactionsSummary: List = emptyList(),
- var editSummary: EditAggregatedSummary? = null,
- var pollResponseSummary: PollResponseAggregatedSummary? = null,
- var referencesAggregatedSummary: ReferencesAggregatedSummary? = null
+ val eventId: String,
+ val reactionsSummary: List = emptyList(),
+ val editSummary: EditAggregatedSummary? = null,
+ val pollResponseSummary: PollResponseAggregatedSummary? = null,
+ val referencesAggregatedSummary: ReferencesAggregatedSummary? = null
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollResponseAggregatedSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollResponseAggregatedSummary.kt
index a15d8be084..b16852e47d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollResponseAggregatedSummary.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollResponseAggregatedSummary.kt
@@ -16,13 +16,11 @@
package org.matrix.android.sdk.api.session.room.model
data class PollResponseAggregatedSummary(
-
- var aggregatedContent: PollSummaryContent? = null,
-
+ val aggregatedContent: PollSummaryContent? = null,
// If set the poll is closed (Clients SHOULD NOT consider responses after the close event)
- var closedTime: Long? = null,
+ val closedTime: Long? = null,
// Clients SHOULD validate that the option in the relationship is a valid option, and ignore the response if invalid
- var nbOptions: Int = 0,
+ val nbOptions: Int = 0,
// The list of the eventIDs used to build the summary (might be out of sync if chunked received from message chunk)
val sourceEvents: List,
val localEchos: List
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
index d70049a144..a2ae8bfeb5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
@@ -56,7 +56,7 @@ data class TimelineEvent(
* It's not unique on the timeline as it's reset on each chunk.
*/
val displayIndex: Int,
- var ownedByThreadChunk: Boolean = false,
+ val ownedByThreadChunk: Boolean = false,
val senderInfo: SenderInfo,
val annotations: EventAnnotationsSummary? = null,
val readReceipts: List = emptyList()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SsssKeyCreationInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SsssKeyCreationInfo.kt
index eeb1b31f9c..7a91a16c8c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SsssKeyCreationInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SsssKeyCreationInfo.kt
@@ -18,7 +18,7 @@ package org.matrix.android.sdk.api.session.securestorage
data class SsssKeyCreationInfo(
val keyId: String = "",
- var content: SecretStorageKeyContent?,
+ val content: SecretStorageKeyContent?,
val recoveryKey: String = "",
val keySpec: SsssKeySpec
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/threads/ThreadDetails.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/threads/ThreadDetails.kt
index d6937d5b26..c8fe1c85ea 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/threads/ThreadDetails.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/threads/ThreadDetails.kt
@@ -29,7 +29,7 @@ data class ThreadDetails(
val threadSummarySenderInfo: SenderInfo? = null,
val threadSummaryLatestEvent: Event? = null,
val lastMessageTimestamp: Long? = null,
- var threadNotificationState: ThreadNotificationState = ThreadNotificationState.NO_NEW_MESSAGE,
+ val threadNotificationState: ThreadNotificationState = ThreadNotificationState.NO_NEW_MESSAGE,
val isThread: Boolean = false,
val lastRootThreadEdition: String? = null
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/OutgoingGossipingRequest.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/OutgoingGossipingRequest.kt
index b16b46cf98..2438e01102 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/OutgoingGossipingRequest.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/OutgoingGossipingRequest.kt
@@ -19,9 +19,9 @@ package org.matrix.android.sdk.internal.crypto
import org.matrix.android.sdk.api.session.crypto.model.OutgoingGossipingRequestState
internal interface OutgoingGossipingRequest {
- var recipients: Map>
- var requestId: String
- var state: OutgoingGossipingRequestState
+ val recipients: Map>
+ val requestId: String
+ val state: OutgoingGossipingRequestState
// transaction id for the cancellation, if any
// var cancellationTxnId: String?
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/BindThreePidBody.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/BindThreePidBody.kt
index fa45ae9940..4d2a999137 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/BindThreePidBody.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/BindThreePidBody.kt
@@ -30,17 +30,17 @@ internal data class BindThreePidBody(
* Required. The identity server to use. (without "https://")
*/
@Json(name = "id_server")
- var identityServerUrlWithoutProtocol: String,
+ val identityServerUrlWithoutProtocol: String,
/**
* Required. An access token previously registered with the identity server.
*/
@Json(name = "id_access_token")
- var identityServerAccessToken: String,
+ val identityServerAccessToken: String,
/**
* Required. The session identifier given by the identity server.
*/
@Json(name = "sid")
- var sid: String
+ val sid: String
)
diff --git a/vector/src/main/java/im/vector/app/features/login/terms/converter.kt b/vector/src/main/java/im/vector/app/features/login/terms/converter.kt
index 56dc1edf9d..64e4fb65d9 100644
--- a/vector/src/main/java/im/vector/app/features/login/terms/converter.kt
+++ b/vector/src/main/java/im/vector/app/features/login/terms/converter.kt
@@ -48,15 +48,17 @@ fun TermPolicies.toLocalizedLoginTerms(userLanguage: String,
val policies = get("policies")
if (policies is Map<*, *>) {
policies.keys.forEach { policyName ->
- val localizedFlowDataLoginTerms = LocalizedFlowDataLoginTerms()
- localizedFlowDataLoginTerms.policyName = policyName as String
+ val localizedFlowDataLoginTermsPolicyName = policyName as String
+ var localizedFlowDataLoginTermsVersion: String? = null
+ var localizedFlowDataLoginTermsLocalizedUrl: String? = null
+ var localizedFlowDataLoginTermsLocalizedName: String? = null
val policy = policies[policyName]
// Enter this policy
if (policy is Map<*, *>) {
// Version
- localizedFlowDataLoginTerms.version = policy["version"] as String?
+ localizedFlowDataLoginTermsVersion = policy["version"] as String?
var userLanguageUrlAndName: UrlAndName? = null
var defaultLanguageUrlAndName: UrlAndName? = null
@@ -86,21 +88,26 @@ fun TermPolicies.toLocalizedLoginTerms(userLanguage: String,
// Copy found language data by priority
when {
userLanguageUrlAndName != null -> {
- localizedFlowDataLoginTerms.localizedUrl = userLanguageUrlAndName!!.url
- localizedFlowDataLoginTerms.localizedName = userLanguageUrlAndName!!.name
+ localizedFlowDataLoginTermsLocalizedUrl = userLanguageUrlAndName!!.url
+ localizedFlowDataLoginTermsLocalizedName = userLanguageUrlAndName!!.name
}
defaultLanguageUrlAndName != null -> {
- localizedFlowDataLoginTerms.localizedUrl = defaultLanguageUrlAndName!!.url
- localizedFlowDataLoginTerms.localizedName = defaultLanguageUrlAndName!!.name
+ localizedFlowDataLoginTermsLocalizedUrl = defaultLanguageUrlAndName!!.url
+ localizedFlowDataLoginTermsLocalizedName = defaultLanguageUrlAndName!!.name
}
firstUrlAndName != null -> {
- localizedFlowDataLoginTerms.localizedUrl = firstUrlAndName!!.url
- localizedFlowDataLoginTerms.localizedName = firstUrlAndName!!.name
+ localizedFlowDataLoginTermsLocalizedUrl = firstUrlAndName!!.url
+ localizedFlowDataLoginTermsLocalizedName = firstUrlAndName!!.name
}
}
}
- result.add(localizedFlowDataLoginTerms)
+ result.add(LocalizedFlowDataLoginTerms(
+ policyName = localizedFlowDataLoginTermsPolicyName,
+ version = localizedFlowDataLoginTermsVersion,
+ localizedUrl = localizedFlowDataLoginTermsLocalizedUrl,
+ localizedName = localizedFlowDataLoginTermsLocalizedName
+ ))
}
}
From 197df340973f8d0490791e6c23e6d077ffbc5406 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 10:03:45 +0100
Subject: [PATCH 091/198] only setting selected homeserver state after a
successful start registration when editing
---
.../onboarding/OnboardingViewModel.kt | 25 +++++++++++++------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index 7ce25190cd..448fd514ce 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -628,24 +628,33 @@ class OnboardingViewModel @AssistedInject constructor(
_viewEvents.post(OnboardingViewEvents.OutdatedHomeserver)
}
- setState {
- copy(
- serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
- selectedHomeserver = authResult.selectedHomeserver,
- )
- }
val state = awaitState()
+
when (lastAction) {
is OnboardingAction.HomeServerChange.EditHomeServer -> {
when (state.onboardingFlow) {
- OnboardingFlow.SignUp -> handleRegisterAction(RegisterAction.StartRegistration) { _ ->
+ OnboardingFlow.SignUp -> internalRegisterAction(RegisterAction.StartRegistration) { _ ->
+ setState {
+ copy(
+ serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
+ selectedHomeserver = authResult.selectedHomeserver,
+ )
+ }
_viewEvents.post(OnboardingViewEvents.OnHomeserverEdited)
}
else -> throw IllegalArgumentException("developer error")
}
}
is OnboardingAction.HomeServerChange.SelectHomeServer -> {
- if (state.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
+ setState {
+ copy(
+ serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
+ selectedHomeserver = authResult.selectedHomeserver,
+ )
+ }
+
+
+ if (authResult.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
when (state.onboardingFlow) {
OnboardingFlow.SignIn -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
OnboardingFlow.SignUp -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
From da843443ef80424941310283a0180935ef8346e4 Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Thu, 14 Apr 2022 11:28:14 +0200
Subject: [PATCH 092/198] Convert MediaFileUtils to a non-object
---
.../im/vector/lib/multipicker/CameraPicker.kt | 6 ++--
.../lib/multipicker/utils/MediaFileUtils.kt | 33 +++++++++----------
2 files changed, 18 insertions(+), 21 deletions(-)
diff --git a/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraPicker.kt b/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraPicker.kt
index 4b10a7ceae..785b9fae43 100644
--- a/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraPicker.kt
+++ b/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraPicker.kt
@@ -23,8 +23,8 @@ import android.provider.MediaStore
import androidx.activity.result.ActivityResultLauncher
import androidx.core.content.FileProvider
import im.vector.lib.multipicker.entity.MultiPickerImageType
-import im.vector.lib.multipicker.utils.MediaFileUtils.MediaType.IMAGE
-import im.vector.lib.multipicker.utils.MediaFileUtils.createTemporaryMediaFile
+import im.vector.lib.multipicker.utils.MediaType
+import im.vector.lib.multipicker.utils.createTemporaryMediaFile
import im.vector.lib.multipicker.utils.toMultiPickerImageType
/**
@@ -61,7 +61,7 @@ class CameraPicker {
companion object {
fun createPhotoUri(context: Context): Uri {
- val file = createTemporaryMediaFile(context, IMAGE)
+ val file = createTemporaryMediaFile(context, MediaType.IMAGE)
val authority = context.packageName + ".multipicker.fileprovider"
return FileProvider.getUriForFile(context, authority, file)
}
diff --git a/library/multipicker/src/main/java/im/vector/lib/multipicker/utils/MediaFileUtils.kt b/library/multipicker/src/main/java/im/vector/lib/multipicker/utils/MediaFileUtils.kt
index f1dbfbbb33..33cdab3ac2 100644
--- a/library/multipicker/src/main/java/im/vector/lib/multipicker/utils/MediaFileUtils.kt
+++ b/library/multipicker/src/main/java/im/vector/lib/multipicker/utils/MediaFileUtils.kt
@@ -22,24 +22,21 @@ import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
-object MediaFileUtils {
-
- fun createTemporaryMediaFile(context: Context, mediaType: MediaType): File {
- val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
- val storageDir: File = context.filesDir.also { it.mkdirs() }
- val fileSuffix = when (mediaType) {
- MediaType.IMAGE -> ".jpg"
- MediaType.VIDEO -> ".mp4"
- }
-
- return File.createTempFile(
- "${timeStamp}_",
- fileSuffix,
- storageDir
- )
+fun createTemporaryMediaFile(context: Context, mediaType: MediaType): File {
+ val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
+ val storageDir: File = context.filesDir.also { it.mkdirs() }
+ val fileSuffix = when (mediaType) {
+ MediaType.IMAGE -> ".jpg"
+ MediaType.VIDEO -> ".mp4"
}
- enum class MediaType {
- IMAGE, VIDEO
- }
+ return File.createTempFile(
+ "${timeStamp}_",
+ fileSuffix,
+ storageDir
+ )
+}
+
+enum class MediaType {
+ IMAGE, VIDEO
}
From b76ec78c5de3995a8c25978c25f4105685c4913c Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Thu, 14 Apr 2022 11:46:59 +0200
Subject: [PATCH 093/198] Fixes build error in CameraVideoPicker
---
.../java/im/vector/lib/multipicker/CameraVideoPicker.kt | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraVideoPicker.kt b/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraVideoPicker.kt
index 2cf98e9638..59601b30d9 100644
--- a/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraVideoPicker.kt
+++ b/library/multipicker/src/main/java/im/vector/lib/multipicker/CameraVideoPicker.kt
@@ -23,8 +23,8 @@ import android.provider.MediaStore
import androidx.activity.result.ActivityResultLauncher
import androidx.core.content.FileProvider
import im.vector.lib.multipicker.entity.MultiPickerVideoType
-import im.vector.lib.multipicker.utils.MediaFileUtils.MediaType.VIDEO
-import im.vector.lib.multipicker.utils.MediaFileUtils.createTemporaryMediaFile
+import im.vector.lib.multipicker.utils.MediaType
+import im.vector.lib.multipicker.utils.createTemporaryMediaFile
import im.vector.lib.multipicker.utils.toMultiPickerVideoType
/**
@@ -61,7 +61,7 @@ class CameraVideoPicker {
companion object {
fun createVideoUri(context: Context): Uri {
- val file = createTemporaryMediaFile(context, VIDEO)
+ val file = createTemporaryMediaFile(context, MediaType.VIDEO)
val authority = context.packageName + ".multipicker.fileprovider"
return FileProvider.getUriForFile(context, authority, file)
}
From c9e0868917f9e64f70c06ad942e1d21ec3070af3 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 11:04:34 +0100
Subject: [PATCH 094/198] passing the authenication start trigger instead of
relying on the mutable last action state
---
.../onboarding/OnboardingViewModel.kt | 34 +++++++++----------
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index 448fd514ce..b11d6ff54e 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -140,7 +140,7 @@ class OnboardingViewModel @AssistedInject constructor(
is OnboardingAction.UpdateServerType -> handleUpdateServerType(action)
is OnboardingAction.UpdateSignMode -> handleUpdateSignMode(action)
is OnboardingAction.InitWith -> handleInitWith(action)
- is OnboardingAction.HomeServerChange -> withAction(action) { handleHomeserverChange(action.homeServerUrl) }
+ is OnboardingAction.HomeServerChange -> withAction(action) { handleHomeserverChange(action) }
is OnboardingAction.LoginOrRegister -> handleLoginOrRegister(action).also { lastAction = action }
is OnboardingAction.Register -> handleRegisterWith(action).also { lastAction = action }
is OnboardingAction.LoginWithToken -> handleLoginWithToken(action)
@@ -175,7 +175,7 @@ class OnboardingViewModel @AssistedInject constructor(
return when (val config = loginConfig.toHomeserverConfig()) {
null -> continueToPageAfterSplash(onboardingFlow)
- else -> startAuthenticationFlow(config, ServerType.Other)
+ else -> startAuthenticationFlow(trigger = null, config, ServerType.Other)
}
}
@@ -209,7 +209,7 @@ class OnboardingViewModel @AssistedInject constructor(
is OnboardingAction.HomeServerChange.SelectHomeServer -> {
currentHomeServerConnectionConfig
?.let { it.copy(allowedFingerprints = it.allowedFingerprints + action.fingerprint) }
- ?.let { startAuthenticationFlow(it) }
+ ?.let { startAuthenticationFlow(finalLastAction, it) }
}
is OnboardingAction.LoginOrRegister ->
handleDirectLogin(
@@ -594,35 +594,35 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
- private fun handleHomeserverChange(homeserverUrl: String) {
- val homeServerConnectionConfig = homeServerConnectionConfigFactory.create(homeserverUrl)
+ private fun handleHomeserverChange(action: OnboardingAction.HomeServerChange) {
+ val homeServerConnectionConfig = homeServerConnectionConfigFactory.create(action.homeServerUrl)
if (homeServerConnectionConfig == null) {
// This is invalid
_viewEvents.post(OnboardingViewEvents.Failure(Throwable("Unable to create a HomeServerConnectionConfig")))
} else {
- startAuthenticationFlow(homeServerConnectionConfig)
+ startAuthenticationFlow(action, homeServerConnectionConfig)
}
}
- private fun startAuthenticationFlow(homeServerConnectionConfig: HomeServerConnectionConfig, serverTypeOverride: ServerType? = null) {
+ private fun startAuthenticationFlow(trigger: OnboardingAction?, homeServerConnectionConfig: HomeServerConnectionConfig, serverTypeOverride: ServerType? = null) {
currentHomeServerConnectionConfig = homeServerConnectionConfig
currentJob = viewModelScope.launch {
setState { copy(isLoading = true) }
-
runCatching { startAuthenticationFlowUseCase.execute(homeServerConnectionConfig) }.fold(
- onSuccess = {
- onAuthenticationStartedSuccess(homeServerConnectionConfig, it, serverTypeOverride)
- },
- onFailure = {
- _viewEvents.post(OnboardingViewEvents.Failure(it))
- }
+ onSuccess = { onAuthenticationStartedSuccess(trigger, homeServerConnectionConfig, it, serverTypeOverride) },
+ onFailure = { _viewEvents.post(OnboardingViewEvents.Failure(it)) }
)
setState { copy(isLoading = false) }
}
}
- private suspend fun onAuthenticationStartedSuccess(config: HomeServerConnectionConfig, authResult: StartAuthenticationFlowUseCase.StartAuthenticationResult, serverTypeOverride: ServerType?) {
+ private suspend fun onAuthenticationStartedSuccess(
+ trigger: OnboardingAction?,
+ config: HomeServerConnectionConfig,
+ authResult: StartAuthenticationFlowUseCase.StartAuthenticationResult,
+ serverTypeOverride: ServerType?
+ ) {
rememberHomeServer(config.homeServerUri.toString())
if (authResult.isHomeserverOutdated) {
_viewEvents.post(OnboardingViewEvents.OutdatedHomeserver)
@@ -630,7 +630,7 @@ class OnboardingViewModel @AssistedInject constructor(
val state = awaitState()
- when (lastAction) {
+ when (trigger) {
is OnboardingAction.HomeServerChange.EditHomeServer -> {
when (state.onboardingFlow) {
OnboardingFlow.SignUp -> internalRegisterAction(RegisterAction.StartRegistration) { _ ->
@@ -652,8 +652,6 @@ class OnboardingViewModel @AssistedInject constructor(
selectedHomeserver = authResult.selectedHomeserver,
)
}
-
-
if (authResult.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
when (state.onboardingFlow) {
OnboardingFlow.SignIn -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
From 5001be9f211466bb7913e67a1ccc9a7e5046c029 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 11:05:02 +0100
Subject: [PATCH 095/198] adding test around editing error flow and reducing
initial test state setup boilerplate
---
.../onboarding/OnboardingViewModelTest.kt | 86 ++++++++++++-------
.../test/fakes/FakeRegisterActionHandler.kt | 4 +
2 files changed, 60 insertions(+), 30 deletions(-)
diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
index 77b3f495f0..62fc9548b2 100644
--- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
+++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
@@ -73,7 +73,6 @@ class OnboardingViewModelTest {
private val fakeUri = FakeUri()
private val fakeContext = FakeContext()
- private val initialState = OnboardingViewState()
private val fakeSession = FakeSession()
private val fakeUriFilenameResolver = FakeUriFilenameResolver()
private val fakeActiveSessionHolder = FakeActiveSessionHolder(fakeSession)
@@ -85,11 +84,12 @@ class OnboardingViewModelTest {
private val fakeStartAuthenticationFlowUseCase = FakeStartAuthenticationFlowUseCase()
private val fakeHomeServerHistoryService = FakeHomeServerHistoryService()
- lateinit var viewModel: OnboardingViewModel
+ private var initialState = OnboardingViewState()
+ private lateinit var viewModel: OnboardingViewModel
@Before
fun setUp() {
- viewModel = createViewModel()
+ viewModelWith(initialState)
}
@Test
@@ -105,8 +105,7 @@ class OnboardingViewModelTest {
@Test
fun `given supports changing display name, when handling PersonalizeProfile, then emits contents choose display name`() = runTest {
- val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = true, supportsChangingProfilePicture = false))
- viewModel = createViewModel(initialState)
+ viewModelWith(initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = true, supportsChangingProfilePicture = false)))
val test = viewModel.test()
viewModel.handle(OnboardingAction.PersonalizeProfile)
@@ -118,8 +117,7 @@ class OnboardingViewModelTest {
@Test
fun `given only supports changing profile picture, when handling PersonalizeProfile, then emits contents choose profile picture`() = runTest {
- val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = false, supportsChangingProfilePicture = true))
- viewModel = createViewModel(initialState)
+ viewModelWith(initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = false, supportsChangingProfilePicture = true)))
val test = viewModel.test()
viewModel.handle(OnboardingAction.PersonalizeProfile)
@@ -131,8 +129,7 @@ class OnboardingViewModelTest {
@Test
fun `given has sign in with matrix id sign mode, when handling login or register action, then logs in directly`() = runTest {
- val initialState = initialState.copy(signMode = SignMode.SignInWithMatrixId)
- viewModel = createViewModel(initialState)
+ viewModelWith(initialState.copy(signMode = SignMode.SignInWithMatrixId))
fakeDirectLoginUseCase.givenSuccessResult(A_LOGIN_OR_REGISTER_ACTION, config = null, result = fakeSession)
givenInitialisesSession(fakeSession)
val test = viewModel.test()
@@ -151,8 +148,7 @@ class OnboardingViewModelTest {
@Test
fun `given has sign in with matrix id sign mode, when handling login or register action fails, then emits error`() = runTest {
- val initialState = initialState.copy(signMode = SignMode.SignInWithMatrixId)
- viewModel = createViewModel(initialState)
+ viewModelWith(initialState.copy(signMode = SignMode.SignInWithMatrixId))
fakeDirectLoginUseCase.givenFailureResult(A_LOGIN_OR_REGISTER_ACTION, config = null, cause = AN_ERROR)
givenInitialisesSession(fakeSession)
val test = viewModel.test()
@@ -235,11 +231,13 @@ class OnboardingViewModelTest {
}
@Test
- fun `given when editing homeserver, then updates selected homeserver state and emits edited event`() = runTest {
- val test = viewModel.test()
+ fun `given in the sign up flow, when editing homeserver, then updates selected homeserver state and emits edited event`() = runTest {
+ viewModelWith(initialState.copy(onboardingFlow = OnboardingFlow.SignUp))
fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, A_HOMESERVER_CONFIG)
- fakeStartAuthenticationFlowUseCase.givenResult(A_HOMESERVER_CONFIG, StartAuthenticationResult(false, SELECTED_HOMESERVER_STATE))
+ fakeStartAuthenticationFlowUseCase.givenResult(A_HOMESERVER_CONFIG, StartAuthenticationResult(isHomeserverOutdated = false, SELECTED_HOMESERVER_STATE))
+ givenRegistrationResultFor(RegisterAction.StartRegistration, RegistrationResult.FlowResponse(AN_IGNORED_FLOW_RESULT))
fakeHomeServerHistoryService.expectUrlToBeAdded(A_HOMESERVER_CONFIG.homeServerUri.toString())
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.HomeServerChange.EditHomeServer(A_HOMESERVER_URL))
@@ -247,12 +245,35 @@ class OnboardingViewModelTest {
.assertStatesChanges(
initialState,
{ copy(isLoading = true) },
- { copy(isLoading = false, selectedHomeserver = SELECTED_HOMESERVER_STATE) },
+ { copy(selectedHomeserver = SELECTED_HOMESERVER_STATE) },
+ { copy(isLoading = false) }
+
)
.assertEvents(OnboardingViewEvents.OnHomeserverEdited)
.finish()
}
+ @Test
+ fun `given in the sign up flow, when editing homeserver errors, then does not update the selected homeserver state and emits error`() = runTest {
+ viewModelWith(initialState.copy(onboardingFlow = OnboardingFlow.SignUp))
+ fakeHomeServerConnectionConfigFactory.givenConfigFor(A_HOMESERVER_URL, A_HOMESERVER_CONFIG)
+ fakeStartAuthenticationFlowUseCase.givenResult(A_HOMESERVER_CONFIG, StartAuthenticationResult(isHomeserverOutdated = false, SELECTED_HOMESERVER_STATE))
+ givenRegistrationActionErrors(RegisterAction.StartRegistration, AN_ERROR)
+ fakeHomeServerHistoryService.expectUrlToBeAdded(A_HOMESERVER_CONFIG.homeServerUri.toString())
+ val test = viewModel.test()
+
+ viewModel.handle(OnboardingAction.HomeServerChange.EditHomeServer(A_HOMESERVER_URL))
+
+ test
+ .assertStatesChanges(
+ initialState,
+ { copy(isLoading = true) },
+ { copy(isLoading = false) }
+ )
+ .assertEvents(OnboardingViewEvents.Failure(AN_ERROR))
+ .finish()
+ }
+
@Test
fun `given personalisation enabled, when registering account, then updates state and emits account created event`() = runTest {
fakeVectorFeatures.givenPersonalisationEnabled()
@@ -292,14 +313,13 @@ class OnboardingViewModelTest {
@Test
fun `given changing profile picture is supported, when updating display name, then updates upstream user display name and moves to choose profile picture`() = runTest {
- val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = true))
- viewModel = createViewModel(personalisedInitialState)
+ viewModelWith(initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = true)))
val test = viewModel.test()
viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME))
test
- .assertStatesChanges(personalisedInitialState, expectedSuccessfulDisplayNameUpdateStates())
+ .assertStatesChanges(initialState, expectedSuccessfulDisplayNameUpdateStates())
.assertEvents(OnboardingViewEvents.OnChooseProfilePicture)
.finish()
fakeSession.fakeProfileService.verifyUpdatedName(fakeSession.myUserId, A_DISPLAY_NAME)
@@ -307,14 +327,13 @@ class OnboardingViewModelTest {
@Test
fun `given changing profile picture is not supported, when updating display name, then updates upstream user display name and completes personalization`() = runTest {
- val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = false))
- viewModel = createViewModel(personalisedInitialState)
+ viewModelWith(initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = false)))
val test = viewModel.test()
viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME))
test
- .assertStatesChanges(personalisedInitialState, expectedSuccessfulDisplayNameUpdateStates())
+ .assertStatesChanges(initialState, expectedSuccessfulDisplayNameUpdateStates())
.assertEvents(OnboardingViewEvents.OnPersonalizationComplete)
.finish()
fakeSession.fakeProfileService.verifyUpdatedName(fakeSession.myUserId, A_DISPLAY_NAME)
@@ -354,14 +373,13 @@ class OnboardingViewModelTest {
@Test
fun `given a selected picture, when handling save selected profile picture, then updates upstream avatar and completes personalization`() = runTest {
- val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME)
- viewModel = createViewModel(initialStateWithPicture)
+ viewModelWith(givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME))
val test = viewModel.test()
viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
test
- .assertStates(expectedProfilePictureSuccessStates(initialStateWithPicture))
+ .assertStates(expectedProfilePictureSuccessStates(initialState))
.assertEvents(OnboardingViewEvents.OnPersonalizationComplete)
.finish()
fakeSession.fakeProfileService.verifyAvatarUpdated(fakeSession.myUserId, fakeUri.instance, A_PICTURE_FILENAME)
@@ -370,14 +388,13 @@ class OnboardingViewModelTest {
@Test
fun `given upstream update avatar fails, when saving selected profile picture, then emits failure event`() = runTest {
fakeSession.fakeProfileService.givenUpdateAvatarErrors(AN_ERROR)
- val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME)
- viewModel = createViewModel(initialStateWithPicture)
+ viewModelWith(givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME))
val test = viewModel.test()
viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
test
- .assertStates(expectedProfilePictureFailureStates(initialStateWithPicture))
+ .assertStates(expectedProfilePictureFailureStates(initialState))
.assertEvents(OnboardingViewEvents.Failure(AN_ERROR))
.finish()
}
@@ -406,8 +423,8 @@ class OnboardingViewModelTest {
.finish()
}
- private fun createViewModel(state: OnboardingViewState = initialState): OnboardingViewModel {
- return OnboardingViewModel(
+ private fun viewModelWith(state: OnboardingViewState) {
+ OnboardingViewModel(
state,
fakeContext.instance,
fakeAuthenticationService,
@@ -423,7 +440,10 @@ class OnboardingViewModelTest {
fakeDirectLoginUseCase.instance,
fakeStartAuthenticationFlowUseCase.instance,
FakeVectorOverrides()
- )
+ ).also {
+ viewModel = it
+ initialState = state
+ }
}
private fun givenPictureSelected(fileUri: Uri, filename: String): OnboardingViewState {
@@ -481,6 +501,12 @@ class OnboardingViewModelTest {
fakeAuthenticationService.givenRegistrationWizard(registrationWizard)
fakeRegisterActionHandler.givenResultsFor(registrationWizard, results)
}
+
+ private fun givenRegistrationActionErrors(action: RegisterAction, cause: Throwable) {
+ val registrationWizard = FakeRegistrationWizard()
+ fakeAuthenticationService.givenRegistrationWizard(registrationWizard)
+ fakeRegisterActionHandler.givenThrowsFor(registrationWizard, action, cause)
+ }
}
private fun HomeServerCapabilities.toPersonalisationState() = PersonalizationState(
diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt
index 8d595d91e9..61d0e438ab 100644
--- a/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt
+++ b/vector/src/test/java/im/vector/app/test/fakes/FakeRegisterActionHandler.kt
@@ -33,4 +33,8 @@ class FakeRegisterActionHandler {
result.first { it.first == actionArg }.second
}
}
+
+ fun givenThrowsFor(wizard: RegistrationWizard, action: RegisterAction, cause: Throwable) {
+ coEvery { instance.handleRegisterAction(wizard, action) } throws cause
+ }
}
From 13cc0a2e8d836bf11a4d44eb9cbdd502066cbf91 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 12:14:09 +0200
Subject: [PATCH 096/198] Immutable data class. var -> val. The code should be
equivalent.
---
.../session/room/model/PollSummaryContent.kt | 12 ++---
.../EventRelationsAggregationProcessor.kt | 48 +++++++++++--------
2 files changed, 35 insertions(+), 25 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollSummaryContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollSummaryContent.kt
index f1e4354314..09458ff12e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollSummaryContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollSummaryContent.kt
@@ -24,13 +24,13 @@ import com.squareup.moshi.JsonClass
*/
@JsonClass(generateAdapter = true)
data class PollSummaryContent(
- var myVote: String? = null,
- // Array of VoteInfo, list is constructed so that there is only one vote by user
+ val myVote: String? = null,
+ // List of VoteInfo, list is constructed so that there is only one vote by user
// And that optionIndex is valid
- var votes: List? = null,
- var votesSummary: Map? = null,
- var totalVotes: Int = 0,
- var winnerVoteCount: Int = 0
+ val votes: List? = null,
+ val votesSummary: Map? = null,
+ val totalVotes: Int = 0,
+ val winnerVoteCount: Int = 0
)
@JsonClass(generateAdapter = true)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt
index 9f2b7d5f60..15ce5810c8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt
@@ -316,14 +316,16 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
ContentMapper
.map(eventAnnotationsSummaryEntity.pollResponseSummary?.aggregatedContent)
?.toModel()
- ?.apply {
- totalVotes = 0
- winnerVoteCount = 0
- votes = emptyList()
- votesSummary = emptyMap()
- }
- ?.apply {
- eventAnnotationsSummaryEntity.pollResponseSummary?.aggregatedContent = ContentMapper.map(toContent())
+ ?.let { existingPollSummaryContent ->
+ eventAnnotationsSummaryEntity.pollResponseSummary?.aggregatedContent = ContentMapper.map(
+ PollSummaryContent(
+ myVote = existingPollSummaryContent.myVote,
+ votes = emptyList(),
+ votesSummary = emptyMap(),
+ totalVotes = 0,
+ winnerVoteCount = 0,
+ )
+ .toContent())
}
val txId = event.unsignedData?.transactionId
@@ -410,15 +412,15 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
existing.pollResponseSummary = it
}
- val closedTime = existingPollSummary?.closedTime
+ val closedTime = existingPollSummary.closedTime
if (closedTime != null && eventTimestamp > closedTime) {
Timber.v("## POLL is closed ignore event poll:$targetEventId, event :${event.eventId}")
return
}
- val sumModel = ContentMapper.map(existingPollSummary?.aggregatedContent).toModel() ?: PollSummaryContent()
+ val currentModel = ContentMapper.map(existingPollSummary.aggregatedContent).toModel()
- if (existingPollSummary!!.sourceEvents.contains(eventId)) {
+ if (existingPollSummary.sourceEvents.contains(eventId)) {
// ignore this event, we already know it (??)
Timber.v("## POLL ignoring event for summary, it's known eventId:$eventId")
return
@@ -443,7 +445,9 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
return
}
- val votes = sumModel.votes?.toMutableList() ?: ArrayList()
+ val votes = currentModel?.votes.orEmpty().toMutableList()
+
+ var myVote: String? = null
val existingVoteIndex = votes.indexOfFirst { it.userId == senderId }
if (existingVoteIndex != -1) {
// Is the vote newer?
@@ -452,7 +456,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
// Take the new one
votes[existingVoteIndex] = VoteInfo(senderId, option, eventTimestamp)
if (userId == senderId) {
- sumModel.myVote = option
+ myVote = option
}
Timber.v("## POLL adding vote $option for user $senderId in poll :$targetEventId ")
} else {
@@ -461,16 +465,14 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
} else {
votes.add(VoteInfo(senderId, option, eventTimestamp))
if (userId == senderId) {
- sumModel.myVote = option
+ myVote = option
}
Timber.v("## POLL adding vote $option for user $senderId in poll :$targetEventId ")
}
- sumModel.votes = votes
// Precompute the percentage of votes for all options
val totalVotes = votes.size
- sumModel.totalVotes = totalVotes
- sumModel.votesSummary = votes
+ val newVotesSummary = votes
.groupBy({ it.option }, { it.userId })
.mapValues {
VoteSummary(
@@ -478,7 +480,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
percentage = if (totalVotes == 0 && it.value.isEmpty()) 0.0 else it.value.size.toDouble() / totalVotes
)
}
- sumModel.winnerVoteCount = sumModel.votesSummary?.maxOf { it.value.total } ?: 0
+ val newWinnerVoteCount = newVotesSummary.maxOf { it.value.total }
if (isLocalEcho) {
existingPollSummary.sourceLocalEchoEvents.add(eventId)
@@ -486,7 +488,15 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
existingPollSummary.sourceEvents.add(eventId)
}
- existingPollSummary.aggregatedContent = ContentMapper.map(sumModel.toContent())
+ val newSumModel = PollSummaryContent(
+ myVote = myVote,
+ votes = votes,
+ votesSummary = newVotesSummary,
+ totalVotes = totalVotes,
+ winnerVoteCount = newWinnerVoteCount
+ )
+
+ existingPollSummary.aggregatedContent = ContentMapper.map(newSumModel.toContent())
}
private fun handleEndPoll(realm: Realm,
From ee693b5ad48d618a69f330099c4b2974ae19e32c Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 11:27:13 +0100
Subject: [PATCH 097/198] flattening loading state to the handle entry points,
reducing duplication
---
.../onboarding/OnboardingViewModel.kt | 29 +++++++++----------
1 file changed, 13 insertions(+), 16 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index b11d6ff54e..00b36ba60e 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -257,15 +257,15 @@ class OnboardingViewModel @AssistedInject constructor(
private fun handleRegisterAction(action: RegisterAction, onNextRegistrationStepAction: (FlowResult) -> Unit) {
currentJob = viewModelScope.launch {
+ if (action.hasLoadingState()) {
+ setState { copy(isLoading = true) }
+ }
internalRegisterAction(action, onNextRegistrationStepAction)
+ setState { copy(isLoading = false) }
}
}
private suspend fun internalRegisterAction(action: RegisterAction, onNextRegistrationStepAction: (FlowResult) -> Unit) {
- if (action.hasLoadingState()) {
- setState { copy(isLoading = true) }
- }
-
runCatching { registrationActionHandler.handleRegisterAction(registrationWizard, action) }
.fold(
onSuccess = {
@@ -285,7 +285,6 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
)
- setState { copy(isLoading = false) }
}
private fun emitFlowResultViewEvent(flowResult: FlowResult) {
@@ -293,17 +292,15 @@ class OnboardingViewModel @AssistedInject constructor(
}
private fun handleRegisterWith(action: OnboardingAction.Register) {
- currentJob = viewModelScope.launch {
- reAuthHelper.data = action.password
- internalRegisterAction(
- RegisterAction.CreateAccount(
- action.username,
- action.password,
- action.initialDeviceName
- ),
- ::emitFlowResultViewEvent
- )
- }
+ reAuthHelper.data = action.password
+ handleRegisterAction(
+ RegisterAction.CreateAccount(
+ action.username,
+ action.password,
+ action.initialDeviceName
+ ),
+ ::emitFlowResultViewEvent
+ )
}
private fun handleResetAction(action: OnboardingAction.ResetAction) {
From 557808ef24c52056cf3abc98956dad5eef8b5004 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 12:29:07 +0200
Subject: [PATCH 098/198] Changelog
---
changelog.d/5762.sdk | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5762.sdk
diff --git a/changelog.d/5762.sdk b/changelog.d/5762.sdk
new file mode 100644
index 0000000000..0bb89d4f2f
--- /dev/null
+++ b/changelog.d/5762.sdk
@@ -0,0 +1 @@
+Some data classes are now immutable, using `val` instead of `var`
\ No newline at end of file
From a34b424b7b11dc4d78531f8f1b1ff0950e3f2daf Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 11:46:34 +0100
Subject: [PATCH 099/198] updating the server selection on non Edit/Select
events - such as deeplinks - extracts a common function
---
.../onboarding/OnboardingViewModel.kt | 34 +++++++++----------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index 00b36ba60e..8c71441d46 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -625,32 +625,20 @@ class OnboardingViewModel @AssistedInject constructor(
_viewEvents.post(OnboardingViewEvents.OutdatedHomeserver)
}
- val state = awaitState()
-
when (trigger) {
is OnboardingAction.HomeServerChange.EditHomeServer -> {
- when (state.onboardingFlow) {
+ when (awaitState().onboardingFlow) {
OnboardingFlow.SignUp -> internalRegisterAction(RegisterAction.StartRegistration) { _ ->
- setState {
- copy(
- serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
- selectedHomeserver = authResult.selectedHomeserver,
- )
- }
+ updateServerSelection(config, serverTypeOverride, authResult)
_viewEvents.post(OnboardingViewEvents.OnHomeserverEdited)
}
else -> throw IllegalArgumentException("developer error")
}
}
is OnboardingAction.HomeServerChange.SelectHomeServer -> {
- setState {
- copy(
- serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
- selectedHomeserver = authResult.selectedHomeserver,
- )
- }
+ updateServerSelection(config, serverTypeOverride, authResult)
if (authResult.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
- when (state.onboardingFlow) {
+ when (awaitState().onboardingFlow) {
OnboardingFlow.SignIn -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
OnboardingFlow.SignUp -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
OnboardingFlow.SignInSignUp,
@@ -662,7 +650,19 @@ class OnboardingViewModel @AssistedInject constructor(
_viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
}
}
- else -> _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
+ else -> {
+ updateServerSelection(config, serverTypeOverride, authResult)
+ _viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
+ }
+ }
+ }
+
+ private fun updateServerSelection(config: HomeServerConnectionConfig, serverTypeOverride: ServerType?, authResult: StartAuthenticationFlowUseCase.StartAuthenticationResult) {
+ setState {
+ copy(
+ serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
+ selectedHomeserver = authResult.selectedHomeserver,
+ )
}
}
From 1b33c03d9179d6aff7f17f3efff1ec2acb8033bc Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 12:01:23 +0100
Subject: [PATCH 100/198] lifting unavailable homeserver condition to the other
error types
---
.../org/matrix/android/sdk/api/failure/Extensions.kt | 6 ++++++
.../FtueAuthCombinedServerSelectionFragment.kt | 11 ++++-------
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
index 99fc0ba8b7..462c0cd638 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
@@ -22,6 +22,7 @@ import org.matrix.android.sdk.api.session.contentscanner.ContentScannerError
import org.matrix.android.sdk.api.session.contentscanner.ScanFailure
import org.matrix.android.sdk.internal.di.MoshiProvider
import java.io.IOException
+import java.net.UnknownHostException
import javax.net.ssl.HttpsURLConnection
fun Throwable.is401() =
@@ -99,6 +100,11 @@ fun Throwable.isInvalidUIAAuth(): Boolean {
error.flows != null
}
+fun Throwable.isHomeserverUnavailable(): Boolean {
+ return this is Failure.NetworkConnection &&
+ this.ioException is UnknownHostException
+}
+
/**
* Try to convert to a RegistrationFlowResponse. Return null in the cases it's not possible
*/
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt
index 97e2db2123..2e6057288a 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt
@@ -36,9 +36,8 @@ import im.vector.app.features.onboarding.OnboardingViewEvents
import im.vector.app.features.onboarding.OnboardingViewState
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
-import org.matrix.android.sdk.api.failure.Failure
+import org.matrix.android.sdk.api.failure.isHomeserverUnavailable
import reactivecircus.flowbinding.android.widget.textChanges
-import java.net.UnknownHostException
import javax.inject.Inject
class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractFtueAuthFragment() {
@@ -88,11 +87,9 @@ class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractFt
}
override fun onError(throwable: Throwable) {
- views.chooseServerInput.error = if (throwable is Failure.NetworkConnection &&
- throwable.ioException is UnknownHostException) {
- getString(R.string.login_error_homeserver_not_found)
- } else {
- errorFormatter.toHumanReadable(throwable)
+ views.chooseServerInput.error = when {
+ throwable.isHomeserverUnavailable() -> getString(R.string.login_error_homeserver_not_found)
+ else -> errorFormatter.toHumanReadable(throwable)
}
}
From 538e6e453f07217445231f3be6971255d4b0441c Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Thu, 14 Apr 2022 13:22:54 +0200
Subject: [PATCH 101/198] Changes destination after joining space from
hamburger invite
---
.../src/main/java/im/vector/app/features/home/HomeActivity.kt | 2 +-
.../java/im/vector/app/features/navigation/DefaultNavigator.kt | 3 +++
.../main/java/im/vector/app/features/navigation/Navigator.kt | 3 ++-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
index 9d3f022e53..529d42e7cc 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
@@ -580,7 +580,7 @@ class HomeActivity :
}
override fun spaceInviteBottomSheetOnAccept(spaceId: String) {
- navigator.switchToSpace(this, spaceId, Navigator.PostSwitchSpaceAction.None)
+ navigator.switchToSpace(this, spaceId, Navigator.PostSwitchSpaceAction.OpenRoomList)
}
override fun spaceInviteBottomSheetOnDecline(spaceId: String) {
diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
index 8ff70c2954..d6fc7ca2fa 100644
--- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
+++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
@@ -176,6 +176,9 @@ class DefaultNavigator @Inject constructor(
Navigator.PostSwitchSpaceAction.OpenAddExistingRooms -> {
startActivity(context, SpaceManageActivity.newIntent(context, spaceId, ManageType.AddRooms), false)
}
+ Navigator.PostSwitchSpaceAction.OpenRoomList -> {
+ startActivity(context, SpaceExploreActivity.newIntent(context, spaceId), false)
+ }
is Navigator.PostSwitchSpaceAction.OpenDefaultRoom -> {
val args = TimelineArgs(
postSwitchSpaceAction.roomId,
diff --git a/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt b/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt
index 85826fad5b..310105bd95 100644
--- a/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt
+++ b/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt
@@ -54,8 +54,9 @@ interface Navigator {
sealed class PostSwitchSpaceAction {
object None : PostSwitchSpaceAction()
- data class OpenDefaultRoom(val roomId: String, val showShareSheet: Boolean) : PostSwitchSpaceAction()
object OpenAddExistingRooms : PostSwitchSpaceAction()
+ object OpenRoomList : PostSwitchSpaceAction()
+ data class OpenDefaultRoom(val roomId: String, val showShareSheet: Boolean) : PostSwitchSpaceAction()
}
fun switchToSpace(context: Context, spaceId: String, postSwitchSpaceAction: PostSwitchSpaceAction)
From be22be53df7c9c864e2c73617c5097643eeed462 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 12:22:49 +0100
Subject: [PATCH 102/198] fixing line length
---
.../app/features/onboarding/OnboardingViewModel.kt | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index 8c71441d46..0faa66024c 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -41,6 +41,7 @@ import im.vector.app.features.login.LoginMode
import im.vector.app.features.login.ReAuthHelper
import im.vector.app.features.login.ServerType
import im.vector.app.features.login.SignMode
+import im.vector.app.features.onboarding.StartAuthenticationFlowUseCase.StartAuthenticationResult
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
@@ -601,7 +602,11 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
- private fun startAuthenticationFlow(trigger: OnboardingAction?, homeServerConnectionConfig: HomeServerConnectionConfig, serverTypeOverride: ServerType? = null) {
+ private fun startAuthenticationFlow(
+ trigger: OnboardingAction?,
+ homeServerConnectionConfig: HomeServerConnectionConfig,
+ serverTypeOverride: ServerType? = null
+ ) {
currentHomeServerConnectionConfig = homeServerConnectionConfig
currentJob = viewModelScope.launch {
@@ -617,7 +622,7 @@ class OnboardingViewModel @AssistedInject constructor(
private suspend fun onAuthenticationStartedSuccess(
trigger: OnboardingAction?,
config: HomeServerConnectionConfig,
- authResult: StartAuthenticationFlowUseCase.StartAuthenticationResult,
+ authResult: StartAuthenticationResult,
serverTypeOverride: ServerType?
) {
rememberHomeServer(config.homeServerUri.toString())
@@ -657,7 +662,7 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
- private fun updateServerSelection(config: HomeServerConnectionConfig, serverTypeOverride: ServerType?, authResult: StartAuthenticationFlowUseCase.StartAuthenticationResult) {
+ private fun updateServerSelection(config: HomeServerConnectionConfig, serverTypeOverride: ServerType?, authResult: StartAuthenticationResult) {
setState {
copy(
serverType = alignServerTypeAfterSubmission(config, serverTypeOverride),
From 55c981f18b03da10c8f58fe84dbcb696c7825fd4 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 12:37:46 +0100
Subject: [PATCH 103/198] adding back sign mode setting to fix crash when using
legacy other flow
---
.../onboarding/OnboardingViewModel.kt | 21 ++++++++++++-------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
index 0faa66024c..2b286e6d93 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt
@@ -349,12 +349,7 @@ class OnboardingViewModel @AssistedInject constructor(
}
private fun handleUpdateSignMode(action: OnboardingAction.UpdateSignMode) {
- setState {
- copy(
- signMode = action.signMode
- )
- }
-
+ updateSignMode(action.signMode)
when (action.signMode) {
SignMode.SignUp -> handleRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
SignMode.SignIn -> startAuthenticationFlow()
@@ -363,6 +358,10 @@ class OnboardingViewModel @AssistedInject constructor(
}
}
+ private fun updateSignMode(signMode: SignMode) {
+ setState { copy(signMode = signMode) }
+ }
+
private fun handleUpdateUseCase(action: OnboardingAction.UpdateUseCase) {
setState { copy(useCase = action.useCase) }
when (vectorFeatures.isOnboardingCombinedRegisterEnabled()) {
@@ -644,8 +643,14 @@ class OnboardingViewModel @AssistedInject constructor(
updateServerSelection(config, serverTypeOverride, authResult)
if (authResult.selectedHomeserver.preferredLoginMode.supportsSignModeScreen()) {
when (awaitState().onboardingFlow) {
- OnboardingFlow.SignIn -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
- OnboardingFlow.SignUp -> internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
+ OnboardingFlow.SignIn -> {
+ updateSignMode(SignMode.SignIn)
+ internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
+ }
+ OnboardingFlow.SignUp -> {
+ updateSignMode(SignMode.SignUp)
+ internalRegisterAction(RegisterAction.StartRegistration, ::emitFlowResultViewEvent)
+ }
OnboardingFlow.SignInSignUp,
null -> {
_viewEvents.post(OnboardingViewEvents.OnLoginFlowRetrieved)
From 11ef4a7fec79a3ae4b3d0b1864a8a79c5b9b5224 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 13:34:54 +0100
Subject: [PATCH 104/198] adding changelog entry
---
changelog.d/5749.wip | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5749.wip
diff --git a/changelog.d/5749.wip b/changelog.d/5749.wip
new file mode 100644
index 0000000000..a933f55cf5
--- /dev/null
+++ b/changelog.d/5749.wip
@@ -0,0 +1 @@
+Adds error handling within the new FTUE server selection screen
\ No newline at end of file
From fe0332957b6efb943df53ba26c14774fde2397f8 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 14:53:25 +0200
Subject: [PATCH 105/198] Add API documentation
---
.../org/matrix/android/sdk/api/session/user/UserService.kt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
index cd4fb216d3..063abdb5a0 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
@@ -75,11 +75,14 @@ interface UserService {
/**
* Ignore users
+ * Note: once done, for the change to take effect, you have to request an initial sync.
+ * This may be improved in the future
*/
suspend fun ignoreUserIds(userIds: List)
/**
* Un-ignore some users
+ * Note: once done, for the change to take effect, you have to request an initial sync.
*/
suspend fun unIgnoreUserIds(userIds: List)
}
From 04045d2b307f6616d3c006bb92429dd9dbd87c59 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 14:55:02 +0200
Subject: [PATCH 106/198] Improve dialog when un-ignoring user. Add title and
change button labels
---
.../settings/ignored/VectorSettingsIgnoredUsersFragment.kt | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
index 7128639c81..f86d0aba9c 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
@@ -80,11 +80,12 @@ class VectorSettingsIgnoredUsersFragment @Inject constructor(
override fun onUserIdClicked(userId: String) {
MaterialAlertDialogBuilder(requireActivity())
+ .setTitle(R.string.room_participants_action_unignore_title)
.setMessage(getString(R.string.settings_unignore_user, userId))
- .setPositiveButton(R.string.yes) { _, _ ->
+ .setPositiveButton(R.string.unignore) { _, _ ->
viewModel.handle(IgnoredUsersAction.UnIgnore(userId))
}
- .setNegativeButton(R.string.no, null)
+ .setNegativeButton(R.string.action_cancel, null)
.show()
}
From eb44a3ccb6a5abc3906ae2d6a1506b7e6a13e93f Mon Sep 17 00:00:00 2001
From: chagai95 <31655082+chagai95@users.noreply.github.com>
Date: Thu, 14 Apr 2022 14:55:43 +0200
Subject: [PATCH 107/198] Remove unused line
---
.../im/vector/app/features/call/transfer/CallTransferActivity.kt | 1 -
1 file changed, 1 deletion(-)
diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
index b10353be13..81173568b5 100644
--- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
@@ -70,7 +70,6 @@ class CallTransferActivity : VectorBaseActivity() {
}.attach()
setupToolbar(views.callTransferToolbar)
.allowBack()
- views.callTransferToolbar.title = getString(R.string.call_transfer_title)
setupConnectAction()
}
From 2296b89faf5315fa216770eb1bb00710b314c963 Mon Sep 17 00:00:00 2001
From: chagai95 <31655082+chagai95@users.noreply.github.com>
Date: Thu, 14 Apr 2022 14:57:29 +0200
Subject: [PATCH 108/198] Add title string in MaterialToolbar
which was added later to xml
---
vector/src/main/res/layout/activity_call_transfer.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/vector/src/main/res/layout/activity_call_transfer.xml b/vector/src/main/res/layout/activity_call_transfer.xml
index c3febc96a7..6bf334e62d 100644
--- a/vector/src/main/res/layout/activity_call_transfer.xml
+++ b/vector/src/main/res/layout/activity_call_transfer.xml
@@ -17,6 +17,7 @@
@@ -86,4 +87,4 @@
layout="@layout/merge_overlay_waiting_view" />
-
\ No newline at end of file
+
From 7f7b75cae974d77346b62fd21242e95b9e632138 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 14:02:30 +0100
Subject: [PATCH 109/198] removing nullable padding parameter in favour of
callers handling nullability
---
.../java/im/vector/app/core/extensions/View.kt | 6 +++---
.../vector/app/features/login/terms/PolicyItem.kt | 14 ++++++--------
2 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/core/extensions/View.kt b/vector/src/main/java/im/vector/app/core/extensions/View.kt
index 8b30f9e015..4b21063f0b 100644
--- a/vector/src/main/java/im/vector/app/core/extensions/View.kt
+++ b/vector/src/main/java/im/vector/app/core/extensions/View.kt
@@ -33,11 +33,11 @@ fun View.showKeyboard(andRequestFocus: Boolean = false) {
imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
-fun View.setHorizontalPadding(padding: Int?) {
+fun View.setHorizontalPadding(padding: Int) {
setPadding(
- padding ?: paddingLeft,
+ padding,
paddingTop,
- padding ?: paddingRight,
+ padding,
paddingBottom
)
}
diff --git a/vector/src/main/java/im/vector/app/features/login/terms/PolicyItem.kt b/vector/src/main/java/im/vector/app/features/login/terms/PolicyItem.kt
index a1cd64db40..ff35f912cf 100644
--- a/vector/src/main/java/im/vector/app/features/login/terms/PolicyItem.kt
+++ b/vector/src/main/java/im/vector/app/features/login/terms/PolicyItem.kt
@@ -50,14 +50,12 @@ abstract class PolicyItem : EpoxyModelWithHolder() {
override fun bind(holder: Holder) {
super.bind(holder)
- holder.let {
- it.view.setHorizontalPadding(horizontalPadding)
- it.checkbox.isChecked = checked
- it.checkbox.setOnCheckedChangeListener(checkChangeListener)
- it.title.text = title
- it.subtitle.text = subtitle
- it.view.onClick(clickListener)
- }
+ horizontalPadding?.let { holder.view.setHorizontalPadding(it) }
+ holder.checkbox.isChecked = checked
+ holder.checkbox.setOnCheckedChangeListener(checkChangeListener)
+ holder.title.text = title
+ holder.subtitle.text = subtitle
+ holder.view.onClick(clickListener)
}
// Ensure checkbox behaves as expected (remove the listener)
From 84960a77a502fe7f96e84bfc114a2a1e7e603eab Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Thu, 14 Apr 2022 15:06:50 +0200
Subject: [PATCH 110/198] Changes notification join space destination to
explore rooms
---
.../src/main/java/im/vector/app/features/home/HomeActivity.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 529d42e7cc..7a8dcf2634 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
@@ -613,6 +613,6 @@ class HomeActivity :
}
override fun mxToBottomSheetSwitchToSpace(spaceId: String) {
- navigator.switchToSpace(this, spaceId, Navigator.PostSwitchSpaceAction.None)
+ navigator.switchToSpace(this, spaceId, Navigator.PostSwitchSpaceAction.OpenRoomList)
}
}
From 6cb4eb7d494faa3f036af62926c37231eefc3b83 Mon Sep 17 00:00:00 2001
From: Zet
Date: Thu, 14 Apr 2022 00:19:06 +0000
Subject: [PATCH 111/198] Translated using Weblate (Arabic)
Currently translated at 32.5% (713 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ar/
---
vector/src/main/res/values-ar/strings.xml | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/vector/src/main/res/values-ar/strings.xml b/vector/src/main/res/values-ar/strings.xml
index 10c10b8062..8c1a582573 100644
--- a/vector/src/main/res/values-ar/strings.xml
+++ b/vector/src/main/res/values-ar/strings.xml
@@ -872,4 +872,14 @@
اعرض الانفعالاتأضف انفعالًاالانفعالات
+ اختر من يمكنهم العثور على الغرفة والانضمام إليها.
+ اضغط لتعديل الفضاءات
+ اختر الفضاءات
+ أعضاء فضاء %s يمكنهم العثور على الغرفة ومعاينتها والانضمام إليها.
+ أعضاء الفضاء فقك
+ يمكن لأي كان العثور على الفضاء والانضمام إليه
+ يمكن لأي كان الانضمام للغرفة
+ علنيّة
+ خاصة (عبر الدعوة فقط)
+ خاصة
\ No newline at end of file
From ebb2c7a250edbe8e82bc90d20679b8d4a77ce785 Mon Sep 17 00:00:00 2001
From: Mawoka
Date: Wed, 13 Apr 2022 19:42:30 +0000
Subject: [PATCH 112/198] Translated using Weblate (German)
Currently translated at 98.3% (2153 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
---
vector/src/main/res/values-de/strings.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
index 866f05b3a6..d463276bb1 100644
--- a/vector/src/main/res/values-de/strings.xml
+++ b/vector/src/main/res/values-de/strings.xml
@@ -2428,4 +2428,5 @@
Live-Standort teilenLive-Standort teilenThreads nähern sich der Beta 🎉
+ Deaktivieren
\ No newline at end of file
From c8aaeea7f27248dbe6defb5a20e6573e8a052264 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jiri=20Gr=C3=B6nroos?=
Date: Wed, 13 Apr 2022 14:13:48 +0000
Subject: [PATCH 113/198] Translated using Weblate (Finnish)
Currently translated at 84.2% (1844 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fi/
---
vector/src/main/res/values-fi/strings.xml | 58 +++++++++++++++++++++--
1 file changed, 54 insertions(+), 4 deletions(-)
diff --git a/vector/src/main/res/values-fi/strings.xml b/vector/src/main/res/values-fi/strings.xml
index c5e67771dd..9d084fa8ba 100644
--- a/vector/src/main/res/values-fi/strings.xml
+++ b/vector/src/main/res/values-fi/strings.xml
@@ -42,7 +42,7 @@
Alkusynkronointi:
\nTuodaan tiliä…Alkusynkronointi:
-\nTuodaan kryptoa
+\nTuodaan kryptoAlkusynkronointi:
\nTuodaan huoneitaAlkusynkronointi:
@@ -267,7 +267,7 @@
PoistaLiityHylkää
- Siirry ensimmäiseen lukemattomaan viestiin.
+ Siirry lukemattomaanPoistu huoneestaHaluatko varmasti poistua huoneesta?YKSITYISKESKUSTELUT
@@ -516,7 +516,7 @@
Käytä ${app_name}in oletussoittoääntä saapuville puheluilleSaapuvien puheluiden soittoääniVideopuhelu menossa…
- Käyttäjälista
+ Jäsenetyksi jäsen%d jäsentä
@@ -1562,7 +1562,7 @@
Et voi liittyä uudelleen, ellei sinua kutsuta uudelleen.Olet ainoa henkilö täällä. Jos poistut, kukaan ei voi liittyä tänne tulevaisuudessa, et edes sinä.Haluatko varmasti poistua avaruudesta %s\?
- Poistu avaruudesta
+ PoistuLisää huoneitaSelaa huoneita
@@ -2053,4 +2053,54 @@
%1$s lisäsi tälle huoneelle vaihtoehtoiset osoitteet %2$s.Sinulla ei ole lupaa liittyä tähän huoneeseen
+ Käyttäjät
+
+ %1$d lisää
+ %1$d lisää
+
+ Lähetä tiedosto
+ Pysäytä
+ Jaa tämä sijainti
+ Jaa tämä sijainti
+ Jaa nykyinen sijaintini
+ Jaa nykyinen sijaintini
+ Käynnistä sovellus uudelleen, jotta muutos tulee voimaan.
+ Lisää olemassa olevia huoneita ja avaruuksia
+ Älä poistu mistään huoneesta ja avaruudesta
+ Poistu kaikista huoneista ja avaruuksista
+ Käytä ${app_name}in uusinta versiota muilla laitteillasi:
+ Ohita tämä vaihe
+ Tallenna ja jatka
+ Asetukset on tallennettu.
+ Kaikki valmista!
+ Menoksi
+ Voit vaihtaa tämän milloin tahansa.
+ Lisää profiilikuva
+ Voit vaihtaa tämän myöhemmin
+ Näyttönimi
+ Tämä näytetään, kun lähetät viestejä.
+ Valitse näyttönimi
+ Tilisi %s on luotu.
+ Onnittelut!
+ Personoi profiili
+ ohittaa tämän kysymyksen
+ Ei varmuutta vielä\? Voit %s
+ Identiteettipalvelin ei tarjoa käytäntöä
+ Piilota identiteettipalvelimen käytäntö
+ Näytä identiteettipalvelimen käytäntö
+ Valitettavasti konfrenssiin liityttäessä ilmeni virhe
+ Tämä palvelin ei tarjoa mitään käytäntöä.
+ Identiteettipalvelimesi käytäntö
+ Kotipalvelimesi käytäntö
+ ${app_name}-käytäntö
+ Kopioi linkki ketjuun
+ Poista käytöstä
+ Järjestelmän asetukset
+ Apua ${app_name}in käyttöön
+ Lainopilliset asiat
+ tästä
+ Auta meitä tunnistamaan mahdollisia ongelmia ja parantamaan ${app_name}iä jakamalla anonyymia käyttödataa. Ymmärtääksemme miten ihmiset käyttävät useita laitteita, luomme satunnaisen tunnisteen, joka jaetaan kaikkien laitteidesi kesken.
+\n
+\nLue käyttöehdot %s.
+ Auta parantamaan ${app_name}iä
\ No newline at end of file
From 7441dad1c091607bfdc45e220f3eec3caa05837a Mon Sep 17 00:00:00 2001
From: Jeanne Lavoie
Date: Wed, 13 Apr 2022 23:57:22 +0000
Subject: [PATCH 114/198] Translated using Weblate (French)
Currently translated at 99.7% (2185 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
---
vector/src/main/res/values-fr/strings.xml | 33 +++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml
index c9230ec49e..a790263666 100644
--- a/vector/src/main/res/values-fr/strings.xml
+++ b/vector/src/main/res/values-fr/strings.xml
@@ -2419,4 +2419,37 @@
%d changement des ACL du serveur%d changements des ACL du serveur
+ Partage de la position en cours
+ Position en temps réel de ${app_name}
+ Arrêter
+ Position en temps réel activée
+ Si vous souhaitez partager votre position en temps réel, ${app_name} a besoin de l’autorisation d’accès permanent à la position quand l’application est en arrière-plan.
+\nNous accèderons à votre position seulement pendant la durée que vous définissez.
+ Autoriser l’accès
+ Partager cet emplacement
+ Partager cet emplacement
+ Partager la position en temps réel
+ Partager la position en temps réel
+ Partager ma position actuelle
+ Partager ma position actuelle
+ Agrandir jusqu’à l’emplacement actuel
+ Épingle de l’emplacement sélectionné sur la carte
+ Le serveur hôte n’accepte pas de nom d’utilisateur avec seulement des chiffres.
+ Ignorer cette étape
+ Enregistrer et continuer
+ Vos préférences ont été enregistrées.
+ Tout est prêt !
+ Allons-y
+ Vous pouvez la changer à tout moment.
+ Ajouter une photo de profil
+ Vous pourrez le changer plus tard
+ Nom d’affichage
+ Il sera affiché quand vous enverrez des messages.
+ Choisissez un nom d’affichage
+ Votre compte %s a été créé.
+ Félicitations !
+ Aller à l’accueil
+ Personnaliser le profil
+ Les fils de discussion se rapproche de la bêta 🎉
+ Désactiver
\ No newline at end of file
From d1db9a70f3d8d44186b6e8400a364d04515d0098 Mon Sep 17 00:00:00 2001
From: Szimszon
Date: Thu, 14 Apr 2022 09:32:27 +0000
Subject: [PATCH 115/198] Translated using Weblate (Hungarian)
Currently translated at 100.0% (2190 of 2190 strings)
Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/
---
vector/src/main/res/values-hu/strings.xml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml
index f13a97d216..33bde2944e 100644
--- a/vector/src/main/res/values-hu/strings.xml
+++ b/vector/src/main/res/values-hu/strings.xml
@@ -2438,4 +2438,23 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
Ugrás a jelenlegi pozícióraKiválasztott hely rögzítése a térképenÜzenetszálak lassan béta állapotba kerülnek 🎉
+ Helymeghatározás folyamatban
+ ${app_name} Folyamatos helymeghatározás
+ A matrix szerver nem fogad el olyan felhasználói nevet ami csak számokból áll.
+ Lépés kihagyása
+ Mentés és tovább
+ A beállítások elmentve.
+ Minden kész!
+ Gyerünk
+ Bármikor megváltoztatható.
+ Profilkép hozzáadása
+ Ezt később meg lehet változtatni
+ Megjelenítendő név
+ Ez fog megjelenni amikor üzenetet küldesz.
+ Válassz egy megjelenítési nevet
+ A fiókod elkészült: %s.
+ Gratulálunk!
+ Vigyél haza
+ Profil személyre szabása
+ Tiltás
\ No newline at end of file
From 8a83064f5af5374ba05415556bff05bfdfd9af13 Mon Sep 17 00:00:00 2001
From: Szimszon
Date: Thu, 14 Apr 2022 09:27:35 +0000
Subject: [PATCH 116/198] Translated using Weblate (Hungarian)
Currently translated at 100.0% (55 of 55 strings)
Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/
---
fastlane/metadata/android/hu-HU/changelogs/40104040.txt | 2 ++
fastlane/metadata/android/hu-HU/changelogs/40104060.txt | 2 ++
fastlane/metadata/android/hu-HU/changelogs/40104070.txt | 2 ++
fastlane/metadata/android/hu-HU/changelogs/40104080.txt | 2 ++
4 files changed, 8 insertions(+)
create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40104040.txt
create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40104060.txt
create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40104070.txt
create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40104080.txt
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104040.txt b/fastlane/metadata/android/hu-HU/changelogs/40104040.txt
new file mode 100644
index 0000000000..60ec5256aa
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104040.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Gépelés visszajelzési frissítések a felületen. További hibajavítások egy stabilitást növelő fejlesztések.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.4.4
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104060.txt b/fastlane/metadata/android/hu-HU/changelogs/40104060.txt
new file mode 100644
index 0000000000..a3f4b89d92
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104060.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Megjelentek az üzenetszálak az idővonalon és gyorsak. További hibajavítások és stabilitási fejlesztések.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.4.6
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104070.txt b/fastlane/metadata/android/hu-HU/changelogs/40104070.txt
new file mode 100644
index 0000000000..0f969fb577
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104070.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Hibajavítások és stabilizációs fejlesztések.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.4.7
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104080.txt b/fastlane/metadata/android/hu-HU/changelogs/40104080.txt
new file mode 100644
index 0000000000..c29b20c216
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104080.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Megjelentek az üzenetszálak az idővonalon és gyorsak. További hibajavítások és stabilitási fejlesztések.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases
From 1468edd2f9ef067ec968080c32754f440cd0d767 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 15:09:26 +0200
Subject: [PATCH 117/198] One class per file
---
.../settings/ignored/IgnoredUsersAction.kt | 23 ++++++++++++++++
.../settings/ignored/IgnoredUsersViewModel.kt | 21 +++------------
.../settings/ignored/IgnoredUsersViewState.kt | 27 +++++++++++++++++++
3 files changed, 54 insertions(+), 17 deletions(-)
create mode 100644 vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersAction.kt
create mode 100644 vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewState.kt
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersAction.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersAction.kt
new file mode 100644
index 0000000000..48199e557b
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersAction.kt
@@ -0,0 +1,23 @@
+/*
+ * 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.ignored
+
+import im.vector.app.core.platform.VectorViewModelAction
+
+sealed class IgnoredUsersAction : VectorViewModelAction {
+ data class UnIgnore(val userId: String) : IgnoredUsersAction()
+}
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
index b2a7b2cbd1..a9b7e0c4ce 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
@@ -16,37 +16,24 @@
package im.vector.app.features.settings.ignored
-import com.airbnb.mvrx.Async
import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading
-import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.Success
-import com.airbnb.mvrx.Uninitialized
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.VectorViewModel
-import im.vector.app.core.platform.VectorViewModelAction
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.session.Session
-import org.matrix.android.sdk.api.session.user.model.User
import org.matrix.android.sdk.flow.flow
-data class IgnoredUsersViewState(
- val ignoredUsers: List = emptyList(),
- val unIgnoreRequest: Async = Uninitialized
-) : MavericksState
-
-sealed class IgnoredUsersAction : VectorViewModelAction {
- data class UnIgnore(val userId: String) : IgnoredUsersAction()
-}
-
-class IgnoredUsersViewModel @AssistedInject constructor(@Assisted initialState: IgnoredUsersViewState,
- private val session: Session) :
- VectorViewModel(initialState) {
+class IgnoredUsersViewModel @AssistedInject constructor(
+ @Assisted initialState: IgnoredUsersViewState,
+ private val session: Session
+) : VectorViewModel(initialState) {
@AssistedFactory
interface Factory : MavericksAssistedViewModelFactory {
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewState.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewState.kt
new file mode 100644
index 0000000000..c402636dc8
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewState.kt
@@ -0,0 +1,27 @@
+/*
+ * 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.ignored
+
+import com.airbnb.mvrx.Async
+import com.airbnb.mvrx.MavericksState
+import com.airbnb.mvrx.Uninitialized
+import org.matrix.android.sdk.api.session.user.model.User
+
+data class IgnoredUsersViewState(
+ val ignoredUsers: List = emptyList(),
+ val unIgnoreRequest: Async = Uninitialized
+) : MavericksState
From f6c0050e90b2c337954f7c1c5e9a8886d78ab5b5 Mon Sep 17 00:00:00 2001
From: chagai95 <31655082+chagai95@users.noreply.github.com>
Date: Thu, 14 Apr 2022 15:11:02 +0200
Subject: [PATCH 118/198] Create 5765.bugfix
---
changelog.d/5765.bugfix | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5765.bugfix
diff --git a/changelog.d/5765.bugfix b/changelog.d/5765.bugfix
new file mode 100644
index 0000000000..ccf8c1b2c2
--- /dev/null
+++ b/changelog.d/5765.bugfix
@@ -0,0 +1 @@
+Fixing setting transfer title in call transfer.
From 1b95cd537bbc29663a83fdf64c9335a20135c234 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 15:11:46 +0200
Subject: [PATCH 119/198] Simplify ViewState
---
.../settings/ignored/IgnoredUsersViewModel.kt | 16 ++--------------
.../settings/ignored/IgnoredUsersViewState.kt | 4 +---
.../VectorSettingsIgnoredUsersFragment.kt | 12 +-----------
3 files changed, 4 insertions(+), 28 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
index a9b7e0c4ce..f51d53fb07 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
@@ -16,10 +16,7 @@
package im.vector.app.features.settings.ignored
-import com.airbnb.mvrx.Fail
-import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.MavericksViewModelFactory
-import com.airbnb.mvrx.Success
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
@@ -63,19 +60,10 @@ class IgnoredUsersViewModel @AssistedInject constructor(
}
private fun handleUnIgnore(action: IgnoredUsersAction.UnIgnore) {
- setState {
- copy(
- unIgnoreRequest = Loading()
- )
- }
-
+ setState { copy(isLoading = true) }
viewModelScope.launch {
val result = runCatching { session.unIgnoreUserIds(listOf(action.userId)) }
- setState {
- copy(
- unIgnoreRequest = result.fold(::Success, ::Fail)
- )
- }
+ setState { copy(isLoading = false) }
result.onFailure { _viewEvents.post(IgnoredUsersViewEvents.Failure(it)) }
}
}
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewState.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewState.kt
index c402636dc8..3dc1bfe795 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewState.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewState.kt
@@ -16,12 +16,10 @@
package im.vector.app.features.settings.ignored
-import com.airbnb.mvrx.Async
import com.airbnb.mvrx.MavericksState
-import com.airbnb.mvrx.Uninitialized
import org.matrix.android.sdk.api.session.user.model.User
data class IgnoredUsersViewState(
val ignoredUsers: List = emptyList(),
- val unIgnoreRequest: Async = Uninitialized
+ val isLoading: Boolean = false
) : MavericksState
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
index f86d0aba9c..57fa357387 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
@@ -22,8 +22,6 @@ import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
-import com.airbnb.mvrx.Async
-import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -95,14 +93,6 @@ class VectorSettingsIgnoredUsersFragment @Inject constructor(
override fun invalidate() = withState(viewModel) { state ->
ignoredUsersController.update(state)
-
- handleUnIgnoreRequestStatus(state.unIgnoreRequest)
- }
-
- private fun handleUnIgnoreRequestStatus(unIgnoreRequest: Async) {
- views.waitingView.root.isVisible = when (unIgnoreRequest) {
- is Loading -> true
- else -> false
- }
+ views.waitingView.root.isVisible = state.isLoading
}
}
From 6d741c384477dfa1b8dc2ec9d43e0810e1021fb9 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 15:17:29 +0200
Subject: [PATCH 120/198] Perform an initial sync after un-ignoring a user
(#3439)
---
.../features/settings/ignored/IgnoredUsersViewEvents.kt | 1 +
.../features/settings/ignored/IgnoredUsersViewModel.kt | 9 +++++++--
.../ignored/VectorSettingsIgnoredUsersFragment.kt | 8 ++++++++
3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewEvents.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewEvents.kt
index 2b2c3eb49d..8d597a9189 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewEvents.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewEvents.kt
@@ -25,4 +25,5 @@ import im.vector.app.core.platform.VectorViewEvents
sealed class IgnoredUsersViewEvents : VectorViewEvents {
data class Loading(val message: CharSequence? = null) : IgnoredUsersViewEvents()
data class Failure(val throwable: Throwable) : IgnoredUsersViewEvents()
+ object Success : IgnoredUsersViewEvents()
}
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
index f51d53fb07..14f7cd9230 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt
@@ -62,9 +62,14 @@ class IgnoredUsersViewModel @AssistedInject constructor(
private fun handleUnIgnore(action: IgnoredUsersAction.UnIgnore) {
setState { copy(isLoading = true) }
viewModelScope.launch {
- val result = runCatching { session.unIgnoreUserIds(listOf(action.userId)) }
+ val viewEvent = try {
+ session.unIgnoreUserIds(listOf(action.userId))
+ IgnoredUsersViewEvents.Success
+ } catch (throwable: Throwable) {
+ IgnoredUsersViewEvents.Failure(throwable)
+ }
setState { copy(isLoading = false) }
- result.onFailure { _viewEvents.post(IgnoredUsersViewEvents.Failure(it)) }
+ _viewEvents.post(viewEvent)
}
}
}
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
index 57fa357387..66fa690b82 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
@@ -30,6 +30,8 @@ import im.vector.app.core.extensions.cleanup
import im.vector.app.core.extensions.configureWith
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentGenericRecyclerBinding
+import im.vector.app.features.MainActivity
+import im.vector.app.features.MainActivityArgs
import im.vector.app.features.analytics.plan.MobileScreen
import javax.inject.Inject
@@ -60,10 +62,16 @@ class VectorSettingsIgnoredUsersFragment @Inject constructor(
when (it) {
is IgnoredUsersViewEvents.Loading -> showLoading(it.message)
is IgnoredUsersViewEvents.Failure -> showFailure(it.throwable)
+ IgnoredUsersViewEvents.Success -> handleSuccess()
}
}
}
+ private fun handleSuccess() {
+ // A user has been un-ignored, perform a initial sync
+ MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
+ }
+
override fun onDestroyView() {
ignoredUsersController.callback = null
views.genericRecyclerView.cleanup()
From f49e7d9619827de779292716e7f10d461cc14826 Mon Sep 17 00:00:00 2001
From: Onuray Sahin
Date: Thu, 14 Apr 2022 16:23:43 +0300
Subject: [PATCH 121/198] Code review fixes.
---
.../api/session/room/state/StateService.kt | 11 +++-
.../session/room/state/DefaultStateService.kt | 50 +++++++++++++------
.../location/LocationSharingService.kt | 40 +++++++--------
.../LocationSharingServiceConnection.kt | 1 +
4 files changed, 64 insertions(+), 38 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
index 9d03b5d941..f645f3ebf9 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
@@ -68,9 +68,16 @@ interface StateService {
/**
* Stops sharing live location in the room
- * @param beaconInfoStateEvent Initial beacon info state event
+ * @param userId user id
*/
- suspend fun stopLiveLocation(beaconInfoStateEvent: Event)
+ suspend fun stopLiveLocation(userId: String)
+
+ /**
+ * Returns beacon info state event of a user
+ * @param userId user id who is sharing location
+ * @param filterOnlyLive filters only ongoing live location sharing beacons if true else ended event is included
+ */
+ suspend fun getLiveLocationBeaconInfo(userId: String, filterOnlyLive: Boolean): Event?
/**
* Send a state event to the room
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
index f9976a1559..89d33f98d2 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
@@ -21,6 +21,7 @@ import androidx.lifecycle.LiveData
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
+import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
@@ -190,24 +191,41 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private
updateJoinRule(RoomJoinRules.RESTRICTED, null, allowEntries)
}
- override suspend fun stopLiveLocation(beaconInfoStateEvent: Event) {
- beaconInfoStateEvent.getClearContent()?.toModel()?.let { content ->
- val beaconContent = LiveLocationBeaconContent(
- unstableBeaconInfo = BeaconInfo(
- description = content.getBestBeaconInfo()?.description,
- timeout = content.getBestBeaconInfo()?.timeout,
- isLive = false,
- ),
- unstableTimestampAsMilliseconds = System.currentTimeMillis()
- ).toContent()
+ override suspend fun stopLiveLocation(userId: String) {
+ getLiveLocationBeaconInfo(userId, true)?.let { beaconInfoStateEvent ->
+ beaconInfoStateEvent.getClearContent()?.toModel()?.let { content ->
+ val beaconContent = LiveLocationBeaconContent(
+ unstableBeaconInfo = BeaconInfo(
+ description = content.getBestBeaconInfo()?.description,
+ timeout = content.getBestBeaconInfo()?.timeout,
+ isLive = false,
+ ),
+ unstableTimestampAsMilliseconds = System.currentTimeMillis()
+ ).toContent()
- beaconInfoStateEvent.stateKey?.let {
- sendStateEvent(
- eventType = EventType.STATE_ROOM_BEACON_INFO.first(),
- body = beaconContent,
- stateKey = it
- )
+ beaconInfoStateEvent.stateKey?.let {
+ sendStateEvent(
+ eventType = EventType.STATE_ROOM_BEACON_INFO.first(),
+ body = beaconContent,
+ stateKey = it
+ )
+ }
}
}
}
+
+ override suspend fun getLiveLocationBeaconInfo(userId: String, filterOnlyLive: Boolean): Event? {
+ return EventType.STATE_ROOM_BEACON_INFO
+ .mapNotNull {
+ stateEventDataSource.getStateEvent(
+ roomId = roomId,
+ eventType = it,
+ stateKey = QueryStringValue.Equals(userId)
+ )
+ }
+ .firstOrNull { beaconInfoEvent ->
+ !filterOnlyLive ||
+ beaconInfoEvent.getClearContent()?.toModel()?.getBestBeaconInfo()?.isLive.orFalse()
+ }
+ }
}
diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
index f215a82c71..2126cdac04 100644
--- a/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
+++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
@@ -28,7 +28,6 @@ import im.vector.app.features.notifications.NotificationUtils
import im.vector.app.features.session.coroutineScope
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
-import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toContent
@@ -88,7 +87,7 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
.getSafeActiveSession()
?.let { session ->
session.coroutineScope.launch(session.coroutineDispatchers.io) {
- sendBeaconInfo(session, roomArgs)
+ sendLiveBeaconInfo(session, roomArgs)
}
}
}
@@ -96,7 +95,7 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
return START_STICKY
}
- private suspend fun sendBeaconInfo(session: Session, roomArgs: RoomArgs) {
+ private suspend fun sendLiveBeaconInfo(session: Session, roomArgs: RoomArgs) {
val beaconContent = LiveLocationBeaconContent(
unstableBeaconInfo = BeaconInfo(
timeout = roomArgs.durationMillis,
@@ -134,7 +133,7 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
Timber.i("### LocationSharingService.stopSharingLocation for $roomId")
// Send a new beacon info state by setting live field as false
- updateStoppedBeaconInfo(roomId)
+ sendStoppedBeaconInfo(roomId)
synchronized(roomArgsList) {
roomArgsList.removeAll { it.roomId == roomId }
@@ -145,21 +144,12 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
}
}
- private fun updateStoppedBeaconInfo(roomId: String) {
+ private fun sendStoppedBeaconInfo(roomId: String) {
activeSessionHolder
.getSafeActiveSession()
?.let { session ->
session.coroutineScope.launch(session.coroutineDispatchers.io) {
- val room = session.getRoom(roomId)
- EventType
- .STATE_ROOM_BEACON_INFO
- .mapNotNull {
- room?.getStateEvent(it, QueryStringValue.Equals(session.myUserId))
- }
- .firstOrNull()
- ?.let { beaconInfoEvent ->
- room?.stopLiveLocation(beaconInfoEvent)
- }
+ session.getRoom(roomId)?.stopLiveLocation(session.myUserId)
}
}
}
@@ -167,16 +157,26 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
override fun onLocationUpdate(locationData: LocationData) {
Timber.i("### LocationSharingService.onLocationUpdate. Uncertainty: ${locationData.uncertainty}")
+ val session = activeSessionHolder.getSafeActiveSession()
// Emit location update to all rooms in which live location sharing is active
- roomArgsList.toList().forEach { roomArg ->
- sendLiveLocation(roomArg.roomId, locationData)
+ session?.coroutineScope?.launch(session.coroutineDispatchers.io) {
+ roomArgsList.toList().forEach { roomArg ->
+ sendLiveLocation(roomArg.roomId, locationData)
+ }
}
}
- private fun sendLiveLocation(roomId: String, locationData: LocationData) {
- val room = activeSessionHolder.getSafeActiveSession()?.getRoom(roomId)
+ private suspend fun sendLiveLocation(roomId: String, locationData: LocationData) {
+ val session = activeSessionHolder.getSafeActiveSession()
+ val room = session?.getRoom(roomId)
+ val userId = session?.myUserId
+
+ if (room == null || userId == null) {
+ return
+ }
+
room
- ?.getStateEvent(EventType.STATE_ROOM_BEACON_INFO.first())
+ .getLiveLocationBeaconInfo(userId, true)
?.eventId
?.let {
room.sendLiveLocation(
diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
index 6c1b72960d..e72f77531b 100644
--- a/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
+++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
@@ -64,6 +64,7 @@ class LocationSharingServiceConnection @Inject constructor(
override fun onServiceDisconnected(className: ComponentName) {
isBound = false
+ locationSharingService = null
callback?.onLocationServiceStopped()
}
}
From 9c132a32443034ff2ce89046e9d82e9f3adb842a Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 15:26:36 +0200
Subject: [PATCH 122/198] Perform an initial sync after un-ignoring a user,
from the room member screen (#3439)
---
.../roommemberprofile/RoomMemberProfileFragment.kt | 11 ++++++++++-
.../roommemberprofile/RoomMemberProfileViewEvents.kt | 2 +-
.../roommemberprofile/RoomMemberProfileViewModel.kt | 2 +-
vector/src/main/res/values/strings.xml | 2 +-
4 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
index 760bbe9353..5fee420b21 100644
--- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
@@ -47,6 +47,8 @@ import im.vector.app.databinding.DialogBaseEditTextBinding
import im.vector.app.databinding.DialogShareQrCodeBinding
import im.vector.app.databinding.FragmentMatrixProfileBinding
import im.vector.app.databinding.ViewStubRoomMemberProfileHeaderBinding
+import im.vector.app.features.MainActivity
+import im.vector.app.features.MainActivityArgs
import im.vector.app.features.analytics.plan.MobileScreen
import im.vector.app.features.crypto.verification.VerificationBottomSheet
import im.vector.app.features.displayname.getBestName
@@ -131,13 +133,20 @@ class RoomMemberProfileFragment @Inject constructor(
is RoomMemberProfileViewEvents.OnKickActionSuccess -> Unit
is RoomMemberProfileViewEvents.OnSetPowerLevelSuccess -> Unit
is RoomMemberProfileViewEvents.OnBanActionSuccess -> Unit
- is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit
+ is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> handleOnIgnoreActionSuccess(it)
is RoomMemberProfileViewEvents.OnInviteActionSuccess -> Unit
}
}
setupLongClicks()
}
+ private fun handleOnIgnoreActionSuccess(action: RoomMemberProfileViewEvents.OnIgnoreActionSuccess) {
+ if (action.shouldPerformInitialSync) {
+ // A user has been un-ignored, perform a initial sync
+ MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
+ }
+ }
+
private fun setupLongClicks() {
headerViews.memberProfileNameView.copyOnLongClick()
headerViews.memberProfileIdView.copyOnLongClick()
diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewEvents.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewEvents.kt
index efe23eeff0..1857f5cdc4 100644
--- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewEvents.kt
+++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewEvents.kt
@@ -25,7 +25,7 @@ sealed class RoomMemberProfileViewEvents : VectorViewEvents {
data class Loading(val message: CharSequence? = null) : RoomMemberProfileViewEvents()
data class Failure(val throwable: Throwable) : RoomMemberProfileViewEvents()
- object OnIgnoreActionSuccess : RoomMemberProfileViewEvents()
+ data class OnIgnoreActionSuccess(val shouldPerformInitialSync: Boolean) : RoomMemberProfileViewEvents()
object OnSetPowerLevelSuccess : RoomMemberProfileViewEvents()
object OnInviteActionSuccess : RoomMemberProfileViewEvents()
object OnKickActionSuccess : RoomMemberProfileViewEvents()
diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
index 4bcf9ef55d..addc2c71ef 100644
--- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
@@ -390,7 +390,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor(
} else {
session.ignoreUserIds(listOf(state.userId))
}
- RoomMemberProfileViewEvents.OnIgnoreActionSuccess
+ RoomMemberProfileViewEvents.OnIgnoreActionSuccess(isIgnored)
} catch (failure: Throwable) {
RoomMemberProfileViewEvents.Failure(failure)
}
diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
index 551983637c..ffd4333071 100644
--- a/vector/src/main/res/values/strings.xml
+++ b/vector/src/main/res/values/strings.xml
@@ -634,7 +634,7 @@
IgnoreUnignore user
- Unignoring this user will show all messages from them again.
+ Unignoring this user will show all messages from them again.\n\nNote that this action will restart the app and it may take some time.UnignoreCancel invite
From a712ffee689224a5577b1c27f4e752c748de6d25 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 15:34:50 +0200
Subject: [PATCH 123/198] data class
---
.../room/detail/composer/MessageComposerViewEvents.kt | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
index c1af838795..0b8ab1fe04 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
@@ -30,13 +30,13 @@ sealed class MessageComposerViewEvents : VectorViewEvents {
object MessageSent : SendMessageResult()
data class JoinRoomCommandSuccess(val roomId: String) : SendMessageResult()
- class SlashCommandError(val command: Command) : SendMessageResult()
- class SlashCommandUnknown(val command: String) : SendMessageResult()
- class SlashCommandNotSupportedInThreads(val command: Command) : SendMessageResult()
+ data class SlashCommandError(val command: Command) : SendMessageResult()
+ data class SlashCommandUnknown(val command: String) : SendMessageResult()
+ data class SlashCommandNotSupportedInThreads(val command: Command) : SendMessageResult()
data class SlashCommandHandled(@StringRes val messageRes: Int? = null) : SendMessageResult()
object SlashCommandLoading : SendMessageResult()
data class SlashCommandResultOk(@StringRes val messageRes: Int? = null) : SendMessageResult()
- class SlashCommandResultError(val throwable: Throwable) : SendMessageResult()
+ data class SlashCommandResultError(val throwable: Throwable) : SendMessageResult()
data class OpenRoomMemberProfile(val userId: String) : MessageComposerViewEvents()
From 5b8909b5d23064528337a8b58cbaa010a93714f4 Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Thu, 14 Apr 2022 15:37:06 +0200
Subject: [PATCH 124/198] Adds changelog file
---
changelog.d/5766.bugfix | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5766.bugfix
diff --git a/changelog.d/5766.bugfix b/changelog.d/5766.bugfix
new file mode 100644
index 0000000000..d3290decab
--- /dev/null
+++ b/changelog.d/5766.bugfix
@@ -0,0 +1 @@
+Changes destination after joining a space to Explore Space Rooms screen
From 8da5016767f8666d7c2081d8ee8359e19aeb2573 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 15:50:58 +0200
Subject: [PATCH 125/198] Rename val
---
.../composer/MessageComposerViewModel.kt | 84 +++++++++----------
1 file changed, 42 insertions(+), 42 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
index aabc319ee2..9a82d26416 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
@@ -195,7 +195,7 @@ class MessageComposerViewModel @AssistedInject constructor(
}
when (state.sendMode) {
is SendMode.Regular -> {
- when (val slashCommandResult = commandParser.parseSlashCommand(
+ when (val parsedCommand = commandParser.parseSlashCommand(
textMessage = action.text,
isInThreadTimeline = state.isInThreadTimeline())) {
is ParsedCommand.ErrorNotACommand -> {
@@ -213,93 +213,93 @@ class MessageComposerViewModel @AssistedInject constructor(
popDraft()
}
is ParsedCommand.ErrorSyntax -> {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandError(slashCommandResult.command))
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandError(parsedCommand.command))
}
is ParsedCommand.ErrorEmptySlashCommand -> {
_viewEvents.post(MessageComposerViewEvents.SlashCommandUnknown("/"))
}
is ParsedCommand.ErrorUnknownSlashCommand -> {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandUnknown(slashCommandResult.slashCommand))
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandUnknown(parsedCommand.slashCommand))
}
is ParsedCommand.ErrorCommandNotSupportedInThreads -> {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandNotSupportedInThreads(slashCommandResult.command))
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandNotSupportedInThreads(parsedCommand.command))
}
is ParsedCommand.SendPlainText -> {
// Send the text message to the room, without markdown
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
- replyInThreadText = slashCommandResult.message,
+ replyInThreadText = parsedCommand.message,
autoMarkdown = false)
} else {
- room.sendTextMessage(slashCommandResult.message, autoMarkdown = false)
+ room.sendTextMessage(parsedCommand.message, autoMarkdown = false)
}
_viewEvents.post(MessageComposerViewEvents.MessageSent)
popDraft()
}
is ParsedCommand.ChangeRoomName -> {
- handleChangeRoomNameSlashCommand(slashCommandResult)
+ handleChangeRoomNameSlashCommand(parsedCommand)
}
is ParsedCommand.Invite -> {
- handleInviteSlashCommand(slashCommandResult)
+ handleInviteSlashCommand(parsedCommand)
}
is ParsedCommand.Invite3Pid -> {
- handleInvite3pidSlashCommand(slashCommandResult)
+ handleInvite3pidSlashCommand(parsedCommand)
}
is ParsedCommand.SetUserPowerLevel -> {
- handleSetUserPowerLevel(slashCommandResult)
+ handleSetUserPowerLevel(parsedCommand)
}
is ParsedCommand.ClearScalarToken -> {
// TODO
_viewEvents.post(MessageComposerViewEvents.SlashCommandNotImplemented)
}
is ParsedCommand.SetMarkdown -> {
- vectorPreferences.setMarkdownEnabled(slashCommandResult.enable)
+ vectorPreferences.setMarkdownEnabled(parsedCommand.enable)
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(
- if (slashCommandResult.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
+ if (parsedCommand.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
popDraft()
}
is ParsedCommand.BanUser -> {
- handleBanSlashCommand(slashCommandResult)
+ handleBanSlashCommand(parsedCommand)
}
is ParsedCommand.UnbanUser -> {
- handleUnbanSlashCommand(slashCommandResult)
+ handleUnbanSlashCommand(parsedCommand)
}
is ParsedCommand.IgnoreUser -> {
- handleIgnoreSlashCommand(slashCommandResult)
+ handleIgnoreSlashCommand(parsedCommand)
}
is ParsedCommand.UnignoreUser -> {
- handleUnignoreSlashCommand(slashCommandResult)
+ handleUnignoreSlashCommand(parsedCommand)
}
is ParsedCommand.RemoveUser -> {
- handleRemoveSlashCommand(slashCommandResult)
+ handleRemoveSlashCommand(parsedCommand)
}
is ParsedCommand.JoinRoom -> {
- handleJoinToAnotherRoomSlashCommand(slashCommandResult)
+ handleJoinToAnotherRoomSlashCommand(parsedCommand)
popDraft()
}
is ParsedCommand.PartRoom -> {
- handlePartSlashCommand(slashCommandResult)
+ handlePartSlashCommand(parsedCommand)
}
is ParsedCommand.SendEmote -> {
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
- replyInThreadText = slashCommandResult.message,
+ replyInThreadText = parsedCommand.message,
msgType = MessageType.MSGTYPE_EMOTE,
autoMarkdown = action.autoMarkdown)
} else {
- room.sendTextMessage(slashCommandResult.message, msgType = MessageType.MSGTYPE_EMOTE, autoMarkdown = action.autoMarkdown)
+ room.sendTextMessage(parsedCommand.message, msgType = MessageType.MSGTYPE_EMOTE, autoMarkdown = action.autoMarkdown)
}
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
popDraft()
}
is ParsedCommand.SendRainbow -> {
- val message = slashCommandResult.message.toString()
+ val message = parsedCommand.message.toString()
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
- replyInThreadText = slashCommandResult.message,
+ replyInThreadText = parsedCommand.message,
formattedText = rainbowGenerator.generate(message))
} else {
room.sendFormattedTextMessage(message, rainbowGenerator.generate(message))
@@ -308,11 +308,11 @@ class MessageComposerViewModel @AssistedInject constructor(
popDraft()
}
is ParsedCommand.SendRainbowEmote -> {
- val message = slashCommandResult.message.toString()
+ val message = parsedCommand.message.toString()
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
- replyInThreadText = slashCommandResult.message,
+ replyInThreadText = parsedCommand.message,
msgType = MessageType.MSGTYPE_EMOTE,
formattedText = rainbowGenerator.generate(message))
} else {
@@ -323,8 +323,8 @@ class MessageComposerViewModel @AssistedInject constructor(
popDraft()
}
is ParsedCommand.SendSpoiler -> {
- val text = "[${stringProvider.getString(R.string.spoiler)}](${slashCommandResult.message})"
- val formattedText = "${slashCommandResult.message}"
+ val text = "[${stringProvider.getString(R.string.spoiler)}](${parsedCommand.message})"
+ val formattedText = "${parsedCommand.message}"
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
@@ -339,38 +339,38 @@ class MessageComposerViewModel @AssistedInject constructor(
popDraft()
}
is ParsedCommand.SendShrug -> {
- sendPrefixedMessage("¯\\_(ツ)_/¯", slashCommandResult.message, state.rootThreadEventId)
+ sendPrefixedMessage("¯\\_(ツ)_/¯", parsedCommand.message, state.rootThreadEventId)
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
popDraft()
}
is ParsedCommand.SendLenny -> {
- sendPrefixedMessage("( ͡° ͜ʖ ͡°)", slashCommandResult.message, state.rootThreadEventId)
+ sendPrefixedMessage("( ͡° ͜ʖ ͡°)", parsedCommand.message, state.rootThreadEventId)
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
popDraft()
}
is ParsedCommand.SendChatEffect -> {
- sendChatEffect(slashCommandResult)
+ sendChatEffect(parsedCommand)
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
popDraft()
}
is ParsedCommand.ChangeTopic -> {
- handleChangeTopicSlashCommand(slashCommandResult)
+ handleChangeTopicSlashCommand(parsedCommand)
}
is ParsedCommand.ChangeDisplayName -> {
- handleChangeDisplayNameSlashCommand(slashCommandResult)
+ handleChangeDisplayNameSlashCommand(parsedCommand)
}
is ParsedCommand.ChangeDisplayNameForRoom -> {
- handleChangeDisplayNameForRoomSlashCommand(slashCommandResult)
+ handleChangeDisplayNameForRoomSlashCommand(parsedCommand)
}
is ParsedCommand.ChangeRoomAvatar -> {
- handleChangeRoomAvatarSlashCommand(slashCommandResult)
+ handleChangeRoomAvatarSlashCommand(parsedCommand)
}
is ParsedCommand.ChangeAvatarForRoom -> {
- handleChangeAvatarForRoomSlashCommand(slashCommandResult)
+ handleChangeAvatarForRoomSlashCommand(parsedCommand)
}
is ParsedCommand.ShowUser -> {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
- handleWhoisSlashCommand(slashCommandResult)
+ handleWhoisSlashCommand(parsedCommand)
popDraft()
}
is ParsedCommand.DiscardSession -> {
@@ -391,8 +391,8 @@ class MessageComposerViewModel @AssistedInject constructor(
viewModelScope.launch(Dispatchers.IO) {
try {
val params = CreateSpaceParams().apply {
- name = slashCommandResult.name
- invitedUserIds.addAll(slashCommandResult.invitees)
+ name = parsedCommand.name
+ invitedUserIds.addAll(parsedCommand.invitees)
}
val spaceId = session.spaceService().createSpace(params)
session.spaceService().getSpace(spaceId)
@@ -414,7 +414,7 @@ class MessageComposerViewModel @AssistedInject constructor(
_viewEvents.post(MessageComposerViewEvents.SlashCommandLoading)
viewModelScope.launch(Dispatchers.IO) {
try {
- session.spaceService().getSpace(slashCommandResult.spaceId)
+ session.spaceService().getSpace(parsedCommand.spaceId)
?.addChildren(
room.roomId,
null,
@@ -433,7 +433,7 @@ class MessageComposerViewModel @AssistedInject constructor(
_viewEvents.post(MessageComposerViewEvents.SlashCommandLoading)
viewModelScope.launch(Dispatchers.IO) {
try {
- session.spaceService().joinSpace(slashCommandResult.spaceIdOrAlias)
+ session.spaceService().joinSpace(parsedCommand.spaceIdOrAlias)
popDraft()
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
} catch (failure: Throwable) {
@@ -445,7 +445,7 @@ class MessageComposerViewModel @AssistedInject constructor(
is ParsedCommand.LeaveRoom -> {
viewModelScope.launch(Dispatchers.IO) {
try {
- session.leaveRoom(slashCommandResult.roomId)
+ session.leaveRoom(parsedCommand.roomId)
popDraft()
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
} catch (failure: Throwable) {
@@ -457,7 +457,7 @@ class MessageComposerViewModel @AssistedInject constructor(
is ParsedCommand.UpgradeRoom -> {
_viewEvents.post(
MessageComposerViewEvents.ShowRoomUpgradeDialog(
- slashCommandResult.newVersion,
+ parsedCommand.newVersion,
room.roomSummary()?.isPublic ?: false
)
)
From 47b2ae5dfd852947ad43d2c518fcc810e2691cc9 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 14:55:02 +0100
Subject: [PATCH 126/198] updating privacy policy title
---
vector/src/main/res/values/donottranslate.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vector/src/main/res/values/donottranslate.xml b/vector/src/main/res/values/donottranslate.xml
index 7235039e88..221a80e6b3 100755
--- a/vector/src/main/res/values/donottranslate.xml
+++ b/vector/src/main/res/values/donottranslate.xml
@@ -28,7 +28,7 @@
Element Matrix Services (EMS) is a robust and reliable hosting service for fast, secure and real time communication. Find out how on element.io/emsGet in touch
- Our privacy policy
+ Privacy policyPlease read through T&C. You must accept in order to continue.
From 431651ba2f0749e6e81300bff32785e019a713ac Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Thu, 14 Apr 2022 16:39:55 +0200
Subject: [PATCH 127/198] Adds named parameters to OpenRoomList startActivity
---
.../im/vector/app/features/navigation/DefaultNavigator.kt | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
index d6fc7ca2fa..6ff11cb430 100644
--- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
+++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
@@ -177,7 +177,11 @@ class DefaultNavigator @Inject constructor(
startActivity(context, SpaceManageActivity.newIntent(context, spaceId, ManageType.AddRooms), false)
}
Navigator.PostSwitchSpaceAction.OpenRoomList -> {
- startActivity(context, SpaceExploreActivity.newIntent(context, spaceId), false)
+ startActivity(
+ context = context,
+ intent = SpaceExploreActivity.newIntent(context, spaceId),
+ buildTask = false
+ )
}
is Navigator.PostSwitchSpaceAction.OpenDefaultRoom -> {
val args = TimelineArgs(
From 0bc557640a4e2050f84b77dbc6c7e8a9c6e42cd7 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 16:36:40 +0200
Subject: [PATCH 128/198] Perform an initial sync after un-ignoring a user,
from the slash command (#3439)
---
.../home/room/detail/TimelineFragment.kt | 74 ++++++++++++-----
.../detail/composer/MessageComposerAction.kt | 2 +
.../composer/MessageComposerViewEvents.kt | 5 +-
.../composer/MessageComposerViewModel.kt | 79 +++++++++++--------
4 files changed, 106 insertions(+), 54 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
index a722729629..d3c70b01c0 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
@@ -119,6 +119,8 @@ import im.vector.app.core.utils.startInstallFromSourceIntent
import im.vector.app.core.utils.toast
import im.vector.app.databinding.DialogReportContentBinding
import im.vector.app.databinding.FragmentTimelineBinding
+import im.vector.app.features.MainActivity
+import im.vector.app.features.MainActivityArgs
import im.vector.app.features.analytics.extensions.toAnalyticsInteraction
import im.vector.app.features.analytics.plan.Interaction
import im.vector.app.features.analytics.plan.MobileScreen
@@ -136,6 +138,7 @@ import im.vector.app.features.call.conference.ConferenceEventObserver
import im.vector.app.features.call.conference.JitsiCallViewModel
import im.vector.app.features.call.webrtc.WebRtcCallManager
import im.vector.app.features.command.Command
+import im.vector.app.features.command.ParsedCommand
import im.vector.app.features.crypto.keysbackup.restore.KeysBackupRestoreActivity
import im.vector.app.features.crypto.verification.VerificationBottomSheet
import im.vector.app.features.home.AvatarRenderer
@@ -437,6 +440,7 @@ class TimelineFragment @Inject constructor(
messageComposerViewModel.observeViewEvents {
when (it) {
is MessageComposerViewEvents.JoinRoomCommandSuccess -> handleJoinedToAnotherRoom(it)
+ is MessageComposerViewEvents.SlashCommandConfirmationRequest -> handleSlashCommandConfirmationRequest(it)
is MessageComposerViewEvents.SendMessageResult -> renderSendMessageResult(it)
is MessageComposerViewEvents.ShowMessage -> showSnackWithMessage(it.message)
is MessageComposerViewEvents.ShowRoomUpgradeDialog -> handleShowRoomUpgradeDialog(it)
@@ -495,6 +499,25 @@ class TimelineFragment @Inject constructor(
}
}
+ private fun handleSlashCommandConfirmationRequest(action: MessageComposerViewEvents.SlashCommandConfirmationRequest) {
+ when (action.parsedCommand) {
+ is ParsedCommand.UnignoreUser -> promptUnignoreUser(action.parsedCommand)
+ else -> TODO("Add case for ${action.parsedCommand.javaClass.simpleName}")
+ }
+ lockSendButton = false
+ }
+
+ private fun promptUnignoreUser(command: ParsedCommand.UnignoreUser) {
+ MaterialAlertDialogBuilder(requireActivity())
+ .setTitle(R.string.room_participants_action_unignore_title)
+ .setMessage(getString(R.string.settings_unignore_user, command.userId))
+ .setPositiveButton(R.string.unignore) { _, _ ->
+ messageComposerViewModel.handle(MessageComposerAction.SlashCommandConfirmed(command))
+ }
+ .setNegativeButton(R.string.action_cancel, null)
+ .show()
+ }
+
private fun renderVoiceMessageMode(content: String) {
ContentAttachmentData.fromJsonString(content)?.let { audioAttachmentData ->
views.voiceMessageRecorderView.isVisible = true
@@ -1679,9 +1702,7 @@ class TimelineFragment @Inject constructor(
displayCommandError(getString(R.string.unrecognized_command, sendMessageResult.command))
}
is MessageComposerViewEvents.SlashCommandResultOk -> {
- dismissLoadingDialog()
- views.composerLayout.setTextIfDifferent("")
- sendMessageResult.messageRes?.let { showSnackWithMessage(getString(it)) }
+ handleSlashCommandResultOk(sendMessageResult.parsedCommand)
}
is MessageComposerViewEvents.SlashCommandResultError -> {
dismissLoadingDialog()
@@ -1698,6 +1719,21 @@ class TimelineFragment @Inject constructor(
lockSendButton = false
}
+ private fun handleSlashCommandResultOk(parsedCommand: ParsedCommand) {
+ dismissLoadingDialog()
+ views.composerLayout.setTextIfDifferent("")
+ when (parsedCommand) {
+ is ParsedCommand.SetMarkdown -> {
+ showSnackWithMessage(getString(if (parsedCommand.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
+ }
+ is ParsedCommand.UnignoreUser -> {
+ // A user has been un-ignored, perform a initial sync
+ MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
+ }
+ else -> Unit
+ }
+ }
+
private fun displayCommandError(message: String) {
MaterialAlertDialogBuilder(requireActivity())
.setTitle(R.string.command_error)
@@ -2411,23 +2447,23 @@ class TimelineFragment @Inject constructor(
}
private fun displayThreadsBetaOptInDialog() {
- activity?.let {
- MaterialAlertDialogBuilder(it)
- .setTitle(R.string.threads_beta_enable_notice_title)
- .setMessage(threadsManager.getBetaEnableThreadsMessage())
- .setCancelable(true)
- .setNegativeButton(R.string.action_not_now) { _, _ -> }
- .setPositiveButton(R.string.action_try_it_out) { _, _ ->
- threadsManager.enableThreadsAndRestart(it)
- }
- .show()
- ?.findViewById(android.R.id.message)
- ?.apply {
- linksClickable = true
- movementMethod = LinkMovementMethod.getInstance()
- }
- }
+ activity?.let {
+ MaterialAlertDialogBuilder(it)
+ .setTitle(R.string.threads_beta_enable_notice_title)
+ .setMessage(threadsManager.getBetaEnableThreadsMessage())
+ .setCancelable(true)
+ .setNegativeButton(R.string.action_not_now) { _, _ -> }
+ .setPositiveButton(R.string.action_try_it_out) { _, _ ->
+ threadsManager.enableThreadsAndRestart(it)
+ }
+ .show()
+ ?.findViewById(android.R.id.message)
+ ?.apply {
+ linksClickable = true
+ movementMethod = LinkMovementMethod.getInstance()
+ }
}
+ }
/**
* Navigate to Threads list for the current room
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
index dca698ee52..0da324ffc2 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
@@ -17,6 +17,7 @@
package im.vector.app.features.home.room.detail.composer
import im.vector.app.core.platform.VectorViewModelAction
+import im.vector.app.features.command.ParsedCommand
import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent
@@ -30,6 +31,7 @@ sealed class MessageComposerAction : VectorViewModelAction {
data class UserIsTyping(val isTyping: Boolean) : MessageComposerAction()
data class OnTextChanged(val text: CharSequence) : MessageComposerAction()
data class OnEntersBackground(val composerText: String) : MessageComposerAction()
+ data class SlashCommandConfirmed(val parsedCommand: ParsedCommand) : MessageComposerAction()
// Voice Message
data class InitializeVoiceRecorder(val attachmentData: ContentAttachmentData) : MessageComposerAction()
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
index 0b8ab1fe04..fd302005c6 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
@@ -19,6 +19,7 @@ package im.vector.app.features.home.room.detail.composer
import androidx.annotation.StringRes
import im.vector.app.core.platform.VectorViewEvents
import im.vector.app.features.command.Command
+import im.vector.app.features.command.ParsedCommand
sealed class MessageComposerViewEvents : VectorViewEvents {
@@ -35,9 +36,11 @@ sealed class MessageComposerViewEvents : VectorViewEvents {
data class SlashCommandNotSupportedInThreads(val command: Command) : SendMessageResult()
data class SlashCommandHandled(@StringRes val messageRes: Int? = null) : SendMessageResult()
object SlashCommandLoading : SendMessageResult()
- data class SlashCommandResultOk(@StringRes val messageRes: Int? = null) : SendMessageResult()
+ data class SlashCommandResultOk(val parsedCommand: ParsedCommand) : SendMessageResult()
data class SlashCommandResultError(val throwable: Throwable) : SendMessageResult()
+ data class SlashCommandConfirmationRequest(val parsedCommand: ParsedCommand) : MessageComposerViewEvents()
+
data class OpenRoomMemberProfile(val userId: String) : MessageComposerViewEvents()
// TODO Remove
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 9a82d26416..9c81a39941 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
@@ -110,6 +110,7 @@ class MessageComposerViewModel @AssistedInject constructor(
is MessageComposerAction.VoiceWaveformTouchedUp -> handleVoiceWaveformTouchedUp(action)
is MessageComposerAction.VoiceWaveformMovedTo -> handleVoiceWaveformMovedTo(action)
is MessageComposerAction.AudioSeekBarMovedTo -> handleAudioSeekBarMovedTo(action)
+ is MessageComposerAction.SlashCommandConfirmed -> handleSlashCommandConfirmed(action)
}
}
@@ -255,8 +256,7 @@ class MessageComposerViewModel @AssistedInject constructor(
}
is ParsedCommand.SetMarkdown -> {
vectorPreferences.setMarkdownEnabled(parsedCommand.enable)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(
- if (parsedCommand.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.BanUser -> {
@@ -291,7 +291,7 @@ class MessageComposerViewModel @AssistedInject constructor(
} else {
room.sendTextMessage(parsedCommand.message, msgType = MessageType.MSGTYPE_EMOTE, autoMarkdown = action.autoMarkdown)
}
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendRainbow -> {
@@ -304,7 +304,7 @@ class MessageComposerViewModel @AssistedInject constructor(
} else {
room.sendFormattedTextMessage(message, rainbowGenerator.generate(message))
}
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendRainbowEmote -> {
@@ -319,7 +319,7 @@ class MessageComposerViewModel @AssistedInject constructor(
room.sendFormattedTextMessage(message, rainbowGenerator.generate(message), MessageType.MSGTYPE_EMOTE)
}
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendSpoiler -> {
@@ -335,22 +335,22 @@ class MessageComposerViewModel @AssistedInject constructor(
text,
formattedText)
}
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendShrug -> {
sendPrefixedMessage("¯\\_(ツ)_/¯", parsedCommand.message, state.rootThreadEventId)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendLenny -> {
sendPrefixedMessage("( ͡° ͜ʖ ͡°)", parsedCommand.message, state.rootThreadEventId)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendChatEffect -> {
sendChatEffect(parsedCommand)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.ChangeTopic -> {
@@ -369,17 +369,17 @@ class MessageComposerViewModel @AssistedInject constructor(
handleChangeAvatarForRoomSlashCommand(parsedCommand)
}
is ParsedCommand.ShowUser -> {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
handleWhoisSlashCommand(parsedCommand)
popDraft()
}
is ParsedCommand.DiscardSession -> {
if (room.isEncrypted()) {
session.cryptoService().discardOutboundSession(room.roomId)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
} else {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
_viewEvents.post(
MessageComposerViewEvents
.ShowMessage(stringProvider.getString(R.string.command_description_discard_session_not_handled))
@@ -403,7 +403,7 @@ class MessageComposerViewModel @AssistedInject constructor(
true
)
popDraft()
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
} catch (failure: Throwable) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultError(failure))
}
@@ -422,7 +422,7 @@ class MessageComposerViewModel @AssistedInject constructor(
false
)
popDraft()
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
} catch (failure: Throwable) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultError(failure))
}
@@ -435,7 +435,7 @@ class MessageComposerViewModel @AssistedInject constructor(
try {
session.spaceService().joinSpace(parsedCommand.spaceIdOrAlias)
popDraft()
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
} catch (failure: Throwable) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultError(failure))
}
@@ -447,7 +447,7 @@ class MessageComposerViewModel @AssistedInject constructor(
try {
session.leaveRoom(parsedCommand.roomId)
popDraft()
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
} catch (failure: Throwable) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultError(failure))
}
@@ -461,7 +461,7 @@ class MessageComposerViewModel @AssistedInject constructor(
room.roomSummary()?.isPublic ?: false
)
)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
}
@@ -644,19 +644,19 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleChangeTopicSlashCommand(changeTopic: ParsedCommand.ChangeTopic) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeTopic) {
room.updateTopic(changeTopic.topic)
}
}
private fun handleInviteSlashCommand(invite: ParsedCommand.Invite) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(invite) {
room.invite(invite.userId, invite.reason)
}
}
private fun handleInvite3pidSlashCommand(invite: ParsedCommand.Invite3Pid) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(invite) {
room.invite3pid(invite.threePid)
}
}
@@ -669,19 +669,19 @@ class MessageComposerViewModel @AssistedInject constructor(
?.toContent()
?: return
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(setUserPowerLevel) {
room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, stateKey = "", newPowerLevelsContent)
}
}
private fun handleChangeDisplayNameSlashCommand(changeDisplayName: ParsedCommand.ChangeDisplayName) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeDisplayName) {
session.setDisplayName(session.myUserId, changeDisplayName.displayName)
}
}
private fun handlePartSlashCommand(command: ParsedCommand.PartRoom) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(command) {
if (command.roomAlias == null) {
// Leave the current room
room
@@ -697,25 +697,25 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleRemoveSlashCommand(removeUser: ParsedCommand.RemoveUser) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(removeUser) {
room.remove(removeUser.userId, removeUser.reason)
}
}
private fun handleBanSlashCommand(ban: ParsedCommand.BanUser) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(ban) {
room.ban(ban.userId, ban.reason)
}
}
private fun handleUnbanSlashCommand(unban: ParsedCommand.UnbanUser) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(unban) {
room.unban(unban.userId, unban.reason)
}
}
private fun handleChangeRoomNameSlashCommand(changeRoomName: ParsedCommand.ChangeRoomName) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeRoomName) {
room.updateName(changeRoomName.name)
}
}
@@ -727,7 +727,7 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleChangeDisplayNameForRoomSlashCommand(changeDisplayName: ParsedCommand.ChangeDisplayNameForRoom) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeDisplayName) {
getMyRoomMemberContent()
?.copy(displayName = changeDisplayName.displayName)
?.toContent()
@@ -738,13 +738,13 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleChangeRoomAvatarSlashCommand(changeAvatar: ParsedCommand.ChangeRoomAvatar) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeAvatar) {
room.sendStateEvent(EventType.STATE_ROOM_AVATAR, stateKey = "", RoomAvatarContent(changeAvatar.url).toContent())
}
}
private fun handleChangeAvatarForRoomSlashCommand(changeAvatar: ParsedCommand.ChangeAvatarForRoom) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeAvatar) {
getMyRoomMemberContent()
?.copy(avatarUrl = changeAvatar.url)
?.toContent()
@@ -755,13 +755,24 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleIgnoreSlashCommand(ignore: ParsedCommand.IgnoreUser) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(ignore) {
session.ignoreUserIds(listOf(ignore.userId))
}
}
private fun handleUnignoreSlashCommand(unignore: ParsedCommand.UnignoreUser) {
- launchSlashCommandFlowSuspendable {
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandConfirmationRequest(unignore))
+ }
+
+ private fun handleSlashCommandConfirmed(action: MessageComposerAction.SlashCommandConfirmed) {
+ when (action.parsedCommand) {
+ is ParsedCommand.UnignoreUser -> handleUnignoreSlashCommandConfirmed(action.parsedCommand)
+ else -> TODO("Not handled yet")
+ }
+ }
+
+ private fun handleUnignoreSlashCommandConfirmed(unignore: ParsedCommand.UnignoreUser) {
+ launchSlashCommandFlowSuspendable(unignore) {
session.unIgnoreUserIds(listOf(unignore.userId))
}
}
@@ -900,13 +911,13 @@ class MessageComposerViewModel @AssistedInject constructor(
}
}
- private fun launchSlashCommandFlowSuspendable(block: suspend () -> Unit) {
+ private fun launchSlashCommandFlowSuspendable(parsedCommand: ParsedCommand, block: suspend () -> Unit) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandLoading)
viewModelScope.launch {
val event = try {
block()
popDraft()
- MessageComposerViewEvents.SlashCommandResultOk()
+ MessageComposerViewEvents.SlashCommandResultOk(parsedCommand)
} catch (failure: Throwable) {
MessageComposerViewEvents.SlashCommandResultError(failure)
}
From 7b7c5097967c6932ef45286b2164482330d2a6ea Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 16:47:04 +0200
Subject: [PATCH 129/198] Changelog
---
changelog.d/5767.bugfix | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/5767.bugfix
diff --git a/changelog.d/5767.bugfix b/changelog.d/5767.bugfix
new file mode 100644
index 0000000000..2a34fbf4b3
--- /dev/null
+++ b/changelog.d/5767.bugfix
@@ -0,0 +1 @@
+Unignoring a user will perform an initial sync
\ No newline at end of file
From b1cff1a5e850715fa6c7935c8d59a7e9161892bc Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Thu, 14 Apr 2022 16:47:34 +0200
Subject: [PATCH 130/198] Remove unused code
---
.../home/room/detail/composer/MessageComposerViewEvents.kt | 2 --
1 file changed, 2 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
index fd302005c6..e1f6923d21 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
@@ -16,7 +16,6 @@
package im.vector.app.features.home.room.detail.composer
-import androidx.annotation.StringRes
import im.vector.app.core.platform.VectorViewEvents
import im.vector.app.features.command.Command
import im.vector.app.features.command.ParsedCommand
@@ -34,7 +33,6 @@ sealed class MessageComposerViewEvents : VectorViewEvents {
data class SlashCommandError(val command: Command) : SendMessageResult()
data class SlashCommandUnknown(val command: String) : SendMessageResult()
data class SlashCommandNotSupportedInThreads(val command: Command) : SendMessageResult()
- data class SlashCommandHandled(@StringRes val messageRes: Int? = null) : SendMessageResult()
object SlashCommandLoading : SendMessageResult()
data class SlashCommandResultOk(val parsedCommand: ParsedCommand) : SendMessageResult()
data class SlashCommandResultError(val throwable: Throwable) : SendMessageResult()
From 8b893c41067d1fbd2c1389f028847412553ab249 Mon Sep 17 00:00:00 2001
From: ericdecanini
Date: Thu, 14 Apr 2022 16:49:32 +0200
Subject: [PATCH 131/198] Collapses some named arguments on OpenRoomList
startActivity
---
.../im/vector/app/features/navigation/DefaultNavigator.kt | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
index 6ff11cb430..6122cf1eee 100644
--- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
+++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
@@ -177,11 +177,7 @@ class DefaultNavigator @Inject constructor(
startActivity(context, SpaceManageActivity.newIntent(context, spaceId, ManageType.AddRooms), false)
}
Navigator.PostSwitchSpaceAction.OpenRoomList -> {
- startActivity(
- context = context,
- intent = SpaceExploreActivity.newIntent(context, spaceId),
- buildTask = false
- )
+ startActivity(context, SpaceExploreActivity.newIntent(context, spaceId), buildTask = false)
}
is Navigator.PostSwitchSpaceAction.OpenDefaultRoom -> {
val args = TimelineArgs(
From eda1d9142ca2fac44bb2d6a5635221f09f516f58 Mon Sep 17 00:00:00 2001
From: Adam Brown
Date: Thu, 14 Apr 2022 16:10:22 +0100
Subject: [PATCH 132/198] using expression bodies for boolean checks - moves
first expression line onto the declaration line
---
.../android/sdk/api/failure/Extensions.kt | 103 +++++++-----------
1 file changed, 41 insertions(+), 62 deletions(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
index 462c0cd638..362ebcec26 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
@@ -25,32 +25,26 @@ import java.io.IOException
import java.net.UnknownHostException
import javax.net.ssl.HttpsURLConnection
-fun Throwable.is401() =
- this is Failure.ServerError &&
- httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED && /* 401 */
- error.code == MatrixError.M_UNAUTHORIZED
+fun Throwable.is401() = this is Failure.ServerError &&
+ httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED && /* 401 */
+ error.code == MatrixError.M_UNAUTHORIZED
-fun Throwable.is404() =
- this is Failure.ServerError &&
- httpCode == HttpsURLConnection.HTTP_NOT_FOUND && /* 404 */
- error.code == MatrixError.M_NOT_FOUND
+fun Throwable.is404() = this is Failure.ServerError &&
+ httpCode == HttpsURLConnection.HTTP_NOT_FOUND && /* 404 */
+ error.code == MatrixError.M_NOT_FOUND
-fun Throwable.isTokenError() =
- this is Failure.ServerError &&
- (error.code == MatrixError.M_UNKNOWN_TOKEN ||
- error.code == MatrixError.M_MISSING_TOKEN ||
- error.code == MatrixError.ORG_MATRIX_EXPIRED_ACCOUNT)
+fun Throwable.isTokenError() = this is Failure.ServerError &&
+ (error.code == MatrixError.M_UNKNOWN_TOKEN ||
+ error.code == MatrixError.M_MISSING_TOKEN ||
+ error.code == MatrixError.ORG_MATRIX_EXPIRED_ACCOUNT)
-fun Throwable.isLimitExceededError() =
- this is Failure.ServerError &&
- httpCode == 429 &&
- error.code == MatrixError.M_LIMIT_EXCEEDED
+fun Throwable.isLimitExceededError() = this is Failure.ServerError &&
+ httpCode == 429 &&
+ error.code == MatrixError.M_LIMIT_EXCEEDED
-fun Throwable.shouldBeRetried(): Boolean {
- return this is Failure.NetworkConnection ||
- this is IOException ||
- this.isLimitExceededError()
-}
+fun Throwable.shouldBeRetried() = this is Failure.NetworkConnection ||
+ this is IOException ||
+ isLimitExceededError()
/**
* Get the retry delay in case of rate limit exceeded error, adding 100 ms, of defaultValue otherwise
@@ -64,46 +58,33 @@ fun Throwable.getRetryDelay(defaultValue: Long): Long {
?: defaultValue
}
-fun Throwable.isUsernameInUse(): Boolean {
- return this is Failure.ServerError && error.code == MatrixError.M_USER_IN_USE
-}
+fun Throwable.isUsernameInUse() = this is Failure.ServerError &&
+ error.code == MatrixError.M_USER_IN_USE
-fun Throwable.isInvalidUsername(): Boolean {
- return this is Failure.ServerError &&
- error.code == MatrixError.M_INVALID_USERNAME
-}
+fun Throwable.isInvalidUsername() = this is Failure.ServerError &&
+ error.code == MatrixError.M_INVALID_USERNAME
-fun Throwable.isInvalidPassword(): Boolean {
- return this is Failure.ServerError &&
- error.code == MatrixError.M_FORBIDDEN &&
- error.message == "Invalid password"
-}
+fun Throwable.isInvalidPassword() = this is Failure.ServerError &&
+ error.code == MatrixError.M_FORBIDDEN &&
+ error.message == "Invalid password"
-fun Throwable.isRegistrationDisabled(): Boolean {
- return this is Failure.ServerError && error.code == MatrixError.M_FORBIDDEN &&
- httpCode == HttpsURLConnection.HTTP_FORBIDDEN
-}
+fun Throwable.isRegistrationDisabled() = this is Failure.ServerError &&
+ error.code == MatrixError.M_FORBIDDEN &&
+ httpCode == HttpsURLConnection.HTTP_FORBIDDEN
-fun Throwable.isWeakPassword(): Boolean {
- return this is Failure.ServerError && error.code == MatrixError.M_WEAK_PASSWORD
-}
+fun Throwable.isWeakPassword() = this is Failure.ServerError &&
+ error.code == MatrixError.M_WEAK_PASSWORD
-fun Throwable.isLoginEmailUnknown(): Boolean {
- return this is Failure.ServerError &&
- error.code == MatrixError.M_FORBIDDEN &&
- error.message.isEmpty()
-}
+fun Throwable.isLoginEmailUnknown() = this is Failure.ServerError &&
+ error.code == MatrixError.M_FORBIDDEN &&
+ error.message.isEmpty()
-fun Throwable.isInvalidUIAAuth(): Boolean {
- return this is Failure.ServerError &&
- error.code == MatrixError.M_FORBIDDEN &&
- error.flows != null
-}
+fun Throwable.isInvalidUIAAuth() = this is Failure.ServerError &&
+ error.code == MatrixError.M_FORBIDDEN &&
+ error.flows != null
-fun Throwable.isHomeserverUnavailable(): Boolean {
- return this is Failure.NetworkConnection &&
- this.ioException is UnknownHostException
-}
+fun Throwable.isHomeserverUnavailable() = this is Failure.NetworkConnection &&
+ this.ioException is UnknownHostException
/**
* Try to convert to a RegistrationFlowResponse. Return null in the cases it's not possible
@@ -135,13 +116,11 @@ fun Throwable.toRegistrationFlowResponse(): RegistrationFlowResponse? {
}
}
-fun Throwable.isRegistrationAvailabilityError(): Boolean {
- return this is Failure.ServerError &&
- httpCode == HttpsURLConnection.HTTP_BAD_REQUEST && /* 400 */
- (error.code == MatrixError.M_USER_IN_USE ||
- error.code == MatrixError.M_INVALID_USERNAME ||
- error.code == MatrixError.M_EXCLUSIVE)
-}
+fun Throwable.isRegistrationAvailabilityError() = this is Failure.ServerError &&
+ httpCode == HttpsURLConnection.HTTP_BAD_REQUEST && /* 400 */
+ (error.code == MatrixError.M_USER_IN_USE ||
+ error.code == MatrixError.M_INVALID_USERNAME ||
+ error.code == MatrixError.M_EXCLUSIVE)
/**
* Try to convert to a ScanFailure. Return null in the cases it's not possible
From aca653170f90d4da626965ccaaf40bde28ad8795 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 14 Apr 2022 23:08:23 +0000
Subject: [PATCH 133/198] Bump dokka-gradle-plugin from 1.6.10 to 1.6.20
Bumps dokka-gradle-plugin from 1.6.10 to 1.6.20.
---
updated-dependencies:
- dependency-name: org.jetbrains.dokka:dokka-gradle-plugin
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index 89e7445974..cc08d54908 100644
--- a/build.gradle
+++ b/build.gradle
@@ -22,7 +22,7 @@ buildscript {
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5'
classpath "com.likethesalad.android:stem-plugin:2.0.0"
classpath 'org.owasp:dependency-check-gradle:7.0.4.1'
- classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.6.10"
+ classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.6.20"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
From b6f345aec2ed862f30f04005f3a162d99c5fb644 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Fri, 15 Apr 2022 10:18:30 +0200
Subject: [PATCH 134/198] Format
---
.../android/sdk/api/session/room/timeline/TimelineSettings.kt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineSettings.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineSettings.kt
index 6548453c8a..b45f3ecb71 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineSettings.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineSettings.kt
@@ -31,7 +31,8 @@ data class TimelineSettings(
/**
* The root thread eventId if this is a thread timeline, or null if this is NOT a thread timeline
*/
- val rootThreadEventId: String? = null) {
+ val rootThreadEventId: String? = null,
+) {
/**
* Returns true if this is a thread timeline or false otherwise
From ff28cb434937480b63c32ee11cc18854de441fe1 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Fri, 15 Apr 2022 10:41:09 +0200
Subject: [PATCH 135/198] Add TODO
---
.../sdk/api/session/room/timeline/TimelineEventFilters.kt | 1 +
1 file changed, 1 insertion(+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEventFilters.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEventFilters.kt
index 4415c8e4b3..a35a291d9b 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEventFilters.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEventFilters.kt
@@ -16,6 +16,7 @@
package org.matrix.android.sdk.api.session.room.timeline
+// TODO Move to internal, strange?
data class TimelineEventFilters(
/**
* A flag to filter edit events
From 6ed1516d90dc7567fa69db2509739f71f5ff9326 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Fri, 15 Apr 2022 10:57:04 +0200
Subject: [PATCH 136/198] Delete messages from just ignored users from our
database (#1899)
---
.../sync/handler/UserAccountDataSyncHandler.kt | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
index 7f80486c70..c7d7dce17a 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
@@ -39,6 +39,8 @@ import org.matrix.android.sdk.internal.database.model.IgnoredUserEntity
import org.matrix.android.sdk.internal.database.model.PushRulesEntity
import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
import org.matrix.android.sdk.internal.database.model.RoomSummaryEntityFields
+import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
+import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
import org.matrix.android.sdk.internal.database.model.UserAccountDataEntity
import org.matrix.android.sdk.internal.database.model.UserAccountDataEntityFields
import org.matrix.android.sdk.internal.database.model.deleteOnCascade
@@ -189,7 +191,19 @@ internal class UserAccountDataSyncHandler @Inject constructor(
.deleteAllFromRealm()
// And save the new received list
userIds.forEach { realm.createObject(IgnoredUserEntity::class.java).apply { userId = it } }
- // TODO If not initial sync, we should execute a init sync
+
+ // Delete all the TimelineEvents for all the ignored users
+ // See https://spec.matrix.org/latest/client-server-api/#client-behaviour-22 :
+ // "Once ignored, the client will no longer receive events sent by that user, with the exception of state events"
+ // So just delete all non-state events from our local storage.
+ realm.where(TimelineEventEntity::class.java)
+ .`in`(TimelineEventEntityFields.ROOT.SENDER, userIds.toTypedArray())
+ .isNull(TimelineEventEntityFields.ROOT.STATE_KEY)
+ .findAll()
+ .also { Timber.d("Deleting ${it.size} TimelineEventEntity from ignored users") }
+ .forEach {
+ it.deleteOnCascade(true)
+ }
}
private fun handleBreadcrumbs(realm: Realm, event: UserAccountDataEvent) {
From 6b9f2965da790a887e5d45a1085d1ac9c4c00a7f Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Fri, 15 Apr 2022 12:07:28 +0200
Subject: [PATCH 137/198] Request an initial sync when a user is unignored
(#1899)
---
.../android/sdk/api/failure/GlobalError.kt | 5 +++
.../api/failure/InitialSyncRequestReason.kt | 27 ++++++++++++++++
.../matrix/android/sdk/api/session/Session.kt | 1 +
.../handler/UserAccountDataSyncHandler.kt | 32 ++++++++++++++++---
.../app/core/platform/VectorBaseActivity.kt | 20 ++++++++++++
vector/src/main/res/values/strings.xml | 3 ++
6 files changed, 84 insertions(+), 4 deletions(-)
create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/InitialSyncRequestReason.kt
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt
index b5165b6687..5b4896f95f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt
@@ -23,5 +23,10 @@ sealed class GlobalError {
data class InvalidToken(val softLogout: Boolean) : GlobalError()
data class ConsentNotGivenError(val consentUri: String) : GlobalError()
data class CertificateError(val fingerprint: Fingerprint) : GlobalError()
+
+ /**
+ * The SDK requires the app (which should request the user) to perform an initial sync.
+ */
+ data class InitialSyncRequest(val reason: InitialSyncRequestReason) : GlobalError()
object ExpiredAccount : GlobalError()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/InitialSyncRequestReason.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/InitialSyncRequestReason.kt
new file mode 100644
index 0000000000..5717f41f43
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/InitialSyncRequestReason.kt
@@ -0,0 +1,27 @@
+/*
+ * 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 org.matrix.android.sdk.api.failure
+
+/**
+ * This enum provide the reason why the SDK request an initial sync to the application
+ */
+enum class InitialSyncRequestReason {
+ /**
+ * The list of ignored users has changed, and at least one user who was ignored is not ignored anymore
+ */
+ IGNORED_USERS_LIST_CHANGE,
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
index be924e2063..2ad0ae9e0d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
@@ -298,6 +298,7 @@ interface Session :
* Possible cases:
* - The access token is not valid anymore,
* - a M_CONSENT_NOT_GIVEN error has been received from the homeserver
+ * See [GlobalError] for all the possible cases
*/
fun onGlobalError(session: Session, globalError: GlobalError) = Unit
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
index c7d7dce17a..ce827c2311 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
@@ -20,6 +20,8 @@ import com.zhuinden.monarchy.Monarchy
import io.realm.Realm
import io.realm.RealmList
import io.realm.kotlin.where
+import org.matrix.android.sdk.api.failure.GlobalError
+import org.matrix.android.sdk.api.failure.InitialSyncRequestReason
import org.matrix.android.sdk.api.pushrules.RuleScope
import org.matrix.android.sdk.api.pushrules.RuleSetKey
import org.matrix.android.sdk.api.pushrules.rest.GetPushRulesResponse
@@ -31,6 +33,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.sync.model.InvitedRoomSync
import org.matrix.android.sdk.api.session.sync.model.UserAccountDataSync
+import org.matrix.android.sdk.internal.SessionManager
import org.matrix.android.sdk.internal.database.mapper.ContentMapper
import org.matrix.android.sdk.internal.database.mapper.PushRulesMapper
import org.matrix.android.sdk.internal.database.mapper.asDomain
@@ -48,7 +51,10 @@ import org.matrix.android.sdk.internal.database.query.getDirectRooms
import org.matrix.android.sdk.internal.database.query.getOrCreate
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
+import org.matrix.android.sdk.internal.di.SessionId
import org.matrix.android.sdk.internal.di.UserId
+import org.matrix.android.sdk.internal.session.SessionListeners
+import org.matrix.android.sdk.internal.session.dispatchTo
import org.matrix.android.sdk.internal.session.room.RoomAvatarResolver
import org.matrix.android.sdk.internal.session.room.membership.RoomDisplayNameResolver
import org.matrix.android.sdk.internal.session.room.membership.RoomMemberHelper
@@ -67,7 +73,10 @@ internal class UserAccountDataSyncHandler @Inject constructor(
private val directChatsHelper: DirectChatsHelper,
private val updateUserAccountDataTask: UpdateUserAccountDataTask,
private val roomAvatarResolver: RoomAvatarResolver,
- private val roomDisplayNameResolver: RoomDisplayNameResolver
+ private val roomDisplayNameResolver: RoomDisplayNameResolver,
+ @SessionId private val sessionId: String,
+ private val sessionManager: SessionManager,
+ private val sessionListeners: SessionListeners
) {
fun handle(realm: Realm, accountData: UserAccountDataSync?) {
@@ -186,9 +195,10 @@ internal class UserAccountDataSyncHandler @Inject constructor(
private fun handleIgnoredUsers(realm: Realm, event: UserAccountDataEvent) {
val userIds = event.content.toModel()?.ignoredUsers?.keys ?: return
- realm.where(IgnoredUserEntity::class.java)
- .findAll()
- .deleteAllFromRealm()
+ val currentIgnoredUsers = realm.where(IgnoredUserEntity::class.java).findAll()
+ val currentIgnoredUserIds = currentIgnoredUsers.map { it.userId }
+ // Delete the previous list
+ currentIgnoredUsers.deleteAllFromRealm()
// And save the new received list
userIds.forEach { realm.createObject(IgnoredUserEntity::class.java).apply { userId = it } }
@@ -204,6 +214,20 @@ internal class UserAccountDataSyncHandler @Inject constructor(
.forEach {
it.deleteOnCascade(true)
}
+
+ // Handle the case when some users are unignored from another session
+ val mustRefreshCache = currentIgnoredUserIds.any { currentIgnoredUserId -> currentIgnoredUserId !in userIds }
+ if (mustRefreshCache) {
+ Timber.d("A user has been unignored from another session, an initial sync should be performed")
+ dispatchMustRefresh()
+ }
+ }
+
+ private fun dispatchMustRefresh() {
+ val session = sessionManager.getSessionComponent(sessionId)?.session()
+ session.dispatchTo(sessionListeners) { safeSession, listener ->
+ listener.onGlobalError(safeSession, GlobalError.InitialSyncRequest(InitialSyncRequestReason.IGNORED_USERS_LIST_CHANGE))
+ }
}
private fun handleBreadcrumbs(realm: Realm, event: UserAccountDataEvent) {
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 4796022856..febcfc5ef2 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
@@ -46,6 +46,7 @@ import androidx.viewbinding.ViewBinding
import com.airbnb.mvrx.MavericksView
import com.bumptech.glide.util.Util
import com.google.android.material.appbar.MaterialToolbar
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.EntryPointAccessors
import im.vector.app.BuildConfig
@@ -86,6 +87,7 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.failure.GlobalError
+import org.matrix.android.sdk.api.failure.InitialSyncRequestReason
import reactivecircus.flowbinding.android.view.clicks
import timber.log.Timber
import javax.inject.Inject
@@ -266,9 +268,27 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver
is GlobalError.CertificateError ->
handleCertificateError(globalError)
GlobalError.ExpiredAccount -> Unit // TODO Handle account expiration
+ is GlobalError.InitialSyncRequest -> handleInitialSyncRequest(globalError)
}
}
+ private fun handleInitialSyncRequest(initialSyncRequest: GlobalError.InitialSyncRequest) {
+ MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.initial_sync_request_title)
+ .setMessage(
+ getString(R.string.initial_sync_request_content, getString(
+ when (initialSyncRequest.reason) {
+ InitialSyncRequestReason.IGNORED_USERS_LIST_CHANGE -> R.string.initial_sync_request_reason_unignored_users
+ }
+ ))
+ )
+ .setPositiveButton(R.string.ok) { _, _ ->
+ MainActivity.restartApp(this, MainActivityArgs(clearCache = true))
+ }
+ .setNegativeButton(R.string.later, null)
+ .show()
+ }
+
private fun handleCertificateError(certificateError: GlobalError.CertificateError) {
singletonEntryPoint()
.unrecognizedCertificateDialog()
diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
index ffd4333071..89ed125afd 100644
--- a/vector/src/main/res/values/strings.xml
+++ b/vector/src/main/res/values/strings.xml
@@ -176,6 +176,9 @@
Initial sync:\nImporting communitiesInitial sync:\nImporting account data
+ Initial sync request
+ ${app_name} needs to perform a clear cache to be up to date, for the following reason:\n%s\n\nNote that this action will restart the app and it may take some time.
+ - Some users have been unignoredMessage sentSending message…
From a39516534ac5c8b5d852902c0d6407496194d80c Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Fri, 15 Apr 2022 12:43:57 +0200
Subject: [PATCH 138/198] Initial sync dialog will now come later. It allows to
unignore several user without performing an initial sync each time.
---
.../app/features/home/room/detail/TimelineFragment.kt | 10 ++--------
.../roommemberprofile/RoomMemberProfileFragment.kt | 11 +----------
.../roommemberprofile/RoomMemberProfileViewEvents.kt | 2 +-
.../roommemberprofile/RoomMemberProfileViewModel.kt | 2 +-
.../ignored/VectorSettingsIgnoredUsersFragment.kt | 7 +------
vector/src/main/res/values/strings.xml | 4 ++--
6 files changed, 8 insertions(+), 28 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
index 32f0e46eac..4603793bd5 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
@@ -119,8 +119,6 @@ import im.vector.app.core.utils.startInstallFromSourceIntent
import im.vector.app.core.utils.toast
import im.vector.app.databinding.DialogReportContentBinding
import im.vector.app.databinding.FragmentTimelineBinding
-import im.vector.app.features.MainActivity
-import im.vector.app.features.MainActivityArgs
import im.vector.app.features.analytics.extensions.toAnalyticsInteraction
import im.vector.app.features.analytics.plan.Interaction
import im.vector.app.features.analytics.plan.MobileScreen
@@ -1730,14 +1728,10 @@ class TimelineFragment @Inject constructor(
dismissLoadingDialog()
views.composerLayout.setTextIfDifferent("")
when (parsedCommand) {
- is ParsedCommand.SetMarkdown -> {
+ is ParsedCommand.SetMarkdown -> {
showSnackWithMessage(getString(if (parsedCommand.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
}
- is ParsedCommand.UnignoreUser -> {
- // A user has been un-ignored, perform a initial sync
- MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
- }
- else -> Unit
+ else -> Unit
}
}
diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
index 5fee420b21..760bbe9353 100644
--- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
@@ -47,8 +47,6 @@ import im.vector.app.databinding.DialogBaseEditTextBinding
import im.vector.app.databinding.DialogShareQrCodeBinding
import im.vector.app.databinding.FragmentMatrixProfileBinding
import im.vector.app.databinding.ViewStubRoomMemberProfileHeaderBinding
-import im.vector.app.features.MainActivity
-import im.vector.app.features.MainActivityArgs
import im.vector.app.features.analytics.plan.MobileScreen
import im.vector.app.features.crypto.verification.VerificationBottomSheet
import im.vector.app.features.displayname.getBestName
@@ -133,20 +131,13 @@ class RoomMemberProfileFragment @Inject constructor(
is RoomMemberProfileViewEvents.OnKickActionSuccess -> Unit
is RoomMemberProfileViewEvents.OnSetPowerLevelSuccess -> Unit
is RoomMemberProfileViewEvents.OnBanActionSuccess -> Unit
- is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> handleOnIgnoreActionSuccess(it)
+ is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit
is RoomMemberProfileViewEvents.OnInviteActionSuccess -> Unit
}
}
setupLongClicks()
}
- private fun handleOnIgnoreActionSuccess(action: RoomMemberProfileViewEvents.OnIgnoreActionSuccess) {
- if (action.shouldPerformInitialSync) {
- // A user has been un-ignored, perform a initial sync
- MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
- }
- }
-
private fun setupLongClicks() {
headerViews.memberProfileNameView.copyOnLongClick()
headerViews.memberProfileIdView.copyOnLongClick()
diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewEvents.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewEvents.kt
index 1857f5cdc4..efe23eeff0 100644
--- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewEvents.kt
+++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewEvents.kt
@@ -25,7 +25,7 @@ sealed class RoomMemberProfileViewEvents : VectorViewEvents {
data class Loading(val message: CharSequence? = null) : RoomMemberProfileViewEvents()
data class Failure(val throwable: Throwable) : RoomMemberProfileViewEvents()
- data class OnIgnoreActionSuccess(val shouldPerformInitialSync: Boolean) : RoomMemberProfileViewEvents()
+ object OnIgnoreActionSuccess : RoomMemberProfileViewEvents()
object OnSetPowerLevelSuccess : RoomMemberProfileViewEvents()
object OnInviteActionSuccess : RoomMemberProfileViewEvents()
object OnKickActionSuccess : RoomMemberProfileViewEvents()
diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
index addc2c71ef..4bcf9ef55d 100644
--- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt
@@ -390,7 +390,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor(
} else {
session.ignoreUserIds(listOf(state.userId))
}
- RoomMemberProfileViewEvents.OnIgnoreActionSuccess(isIgnored)
+ RoomMemberProfileViewEvents.OnIgnoreActionSuccess
} catch (failure: Throwable) {
RoomMemberProfileViewEvents.Failure(failure)
}
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
index 66fa690b82..2ae7ba0a8d 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
@@ -62,16 +62,11 @@ class VectorSettingsIgnoredUsersFragment @Inject constructor(
when (it) {
is IgnoredUsersViewEvents.Loading -> showLoading(it.message)
is IgnoredUsersViewEvents.Failure -> showFailure(it.throwable)
- IgnoredUsersViewEvents.Success -> handleSuccess()
+ IgnoredUsersViewEvents.Success -> Unit
}
}
}
- private fun handleSuccess() {
- // A user has been un-ignored, perform a initial sync
- MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
- }
-
override fun onDestroyView() {
ignoredUsersController.callback = null
views.genericRecyclerView.cleanup()
diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
index 89ed125afd..1a9634ff90 100644
--- a/vector/src/main/res/values/strings.xml
+++ b/vector/src/main/res/values/strings.xml
@@ -637,7 +637,7 @@
IgnoreUnignore user
- Unignoring this user will show all messages from them again.\n\nNote that this action will restart the app and it may take some time.
+ Unignoring this user will show all messages from them again.UnignoreCancel invite
@@ -1035,7 +1035,7 @@
Failed to update passwordThe password is not validYour password has been updated
- Show all messages from %s?\n\nNote that this action will restart the app and it may take some time.
+ Show all messages from %s?Emails and phone numbersManage emails and phone numbers linked to your Matrix account
From cdcf57659fcb58071941cbaf9f79ca345ad54fda Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Fri, 15 Apr 2022 12:53:40 +0200
Subject: [PATCH 139/198] Do not update the cache manually, else the initial
sync request will not be triggered.
---
.../sdk/internal/session/user/UserModule.kt | 5 --
.../user/accountdata/SaveIgnoredUsersTask.kt | 47 -------------------
.../accountdata/UpdateIgnoredUserIdsTask.kt | 4 --
3 files changed, 56 deletions(-)
delete mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/SaveIgnoredUsersTask.kt
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserModule.kt
index 4dfc7586ae..c205c4f1c6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserModule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserModule.kt
@@ -21,9 +21,7 @@ import dagger.Module
import dagger.Provides
import org.matrix.android.sdk.api.session.user.UserService
import org.matrix.android.sdk.internal.session.SessionScope
-import org.matrix.android.sdk.internal.session.user.accountdata.DefaultSaveIgnoredUsersTask
import org.matrix.android.sdk.internal.session.user.accountdata.DefaultUpdateIgnoredUserIdsTask
-import org.matrix.android.sdk.internal.session.user.accountdata.SaveIgnoredUsersTask
import org.matrix.android.sdk.internal.session.user.accountdata.UpdateIgnoredUserIdsTask
import org.matrix.android.sdk.internal.session.user.model.DefaultSearchUserTask
import org.matrix.android.sdk.internal.session.user.model.SearchUserTask
@@ -48,9 +46,6 @@ internal abstract class UserModule {
@Binds
abstract fun bindSearchUserTask(task: DefaultSearchUserTask): SearchUserTask
- @Binds
- abstract fun bindSaveIgnoredUsersTask(task: DefaultSaveIgnoredUsersTask): SaveIgnoredUsersTask
-
@Binds
abstract fun bindUpdateIgnoredUserIdsTask(task: DefaultUpdateIgnoredUserIdsTask): UpdateIgnoredUserIdsTask
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/SaveIgnoredUsersTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/SaveIgnoredUsersTask.kt
deleted file mode 100644
index 63c0ce645e..0000000000
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/SaveIgnoredUsersTask.kt
+++ /dev/null
@@ -1,47 +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.user.accountdata
-
-import com.zhuinden.monarchy.Monarchy
-import org.matrix.android.sdk.internal.database.model.IgnoredUserEntity
-import org.matrix.android.sdk.internal.di.SessionDatabase
-import org.matrix.android.sdk.internal.task.Task
-import org.matrix.android.sdk.internal.util.awaitTransaction
-import javax.inject.Inject
-
-/**
- * Save the ignored users list in DB
- */
-internal interface SaveIgnoredUsersTask : Task {
- data class Params(
- val userIds: List
- )
-}
-
-internal class DefaultSaveIgnoredUsersTask @Inject constructor(@SessionDatabase private val monarchy: Monarchy) : SaveIgnoredUsersTask {
-
- override suspend fun execute(params: SaveIgnoredUsersTask.Params) {
- monarchy.awaitTransaction { realm ->
- // clear current ignored users
- realm.where(IgnoredUserEntity::class.java)
- .findAll()
- .deleteAllFromRealm()
-
- // And save the new received list
- params.userIds.forEach { realm.createObject(IgnoredUserEntity::class.java).apply { userId = it } }
- }
- }
-}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UpdateIgnoredUserIdsTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UpdateIgnoredUserIdsTask.kt
index 445b78104c..173161f8ae 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UpdateIgnoredUserIdsTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UpdateIgnoredUserIdsTask.kt
@@ -38,7 +38,6 @@ internal interface UpdateIgnoredUserIdsTask : Task
Date: Fri, 15 Apr 2022 13:06:53 +0200
Subject: [PATCH 140/198] ktlint
---
.../settings/ignored/VectorSettingsIgnoredUsersFragment.kt | 2 --
1 file changed, 2 deletions(-)
diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
index 2ae7ba0a8d..3cb1e29016 100644
--- a/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/ignored/VectorSettingsIgnoredUsersFragment.kt
@@ -30,8 +30,6 @@ import im.vector.app.core.extensions.cleanup
import im.vector.app.core.extensions.configureWith
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentGenericRecyclerBinding
-import im.vector.app.features.MainActivity
-import im.vector.app.features.MainActivityArgs
import im.vector.app.features.analytics.plan.MobileScreen
import javax.inject.Inject
From a50bf4582caf5b68ac7662cc9a3a32ece8a1cce1 Mon Sep 17 00:00:00 2001
From: Benoit Marty
Date: Fri, 15 Apr 2022 13:14:03 +0200
Subject: [PATCH 141/198] Move "Ignored users" setting section into "Security &
Privacy", as per Element Web
---
.../src/main/res/values/config-settings.xml | 5 ++---
vector/src/main/res/xml/vector_settings_root.xml | 6 ------
.../res/xml/vector_settings_security_privacy.xml | 13 +++++++++++++
3 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/vector-config/src/main/res/values/config-settings.xml b/vector-config/src/main/res/values/config-settings.xml
index b6d1c6676c..0a4da4c98e 100755
--- a/vector-config/src/main/res/values/config-settings.xml
+++ b/vector-config/src/main/res/values/config-settings.xml
@@ -13,7 +13,6 @@
truetruetrue
- truetruetruetrue
@@ -33,10 +32,10 @@
-
-
+ true
+
false
diff --git a/vector/src/main/res/xml/vector_settings_root.xml b/vector/src/main/res/xml/vector_settings_root.xml
index 744694cf5f..0c50083d53 100644
--- a/vector/src/main/res/xml/vector_settings_root.xml
+++ b/vector/src/main/res/xml/vector_settings_root.xml
@@ -32,12 +32,6 @@
app:fragment="im.vector.app.features.settings.VectorSettingsVoiceVideoFragment"
app:isPreferenceVisible="@bool/settings_root_voice_video_visible" />
-
-
+
+
+
+
+
+
From d24ba65b5bb5b43693a9547d4b138bb579b8a098 Mon Sep 17 00:00:00 2001
From: ariskotsomitopoulos
Date: Fri, 15 Apr 2022 14:18:38 +0300
Subject: [PATCH 142/198] Enhance user experience when home servers do not
support threads.
---
changelog.d/5761.feature | 1 +
.../action/MessageActionsViewModel.kt | 4 ++
.../home/room/threads/ThreadsManager.kt | 11 +++-
.../settings/VectorSettingsLabsFragment.kt | 57 ++++++++++++++++---
vector/src/main/res/values/strings.xml | 3 +
5 files changed, 66 insertions(+), 10 deletions(-)
create mode 100644 changelog.d/5761.feature
diff --git a/changelog.d/5761.feature b/changelog.d/5761.feature
new file mode 100644
index 0000000000..3d30864e24
--- /dev/null
+++ b/changelog.d/5761.feature
@@ -0,0 +1 @@
+Improve user experience when home servers do not yet support threads
\ No newline at end of file
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt
index 9a73afd897..99c36d1190 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt
@@ -452,6 +452,10 @@ class MessageActionsViewModel @AssistedInject constructor(
actionPermissions: ActionPermissions): Boolean {
// We let reply in thread visible even if threads are not enabled, with an enhanced flow to attract users
// if (!vectorPreferences.areThreadMessagesEnabled()) return false
+ // Disable beta prompt if the homeserver do not support threads
+ if (!vectorPreferences.areThreadMessagesEnabled() &&
+ !session.getHomeServerCapabilities().canUseThreading) return false
+
if (initialState.isFromThreadTimeline) return false
if (event.root.isThread()) return false
if (event.root.getClearType() != EventType.MESSAGE &&
diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt
index 29f7df2439..545077b550 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt
@@ -18,6 +18,7 @@ package im.vector.app.features.home.room.threads
import android.app.Activity
import android.text.Spanned
+import androidx.annotation.StringRes
import androidx.core.text.HtmlCompat
import im.vector.app.R
import im.vector.app.core.resources.StringProvider
@@ -49,11 +50,17 @@ class ThreadsManager @Inject constructor(
/**
* Generates and return an Html spanned string to be rendered especially in dialogs
*/
- fun getBetaEnableThreadsMessage(): Spanned {
+ private fun generateLearnMoreHtmlString(@StringRes messageId: Int): Spanned {
val learnMore = stringProvider.getString(R.string.action_learn_more)
val learnMoreUrl = stringProvider.getString(R.string.threads_learn_more_url)
val href = "$learnMore.