\n${app_name} DesktopAtur kata sandi akun baru…Tidak dapat menyimpan file media
- Mengaktifkan pengaturan ini menambahkan FLAG_SECURE ke semua Aktifitas. Mulai ulang aplikasi ini untuk berpengaruh pada perubahannya.
+ Mengaktifkan pengaturan ini menambahkan FLAG_SECURE ke semua Aktivitas. Mulai ulang aplikasi ini untuk berpengaruh pada perubahannya.Mencegah tangkapan layar dari aplikasiKunci pemulihan kunci cadanganTidak tahu Kunci Frasa Sandi Cadangan, Anda dapat %s.
diff --git a/vector/src/main/res/values-is/strings.xml b/vector/src/main/res/values-is/strings.xml
index 07fe4b55be..ee34c9e314 100644
--- a/vector/src/main/res/values-is/strings.xml
+++ b/vector/src/main/res/values-is/strings.xml
@@ -4,9 +4,9 @@
%1$s bauð %2$s%1$s bauð þér%1$s gekk í hópinn
- %1$s hætti
+ %1$s hætti í spjallrásinni%1$s hafnaði boðinu
- %1$s sparkaði %2$s
+ %1$s fjarlægði %2$s%1$s afbannaði %2$s%1$s bannaði %2$s%1$s breyttu auðkennismynd sinni
@@ -20,10 +20,10 @@
Villa í MatrixTölvupóstfangSímanúmer
- %1$s tók til baka boð frá %2$s
+ %1$s tók til baka boð til %2$s%1$s setti birtingarnafn sitt sem %2$s%1$s breytti birtingarnafni sínu úr %2$s í %3$s
- %1$s fjarlægði birtingarnafn sitt (%2$s)
+ %1$s fjarlægði birtingarnafn sitt (sem var %2$s)%1$s breytti umræðuefninu í: %2$s%1$s breytti heiti spjallrásarinnar í: %2$s%s hringdi myndsamtal.
@@ -38,7 +38,6 @@
Tæki sendandans hefur ekki sent okkur dulritunarlyklana fyrir þessi skilaboð.Boð á spjallrás%1$s og %2$s
-
Tóm spjallrásLjóst þemaDökkt þema
@@ -80,7 +79,6 @@
SamtölEngar niðurstöðurSpjallrásir
-
Senda atvikaskráSenda hrunskrárSenda skjámynd
@@ -121,14 +119,13 @@
Taka þáttHafnaListi yfir meðlimi
-
%d meðlimur%d meðlimirFara af spjallrás
- Ertu viss um að þú viljir fara út spjallrásinni?
- BEINT SPJALL
+ Ertu viss um að þú viljir fara úr spjallrásinni\?
+ Bein skilaboðBjóða%s er að skrifa…%1$s & %2$s eru að skrifa…
@@ -145,7 +142,6 @@
LeitaSía meðlimi spjallrásarEngar niðurstöður
-
Öll skilaboðNotandamyndBirtingarnafn
@@ -180,7 +176,7 @@
Veldu tungumálBreyta lykilorðieldra lykilorð
- nýtt lykilorð
+ Nýtt lykilorðMistókst að uppfæra lykilorðLykilorðið þitt hefur verið uppfærtSýna öll skilaboð frá %s\?
@@ -199,10 +195,10 @@
ÞemaAfkóðunarvillaHeiti tækis
- Auðkenni tækis
+ Auðkenni setuDulritunarlykill tækisFlytja út
- Settu inn lykilsetningu (passphrase)
+ Settu inn lykilsetninguStaðfestu lykilsetninguFlytja innSannreyna
@@ -270,19 +266,18 @@
Þér hefur verið sparkað úr %1$s af %2$sÞú hefur verið settur í bann á %1$s af %2$sTilraunir
- Klaga efni
+ Kæra efniSlóð á heimaþjónErtu viss að þú viljir byrja raddsamtal?Ertu viss að þú viljir byrja myndsamtal?
- Fara í fyrstu ólesin skilaboð.
+ Fara í ólesiðBannaAfbannaFela öll skilaboð frá þessum notandaSýna öll skilaboð frá þessum notanda
- Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás
+ Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás.Gat ekki sannreynt auðkenni fjartengds þjóns.
-
- Bæta við flýtileið á aðalskjá
+ Bæta við á upphafsskjáHljóð með tilkynninguVirkja tilkynningar fyrir þennan notandaaðgangVirkja tilkynningar á þessu tæki
@@ -294,7 +289,6 @@
Heimildir fyrir tengiliðiAlltaf birta tímamerki skilaboðaBirta tímamerki á 12 stunda sniði (t.d. 2:30 fh)
-
HeimaþjónnAuðkennisþjónnÞetta tölvupóstfang er nú þegar í notkun.
@@ -304,18 +298,16 @@
Einungis meðlimir (síðan þeir skráðu sig)Innra auðkenni þessarar spjallrásarVeldu skrá yfir spjallrásir
- URL-slóð heimaþjóns
+ Heiti heimaþjóns%d ólesið tilkynnt skilaboð%d ólesin tilkynnt skilaboð
-
Ertu viss um að þú viljir eyða viðmótshlutanum?Gat ekki búið til viðmótshluta.Mistókst að senda beiðni.Boðið
- Bönun notanda mun henda þeim út úr þessu herbergi og halda þeim frá því að koma aftur.
-
+ Bann á notanda mun henda honum út af þessari spjallrás og koma í veg fyrir að viðkomandi komi aftur.Skilaboð innihalda birtingarnafn mittSkilaboð innihalda notandanafn mittSkilaboð í maður-á-mann spjalli
@@ -332,10 +324,8 @@
Þú getur ekki afturkallað þessa aðgerð, þar sem þú ert að gefa notandanum jafn mikil völd og þú hefur sjálf/ur.
\nErtu alveg viss\?Hlé milli tveggja samstillingarbeiðna
- Halda gögnum
+ Halda myndefniSkoðaðu tölvupóstinn þinn og smelltu á tengilinn sem hann inniheldur. Þegar því er lokið skaltu smella á að halda áfram.
-
-
Aðeins dulrita til sannvottaðra tækjaAldrei senda dulrituð skilaboð af þessu tæki til ósannvottaðra tækja.Völd verða að vera jákvæð heiltala.
@@ -344,36 +334,1210 @@
Vantar spjallrásarauðkenni í beiðni.Vantar notandaauðkenni í beiðni.Senda límmerki
-
Ekki var svarað á fjartengda endanum.
-
-
${app_name} þarf heimild til að nota hljóðnemann svo hægt sé að hringja hljóðsímtöl.
-
${app_name} þarf heimild til að nota myndavélina og hljóðnemann svo hægt sé að hringja myndsímtöl.
\n
\nLeyfðu aðgang í næstu sprettgluggum til þess að geta hringt.
-
-
Gera notandaaðgang óvirkannGera notandaaðganginn minn óvirkannSenda greiningargögnYfirfara núnaGera notandaaðgang óvirkannGera notandaaðgang óvirkann
-
Lýstu villunni. Hvað varstu að gera? Hverju áttirðu von á? Hvað gerðist í raun?Til að geta greint vandamál eru atvikaskrár þessa forrits sendar með þessari villuskýrslu. Ef þú vilt einungis senda textann hér fyrir ofan, taktu þá gátmerkið úr reitnum:Það er eins og þú sért að hrista símann ákveðið. Myndirðu vilja senda villuskýrslu?Forritið hrundi síðast. Myndirðu vilja senda inn villuskýrslu?Senda límmerki${app_name} safnar nafnlausum greiningargögnum til að gera okkur kleift að bæta forritið.
- Heimaskjár
+ UpphafsskjárFesta spjallrásir með óskoðuðum tilkynningumFesta spjallrásir með ólesnum skilaboðumSjálfgefið virkja forskoðun innfelldra vefslóðaÞetta eru eiginleikar á tilraunastigi sem gætu bilað á óvæntan hátt. Notist með varúð.Setja sem aðalvistfang
- Ekki setja sem aðalvistfang
+ Ekki hafa sem aðalvistfangNauðsynlegt gildi vantar.
+ Þú getur slökkt á þessu hvenær sem er í stillingunum
+ Dulrituð skilaboð í hópaspjalli
+ Dulrituð skilaboð í maður-á-mann spjalli
+ Upphaf samstillingar:
+\nHleð inn samtölunum þínum
+\nÞetta getur tekið dálítinn tíma ef þú tekur þátt í mörgum spjallrásum
+ Aðeins fólk sem hefur verið boðið getur fundið og tekið þátt
+ Einka (einungis gegn boði)
+ Þú getur sýsla- með tilkynningar í %1$s.
+ Sjálfgefinn uppruni myndefnis
+ Sjálfgefin þjöppun
+ Sýslaðu með tölvupóstföng og símanúmer sem tengd eru við Matrix-aðganginn þinn
+ Tölvupóstföng og símanúmer
+ Lykilorðið er ekki gilt
+ Utanaðkomandi aðgerðasöfn
+ Hjálpaðu okkur að bæta ${app_name}
+ Sýsla með uppgötvunarstillingarnar þínar.
+ Smelltu á leskvittanir til að sjá ítarlegan lista.
+ Birta leskvittanir
+ Markdown-sníðing
+ Láttu aðra sjá að þú sért að skrifa.
+ Senda skriftilkynningar
+ Umsýsla dulritunarlykla
+ Dulrituð hópskilaboð
+ Dulrituð bein skilaboð
+ Bestun fyrir rafhlöðuendingu
+ Birting tilkynninga
+ Tilkynningar eru óvirkar í þessari setu.
+\nYfirfarðu stillingar í ${app_name}.
+ Tilkynningar eru virkar í þessari setu.
+ Tilkynningar eru óvirkar fyrir notandaaðganginn þinn.
+\nYfirfarðu stillingar aðgangsins.
+ Tilkynningar eru virkar fyrir notandaaðganginn þinn.
+ Tilkynningar eru óvirkar í kerfisstillingum.
+\nYfirfarðu kerfisstillingarnar.
+ Tilkynningar eru virkar í kerfisstillingum.
+ Í keyrslu (%1$d af %2$d)
+ Keyra prófanir
+ Greining á vandamálum
+ Leysa vandamál með tilkynningar
+ Stikkorð mega ekki innihalda \'%s\'
+ Stikkorð mega ekki byrja með \'.\'
+ Bæta við nýju stikkorði
+ Stikkorðin þín
+ Minnst á og stikkorð
+ Virkja tilkynningar í tölvupósti fyrir %s
+ Til að fá tilkynningar í tölvupósti, þarf að tengja tölvupóstfang við Matrix-aðganginn þinn
+ Tilkynning í tölvupósti
+ Mikilvægi tilkynninga eftir atburðum
+ Skráð út úr setunni!
+ Spjallrásin hefur verið yfirgefin!
+ Einungis þar sem er minnst á og stikkorð
+ Sía bannaða notendur
+ Úr spjallþræði
+ Ábending: Ýttu lengi á skilaboð og notaðu “%s”.
+ Spjallþræðir hjálpa til við að halda samræðum við efnið og gerir auðveldara að rekja þær.
+ Haltu umræðum skipulögðum með spjallþráðum
+ Birtir alla spjallþræði sem þú hefur tekið þátt í
+ Birtir alla spjallþræði úr fyrirliggjandi spjallrás
+ Spjallþræðirnir mínir
+ Allir spjallþræðir
+ Sía þræði spjallrásar
+ Heimildir spjallrásar
+ Þessi spjallrás er ekki opinber. Þú munt ekki geta tekið aftur þátt nema að vera boðið.
+ Gefa heimild til að fá aðgang að tengiliðunum þínum.
+ Til að skanna QR-kóða þarftu að veita aðgang að myndavélinni.
+ Lýk símtali…
+ Notandi upptekinn
+ Þú settir símtalið í bið
+ %s setti símtalið í bið
+ Raddsímtal við %s
+ Myndsamtal við %s
+ Myndsamtal í gangi…
+
+ Ósvarað myndsímtal
+ %d ósvöruð myndsímtöl
+
+
+ Ósvarað raddsímtal
+ %d ósvöruð raddsímtöl
+
+ Veldu hringitón fyrir símtöl:
+ Innhringitónn
+ Nota sjálfgefinn ${app_name} hringitón fyrir innhringingar
+ Biðja um staðfestingu áður en símtal er hafið
+ Koma í veg fyrir símtöl af slysni
+ Þetta símanúmer er nú þegar skráð.
+ Því miður, ekkert utankomandi forrit hefur fundist sem getur lokið þessari aðgerð.
+ Í augnablikinu ertu ekki með neina límmerkjapakka virkjaða.
+\n
+\nBæta einhverjum við núna\?
+ Veldu hljóðtæki
+ ${app_name} símtal mistókst
+ Senda tal
+ Slóð á API-kerfisviðmót heimaþjóns
+ Ef mögulegt, skaltu skrifa lýsinguna á ensku.
+ Sýna allar spjallrásir í spjallrásalistanum, þar með taldar spjallrásir með viðkvæmu efni.
+ Sýna spjallrásir með viðkvæmu efni
+ Aðvaranir kerfis
+ Afrita tengil á spjallþráð
+ Taka úr birtingu
+ Skoða spjallþræði
+ Mistókst að fjarlægja viðmótshluta
+ Mistókst að bæta við viðmótshluta
+ Þú getur ekki byrjað símtal með sjálfum þér, bíddu eftir að þátttakendur samþykki boðið
+ Þú getur ekki byrjað símtal með sjálfum þér
+ Til að senda talskilaboð þarf að gefa heimild fyrir hljóðnema.
+ Til að framkvæma þessa aðgerð þarf að gefa heimild fyrir myndavél í kerfisstillingum.
+ Það vantar heimildir til að framkvæma þessa aðgerð, það þarf að gefa viðkomandi heimildir í kerfisstillingum.
+ Hefja talfund
+ Hefja myndfund
+ Þú hefur ekki heimildir til að hefja símtal
+ Þú hefur ekki heimildir til að hefja símtal á þessari spjallrás
+ Þú hefur ekki heimildir til að hefja fjarfund
+ Þú hefur ekki heimildir til að hefja fjarfund á þessari spjallrás
+ Vantar heimildir
+ Þú munt missa aðgang að dulrituðu skilaboðunum þínum nema þú takir öryggisafrit af dulritunarlyklum áður en þú skráir þig út.
+ Öryggisafritun dulritunarlykla í gangi. Þú munt tapa dulrituðu skilaboðunum þínum ef þú skráir þig út núna.
+ Þú munt tapa dulrituðu skilaboðunum þínum ef þú skráir þig út núna
+ Þú kveiktir á enda-í-enda dulritun.
+ %1$s kveikti á enda-í-enda dulritun.
+ Taka öryggisafrit
+ Öryggisafrita dulritunarlykla…
+ Ég vil ekki dulrituðu skilaboðin mín
+ Nota öryggisafrit af lykli
+ Hlusta eftir tilkynningum
+ Þú kveiktir á enda-í-enda dulritun (óþekkt algrími %1$s).
+ %1$s kveikti á enda-í-enda dulritun (óþekkt algrími %2$s).
+ Þú hefur bannað gestum að koma inn á spjallrásina.
+ %1$s hefur bannað gestum að koma inn á spjallrásina.
+ Þú hefur bannað gestum að koma inn á spjallrásina.
+ %1$s hefur bannað gestum að koma inn á spjallrásina.
+ Þú hefur leyft gestum að koma inn hér.
+ %1$s hefur leyft gestum að koma inn hér.
+ Þú hefur leyft gestum að koma inn á spjallrásina.
+ %1$s hefur leyft gestum að koma inn á spjallrásina.
+
+ Þú fjarlægðir varavistfangið %1$s af þessari spjallrás.
+ Þú fjarlægðir varavistföngin %1$s af þessari spjallrás.
+
+
+ %1$s fjarlægði varavistfangið %2$s af þessari spjallrás.
+ %1$s fjarlægði varavistföngin %2$s af þessari spjallrás.
+
+
+ Þú bættir við varavistfanginu %1$s fyrir þessa spjallrás.
+ Þú bættir við varavistföngunum %1$s fyrir þessa spjallrás.
+
+
+ %1$s bætti við varavistfanginu %2$s fyrir þessa spjallrás.
+ %1$s bætti við varavistföngunum %2$s fyrir þessa spjallrás.
+
+ Þú tókst til baka boð til %1$s. Ástæða: %2$s
+ %1$s tók til baka boð til %2$s. Ástæða: %3$s
+ Þú samþykktir boð um að taka þátt í %1$s. Ástæða: %2$s
+ %1$s samþykkti boð um að taka þátt í %2$s. Ástæða: %3$s
+ Þú bannaðir %1$s. Ástæða: %2$s
+ %1$s bannaði %2$s. Ástæða: %3$s
+ Þú tókst %1$s úr banni. Ástæða: %2$s
+ %1$s tók %2$s úr banni. Ástæða: %3$s
+ Þú fjarlægðir %1$s. Ástæða: %2$s
+ %1$s fjarlægði %2$s. Ástæða: %3$s
+ Þú hafnaðir boðinu. Ástæða: %1$s
+ %1$s hafnaði boðinu. Ástæða: %2$s
+ Þú hættir. Ástæða: %1$s
+ %1$s hætti. Ástæða: %2$s
+ Þú yfirgafst spjallrásina. Ástæða: %1$s
+ %1$s yfirgaf spjallrásina. Ástæða: %2$s
+ Þú tekur þátt. Ástæða: %1$s
+ %1$s tekur þátt. Ástæða: %2$s
+ Þú komst inn á spjallrásina. Ástæða: %1$s
+ %1$s kom inn á spjallrásina. Ástæða: %2$s
+ %1$s bauð þér. Ástæða: %2$s
+ Þú bauðst %1$s. Ástæða: %2$s
+ %1$s bauð %2$s. Ástæða: %3$s
+ Boð um þátttöku til þín. Ástæða: %1$s
+ Boð um þátttöku til %1$s. Ástæða: %2$s
+ Upphaf samstillingar:
+\nFlyt inn gögn úr notandaaðgangi
+ Upphaf samstillingar:
+\nFlyt inn samfélög
+ Upphaf samstillingar:
+\nFlyt inn yfirgefnar spjallrásir
+ Upphaf samstillingar:
+\nFlyt inn boð í spjallrásir
+ Upphaf samstillingar:
+\nFlyt inn spjallrásir
+ Upphaf samstillingar:
+\nFlyt inn dulritunargögn
+ Upphaf samstillingar:
+\nFlyt inn notandaaðgang…
+ Upphaf samstillingar:
+\nSæki gögn…
+ Upphaf samstillingar:
+\nBíð eftir svari frá netþjóni…
+ Þú hefur ekki heimild til að taka þátt í þessari spjallrás
+ Þú breyttir völdum %1$s.
+ Þú breyttir %1$s viðmótshluta
+ %1$s breytti %2$s viðmótshluta
+ Þú fjarlægðir %1$s viðmótshluta
+ %1$s fjarlægði %2$s viðmótshluta
+ Þú bættir við %1$s viðmótshluta
+ %1$s bætti við %2$s viðmótshluta
+ Þú samþykktir boð um að taka þátt í %1$s
+ Þú afturkallaðir boðið til %1$s
+ %1$s afturkallaði boðið til %2$s
+ Þú afturkallaðir boð til %1$s um þátttöku í spjallrásinni
+ %1$s afturkallaði boð til %2$s um þátttöku í spjallrásinni
+ Þú bauðst %1$s
+ Þú sendir boð til %1$s um þátttöku í spjallrásinni
+ Þú fjarlægðir auðkennismynd spjallrásarinnar
+ %1$s fjarlægði auðkennismynd spjallrásarinnar
+ Þú fjarlægðir umfjöllunarefni spjallrásar
+ Þú fjarlægðir heiti spjallrásar
+
+ Breyting á ACL á %d netþjóni
+ Breyting á ACL á %d netþjóni
+
+ Þú gerðir skilaboð héðan í frá sýnileg fyrir %1$s
+ Bæta við fólki
+ 🎉 Öllum netþjónum er núna bannað að taka þátt! Þessa spjallrás er ekki lengur hægt að nota.
+ • Netþjónar sem samsvara IP-tölum eru núna bannaðir.
+ • Netþjónar sem samsvara IP-tölum eru núna leyfðir.
+ • Netþjónar sem samsvara %s voru fjarlægðir af listanum yfir leyfilegt.
+ • Netþjónar sem samsvara %s eru núna leyfðir.
+ • Netþjónar sem samsvara %s voru fjarlægðir af bannlistanum.
+ • Netþjónar sem samsvara %s eru núna bannaðir.
+ Þú breyttir ACL á netþjóni fyrir þessa spjallrás.
+ %s breytti ACL á netþjóni fyrir þessa spjallrás.
+ • Netþjónar sem samsvara IP-tölum eru bannaðir.
+ • Netþjónar sem samsvara IP-tölum eru leyfðir.
+ • Netþjónar sem samsvara %s eru leyfðir.
+ • Netþjónar sem samsvara %s eru bannaðir.
+ Þú stilltir ACL á netþjóni fyrir þessa spjallrás.
+ %s stillti ACL á netþjóni fyrir þessa spjallrás.
+ Þú uppfærðir hér.
+ %s uppfærði hér.
+ Þú uppfærðir þessa spjallrás.
+ %s uppfærði þessa spjallrás.
+ %1$s gerði skilaboð héðan í frá sýnileg fyrir %2$s
+ Þú gerðir ferilskrá spjallrásar héðan í frá sýnilega fyrir %1$s
+ Þú laukst símtalinu.
+ Þú svaraðir símtalinu.
+ Þú sendir gögn til að setja upp samtalið.
+ %s sendi gögn til að setja upp samtalið.
+ Þú hringdir raddsamtal.
+ Þú hringdir myndsamtal.
+ Þú breyttir heiti spjallrásarinnar í: %1$s
+ Þú breyttir auðkennismynd spjallrásarinnar
+ %1$s breytti auðkennismynd spjallrásarinnar
+ Þú breyttir umræðuefninu í: %1$s
+ Þú fjarlægðir birtingarnafn þitt (sem var %1$s)
+ Þú breytti birtingarnafni þínu úr %1$s í %2$s
+ Þú settir birtingarnafn þitt sem %1$s
+ Opna könnun
+ Spila talskilaboð
+ Þú þarft heimild til að uppfæra spjallrás
+ Vertu þolinmóð/ur Þetta getur tekið nokkra stund.
+ Opið öllum, best fyrir dreifða hópa
+ Aðvara án hljóðs
+ Aðvara með hljóði
+ Opna emoji-tánmyndaval
+ Skipta um auðkennismynd
+ Opna viðmótshluta
+ Virkt samtal (%1$s)
+ Talnaborð
+ Nýtt PIN-númer
+ Opna notkunarskilmála %s
+ Önnur tiltæk tungumál
+ 🔐️ Vertu með mér á ${app_name}
+ Veldu þér lykilorð.
+ Veldu þér notandanafn.
+ Aðeins stutt í dulrituðum spjallrásum
+ Settu inn endurheimtulykil
+ Ný innskráning. Varst þetta þú\?
+ Flugvélahamur er virkur
+ Ekki treyst
+ Sérsniðið (%1$d) í %2$s
+ Sjálfgefið í %1$s
+ Umsjónarmaður í %1$s
+ Stjórnandi í %1$s
+ Stjórnendur
+
+ Einn aðili
+ %1$d aðilar
+
+ Aðgerðir stjórnanda
+ Ekki öruggt
+ Birta villuleitarupplýsingar á skjá
+ Aðrar setur
+ Úreltur heimaþjónn
+ Athugaðu tölvupóstinn þinn
+ Símanúmer lítur út fyrir að vera ógilt. Yfirfarðu það
+ Nota alþjóðlega sniðið.
+ Nýtt lykilorð
+ Opna valmyndina til að útbúa spjallrás
+ Settu inn slóð auðkennisþjónsins
+ Engar breytingar fundust
+ Aðrar tilkynningar frá utanaðkomandi aðilum
+ Ekkert netkerfi. Athugaðu nettenginguna þína.
+ Atburður undir umsjón stjórnanda spjallrásar
+ Eyða öryggisafriti
+ Öryggisafrit endurheimti %s !
+ Settu inn endurheimtulykil
+ Aflæsi ferli
+ Flyt inn dulritunarlykla…
+ Næ í dulritunarlykla…
+ Reikna endurheimtulykil…
+ Endurheimti úr öryggisafriti:
+ Settu inn endurheimtulykil
+ Endurheimtulykill
+ Deila endurheimtulykli með…
+ Gera afrit
+ Endurheimtulykillinn hefur verið vistaður.
+ Vista endurheimtulykil
+ Ég hef gert afrit
+ Því miður, villa kom upp
+ Smelltu hér til að sjá eldri skilaboð
+ Markdown-texti hefur verið gerður óvirkur.
+ Markdown-texti hefur verið gerður virkur.
+ Birtir upplýsingar um notanda
+ Markdown-texti af/á
+ Skilgreindu völd notanda
+ Loka á allt
+ Auðkenni viðmótshluta
+ Þemað þitt
+ Notandaauðkennið þitt
+ Vefslóð á auðkennismyndina þína
+ Birtingarnafnið þitt
+ Þessum viðmótshluta var bætt við af:
+ %1$s: %2$s %3$s
+ ** Mistókst að senda - opnaðu spjallrásina
+ %1$s í %2$s og %3$s
+
+ %1$s: %2$d skilaboð
+ %1$s: %2$d skilaboð
+
+
+ %d boð
+ %d boð
+
+ Þessi netþjónn er nú þegar á listanum
+ Fann ekki þennan netþjón eða spjallrásalista hans
+ Sláðu inn nafn nýja netþjónsins sem þú vilt skoða.
+ óþekkt IP-vistfang
+ Sýsla með öryggisafrit dulritunarlykla
+ Endurheimt dulritaðra skilaboða
+ Útflutningur dulritunarlykla tókst
+ Önnur svæði sem þú gætir ekki vitað um
+ Spila hljóð við myndatöku
+ Engin samstilling í bakgrunni
+ Bestað gagnvart rauntíma
+ Bestað gagnvart rafhleðslu
+ Hamur samstillingar í bakgrunni
+ Láta mig vita fyrir
+ Engu tölvupóstfangi hefur verið bætt við notandaaðganginn þinn
+ Engu símanúmeri hefur verið bætt við notandaaðganginn þinn
+ Mistókst að koma á rauntímatengingu.
+\nBiddu kerfisstjóra heimaþjónsins þíns um að setja upp TURN-þjón til að tryggja að símtöl virki eðlilega.
+ %1$s úr %2$s í %3$s
+ %1$s breytti völdum %2$s.
+ Stjórnandi
+ Þú breyttir auðkennismyndinni þinni
+ Þú tókst til baka boð til %1$s
+ Þú bannaðir %1$s
+ Þú afbannaðir %1$s
+ Þú fjarlægðir %1$s
+ Þú hafnaðir boðinu
+ Þú hættir í spjallrásinni
+ %1$s hætti í spjallrásinni
+ Þú hættir í spjallrásinni
+ Þú gekkst í hópinn
+ Þú gekkst í spjallrásina
+ Þú bauðst %1$s
+ Þú bjóst til umræðuna
+ %1$s bjó til umræðuna
+ Þú bjóst til spjallrásina
+ %1$s bjó til spjallrásina
+ %s gekk í hópinn.
+ Þú stilltir aðalvistfang spjallrásarinnar sem %1$s.
+ Sérsniðin kæra…
+ Sýna allar spjallrásir á forsíðu
+ Sýsla með spjallrásir og svæði
+ Sýsla með spjallrásir
+ Svæði eru ný leið til að hópa fólk og spjallrásir.
+ Bæta við fyrirliggjandi svæðum
+ Bæta við fyrirliggjandi spjallrásum
+ Yfirgefa svæði
+ Bæta við spjallrásum
+ Kanna spjallrásir
+ Búa til svæði
+ Ég og félagar í teyminu mínu
+ Bara ég
+ Einkasvæðið þitt
+ Opinbera svæðið þitt
+ Bæta við svæði
+ Einkasvæði
+ Opinbert svæði
+ Uppfærir spjallrás í nýja útgáfu
+ Búa til svæði
+ Almenningsspjallrás
+ Eyða auðkennismynd
+ Það kom upp villa við að fletta upp símanúmerinu
+ Sendir skilaboðið með snjókomu
+ Sendir skilaboðið með skrauti
+ Uppfærsla dulritunar tiltæk
+ Sendir skilaboð sem óbreyttur texti án þess að túlka það sem markdown
+ Dulritun ekki virk
+ Skilaboð í þessari spjallrás eru enda-í-enda dulrituð.
+ Kerfisstjóri netþjónsins þíns hefur lokað á sjálfvirka dulritun í einkaspjallrásum og beinum skilaboðum.
+ Stillingar spjallrásar
+ Skilaboð í þessari spjallrás eru ekki enda-í-enda dulrituð.
+ Límmerki
+ Útbý svæði…
+ Settu inn vistfang spjallrásar
+ Þetta vistfang er nú þegar í notkun
+ Vistfang svæðis
+ Eftir að kveikt er á dulritun er ekki hægt að slökkva á henni.
+ Setur ( ͡° ͜ʖ ͡°) framan við hrein textaskilaboð
+ Setur ¯\\_(ツ)_/¯ framan við hrein textaskilaboð
+ Þetta lítur ekki út eins og gilt tölvupóstfang
+ Skrá tölvupóstfang
+ Sláðu inn vistfang netþjónsins sem þú vilt nota
+ Sláðu inn vistfang Modular Element-þjóns eða netþjónsins sem þú vilt nota
+ Vistfang fyrir Element Matrix þjónustur
+ Skrá inn í %1$s
+ Tengjast við %1$s
+ Skrá inn með %s
+ Teymi
+ Vinir og fjölskylda
+ Sendir skilaboðin sem stríðni
+ Stillingar spjallrásar
+ Hunsa notanda
+ Snúa og skera utan af
+ Límmerki
+ Bæta við mynd frá
+ Búa til nýja spjallrás
+ Samþykktu þjónustuskilmála auðkennisþjónsins (%s) svo hægt sé að finna þig með tölvupóstfangi eða símanúmeri.
+ Þú ert núna að deila tölvupóstföngum eða símanúmerum á auðkennisþjóninum %1$s. Þú þarft að tengjast aftur við %2$s til að hætta að deila þessu.
+ Finnanleg tölvupóstföng
+ Búa til nýja spjallrás
+ Notaðu vélmenni, viðmótshluta og límmerkjapakka
+ Sýsla með samþættingar
+ Leyfðu \'Sýsla með samþættingar\' í stillingunum til að gera þetta.
+ Samþættingar eru óvirkar
+ Samþættingarstýring
+ Leyfa samþættingar
+ Sýna lyklaborð með tjáningartáknum
+ Senda skilaboð með \'Enter\'
+ Hefur ekki áhrif á boð/fjarlægingu/bönn.
+ Birta taka-þátt og hætta skilaboð
+ Notaðu samþættingarstýringu til að stýra vélmennum, viðmótshlutum og límmerkjapökkum.
+\nSamþættingarstýringar taka við stillingagögnum og geta breytt viðmótshlutum, sent boð í spjallrásir, auk þess að geta úthlutað völdum fyrir þína hönd.
+ Samþættingar
+ Þetta er upphaf ferils beinna skilaboða með %s.
+ Bein skilaboð
+ Leita að heiti
+ Leita eftir heiti, auðkenni eða tölvupóstfangi
+ Nafn eða auðkenni (#example:matrix.org)
+ Skoða spjallrásalistann
+ Senda ný bein skilaboð
+ Breytingar á skilaboðum
+ Þjappa myndskeiði %d%%
+ Þjappa mynd…
+ Sendi skrá (%1$s / %2$s)
+ Dulrita skrá…
+ Öll samfélög
+ Sýna fjarlægð skilaboð
+ Þú átt engin fleiri ólesin skilaboð
+ Boðið af %s
+ Sendi þér boð
+ Svara í spjallþræði
+ Allir lyklar öryggisafritaðir
+ Setja upp á þessu tæki
+ Varið öryggisafrit
+ Búa til svæði
+ Einungis gegn boði, best fyrir þig og lítinn hóp
+ Fara í fyrstu leskvittun
+ Sannprófa þessa setu
+ Þau samsvara ekki
+ Þau samsvara
+ Fela ítarlegt
+ Birta ítarlegt
+ Hreinsa öll gögn
+ Þú hefur verið skráður út úr öllum setum og munt ekki lengur fá ýti-tilkynningar. Til að endurvirkja tilkynningar, þarf að skrá sig aftur inn á hverju tæki fyrir sig.
+ Eigðu samtölin þín.
+ Aftengja auðkennisþjón
+ Umsagnir um svæði
+ Birta frátökutákn fyrir fjarlægð skilaboð
+ Eftir að þetta hefur verið virkjað, muntu geta sent staðsetninguna þína á hvaða spjallrás sem er
+ Niðurstöður birtast einungis eftir að þú hefur lokað könnuninni
+ Kjósendur sjá niðurstöðurnar þegar þeir hafa kosið
+
+ Lokaniðurstöður byggðar á %1$d atkvæði
+ Lokaniðurstöður byggðar á %1$d atkvæðum
+
+
+ %1$d atkvæði greitt. Greiddu atkvæði til að sjá útkomuna
+ %1$d atkvæði greidd. Greiddu atkvæði til að sjá útkomuna
+
+ Næ ekki að tengjast heimaþjóni á þessari slóð, athugaðu slóðina
+ réttur valkostur
+ Spurning eða viðfangsefni
+ Endurræstu forritið til að breytingin taki gildi.
+ Virkja LaTeX-stærðfræði
+ Tengja þetta tölvupóstfang við notandaaðganginn þinn
+
+ %1$d til viðbótar
+ %1$d til viðbótar
+
+ Birta skilaboðablöðrur
+ Mistókst að hlaða inn landakorti
+ Myndgera staðsetningu notenda á tímalínunni
+ Virkja deilingu staðsetninga
+ ${app_name} gat ekki fengið staðsetninguna þína. Reyndu aftur síðar.
+ ${app_name} gat ekki fengið staðsetninguna þína
+ Lokuð könnun
+ Ljúka könnun
+ Ljúka þessari könnun\?
+ Ljúka könnun
+ Engin atkvæði greidd
+
+ Byggt á %1$d atkvæði
+ Byggt á %1$d atkvæðum
+
+
+ %1$d atkvæði
+ %1$d atkvæði
+
+
+ Það þarf allavega %1$s valkost
+ Það þarf allavega %1$s valkosti
+
+ Spurning má ekki vera auð
+ Set upp öryggisafrit af lykli
+ Útbý öruggislykil úr lykilsetningu
+ Lykilsetning endurheimtu
+ Notaðu lykilsetningu endurheimtu eða dulritunarlykil
+ Sýsla með í öryggisafriti dulritunarlykla
+ Nota öryggisafrit af lykli
+ Verja öryggisafrit
+ Eyða öryggisafriti
+ Athuga ástand öryggisafrits
+ Eyði öryggisafriti…
+ Öryggisafrit af lyklum er ekki virkt í þessari setu.
+
+ %d nýjum lykli hefur verið bætt við þessa setu.
+ %d nýjum lyklum hefur verið bætt við þessa setu.
+
+
+ Endurheimti öryggisafrit með %d lykli.
+ Endurheimti öryggisafrit með %d lyklum.
+
+ Ef þú veist ekki lykilsetningu fyrir endurheimtu, geturðu %s.
+ notað endurheimtulykilinn þinn
+ Öryggisafrit er þegar til staðar á heimaþjóninum þínum
+ (Ítarlegt) Settu upp með endurheimtulykli
+ Bý til öryggisafrit
+ Stilla lykilsetningu
+ Verðu öryggisafritið þitt með lykilsetningu.
+ Byrja að nota öryggisafrit dulritunarlykla
+ Lykilsetning er of veik
+ Settu inn lykilsetningu
+ Lykilsetningar samsvara ekki
+ Búa til lykilsetningu
+ Útbúðu lykilsetningu til að dulrita útfluttu dulritunarlyklana. Þú þarft að setja inn sama lykilsetningu til að geta flutt aftur inn þessa dulritunarlykla.
+ Renna til að ljúka símtalinu
+ Tapaðu aldrei dulrituðum skilaboðum
+ Endilega %s til að halda áfram að nota þessa þjónustu.
+ Endilega %s til að fá þessi takmörk hækkuð.
+ Þessi heimaþjónn er kominn fram yfir takmörk á mánaðarlega virkum notendum.
+ Þessi heimaþjónn er kominn fram yfir takmörk á mánaðarlega virkum notendum þannig að sumir notendur munu ekki geta skráð sig inn.
+ Þessi heimaþjónn er kominn fram yfir takmörk á tilföngum sínum.
+ Þessi heimaþjónn er kominn fram yfir takmörk á tilföngum sínum þannig að sumir notendur munu ekki geta skráð sig inn.
+ hafðu samband við kerfisstjóra þjónustunnar þinnar
+ Þessi spjallrás er framhald af öðru samtali
+ Samtalið heldur áfram hér
+ Þessari spjallrás hefur verið skipt út og er hún ekki lengur virk.
+ Til að halda áfram að nota %1$s heimaþjóninn þarftu að yfirfara og samþykkja skilmálana og kvaðir.
+ Til að laga umsýslu Matrix-forrita
+ Beiðni um deilingu dulritunarlykils
+ Þú verður að samþykkja þjónustuskilmálana til að geta haldið áfram.
+ Ræstu myndavél kerfisins í stað sérsniðna myndavélaskjásins.
+ Þessi viðmótshluti vill nota eftirfarandi tilföng:
+ Fara af fyrirliggjandi fjarfundi og skipta yfir í hinn\?
+ Því miður, villa kom upp við að reyna að tengjast fjarfundinum
+ Því miður, fjarfundasímtöl með Jitsi eru ekki studd á eldri tækjum (tæki með Android OS minna en 6.0)
+ Afturkalla aðgang fyrir mig
+ Mistókst að hlaða inn viðmótshluta.
+\n%s
+ Að nota það gæti deilt gögnum með %s:
+ Að nota það gæti stillt vefkökur og deilt gögnum með %s:
+ Ef þetta samsvarar ekki, getur verið að samskiptin þín séu berskjölduð.
+ Staðfestu með því að bera eftirfarandi saman við \'Stillingar notanda\' í hinni setunni þinni:
+
+ Tókst að flytja inn%1$d/%2$d dulritunarlykli.
+ Tókst að flytja inn%1$d/%2$d dulritunarlyklum.
+
+ Veldu hvaða svæði hafa aðgang að þessari spjallrás. Ef svæði er valið geta meðlimir þess fundið og tekið þátt í spjallrásinni.
+ Hver sem er á svæði með þessari spjallrás getur fundið hana og tekið þátt í henni. Aðeins stjórnendur spjallrásarinnar geta bætt henni í svæði.
+ Hver sem er getur látið vita af sér á spjallrásinni, meðlimir geta þá samþykkt eða hafnað
+ Mistókst að fá sýnileika spjallrásar á spjallrásaskrá (%1$s).
+ Svæði sem þú veist að innihalda þessa spjallrás
+ Veldu hverjir geta fundið spjallrásina og tekið þátt.
+ Svæði sem hafa aðgang
+ Leyfa meðlimum svæðis að finna og fá aðgang.
+ Meðlimir svæðisins %s geta fundið, forskoðað og tekið þátt.
+ Óþekkt aðgangsstilling (%s)
+ Birta þessa spjallrás opinberlega á skrá %1$s yfir spjallrásir\?
+ Einungis meðlimir svæðis
+ Hver sem er getur fundið svæðið og tekið þátt
+ Hver sem er getur fundið spjallrásina og tekið þátt
+ Birta falda atburði í tímalínu
+ Hjálp og um
+ Rödd og myndband
+ Stillingar spjallrásar
+ Umfjöllunarefni spjallrásar (valkvætt)
+ Skipta um netkerfi
+ Búa til nýtt svæði
+ Viðbrögð
+ Skoða viðbrögð
+ Bæta við viðbrögðum
+ Viðbrögð
+ Þú hefur klárað að lesa allt!
+ Skoða á spjallrás
+ Breytir auðkennismyndinni þinni einungis í fyrirliggjandi spjallrás
+ Breytir auðkennismyndinni einungis í fyrirliggjandi spjallrás
+ Breytir birtu gælunafni þínu einungis í fyrirliggjandi spjallrás
+ Fjarlægir notanda með uppgefið auðkenni úr þessari spjallrás
+ Stilla umfjöllunarefni spjallrásar
+ Gengur til liðs við spjallrás með uppgefnu vistfangi
+ Býður notanda með uppgefið auðkenni í fyrirliggjandi spjallrás
+ Stillir heiti spjallrásar
+ Hunsar notanda, felur skilaboð viðkomandi fyrir þér
+ Bannar notanda með uppgefið auðkenni
+ Engir virkir viðmótshlutar
+ Nota hljóðnemann
+ Nota myndavélina
+ Hlaða inn viðmótshluta
+ Nýtt boð
+ Netþjónninn þinn
+ Útgáfa spjallrásar
+
+ %d bannaður notandi
+ %d bannaðir notendur
+
+ %1$s, %2$s, %3$s og %4$s
+ Villa í SSL.
+ Veldu heimaþjón
+ Skrá inn með einfaldri innskráningu (single sign-on)
+ Nota sem sjálfgefið og ekki spyrja aftur
+ Kveikja á HD
+ Slökkva á HD
+ Skipta á milli myndavéla
+ Þráðlaus heyrnartól
+ Tilkynning á spjallrás
+ Notendur
+ Tilkynna öllum á spjallrásinni
+ Sýna minna
+ Deila staðsetningu
+ Búa til könnun
+ Opna tengiliði
+ Senda límmerki
+ Hlaða inn skrá
+ Senda myndir og myndskeið
+ Opna myndavél
+ Opna með
+ Deila staðsetningu
+ Landakort
+ Deila staðsetningu
+ Staðsetning
+ Deila staðsetningu
+ Tegund könnunar
+ Breyta könnun
+ Fjarlægja könnun
+ Atkvæði greitt
+ ÚTBÚA KÖNNUN
+ BÆTA VIÐ VALKOSTI
+ Búa til valkosti
+ Búa til könnun
+ %1$ds eftir
+ Eyða upptöku
+ Stöðva upptöku
+ Uppfærsla er nauðsynleg
+ Uppfæra
+ Nafnlaus spjallrás
+ Tillaga
+ Ljúka uppsetningu
+ Sleppa í bili
+ Deila tengli
+ Bjóða fólki
+ Lýsing
+ Slembið
+ Almennt
+ Einka
+ Opinbert
+ Eyða ósendum skilaboðum
+ Mistókst
+ Sent
+ Sendi
+ Atburður sendur!
+ Ekkert efni
+ Stöðulykill
+ Tegund
+ Senda sérsniðinn atburð
+ Skoða stöðu spjallrásar
+ Ekki tiltækt
+ Ónettengt
+ Nettengt
+ Ekki tilkynna
+ Ekki skoðað
+ Athugað
+ Valið
+ Myndskeið
+ Mynd
+ Skjámynd
+ Tókst ekki að auðkenna
+ Óþekktur einstaklingur
+ Notendur
+ Flutningur
+ Tengjast
+ Virkt samtal (%1$s) ·
+
+ Virkt samtal ·
+ %1$d virk samtöl ·
+
+ Ekkert svar
+ Innhringing myndsamtals
+ Innhringing raddsamtals
+ Hringja til baka
+ Þessu símtali er lokið
+ Henda breytingum
+ Breyta PIN-númeri
+ Virkja PIN-númer
+ Gleymt PIN-númer\?
+ Settu inn PIN-númerið þitt
+ Staðfestu PIN-númer
+
+ %d færsla
+ %d færslur
+
+ Tengiliðaskrá
+ KANNA NÁNAR
+ NÁÐI ÞVÍ
+ Stilla auðkennismynd
+ Umfjöllunarefni
+ Nafn spjallrásar
+ Setja upp
+ Ræsa myndavélina
+ Stöðva myndavélina
+ Kveikja á hljóðnema
+ Þagga niður í hljóðnema
+ Opna spjall
+ Hlutverk
+ Stilla hlutverk
+ Senda inn
+ Nota %1$s
+ Núverandi tungumál
+ Bjóða vinum
+ Bjóða notendum
+ BJÓÐA
+ Ódulritað
+ Frumstilla allt
+ Gat ekki vistað myndefnisskrá
+ Skilaboð…
+ Leysa vandamál
+ "Umfjöllunarefni: "
+ Dulritun virk
+ Ljúka
+ Hætt við staðfestingu
+ Endurlesa
+ Staðfesta fjarlægingu
+ Fjarlægja…
+ Tenging við netþjón hefur rofnað
+ Nei
+ Já
+ QR-kóði
+ Endurstilla dulritunarlykla
+ Treyst
+ Setur
+ Aðvörun
+ Sannreynt
+ Sannreyna
+ óstöðug
+ stöðug
+ Sjálfgefin útgáfa
+ Útgáfa á þjóni
+ Heiti þjóns
+ Virkja dulritun
+ Virkja dulritun\?
+ Tímalína
+ Hætta að hunsa
+ Notendur
+ Boðsgestir
+ Sérsniðið
+ Umsjónarmenn
+ Fara út
+ Fara af spjallrás
+ Innsendingar
+ Tilkynningar
+ Stillingar
+ Meira
+ Kanna nánar
+ Öryggi
+ Bíð…
+ Könnun
+ Skrá
+ Tal
+ Hljóð
+ Mynd.
+ Myndskeið.
+ Virkja dulritun
+ Núverandi seta
+ Stillingar
+ Ítarlegar stillingar
+ Lýsingin er of stutt
+ Hreinsa gögn
+ Lykilorð
+ Skrá inn
+ Skrá inn
+ Matrix-auðkenni
+ Aðvörun
+ Næsta
+ Lykilorð
+ Notandanafn
+ Notandanafn eða tölvupóstfang
+ Næsta
+ Settu inn kóða
+ Staðfestu símanúmer
+ Næsta
+ Símanúmer (valfrjálst)
+ Símanúmer
+ Næsta
+ Tölvupóstfang (valfrjálst)
+ Tölvupóstur
+ Könnuninni er lokið
+ Valkostur %1$d
+ Spurning eða viðfangsefni könnunar
+ Aðvörun
+ Lykilorðið þitt hefur verið endurstillt.
+ Tókst!
+ Ég hef staðfest tölvupóstfangið mitt
+ Halda áfram
+ Aðvörun!
+ Tölvupóstur
+ Næsta
+ Vistfang
+ Hreinsa vinnsluferil
+ Skrá inn
+ Nýskrá
+ Halda áfram
+ einfaldri innskráningu (single sign-on)
+ Skrá inn með %s
+ Halda áfram með %s
+ Eða
+ Annað
+ Kanna nánar
+ Ég er nú þegar með notandaaðgang
+ Stofna aðgang
+ Komast í gang
+ Tengjast þjóni
+ Samfélög
+ Ólesin skilaboð
+ Fjarlægja úr eftirlætum
+ Bæta í eftirlæti
+ Stillingar
+ Þagga niður
+ Aðeins minnst á
+ Öll skilaboð
+ Öll skilaboð (hávært)
+ Tilkynnt sem óviðeigandi
+ Tilkynnt sem ruslpóstur
+ Efni tilkynnt
+ KÆRA
+ Ástæður fyrir kæru á þessu efni
+ Kæra þetta efni
+ Þetta er óviðeigandi
+ Þetta er ruslpóstur
+ %1$s kl. %2$s
+ SKRÁR
+ MYNDEFNI
+ %1$d af %2$d
+ Staðsetning
+ Könnun
+ Myndasafn
+ Myndavél
+ Tengiliður
+ Skrá
+ Opna leiðsagnarsleðann
+ Kóði
+ Auðkennisþjónn
+ Þjónustuskilmálar
+ Skoða breytingaskrá
+ Tillögur
+ QR-kóði
+ Tengill afritaður á klippispjald
+ (breytt)
+ Bíð…
+ Bein skilaboð
+ Gefðu umsögn
+ Umsagnir
+ Kerfisstillingar
+ Útgáfur
+ Hjálp og aðstoð
+ Hjálp
+ Snið:
+ Slóð:
+ Öryggi og gagnaleynd
+ Kjörstillingar
+ Almennt
+ Opinbert
+ Umfjöllunarefni
+ Heiti
+ Nafn spjallrásar
+ ÚTBÚA
+ Bein skilaboð
+ Spjallrásir
+ Bíddu aðeins…
+ Búa til nýja spjallrás
+ Skilaboðum eytt
+ Spjallrásir
+ Samtöl
+ Reyna aftur
+ Svara
+ Breyta
+ Óþekkt villa
+ Náði því
+ Sannreynt!
+ Undirritun
+ Reiknirit
+ Útgáfa
+ Endurheimta úr öryggisafriti
+ Ertu viss\?
+ Óvænt villa
+ Stöðva
+ Skipta út
+ Vista sem skrá
+ Deila
+ Lokið
+ Tókst !
+ (Ítarlegt)
+ %d+
+ %1$s: %2$s
+ fella saman
+ fletta út
+ Settu inn lykilorðið þitt.
+ Settu inn notandanafn.
+ Þögult
+ Breytir birtu gælunafni þínu
+ Fara af spjallrás
+ Birtir aðgerð
+ Hunsa
+ Deila
+ Lesa DRM-varið myndefni
+ Leyfa
+ Auðkenni spjallrásar
+ Opna í vafra
+ Endurlesa viðmótshluta
+ Viðmótshluti
+ Virkir viðmótshlutar
+ SKOÐA
+ %1$s: %2$s
+ Ég
+ Ný skilaboð
+ Spjallrás
+ Nýr atburður
+ %1$s og %2$s
+
+ %d tilkynning
+ %d tilkynningar
+
+ Bæta við nýjum þjóni
+ Opinbert
+ Einka
+ Staðvær vistföng
+ Gefa út
+ Aðgangur að spjallrás
+ Stillingar notandaaðgangs
+ Veldu
+ Veldu
+ Myndefni
+ Lykilorð
+ hér
+ Forskoða myndefni fyrir sendingu
+
+ %d sekúnda
+ %d sekúndur
+
+ Skilaboð frá vélmennum
+ Boð á spjallrás
+ Stikkorð
+ \@spjallrás
+ Hópskilaboð
+ Bein skilaboð
+ Notandanafnið mitt
+ Birtingarnafn mitt
+ Virkja í ræsingu
+ Bæta við notandaaðgangi
+ Sérsniðnar stillingar.
+ Virkja
+ Setustillingar.
+ Virkja
+ Stillingar notandaaðgangs.
+ Opna stillingar
+ Kerfisstillingar.
+ Annað
+ Sjálfgefnar tilkynningar
+ Ítarlegar stillingar á tilkynningum
+ Fjarlægja %s\?
+ Símanúmer
+ Tölvupóstföng
+ Ekkert
+ Sía
+ Spjallþræðir
+ Spjallþráður
+
+ %d valið
+ %d valið
+
+ Breyta stillingum
+ Bjóða notendum
+ Heimildir
+ %1$s og %2$s
+ Taka notanda úr banni
+ Banna notanda
+ Fjarlægja notanda
+ Lækka niður um stig
+ Ekkert svar
+ Bíða
+ Halda áfram
+ Símtöl
+ Alltaf spyrja
+ Aftan
+ Fram
+ Heyrnartól
+ Hátalari
+ Sími
+ Svæði
+ Skrá yfir spjallrásir
+ Ekki fleiri niðurstöður
+ Tilkynningar
+ Nýtt gildi
+ Tókst
+ Villa
+ Endurstilla
+ Hafna
+ Spila
+ Aftengjast
+ Afturkalla
+ Sækja
+ Hafna
+ Hunsa
+ Sleppa
+ Samþykkja
+ Breyta
+ Samþykki
+ Ekki núna
+ Virkja
+ Skipta um
+ Bæta við
+ Ýttu til að breyta svæðum
+ Veldu svæði
+ Hætta að birta þetta vistfang
+ Birta þetta vistfang
+ Bæta við staðværu vistfangi
+ Þessi spjallrás er ekki með nein staðvær vistföng
+ Stilltu vistföng fyrir þessa spjallrás svo notendur geti fundið hana í gegnum heimaþjóninn þinn (%1$s)
+ Nýtt birt vistfangs (t.d. #samnefni:netþjónn)
+ Engin önnur birt vistföng ennþá.
+ Engin önnur birt vistföng ennþá, bættu einu við hér fyrir neðan.
+ Eyða vistfanginu \"%1$s\"\?
+ Hætta að birta vistfangið \"%1$s\"\?
+ Birta nýtt vistfang handvirkt
+ Önnur birt vistföng:
+ Þetta er aðalvistfangið
+ Birt vistföng getur hvaða einstaklingur eða netþjónn sem er notað til að taka þátt í spjallrásinni þinni. Til að birta vistfang, þarf fyrst að stilla það sem staðvært vistfang.
+ Birt vistföng
+ Sjá og sýsla með vistföng þessa svæðis.
+ Vistföng svæða
+ Sjá og sýsla með vistföng þessarar spjallrásar og sýnileika hennar í spjallrásaskránni.
+ Vistföng spjallrása
+ Leyfa gestum að taka þátt
+ Aðgangur að svæði
+ Hver hefur aðgang\?
+ Láta mig vita fyrir
+ Uppgötvun
+ Uppfærslur spjallrásar
+ Skilaboð sem innihalda @spjallrás
+ Þegar spjallrásir eru uppfærðar
+ Heimildir svæðis
+ Ástæða fyrir banni
+ Ástæða fjarlægingar
+ Hætta við boð
+ Hætta að hunsa notanda
+ Hunsa notanda
+ Lækka þig sjálfa/n í tign\?
+ Fjarlægja úr spjalli
+ Hætta við boð
+ Notandinn sem þú hringdir í er upptekinn.
+ Þetta er ekki gilt vistfang á Matrix-þjóni
+ Tillögur að spjallrásum
+ Skoða á spjallrás
+ Þú breyttir vistföngum fyrir þessa spjallrás.
+ %1$s breytti vistföngum fyrir þessa spjallrás.
+ Þú breytti aðal- og varavistföngunum fyrir þessa spjallrás.
+ %1$s breytti aðal- og varavistföngunum fyrir þessa spjallrás.
+ Þú breyttir varavistfanginu fyrir þessa spjallrás.
+ %1$s breytti varavistfanginu fyrir þessa spjallrás.
+ Þú fjarlægðir aðalvistfang spjallrásarinnar.
+ %1$s fjarlægði aðalvistfang spjallrásarinnar.
+ %1$s stillti aðalvistfang spjallrásarinnar sem %2$s.
+ Þú bættir við %1$s og fjarlægðir %2$s sem vistföng fyrir þessa spjallrás.
+ %1$s bætti við %2$s og fjarlægði %3$s sem vistföng fyrir þessa spjallrás.
+
+ Þú fjarlægðir %1$s sem vistfang fyrir þessa spjallrás.
+ Þú fjarlægðir %1$s sem vistföng fyrir þessa spjallrás.
+
+
+ %1$s fjarlægði %2$s sem vistfang fyrir þessa spjallrás.
+ %1$s fjarlægði %2$s sem vistföng fyrir þessa spjallrás.
+
+
+ Þú bættir við %1$s sem vistfangi fyrir þessa spjallrás.
+ Þú bættir við %1$s sem vistföngum fyrir þessa spjallrás.
+
+
+ %1$s bætti við %2$s sem vistfangi fyrir þessa spjallrás.
+ %1$s bætti við %2$s sem vistföngum fyrir þessa spjallrás.
+
+ Breyta umfjöllunarefni
+ Uppfæra svæðið
+ Uppfæra spjallrásina
+ Senda m.room.server_acl atburði
+ Breyta heimildum
+ Breyta nafni svæðis
+ Breyta nafni spjallrásar
+ Breyta sýnileika ferils
+ Virkja dulritun svæðis
+ Virkja dulritun spjallrásar
+ Skipta um aðalvistfang svæðisins
+ Skipta um aðalvistfang spjallrásarinnar
+ Skipta um táknmynd svæðis
+ Skipta um auðkennismynd spjallrásar
+ Breyta viðmótshlutum
+ Tilkynna öllum
+ Fjarlægja skilaboð send af öðrum
+ Banna notendur
+ Fjarlægja notendur
+ Senda skilaboð
+ Sjálfgefið hlutverk
+ %1$s, %2$s og aðrir
+ Hringing…
+ Afrita
+ Merkja sem lesið
+ Ertu viss um að þú viljir skrá þig út\?
+ Leggja á
+ Hafna
+ Samþykkja
+ Lokið
+ Svæði
+ Hefja spjall
+ Ekkert
+ Ertu viss\?
+ Öryggisafrit af lykli
+ Sjálfgefið í kerfinu
+ Sendi skilaboð…
+ Skilaboð send
+ Tóm spjallrás (var %s)
+
+ %1$s, %2$s, %3$s og %4$d til viðbótar
+ %1$s, %2$s, %3$s og %4$d til viðbótar
+
+ %1$s, %2$s og %3$s
+ Sérsniðið
+ Sérsniðið (%1$d)
+ Sjálfgefið
+ Umsjónarmaður
+ %1$s bauð %2$s
+ Engin breyting.
+ %1$s gekk í hópinn
+ Boðið þitt
\ No newline at end of file
diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml
index 73a57823eb..b70034888f 100644
--- a/vector/src/main/res/values-iw/strings.xml
+++ b/vector/src/main/res/values-iw/strings.xml
@@ -203,7 +203,7 @@
יעדי התראותניהול מפתחות קריפטוגרפיהקריפטוגרפיה
- השתמש במנהל שילוב לניהול בוטים, גשרים, ווידג\'טים וחבילות מדבקות.
+ השתמש במנהל אינטגרציה לניהול בוטים, גשרים, ווידג\'טים וחבילות מדבקות.
\nמנהלי אינטגרציה מקבלים נתוני תצורה ויכולים לשנות ווידג\'טים, לשלוח הזמנות לחדר ולהגדיר רמות כוח מטעמכם.אינטגרציותמתקדם
@@ -440,7 +440,7 @@
חסום הכלאפשריישומון זה רוצה להשתמש במשאבים הבאים:
- מצטערים, שיחות ועידה עם Jitsi אינן נתמכות במכשירים ישנים (מכשירים עם מערכת הפעלה אנדרואיד מתחת ל -5.0)
+ מצטערים, שיחות ועידה עם Jitsi אינן נתמכות במכשירים ישנים (מכשירים עם מערכת הפעלה אנדרואיד מתחת ל -6.0)מזהה חדרמזהה ישומוןערכת הנושא שלכם
@@ -515,7 +515,7 @@
כל החדרים המקומיים %sכל החדרים בשרת %s
- כתובת אתר של שרת בית
+ שם השרתבחר מדריך חדריםאם הם לא תואמים, אבטחת התקשורת שלך עלולה להיפגע.אשרו על ידי השוואה בין הדברים הבאים להגדרות המשתמש בפגישה האחרת שלכם:
@@ -686,7 +686,7 @@
בועט משתמש עם מזהה נתוןהגדר את נושא החדרעזוב חדר
- מצטרף לחדר עם כינוי נתון
+ מצטרף לחדר עם כתובת ידועהמזמין משתמש עם זיהוי נתון לחדר הנוכחימשתמש מבוטל עם מזהה נתוןהגדר את רמת ההרשאה של המשתמש
@@ -705,7 +705,7 @@
רטוט בעת אזכור משתמשכולל שינויים באווטאר ושמות תצוגה.הצג אירועי חשבון
- הזמנות, בעיטות ואיסורים אינם מושפעים.
+ הזמנות, הסרות ואיסורים אינם מושפעים.הראה אירועי הצטרפות ועזיבהלחץ על אישורי הקריאה לרשימה מפורטת.הצג קבלות הצג קבלות קריאה
@@ -2099,8 +2099,8 @@
שיחה פעילה ·%1$d שיחות פעילות ·
-
-
+
+ שיחה פעילה (%1$s)אירעה שגיאה בחיפוש מספר הטלפון
@@ -2124,17 +2124,17 @@
להודיע לכל החדר%1$d יותר
-
-
-
+
+
+ %1$s, %2$s ואחרים%1$s ו %2$s%d שינוי ברשימות ACL בשרתים
-
-
-
+
+
+ נהל חדריםהחלט מי יכול לראות ולהצטרף לחדר זה.
@@ -2175,4 +2175,246 @@
שם המשתמש שליהזמנות לחדרמילות מפתח
+ הזמן אל %s
+ הזמן אנשים
+ הזמן אנשים למרחב שלך
+ תֵאוּר
+ יוצר מרחב…
+ אַקרַאִי
+ ראשי
+ בואו ניצור חדר לכל אחד מהם. אתה יכול להוסיף עוד מאוחר יותר, כולל אלה שכבר קיימים.
+ על איזה דברים אתה עובד\?
+ ודא שלאנשים הנכונים יש גישה לחברה %s. תוכל להזמין עוד מאוחר יותר.
+ מי הם חבריך לצוות\?
+ אנחנו ניצור עבורם חדרים. אתה יכול להוסיף עוד מאוחר יותר גם.
+ איזה דיונים אתה רוצה לקיים ב-%s\?
+ תן לזה שם כדי להמשיך.
+ הוסף כמה פרטים כדי לשפר לזיהוי. אתה יכול לשנות את זה בכל שלב.
+ הוסף כמה פרטים כדי לבלוט. אתה יכול לשנות את זה בכל שלב.
+ צור מרחב
+ הזמן רק, הכי טוב לעצמך או לצוותים שלך
+ פְּרָטִי
+ פתוח לכל אחד, הכי מתאים לקהילות
+ צִבּוּרִי
+ מרחב פרטי עבורך ועבור חברי הצוות שלך
+ אני וחברי הצוות
+ מרחב פרטי לארגון החדרים שלך
+ רק אני
+ ודא שלאנשים הנכונים יש גישה אל %s.
+ עם מי אתה עובד\?
+ כדי להצטרף למרחב קיים, אתה צריך הזמנה.
+ אתה יכול לשנות את זה מאוחר יותר
+ איזה סוג מרחב אתה רוצה ליצור\?
+ המרחב הפרטי שלך
+ המרחב הציבורי שלך
+ הוסף מרחב
+ מרחב אישי
+ מרחב ציבורי
+ האם אתה בטוח שברצונך למחוק את כל ההודעות שלא נשלחו בחדר הזה\?
+ מחק הודעות שלא נשלחו
+ שליחת ההודעות נכשלה
+ האם ברצונך לבטל את שליחת ההודעה\?
+ מחק את כל ההודעות שנכשלו
+ נִכשָׁל
+ נשלח
+ שְׁלִיחָה
+ משדרג חדר לגרסה חדשה
+ עזוב את החדר עם מזהה נתון (או החדר הנוכחי אם ריק)
+ הצטרף למרחב עם המזהה הנתון
+ הוסף למרחב הנתון
+ צור מרחב
+ תוכן האירוע
+ מצב האירוע נשלח!
+ האירוע נשלח!
+ אירוע שגוי
+ חסר סוג הודעה
+ אין תוכן
+ תוכן האירוע
+ מצב מפתח
+ סוג
+ שלח אירוע מצב מותאם אישית
+ ערוך תוכן
+ מצב אירוע
+ שלח מצב אירוע
+ שלח אירוע מותאם אישית
+ חקור מצב חדר
+ כלי מפתח
+ לא זמין
+ לא על הקו
+ על הקו
+ חדר ציבורי
+ צפה באישורי קריאה
+ אל תתריעה
+ מתריעה ללא קול
+ מתריעה עם צליל
+ ההודעה לא נשלחה עקב שגיאה
+ לא בָּדוּק
+ בָּדוּק
+ הזמינו בדואר אלקטרוני
+ זה רק אתה כרגע. %s יהיה טוב יותר עם אחרים.
+ בחלל זה אין חדרים
+ אנא צור קשר עם מנהל השרת הביתי שלך לקבלת מידע נוסף
+ נראה שהשרת הביתי שלך עדיין לא תומך במרחבים
+ מרגיש ניסיוני\?
+\nניתן להוסיף חללים קיימים למרחב.
+ הצג את כל החדרים בדף הבית
+ כל החדרים שבהם אתה נמצא יוצגו בדף הבית.
+ ניהול חדרים ומרחבים
+ סמן כלא מוצע
+ מוצע
+ סמן כמוצע
+ מחפש מישהו שאינו ב-%s\?
+ %s מזמין אותך
+ הערה: האפליקציה תופעל מחדש
+ אפשר הודעות שרשור
+ המערכת שלך תשלח אוטומטית יומנים כאשר מתרחשת שגיאה ללא יכולת לפענח
+ דווח אוטומטית על שגיאות פענוח.
+ אתם מוזמנים
+ מרחבים הם דרך חדשה לאיחוד של חדרים ואנשים.
+ הוסף מרחב לכל מרחב שאתה מנהל.
+ הוסף מרחבים קיימים
+ הוסף חדרים קיימים
+ הוסף חדרים ומרחבים קיימים
+ בחר דברים להשאיר
+ השאירו חדרים ומרחבים ספציפיים…
+ אל תעזובו חדרים וא מרחבים
+ עזבו את כל החדרים והמרחבים
+ אתה המנהל היחיד של המרחב הזה. עזיבה תגרום לכך שאף אחד לא ישלוט על המרחב.
+ לא תוכל להצטרף מחדש אלא אם כן תוזמן מחדש.
+ אתה האדם היחיד כאן. אם תעזוב, אף אחד לא יוכל להצטרף בעתיד, כולל אותך.
+ האם אתה בטוח שברצונך לעזוב את %s\?
+ עזוב את המרחב
+ הוסיפו חדרים
+ גלה חדרים
+
+ אדם %d שאתה מכיר כבר הצטרף
+ %d אנשים שאתה מכיר כבר הצטרפו
+ %d אנשים שאתה מכיר כבר הצטרפו
+ %d אנשים שאתה מכיר כבר הצטרפו
+
+ גילוי (%s)
+ סיים את ההגדרה
+ הזמן בדואר אלקטרוני, מצא אנשי קשר ועוד…
+ סיים להגדיר את הגילוי.
+ אינך משתמש כעת בשרת זהות. על מנת להזמין חברים לצוות ולהיות ניתנים לגילוי על ידם, הגדר שרת זהות למטה.
+ כינוי זה אינו נגיש בשלב זה.
+\nנסה שוב מאוחר יותר, או בקש ממנהל חדר לבדוק אם יש לך גישה.
+ הם לא יהיו חלק מ-%s
+ רק לחדר הזה
+ הם יוכלו לחקור את %s
+ הזמן אל %s
+ שתף קישור
+ הזמן לפי שם משתמש או דואר אלקטרוני
+ ההצפנה הוגדרה בצורה שגויה.
+ אמת על ידי השוואת אימוג\'י
+ סרוק עם המכשיר הקיים
+ סרוק את הקוד עם המכשיר האחר או החלף וסרוק את הקוד מהמכשיר הקיים
+ קול
+ יצירת מרחב…
+ כתובת מרחב
+ קידומת ( ͡° ͜ʖ ͡°) להודעת טקסט רגילה
+ הראה קצת מידע שימושי לעזור לטיפול בבאגים ביישום
+ הראה מידע על באגים במסך
+ נראה שכתובת הדואר האלקטרוני אינה תקפה
+ התחבר לשרת
+ מחפש להצטרף לשרת קיים \?
+ עדיין לא בטוח \? אתה יכול %s
+ קהילות
+ צוותים
+ חברים ומשפחה
+ נעזור לך להיות מחובר.
+ עם מי תדברו הכי הרבה\?
+ הצפנה קצה לקצה ולא נדרש מספר טלפון. אין פרסומות או כריית מידע.
+ בחירת מקום שמירת השיחה שלך , נותנת לך בקרה ועצמאות . מחובר דרך מטריקס.
+ תקשורת מאובטחת ועצמאית המעניקה לך את אותה רמת פרטיות כמו שיחה פנים אל פנים בבית שלך.
+ הודעות לקבוצתך.
+ אתה בבקרה.
+ שיחות בבעלותך.
+ הגדרות חדר
+ סקר
+ הקובץ גדול מדי להעלאה.
+ האם אתה מאשר את שליחת המידע \?
+ שליחת דואר אלקטרוני ומספרי טלפון אל %s
+ רשימת אנשי הקשר שלך הינה פרטית. לחשיפת משתמשים מרשימת אנשי הקשר שלך , נדרש אישורך לשליחת מידע על איש הקשר לשרת ההזדהות.
+ לא סופקה מדיניות על ידי שרת הזדהות
+ הסתר מדיניות שרת הזדהות
+ הראה מדיניות שרת הזדהות
+ פתח הגדרות
+ משוב על מרחבים
+ הגדרות מערכת
+ גרסאות
+ קבלת עזרה בשימוש ${app_name}
+ עזרה ותמיכה
+ עזרה
+ משפטים
+ אתה צופה בת\'רד זה!
+ יצירת מרחב חדש
+ צפייה בחדר
+ מענה בת\'רד
+ הצגת מידע על המשתמש
+ משנה את האווטר שלך בחדר הנוכחי בלבד
+ משנה את האווטר בחדר הנוכחי
+ משנה את הכינוי בחדר הנוכחי בלבד
+ הפקודה \"%s\" מזוהה אך אינה נתמכת.
+ עזרו לנו לזהות ולשפר את ${app_name} על ידי שיתוף השימוש בצורה אנונימי. להבנת השימוש של אנשים במכשירים שונים , אנחנו נחולל מזהה אקראי , אשר ישותף על ידי המכשירים שלך .
+\n
+\n ניתן לקרוא את כל התנאים %s.
+
+ התוצאה הסופית מתבססת על הצבעה %1$d
+
+ התוצאה הסופית מתבססת על הצבעות %1$d
+
+
+ בחר אילו מרחבים יכולים לגשת לחדר זה. בבחירת מרחב החברים יוכלו למצוא ולהצטרף לחדר.
+ חברים במרחב %s יכולים למצוא , לצפות ולהצטרף.
+ כל אחד במרחב בחדר זה יכול להצטרף. רק מנהלי מערכת של החדר יכולים להוסיף למרחב.
+ אנחנו לא משתפים מידע עם חברות צד שלישי
+ אנחנו לא מקליטים או עושים פרופיל מנתוני החשבון
+ הפסק להתעלם ממשתמש , אשר הודעותיו נראות
+ הגדר את שם החדר
+ התעלם ממשתמש , אשר מעלים הודעות ממך
+ האם מאושרת עזיבת שיחת הועידה הנוכחית ומעבר לשיחת ועידה אחרת \?
+ מצטערים , אירעה שגיאה בניסיון הצטרפות לשיחת הועידה
+ השרת כבר נמצא ברשימה
+ לא ניתן למצוא את השרת או את רשימת החדשים
+ הכנס את שם השרת החדש שיחשף
+ הוספת שרת חדש
+ השרת שלך
+ גרסת חדר
+ מרחבים או חדרים שאינכם מכירים
+ מרחב שמכיל את החדר
+ בחרו מרחבים
+ מרחבים פתוחים
+ אפשרו לחברים במרחב להצטרף.
+ מרחב לחברים בלבד
+ כל אחד יכול למצוא את המרחב ולהצטרף
+ כל אחד יכול להצטרף
+ ציבורי
+ רק מוזמנים יכולים להצטרף
+ פרטי (מוזמן בלבד)
+ פרטי
+ הגדרת גישה לא ידועה(%s)
+ כל אחד יכול לבקש להצטרף לחדר , החברים יוכלו לאשר או לדחות זאת
+ סדר כתובות במרחב זה.
+ מרחב כתובות
+ אפשר לאורחים להצטרף
+ מרחב גישה
+ למי יש גישה\?
+ הגדרות חשבון
+ ניתן לסדר את ההתראות ב-%1$s.
+ שימו לב שהתראות על מילים מוזכרות לא זמינות בחדרים מוצפנים בטלפון הנייד
+ הודע לי עבור
+ אין מדיניות לשרת זה
+ ספריות חברות צד שלישי
+ מדיניות שרת ההזדהות שלך
+ מדיניות השרת הביתי שלך
+ מדיניות ${app_name}
+ ניתן לסגור בכל זמן בהגדרות
+ כאן
+ עזרה בשיפור ${app_name}
+ לא תתקבלנה התראות על מילים המוזכרות בחדרים מוצפנים בטלפון הנייד.
+ הודעות על ידי בוט
+ חדר@
+ הודעות קבוצתיות
+ הודעות ישירות מוצפנות
\ No newline at end of file
diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml
index cd237407d2..f2eaf8d993 100644
--- a/vector/src/main/res/values-pt-rBR/strings.xml
+++ b/vector/src/main/res/values-pt-rBR/strings.xml
@@ -1414,7 +1414,7 @@
Quase lá! %s está mostrando um tick (✓)\?SimNão
- A conexão com o servidor foi perdida
+ Conectividade ao servidor tem sido perdidaModo avião está ligadoFerramentas DevDados de Conta
diff --git a/vector/src/main/res/values-ru/strings.xml b/vector/src/main/res/values-ru/strings.xml
index 465bbbb28c..9a925ecaa7 100644
--- a/vector/src/main/res/values-ru/strings.xml
+++ b/vector/src/main/res/values-ru/strings.xml
@@ -39,7 +39,6 @@
Приглашение в комнату%1$s и %2$sПустая комната
-
Начальная синхронизация:
\nИмпорт учетной записи…Начальная синхронизация:
@@ -258,7 +257,6 @@
УдалитьПереименоватьПожаловаться на содержимое
-
илиПриглашениеВыйти из учётной записи
@@ -281,7 +279,6 @@
Только Matrix контактыНет результатовКомнаты
-
Отправить логиОтправить журналы ошибокОтправить снимок экрана
@@ -309,11 +306,9 @@
Это не похоже на действительный адрес электронной почтыЭтот адрес электронной почты уже используется.Забыли пароль?
-
Этот домашний сервер хочет убедиться, что вы не роботДолжен быть введен адрес электронной почты привязанный к учетной записи.Не удалось проверить адрес электронной почты: убедитесь, что вы перешли по ссылке из сообщения
-
Пожалуйста, введите корректный URLНеверный формат JSONНе содержит допустимого JSON
@@ -329,12 +324,10 @@
Идёт разговор…Вызываемый абонент не смог ответить.Информация
-
${app_name} необходимы разрешения на доступ к микрофону, чтобы выполнять звонки.${app_name} необходимы разрешения на доступ к камере и микрофону для видеовызовов.
\n
\nПожалуйста дайте разрешение в следующем окне для звонка.
-
ДАНЕТПродолжить
@@ -342,7 +335,6 @@
ПрисоединитьсяОтклонитьПерейти к непрочитанному
-
Покинуть комнатуВы уверены, что хотите выйти из комнаты\?ПРЯМЫЕ СООБЩЕНИЯ
@@ -369,7 +361,6 @@
Сертификат был изменен с того, которому доверял ваш телефон. Это ОЧЕНЬ НЕОБЫЧНО. Рекомендуется НЕ ПРИНИМАТЬ этот новый сертификат.Сертификат изменился с ранее доверенного на недействительный. Возможно, сервер обновил свой сертификат. Свяжитесь с администратором сервера для получения ожидаемого отпечатка сертификата.Примите сертификат только если администратор сервера опубликовал отпечаток сертификата, который соответствует указанному выше.
-
ПоискФильтр списка пользователейНет результатов
@@ -414,7 +405,6 @@
Обновить публичное имяНедавно%1$s @ %2$s
-
АутентификацияАвторизован какДомашний сервер
@@ -445,7 +435,6 @@
Это экспериментальные функции, которые могут повести себя неожиданным образом. Используйте с осторожностью.Установить как основной адресСбросить основной адрес
-
Ошибка дешифровкиПубличное имяID сессии
@@ -456,7 +445,6 @@
ЭкспортВведите парольную фразуПодтвердите парольную фразу
-
Импорт E2E ключей комнатыИмпорт ключей комнатыИмпортировать ключи из локального файла
@@ -468,7 +456,6 @@
ПодтвердитьЧтобы убедиться, что этой сессии можно доверять, обратитесь к ее владельцу, используя другие способы (например, лично или по телефону), и спросите, соответствует ли ключ, который он видит в настройках для этой сессии:Если они не совпадают, безопасность вашего общения может быть поставлена под угрозу.
-
Выбор каталога комнатИмя сервераВсе комнаты на сервере %s
@@ -545,7 +532,6 @@
Причина: %1$sВстряхните устройство, чтобы сообщить об ошибкеСписок участников
-
%d комната%d комнаты
@@ -560,7 +546,6 @@
Аватар
-
%d участник%d участника
@@ -573,7 +558,6 @@
%d новых сообщений
-
%d изменение членства%d изменения членства
@@ -586,7 +570,6 @@
%d непрочитанных уведомлений
-
ЧутьеОтправить стикерОтправить стикер
@@ -633,18 +616,12 @@
Нажмите здесь для просмотра старых сообщенийПрисоединиться к комнате с указанным адресомДля исправления управления приложениями Matrix
-
-
-
-
%d выбран%d выбрано%d выбраны
-
-
Системные оповещенияОшибкаСоздать парольную фразу
@@ -733,7 +710,6 @@
Показывать события о вступлении/выходеПоказывать события аккаунтаВключает изменения аватара и отображаемого имени.
-
Использовать системную камеру вместо камеры Element.%1$s: %2$s%d+
@@ -814,7 +790,6 @@
Невозможно расшифровать резервную копию с помощью этого ключа восстановления: убедитесь, что вы ввели правильный ключ.Невозможно расшифровать резервную копию с помощью этого пароля: убедитесь, что вы ввели правильный пароль.Генерация ключей восстановления с использованием парольной фразы может занять несколько секунд.
-
[%1$s]
\nЭта ошибка вне контроля ${app_name}. На телефоне нет учетной записи Google. Пожалуйста, добавьте аккаунт Google.[%1$s]
@@ -855,7 +830,6 @@
Использовать резервное копирование ключейУправление резервным копированием ключейНовые ключи зашифрованных сообщений
-
Ваши ключи копируются.(Дополнительно) Настройка с ключом восстановленияИли защитите резервную копию с помощью ключа восстановления, сохранив его в безопасном месте.
@@ -910,11 +884,8 @@
ПоделитьсяЗапрос поделится ключомИгнорировать
-
Проверено!Понял
-
-
Запрос на подтверждение%s желает подтвердить вашу сессиюНеизвестная ошибка
@@ -1011,7 +982,6 @@
НиктоОтменаОтключить
-
Не удается связаться с домашним сервером по этому URL, пожалуйста, проверьте егоОптимизирован для батареиОптимизирован для работы в реальном времени
@@ -1023,7 +993,6 @@
${app_name} будет синхронизироваться в фоновом режиме периодически в точное время (настраивается).
\nЭто повлияет на использование радио и батареи, появится постоянное уведомление о том, что ${app_name} прислушивается к событиям.Вы не будете уведомлены о входящих сообщениях, когда приложение находится в фоновом режиме.
-
Изменить настройки обнаружения.Вы не используете какой-либо сервер обнаруженияПохоже, вы пытаетесь подключиться к другому домашнему серверу. Вы хотите выйти\?
@@ -1090,7 +1059,7 @@
Покинуть комнату%1$s сделал(а) комнату доступной для всех, у кого есть ссылка.%1$s сделал(а) комнату доступной только по приглашению.
- Подробные логи помогут разработчикам, предоставив больше информации, когда вы отправляете ВзмахЯрости. Даже когда они разрешены, приложение не записывает ваши сообщения и другие приватные данные.
+ Подробные логи помогут разработчикам, предоставив больше информации, когда вы отправляете \"Яростное встряхивание\". Даже когда они разрешены, приложение не записывает ваши сообщения и другие приватные данные.Закройте меню создание комнаты…ВнизКонтакт
@@ -1276,7 +1245,6 @@
Лента сообщенийКлюч сообщенияРаспечатайте его и храните в безопасном месте
-
Шифрование включеноШифрование не включено%1$s: %2$s
@@ -1311,7 +1279,6 @@
Закрыть окно резервного копирования ключей%s прочитаноНе удалось обработать данные
-
ВоспроизвестиКопироватьУдачно
@@ -1405,10 +1372,10 @@
Это недопустимый идентификатор пользователя. Ожидаемый формат: \'@user:homeserver.org\'Не удалось найти действительный домашний сервер. Пожалуйста, проверьте свой идентификаторНачальная синхронизация…
- СотрясениеЯрости
+ Яростное встряхиваниеПорог обнаруженияВстряхните телефон, чтобы проверить порог обнаружения
- Обнаружено потрясение!
+ Обнаружено встряхивание!Показываем только первые результаты, наберите больше букв…Раннее падение${app_name} может падать чаще, когда происходит непредвиденная ошибка
@@ -1443,7 +1410,6 @@
Подтверждено %sПодтверждённых %sОжидаем %s…
-
Сообщения в этой комнате не защищены сквозным шифрованием.Сообщения в этой комнате защищены сквозным шифрованием.
\n
@@ -1871,7 +1837,6 @@
Скрыть дополнительные настройкиПоказать дополнительные настройки%1$d из %2$d
-
Дать согласиеОтозвать моё согласиеБольше никаких результатов
@@ -1973,8 +1938,6 @@
ПереводПодключитьсяСначала посоветуйтесь
-
-
Нет учётных данных, неправильная учётная запись пользователя и/или парольВы уверены, что хотите удалить все неотправленные сообщения в этой комнате\?Удалить неотправленные сообщения
@@ -2061,7 +2024,6 @@
ОбновлениеПожалуйста, будьте терпеливы, это может занять некоторое время.Присоединиться к замещенной комнате
-
Безымянная КомнатаНекоторые комнаты могут быть скрыты, потому что они приватные, и вам нужно приглашение.Некоторые комнаты могут быть скрыты, потому что они приватные, и вам нужно приглашение.
@@ -2130,7 +2092,7 @@
Приватное пространство для организации ваших комнатЯ и члены командыТолько я
- Убедитесь, что нужные люди имеют доступ к %s. Вы сможете изменить это позже.
+ Убедитесь, что нужные люди имеют доступ к %s.С кем вы работаете\?Чтобы присоединиться к существующему пространству, вам необходимо получить приглашение.Вы сможете изменить это позже
@@ -2453,7 +2415,6 @@
МестоположениеВы согласны отправить эту информацию\?Чтобы обнаружить существующие контакты, необходимо отправить контактную информацию (электронную почту и номера телефонов) на сервер обнаружения. Мы хешируем ваши данные перед отправкой для обеспечения конфиденциальности.
-
Отправить электронные адреса и номера телефонов %sВаши контакты приватны. Чтобы обнаружить пользователей из ваших контактов, нам необходимо ваше разрешение на отправку контактной информации на ваш сервер обнаружения.Системные настройки
@@ -2485,16 +2446,16 @@
ВключитьСлежка за уведомлениямиВам не разрешено подключаться к этой комнате
- Организуйте обсуждение в потоках
- Показать все потоки в которых вы участвуете
- Все Потоки
- Просмотр Потоков
+ Организуйте обсуждение с помощью веток
+ Показать все ветки, в которых вы участвуете
+ Все ветки
+ Посмотреть веткиПосмотреть в комнате
- Показать всплывающие сообщения
+ Показывать сообщения в пузыряхНе удалось загрузить картуКартаПримечание: приложение будет перезапущено
- Включить Сообщения Потока
+ Включить ветки сообщенийПодключиться к серверуХотите присоединиться к существующему серверу\?пропустить вопрос
@@ -2504,18 +2465,36 @@
Друзья и семьяМы поможем вам подключится.С кем вы будете общаться больше всего\?
- Вы уже просматриваете этот Поток!
+ Вы уже просматриваете эту ветку!Просмотр в Комнате
- Ответить в Поток
- Команда «%s» распознается, но не поддерживается в потоках.
- Из Потока
+ Ответить в ветке
+ Команда «%s» распознается, но не поддерживается в ветках.
+ Из веткиСовет: нажмите и удерживайте сообщение и используйте «%s».
- Потоки помогают хранить ваши разговоры по темам и легко отслеживать их.
- Мои Потоки
- Показать все потоки в текущей комнате
+ Ветки помогают хранить ваши разговоры по темам и легко отслеживать их.
+ Мои ветки
+ Показать все ветки этой комнатыФильтр
- Потоки
- Поток
- Фильтровать Потоки в комнате
- Скопировать ссылку в поток
+ Ветки
+ Ветка
+ Фильтровать ветки в комнате
+ Скопировать ссылку в ветку
+ Уведомления комнаты
+ Пользователи
+ Оповестить всю комнату
+
+ И ещё %1$d
+ И ещё %1$d
+ И ещё %1$d
+ И ещё %1$d
+
+ Свернуть
+ %1$s, %2$s и другие
+ %1$s и %2$s
+
+ %d изменение ACL сервера
+ %d изменения ACL сервера
+ %d изменений ACL сервера
+ %d изменений ACL сервера
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml
index 8d97ff7266..6650890ac3 100644
--- a/vector/src/main/res/values-sk/strings.xml
+++ b/vector/src/main/res/values-sk/strings.xml
@@ -2274,7 +2274,7 @@
Týmto sa zastaví možnosť hlasovania a zobrazia sa konečné výsledky ankety.Určite chcete túto anketu odstrániť\? Po odstránení ju už nebudete môcť obnoviť.Typ ankety
- Otvoriť anketu
+ Otvorená anketaHlasujúci uvidia výsledky hneď po hlasovaníUzavretá anketaZobraziť vlákna
@@ -2452,4 +2452,18 @@
%1$d ďalšíchZadajte URL adresu servera Modular Element alebo adresu servera, ktorý si želáte použiť
+ Hlasovať
+ Odoslať stav udalosti
+ Priradenie sa nepodarilo.
+ V súčasnosti neexistuje žiadne priradenie k tomuto identifikátoru.
+ použite záložný kľúč na obnovu kľúča
+ Uloženie tajnej zálohy kľúčov v SSSS
+ Generovanie kľúča SSSS z kľúča pre obnovu
+ Definovanie predvoleného kľúča SSSS
+ Rýchle-zlyhanie
+ Najprv konzultovať
+ Vyberte si, čo opustíte
+ Opustiť miestnosť s daným id (alebo aktuálnu miestnosť, ak je prázdna)
+ Varovná úroveň dôveryhodnosti
+ Pripojiť
\ No newline at end of file
diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml
index 48fc274eb7..0fc5c7f6fb 100644
--- a/vector/src/main/res/values-sq/strings.xml
+++ b/vector/src/main/res/values-sq/strings.xml
@@ -310,7 +310,7 @@
POVazhdoHiqe
- Bëhuni pjesë
+ HyniHidheni tejAnëtarë listeHidhu te të palexuarit
diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml
index d2e17e856d..67bf3f5e06 100644
--- a/vector/src/main/res/values-zh-rCN/strings.xml
+++ b/vector/src/main/res/values-zh-rCN/strings.xml
@@ -39,7 +39,6 @@
空聊天室聊天室邀请%1$s 和 %2$s
-
初始化同步:
\n正在导入账号…初始化同步:
@@ -262,10 +261,8 @@
拍摄照片或视频此主服务器想确认你不是机器人电子邮箱地址验证失败:请确保你已点击邮件中的链接
-
原始通话正在连接…
-
${app_name} 需要权限以访问你的麦克风来进行语音通话。私聊邀请
@@ -283,7 +280,6 @@
忽略指纹(%s):无法验证远程服务器的身份。
-
应用信息启用这个账号的通知启用这个设备的通知
@@ -301,7 +297,6 @@
通知已忽略的用户通讯录权限
-
身份认证当前密码是否重新显示所有来自 %s 的消息?
@@ -319,14 +314,12 @@
高级此聊天室的内部 ID这些是实验性功能,可能会出现不可预料的错误。请谨慎使用。
-
导出端对端聊天室密钥导出聊天室密钥导出密钥到本地文件导出输入密语确认密语
-
导入端对端聊天室密钥导入聊天室密钥从本地文件导入密钥
@@ -338,25 +331,20 @@
永久链接重命名举报内容
-
问题反馈为分析此问题,本客户端的日志将会随此问题反馈发送。本问题反馈,包括日志与截图,将不会被公开显示。若你希望仅发送上面的文字,请取消选择:问题反馈发送成功问题反馈发送失败(%s)
-
异常的 JSON呼入的视频通话呼入的语音通话通话中…通话未被接听。信息
-
-
${app_name} 需要权限以访问你的摄像机和麦克风来进行视频通话。
\n
\n请在接下来的弹出窗口中授权允许访问,以便进行通话。移除
-
你将不能撤销这个修改,因为你正在让这个用户和你拥有相同的特权级别。
\n你确定吗?这可能意味着有人正在恶意劫持你的流量,或者你的手机不信任远程服务器提供的数字证书。
@@ -375,7 +363,6 @@
取消设置为主要地址确认你似乎沮丧地摇了摇手机。你想打开问题反馈界面吗?
-
证书已从一个先前受你的设备信任的证书更改为另一个。这非常反常!建议你不要接受此新证书。证书已从曾受信任的证书更改为不受信任的证书。服务器可能已更新其证书,请联系管理员并核对服务器的指纹。请仅在服务器管理员发布了与上述指纹匹配的指纹的情况下接受该证书。
@@ -391,7 +378,6 @@
实验室为验证此设备是否可信,请通过其他方式(例如面对面交换或拨打电话)与其拥有者联系,并询问他们该设备的用户设置中的密钥是否与以下密钥匹配:如果它们不匹配,你通讯的安全性可能会受到影响。
-
邀请收藏夹联系人
@@ -479,7 +465,6 @@
社群摇一摇快捷反馈问题
-
%d 位成员的状态发生了变化
@@ -490,7 +475,6 @@
%d 条未读消息显示成员
-
徽章%d 个聊天室
@@ -505,9 +489,7 @@
你已被 %2$s 从 %1$s 中封禁理由:%1$s头像
-
%1$s 条在 %2$s 中
-
停用账号停用我的账号发送统计分析数据
@@ -553,16 +535,9 @@
对话在此继续这个聊天室是另一个对话的延续点击此处查看更早的消息
-
-
-
-
-
已选择 %d 个
-
-
系统警告联系你的服务管理员本服务器其中一项资源已超出限制,部分用户将无法登录。
@@ -631,7 +606,6 @@
邀请、移除与封禁事件不受影响。显示账号变动事件包括头像与显示名称的变动。
-
密码%d+%1$s:%2$s
@@ -719,7 +693,6 @@
保存恢复密钥分享保存为文件
-
请制作一份拷贝分享恢复密钥…正在使用密语来生成恢复密钥,此过程可能会花费几秒钟。
@@ -765,7 +738,6 @@
正在删除备份…删除备份要从此服务器中删除你备份的加密密钥吗?你将无法再使用恢复密钥来读取加密的历史消息。
-
永不丢失已加密消息使用备份密钥新加密信息密钥
@@ -783,7 +755,6 @@
按回车发送消息软键盘的 Enter 按钮将发送消息而不是添加换行符密码无效
-
媒体默认压缩选择
@@ -865,7 +836,6 @@
撤消断开连接拒绝
-
這不是有效的 Matrix 服务器位置无法在此 URL 找到主服务器,请检查播放
@@ -918,7 +888,6 @@
\n这将影响网络和电池的使用,将显示一个永久通知表明 ${app_name} 正在监听事件。无后台同步应用在后台时你不会收到消息通知。
-
集成使用集成管理器管理机器人、桥接、部件和贴纸包。
\n集成管理器接收配置数据,可以代表你修改部件、发送聊天室邀请及设置特权等级。
@@ -972,8 +941,6 @@
安全备份保护加密信息及数据的访问权设置安全备份
-
-
你未使用身份服务器你似乎正在试图连接到另一个主服务器。你想要登出吗?你已经跟上了!
@@ -1096,7 +1063,6 @@
此内容已报告为不合适。
\n
\n如果你不希望再看到此用户的更多内容,你可以忽略他们以隐藏他们的消息。
-
忽略用户全部消息(嘈杂)全部消息
@@ -1295,7 +1261,6 @@
验证 %s已验证 %s正在等待 %s…
-
此聊天室的消息未经端对端加密。该聊天室的消息已被端对端加密。
\n
@@ -1446,7 +1411,6 @@
密钥已是最新!保存到优盘或者备份盘复制到你的个人云存储
-
如果你现在取消,那么当你失去登录权限时也会丢失加密的信息和数据。
\n
\n你也可以通过设置菜单来建立保护备份以及管理你的密钥。
@@ -1754,7 +1718,6 @@
%2$d 的 %1$d旋转和裁剪添加图像自
-
授予许可撤销我的许可你已同意发送电子邮件和电话号码到身份服务器以从你的联系人发现其他用户。
@@ -1823,7 +1786,6 @@
已勾选已选中活跃通话(%1$s)
-
需要重新验证删除失败的消息你确定要取消发送消息吗?
@@ -1987,7 +1949,6 @@
${app_name} 要求你输入凭据才能执行此操作。呼叫转移时发生错误先询问
-
查找电话号码时发生了错误此通话已结束%1$s 拒绝了此通话
@@ -2075,7 +2036,6 @@
输入你想要探索的新服务器的名称。添加一个新的服务器你的服务器
-
抱歉,尝试加入 %s 时发生了一个错误空间地址查看和管理这个空间的地址。
@@ -2272,7 +2232,6 @@
投票问题或主题创建投票投票
-
向 %s 发送电子邮件和电话号码您的联系人是私密的。 要从您的联系人中发现用户,我们需要您的许可才能将联系信息发送到您的身份服务器。已退出此会话!
@@ -2321,4 +2280,8 @@
\n你可以阅读我们所有的条款 %s。帮助改进 ${app_name}启用
+ 不允许加入此房间
+
+ 修改服务器 %d 的 ACLs
+
\ No newline at end of file
diff --git a/vector/src/main/res/values/donottranslate.xml b/vector/src/main/res/values/donottranslate.xml
index d8e06459c8..48d2950cd5 100755
--- a/vector/src/main/res/values/donottranslate.xml
+++ b/vector/src/main/res/values/donottranslate.xml
@@ -10,22 +10,14 @@
Cut the slack from teams.
- Personalize profile
- Take me home
- Congratulations!
- Your account %s has been created.
+ Create your account
+ We\'ll need some info to get you set up.
+ You can\'t change this later
+ Must be 8 characters or more
+ Choose your server to store your data
+ Or
+ Join millions for free on the largest public server
+ matrix.org
+ Edit
- Choose a display name
- This will be shown when you send messages.
- Display Name
- You can change this later
-
- Add a profile picture
- You can change this anytime.
- Let\'s go
- You\'re all set!
- Your preferences have been saved.
-
- Save and continue
- Skip this step
diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
index 6e5a2be47c..10e5afd610 100644
--- a/vector/src/main/res/values/strings.xml
+++ b/vector/src/main/res/values/strings.xml
@@ -358,6 +358,7 @@
SwitchUnpublishEnable
+ DisableNot nowAgree"Change"
@@ -731,6 +732,8 @@
Tip: Long tap a message and use “%s”.From a Thread
+ Threads Approaching Beta 🎉
+ We’re getting closer to releasing a public Beta for Threads.\n\nAs we prepare for it, we need to make some changes: threads created before this point will be displayed as regular replies.\n\nThis will be a one-off transition as Threads are now part of the Matrix specification.Search
@@ -1039,7 +1042,8 @@
ChoosePlay shutter sound
- Flair
+
+ Flair3 days
@@ -1861,6 +1865,25 @@
Looking to join an existing server?Connect to server
+ Personalize profile
+ Take me home
+ Congratulations!
+ Your account %s has been created.
+
+ Choose a display name
+ This will be shown when you send messages.
+ Display Name
+ You can change this later
+
+ Add a profile picture
+ You can change this anytime.
+ Let\'s go
+ You\'re all set!
+ Your preferences have been saved.
+
+ Save and continue
+ Skip this step
+
It\'s your conversation. Own it.Chat with people directly or in groupsKeep conversations private with encryption
@@ -2448,6 +2471,7 @@
Please choose a username.Please choose a password.
+ "The homeserver does not accept username with only digits."Double-check this linkThe link %1$s is taking you to another site: %2$s.\n\nAre you sure you want to continue?
@@ -2948,6 +2972,8 @@
Failed to load mapLive location enabledStop
+ ${app_name} Live Location
+ Location sharing is in progressShow Message bubbles
diff --git a/vector/src/main/res/xml/vector_settings_flair.xml b/vector/src/main/res/xml/vector_settings_flair.xml
deleted file mode 100644
index ac7ae83d24..0000000000
--- a/vector/src/main/res/xml/vector_settings_flair.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml
index 73193edfd5..5144f6fe1f 100644
--- a/vector/src/main/res/xml/vector_settings_labs.xml
+++ b/vector/src/main/res/xml/vector_settings_labs.xml
@@ -52,8 +52,8 @@
diff --git a/vector/src/test/java/im/vector/app/features/analytics/impl/DefaultVectorAnalyticsTest.kt b/vector/src/test/java/im/vector/app/features/analytics/impl/DefaultVectorAnalyticsTest.kt
index b17c1a8bba..543d517db1 100644
--- a/vector/src/test/java/im/vector/app/features/analytics/impl/DefaultVectorAnalyticsTest.kt
+++ b/vector/src/test/java/im/vector/app/features/analytics/impl/DefaultVectorAnalyticsTest.kt
@@ -30,7 +30,7 @@ import im.vector.app.test.fixtures.aVectorAnalyticsScreen
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -60,35 +60,35 @@ class DefaultVectorAnalyticsTest {
}
@Test
- fun `when setting user consent then updates analytics store`() = runBlockingTest {
+ fun `when setting user consent then updates analytics store`() = runTest {
defaultVectorAnalytics.setUserConsent(true)
fakeAnalyticsStore.verifyConsentUpdated(updatedValue = true)
}
@Test
- fun `when consenting to analytics then updates posthog opt out to false`() = runBlockingTest {
+ fun `when consenting to analytics then updates posthog opt out to false`() = runTest {
fakeAnalyticsStore.givenUserContent(consent = true)
fakePostHog.verifyOptOutStatus(optedOut = false)
}
@Test
- fun `when revoking consent to analytics then updates posthog opt out to true`() = runBlockingTest {
+ fun `when revoking consent to analytics then updates posthog opt out to true`() = runTest {
fakeAnalyticsStore.givenUserContent(consent = false)
fakePostHog.verifyOptOutStatus(optedOut = true)
}
@Test
- fun `when setting the analytics id then updates analytics store`() = runBlockingTest {
+ fun `when setting the analytics id then updates analytics store`() = runTest {
defaultVectorAnalytics.setAnalyticsId(AN_ANALYTICS_ID)
fakeAnalyticsStore.verifyAnalyticsIdUpdated(updatedValue = AN_ANALYTICS_ID)
}
@Test
- fun `given lateinit user properties when valid analytics id updates then identify with lateinit properties`() = runBlockingTest {
+ fun `given lateinit user properties when valid analytics id updates then identify with lateinit properties`() = runTest {
fakeLateInitUserPropertiesFactory.givenCreatesProperties(A_LATE_INIT_USER_PROPERTIES)
fakeAnalyticsStore.givenAnalyticsId(AN_ANALYTICS_ID)
@@ -97,7 +97,7 @@ class DefaultVectorAnalyticsTest {
}
@Test
- fun `when signing out then resets posthog`() = runBlockingTest {
+ fun `when signing out then resets posthog`() = runTest {
fakeAnalyticsStore.allowSettingAnalyticsIdToCallBackingFlow()
defaultVectorAnalytics.onSignOut()
@@ -106,7 +106,7 @@ class DefaultVectorAnalyticsTest {
}
@Test
- fun `given user consent when tracking screen events then submits to posthog`() = runBlockingTest {
+ fun `given user consent when tracking screen events then submits to posthog`() = runTest {
fakeAnalyticsStore.givenUserContent(consent = true)
defaultVectorAnalytics.screen(A_SCREEN_EVENT)
@@ -115,7 +115,7 @@ class DefaultVectorAnalyticsTest {
}
@Test
- fun `given user has not consented when tracking screen events then does not track`() = runBlockingTest {
+ fun `given user has not consented when tracking screen events then does not track`() = runTest {
fakeAnalyticsStore.givenUserContent(consent = false)
defaultVectorAnalytics.screen(A_SCREEN_EVENT)
@@ -124,7 +124,7 @@ class DefaultVectorAnalyticsTest {
}
@Test
- fun `given user consent when tracking events then submits to posthog`() = runBlockingTest {
+ fun `given user consent when tracking events then submits to posthog`() = runTest {
fakeAnalyticsStore.givenUserContent(consent = true)
defaultVectorAnalytics.capture(AN_EVENT)
@@ -133,7 +133,7 @@ class DefaultVectorAnalyticsTest {
}
@Test
- fun `given user has not consented when tracking events then does not track`() = runBlockingTest {
+ fun `given user has not consented when tracking events then does not track`() = runTest {
fakeAnalyticsStore.givenUserContent(consent = false)
defaultVectorAnalytics.capture(AN_EVENT)
diff --git a/vector/src/test/java/im/vector/app/features/analytics/impl/LateInitUserPropertiesFactoryTest.kt b/vector/src/test/java/im/vector/app/features/analytics/impl/LateInitUserPropertiesFactoryTest.kt
index c2fa50f789..2068099ab9 100644
--- a/vector/src/test/java/im/vector/app/features/analytics/impl/LateInitUserPropertiesFactoryTest.kt
+++ b/vector/src/test/java/im/vector/app/features/analytics/impl/LateInitUserPropertiesFactoryTest.kt
@@ -23,7 +23,7 @@ import im.vector.app.test.fakes.FakeContext
import im.vector.app.test.fakes.FakeSession
import im.vector.app.test.fakes.FakeVectorStore
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.test.runTest
import org.amshove.kluent.shouldBeEqualTo
import org.junit.Test
@@ -43,14 +43,14 @@ class LateInitUserPropertiesFactoryTest {
)
@Test
- fun `given no active session when creating properties then returns null`() = runBlockingTest {
+ fun `given no active session when creating properties then returns null`() = runTest {
val result = lateInitUserProperties.createUserProperties()
result shouldBeEqualTo null
}
@Test
- fun `given no use case set on an active session when creating properties then returns null`() = runBlockingTest {
+ fun `given no use case set on an active session when creating properties then returns null`() = runTest {
fakeVectorStore.givenUseCase(null)
fakeSession.givenVectorStore(fakeVectorStore.instance)
fakeActiveSessionDataSource.setActiveSession(fakeSession)
@@ -61,7 +61,7 @@ class LateInitUserPropertiesFactoryTest {
}
@Test
- fun `given use case set on an active session when creating properties then includes the use case`() = runBlockingTest {
+ fun `given use case set on an active session when creating properties then includes the use case`() = runTest {
fakeVectorStore.givenUseCase(FtueUseCase.TEAMS)
fakeActiveSessionDataSource.setActiveSession(fakeSession)
val result = lateInitUserProperties.createUserProperties()
diff --git a/vector/src/test/java/im/vector/app/features/crypto/keys/KeysExporterTest.kt b/vector/src/test/java/im/vector/app/features/crypto/keys/KeysExporterTest.kt
index 57ad2a52ab..3cd797a7b1 100644
--- a/vector/src/test/java/im/vector/app/features/crypto/keys/KeysExporterTest.kt
+++ b/vector/src/test/java/im/vector/app/features/crypto/keys/KeysExporterTest.kt
@@ -26,7 +26,7 @@ import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.test.runTest
import org.amshove.kluent.internal.assertFailsWith
import org.junit.Before
import org.junit.Test
@@ -53,9 +53,9 @@ class KeysExporterTest {
@Test
fun `when exporting then writes exported keys to context output stream`() {
givenFileDescriptorWithSize(size = A_ROOM_KEYS_EXPORT.size.toLong())
- val outputStream = context.givenOutputStreamFor(A_URI)
+ val outputStream = context.givenSafeOutputStreamFor(A_URI)
- runBlocking { keysExporter.export(A_PASSWORD, A_URI) }
+ runTest { keysExporter.export(A_PASSWORD, A_URI) }
verify { outputStream.write(A_ROOM_KEYS_EXPORT) }
}
@@ -63,29 +63,29 @@ class KeysExporterTest {
@Test
fun `given different file size returned for export when exporting then throws UnexpectedExportKeysFileSizeException`() {
givenFileDescriptorWithSize(size = 110)
- context.givenOutputStreamFor(A_URI)
+ context.givenSafeOutputStreamFor(A_URI)
assertFailsWith {
- runBlocking { keysExporter.export(A_PASSWORD, A_URI) }
+ runTest { keysExporter.export(A_PASSWORD, A_URI) }
}
}
@Test
fun `given output stream is unavailable for exporting to when exporting then throws IllegalStateException`() {
- context.givenMissingOutputStreamFor(A_URI)
+ context.givenMissingSafeOutputStreamFor(A_URI)
assertFailsWith(message = "Unable to open file for writing") {
- runBlocking { keysExporter.export(A_PASSWORD, A_URI) }
+ runTest { keysExporter.export(A_PASSWORD, A_URI) }
}
}
@Test
fun `given exported file is missing after export when exporting then throws IllegalStateException`() {
context.givenFileDescriptor(A_URI, mode = "r") { null }
- context.givenOutputStreamFor(A_URI)
+ context.givenSafeOutputStreamFor(A_URI)
assertFailsWith(message = "Exported file not found") {
- runBlocking { keysExporter.export(A_PASSWORD, A_URI) }
+ runTest { keysExporter.export(A_PASSWORD, A_URI) }
}
}
diff --git a/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt b/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
index fc4197e07a..7562dfdf14 100644
--- a/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
+++ b/vector/src/test/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModelTest.kt
@@ -21,7 +21,7 @@ import com.airbnb.mvrx.test.MvRxTestRule
import im.vector.app.test.fakes.FakeSession
import im.vector.app.test.fakes.FakeStringProvider
import im.vector.app.test.test
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
import org.matrix.android.sdk.api.session.securestorage.IntegrityResult
@@ -47,117 +47,105 @@ class SharedSecureStorageViewModelTest {
val args = SharedSecureStorageActivity.Args(keyId = null, emptyList(), "alias")
@Test
- fun `given a key info with passphrase when initialising then step is EnterPassphrase`() {
- runBlockingTest {
- givenKey(KEY_INFO_WITH_PASSPHRASE)
- val viewModel = createViewModel()
- viewModel
- .test(this)
- .assertState(aViewState(
- hasPassphrase = true,
- step = SharedSecureStorageViewState.Step.EnterPassphrase
- ))
- .finish()
- }
+ fun `given a key info with passphrase when initialising then step is EnterPassphrase`() = runTest {
+ givenKey(KEY_INFO_WITH_PASSPHRASE)
+ val viewModel = createViewModel()
+ viewModel
+ .test()
+ .assertState(aViewState(
+ hasPassphrase = true,
+ step = SharedSecureStorageViewState.Step.EnterPassphrase
+ ))
+ .finish()
}
@Test
- fun `given a key info without passphrase when initialising then step is EnterKey`() {
- runBlockingTest {
- givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
+ fun `given a key info without passphrase when initialising then step is EnterKey`() = runTest {
+ givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
- val viewModel = createViewModel()
+ val viewModel = createViewModel()
- viewModel
- .test(this)
- .assertState(aViewState(
- hasPassphrase = false,
- step = SharedSecureStorageViewState.Step.EnterKey
- ))
- .finish()
- }
+ viewModel
+ .test()
+ .assertState(aViewState(
+ hasPassphrase = false,
+ step = SharedSecureStorageViewState.Step.EnterKey
+ ))
+ .finish()
}
@Test
- fun `given on EnterKey step when going back then dismisses`() {
- runBlockingTest {
- givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
+ fun `given on EnterKey step when going back then dismisses`() = runTest {
+ givenKey(KEY_INFO_WITHOUT_PASSPHRASE)
- val viewModel = createViewModel()
- val test = viewModel.test(this)
- viewModel.handle(SharedSecureStorageAction.Back)
- test
- .assertEvents(SharedSecureStorageViewEvent.Dismiss)
- .finish()
- }
+ val viewModel = createViewModel()
+ val test = viewModel.test()
+ viewModel.handle(SharedSecureStorageAction.Back)
+ test
+ .assertEvents(SharedSecureStorageViewEvent.Dismiss)
+ .finish()
}
@Test
- fun `given on passphrase step when using key then step is EnterKey`() {
- runBlockingTest {
- givenKey(KEY_INFO_WITH_PASSPHRASE)
- val viewModel = createViewModel()
- val test = viewModel.test(this)
+ fun `given on passphrase step when using key then step is EnterKey`() = runTest {
+ givenKey(KEY_INFO_WITH_PASSPHRASE)
+ val viewModel = createViewModel()
+ val test = viewModel.test()
- viewModel.handle(SharedSecureStorageAction.UseKey)
+ viewModel.handle(SharedSecureStorageAction.UseKey)
- test
- .assertStates(
- aViewState(
- hasPassphrase = true,
- step = SharedSecureStorageViewState.Step.EnterPassphrase
- ),
- aViewState(
- hasPassphrase = true,
- step = SharedSecureStorageViewState.Step.EnterKey
- )
- )
- .finish()
- }
+ test
+ .assertStates(
+ aViewState(
+ hasPassphrase = true,
+ step = SharedSecureStorageViewState.Step.EnterPassphrase
+ ),
+ aViewState(
+ hasPassphrase = true,
+ step = SharedSecureStorageViewState.Step.EnterKey
+ )
+ )
+ .finish()
}
@Test
- fun `given a key info with passphrase and on EnterKey step when going back then step is EnterPassphrase`() {
- runBlockingTest {
- givenKey(KEY_INFO_WITH_PASSPHRASE)
- val viewModel = createViewModel()
- val test = viewModel.test(this)
+ fun `given a key info with passphrase and on EnterKey step when going back then step is EnterPassphrase`() = runTest {
+ givenKey(KEY_INFO_WITH_PASSPHRASE)
+ val viewModel = createViewModel()
+ val test = viewModel.test()
- viewModel.handle(SharedSecureStorageAction.UseKey)
- viewModel.handle(SharedSecureStorageAction.Back)
+ viewModel.handle(SharedSecureStorageAction.UseKey)
+ viewModel.handle(SharedSecureStorageAction.Back)
- test
- .assertStates(
- aViewState(
- hasPassphrase = true,
- step = SharedSecureStorageViewState.Step.EnterPassphrase
- ),
- aViewState(
- hasPassphrase = true,
- step = SharedSecureStorageViewState.Step.EnterKey
- ),
- aViewState(
- hasPassphrase = true,
- step = SharedSecureStorageViewState.Step.EnterPassphrase
- )
- )
- .finish()
- }
+ test
+ .assertStates(
+ aViewState(
+ hasPassphrase = true,
+ step = SharedSecureStorageViewState.Step.EnterPassphrase
+ ),
+ aViewState(
+ hasPassphrase = true,
+ step = SharedSecureStorageViewState.Step.EnterKey
+ ),
+ aViewState(
+ hasPassphrase = true,
+ step = SharedSecureStorageViewState.Step.EnterPassphrase
+ )
+ )
+ .finish()
}
@Test
- fun `given on passphrase step when going back then dismisses`() {
- runBlockingTest {
- givenKey(KEY_INFO_WITH_PASSPHRASE)
- val viewModel = createViewModel()
- val test = viewModel.test(this)
+ fun `given on passphrase step when going back then dismisses`() = runTest {
+ givenKey(KEY_INFO_WITH_PASSPHRASE)
+ val viewModel = createViewModel()
+ val test = viewModel.test()
- viewModel.handle(SharedSecureStorageAction.Back)
+ viewModel.handle(SharedSecureStorageAction.Back)
- test
- .assertEvents(SharedSecureStorageViewEvent.Dismiss)
- .finish()
- }
+ test
+ .assertEvents(SharedSecureStorageViewEvent.Dismiss)
+ .finish()
}
private fun createViewModel(): SharedSecureStorageViewModel {
diff --git a/vector/src/test/java/im/vector/app/features/location/domain/usecase/CompareLocationsUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/location/domain/usecase/CompareLocationsUseCaseTest.kt
index 015a27b0c8..7a80cbe87e 100644
--- a/vector/src/test/java/im/vector/app/features/location/domain/usecase/CompareLocationsUseCaseTest.kt
+++ b/vector/src/test/java/im/vector/app/features/location/domain/usecase/CompareLocationsUseCaseTest.kt
@@ -21,7 +21,7 @@ import im.vector.app.features.location.LocationData
import im.vector.app.test.fakes.FakeSession
import io.mockk.MockKAnnotations
import io.mockk.impl.annotations.OverrideMockKs
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -42,7 +42,7 @@ class CompareLocationsUseCaseTest {
}
@Test
- fun `given 2 very near locations when calling execute then these locations are considered as equal`() = runBlockingTest {
+ fun `given 2 very near locations when calling execute then these locations are considered as equal`() = runTest {
// Given
val location1 = LocationData(
latitude = 48.858269,
@@ -62,7 +62,7 @@ class CompareLocationsUseCaseTest {
}
@Test
- fun `given 2 far away locations when calling execute then these locations are considered as not equal`() = runBlockingTest {
+ fun `given 2 far away locations when calling execute then these locations are considered as not equal`() = runTest {
// Given
val location1 = LocationData(
latitude = 48.858269,
diff --git a/vector/src/test/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCaseTest.kt
index 2fa8c7d5f7..bb05357cb2 100644
--- a/vector/src/test/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCaseTest.kt
+++ b/vector/src/test/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCaseTest.kt
@@ -38,7 +38,7 @@ import io.mockk.runs
import io.mockk.unmockkStatic
import io.mockk.verify
import io.mockk.verifyAll
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.test.runTest
import org.junit.After
import org.junit.Before
import org.junit.Rule
@@ -77,7 +77,7 @@ class DownloadMediaUseCaseTest {
}
@Test
- fun `given a file when calling execute then save the file in local with success`() = runBlockingTest {
+ fun `given a file when calling execute then save the file in local with success`() = runTest {
// Given
val uri = mockk()
val mimeType = "mimeType"
@@ -105,7 +105,7 @@ class DownloadMediaUseCaseTest {
}
@Test
- fun `given a file when calling execute then save the file in local with error`() = runBlockingTest {
+ fun `given a file when calling execute then save the file in local with error`() = runTest {
// Given
val uri = mockk()
val mimeType = "mimeType"
diff --git a/vector/src/test/java/im/vector/app/features/onboarding/DirectLoginUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/DirectLoginUseCaseTest.kt
new file mode 100644
index 0000000000..5a3c323316
--- /dev/null
+++ b/vector/src/test/java/im/vector/app/features/onboarding/DirectLoginUseCaseTest.kt
@@ -0,0 +1,109 @@
+/*
+ * 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
+
+import im.vector.app.R
+import im.vector.app.test.fakes.FakeAuthenticationService
+import im.vector.app.test.fakes.FakeSession
+import im.vector.app.test.fakes.FakeStringProvider
+import im.vector.app.test.fakes.FakeUri
+import im.vector.app.test.fakes.FakeUriFactory
+import im.vector.app.test.fakes.toTestString
+import kotlinx.coroutines.test.runTest
+import org.amshove.kluent.should
+import org.amshove.kluent.shouldBeEqualTo
+import org.junit.Test
+import org.matrix.android.sdk.api.MatrixPatterns.getDomain
+import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
+import org.matrix.android.sdk.api.auth.data.WellKnown
+import org.matrix.android.sdk.api.auth.wellknown.WellknownResult
+
+private val A_LOGIN_OR_REGISTER_ACTION = OnboardingAction.LoginOrRegister("@a-user:id.org", "a-password", "a-device-name")
+private val A_WELLKNOWN_SUCCESS_RESULT = WellknownResult.Prompt("https://homeserverurl.com", identityServerUrl = null, WellKnown())
+private val A_WELLKNOWN_FAILED_WITH_CONTENT_RESULT = WellknownResult.FailPrompt("https://homeserverurl.com", WellKnown())
+private val A_WELLKNOWN_FAILED_WITHOUT_CONTENT_RESULT = WellknownResult.FailPrompt(null, null)
+private val NO_HOMESERVER_CONFIG: HomeServerConnectionConfig? = null
+private val A_FALLBACK_CONFIG: HomeServerConnectionConfig = HomeServerConnectionConfig(
+ homeServerUri = FakeUri("https://${A_LOGIN_OR_REGISTER_ACTION.username.getDomain()}").instance,
+ homeServerUriBase = FakeUri(A_WELLKNOWN_SUCCESS_RESULT.homeServerUrl).instance,
+ identityServerUri = null
+)
+private val AN_ERROR = RuntimeException()
+
+class DirectLoginUseCaseTest {
+
+ private val fakeAuthenticationService = FakeAuthenticationService()
+ private val fakeStringProvider = FakeStringProvider()
+ private val fakeSession = FakeSession()
+
+ private val useCase = DirectLoginUseCase(fakeAuthenticationService, fakeStringProvider.instance, FakeUriFactory().instance)
+
+ @Test
+ fun `when logging in directly, then returns success with direct session result`() = runTest {
+ fakeAuthenticationService.givenWellKnown(A_LOGIN_OR_REGISTER_ACTION.username, config = NO_HOMESERVER_CONFIG, result = A_WELLKNOWN_SUCCESS_RESULT)
+ val (username, password, initialDeviceName) = A_LOGIN_OR_REGISTER_ACTION
+ fakeAuthenticationService.givenDirectAuthentication(A_FALLBACK_CONFIG, username, password, initialDeviceName, result = fakeSession)
+
+ val result = useCase.execute(A_LOGIN_OR_REGISTER_ACTION, homeServerConnectionConfig = NO_HOMESERVER_CONFIG)
+
+ result shouldBeEqualTo Result.success(fakeSession)
+ }
+
+ @Test
+ fun `given wellknown fails with content, when logging in directly, then returns success with direct session result`() = runTest {
+ fakeAuthenticationService.givenWellKnown(A_LOGIN_OR_REGISTER_ACTION.username, config = NO_HOMESERVER_CONFIG, result = A_WELLKNOWN_FAILED_WITH_CONTENT_RESULT)
+ val (username, password, initialDeviceName) = A_LOGIN_OR_REGISTER_ACTION
+ fakeAuthenticationService.givenDirectAuthentication(A_FALLBACK_CONFIG, username, password, initialDeviceName, result = fakeSession)
+
+ val result = useCase.execute(A_LOGIN_OR_REGISTER_ACTION, homeServerConnectionConfig = NO_HOMESERVER_CONFIG)
+
+ result shouldBeEqualTo Result.success(fakeSession)
+ }
+
+ @Test
+ fun `given wellknown fails without content, when logging in directly, then returns well known error`() = runTest {
+ fakeAuthenticationService.givenWellKnown(A_LOGIN_OR_REGISTER_ACTION.username, config = NO_HOMESERVER_CONFIG, result = A_WELLKNOWN_FAILED_WITHOUT_CONTENT_RESULT)
+ val (username, password, initialDeviceName) = A_LOGIN_OR_REGISTER_ACTION
+ fakeAuthenticationService.givenDirectAuthentication(A_FALLBACK_CONFIG, username, password, initialDeviceName, result = fakeSession)
+
+ val result = useCase.execute(A_LOGIN_OR_REGISTER_ACTION, homeServerConnectionConfig = NO_HOMESERVER_CONFIG)
+
+ result should { this.isFailure }
+ result should { this.exceptionOrNull() is Exception }
+ result should { this.exceptionOrNull()?.message == R.string.autodiscover_well_known_error.toTestString() }
+ }
+
+ @Test
+ fun `given wellknown throws, when logging in directly, then returns failure result with original cause`() = runTest {
+ fakeAuthenticationService.givenWellKnownThrows(A_LOGIN_OR_REGISTER_ACTION.username, config = NO_HOMESERVER_CONFIG, cause = AN_ERROR)
+
+ val result = useCase.execute(A_LOGIN_OR_REGISTER_ACTION, homeServerConnectionConfig = NO_HOMESERVER_CONFIG)
+
+ result shouldBeEqualTo Result.failure(AN_ERROR)
+ }
+
+ @Test
+ fun `given direct authentication throws, when logging in directly, then returns failure result with original cause`() = runTest {
+ fakeAuthenticationService.givenWellKnown(A_LOGIN_OR_REGISTER_ACTION.username, config = NO_HOMESERVER_CONFIG, result = A_WELLKNOWN_SUCCESS_RESULT)
+ val (username, password, initialDeviceName) = A_LOGIN_OR_REGISTER_ACTION
+ fakeAuthenticationService.givenDirectAuthenticationThrows(A_FALLBACK_CONFIG, username, password, initialDeviceName, cause = AN_ERROR)
+
+ val result = useCase.execute(A_LOGIN_OR_REGISTER_ACTION, homeServerConnectionConfig = NO_HOMESERVER_CONFIG)
+
+ result shouldBeEqualTo Result.failure(AN_ERROR)
+ }
+}
diff --git a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
index f6c322af40..a682d025b8 100644
--- a/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
+++ b/vector/src/test/java/im/vector/app/features/onboarding/OnboardingViewModelTest.kt
@@ -17,10 +17,6 @@
package im.vector.app.features.onboarding
import android.net.Uri
-import com.airbnb.mvrx.Fail
-import com.airbnb.mvrx.Loading
-import com.airbnb.mvrx.Success
-import com.airbnb.mvrx.Uninitialized
import com.airbnb.mvrx.test.MvRxTestRule
import im.vector.app.features.login.ReAuthHelper
import im.vector.app.features.login.SignMode
@@ -28,6 +24,7 @@ import im.vector.app.test.fakes.FakeActiveSessionHolder
import im.vector.app.test.fakes.FakeAnalyticsTracker
import im.vector.app.test.fakes.FakeAuthenticationService
import im.vector.app.test.fakes.FakeContext
+import im.vector.app.test.fakes.FakeDirectLoginUseCase
import im.vector.app.test.fakes.FakeHomeServerConnectionConfigFactory
import im.vector.app.test.fakes.FakeHomeServerHistoryService
import im.vector.app.test.fakes.FakeRegisterActionHandler
@@ -40,7 +37,7 @@ import im.vector.app.test.fakes.FakeVectorFeatures
import im.vector.app.test.fakes.FakeVectorOverrides
import im.vector.app.test.fixtures.aHomeServerCapabilities
import im.vector.app.test.test
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -48,6 +45,7 @@ import org.matrix.android.sdk.api.auth.registration.FlowResult
import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
import org.matrix.android.sdk.api.auth.registration.RegistrationResult
import org.matrix.android.sdk.api.auth.registration.Stage
+import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
private const val A_DISPLAY_NAME = "a display name"
@@ -59,6 +57,7 @@ private val A_RESULT_IGNORED_REGISTER_ACTION = RegisterAction.AddThreePid(Regist
private val A_HOMESERVER_CAPABILITIES = aHomeServerCapabilities(canChangeDisplayName = true, canChangeAvatar = true)
private val AN_IGNORED_FLOW_RESULT = FlowResult(missingStages = emptyList(), completedStages = emptyList())
private val ANY_CONTINUING_REGISTRATION_RESULT = RegistrationResult.FlowResponse(AN_IGNORED_FLOW_RESULT)
+private val A_LOGIN_OR_REGISTER_ACTION = OnboardingAction.LoginOrRegister("@a-user:id.org", "a-password", "a-device-name")
class OnboardingViewModelTest {
@@ -73,6 +72,8 @@ class OnboardingViewModelTest {
private val fakeActiveSessionHolder = FakeActiveSessionHolder(fakeSession)
private val fakeAuthenticationService = FakeAuthenticationService()
private val fakeRegisterActionHandler = FakeRegisterActionHandler()
+ private val fakeDirectLoginUseCase = FakeDirectLoginUseCase()
+ private val fakeVectorFeatures = FakeVectorFeatures()
lateinit var viewModel: OnboardingViewModel
@@ -82,8 +83,8 @@ class OnboardingViewModelTest {
}
@Test
- fun `when handling PostViewEvent, then emits contents as view event`() = runBlockingTest {
- val test = viewModel.test(this)
+ fun `when handling PostViewEvent, then emits contents as view event`() = runTest {
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.PostViewEvent(OnboardingViewEvents.OnTakeMeHome))
@@ -93,10 +94,10 @@ class OnboardingViewModelTest {
}
@Test
- fun `given supports changing display name, when handling PersonalizeProfile, then emits contents choose display name`() = runBlockingTest {
+ fun `given supports changing display name, when handling PersonalizeProfile, then emits contents choose display name`() = runTest {
val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = true, supportsChangingProfilePicture = false))
viewModel = createViewModel(initialState)
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.PersonalizeProfile)
@@ -106,10 +107,10 @@ class OnboardingViewModelTest {
}
@Test
- fun `given only supports changing profile picture, when handling PersonalizeProfile, then emits contents choose profile picture`() = runBlockingTest {
+ fun `given only supports changing profile picture, when handling PersonalizeProfile, then emits contents choose profile picture`() = runTest {
val initialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingDisplayName = false, supportsChangingProfilePicture = true))
viewModel = createViewModel(initialState)
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.PersonalizeProfile)
@@ -119,9 +120,49 @@ class OnboardingViewModelTest {
}
@Test
- fun `when handling SignUp then sets sign mode to sign up and starts registration`() = runBlockingTest {
+ 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)
+ fakeDirectLoginUseCase.givenSuccessResult(A_LOGIN_OR_REGISTER_ACTION, config = null, result = fakeSession)
+ givenInitialisesSession(fakeSession)
+ val test = viewModel.test()
+
+ viewModel.handle(A_LOGIN_OR_REGISTER_ACTION)
+
+ test
+ .assertStatesChanges(
+ initialState,
+ { copy(isLoading = true) },
+ { copy(isLoading = false) }
+ )
+ .assertEvents(OnboardingViewEvents.OnAccountSignedIn)
+ .finish()
+ }
+
+ @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)
+ fakeDirectLoginUseCase.givenFailureResult(A_LOGIN_OR_REGISTER_ACTION, config = null, cause = AN_ERROR)
+ givenInitialisesSession(fakeSession)
+ val test = viewModel.test()
+
+ viewModel.handle(A_LOGIN_OR_REGISTER_ACTION)
+
+ test
+ .assertStatesChanges(
+ initialState,
+ { copy(isLoading = true) },
+ { copy(isLoading = false) }
+ )
+ .assertEvents(OnboardingViewEvents.Failure(AN_ERROR))
+ .finish()
+ }
+
+ @Test
+ fun `when handling SignUp then sets sign mode to sign up and starts registration`() = runTest {
givenRegistrationResultFor(RegisterAction.StartRegistration, ANY_CONTINUING_REGISTRATION_RESULT)
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.UpdateSignMode(SignMode.SignUp))
@@ -129,16 +170,16 @@ class OnboardingViewModelTest {
.assertStatesChanges(
initialState,
{ copy(signMode = SignMode.SignUp) },
- { copy(asyncRegistration = Loading()) },
- { copy(asyncRegistration = Uninitialized) }
+ { copy(isLoading = true) },
+ { copy(isLoading = false) }
)
.assertEvents(OnboardingViewEvents.RegistrationFlowResult(ANY_CONTINUING_REGISTRATION_RESULT.flowResult, isRegistrationStarted = true))
.finish()
}
@Test
- fun `given register action requires more steps, when handling action, then posts next steps`() = runBlockingTest {
- val test = viewModel.test(this)
+ fun `given register action requires more steps, when handling action, then posts next steps`() = runTest {
+ val test = viewModel.test()
givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, ANY_CONTINUING_REGISTRATION_RESULT)
viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION))
@@ -146,16 +187,16 @@ class OnboardingViewModelTest {
test
.assertStatesChanges(
initialState,
- { copy(asyncRegistration = Loading()) },
- { copy(asyncRegistration = Uninitialized) }
+ { copy(isLoading = true) },
+ { copy(isLoading = false) }
)
.assertEvents(OnboardingViewEvents.RegistrationFlowResult(ANY_CONTINUING_REGISTRATION_RESULT.flowResult, isRegistrationStarted = true))
.finish()
}
@Test
- fun `given register action is non loadable, when handling action, then posts next steps without loading`() = runBlockingTest {
- val test = viewModel.test(this)
+ fun `given register action is non loadable, when handling action, then posts next steps without loading`() = runTest {
+ val test = viewModel.test()
givenRegistrationResultFor(A_NON_LOADABLE_REGISTER_ACTION, ANY_CONTINUING_REGISTRATION_RESULT)
viewModel.handle(OnboardingAction.PostRegisterAction(A_NON_LOADABLE_REGISTER_ACTION))
@@ -167,8 +208,8 @@ class OnboardingViewModelTest {
}
@Test
- fun `given register action ignores result, when handling action, then does nothing on success`() = runBlockingTest {
- val test = viewModel.test(this)
+ fun `given register action ignores result, when handling action, then does nothing on success`() = runTest {
+ val test = viewModel.test()
givenRegistrationResultFor(A_RESULT_IGNORED_REGISTER_ACTION, RegistrationResult.FlowResponse(AN_IGNORED_FLOW_RESULT))
viewModel.handle(OnboardingAction.PostRegisterAction(A_RESULT_IGNORED_REGISTER_ACTION))
@@ -176,55 +217,55 @@ class OnboardingViewModelTest {
test
.assertStatesChanges(
initialState,
- { copy(asyncRegistration = Loading()) },
- { copy(asyncRegistration = Uninitialized) }
+ { copy(isLoading = true) },
+ { copy(isLoading = false) }
)
.assertNoEvents()
.finish()
}
@Test
- fun `when registering account, then updates state and emits account created event`() = runBlockingTest {
+ fun `given personalisation enabled, when registering account, then updates state and emits account created event`() = runTest {
+ fakeVectorFeatures.givenPersonalisationEnabled()
givenRegistrationResultFor(A_LOADABLE_REGISTER_ACTION, RegistrationResult.Success(fakeSession))
givenSuccessfullyCreatesAccount(A_HOMESERVER_CAPABILITIES)
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION))
test
.assertStatesChanges(
initialState,
- { copy(asyncRegistration = Loading()) },
- { copy(asyncLoginAction = Success(Unit), personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) },
- { copy(asyncLoginAction = Success(Unit), asyncRegistration = Uninitialized) }
+ { copy(isLoading = true) },
+ { copy(isLoading = false, personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) }
)
.assertEvents(OnboardingViewEvents.OnAccountCreated)
.finish()
}
@Test
- fun `given registration has started and has dummy step to do, when handling action, then ignores other steps and executes dummy`() = runBlockingTest {
+ fun `given personalisation enabled and registration has started and has dummy step to do, when handling action, then ignores other steps and executes dummy`() = runTest {
+ fakeVectorFeatures.givenPersonalisationEnabled()
givenSuccessfulRegistrationForStartAndDummySteps(missingStages = listOf(Stage.Dummy(mandatory = true)))
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.PostRegisterAction(A_LOADABLE_REGISTER_ACTION))
test
.assertStatesChanges(
initialState,
- { copy(asyncRegistration = Loading()) },
- { copy(asyncLoginAction = Success(Unit), personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) },
- { copy(asyncRegistration = Uninitialized) }
+ { copy(isLoading = true) },
+ { copy(isLoading = false, personalizationState = A_HOMESERVER_CAPABILITIES.toPersonalisationState()) }
)
.assertEvents(OnboardingViewEvents.OnAccountCreated)
.finish()
}
@Test
- fun `given changing profile picture is supported, when updating display name, then updates upstream user display name and moves to choose profile picture`() = runBlockingTest {
+ fun `given changing profile picture is supported, when updating display name, then updates upstream user display name and moves to choose profile picture`() = runTest {
val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = true))
viewModel = createViewModel(personalisedInitialState)
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME))
@@ -236,10 +277,10 @@ class OnboardingViewModelTest {
}
@Test
- fun `given changing profile picture is not supported, when updating display name, then updates upstream user display name and completes personalization`() = runBlockingTest {
+ fun `given changing profile picture is not supported, when updating display name, then updates upstream user display name and completes personalization`() = runTest {
val personalisedInitialState = initialState.copy(personalizationState = PersonalizationState(supportsChangingProfilePicture = false))
viewModel = createViewModel(personalisedInitialState)
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME))
@@ -251,8 +292,8 @@ class OnboardingViewModelTest {
}
@Test
- fun `given upstream failure, when handling display name update, then emits failure event`() = runBlockingTest {
- val test = viewModel.test(this)
+ fun `given upstream failure, when handling display name update, then emits failure event`() = runTest {
+ val test = viewModel.test()
fakeSession.fakeProfileService.givenSetDisplayNameErrors(AN_ERROR)
viewModel.handle(OnboardingAction.UpdateDisplayName(A_DISPLAY_NAME))
@@ -260,16 +301,16 @@ class OnboardingViewModelTest {
test
.assertStatesChanges(
initialState,
- { copy(asyncDisplayName = Loading()) },
- { copy(asyncDisplayName = Fail(AN_ERROR)) },
+ { copy(isLoading = true) },
+ { copy(isLoading = false) },
)
.assertEvents(OnboardingViewEvents.Failure(AN_ERROR))
.finish()
}
@Test
- fun `when handling profile picture selected, then updates selected picture state`() = runBlockingTest {
- val test = viewModel.test(this)
+ fun `when handling profile picture selected, then updates selected picture state`() = runTest {
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.ProfilePictureSelected(fakeUri.instance))
@@ -283,10 +324,10 @@ class OnboardingViewModelTest {
}
@Test
- fun `given a selected picture, when handling save selected profile picture, then updates upstream avatar and completes personalization`() = runBlockingTest {
+ fun `given a selected picture, when handling save selected profile picture, then updates upstream avatar and completes personalization`() = runTest {
val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME)
viewModel = createViewModel(initialStateWithPicture)
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
@@ -298,23 +339,23 @@ class OnboardingViewModelTest {
}
@Test
- fun `given upstream update avatar fails, when saving selected profile picture, then emits failure event`() = runBlockingTest {
+ fun `given upstream update avatar fails, when saving selected profile picture, then emits failure event`() = runTest {
fakeSession.fakeProfileService.givenUpdateAvatarErrors(AN_ERROR)
val initialStateWithPicture = givenPictureSelected(fakeUri.instance, A_PICTURE_FILENAME)
viewModel = createViewModel(initialStateWithPicture)
- val test = viewModel.test(this)
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
test
- .assertStates(expectedProfilePictureFailureStates(initialStateWithPicture, AN_ERROR))
+ .assertStates(expectedProfilePictureFailureStates(initialStateWithPicture))
.assertEvents(OnboardingViewEvents.Failure(AN_ERROR))
.finish()
}
@Test
- fun `given no selected picture, when saving selected profile picture, then emits failure event`() = runBlockingTest {
- val test = viewModel.test(this)
+ fun `given no selected picture, when saving selected profile picture, then emits failure event`() = runTest {
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.SaveSelectedProfilePicture)
@@ -325,8 +366,8 @@ class OnboardingViewModelTest {
}
@Test
- fun `when handling profile skipped, then completes personalization`() = runBlockingTest {
- val test = viewModel.test(this)
+ fun `when handling profile skipped, then completes personalization`() = runTest {
+ val test = viewModel.test()
viewModel.handle(OnboardingAction.UpdateProfilePictureSkipped)
@@ -346,10 +387,11 @@ class OnboardingViewModelTest {
ReAuthHelper(),
FakeStringProvider().instance,
FakeHomeServerHistoryService(),
- FakeVectorFeatures(),
+ fakeVectorFeatures,
FakeAnalyticsTracker(),
fakeUriFilenameResolver.instance,
fakeRegisterActionHandler.instance,
+ fakeDirectLoginUseCase.instance,
FakeVectorOverrides()
)
}
@@ -362,20 +404,20 @@ class OnboardingViewModelTest {
private fun expectedProfilePictureSuccessStates(state: OnboardingViewState) = listOf(
state,
- state.copy(asyncProfilePicture = Loading()),
- state.copy(asyncProfilePicture = Success(Unit))
+ state.copy(isLoading = true),
+ state.copy(isLoading = false)
)
- private fun expectedProfilePictureFailureStates(state: OnboardingViewState, cause: Exception) = listOf(
+ private fun expectedProfilePictureFailureStates(state: OnboardingViewState) = listOf(
state,
- state.copy(asyncProfilePicture = Loading()),
- state.copy(asyncProfilePicture = Fail(cause))
+ state.copy(isLoading = true),
+ state.copy(isLoading = false)
)
private fun expectedSuccessfulDisplayNameUpdateStates(): List OnboardingViewState> {
return listOf(
- { copy(asyncDisplayName = Loading()) },
- { copy(asyncDisplayName = Success(Unit), personalizationState = personalizationState.copy(displayName = A_DISPLAY_NAME)) }
+ { copy(isLoading = true) },
+ { copy(isLoading = false, personalizationState = personalizationState.copy(displayName = A_DISPLAY_NAME)) }
)
}
@@ -390,7 +432,11 @@ class OnboardingViewModelTest {
private fun givenSuccessfullyCreatesAccount(homeServerCapabilities: HomeServerCapabilities) {
fakeSession.fakeHomeServerCapabilitiesService.givenCapabilities(homeServerCapabilities)
- fakeActiveSessionHolder.expectSetsActiveSession(fakeSession)
+ givenInitialisesSession(fakeSession)
+ }
+
+ private fun givenInitialisesSession(session: Session) {
+ fakeActiveSessionHolder.expectSetsActiveSession(session)
fakeAuthenticationService.expectReset()
fakeSession.expectStartsSyncing()
}
diff --git a/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt b/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt
index 2ca9aaef07..a7fa2a6331 100644
--- a/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt
+++ b/vector/src/test/java/im/vector/app/features/onboarding/RegistrationActionHandlerTest.kt
@@ -19,7 +19,7 @@ package im.vector.app.features.onboarding
import im.vector.app.test.fakes.FakeRegistrationWizard
import im.vector.app.test.fakes.FakeSession
import io.mockk.coVerifyAll
-import kotlinx.coroutines.test.runBlockingTest
+import kotlinx.coroutines.test.runTest
import org.amshove.kluent.shouldBeEqualTo
import org.junit.Test
import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
@@ -39,7 +39,7 @@ private val A_PID_TO_REGISTER = RegisterThreePid.Email("an email")
class RegistrationActionHandlerTest {
@Test
- fun `when handling register action then delegates to wizard`() = runBlockingTest {
+ fun `when handling register action then delegates to wizard`() = runTest {
val cases = listOf(
case(RegisterAction.StartRegistration) { getRegistrationFlow() },
case(RegisterAction.CaptchaDone(A_CAPTCHA_RESPONSE)) { performReCaptcha(A_CAPTCHA_RESPONSE) },
diff --git a/vector/src/test/java/im/vector/app/test/Extensions.kt b/vector/src/test/java/im/vector/app/test/Extensions.kt
index 67eff7ca11..b9521298e2 100644
--- a/vector/src/test/java/im/vector/app/test/Extensions.kt
+++ b/vector/src/test/java/im/vector/app/test/Extensions.kt
@@ -21,12 +21,14 @@ import im.vector.app.core.platform.VectorViewEvents
import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.platform.VectorViewModelAction
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
fun String.trimIndentOneLine() = trimIndent().replace("\n", "")
-fun VectorViewModel.test(coroutineScope: CoroutineScope): ViewModelTest {
- val state = stateFlow.test(coroutineScope)
- val viewEvents = viewEvents.stream().test(coroutineScope)
+fun VectorViewModel.test(): ViewModelTest {
+ val testResultCollectingScope = CoroutineScope(Dispatchers.Unconfined)
+ val state = stateFlow.test(testResultCollectingScope)
+ val viewEvents = viewEvents.stream().test(testResultCollectingScope)
return ViewModelTest(state, viewEvents)
}
diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeAuthenticationService.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeAuthenticationService.kt
index 10daf5de1e..9175fd3750 100644
--- a/vector/src/test/java/im/vector/app/test/fakes/FakeAuthenticationService.kt
+++ b/vector/src/test/java/im/vector/app/test/fakes/FakeAuthenticationService.kt
@@ -16,11 +16,14 @@
package im.vector.app.test.fakes
+import io.mockk.coEvery
import io.mockk.coJustRun
import io.mockk.every
import io.mockk.mockk
import org.matrix.android.sdk.api.auth.AuthenticationService
+import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
+import org.matrix.android.sdk.api.auth.wellknown.WellknownResult
class FakeAuthenticationService : AuthenticationService by mockk() {
@@ -35,4 +38,20 @@ class FakeAuthenticationService : AuthenticationService by mockk() {
fun expectReset() {
coJustRun { reset() }
}
+
+ fun givenWellKnown(matrixId: String, config: HomeServerConnectionConfig?, result: WellknownResult) {
+ coEvery { getWellKnownData(matrixId, config) } returns result
+ }
+
+ fun givenWellKnownThrows(matrixId: String, config: HomeServerConnectionConfig?, cause: Throwable) {
+ coEvery { getWellKnownData(matrixId, config) } throws cause
+ }
+
+ fun givenDirectAuthentication(config: HomeServerConnectionConfig, matrixId: String, password: String, deviceName: String, result: FakeSession) {
+ coEvery { directAuthentication(config, matrixId, password, deviceName) } returns result
+ }
+
+ fun givenDirectAuthenticationThrows(config: HomeServerConnectionConfig, matrixId: String, password: String, deviceName: String, cause: Throwable) {
+ coEvery { directAuthentication(config, matrixId, password, deviceName) } throws cause
+ }
}
diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeContext.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeContext.kt
index 8382e54253..2a50c34ca3 100644
--- a/vector/src/test/java/im/vector/app/test/fakes/FakeContext.kt
+++ b/vector/src/test/java/im/vector/app/test/fakes/FakeContext.kt
@@ -39,13 +39,13 @@ class FakeContext(
every { contentResolver.openFileDescriptor(uri, mode, null) } returns fileDescriptor
}
- fun givenOutputStreamFor(uri: Uri): OutputStream {
+ fun givenSafeOutputStreamFor(uri: Uri): OutputStream {
val outputStream = mockk(relaxed = true)
- every { contentResolver.openOutputStream(uri) } returns outputStream
+ every { contentResolver.openOutputStream(uri, "wt") } returns outputStream
return outputStream
}
- fun givenMissingOutputStreamFor(uri: Uri) {
- every { contentResolver.openOutputStream(uri) } returns null
+ fun givenMissingSafeOutputStreamFor(uri: Uri) {
+ every { contentResolver.openOutputStream(uri, "wt") } returns null
}
}
diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeDirectLoginUseCase.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeDirectLoginUseCase.kt
new file mode 100644
index 0000000000..8a5c6b1cee
--- /dev/null
+++ b/vector/src/test/java/im/vector/app/test/fakes/FakeDirectLoginUseCase.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.test.fakes
+
+import im.vector.app.features.onboarding.DirectLoginUseCase
+import im.vector.app.features.onboarding.OnboardingAction
+import io.mockk.coEvery
+import io.mockk.mockk
+import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
+
+class FakeDirectLoginUseCase {
+ val instance = mockk()
+
+ fun givenSuccessResult(action: OnboardingAction.LoginOrRegister, config: HomeServerConnectionConfig?, result: FakeSession) {
+ coEvery { instance.execute(action, config) } returns Result.success(result)
+ }
+
+ fun givenFailureResult(action: OnboardingAction.LoginOrRegister, config: HomeServerConnectionConfig?, cause: Throwable) {
+ coEvery { instance.execute(action, config) } returns Result.failure(cause)
+ }
+}
diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeStringProvider.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeStringProvider.kt
index f9001e3f8a..1a4f5cb85b 100644
--- a/vector/src/test/java/im/vector/app/test/fakes/FakeStringProvider.kt
+++ b/vector/src/test/java/im/vector/app/test/fakes/FakeStringProvider.kt
@@ -30,3 +30,5 @@ class FakeStringProvider {
}
}
}
+
+fun Int.toTestString() = "test-$this"
diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeUri.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeUri.kt
index 99f2cf39aa..675401d72f 100644
--- a/vector/src/test/java/im/vector/app/test/fakes/FakeUri.kt
+++ b/vector/src/test/java/im/vector/app/test/fakes/FakeUri.kt
@@ -20,9 +20,14 @@ import android.net.Uri
import io.mockk.every
import io.mockk.mockk
-class FakeUri {
+class FakeUri(contentEquals: String? = null) {
+
val instance = mockk()
+ init {
+ contentEquals?.let { givenEquals(it) }
+ }
+
fun givenNonHierarchical() {
givenContent(schema = "mail", path = null)
}
@@ -31,4 +36,12 @@ class FakeUri {
every { instance.scheme } returns schema
every { instance.path } returns path
}
+
+ @Suppress("ReplaceCallWithBinaryOperator")
+ fun givenEquals(content: String) {
+ every { instance.equals(any()) } answers {
+ it.invocation.args.first() == content
+ }
+ every { instance.hashCode() } answers { content.hashCode() }
+ }
}
diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeUriFactory.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeUriFactory.kt
new file mode 100644
index 0000000000..90b615cb7c
--- /dev/null
+++ b/vector/src/test/java/im/vector/app/test/fakes/FakeUriFactory.kt
@@ -0,0 +1,31 @@
+/*
+ * 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.test.fakes
+
+import im.vector.app.features.onboarding.UriFactory
+import io.mockk.every
+import io.mockk.mockk
+
+class FakeUriFactory {
+
+ val instance = mockk().also {
+ every { it.parse(any()) } answers {
+ val input = it.invocation.args.first() as String
+ FakeUri().also { it.givenEquals(input) }.instance
+ }
+ }
+}
diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt
index b6e06bcdda..aeabcce7cd 100644
--- a/vector/src/test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt
+++ b/vector/src/test/java/im/vector/app/test/fakes/FakeVectorFeatures.kt
@@ -16,12 +16,14 @@
package im.vector.app.test.fakes
+import im.vector.app.features.DefaultVectorFeatures
import im.vector.app.features.VectorFeatures
+import io.mockk.every
+import io.mockk.spyk
-class FakeVectorFeatures : VectorFeatures {
- override fun onboardingVariant() = VectorFeatures.OnboardingVariant.FTUE_AUTH
- override fun isOnboardingAlreadyHaveAccountSplashEnabled() = true
- override fun isOnboardingSplashCarouselEnabled() = true
- override fun isOnboardingUseCaseEnabled() = true
- override fun isOnboardingPersonalizeEnabled() = true
+class FakeVectorFeatures : VectorFeatures by spyk() {
+
+ fun givenPersonalisationEnabled() {
+ every { isOnboardingPersonalizeEnabled() } returns true
+ }
}