mirror of
https://github.com/ArcaneChat/android.git
synced 2026-07-03 14:05:24 +02:00
Compare commits
85 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| deb4e356bd | |||
| 88d6992a9e | |||
| 5e6b09031a | |||
| 115ebf52b6 | |||
| 86451a00ff | |||
| c45a47e53c | |||
| a07723d515 | |||
| 02d7a6fb1f | |||
| d62e8fa864 | |||
| a03fd337ef | |||
| 27c0f45430 | |||
| a0f1232261 | |||
| 5640d31080 | |||
| 1542fc67ca | |||
| a99a4ec85b | |||
| fa17b134cf | |||
| 6898a37704 | |||
| 45b6a5c565 | |||
| 7330e6ba39 | |||
| 8f405914a2 | |||
| 6d09a6f318 | |||
| b349a7e601 | |||
| 0d610895d2 | |||
| a65c677ecc | |||
| db93aeacc0 | |||
| 09ff0d888b | |||
| b9c5e741e8 | |||
| 620d86c903 | |||
| 14e31650e7 | |||
| 9848cb5847 | |||
| bf7db005ef | |||
| aa032dbb37 | |||
| 9e1b9775e2 | |||
| fcd16d9e32 | |||
| 2a4bd2a001 | |||
| eacd089c8f | |||
| 9ed355efd1 | |||
| d1bb25004d | |||
| 8d1b010d1b | |||
| 8a9b76af3a | |||
| 4bbd9428e3 | |||
| 83646003b6 | |||
| 947887f335 | |||
| 69631cd857 | |||
| 0722426425 | |||
| 98d54bbe6a | |||
| c1dc0cf127 | |||
| 44a1ce42f0 | |||
| a0c6cef0fa | |||
| f96e89956c | |||
| ce9ded9d8b | |||
| cb2d9f16ac | |||
| c2a13ae9dd | |||
| f8c2403e61 | |||
| 616b495426 | |||
| a22baa7fc3 | |||
| 0b9bb9ff76 | |||
| ef96192d8b | |||
| 13c34d9480 | |||
| 610f4cebc2 | |||
| d4d15eee7c | |||
| ee3886285b | |||
| a32c20473f | |||
| db956d93cf | |||
| 6a5a75131e | |||
| a676a47ed4 | |||
| 2067122d2c | |||
| 8a0fe892f4 | |||
| 29a6f4eb31 | |||
| f610592bff | |||
| 898008e2a1 | |||
| 9eaa3ca182 | |||
| c98818e5cf | |||
| 7643ecd90a | |||
| e4993bd302 | |||
| 32ee198128 | |||
| ab0d33b3c0 | |||
| 2c8b781817 | |||
| e59655c456 | |||
| 2ce7e5a3c7 | |||
| 79c7419b71 | |||
| 2efaf1df93 | |||
| 814ac7d976 | |||
| b0e5c1c634 | |||
| bae998f811 |
+15
-1
@@ -2,9 +2,23 @@
|
||||
|
||||
## Unreleased
|
||||
|
||||
* Improve switch speed when changing profiles
|
||||
* Allow to switch profile when sharing or forwarding
|
||||
* Display message views count for channel owners
|
||||
* Don't notify notification-to-all from in-chat apps if the chat is muted
|
||||
* Allow to see inbox quota for all relays in connectivity screen
|
||||
* Update to core 2.36.0
|
||||
* Truncate file names in the middle, not at the end; important information are more often at the end
|
||||
* Remove email address from user profile
|
||||
* Mark external links with " ↗" to make them clear
|
||||
* Make QR code larger on "Add Second Device" screen
|
||||
* Add indication for blocked contacts in user profile
|
||||
* Show hint for empty contact search results
|
||||
* Fix: Show dialog if pasted QR codes are invalid
|
||||
* Fix: Refresh chat list when returning from conversation if selected profile changed
|
||||
* Fix: Update menu when using "select all" in contact selection
|
||||
* Fix: Avoid empty profiles after using "add as second device" from welcome screen
|
||||
* Fix multi-device seen messages synchronization when using multiple relays
|
||||
* Update to core 2.39.0
|
||||
|
||||
## v2.35.0
|
||||
2026-01
|
||||
|
||||
+1
-1
@@ -1957,7 +1957,7 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQr(JNIEnv *env, jo
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQrSvg(JNIEnv *env, jobject obj)
|
||||
{
|
||||
char* temp = dc_backup_provider_get_qr_svg(get_dc_backup_provider(env, obj));
|
||||
char* temp = dc_create_qr_svg(dc_backup_provider_get_qr(get_dc_backup_provider(env, obj)));
|
||||
jstring ret = JSTRING_NEW(temp);
|
||||
dc_str_unref(temp);
|
||||
return ret;
|
||||
|
||||
+1
-1
Submodule jni/deltachat-core-rust updated: 42f35b47cb...8b2e88f45a
@@ -54,7 +54,6 @@
|
||||
android:requestLegacyExternalStorage="true"
|
||||
tools:targetApi="TIRAMISU"
|
||||
android:hasFragileUserData="true"
|
||||
android:enableOnBackInvokedCallback="false"
|
||||
>
|
||||
|
||||
<!-- android car support, see https://developer.android.com/training/auto/start/,
|
||||
@@ -220,7 +219,7 @@
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||
|
||||
<activity android:name=".WelcomeActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/TextSecure.LightNoActionBar"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||
|
||||
|
||||
@@ -1663,52 +1663,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1317,7 +1317,7 @@ can not be identified easily.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Das verwendete <a href="#relays">Rekay</a> muss Ihre IP-Adresse kennen,
|
||||
<p>Das verwendete <a href="#relays">Relay</a> muss Ihre IP-Adresse kennen,
|
||||
sowie manchmal auch die Geräte Ihrer Kontakte, wenn Sie einen <a href="#experiments">Anruf</a> tätigen
|
||||
oder gemeinsam <a href="#webxdc">Apps</a> verwenden.</p>
|
||||
|
||||
@@ -1487,10 +1487,10 @@ Es wurden keine kritischen Probleme gefunden, aber zwei Probleme mit hohem Schwe
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Some features require certain permissions,
|
||||
e.g. you need to grant camera permission if you want to <a href="#howtoe2ee">scan an invite QR code</a>.</p>
|
||||
<p>Einige Features erfordern bestimmte Berechtigungen.
|
||||
So muss z.B. der Kamerazugriff gewährt werden, wenn du einen <a href="#howtoe2ee">QR-Code scannen</a> möchtest.</p>
|
||||
|
||||
<p>See <a href="https://delta.chat/en/gdpr#24-app-permissions">Privacy Policy</a> for a detailed overview.</p>
|
||||
<p>Siehe <a href="https://delta.chat/de/gdpr#24-berechtigungen-der-app">Datenschutzhinweise</a> für eine detaillierte Übersicht.</p>
|
||||
|
||||
<h3 id="wo-können-meine-freunde-delta-chat-finden">
|
||||
|
||||
@@ -1535,37 +1535,34 @@ Wir nutzen vielmehr öffentliche Finanzierungsquellen, die bisher aus der EU und
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Das EU-Projekt <a href="https://nextleap.eu">NEXTLEAP</a> finanzierte 2017 und 2018 die Entwicklung und Implementierung von “Verifizierten Gruppen” und “Setup Kontakt” und half auch bei der Integration der Ende-zu-Ende-Verschlüsselung durch <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Der <a href="https://opentechfund.org">Open Technology Fund</a> hat Delta Chat erstmals 2018/2019 bezuschusst; mit dieser Förderung (~$200K) wurden hauptsächlich die Android-App verbessert sowie das Release der Desktop-App in einer Betaversion ermöglicht. Basierend auf Nutzererfahrungen im Menschenrechtskontext wurden zudem verschiedene Funktionen entwickelt, siehe unseren Bericht <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
Die zweite Förderung 2019/2020 (~$300K) half uns bei der Erstellung der iOS-Version, unsere Kernbibliothek in die Programmiersprache “Rust” zu konvertieren und neue Funktionen für alle Plattformen bereitzustellen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Die <a href="https://nlnet.nl/">NLnet-Stiftung</a> bewilligte 2019/2020 46K EUR für die Fertigstellung von Rust-/Python-Bindungs und die Einrichtung eines Chat-Bot-Ökosystems.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Im Jahr 2021 erhielten wir weitere EU-Mittel für zwei “Next-Generation-Internet”-Anträge, nämlich für <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - E-Mail-Provider-Portabilitätsverzeichnis</a> (~97K EUR) und <a href="https://nlnet.nl/project/EmailPorting/">AEAP - E-Mail-Adressportierung</a> (~90K EUR). Ziel sind bessere Unterstützung von Mehrfachkonten, verbesserten QR-Code-Kontakt- und -Gruppen-Setups sowie Netzwerkverbesserungen auf allen Plattformen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Von Ende 2021 bis März 2023 erhielten wir eine <em>Internet-Freedom</em>-Finanzierung (500K USD) vom U.S. Bureau of Democracy, Human Rights and Labor (DRL). Diese Finanzierung unterstützte unsere langjährigen Ziele, Delta Chat benutzerfreundlicher und kompatibel mit einer breiten Palette von E-Mail-Servern weltweit zu machen, sowie widerstandsfähiger und sicherer an Orten, die häufig von Internetzensur und Abschaltungen betroffen sind.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 schlossen wir erfolgreich das vom OTF finanzierte
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure-Chatmail-Projekt</a> ab.
|
||||
Dieses fügt “Garantierte Verschlüsselung”,
|
||||
das <a href="https://delta.chat/chatmail">Chatmail-Server-Netzwerk</a>
|
||||
und „Instant Onboarding“ allen ab April 2024 veröffentlichten Anwendungen hinzu.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 und 2024 wurden wir in das Next-Generation-Internet-Programm (NGI)
|
||||
für unsere Arbeit an <a href="https://nlnet.nl/project/WebXDC-Push/">Webxdc-PUSH</a> aufgenommen,
|
||||
zusammen mit Kooperationspartnern, die an
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">Webxdc-Evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">Webxdc-XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> und
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
Alle diese Projekte sind teilweise abgeschlossen oder sollen Anfang 2025 abgeschlossen werden.</p>
|
||||
<p>Das EU-Projekt <a href="https://nextleap.eu">NEXTLEAP</a> finanzierte 2017 und 2018 die Entwicklung und Implementierung von “Verifizierten Gruppen” und “Setup Kontakt” und half auch bei der Integration der Ende-zu-Ende-Verschlüsselung durch <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Manchmal erhalten wir einmalige Spenden von Privatpersonen, wofür wir sehr dankbar sind. Im Jahr 2021 hat uns zum Beispiel eine großzügige Privatperson 4000 EUR überwiesen mit dem Betreff “Weiter so!” 💜 Wir verwenden dieses Geld zur Finanzierung von Entwicklungstreffen oder zur Deckung von Ad-hoc-Ausgaben, die nicht ohne weiteres vorhersehbar sind oder nicht aus öffentlichen Fördermitteln erstattet werden können.
|
||||
|
||||
@@ -1663,52 +1663,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1652,52 +1652,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>El proyecto de la UE <a href="https://nextleap.eu">NEXTLEAP</a> financió la investigación
|
||||
e implementación de grupos verificados y protocolos de contacto
|
||||
en 2017 y 2018 y también ayudó a integrar el cifrado de extremo a extremo
|
||||
a través de <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>El proyecto de la UE <a href="https://nextleap.eu">NEXTLEAP</a> financió la investigación
|
||||
e implementación de grupos verificados y protocolos de contacto
|
||||
en 2017 y 2018 y también ayudó a integrar el cifrado de extremo a extremo
|
||||
a través de <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1628,47 +1628,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>L’association <a href="https://opentechfund.org">Open Technology Fund</a> nous a octroyé une première subvention en 2018/2019 (de 200.000$ environ), grâce à laquelle nous avons pu apporter des améliorations majeures à l’application Android et publier une première version Beta de l’application de bureau. Elle nous a aussi permis d’ancrer notre recherche UX de développement de fonctionnalités dans des contextes de droits humains. <br />
|
||||
À ce sujet, vous pouvez consulter notre rapport en anglais <a href="https://delta.chat/en/2019-07-19-uxreport">“Needfinding and UX report”</a>.
|
||||
La seconde subvention de 2019/2020 (environ 300.000$) nous a permis de publier des version iOS de Delta Chat, de convertir notre bibliothèque principale en Rust et de créer de nouvelles fonctionnalités pour toutes les plateformes.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Nous recevons parfois des dons ponctuels de la part de personnes privées.
|
||||
|
||||
@@ -6,6 +6,10 @@ a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a[href^='http']::after {
|
||||
content: " ↗";
|
||||
}
|
||||
|
||||
h2, h3, h4 {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
@@ -1663,52 +1663,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Terkadang kami menerima sumbangan satu kali dari perorangan.
|
||||
|
||||
@@ -1647,49 +1647,37 @@ ordinate cronologicamente:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Il progetto UE <a href="https://nextleap.eu">NEXTLEAP</a> ha finanziato la ricerca
|
||||
e implementazione di gruppi verificati e impostazione di protocolli di contatto
|
||||
nel 2017 e nel 2018 e ha anche contribuito a integrare la crittografia end-to-end
|
||||
tramite <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>L’<a href="https://opentechfund.org">Open Technology Fund</a> ci ha dato una
|
||||
prima sovvenzione 2018/2019 (~$200K) durante la quale abbiamo notevolmente migliorato l’app Android
|
||||
e ha rilasciato una prima versione beta dell’app desktop, e che inoltre
|
||||
ancorato i nostri sviluppi delle funzionalità nella ricerca sulla UX nei contesti dei diritti umani,
|
||||
vedete il nostro <a href="https://delta.chat/en/2019-07-19-uxreport">Rapporto Needfinding e UX</a> conclusivo.
|
||||
La seconda sovvenzione 2019/2020 (~$300K) ci ha aiutato a farlo
|
||||
rilasciare nelle versioni Delta/iOS, per convertire la nostra libreria principale in Rust, e
|
||||
per fornire nuove funzionalità per tutte le piattaforme.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>La <a href="https://nlnet.nl/">fondazione NLnet</a> ha concesso nel 2019/2020 46.000 EUR per
|
||||
completando i collegamenti Rust/Python e avviando un ecosistema Chat-bot.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Nel 2021 abbiamo ricevuto ulteriori finanziamenti dall’UE per due proposte di Next-Generation-Internet, ovvero per <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - directory di portabilità dei provider di posta elettronica</a> (~97.000 EUR) e <a href="https://nlnet.nl/project/EmailPorting/">AEAP - portabilità degli indirizzi email</a> (~90.000 EUR), che hanno portato a un migliore supporto multi-profilo, a un miglioramento delle impostazioni di contatto e di gruppo tramite codice QR e a numerosi miglioramenti di rete su tutte le piattaforme.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Da fine 2021 a marzo 2023 abbiamo ricevuto un finanziamento <em>Internet Freedom</em> (500.000 USD) dall’Ufficio per la Democrazia, i Diritti Umani e il Lavoro (DRL) degli Stati Uniti.
|
||||
Questo finanziamento ha supportato i nostri obiettivi a lungo termine: rendere Delta Chat più utilizzabile
|
||||
e compatibile con un’ampia gamma di server email in tutto il mondo, e più resiliente e sicura
|
||||
in luoghi spesso colpiti da censura e blocchi di Internet.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 abbiamo completato con successo il progetto <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Chatmail Sicuro</a> finanziato da OTF,
|
||||
consentendoci di introdurre la crittografia garantita,
|
||||
creando una <a href="https://delta.chat/chatmail">rete di server di chatmail</a>
|
||||
e fornendo “inserimento immediato” in tutte le app rilasciate da aprile 2024 in poi.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Nel 2023 e nel 2024 siamo stati accettati nel programma Next Generation Internet (NGI)
|
||||
per il nostro lavoro in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
insieme ai partner di collaborazione che lavorano su
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> e
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
Tutti questi progetti sono parzialmente completati o saranno completati all’inizio del 2025.</p>
|
||||
<p>Il progetto UE <a href="https://nextleap.eu">NEXTLEAP</a> ha finanziato la ricerca
|
||||
e implementazione di gruppi verificati e impostazione di protocolli di contatto
|
||||
nel 2017 e nel 2018 e ha anche contribuito a integrare la crittografia end-to-end
|
||||
tramite <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>A volte riceviamo donazioni una tantum da privati.
|
||||
|
||||
@@ -1657,52 +1657,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> heeft twee subsidies toegekend.
|
||||
De eerste subsidie, voor 2018/2019, ter waarde van ong. $200,000, heeft enorm geholpen om de Android-app
|
||||
te verbeteren en een bètaversie van de computerclient vrij te geven.
|
||||
Verder hebben we onderzoek kunnen doen naar het uiterlijk in relatie tot mensenrechten -
|
||||
bekijk onze conclusie hier: <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
De tweede subsidie, voor 2019/2020, ter waarde van ong. $300,000, loopt nog en ondersteunt ons bij het
|
||||
vrijgeven van de iOS-client, het overzetten van de code van de kernbibliotheek naar Rust en
|
||||
het implementeren van nieuwe functies op alle platformen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Soms ontvangen we eenmalige donaties van privépersonen, waar we
|
||||
|
||||
@@ -105,8 +105,7 @@
|
||||
|
||||
</h2>
|
||||
|
||||
<p>Delta Chat is a reliable, decentralized and secure instant messaging app,
|
||||
available for mobile and desktop platforms.</p>
|
||||
<p>Delta Chat to niezawodna, zdecentralizowana i bezpieczna aplikacja do błyskawicznego przesyłania wiadomości, dostępna na platformy mobilne i stacjonarne.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -1464,31 +1463,35 @@ Raczej korzystamy z publicznych źródeł finansowania, jak dotąd pochodzących
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Unijny projekt <a href="https://nextleap.eu">NEXTLEAP</a> sfinansował badania i wdrożenie zweryfikowanych grup i ustawień protokołów kontaktowych w latach 2017 i 2018, a także pomógł zintegrować szyfrowanie end-to-end poprzez <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> przyznał nam pierwszy grant w 2018/2019 (~200 000 $), dzięki któremu znacznie ulepszyliśmy aplikację na Androida i wydaliśmy pierwszą wersję beta aplikacji na komputery stacjonarne, a także ugruntował rozwój naszych funkcji w badaniach UX w kontekście praw człowieka, zobacz nasz końcowy raport <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX</a>.
|
||||
Druga dotacja w 2019/2020 (~300 000 4) pomogła nam wydać wersje Delta/iOS, przekonwertować naszą podstawową bibliotekę na Rust i zapewnić nowe funkcje dla wszystkich platform.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://nlnet.nl/">Fundacja NLnet</a> przekazała w latach 2019/2020 kwotę 46 tys. EUR na wykonanie wiązań Rust/Python i uruchomienie ekosystemu Chat-bot.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>W latach 2023-2024 pomyślnie ukończyliśmy finansowany przez OTF <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">projekt Secure Chatmail</a>, co pozwoliło nam wprowadzić gwarantowane szyfrowanie, stworzyć <a href="https://delta.chat/chatmail">sieć serwerów chatmail</a> i zapewnić „natychmiastowe wdrażanie” we wszystkich aplikacjach wydanych od kwietnia 2024 r.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>W latach 2023 i 2024 zostaliśmy przyjęci do programu Next Generation Internet (NGI) za naszą pracę w <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>, wraz z partnerami współpracującymi pracującymi nad <a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>, <a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>, <a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> i <a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>. Wszystkie te projekty są częściowo ukończone lub zostaną ukończone na początku 2025 r.</p>
|
||||
<p>Unijny projekt <a href="https://nextleap.eu">NEXTLEAP</a> sfinansował badania i wdrożenie zweryfikowanych grup i ustawień protokołów kontaktowych w latach 2017 i 2018, a także pomógł zintegrować szyfrowanie end-to-end poprzez <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Czasami otrzymujemy jednorazowe darowizny od osób prywatnych. Na przykład w 2021 roku pewna hojna osoba przekazała nam 4K EUR w formie przelewu bankowego tytułem “kontynuujcie dobry rozwój!”. 💜 Takie pieniądze przeznaczamy na finansowanie spotkań rozwojowych lub na doraźne wydatki, których nie da się łatwo przewidzieć lub zrefundować z publicznych dotacji. Otrzymywanie większej ilości darowizn pomaga nam również stać się bardziej niezależnymi i długoterminowo rentownymi jako społeczność współpracowników.</p>
|
||||
|
||||
+237
-252
@@ -2,36 +2,36 @@
|
||||
<html lang="pt"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<li><a href="#o-que-é-o-delta-chat">O que é o Delta Chat</a>
|
||||
<ul>
|
||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
||||
<li><a href="#howtoe2ee">Como posso encontrar pessoas para conversar?</a></li>
|
||||
<li><a href="#por-que-um-chat-está-marcado-como-solicitação">Por que um chat está marcado como “Solicitação”?</a></li>
|
||||
<li><a href="#como-posso-colocar-dois-dos-meus-amigos-em-contato-um-com-o-outro">Como posso colocar dois dos meus amigos em contato um com o outro?</a></li>
|
||||
<li><a href="#dá-para-mandar-imagens-vídeos-e-outros-anexos-pelo-delta-chat">Dá para mandar imagens, vídeos e outros anexos pelo Delta Chat?</a></li>
|
||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||
<li><a href="#multiple-accounts">O que são perfis? Como posso alternar entre eles?</a></li>
|
||||
<li><a href="#quem-consegue-ver-a-imagem-do-meu-perfil">Quem consegue ver a imagem do meu perfil?</a></li>
|
||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
||||
<li><a href="#what-do-pinning-muting-and-archiving-mean">What do Pinning, Muting and Archiving mean?</a></li>
|
||||
<li><a href="#save">How do “Saved Messages” work?</a></li>
|
||||
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
||||
<li><a href="#signature">Posso definir uma Bio/Assinatura com o Delta Chat?</a></li>
|
||||
<li><a href="#o-que-significa-fixar-silenciar-e-arquivar">O que significa Fixar, Silenciar e Arquivar?</a></li>
|
||||
<li><a href="#save">Como funcionam as “Mensagens salvas”?</a></li>
|
||||
<li><a href="#o-que-significa-o-ponto-verde">O que significa o ponto verde?</a></li>
|
||||
<li><a href="#o-que-significam-os-carrapatos-mostrados-ao-lado-das-mensagens-de-saída">O que significam os carrapatos mostrados ao lado das mensagens de saída?</a></li>
|
||||
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
||||
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
||||
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
|
||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||
<li><a href="#edit">Corrigir erros de digitação e excluir mensagens após o envio</a></li>
|
||||
<li><a href="#ephemeralmsgs">Como funcionam as mensagens efêmeras?</a></li>
|
||||
<li><a href="#delold">O que acontece se eu ativar a opção “Apagar mensagens do dispositivo”?</a></li>
|
||||
<li><a href="#remove-account">Como posso excluir minha conta?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#groups">Groups</a>
|
||||
<li><a href="#groups">Grupos</a>
|
||||
<ul>
|
||||
<li><a href="#criação-de-um-grupo">Criação de um grupo</a></li>
|
||||
<li><a href="#addmembers">Add and remove members</a></li>
|
||||
<li><a href="#addmembers">Adicionar e remover membros</a></li>
|
||||
<li><a href="#deletei-minha-própria-conta-por-acidente">Deletei minha própria conta por acidente.</a></li>
|
||||
<li><a href="#não-quero-mais-receber-as-mensagens-de-um-grupo">Não quero mais receber as mensagens de um grupo.</a></li>
|
||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||
<li><a href="#clonagem-de-grupos">Clonagem de grupos</a></li>
|
||||
<li><a href="#quantos-membros-podem-participar-em-um-único-grupo">Quantos membros podem participar em um único grupo?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#webxdc">In-chat apps</a>
|
||||
<li><a href="#webxdc">Aplicativos embutidos</a>
|
||||
<ul>
|
||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||
<li><a href="#onde-posso-obter-aplicativos-embutidos">Onde posso obter aplicativos embutidos?</a></li>
|
||||
<li><a href="#how-private-are-in-chat-apps">How private are in-chat apps?</a></li>
|
||||
<li><a href="#create-xdc">How can I create my own in-chat apps?</a></li>
|
||||
</ul>
|
||||
@@ -105,118 +105,118 @@
|
||||
|
||||
</h2>
|
||||
|
||||
<p>Delta Chat is a reliable, decentralized and secure instant messaging app,
|
||||
available for mobile and desktop platforms.</p>
|
||||
<p>Delta Chat é um aplicativo de mensagens instantâneas confiável, descentralizado e seguro,
|
||||
disponível para desktop e plataformas móveis.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Instant creation of <strong>private chat profiles</strong>
|
||||
with secure and interoperable <a href="https://chatmail.at/relays">chatmail relays</a>
|
||||
that offer instant message delivery, and Push Notifications for iOS and Android devices.</p>
|
||||
<p>Criação instantânea de **perfis de chat privados **
|
||||
com <a href="https://chatmail.at/relays">relays chatmail</a> seguros e interoperáveis
|
||||
que oferecem entrega de mensagens instantâneas e Notificações Push para dispositivos iOS e Android.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and
|
||||
<a href="#multiclient">multi-device</a> support on all platforms
|
||||
and between different <a href="https://chatmail.at/clients">chatmail apps</a>.</p>
|
||||
<p>Suporte a <a href="#multiple-accounts">vários perfis</a> e
|
||||
a <a href="#multiclient">vários dispositivos</a> em todas as plataformas
|
||||
e entre diferentes <a href="https://chatmail.at/clients">aplicativos de chatmail</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Interactive <a href="#webxdc">in-chat apps</a> for gaming and collaboration</p>
|
||||
<p><a href="#webxdc">Aplicativos interativos embutidos</a> para jogos e colaboração</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="#security-audits">Audited end-to-end encryption</a>
|
||||
safe against network and server attacks.</p>
|
||||
<p><a href="#security-audits">Criptografia de ponta a ponta auditada</a>
|
||||
segura contra ataques à rede e ao servidor.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Free and Open Source software, both app and server side,
|
||||
built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet Standards</a>.</p>
|
||||
<p>Software gratuito e de código aberto, tanto no aplicativo quanto no servidor,
|
||||
desenvolvido com base nos <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Padrões da Internet</a>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
|
||||
|
||||
How can I find people to chat with? <a href="#howtoe2ee" class="anchor"></a>
|
||||
Como posso encontrar pessoas para conversar? <a href="#howtoe2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>First, note that Delta Chat is a private messenger.
|
||||
There is no public discovery, <em>you</em> decide about your contacts.</p>
|
||||
<p>Primeiro, observe que o Delta Chat é um mensageiro privado.
|
||||
Não há descoberta pública, <em>você</em> decide sobre seus contatos.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>If you are <strong>face to face</strong> with your friend or family,
|
||||
tap the <strong>QR Code</strong> icon <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
|
||||
on the main screen.<br />
|
||||
Ask your chat partner to <strong>scan</strong> the QR image
|
||||
with their Delta Chat app.</p>
|
||||
<p>Se você estiver <strong>cara a cara</strong> com seu amigo ou parente,
|
||||
toque no ícone de <strong>QR Code</strong> <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
|
||||
na tela principal.<br />
|
||||
Peça ao seu parceiro para <strong>escanear</strong> o QR code
|
||||
com o aplicativo Delta Chat dele.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>For a <strong>remote</strong> contact setup,
|
||||
from the same screen,
|
||||
click “Copy” or “Share” and send the <strong>invite link</strong>
|
||||
through another private chat.</p>
|
||||
<p>Para criar um contato <strong>remotamente</strong>,
|
||||
na mesma tela,
|
||||
clique em “Copiar” ou “Compartilhar” e envie o <strong>link do convite</strong>
|
||||
por meio de outro mensageiro privado.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Now wait while connection gets established.</p>
|
||||
<p>Agora, aguarde enquanto a conexão se estabelece.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>If both sides are online, they will soon see a chat
|
||||
and can start messaging securely.</p>
|
||||
<p>Se ambos os lados estiverem on-line, vocês logo verão um chat
|
||||
e poderão começar a enviar mensagens com segurança.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If one side is offline or in bad network,
|
||||
the ability to chat is delayed until connectivity is restored.</p>
|
||||
<p>Se um lado estiver off-line ou em uma rede ruim,
|
||||
a capacidade de acessar o chat será atrasada até que a conectividade seja restaurada.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Congratulations!
|
||||
You now will automatically use <a href="#e2ee">end-to-end encryption</a> with this contact.
|
||||
If you add each other to <a href="#groups">groups</a>, end-to-end encryption will be established among all members.</p>
|
||||
<p>Parabéns!
|
||||
Agora você usará automaticamente a <a href="#e2ee">criptografia de ponta a ponta</a> com esse contato.
|
||||
Se vocês se adicionarem a <a href="#groups">grupos</a>, a criptografia de ponta a ponta será estabelecida entre todos os membros.</p>
|
||||
|
||||
<h3 id="why-is-a-chat-marked-as-request">
|
||||
<h3 id="por-que-um-chat-está-marcado-como-solicitação">
|
||||
|
||||
|
||||
Why is a chat marked as “Request”? <a href="#why-is-a-chat-marked-as-request" class="anchor"></a>
|
||||
Por que um chat está marcado como “Solicitação”? <a href="#por-que-um-chat-está-marcado-como-solicitação" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>As being a private messenger,
|
||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
||||
<p>Por ser um mensageiro privado,
|
||||
somente amigos e familiares com quem você <a href="#howtoe2ee">compartilha seu QR code ou link de convite</a> podem escrever para você.</p>
|
||||
|
||||
<p>Your friends may share your contact with other friends,
|
||||
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
||||
<p>Seus amigos podem compartilhar seu contato com outros amigos,
|
||||
isso aparece como <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Solicitação</b></p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>You need to <strong>accept</strong> the request before you can reply.</p>
|
||||
<p>Você precisa <strong>aceitar</strong> a solicitação antes de poder responder.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>You can also <strong>delete</strong> it if you don’t want to chat with them for now.</p>
|
||||
<p>Você também pode <strong>excluir</strong> a solicitação se não quiser conversar com a pessoa por enquanto.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If you delete a request, future messages from that contact will still appear
|
||||
as message request, so you can change your mind. If you really don’t want to
|
||||
receive messages from this person, consider <strong>blocking</strong> them.</p>
|
||||
<p>Se você excluir uma solicitação, as mensagens futuras desse contato ainda aparecerão
|
||||
como solicitação de mensagem, assim você pode mudar de ideia. Se você realmente não quiser
|
||||
receber mensagens dessa pessoa, considere <strong>bloqueá-la</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="how-can-i-put-two-of-my-friends-in-contact-with-each-other">
|
||||
<h3 id="como-posso-colocar-dois-dos-meus-amigos-em-contato-um-com-o-outro">
|
||||
|
||||
|
||||
How can I put two of my friends in contact with each other? <a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other" class="anchor"></a>
|
||||
Como posso colocar dois dos meus amigos em contato um com o outro? <a href="#como-posso-colocar-dois-dos-meus-amigos-em-contato-um-com-o-outro" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Attach the first contact to the chat of the second using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → Contact</strong>.
|
||||
You can also add a little introduction message.</p>
|
||||
<p>Anexe o primeiro contato ao chat do segundo clicando em <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Botão de Anexo → Contato</strong>.
|
||||
Você também pode adicionar uma pequena mensagem de apresentação.</p>
|
||||
|
||||
<p>The second contact will receive a <strong>card</strong> then
|
||||
and can tap it to start chatting with the first contact.</p>
|
||||
<p>O segundo contato receberá um <strong>cartão</strong>
|
||||
e poderá tocar nele para começar a conversar com o primeiro contato.</p>
|
||||
|
||||
<h3 id="dá-para-mandar-imagens-vídeos-e-outros-anexos-pelo-delta-chat">
|
||||
|
||||
@@ -226,31 +226,31 @@ and can tap it to start chatting with the first contact.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Sim. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
||||
<p>Sim. Imagens, vídeos, arquivos, mensagens de voz etc. podem ser enviados usando os botões de<img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Anexo-</strong>
|
||||
ou <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Mensagem de Voz</strong></p>
|
||||
|
||||
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
|
||||
<p>Para fins de desempenho, as imagens são otimizadas e enviadas em um tamanho menor por padrão, mas você pode enviá-las como um “arquivo” para preservar o original.</p>
|
||||
|
||||
<h3 id="multiple-accounts">
|
||||
|
||||
|
||||
What are profiles? How can I switch between them? <a href="#multiple-accounts" class="anchor"></a>
|
||||
O que são perfis? Como posso alternar entre eles? <a href="#multiple-accounts" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>A profile is <strong>a name, a picture</strong> and some additional information for encrypting messages.
|
||||
A profile lives on your device(s) only
|
||||
and uses the server only to relay messages.</p>
|
||||
<p>Um perfil é <strong>um nome, uma foto</strong> e algumas informações adicionais para criptografar mensagens.
|
||||
Um perfil reside apenas em seu(s) dispositivo(s)
|
||||
e usa o servidor somente para transportar mensagens.</p>
|
||||
|
||||
<p>On first installation of Delta Chat a first profile is created.</p>
|
||||
<p>Na primeira instalação do Delta Chat, é criado um primeiro perfil.</p>
|
||||
|
||||
<p>Later, you can tap your profile image in the upper left corner to <strong>Add Profiles</strong>
|
||||
or to <strong>Switch Profiles</strong>.</p>
|
||||
<p>Depois, você pode tocar em sua imagem de perfil no canto superior esquerdo para <strong>Adicionar Conta</strong>
|
||||
ou para <strong>Mudar de Conta</strong>.</p>
|
||||
|
||||
<p>You may want to use separate profiles for political, family or work related activities.</p>
|
||||
<p>Talvez você queira usar perfis separados para atividades políticas, familiares ou atividades do trabalho.</p>
|
||||
|
||||
<p>You may also wish to learn <a href="#multiclient">how to use the same profile on multiple devices</a>.</p>
|
||||
<p>Talvez você também queira aprender <a href="#multiclient">como usar a mesma conta em vários dispositivos</a>.</p>
|
||||
|
||||
<h3 id="quem-consegue-ver-a-imagem-do-meu-perfil">
|
||||
|
||||
@@ -267,96 +267,96 @@ or to <strong>Switch Profiles</strong>.</p>
|
||||
<h3 id="signature">
|
||||
|
||||
|
||||
Can I set a Bio/Status with Delta Chat? <a href="#signature" class="anchor"></a>
|
||||
Posso definir uma Bio/Assinatura com o Delta Chat? <a href="#signature" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Yes,
|
||||
you can do so under <strong>Settings → Profile → Bio</strong>.
|
||||
Once you sent a message to a contact,
|
||||
they will see it when they view your contact details.</p>
|
||||
<p>Sim,
|
||||
você pode fazer isso em <strong>Configurações → Conta → Assinatura</strong>.
|
||||
Depois de enviar uma mensagem para um contato,
|
||||
ele verá sua assinatura quando visualizar seus detalhes de contato.</p>
|
||||
|
||||
<h3 id="what-do-pinning-muting-and-archiving-mean">
|
||||
<h3 id="o-que-significa-fixar-silenciar-e-arquivar">
|
||||
|
||||
|
||||
What do Pinning, Muting and Archiving mean? <a href="#what-do-pinning-muting-and-archiving-mean" class="anchor"></a>
|
||||
O que significa Fixar, Silenciar e Arquivar? <a href="#o-que-significa-fixar-silenciar-e-arquivar" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Use these tools to organize your chats and keep everything in its place:</p>
|
||||
<p>Use essas ferramentas para organizar seus chats e manter tudo em seu devido lugar:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>Pinned chats</strong> always stay atop of the chat list. You can use them to access your most loved chats quickly or temporarily to not forget about things.</p>
|
||||
<p>Os <strong>chats fixados</strong> sempre ficam no topo da lista de conversas. Você pode usá-los para acessar seus chats mais queridos rapidamente ou temporariamente para não se esquecer de nada.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Mute chats</strong> if you do not want to get notifications for them. Muted chats stay in place and you can also pin a muted chat.</p>
|
||||
<p><strong>Silencie os chats</strong> se não quiser receber notificações deles. Os bate-papos silenciados permanecem no lugar e você também pode fixar um chat silenciado.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
||||
They remain accessible above the chat list or via search
|
||||
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
|
||||
<p><strong>Arquive chats</strong> se não quiser mais vê-los em sua lista de conversas.
|
||||
Eles permanecem acessíveis acima da lista conversa ou por meio de pesquisa
|
||||
e são marcados como <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Arquivado</b></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
||||
<strong>Muted chats stay archived</strong> until you unarchive them manually.</p>
|
||||
<p>Quando um chat arquivado receber uma nova mensagem, a menos que esteja silenciado, ele <strong>sairá do arquivo</strong> e voltará à sua lista de conversas.
|
||||
<strong>Os chats silenciados permanecem arquivados</strong> até que você os desarquive manualmente.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>To use the functions, long tap or right click a chat in the chat list.</p>
|
||||
<p>Para usar as funções, toque e segure ou clique com o botão direito do mouse em um conversa na lista conversas.</p>
|
||||
|
||||
<h3 id="save">
|
||||
|
||||
|
||||
How do “Saved Messages” work? <a href="#save" class="anchor"></a>
|
||||
Como funcionam as “Mensagens salvas”? <a href="#save" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Saved Messages</strong> is a chat that you can use to easily remember and find messages.</p>
|
||||
<p><strong>Saved Messages</strong> é um chat que você pode usar para lembrar e localizar facilmente as mensagens.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>In any chat, long tap or right click a message and select <strong>Save</strong></p>
|
||||
<p>Em qualquer chat, dê um toque longo ou clique com o botão direito do mouse em uma mensagem e selecione <strong>Salvar</strong></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Saved messages are marked by the symbol
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" />
|
||||
next to the timestamp</p>
|
||||
<p>As mensagens salvas são marcadas com o símbolo
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" />
|
||||
ao lado do registro de data e hora</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Later, open the “Saved Messages” chat - and you will see the saved messages there.
|
||||
By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />,
|
||||
you can go back to the original message in the original chat</p>
|
||||
<p>Depois, abra o chat de “Mensagens salvas” - e você verá as mensagens salvas lá.
|
||||
Ao tocar em <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />,
|
||||
você pode voltar para a mensagem original no chat original</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
||||
<p>Por fim, você também pode usar “Mensagens Salvas” para fazer <strong>notas pessoais</strong> - abra o chat, digite algo, adicione uma foto ou uma mensagem de voz etc.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||
<p>Como as “Mensagens salvas” são sincronizadas, elas podem se tornar muito úteis para a transferência de dados entre dispositivos</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Messages stay saved even if they are edited or deleted -
|
||||
may it be by <a href="#edit">sender</a>, by <a href="#delold">device cleanup</a> or by <a href="#ephemeralmsgs">disappearing messages of other chats</a>.</p>
|
||||
<p>As mensagens permanecem salvas mesmo que sejam editadas ou excluídas -
|
||||
seja pelo <a href="#edit">remetente</a>, por <a href="#delold">limpeza do dispositivo</a> ou por <a href="#ephemeralmsgs">mensagens temporárias de outros chats</a>.</p>
|
||||
|
||||
<h3 id="what-does-the-green-dot-mean">
|
||||
<h3 id="o-que-significa-o-ponto-verde">
|
||||
|
||||
|
||||
What does the green dot mean? <a href="#what-does-the-green-dot-mean" class="anchor"></a>
|
||||
O que significa o ponto verde? <a href="#o-que-significa-o-ponto-verde" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>You can sometimes see a <strong>green dot</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
|
||||
next to the avatar of a contact.
|
||||
It means they were <strong>recently seen by you</strong> in the last 10 minutes,
|
||||
e.g. because they messaged you or sent a read receipt.</p>
|
||||
<p>Às vezes, você pode ver um <strong>ponto verde</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
|
||||
ao lado do avatar de um contato.
|
||||
Isso significa que ele foi <strong>visto recentemente por você</strong> nos últimos 10 minutos,
|
||||
por exemplo, porque ele enviou uma mensagem para você ou uma confirmação de leitura.</p>
|
||||
|
||||
<p>So this is not a real time online status
|
||||
and others will as well not always see that you are “online”.</p>
|
||||
<p>Portanto, essa não é uma checagem de status on-line em tempo real
|
||||
e outras pessoas também nem sempre verão que você está “on-line”.</p>
|
||||
|
||||
<h3 id="o-que-significam-os-carrapatos-mostrados-ao-lado-das-mensagens-de-saída">
|
||||
|
||||
@@ -368,132 +368,131 @@ and others will as well not always see that you are “online”.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||
<p><strong>Um tique</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||
significa que a mensagem foi enviada com sucesso para o <a href="#relays">relay</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||
indicate your contact has read the message.</p>
|
||||
<p>Dois ticks** <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||
indicam que seu contato leu a mensagem.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||
<p>Em <a href="#groups">grupos</a>, o segundo tique significa que pelo menos um membro leu a mensagem.</p>
|
||||
|
||||
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||
<p>Você só receberá o segundo tique se tanto você quanto um dos destinatários que leu a mensagem
|
||||
tiverem <strong>Configurações → Conversas → Confirmação de leitura</strong> ativada.</p>
|
||||
|
||||
<h3 id="edit">
|
||||
|
||||
|
||||
Correct typos and delete messages after sending <a href="#edit" class="anchor"></a>
|
||||
Corrigir erros de digitação e excluir mensagens após o envio <a href="#edit" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>You can edit the text of your messages after sending.
|
||||
For that, long tap or right click the message and select <strong>Edit</strong>
|
||||
or <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" />.</p>
|
||||
<p>Você pode editar o texto de suas mensagens após o envio.
|
||||
Para isso, toque longamente ou clique com o botão direito do mouse na mensagem e selecione <strong>Editar Mensagem</strong>
|
||||
ou <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" />.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If you have sent a message accidentally,
|
||||
from the same menu, select <strong>Delete</strong> and then <strong>Delete for Everyone</strong>.</p>
|
||||
<p>Se você tiver enviado uma mensagem acidentalmente,
|
||||
no mesmo menu, selecione <strong>Apagar</strong> e, em seguida, <strong>Apagar para Toda a Gente</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>While edited messages will have the word “Edited” next to the timestamp,
|
||||
deleted messages will be removed without a marker in the chat.
|
||||
Notifications are not sent and there is no time limit.</p>
|
||||
<p>Enquanto as mensagens editadas terão a palavra “Editado” ao lado do registro de data e hora,
|
||||
as mensagens excluídas serão removidas sem um marcador no chat.
|
||||
Não são enviadas notificações e não há limite de tempo.</p>
|
||||
|
||||
<p>Note, that the original message may still be received by chat members
|
||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||
<p>Observe que a mensagem original ainda pode ser recebida pelos membros do conversa
|
||||
que podem ter respondido, encaminhado, salvo, capturado a tela ou copiado a mensagem.</p>
|
||||
|
||||
<h3 id="ephemeralmsgs">
|
||||
|
||||
|
||||
How do disappearing messages work? <a href="#ephemeralmsgs" class="anchor"></a>
|
||||
Como funcionam as mensagens efêmeras? <a href="#ephemeralmsgs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>You can turn on “disappearing messages”
|
||||
in the settings of a chat,
|
||||
at the top right of the chat window,
|
||||
by selecting a time span
|
||||
between 5 minutes and 1 year.</p>
|
||||
<p>Você pode ativar a opção “mensagens temporárias”
|
||||
nas configurações de um conversa,
|
||||
no canto superior direito da janela conversa,
|
||||
selecionando um intervalo de tempo
|
||||
entre 5 minutos e 1 ano.</p>
|
||||
|
||||
<p>Until the setting is turned off again,
|
||||
each chat member’s Delta Chat app takes care
|
||||
of deleting the messages
|
||||
after the selected time span.
|
||||
The time span begins
|
||||
when the receiver first sees the message in Delta Chat.
|
||||
The messages are deleted both,
|
||||
on the servers,
|
||||
and in the apps itself.</p>
|
||||
<p>Até que a configuração seja desativada novamente,
|
||||
o aplicativo Delta Chat de cada membro do conversa se encarrega de
|
||||
de excluir as mensagens
|
||||
após o período de tempo selecionado.
|
||||
O intervalo de tempo começa
|
||||
quando o destinatário vê a mensagem pela primeira vez no Delta Chat.
|
||||
As mensagens são excluídas tanto
|
||||
nos servidores
|
||||
como nos próprios aplicativos.</p>
|
||||
|
||||
<p>Note that you can rely on disappearing messages
|
||||
only as long as you trust your chat partners;
|
||||
malicious chat partners can take photos,
|
||||
or otherwise save, copy or forward messages before deletion.</p>
|
||||
<p>Observe que você pode confiar no desaparecimento das mensagens
|
||||
somente se você confiar em seus parceiros do conversa;
|
||||
parceiros mal-intencionados de conversa podem tirar fotos,
|
||||
ou salvar, copiar ou encaminhar mensagens antes de excluí-las.</p>
|
||||
|
||||
<p>Apart from that,
|
||||
if one chat partner uninstalls Delta Chat,
|
||||
the (anyway encrypted) messages may take longer to get deleted from their server.</p>
|
||||
<p>Além disso,
|
||||
se um parceiro de conversa desinstalar o Delta Chat,
|
||||
as mensagens (de qualquer forma criptografadas) podem demorar mais para serem excluídas do servidor deles.</p>
|
||||
|
||||
<h3 id="delold">
|
||||
|
||||
|
||||
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
|
||||
O que acontece se eu ativar a opção “Apagar mensagens do dispositivo”? <a href="#delold" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>If you want to save storage on your device, you can choose to delete old
|
||||
messages automatically.</p>
|
||||
<p>Se quiser economizar espaço de armazenamento no dispositivo, você pode optar por excluir mensagens antigas automaticamente.</p>
|
||||
|
||||
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
|
||||
You can set a timeframe between “after an hour” and “after a year”;
|
||||
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
||||
older than that.</p>
|
||||
<p>Para ativá-la, vá para <strong>Configurações → Conversas → Apagar mensagens do dispositivo</strong>.
|
||||
Você pode definir um período de tempo entre “após uma hora” e “após um ano”;
|
||||
Dessa forma, <em>todas</em> as mensagens serão excluídas de seu dispositivo assim que forem
|
||||
mais antigas do que isso.</p>
|
||||
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
How can I delete my chat profile? <a href="#remove-account" class="anchor"></a>
|
||||
Como posso excluir minha conta? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>If you are using more than one chat profile,
|
||||
you can remove single ones in the top profile switcher menu (on Android and iOS),
|
||||
or in the sidebar with a right click (in the Desktop app).
|
||||
Chat profiles are only removed on the device where deletion was triggered.
|
||||
Chat profiles on other devices will continue to fully function.</p>
|
||||
<p>Se estiver usando mais de uma conta,
|
||||
você pode removê-las individualmente no menu superior de mudar de conta (no Android e no iOS),
|
||||
ou na barra lateral com um clique no botão direito do mouse (no aplicativo para desktop).
|
||||
As contas são removidas somente no dispositivo em que a exclusão foi acionada.
|
||||
Contas em outros dispositivos continuarão funcionando plenamente.</p>
|
||||
|
||||
<p>If you use a single default chat profile you can simply uninstall the app.
|
||||
This will still automatically trigger deletion of all associated address data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org address-deletion</a>
|
||||
or the respective page from your chosen <a href="https://chatmail.at/relays">3rd party chatmail server</a>.</p>
|
||||
<p>Se você usar uma conta única padrão, poderá simplesmente desinstalar o aplicativo.
|
||||
Isso ainda acionará automaticamente a exclusão de todos os dados de endereço associados no servidor de chatmail.
|
||||
Para obter mais informações, consulte <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org address-deletion</a>
|
||||
ou a respectiva página do <a href="https://chatmail.at/relays">servidor de chatmail de terceiros</a> que você escolheu.</p>
|
||||
|
||||
<h2 id="groups">
|
||||
|
||||
|
||||
Groups <a href="#groups" class="anchor"></a>
|
||||
Grupos <a href="#groups" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
|
||||
<p>Groups let several people chat together privately with <strong>equal rights</strong>.</p>
|
||||
<p>Os grupos permitem que várias pessoas conversem em particular com <strong>direitos iguais</strong>.</p>
|
||||
|
||||
<p>Anyone can
|
||||
change the group name or avatar,
|
||||
<a href="#addmembers">add or remove members</a>,
|
||||
set <a href="#ephemeralmsgs">disappearing messages</a>,
|
||||
and <a href="#edit">delete their own messages</a> from all member’s devices.</p>
|
||||
<p>Qualquer pessoa pode
|
||||
alterar o nome do grupo ou o avatar,
|
||||
<a href="#addmembers">adicionar ou remover membros</a>,
|
||||
definir <a href="#ephemeralmsgs">mensagens temporárias</a>,
|
||||
e <a href="#edit">excluir suas próprias mensagens</a> dos dispositivos de todos os membros.</p>
|
||||
|
||||
<p>Because all members have the same rights, groups work best among <strong>trusted friends and family</strong>.</p>
|
||||
<p>Como todos os membros têm os mesmos direitos, os grupos funcionam melhor entre <strong>amigos e familiares de confiança</strong>.</p>
|
||||
|
||||
<h3 id="criação-de-um-grupo">
|
||||
|
||||
@@ -518,33 +517,33 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
||||
<h3 id="addmembers">
|
||||
|
||||
|
||||
Add and remove members <a href="#addmembers" class="anchor"></a>
|
||||
Adicionar e remover membros <a href="#addmembers" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>All group members have the <strong>same rights</strong>.
|
||||
For this reason, everyone can delete any member or add new ones.</p>
|
||||
<p>Todos os membros do grupo têm os <strong>mesmos direitos</strong>.
|
||||
Por este motivo, todos podem remover qualquer membro ou adicionar novos membros.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||
<p>Para <strong>adicionar ou remover membros</strong>, toque no nome do grupo dentro do chat e selecione o membro a adicionar ou a remover.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If the member is not yet in your contact list, but <strong>face to face</strong> with you,
|
||||
from the same screen, show a <strong>QR code</strong>.<br />
|
||||
Ask your chat partner to <strong>scan</strong> the QR image with their Delta Chat app by tapping
|
||||
<img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> on the main screen.</p>
|
||||
<p>Se o membro ainda não estiver na sua lista de contactos, mas estiver <strong>cara a cara</strong> com você,
|
||||
na mesma tela, moste um <strong>QR code</strong>.<br />
|
||||
Peça ao seu parceiro de conversa para <strong>escanear</strong> o QR code com o Delta Chat dele, tocando em
|
||||
<img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> na tela inicial.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>For a <strong>remote</strong> member addition,
|
||||
click “Copy” or “Share” and send the <strong>invite link</strong>
|
||||
through another private chat to the new member.</p>
|
||||
<p>Para adicionar um membro <strong>remotamente</strong>,
|
||||
clique em “Copiar” ou “Compartilhar” e envie o link do <strong>convite</strong>
|
||||
por meio de outro mensageiro privado para o novo membro.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>QR code and invite link can be used to add several members.
|
||||
However, since groups are <a href="#groups">meant for trusted people</a>, avoid sharing them publicly.</p>
|
||||
<p>O QR code e o link de convite podem ser usados para adicionar vários membros.
|
||||
No entanto, como os grupos são <a href="#groups">destinados a pessoas de confiança</a>, evite compartilhá-los publicamente.</p>
|
||||
|
||||
<h3 id="deletei-minha-própria-conta-por-acidente">
|
||||
|
||||
@@ -571,60 +570,60 @@ Se você quiser entrar mais tarde no grupo novamente, peça a outra pessoa do gr
|
||||
|
||||
<p>Uma alternativa é “silenciar” um grupo. Fazendo isso, você receberá todas as mensagens e ainda poderá escrever, mas não será receberá mais notificações d enovas mensagens.</p>
|
||||
|
||||
<h3 id="cloning-a-group">
|
||||
<h3 id="clonagem-de-grupos">
|
||||
|
||||
|
||||
Cloning a group <a href="#cloning-a-group" class="anchor"></a>
|
||||
Clonagem de grupos <a href="#clonagem-de-grupos" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>You can duplicate a group to start a separate discussion
|
||||
or to exclude members without them noticing.</p>
|
||||
<p>Você pode duplicar um grupo para iniciar uma discussão separada
|
||||
ou para excluir membros sem que eles percebam.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Open the group profile and tap <strong>Clone Chat</strong> (Android/iOS),
|
||||
or right-click the group in the chat list (Desktop).</p>
|
||||
<p>Abra o perfil do grupo e toque em <strong>Clonar conversa</strong> (Android/iOS),
|
||||
ou clique com o botão direito do mouse no grupo na lista de conversa (desktop).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Set a new name, choose an avatar, and adjust the member list if needed.</p>
|
||||
<p>Defina um novo nome, escolha um avatar e ajuste a lista de membros, se necessário.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>The new group is <strong>fully independent</strong> from the original,
|
||||
which continues to work as before.</p>
|
||||
<p>O novo grupo é <strong>totalmente independente</strong> do original,
|
||||
que continua funcionando como antes.</p>
|
||||
|
||||
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||
<h3 id="quantos-membros-podem-participar-em-um-único-grupo">
|
||||
|
||||
|
||||
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||
Quantos membros podem participar em um único grupo? <a href="#quantos-membros-podem-participar-em-um-único-grupo" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>There is no strict technical limit,
|
||||
but more than 150 is not recommended.</p>
|
||||
<p>Não há um limite técnico rigoroso,
|
||||
mas não é recomendável mais de 150.</p>
|
||||
|
||||
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||
<p>À medida que os grupos se tornam maiores, eles podem se tornar socialmente instáveis e podem precisar de uma hierarquia -
|
||||
mas o Delta Chat é um mensageiro privado para conversar com <a href="#groups">direitos iguais</a>.
|
||||
Consulte o <a href="https://pt.wikipedia.org/wiki/N%C3%BAmero_de_Dunbar">Número de Dunbar</a> para obter mais informações.</p>
|
||||
|
||||
<h2 id="webxdc">
|
||||
|
||||
|
||||
In-chat apps <a href="#webxdc" class="anchor"></a>
|
||||
Aplicativos embutidos <a href="#webxdc" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
|
||||
<p>You can send apps to a chat - games, editors, polls and other tools.
|
||||
This makes Delta Chat a truly extensible messenger.</p>
|
||||
<p>Você pode enviar aplicativos para um chat - jogos, editores, enquetes e outras ferramentas.
|
||||
Isso torna o Delta Chat um mensageiro realmente extensível.</p>
|
||||
|
||||
<h3 id="where-can-i-get-in-chat-apps">
|
||||
<h3 id="onde-posso-obter-aplicativos-embutidos">
|
||||
|
||||
|
||||
Where can I get in-chat apps? <a href="#where-can-i-get-in-chat-apps" class="anchor"></a>
|
||||
Onde posso obter aplicativos embutidos? <a href="#onde-posso-obter-aplicativos-embutidos" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1659,52 +1658,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1658,52 +1658,38 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS и macOS App Store, Microsof
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Проект ЕС <a href="https://nextleap.eu">NEXTLEAP</a> финансировал исследование
|
||||
и внедрение проверенных групп и настройку протоколов контактов
|
||||
в 2017 и 2018 годах, а также помог интегрировать сквозное шифрование
|
||||
через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Фонд <a href="https://opentechfund.org">Open Technology Fund</a> предоставил нам
|
||||
первый грант в 2018/2019 году (~$200 тыс.), благодаря которому мы существенно улучшили приложение для Android
|
||||
и выпустили первую бета-версию приложения для настольных систем, а также провели
|
||||
исследования в области UX в контексте прав человека,
|
||||
см. наш заключительный отчет <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
Второй грант, полученный в 2019/2020 году (~$300 тыс.), помог нам
|
||||
выпустить версии Delta/iOS, перевести наш основной код на Rust и
|
||||
предоставить новые функции для всех платформ.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://nlnet.nl/">Фонд NLnet</a> выделил в 2019/2020 году 46 тыс. евро на
|
||||
завершение привязки Rust/Python и создание экосистемы чат-ботов.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>В 2021 г. мы получили дополнительное финансирование из ЕС для двух Next-Generation-Internet
|
||||
целей, а именно для <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - e-mail provider portability directory</a> (~97 тыс. евро) и <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90 тыс. евро). Это привело к улучшению поддержки нескольких профилей, улучшению настройки контактов и групп с помощью QR-кода и многим улучшениям в сетевом взаимодействии на всех платформах.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>С конца 2021 года по март 2023 года мы получили финансирование в размере ($500 тыс.) от
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL) для поддержки <em>свободы интернета</em>.
|
||||
Это финансирование поддержало наши долгосрочные цели, сделать Delta Chat более удобным для использования
|
||||
и совместимым с широким спектром электронных почтовых серверов по всему миру, а также более устойчивым
|
||||
и безопасным в местах, часто подвергающихся интернет-цензуре и отключениям.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 мы завершили проект финансируемый OTF
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
что позволило нам внедрить гарантированное шифрование,
|
||||
создать сеть серверов <a href="https://delta.chat/chatmail">chatmail</a>
|
||||
и обеспечить “немедленную регистрацию” во всех приложениях, выпущенных с апреля 2024 года.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>В 2023 и 2024 годах мы были приняты в программу Next Generation Internet (NGI)
|
||||
за нашу работу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
в сотрудничестве с партнерами, работающими над
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> и
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
Все эти проекты частично завершены или будут завершены в начале 2025 года.</p>
|
||||
<p>Проект ЕС <a href="https://nextleap.eu">NEXTLEAP</a> финансировал исследование
|
||||
и внедрение проверенных групп и настройку протоколов контактов
|
||||
в 2017 и 2018 годах, а также помог интегрировать сквозное шифрование
|
||||
через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Иногда мы получаем разовые пожертвования от физических лиц.
|
||||
|
||||
@@ -1663,52 +1663,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1665,52 +1665,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> na dha grantin e parë
|
||||
për 2018/2019 (~200 mijë dollarë) me të cilin përmirësuam ndjeshëm aplikacionin
|
||||
për Android dhe hodhëm në qarkullim një version të parë beta aplikacioni për Desktop,
|
||||
si dhe i afroi më tepër zhvillimet tona për veçori me kërkime UX në kontekste të drejtash të njeriut,
|
||||
shihni <a href="https://delta.chat/en/2019-07-19-uxreport">raportin tonë përfundimtar “Needfinding and UX”</a>.
|
||||
Granti i dytë për 2019/2020 (~$300K) na ndihmoi të hedhim në qarkullim
|
||||
versione Delta/iOS, për të shndërruar bibliotekën tonë bazë në Rust, si dhe
|
||||
për të sjellë veçori të reja për krejt platformat.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Ndonjëherë marrim dhurime unike nga individë privatë.
|
||||
|
||||
@@ -1445,38 +1445,35 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microso
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Проект ЄС <a href="https://nextleap.eu">NEXTLEAP</a> фінансував дослідження та впровадження верифікованих груп і протоколів встановлення контактів у 2017 та 2018 роках, а також допоміг інтегрувати наскрізне шифрування через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> надав нам два гранти.
|
||||
Перший грант 2018/2019 року (~$200K), допоміг значно покращили додаток для Android
|
||||
і випустили першу бета-версію додатка для ПК, і який до того ж
|
||||
закріпив наші розробки функцій у дослідженнях UX у контексті прав людини,
|
||||
дивіться наш підсумковий звіт <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
Другий грант 2019/2020 року (~$300K) допоміг нам
|
||||
випустити Delta/iOS версію, конвертувати нашу основному бібліотеку на Rust,
|
||||
і додати нові функції для всіх платформ.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Фонд <a href="https://nlnet.nl/">NLnet</a> виділив у 2019/2020 роках 46 тисяч євро на
|
||||
завершення прив’язок Rust/Python та запуск екосистеми чат-ботів.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>У 2023-2024 роках ми успішно завершили проєкт <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail</a>, що фінансувався OTF, що дозволило нам запровадити гарантоване шифрування, створити <a href="https://delta.chat/chatmail">мережу серверів chatmail</a> та забезпечити “миттєву реєстрацію” у всіх застосунках, випущених з квітня 2024 року.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>У 2023 та 2024 роках нас прийняли до програми Next Generation Internet (NGI) за нашу роботу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>, а також у співпраці з партнерами, які працюють над <a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>, <a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>, <a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> та <a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>. Усі ці проєкти частково завершені або будуть завершені на початку 2025 року.</p>
|
||||
<p>Проект ЄС <a href="https://nextleap.eu">NEXTLEAP</a> фінансував дослідження та впровадження верифікованих груп і протоколів встановлення контактів у 2017 та 2018 роках, а також допоміг інтегрувати наскрізне шифрування через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Іноді ми отримуємо одноразові пожертви від приватних осіб. Наприклад, у 2021 році щедра приватна особа перерахував нам 4 тис. євро з повідомленням «так тримати!». 💜 Ми використовуємо такі пожертви для фінансування зборів на розвиток або для тимчасових витрат, які важко передбачити або відшкодувати за рахунок грантів державного фінансування. Отримання більшої кількості пожертв також допомагає нам стати більш незалежними та довгостроково життєздатними як спільнота контриб’юторів.</p>
|
||||
|
||||
@@ -1624,40 +1624,35 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microso
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://nextleap.eu">NEXTLEAP</a>欧盟项目资助了以下研究和实施工作:在 2017 年和 2018 年实施的验证组和设置联系协议和通过 <a href="https://autocrypt.org">Autocrypt</a>整合了端到端加密。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>在<a href="https://opentechfund.org">开放技术基金</a> 2018/2019 年提供的第一笔赠款(约 20 万美元)期间,我们显著改善了安卓应用,发布了第一个桌面测试版,并根据人权方面的用户体验研究进行了功能开发,请参阅我们的结论<a href="https://delta.chat/en/2019-07-19-uxreport">《需求发现与用户体验报告》</a>。2019/2020 年的第二笔赠款(约 30 万美元)对发布 Delta/iOS 版本,将核心库转换到 Rust ,以及为所有平台开发新功能提供了帮助。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://nlnet.nl/">NLnet 基金会</a> 2019/2020 年拨款 4.6 万欧元,用于完成 Rust/Python 绑定并建立聊天机器人生态系统。</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 年,我们成功完成了 OTF 资助的
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">安全 Chatmail 项目</a>,
|
||||
使我们能够引入保证的加密,
|
||||
创建一个 <a href="https://delta.chat/chatmail">Chatmail 服务器网络</a>,
|
||||
并在 2024 年 4 月起发布的所有应用中提供“即时入职”。</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>在 2023 年和 2024 年,我们的 <a href="https://nlnet.nl/project/WebXDC-Push/">WebXDC PUSH</a> 工作已在下一代互联网 (NGI) 中获得认可,
|
||||
并与致力于
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">WebXDC evolve</a>、
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">WebXDC XMPP</a>、
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> 和
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a> 的合作伙伴合作。
|
||||
所有这些项目都已部分完成或将在 2025 年初完成。</p>
|
||||
<p><a href="https://nextleap.eu">NEXTLEAP</a>欧盟项目资助了以下研究和实施工作:在 2017 年和 2018 年实施的验证组和设置联系协议和通过 <a href="https://autocrypt.org">Autocrypt</a>整合了端到端加密。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>我们有时会收到个人的一次性捐款。 例如,2021 年,一位慷慨的人士以 “继续保持良好的发展态势!”为主题通过银行向我们捐赠了4千欧元💜。 我们用这些钱来资助发展活动或支付不容易预测或从公共基金中报销的临时费用。收到更多的捐款也有助于我们作为一个贡献者社区变得更加独立和长期可持续。</p>
|
||||
|
||||
@@ -211,11 +211,11 @@ public class Rpc {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set configuration values from a QR code. (technically from the URI that is stored in the qrcode)
|
||||
* Before this function is called, `checkQr()` should confirm the type of the
|
||||
* QR code is `account` or `webrtcInstance`.
|
||||
* Set configuration values from a QR code (technically from the URI stored in it).
|
||||
* Before this function is called, `check_qr()` should be used to get the QR code type.
|
||||
* <p>
|
||||
* Internally, the function will call dc_set_config() with the appropriate keys,
|
||||
* "DCACCOUNT:" and "DCLOGIN:" QR codes configure the account, but I/O mustn't be started for
|
||||
* such QR codes, consider using [`Self::add_transport_from_qr`] which also restarts I/O.
|
||||
*/
|
||||
public void setConfigFromQr(Integer accountId, String qrContent) throws RpcException {
|
||||
transport.call("set_config_from_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
|
||||
@@ -234,6 +234,11 @@ public class Rpc {
|
||||
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "batch_get_config", mapper.valueToTree(accountId), mapper.valueToTree(keys));
|
||||
}
|
||||
|
||||
/** Returns all `ui.*` config keys that were set by the UI. */
|
||||
public java.util.List<String> getAllUiConfigKeys(Integer accountId) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<java.util.List<String>>(){}, "get_all_ui_config_keys", mapper.valueToTree(accountId));
|
||||
}
|
||||
|
||||
public void setStockStrings(java.util.Map<String, String> strings) throws RpcException {
|
||||
transport.call("set_stock_strings", mapper.valueToTree(strings));
|
||||
}
|
||||
@@ -449,11 +454,11 @@ public class Rpc {
|
||||
* Delete a chat.
|
||||
* <p>
|
||||
* Messages are deleted from the device and the chat database entry is deleted.
|
||||
* After that, the event #DC_EVENT_MSGS_CHANGED is posted.
|
||||
* After that, a `MsgsChanged` event is emitted.
|
||||
* Messages are deleted from the server in background.
|
||||
* <p>
|
||||
* Things that are _not done_ implicitly:
|
||||
* <p>
|
||||
* - Messages are **not deleted from the server**.
|
||||
* - The chat or the contact is **not blocked**, so new messages from the user/the group may appear as a contact request
|
||||
* and the user may create the chat again.
|
||||
* - **Groups are not left** - this would
|
||||
@@ -733,11 +738,26 @@ public class Rpc {
|
||||
return transport.callForResult(new TypeReference<Integer>(){}, "add_device_message", mapper.valueToTree(accountId), mapper.valueToTree(label), mapper.valueToTree(msg));
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark all messages in all chats as _noticed_.
|
||||
* Skips messages from blocked contacts, but does not skip messages in muted chats.
|
||||
* <p>
|
||||
* _Noticed_ messages are no longer _fresh_ and do not count as being unseen
|
||||
* but are still waiting for being marked as "seen" using markseen_msgs()
|
||||
* (read receipts aren't sent for noticed messages).
|
||||
* <p>
|
||||
* Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED.
|
||||
* See also markseen_msgs().
|
||||
*/
|
||||
public void marknoticedAllChats(Integer accountId) throws RpcException {
|
||||
transport.call("marknoticed_all_chats", mapper.valueToTree(accountId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark all messages in a chat as _noticed_.
|
||||
* _Noticed_ messages are no longer _fresh_ and do not count as being unseen
|
||||
* but are still waiting for being marked as "seen" using markseen_msgs()
|
||||
* (IMAP/MDNs is not done for noticed messages).
|
||||
* (read receipts aren't sent for noticed messages).
|
||||
* <p>
|
||||
* Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED.
|
||||
* See also markseen_msgs().
|
||||
@@ -893,6 +913,15 @@ public class Rpc {
|
||||
return transport.callForResult(new TypeReference<MessageInfo>(){}, "get_message_info_object", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns count of read receipts on message.
|
||||
* <p>
|
||||
* This view count is meant as a feedback measure for the channel owner only.
|
||||
*/
|
||||
public Integer getMessageReadReceiptCount(Integer accountId, Integer messageId) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<Integer>(){}, "get_message_read_receipt_count", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||
}
|
||||
|
||||
/** Returns contacts that sent read receipts and the time of reading. */
|
||||
public java.util.List<MessageReadReceipt> getMessageReadReceipts(Integer accountId, Integer messageId) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<java.util.List<MessageReadReceipt>>(){}, "get_message_read_receipts", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
/**
|
||||
* cheaper version of fullchat, omits: - contacts - contact_ids - fresh_message_counter - ephemeral_timer - self_in_group - was_seen_recently - can_send
|
||||
* cheaper version of fullchat, omits: - contact_ids - fresh_message_counter - ephemeral_timer - self_in_group - was_seen_recently - can_send
|
||||
* <p>
|
||||
* used when you only need the basic metadata of a chat like type, name, profile picture
|
||||
*/
|
||||
|
||||
@@ -38,7 +38,7 @@ public class Contact {
|
||||
* <p>
|
||||
* UI should display the information in the contact's profile as follows:
|
||||
* <p>
|
||||
* - If `verifierId` != 0, display text "Introduced by ..." with the name and address of the contact formatted by `name_and_addr`/`nameAndAddr`. Prefix the text by a green checkmark.
|
||||
* - If `verifierId` != 0, display text "Introduced by ..." with the name of the contact. Prefix the text by a green checkmark.
|
||||
* <p>
|
||||
* - If `verifierId` == 0 and `isVerified` != 0, display "Introduced" prefixed by a green checkmark.
|
||||
* <p>
|
||||
|
||||
@@ -412,7 +412,9 @@ public abstract class EventType {
|
||||
/**
|
||||
* One or more transports has changed.
|
||||
* <p>
|
||||
* This event is used for tests to detect when transport synchronization messages arrives. UIs don't need to use it, it is unlikely that user modifies transports on multiple devices simultaneously.
|
||||
* UI should update the list.
|
||||
* <p>
|
||||
* This event is emitted when transport synchronization messages arrives, but not when the UI modifies the transport list by itself.
|
||||
*/
|
||||
public static class TransportsModified extends EventType {
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ public class FullChat {
|
||||
public ChatType chatType;
|
||||
public String color;
|
||||
public java.util.List<Integer> contactIds;
|
||||
public java.util.List<Contact> contacts;
|
||||
public Integer ephemeralTimer;
|
||||
public Integer freshMessageCounter;
|
||||
public Integer id;
|
||||
|
||||
@@ -12,6 +12,7 @@ public class Message {
|
||||
public String error;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String file;
|
||||
/** The size of the file in bytes, if applicable. If message is a pre-message, then this is the size of the file to be downloaded. */
|
||||
public Integer fileBytes;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String fileMime;
|
||||
|
||||
@@ -22,6 +22,7 @@ public abstract class MessageLoadResult {
|
||||
public String error;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String file;
|
||||
/** The size of the file in bytes, if applicable. If message is a pre-message, then this is the size of the file to be downloaded. */
|
||||
public Integer fileBytes;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String fileMime;
|
||||
|
||||
@@ -4,6 +4,7 @@ public class DcAccounts {
|
||||
|
||||
public DcAccounts(String dir) {
|
||||
accountsCPtr = createAccountsCPtr(dir);
|
||||
if (accountsCPtr == 0) throw new RuntimeException("createAccountsCPtr() returned null pointer");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -54,7 +54,6 @@ public class AllMediaDocumentsFragment
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
|
||||
dcContext = DcHelper.getContext(getContext());
|
||||
chatId = getArguments().getInt(CHAT_ID_EXTRA, -1);
|
||||
viewtype1 = getArguments().getInt(VIEWTYPE1, 0);
|
||||
viewtype2 = getArguments().getInt(VIEWTYPE2, 0);
|
||||
|
||||
@@ -52,7 +52,6 @@ public class AllMediaGalleryFragment
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
|
||||
dcContext = DcHelper.getContext(getContext());
|
||||
chatId = getArguments().getInt(CHAT_ID_EXTRA, -1);
|
||||
|
||||
getLoaderManager().initLoader(0, null, this);
|
||||
|
||||
@@ -23,7 +23,9 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Activity container for selecting a list of contacts.
|
||||
@@ -34,6 +36,9 @@ import java.util.List;
|
||||
public class ContactMultiSelectionActivity extends ContactSelectionActivity {
|
||||
|
||||
public static final String CONTACTS_EXTRA = "contacts_extra";
|
||||
public static final String REMOVED_CONTACTS_EXTRA = "removed_contacts_extra";
|
||||
|
||||
private ArrayList<Integer> preselectedContacts;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle, boolean ready) {
|
||||
@@ -44,6 +49,9 @@ public class ContactMultiSelectionActivity extends ContactSelectionActivity {
|
||||
// it's a bit confusing having one "X" button on the left and one on the right -
|
||||
// and the "clear search" button is not that important.
|
||||
getToolbar().setUseClearButton(false);
|
||||
|
||||
// Store preselected contacts to track which ones were removed
|
||||
preselectedContacts = getIntent().getIntegerArrayListExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -72,6 +80,19 @@ public class ContactMultiSelectionActivity extends ContactSelectionActivity {
|
||||
Intent resultIntent = getIntent();
|
||||
List<Integer> selectedContacts = contactsFragment.getSelectedContacts();
|
||||
resultIntent.putIntegerArrayListExtra(CONTACTS_EXTRA, new ArrayList<>(selectedContacts));
|
||||
|
||||
// Calculate which contacts were removed (preselected but not in final selection)
|
||||
if (preselectedContacts != null) {
|
||||
Set<Integer> selectedSet = new HashSet<>(selectedContacts);
|
||||
ArrayList<Integer> removedContacts = new ArrayList<>();
|
||||
for (Integer preselectedId : preselectedContacts) {
|
||||
if (!selectedSet.contains(preselectedId)) {
|
||||
removedContacts.add(preselectedId);
|
||||
}
|
||||
}
|
||||
resultIntent.putIntegerArrayListExtra(REMOVED_CONTACTS_EXTRA, removedContacts);
|
||||
}
|
||||
|
||||
setResult(RESULT_OK, resultIntent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,8 +81,9 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home: super.onBackPressed(); return true;
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -22,6 +22,7 @@ import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.SparseIntArray;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
@@ -29,6 +30,7 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -84,6 +86,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
private OnContactSelectedListener onContactSelectedListener;
|
||||
private String cursorFilter;
|
||||
private RecyclerView recyclerView;
|
||||
private TextView emptyView;
|
||||
private ActionMode actionMode;
|
||||
private ActionMode.Callback actionModeCallback;
|
||||
|
||||
@@ -113,6 +116,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
View view = inflater.inflate(R.layout.contact_selection_list_fragment, container, false);
|
||||
|
||||
recyclerView = ViewUtil.findById(view, R.id.recycler_view);
|
||||
emptyView = ViewUtil.findById(view, android.R.id.empty);
|
||||
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
|
||||
@@ -123,8 +127,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
|
||||
MenuInflater inflater = getActivity().getMenuInflater();
|
||||
inflater.inflate(R.menu.contact_list, menu);
|
||||
setCorrectMenuVisibility(menu);
|
||||
actionMode.setTitle("1");
|
||||
updateActionModeState(actionMode);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -161,19 +164,16 @@ public class ContactSelectionListFragment extends Fragment
|
||||
|
||||
private void handleSelectAll() {
|
||||
getContactSelectionListAdapter().selectAll();
|
||||
updateActionModeTitle();
|
||||
updateActionModeState(actionMode);
|
||||
}
|
||||
|
||||
private void updateActionModeTitle() {
|
||||
actionMode.setTitle(String.valueOf(getContactSelectionListAdapter().getActionModeSelection().size()));
|
||||
}
|
||||
|
||||
private void setCorrectMenuVisibility(Menu menu) {
|
||||
ContactSelectionListAdapter adapter = getContactSelectionListAdapter();
|
||||
if (adapter.getActionModeSelection().size() > 1) {
|
||||
menu.findItem(R.id.menu_view_profile).setVisible(false);
|
||||
private void updateActionModeState(ActionMode actionMode) {
|
||||
int size = getContactSelectionListAdapter().getActionModeSelection().size();
|
||||
if (size == 0) {
|
||||
actionMode.finish();
|
||||
} else {
|
||||
menu.findItem(R.id.menu_view_profile).setVisible(true);
|
||||
actionMode.getMenu().findItem(R.id.menu_view_profile).setVisible(size == 1);
|
||||
actionMode.setTitle(String.valueOf(size));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -266,7 +266,16 @@ public class ContactSelectionListFragment extends Fragment
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(Loader<DcContactsLoader.Ret> loader, DcContactsLoader.Ret data) {
|
||||
((ContactSelectionListAdapter) recyclerView.getAdapter()).changeData(data);
|
||||
ContactSelectionListAdapter adapter = (ContactSelectionListAdapter) recyclerView.getAdapter();
|
||||
adapter.changeData(data);
|
||||
if (emptyView != null) {
|
||||
if (adapter.getItemCount() > 0 || TextUtils.isEmpty(cursorFilter)) {
|
||||
emptyView.setVisibility(View.GONE);
|
||||
} else {
|
||||
emptyView.setText(getString(R.string.search_no_result_for_x, cursorFilter));
|
||||
emptyView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -280,10 +289,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
{
|
||||
if (handleActionMode) {
|
||||
if (actionMode != null) {
|
||||
Menu menu = actionMode.getMenu();
|
||||
setCorrectMenuVisibility(menu);
|
||||
updateActionModeTitle();
|
||||
finishActionModeIfSelectionIsEmpty();
|
||||
updateActionModeState(actionMode);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -321,17 +327,11 @@ public class ContactSelectionListFragment extends Fragment
|
||||
if (actionMode == null) {
|
||||
actionMode = ((AppCompatActivity)getActivity()).startSupportActionMode(actionModeCallback);
|
||||
} else {
|
||||
finishActionModeIfSelectionIsEmpty();
|
||||
updateActionModeState(actionMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void finishActionModeIfSelectionIsEmpty() {
|
||||
if (getContactSelectionListAdapter().getActionModeSelection().size() == 0) {
|
||||
actionMode.finish();
|
||||
}
|
||||
}
|
||||
|
||||
public void setOnContactSelectedListener(OnContactSelectedListener onContactSelectedListener) {
|
||||
this.onContactSelectedListener = onContactSelectedListener;
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
@@ -187,7 +188,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
private ApplicationContext context;
|
||||
private Recipient recipient;
|
||||
private DcContext dcContext;
|
||||
private Rpc rpc;
|
||||
private DcChat dcChat = new DcChat(0, 0);
|
||||
private int chatId;
|
||||
@@ -196,11 +196,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
private boolean isSecurityInitialized = false;
|
||||
private boolean successfulForwardingAttempt = false;
|
||||
private boolean isEditing = false;
|
||||
private boolean switchedProfile = false;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle state, boolean ready) {
|
||||
this.context = ApplicationContext.getInstance(getApplicationContext());
|
||||
this.dcContext = DcHelper.getContext(context);
|
||||
this.rpc = DcHelper.getRpc(context);
|
||||
|
||||
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
|
||||
@@ -237,17 +237,34 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
});
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (container.isInputOpen()) {
|
||||
container.hideCurrentInput(composeText);
|
||||
} else {
|
||||
handleReturnToConversationList();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
setDcEventListener();
|
||||
handleRelaying();
|
||||
}
|
||||
|
||||
private void setDcEventListener() {
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
// first cleanup in case it was already registered for other chat
|
||||
eventCenter.removeObservers(this);
|
||||
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
|
||||
if (!isMultiUser()) {
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_MSG_READ, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_MSG_READ, this);
|
||||
}
|
||||
|
||||
handleRelaying();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -273,6 +290,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
});
|
||||
|
||||
setDcEventListener(); // reset event listener
|
||||
handleRelaying();
|
||||
|
||||
if (fragment != null) {
|
||||
@@ -299,7 +317,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
titleView.setTitle(glideRequests, dcChat);
|
||||
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(dcContext.getAccountId(), chatId);
|
||||
try {
|
||||
int accId = rpc.getSelectedAccountId();
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(accId, chatId);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "rpc.getSelectedAccountId() failed", e);
|
||||
}
|
||||
|
||||
|
||||
attachmentManager.onResume();
|
||||
}
|
||||
@@ -389,7 +413,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
break;
|
||||
|
||||
case GROUP_EDIT:
|
||||
dcChat = dcContext.getChat(chatId);
|
||||
dcChat = DcHelper.getContext(context).getChat(chatId);
|
||||
titleView.setTitle(glideRequests, dcChat);
|
||||
break;
|
||||
|
||||
@@ -568,15 +592,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (container.isInputOpen()){
|
||||
container.hideCurrentInput(composeText);
|
||||
} else {
|
||||
handleReturnToConversationList();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyboardShown() {
|
||||
inputPanel.onKeyboardShown();
|
||||
@@ -599,6 +614,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
//////// Event Handlers
|
||||
|
||||
private void handleEphemeralMessages() {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
int preselected = dcContext.getChatEphemeralTimer(chatId);
|
||||
EphemeralMessagesDialog.show(this, preselected, duration -> {
|
||||
dcContext.setChatEphemeralTimer(chatId, (int) duration);
|
||||
@@ -610,6 +626,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void handleReturnToConversationList(@Nullable Bundle extras) {
|
||||
if (switchedProfile) { // force refreshing of chatlist
|
||||
if (extras == null) extras = new Bundle();
|
||||
extras.putInt(ConversationListFragment.RELOAD_LIST, 1);
|
||||
}
|
||||
|
||||
boolean archived = getIntent().getBooleanExtra(FROM_ARCHIVED_CHATS_EXTRA, false);
|
||||
Intent intent = new Intent(this, (archived ? ConversationListArchiveActivity.class : ConversationListActivity.class));
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
@@ -619,6 +640,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void handleMuteNotifications() {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
if(!dcChat.isMuted()) {
|
||||
MuteDialog.show(this, duration -> {
|
||||
dcContext.setChatMuteDuration(chatId, duration);
|
||||
@@ -654,7 +676,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
AlertDialog dialog = new AlertDialog.Builder(this)
|
||||
.setMessage(getString(R.string.ask_leave_group))
|
||||
.setPositiveButton(leaveLabel, (d, which) -> {
|
||||
dcContext.removeContactFromChat(chatId, DcContact.DC_CONTACT_ID_SELF);
|
||||
DcHelper.getContext(context).removeContactFromChat(chatId, DcContact.DC_CONTACT_ID_SELF);
|
||||
Toast.makeText(this, getString(R.string.done), Toast.LENGTH_SHORT).show();
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
@@ -663,6 +685,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void handleArchiveChat() {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
int newVisibility = isArchived() ?
|
||||
DcChat.DC_CHAT_VISIBILITY_NORMAL : DcChat.DC_CHAT_VISIBILITY_ARCHIVED;
|
||||
dcContext.setChatVisibility(chatId, newVisibility);
|
||||
@@ -678,7 +701,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
AlertDialog dialog = new AlertDialog.Builder(this)
|
||||
.setMessage(getResources().getString(R.string.ask_delete_named_chat, dcChat.getName()))
|
||||
.setPositiveButton(R.string.delete, (d, which) -> {
|
||||
dcContext.deleteChat(chatId);
|
||||
DcHelper.getContext(context).deleteChat(chatId);
|
||||
DirectShareUtil.clearShortcut(this, chatId);
|
||||
finish();
|
||||
})
|
||||
@@ -708,6 +731,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void handleForwarding() {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
if (dcChat.isSelfTalk()) {
|
||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||
@@ -756,7 +780,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||
} else {
|
||||
Uri uri = uriList.isEmpty()? null : uriList.get(0);
|
||||
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, ShareUtil.getSharedType(this), null, null, getSharedText(this)));
|
||||
DcHelper.getContext(context).setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, ShareUtil.getSharedType(this), null, null, getSharedText(this)));
|
||||
}
|
||||
initializeDraft();
|
||||
}
|
||||
@@ -771,7 +795,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
private ListenableFuture<Boolean> initializeDraft() {
|
||||
isEditing = false;
|
||||
final SettableFuture<Boolean> future = new SettableFuture<>();
|
||||
DcMsg draft = dcContext.getDraft(chatId);
|
||||
DcMsg draft = DcHelper.getContext(context).getDraft(chatId);
|
||||
final String sharedText = ShareUtil.getSharedText(this);
|
||||
|
||||
if (!draft.isOk()) {
|
||||
@@ -932,7 +956,15 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void initializeBackground() {
|
||||
String backgroundImagePath = Prefs.getBackgroundImagePath(this, dcContext.getAccountId());
|
||||
int accId;
|
||||
try {
|
||||
accId = rpc.getSelectedAccountId();
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "rpc.getSelectedAccountId() failed", e);
|
||||
return;
|
||||
}
|
||||
|
||||
String backgroundImagePath = Prefs.getBackgroundImagePath(this, accId);
|
||||
Drawable background;
|
||||
if(!backgroundImagePath.isEmpty()) {
|
||||
background = Drawable.createFromPath(backgroundImagePath);
|
||||
@@ -958,16 +990,17 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void initializeResources() {
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, dcContext.getAccountId());
|
||||
if (accountId != dcContext.getAccountId()) {
|
||||
int selectedAccId = DcHelper.getContext(context).getAccountId();
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, selectedAccId);
|
||||
if (accountId != selectedAccId) {
|
||||
switchedProfile = true;
|
||||
AccountManager.getInstance().switchAccount(context, accountId);
|
||||
fragment.dcContext = dcContext = context.getDcContext();
|
||||
initializeBackground();
|
||||
}
|
||||
chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, -1);
|
||||
if(chatId == DcChat.DC_CHAT_NO_CHAT)
|
||||
throw new IllegalStateException("can't display a conversation for no chat.");
|
||||
dcChat = dcContext.getChat(chatId);
|
||||
dcChat = DcHelper.getContext(context).getChat(chatId);
|
||||
recipient = new Recipient(this, dcChat);
|
||||
glideRequests = GlideApp.with(this);
|
||||
|
||||
@@ -1034,11 +1067,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
try {
|
||||
byte[] vcard = rpc.makeVcard(dcContext.getAccountId(), Collections.singletonList(contactId)).getBytes();
|
||||
byte[] vcard = rpc.makeVcard(rpc.getSelectedAccountId(), Collections.singletonList(contactId)).getBytes();
|
||||
String mimeType = "application/octet-stream";
|
||||
setMedia(PersistentBlobProvider.getInstance().create(this, vcard, mimeType, "vcard.vcf"), MediaType.DOCUMENT);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "makeVcard() failed", e);
|
||||
Log.e(TAG, "RPC failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1077,6 +1110,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
inputPanel.clearSubject();
|
||||
}
|
||||
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
DcMsg msg = null;
|
||||
int recompress = 0;
|
||||
@@ -1209,7 +1243,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
if (refreshFragment) {
|
||||
fragment.reload(recipient, chatId);
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(dcContext.getAccountId(), chatId);
|
||||
try {
|
||||
int accId = rpc.getSelectedAccountId();
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(accId, chatId);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "rpc.getSelectedAccountId() failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
fragment.scrollToBottom();
|
||||
@@ -1371,6 +1410,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
Optional<QuoteModel> quote = inputPanel.getQuote();
|
||||
inputPanel.clearQuote();
|
||||
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_STICKER);
|
||||
if (quote.isPresent()) {
|
||||
msg.setQuote(quote.get().getQuotedMsg());
|
||||
@@ -1492,7 +1532,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
if (isEditing) composeText.setText("");
|
||||
isEditing = false;
|
||||
// If you modify these lines you may also want to modify ConversationItem.setQuote():
|
||||
Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId()));
|
||||
Recipient author = new Recipient(this, DcHelper.getContext(context).getContact(msg.getFromId()));
|
||||
|
||||
SlideDeck slideDeck = new SlideDeck();
|
||||
if (msg.hasFile()) {
|
||||
@@ -1515,7 +1555,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
@Override
|
||||
public void handleEditMessage(DcMsg msg) {
|
||||
isEditing = true;
|
||||
Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId()));
|
||||
Recipient author = new Recipient(this, DcHelper.getContext(context).getContact(msg.getFromId()));
|
||||
|
||||
SlideDeck slideDeck = new SlideDeck();
|
||||
String text = msg.getSummarytext(500);
|
||||
@@ -1540,6 +1580,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
@Override
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
if (event.getAccountId() != dcContext.getAccountId()) return;
|
||||
|
||||
int eventId = event.getId();
|
||||
if ((eventId == DcContext.DC_EVENT_CHAT_MODIFIED && event.getData1Int() == chatId)
|
||||
|| (eventId == DcContext.DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED && event.getData1Int() == chatId)
|
||||
@@ -1626,7 +1669,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
String normQuery = query.trim();
|
||||
searchResult = dcContext.searchMsgs(chatId, normQuery);
|
||||
searchResult = DcHelper.getContext(context).searchMsgs(chatId, normQuery);
|
||||
|
||||
if(searchResult.length>0) {
|
||||
searchResultPosition = searchResult.length - 1;
|
||||
@@ -1657,7 +1700,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
messageRequestBottomView.setVisibility(View.VISIBLE);
|
||||
messageRequestBottomView.setAcceptOnClickListener(v -> {
|
||||
dcContext.acceptChat(chatId);
|
||||
DcHelper.getContext(context).acceptChat(chatId);
|
||||
messageRequestBottomView.setVisibility(View.GONE);
|
||||
composePanel.setVisibility(View.VISIBLE);
|
||||
});
|
||||
@@ -1675,7 +1718,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
// avoid showing compose panel on receiving DC_EVENT_CONTACTS_CHANGED for the chat that is no longer a request after blocking
|
||||
DcHelper.getEventCenter(this).removeObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
|
||||
dcContext.blockChat(chatId);
|
||||
DcHelper.getContext(context).blockChat(chatId);
|
||||
Bundle extras = new Bundle();
|
||||
extras.putInt(ConversationListFragment.RELOAD_LIST, 1);
|
||||
handleReturnToConversationList(extras);
|
||||
|
||||
@@ -68,6 +68,7 @@ import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.thoughtcrime.securesms.util.views.ConversationAdaptiveActionsToolbar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
@@ -75,6 +76,9 @@ import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import chat.delta.rpc.Rpc;
|
||||
import chat.delta.rpc.RpcException;
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
public class ConversationFragment extends MessageSelectorFragment
|
||||
{
|
||||
@@ -103,11 +107,12 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
public boolean isPaused;
|
||||
private Debouncer markseenDebouncer;
|
||||
private Rpc rpc;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
this.dcContext = DcHelper.getContext(getContext());
|
||||
rpc = DcHelper.getRpc(getContext());
|
||||
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(getContext());
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
|
||||
@@ -208,8 +213,13 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
Util.runOnBackground(() -> dcContext.marknoticedChat((int) chatId));
|
||||
Util.runOnBackground(() -> {
|
||||
try {
|
||||
rpc.marknoticedChat(rpc.getSelectedAccountId(), (int) chatId);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
});
|
||||
if (list.getAdapter() != null) {
|
||||
list.getAdapter().notifyDataSetChanged();
|
||||
}
|
||||
@@ -288,7 +298,12 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
dateDecoration = new StickyHeaderDecoration(adapter, false, false);
|
||||
list.addItemDecoration(dateDecoration);
|
||||
|
||||
int freshMsgs = dcContext.getFreshMsgCount((int) chatId);
|
||||
int freshMsgs = 0;
|
||||
try {
|
||||
freshMsgs = rpc.getFreshMsgCnt(rpc.getSelectedAccountId(), (int) chatId);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
SetStartingPositionLinearLayoutManager layoutManager = (SetStartingPositionLinearLayoutManager) list.getLayoutManager();
|
||||
if (startingPosition > -1) {
|
||||
layoutManager.setStartingPosition(startingPosition);
|
||||
@@ -448,6 +463,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
StringBuilder result = new StringBuilder();
|
||||
|
||||
DcContext dcContext = DcHelper.getContext(getContext());
|
||||
DcMsg prevMsg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
for (DcMsg msg : dcMsgsList) {
|
||||
if (result.length() > 0) {
|
||||
@@ -476,9 +492,13 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
private void handleForwardMessage(final Set<DcMsg> messageRecords) {
|
||||
Intent composeIntent = new Intent();
|
||||
int[] msgIds = DcMsg.msgSetToIds(messageRecords);
|
||||
setForwardingMessageIds(composeIntent, msgIds);
|
||||
ConversationListRelayingActivity.start(this, composeIntent);
|
||||
getActivity().overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out);
|
||||
try {
|
||||
setForwardingMessageIds(composeIntent, msgIds, rpc.getSelectedAccountId());
|
||||
ConversationListRelayingActivity.start(this, composeIntent);
|
||||
getActivity().overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
@@ -504,6 +524,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
private void handleReplyMessagePrivately(final DcMsg msg) {
|
||||
|
||||
if (getActivity() != null) {
|
||||
DcContext dcContext = DcHelper.getContext(getActivity());
|
||||
int privateChatId = dcContext.createChatByContactId(msg.getFromId());
|
||||
DcMsg replyMsg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
replyMsg.setQuote(msg);
|
||||
@@ -520,10 +541,14 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
private void handleToggleSave(final Set<DcMsg> messageRecords) {
|
||||
DcMsg msg = getSelectedMessageRecord(messageRecords);
|
||||
if (msg.getSavedMsgId() != 0) {
|
||||
dcContext.deleteMsgs(new int[]{msg.getSavedMsgId()});
|
||||
} else {
|
||||
dcContext.saveMsgs(new int[]{msg.getId()});
|
||||
try {
|
||||
if (msg.getSavedMsgId() != 0) {
|
||||
rpc.deleteMessages(rpc.getSelectedAccountId(), Collections.singletonList(msg.getSavedMsgId()));
|
||||
} else {
|
||||
rpc.saveMsgs(rpc.getSelectedAccountId(), Collections.singletonList(msg.getId()));
|
||||
}
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -593,7 +618,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
}
|
||||
|
||||
private void updateLocationButton() {
|
||||
floatingLocationButton.setVisibility(dcContext.isSendingLocationsToChat((int) chatId)? View.VISIBLE : View.GONE);
|
||||
floatingLocationButton.setVisibility(DcHelper.getContext(getContext()).isSendingLocationsToChat((int) chatId)? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
private void scrollAndHighlight(final int pos, boolean smooth) {
|
||||
@@ -729,16 +754,20 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
return;
|
||||
}
|
||||
|
||||
int[] ids = new int[lastPos - firstPos + 1];
|
||||
int index = 0;
|
||||
ArrayList<Integer> ids = new ArrayList<>(lastPos - firstPos + 1);
|
||||
for(int pos = firstPos; pos <= lastPos; pos++) {
|
||||
DcMsg message = ((ConversationAdapter) list.getAdapter()).getMsg(pos);
|
||||
if (message.getFromId() != DC_CONTACT_ID_SELF) {
|
||||
ids[index] = message.getId();
|
||||
index++;
|
||||
ids.add(message.getId());
|
||||
}
|
||||
}
|
||||
Util.runOnAnyBackgroundThread(() -> dcContext.markseenMsgs(ids));
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
try {
|
||||
rpc.markseenMsgs(rpc.getSelectedAccountId(), ids);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private class ConversationFragmentItemClickListener implements ItemClickListener {
|
||||
@@ -783,7 +812,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
startActivity(intent);
|
||||
}
|
||||
else {
|
||||
String self_mail = dcContext.getConfig("configured_mail_user");
|
||||
String self_mail = DcHelper.getContext(getContext()).getConfig("configured_mail_user");
|
||||
if (self_mail != null && !self_mail.isEmpty()
|
||||
&& messageRecord.getText().contains(self_mail)
|
||||
&& getListAdapter().getChat().isDeviceTalk()) {
|
||||
@@ -822,7 +851,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
if (foreignChatId != 0 && foreignChatId != chatId) {
|
||||
Intent intent = new Intent(getActivity(), ConversationActivity.class);
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, foreignChatId);
|
||||
int start = DcMsg.getMessagePosition(original, dcContext);
|
||||
int start = DcMsg.getMessagePosition(original, DcHelper.getContext(getContext()));
|
||||
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, start);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
((ConversationActivity) getActivity()).hideSoftKeyboard();
|
||||
@@ -838,7 +867,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
@Override
|
||||
public void onJumpToOriginalClicked(DcMsg messageRecord) {
|
||||
jumpToOriginal(dcContext.getMsg(messageRecord.getOriginalMsgId()));
|
||||
jumpToOriginal(DcHelper.getContext(getContext()).getMsg(messageRecord.getOriginalMsgId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -857,7 +886,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
@Override
|
||||
public void onDownloadClicked(DcMsg messageRecord) {
|
||||
dcContext.downloadFullMsg(messageRecord.getId());
|
||||
DcHelper.getContext(getContext()).downloadFullMsg(messageRecord.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
|
||||
import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
|
||||
@@ -25,10 +23,12 @@ import static org.thoughtcrime.securesms.util.ShareUtil.getDirectSharingChatId;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedTitle;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.isDirectSharing;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.isForwarding;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getForwardedMessageAccountId;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.resetRelayingMessageContent;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
@@ -46,6 +46,7 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
@@ -123,36 +124,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle, boolean ready) {
|
||||
// update messages - for new messages, do not reuse or modify strings but create new ones.
|
||||
// it is not needed to keep all past update messages, however, when deleted, also the strings should be deleted.
|
||||
try {
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
final String deviceMsgLabel = "update_2_33_1_android";
|
||||
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
|
||||
DcMsg msg = null;
|
||||
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
|
||||
// InputStream inputStream = getResources().getAssets().open("device-messages/green-checkmark.jpg");
|
||||
// String outputFile = DcHelper.getBlobdirFile(dcContext, "green-checkmark", ".jpg");
|
||||
// Util.copy(inputStream, new FileOutputStream(outputFile));
|
||||
// msg.setFile(outputFile, "image/jpeg");
|
||||
|
||||
msg.setText(getString(R.string.update_2_33, "https://arcanechat.me/#contribute"));
|
||||
}
|
||||
dcContext.addDeviceMsg(deviceMsgLabel, msg);
|
||||
|
||||
if (Prefs.getStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, "").equals(deviceMsgLabel)) {
|
||||
int deviceChatId = dcContext.getChatIdByContactId(DcContact.DC_CONTACT_ID_DEVICE);
|
||||
if (deviceChatId != 0) {
|
||||
dcContext.marknoticedChat(deviceChatId);
|
||||
}
|
||||
}
|
||||
Prefs.setStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, deviceMsgLabel);
|
||||
}
|
||||
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
addDeviceMessages(getIntent().getBooleanExtra(FROM_WELCOME, false));
|
||||
if (getIntent().getIntExtra(ACCOUNT_ID_EXTRA, -1) <= 0) {
|
||||
getIntent().putExtra(ACCOUNT_ID_EXTRA, DcHelper.getContext(this).getAccountId());
|
||||
}
|
||||
|
||||
// create view
|
||||
@@ -176,13 +150,41 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
initializeSearchListener();
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (searchToolbar.isVisible()) {
|
||||
searchToolbar.collapse();
|
||||
} else {
|
||||
Activity activity = ConversationListActivity.this;
|
||||
if (isRelayingMessageContent(activity)) {
|
||||
int selectedAccId = DcHelper.getContext(activity).getAccountId();
|
||||
int initialAccId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, selectedAccId);
|
||||
if (initialAccId != selectedAccId) {
|
||||
// allowing to go back is dangerous, it could be activity on previously selected account,
|
||||
// instead of figuring out account rollback in onResume in each activity (conversation, gallery, media preview, webxdc, etc.)
|
||||
// just clear the back stack and stay in newly selected account
|
||||
finishAffinity();
|
||||
startActivity(new Intent(activity, ConversationListActivity.class));
|
||||
return;
|
||||
} else {
|
||||
handleResetRelaying();
|
||||
}
|
||||
}
|
||||
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
TooltipCompat.setTooltipText(searchAction, getText(R.string.search_explain));
|
||||
|
||||
TooltipCompat.setTooltipText(selfAvatar, getText(R.string.switch_account));
|
||||
selfAvatar.setOnClickListener(v -> AccountManager.getInstance().showSwitchAccountMenu(this));
|
||||
selfAvatar.setOnClickListener(v -> AccountManager.getInstance().showSwitchAccountMenu(this, false));
|
||||
findViewById(R.id.avatar_and_title).setOnClickListener(v -> {
|
||||
if (!isRelayingMessageContent(this)) {
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this, false);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -257,24 +259,29 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
}
|
||||
super.onNewIntent(intent);
|
||||
setIntent(intent);
|
||||
if (getIntent().getIntExtra(ACCOUNT_ID_EXTRA, -1) <= 0) {
|
||||
getIntent().putExtra(ACCOUNT_ID_EXTRA, DcHelper.getContext(this).getAccountId());
|
||||
}
|
||||
refresh();
|
||||
conversationListFragment.onNewIntent();
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
private void refresh() {
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, dcContext.getAccountId());
|
||||
int selectedAccId = DcHelper.getContext(this).getAccountId();
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, selectedAccId);
|
||||
if (getIntent().getBooleanExtra(CLEAR_NOTIFICATIONS, false)) {
|
||||
DcHelper.getNotificationCenter(this).removeAllNotifications(accountId);
|
||||
}
|
||||
if (accountId != dcContext.getAccountId()) {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(this, accountId);
|
||||
if (accountId != selectedAccId) {
|
||||
AccountManager.getInstance().switchAccount(this, accountId);
|
||||
onProfileSwitched(accountId);
|
||||
} else {
|
||||
refreshAvatar();
|
||||
refreshUnreadIndicator();
|
||||
refreshTitle();
|
||||
}
|
||||
|
||||
refreshAvatar();
|
||||
refreshUnreadIndicator();
|
||||
refreshTitle();
|
||||
handleOpenpgp4fpr();
|
||||
if (isDirectSharing(this)) {
|
||||
openConversation(getDirectSharingChatId(this), -1);
|
||||
@@ -452,13 +459,16 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
startActivity(new Intent(this, ProxySettingsActivity.class));
|
||||
return true;
|
||||
} else if (itemId == android.R.id.home) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_all_media) {
|
||||
startActivity(new Intent(this, AllMediaActivity.class));
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_export_attachment) {
|
||||
handleSaveAttachment();
|
||||
} else if (itemId == R.id.menu_switch_account) {
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -491,7 +501,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
};
|
||||
SaveAttachmentTask saveTask = new SaveAttachmentTask(this);
|
||||
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, attachments);
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
|
||||
private void handleOpenpgp4fpr() {
|
||||
@@ -526,15 +536,17 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
searchToolbar.clearFocus();
|
||||
|
||||
final DcContext dcContext = DcHelper.getContext(this);
|
||||
if (isForwarding(this) && dcContext.getChat(chatId).isSelfTalk()) {
|
||||
int fwdAccId = getForwardedMessageAccountId(this);
|
||||
if (fwdAccId == dcContext.getAccountId() && dcContext.getChat(chatId).isSelfTalk()) {
|
||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||
Toast.makeText(this, DynamicTheme.getCheckmarkEmoji(this) + " " + getString(R.string.saved), Toast.LENGTH_SHORT).show();
|
||||
handleResetRelaying();
|
||||
finish();
|
||||
} else {
|
||||
Intent intent = new Intent(this, ConversationActivity.class);
|
||||
intent.putExtra(CHAT_ID_EXTRA, chatId);
|
||||
intent.putExtra(STARTING_POSITION_EXTRA, startingPosition);
|
||||
intent.putExtra(ConversationActivity.ACCOUNT_ID_EXTRA, dcContext.getAccountId());
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId);
|
||||
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, startingPosition);
|
||||
if (isRelayingMessageContent(this)) {
|
||||
acquireRelayMessageContent(this, intent);
|
||||
}
|
||||
@@ -554,15 +566,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (searchToolbar.isVisible()) searchToolbar.collapse();
|
||||
else if (isRelayingMessageContent(this)) {
|
||||
handleResetRelaying();
|
||||
finish();
|
||||
} else super.onBackPressed();
|
||||
}
|
||||
|
||||
private void createChat() {
|
||||
Intent intent = new Intent(this, NewConversationActivity.class);
|
||||
if (isRelayingMessageContent(this)) {
|
||||
@@ -579,6 +582,48 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
startActivity(Intent.createChooser(intent, getString(R.string.chat_share_with_title)));
|
||||
}
|
||||
|
||||
private void addDeviceMessages(boolean fromWelcome) {
|
||||
// update messages - for new messages, do not reuse or modify strings but create new ones.
|
||||
// it is not needed to keep all past update messages, however, when deleted, also the strings should be deleted.
|
||||
try {
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
final String deviceMsgLabel = "update_2_33_1_android";
|
||||
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
|
||||
DcMsg msg = null;
|
||||
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
|
||||
// InputStream inputStream = getResources().getAssets().open("device-messages/green-checkmark.jpg");
|
||||
// String outputFile = DcHelper.getBlobdirFile(dcContext, "green-checkmark", ".jpg");
|
||||
// Util.copy(inputStream, new FileOutputStream(outputFile));
|
||||
// msg.setFile(outputFile, "image/jpeg");
|
||||
|
||||
msg.setText(getString(R.string.update_2_33, "https://arcanechat.me/#contribute"));
|
||||
}
|
||||
dcContext.addDeviceMsg(deviceMsgLabel, msg);
|
||||
|
||||
if (Prefs.getStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, "").equals(deviceMsgLabel)) {
|
||||
int deviceChatId = dcContext.getChatIdByContactId(DcContact.DC_CONTACT_ID_DEVICE);
|
||||
if (deviceChatId != 0) {
|
||||
dcContext.marknoticedChat(deviceChatId);
|
||||
}
|
||||
}
|
||||
Prefs.setStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, deviceMsgLabel);
|
||||
}
|
||||
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void onProfileSwitched(int profileId) {
|
||||
addDeviceMessages(false);
|
||||
refreshAvatar();
|
||||
refreshUnreadIndicator();
|
||||
refreshTitle();
|
||||
conversationListFragment.loadChatlist();
|
||||
}
|
||||
|
||||
public void onDeleteProfile(int profileId) {
|
||||
deleteProfileId = profileId;
|
||||
boolean result = ScreenLockUtil.applyScreenLock(this, getString(R.string.delete_account), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE);
|
||||
@@ -594,9 +639,14 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
accounts.removeAccount(profileId);
|
||||
if (selected) {
|
||||
DcContext selAcc = accounts.getSelectedAccount();
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(this, selAcc.isOk()? selAcc.getAccountId() : 0);
|
||||
if (selAcc.isOk()) {
|
||||
AccountManager.getInstance().switchAccount(this, selAcc.getAccountId());
|
||||
onProfileSwitched(selAcc.getAccountId());
|
||||
} else {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(this, 0);
|
||||
}
|
||||
} else {
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this, false);
|
||||
}
|
||||
|
||||
// title update needed to show "Delta Chat" in case there is only one profile left
|
||||
|
||||
@@ -12,6 +12,8 @@ import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
|
||||
import com.b44t.messenger.DcChat;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
@@ -33,6 +35,21 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putBoolean(ConversationListFragment.ARCHIVE, true);
|
||||
initFragment(R.id.fragment, new ConversationListFragment(), bundle);
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (!isRelayingMessageContent(ConversationListArchiveActivity.this)) {
|
||||
// Load the ConversationListActivity in case it's not existent for some reason
|
||||
Intent intent = new Intent(ConversationListArchiveActivity.this, ConversationListActivity.class);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -63,7 +80,7 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
|
||||
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == android.R.id.home) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.mark_as_read) {
|
||||
DcHelper.getContext(this).marknoticedChat(DcChat.DC_CHAT_ID_ARCHIVED_LINK);
|
||||
@@ -73,20 +90,6 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (isRelayingMessageContent(this)) {
|
||||
// Go back to the ConversationListRelayingActivity
|
||||
super.onBackPressed();
|
||||
} else {
|
||||
// Load the ConversationListActivity in case it's not existent for some reason
|
||||
Intent intent = new Intent(this, ConversationListActivity.class);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateConversation(int chatId) {
|
||||
Intent intent = new Intent(this, ConversationActivity.class);
|
||||
|
||||
@@ -260,7 +260,7 @@ public class ConversationListFragment extends BaseConversationListFragment
|
||||
});
|
||||
}
|
||||
|
||||
private void loadChatlist() {
|
||||
public void loadChatlist() {
|
||||
int listflags = 0;
|
||||
if (archive) {
|
||||
listflags |= DcContext.DC_GCL_ARCHIVED_ONLY;
|
||||
|
||||
@@ -124,7 +124,6 @@ public class ConversationListItem extends RelativeLayout
|
||||
this.msgId = msgId;
|
||||
|
||||
int state = dcSummary.getState();
|
||||
int unreadCount = thread.getUnreadCount();
|
||||
|
||||
if (highlightSubstring != null) {
|
||||
this.fromView.setText(getHighlightedSpan(recipient.getName(), highlightSubstring));
|
||||
@@ -151,7 +150,7 @@ public class ConversationListItem extends RelativeLayout
|
||||
thread.getVisibility()==DcChat.DC_CHAT_VISIBILITY_PINNED? R.drawable.ic_pinned_chatlist : 0, 0
|
||||
);
|
||||
|
||||
setStatusIcons(thread.getVisibility(), state, unreadCount, thread.isContactRequest(), thread.isMuted() || chatId == DcChat.DC_CHAT_ID_ARCHIVED_LINK);
|
||||
setStatusIcons(thread, state);
|
||||
setBatchState(batchMode);
|
||||
setBgColor(thread);
|
||||
|
||||
@@ -240,14 +239,14 @@ public class ConversationListItem extends RelativeLayout
|
||||
return msgId;
|
||||
}
|
||||
|
||||
private void setStatusIcons(int visibility, int state, int unreadCount, boolean isContactRequest, boolean isMuted) {
|
||||
if (visibility==DcChat.DC_CHAT_VISIBILITY_ARCHIVED)
|
||||
private void setStatusIcons(ThreadRecord thread, int state) {
|
||||
if (thread.getVisibility() == DcChat.DC_CHAT_VISIBILITY_ARCHIVED)
|
||||
{
|
||||
archivedBadgeView.setVisibility(View.VISIBLE);
|
||||
requestBadgeView.setVisibility(isContactRequest ? View.VISIBLE : View.GONE);
|
||||
requestBadgeView.setVisibility(thread.isContactRequest() ? View.VISIBLE : View.GONE);
|
||||
deliveryStatusIndicator.setNone();
|
||||
}
|
||||
else if (isContactRequest) {
|
||||
else if (thread.isContactRequest()) {
|
||||
requestBadgeView.setVisibility(View.VISIBLE);
|
||||
archivedBadgeView.setVisibility(View.GONE);
|
||||
deliveryStatusIndicator.setNone();
|
||||
@@ -259,14 +258,16 @@ public class ConversationListItem extends RelativeLayout
|
||||
|
||||
if (state == DcMsg.DC_STATE_OUT_FAILED) {
|
||||
deliveryStatusIndicator.setFailed();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_MDN_RCVD) {
|
||||
deliveryStatusIndicator.setRead();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_DELIVERED) {
|
||||
deliveryStatusIndicator.setSent();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_PREPARING) {
|
||||
deliveryStatusIndicator.setPreparing();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_PENDING) {
|
||||
deliveryStatusIndicator.setPending();
|
||||
} else if (thread.isOutChannel()) {
|
||||
deliveryStatusIndicator.setNone();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_MDN_RCVD) {
|
||||
deliveryStatusIndicator.setRead();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_DELIVERED) {
|
||||
deliveryStatusIndicator.setSent();
|
||||
} else {
|
||||
deliveryStatusIndicator.setNone();
|
||||
}
|
||||
@@ -278,11 +279,12 @@ public class ConversationListItem extends RelativeLayout
|
||||
}
|
||||
}
|
||||
|
||||
if(unreadCount==0 || isContactRequest) {
|
||||
int unreadCount = thread.getUnreadCount();
|
||||
if(unreadCount==0 || thread.isContactRequest()) {
|
||||
unreadIndicator.setVisibility(View.GONE);
|
||||
} else {
|
||||
final int color;
|
||||
if(isMuted){
|
||||
if(thread.isMuted() || chatId == DcChat.DC_CHAT_ID_ARCHIVED_LINK){
|
||||
color = getResources().getColor(ThemeUtil.isDarkTheme(getContext()) ? R.color.unread_count_muted_dark : R.color.unread_count_muted);
|
||||
} else {
|
||||
final TypedArray attrs = getContext().obtainStyledAttributes(new int[] {
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
|
||||
@@ -52,8 +53,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
|
||||
private static final String TAG = CreateProfileActivity.class.getSimpleName();
|
||||
|
||||
public static final String FROM_WELCOME = "from_welcome";
|
||||
|
||||
private static final int REQUEST_CODE_AVATAR = 1;
|
||||
|
||||
private InputAwareLayout container;
|
||||
@@ -61,7 +60,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
private EditText name;
|
||||
private EditText statusView;
|
||||
|
||||
private boolean fromWelcome;
|
||||
private boolean avatarChanged;
|
||||
private boolean imageLoaded;
|
||||
|
||||
@@ -72,12 +70,11 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
@Override
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
this.fromWelcome = getIntent().getBooleanExtra(FROM_WELCOME, false);
|
||||
|
||||
setContentView(R.layout.profile_create_activity);
|
||||
|
||||
getSupportActionBar().setTitle(R.string.pref_profile_info_headline);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(!this.fromWelcome);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
|
||||
|
||||
attachmentManager = new AttachmentManager(this, () -> {});
|
||||
@@ -86,6 +83,18 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
initializeProfileName();
|
||||
initializeProfileAvatar();
|
||||
initializeStatusText();
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (container.isInputOpen()) {
|
||||
container.hideCurrentInput(name);
|
||||
} else {
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -100,7 +109,7 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
super.onOptionsItemSelected(item);
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == android.R.id.home) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_create_profile) {
|
||||
updateProfile();
|
||||
@@ -109,17 +118,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (container.isInputOpen()) {
|
||||
container.hideCurrentInput(name);
|
||||
} else if (fromWelcome) {
|
||||
updateProfile();
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
|
||||
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
|
||||
@@ -187,13 +185,7 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(container);
|
||||
|
||||
if (fromWelcome) {
|
||||
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
|
||||
ViewUtil.findById(this, R.id.status_text_layout).setVisibility(View.GONE);
|
||||
ViewUtil.findById(this, R.id.information_label).setVisibility(View.GONE);
|
||||
} else {
|
||||
loginSuccessText.setVisibility(View.GONE);
|
||||
}
|
||||
loginSuccessText.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
private void initializeProfileName() {
|
||||
@@ -260,11 +252,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
|
||||
if (result) {
|
||||
attachmentManager.cleanup();
|
||||
if (fromWelcome) {
|
||||
Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class);
|
||||
intent.putExtra(ConversationListActivity.FROM_WELCOME, true);
|
||||
startActivity(intent);
|
||||
}
|
||||
finish();
|
||||
} else {
|
||||
Toast.makeText(CreateProfileActivity.this, R.string.error, Toast.LENGTH_LONG).show();
|
||||
|
||||
@@ -25,7 +25,6 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -41,7 +40,6 @@ import com.google.zxing.integration.android.IntentIntegrator;
|
||||
import com.google.zxing.integration.android.IntentResult;
|
||||
|
||||
import org.thoughtcrime.securesms.components.AvatarSelector;
|
||||
import org.thoughtcrime.securesms.connect.AccountManager;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto;
|
||||
@@ -56,6 +54,7 @@ import org.thoughtcrime.securesms.relay.RelayListActivity;
|
||||
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
|
||||
import org.thoughtcrime.securesms.util.IntentUtils;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.TextUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.thoughtcrime.securesms.util.views.ProgressDialog;
|
||||
@@ -76,7 +75,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
private static final String INSTANCES_URL = "https://chatmail.at/relays";
|
||||
private static final String DEFAULT_CHATMAIL_HOST = "arcanechat.me";
|
||||
|
||||
public static final String FROM_WELCOME = "from_welcome";
|
||||
private static final int REQUEST_CODE_AVATAR = 1;
|
||||
|
||||
private ImageView avatar;
|
||||
@@ -107,9 +105,9 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
Objects.requireNonNull(getSupportActionBar()).setTitle(R.string.onboarding_create_instant_account);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
boolean fromWelcome = getIntent().getBooleanExtra(FROM_WELCOME, false);
|
||||
boolean configured = DcHelper.getContext(this).isConfigured() == 1;
|
||||
|
||||
if (DcHelper.getContext(this).isConfigured() == 1) {
|
||||
if (configured) {
|
||||
// if account is configured it means we didn't come from Welcome screen nor from QR scanner,
|
||||
// instead, user clicked a dcaccount:// URI directly, so we need to just offer to add a new relay
|
||||
Uri uri = getIntent().getData();
|
||||
@@ -117,25 +115,11 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
Intent intent = new Intent(this, RelayListActivity.class);
|
||||
intent.putExtra(RelayListActivity.EXTRA_QR_DATA, uri.toString());
|
||||
startActivity(intent);
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
// if URI is unexpectedly null, then fallback to new profile creation
|
||||
AccountManager.getInstance().beginAccountCreation(this);
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(!fromWelcome) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
AccountManager accountManager = AccountManager.getInstance();
|
||||
if (accountManager.canRollbackAccountCreation(InstantOnboardingActivity.this)) {
|
||||
accountManager.rollbackAccountCreation(InstantOnboardingActivity.this);
|
||||
} else {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
isDcLogin = false;
|
||||
providerHost = DEFAULT_CHATMAIL_HOST;
|
||||
providerQrData = DCACCOUNT + ":" + providerHost;
|
||||
@@ -341,7 +325,10 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
|
||||
signUpBtn.setOnClickListener(view -> createProfile());
|
||||
|
||||
findViewById(R.id.use_other_server).setOnClickListener((v) -> {
|
||||
Button otherServerButton = findViewById(R.id.use_other_server);
|
||||
otherServerButton.setText(
|
||||
TextUtil.markAsExternal(getString(R.string.instant_onboarding_other_server)));
|
||||
otherServerButton.setOnClickListener((v) -> {
|
||||
IntentUtils.showInBrowser(this, INSTANCES_URL);
|
||||
});
|
||||
findViewById(R.id.login_button).setOnClickListener((v) -> {
|
||||
@@ -365,9 +352,11 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
}
|
||||
|
||||
if (DEFAULT_CHATMAIL_HOST.equals(providerHost)) {
|
||||
privacyPolicyBtn.setText(getString(R.string.instant_onboarding_agree_default2, providerHost));
|
||||
privacyPolicyBtn.setText(TextUtil.markAsExternal(
|
||||
getString(R.string.instant_onboarding_agree_default2, providerHost)));
|
||||
} else {
|
||||
privacyPolicyBtn.setText(getString(R.string.instant_onboarding_agree_instance, providerHost));
|
||||
privacyPolicyBtn.setText(TextUtil.markAsExternal(
|
||||
getString(R.string.instant_onboarding_agree_instance, providerHost)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,9 @@ import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
|
||||
import org.thoughtcrime.securesms.util.TextUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
import java.io.InputStream;
|
||||
@@ -44,6 +47,18 @@ public class LocalHelpActivity extends WebViewActivity
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (webView.canGoBack()) {
|
||||
webView.goBack();
|
||||
} else {
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
webView.loadUrl("file:///android_asset/" + helpPath.replace("LANG", helpLang) + (section!=null? section : ""));
|
||||
}
|
||||
|
||||
@@ -51,6 +66,28 @@ public class LocalHelpActivity extends WebViewActivity
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
this.getMenuInflater().inflate(R.menu.local_help, menu);
|
||||
|
||||
// Append " ↗" to external link buttons
|
||||
MenuItem item = menu.findItem(R.id.learn_more);
|
||||
if (item != null) {
|
||||
item.setTitle(TextUtil.markAsExternal(getString(R.string.delta_chat_homepage)));
|
||||
}
|
||||
|
||||
item = menu.findItem(R.id.privacy_policy);
|
||||
if (item != null) {
|
||||
item.setTitle(TextUtil.markAsExternal(getString(R.string.privacy_policy)));
|
||||
}
|
||||
|
||||
item = menu.findItem(R.id.contribute);
|
||||
if (item != null) {
|
||||
item.setTitle(TextUtil.markAsExternal(getString(R.string.contribute)));
|
||||
}
|
||||
|
||||
item = menu.findItem(R.id.report_issue);
|
||||
if (item != null) {
|
||||
item.setTitle(TextUtil.markAsExternal(getString(R.string.global_menu_help_report_desktop)));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -77,15 +114,6 @@ public class LocalHelpActivity extends WebViewActivity
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (webView.canGoBack()) {
|
||||
webView.goBack();
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean assetExists(String fileName) {
|
||||
// test using AssetManager.open();
|
||||
// AssetManager.list() is unreliable eg. on my Android 7 Moto G
|
||||
|
||||
@@ -32,7 +32,6 @@ public abstract class MessageSelectorFragment
|
||||
implements DcEventCenter.DcEventDelegate
|
||||
{
|
||||
protected ActionMode actionMode;
|
||||
protected DcContext dcContext;
|
||||
|
||||
protected abstract void setCorrectMenuVisibility(Menu menu);
|
||||
|
||||
@@ -48,7 +47,7 @@ public abstract class MessageSelectorFragment
|
||||
protected void handleDisplayDetails(DcMsg dcMsg) {
|
||||
View view = View.inflate(getActivity(), R.layout.message_details_view, null);
|
||||
TextView detailsText = view.findViewById(R.id.details_text);
|
||||
detailsText.setText(dcContext.getMsgInfo(dcMsg.getId()));
|
||||
detailsText.setText(DcHelper.getContext(getContext()).getMsgInfo(dcMsg.getId()));
|
||||
|
||||
AlertDialog d = new AlertDialog.Builder(getActivity())
|
||||
.setView(view)
|
||||
@@ -62,6 +61,7 @@ public abstract class MessageSelectorFragment
|
||||
}
|
||||
|
||||
protected void handleDeleteMessages(int chatId, final int[] messageIds) {
|
||||
DcContext dcContext = DcHelper.getContext(getContext());
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
boolean canDeleteForAll = true;
|
||||
if (dcChat.isEncrypted() && dcChat.canSend() && !dcChat.isSelfTalk()) {
|
||||
@@ -134,7 +134,7 @@ public abstract class MessageSelectorFragment
|
||||
protected void handleShowInChat(final DcMsg dcMsg) {
|
||||
Intent intent = new Intent(getContext(), ConversationActivity.class);
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, dcMsg.getChatId());
|
||||
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, DcMsg.getMessagePosition(dcMsg, dcContext));
|
||||
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, DcMsg.getMessagePosition(dcMsg, DcHelper.getContext(getContext())));
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
@@ -144,6 +144,7 @@ public abstract class MessageSelectorFragment
|
||||
|
||||
protected void handleResendMessage(final Set<DcMsg> dcMsgsSet) {
|
||||
int[] ids = DcMsg.msgSetToIds(dcMsgsSet);
|
||||
DcContext dcContext = DcHelper.getContext(getContext());
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
boolean success = dcContext.resendMsgs(ids);
|
||||
Util.runOnMain(() -> {
|
||||
|
||||
@@ -38,8 +38,8 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
public static final int ITEM_ALL_MEDIA_BUTTON = 30;
|
||||
public static final int ITEM_SEND_MESSAGE_BUTTON = 35;
|
||||
public static final int ITEM_LAST_SEEN = 40;
|
||||
public static final int ITEM_BLOCKED = 43;
|
||||
public static final int ITEM_INTRODUCED_BY = 45;
|
||||
public static final int ITEM_ADDRESS = 50;
|
||||
public static final int ITEM_HEADER = 53;
|
||||
public static final int ITEM_MEMBERS = 55;
|
||||
public static final int ITEM_SHARED_CHATS = 60;
|
||||
@@ -140,7 +140,7 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
} else if (viewType == ITEM_ALL_MEDIA_BUTTON || viewType == ITEM_SEND_MESSAGE_BUTTON) {
|
||||
final ProfileTextItem item = (ProfileTextItem)layoutInflater.inflate(R.layout.profile_text_item_button, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_LAST_SEEN || viewType == ITEM_INTRODUCED_BY || viewType == ITEM_ADDRESS) {
|
||||
} else if (viewType == ITEM_LAST_SEEN || viewType == ITEM_INTRODUCED_BY || viewType == ITEM_BLOCKED) {
|
||||
final ProfileTextItem item = (ProfileTextItem)layoutInflater.inflate(R.layout.profile_text_item_small, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else {
|
||||
@@ -206,14 +206,11 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
else if(holder.itemView instanceof ProfileTextItem) {
|
||||
ProfileTextItem item = (ProfileTextItem) holder.itemView;
|
||||
item.setOnClickListener(view -> clickListener.onSettingsClicked(data.viewType));
|
||||
boolean tintIcon = data.viewType != ITEM_INTRODUCED_BY;
|
||||
boolean tintIcon = data.viewType != ITEM_INTRODUCED_BY && data.viewType != ITEM_BLOCKED;
|
||||
item.set(data.label, data.icon, tintIcon);
|
||||
if (data.viewType == ITEM_LAST_SEEN || data.viewType == ITEM_ADDRESS) {
|
||||
if (data.viewType == ITEM_BLOCKED) {
|
||||
int padding = (int)((float)context.getResources().getDimensionPixelSize(R.dimen.contact_list_normal_padding) * 1.2);
|
||||
item.setPadding(item.getPaddingLeft(), item.getPaddingTop(), item.getPaddingRight(), padding);
|
||||
if (data.viewType == ITEM_ADDRESS) {
|
||||
fragment.registerForContextMenu(item);
|
||||
}
|
||||
} else if (data.viewType == ITEM_INTRODUCED_BY) {
|
||||
int padding = context.getResources().getDimensionPixelSize(R.dimen.contact_list_normal_padding);
|
||||
item.setPadding(item.getPaddingLeft(), padding, item.getPaddingRight(), item.getPaddingBottom());
|
||||
@@ -308,6 +305,10 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
}
|
||||
*/
|
||||
|
||||
if (dcContact != null && !isDeviceTalk && !isSelfTalk && dcContact.isBlocked()) {
|
||||
itemData.add(new ItemData(ITEM_BLOCKED, context.getString(R.string.contact_blocked), R.drawable.contact_blocked_24));
|
||||
}
|
||||
|
||||
if (memberList!=null && !isInBroadcast && !isMailingList) {
|
||||
itemData.add(new ItemData(ITEM_DIVIDER, null, 0));
|
||||
if (dcChat != null) {
|
||||
@@ -345,10 +346,6 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
String introducedBy = context.getString(R.string.verified_by_unknown);
|
||||
itemData.add(new ItemData(ITEM_INTRODUCED_BY, introducedBy, R.drawable.ic_verified));
|
||||
}
|
||||
|
||||
if (dcContact != null) {
|
||||
itemData.add(new ItemData(ITEM_ADDRESS, dcContact.getAddr(), 0));
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
|
||||
@@ -310,13 +310,24 @@ public class ProfileFragment extends Fragment
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (requestCode==REQUEST_CODE_PICK_CONTACT && resultCode==Activity.RESULT_OK && data!=null) {
|
||||
List<Integer> selected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA);
|
||||
List<Integer> removed = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.REMOVED_CONTACTS_EXTRA);
|
||||
if(selected == null) return;
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
// Add new members
|
||||
for (Integer contactId : selected) {
|
||||
if (contactId!=null) {
|
||||
if (contactId != null) {
|
||||
dcContext.addContactToChat(chatId, contactId);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove members that were explicitly unchecked
|
||||
if (removed != null) {
|
||||
for (Integer contactId : removed) {
|
||||
if (contactId != null) {
|
||||
dcContext.removeContactFromChat(chatId, contactId);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
@@ -36,6 +37,7 @@ import org.thoughtcrime.securesms.qr.QrCodeHandler;
|
||||
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
|
||||
import org.thoughtcrime.securesms.service.GenericForegroundService;
|
||||
import org.thoughtcrime.securesms.service.NotificationController;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.StorageUtil;
|
||||
import org.thoughtcrime.securesms.util.StreamUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -67,16 +69,48 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(findViewById(R.id.content_container));
|
||||
|
||||
findViewById(R.id.signup_button).setOnClickListener((v) -> startInstantOnboardingActivity());
|
||||
findViewById(R.id.add_as_second_device_button).setOnClickListener((v) -> startAddAsSecondDeviceActivity());
|
||||
findViewById(R.id.signup_button).setOnClickListener((v) -> startActivity(new Intent(this, InstantOnboardingActivity.class)));
|
||||
findViewById(R.id.add_as_second_device_button).setOnClickListener((v) -> showSignInDialogWithPermission());
|
||||
findViewById(R.id.backup_button).setOnClickListener((v) -> startImportBackup());
|
||||
|
||||
registerForEvents();
|
||||
initializeActionBar();
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
AccountManager accountManager = AccountManager.getInstance();
|
||||
if (accountManager.canRollbackAccountCreation(WelcomeActivity.this)) {
|
||||
accountManager.rollbackAccountCreation(WelcomeActivity.this);
|
||||
} else {
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
DcHelper.maybeShowMigrationError(this);
|
||||
}
|
||||
|
||||
private void showSignInDialogWithPermission() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
|
||||
&& !Prefs.getBooleanPreference(this, Prefs.ASKED_FOR_NOTIFICATION_PERMISSION, false)) {
|
||||
Prefs.setBooleanPreference(this, Prefs.ASKED_FOR_NOTIFICATION_PERMISSION, true);
|
||||
Permissions.with(this)
|
||||
.request(Manifest.permission.POST_NOTIFICATIONS)
|
||||
.ifNecessary()
|
||||
.onAllGranted(() -> {
|
||||
startAddAsSecondDeviceActivity();
|
||||
})
|
||||
.onAnyDenied(() -> {
|
||||
startAddAsSecondDeviceActivity();
|
||||
})
|
||||
.execute();
|
||||
} else {
|
||||
startAddAsSecondDeviceActivity();
|
||||
}
|
||||
}
|
||||
|
||||
protected void initializeActionBar() {
|
||||
ActionBar supportActionBar = getSupportActionBar();
|
||||
if (supportActionBar == null) throw new AssertionError();
|
||||
@@ -97,7 +131,7 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -131,12 +165,6 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
|
||||
}
|
||||
|
||||
private void startInstantOnboardingActivity() {
|
||||
Intent intent = new Intent(this, InstantOnboardingActivity.class);
|
||||
intent.putExtra(InstantOnboardingActivity.FROM_WELCOME, true);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
private void startAddAsSecondDeviceActivity() {
|
||||
new IntentIntegrator(this).setCaptureActivity(RegistrationQrActivity.class)
|
||||
.addExtra(RegistrationQrActivity.ADD_AS_SECOND_DEVICE_EXTRA, true)
|
||||
@@ -352,14 +380,4 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
AccountManager accountManager = AccountManager.getInstance();
|
||||
if (accountManager.canRollbackAccountCreation(this)) {
|
||||
accountManager.rollbackAccountCreation(this);
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+17
-11
@@ -50,10 +50,12 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
private final ConversationListActivity activity;
|
||||
private RecyclerView recyclerView;
|
||||
private AccountSelectionListAdapter adapter;
|
||||
private final boolean selectOnly;
|
||||
|
||||
public AccountSelectionListFragment(ConversationListActivity activity) {
|
||||
public AccountSelectionListFragment(ConversationListActivity activity, boolean selectOnly) {
|
||||
super();
|
||||
this.activity = activity;
|
||||
this.selectOnly = selectOnly;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -61,10 +63,12 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
|
||||
.setTitle(R.string.switch_account)
|
||||
.setNeutralButton(R.string.connectivity, ((dialog, which) -> {
|
||||
startActivity(new Intent(getActivity(), ConnectivityActivity.class));
|
||||
}))
|
||||
.setNegativeButton(R.string.cancel, null);
|
||||
if (!selectOnly) {
|
||||
builder.setNeutralButton(R.string.connectivity, ((dialog, which) -> {
|
||||
startActivity(new Intent(getActivity(), ConnectivityActivity.class));
|
||||
}));
|
||||
}
|
||||
|
||||
LayoutInflater inflater = getActivity().getLayoutInflater();
|
||||
View view = inflater.inflate(R.layout.account_selection_list_fragment, null);
|
||||
@@ -99,18 +103,20 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
DcAccounts accounts = DcHelper.getAccounts(getActivity());
|
||||
int[] accountIds = accounts.getAll();
|
||||
|
||||
int[] ids = new int[accountIds.length + 1];
|
||||
int[] ids = new int[(selectOnly? 0 : 1) + accountIds.length];
|
||||
int j = 0;
|
||||
for (int accountId : accountIds) {
|
||||
ids[j++] = accountId;
|
||||
}
|
||||
ids[j] = DC_CONTACT_ID_ADD_ACCOUNT;
|
||||
if (!selectOnly) ids[j] = DC_CONTACT_ID_ADD_ACCOUNT;
|
||||
adapter.changeData(ids, accounts.getSelectedAccount().getAccountId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateContextMenu(@NonNull ContextMenu menu, @NonNull View v, ContextMenu.ContextMenuInfo menuInfo) {
|
||||
super.onCreateContextMenu(menu, v, menuInfo);
|
||||
if (selectOnly) return;
|
||||
|
||||
requireActivity().getMenuInflater().inflate(R.menu.account_item_context, menu);
|
||||
|
||||
AccountSelectionListItem listItem = (AccountSelectionListItem) v;
|
||||
@@ -188,9 +194,9 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
.setPositiveButton(android.R.string.ok, (d, b) -> {
|
||||
String newTag = inputField.getText().toString().trim();
|
||||
dcContext.setConfig(CONFIG_PRIVATE_TAG, newTag);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(activity);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(activity, selectOnly);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, (d, b) -> AccountManager.getInstance().showSwitchAccountMenu(activity))
|
||||
.setNegativeButton(R.string.cancel, (d, b) -> AccountManager.getInstance().showSwitchAccountMenu(activity, selectOnly))
|
||||
.show();
|
||||
}
|
||||
|
||||
@@ -230,7 +236,7 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
AlertDialog dialog = new AlertDialog.Builder(activity)
|
||||
.setTitle(R.string.delete_account)
|
||||
.setView(dialogView)
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> AccountManager.getInstance().showSwitchAccountMenu(activity))
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> AccountManager.getInstance().showSwitchAccountMenu(activity, selectOnly))
|
||||
.setPositiveButton(R.string.delete, (d2, w2) -> activity.onDeleteProfile(accountId))
|
||||
.show();
|
||||
Util.redPositiveButton(dialog);
|
||||
@@ -247,13 +253,13 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
|
||||
@Override
|
||||
public void onItemClick(AccountSelectionListItem contact) {
|
||||
Activity activity = requireActivity();
|
||||
AccountSelectionListFragment.this.dismiss();
|
||||
int accountId = contact.getAccountId();
|
||||
if (accountId == DC_CONTACT_ID_ADD_ACCOUNT) {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(activity, 0);
|
||||
} else if (accountId != DcHelper.getAccounts(activity).getSelectedAccount().getAccountId()) {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(activity, accountId);
|
||||
AccountManager.getInstance().switchAccount(activity, accountId);
|
||||
activity.onProfileSwitched(accountId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,39 +15,51 @@ import androidx.annotation.Nullable;
|
||||
import com.b44t.messenger.DcMsg;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.util.DateUtils;
|
||||
|
||||
import chat.delta.rpc.Rpc;
|
||||
import chat.delta.rpc.RpcException;
|
||||
|
||||
public class ConversationItemFooter extends LinearLayout {
|
||||
|
||||
private TextView dateView;
|
||||
private TextView editedView;
|
||||
private TextView viewsLabel;
|
||||
private ImageView viewsIcon;
|
||||
private ImageView bookmarkIndicatorView;
|
||||
private ImageView emailIndicatorView;
|
||||
private ImageView locationIndicatorView;
|
||||
private DeliveryStatusView deliveryStatusView;
|
||||
private Integer textColor = null;
|
||||
private int callDuration = 0;
|
||||
private Context context;
|
||||
private Rpc rpc;
|
||||
|
||||
public ConversationItemFooter(Context context) {
|
||||
super(context);
|
||||
init(null);
|
||||
init(context, null);
|
||||
}
|
||||
|
||||
public ConversationItemFooter(Context context, @Nullable AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init(attrs);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
public ConversationItemFooter(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
init(attrs);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
private void init(@Nullable AttributeSet attrs) {
|
||||
private void init(Context context, @Nullable AttributeSet attrs) {
|
||||
this.context = context;
|
||||
this.rpc = DcHelper.getRpc(context);
|
||||
inflate(getContext(), R.layout.conversation_item_footer, this);
|
||||
|
||||
dateView = findViewById(R.id.footer_date);
|
||||
editedView = findViewById(R.id.footer_edited);
|
||||
viewsLabel = findViewById(R.id.footer_views);
|
||||
viewsIcon = findViewById(R.id.footer_views_icon);
|
||||
bookmarkIndicatorView = findViewById(R.id.footer_bookmark_indicator);
|
||||
emailIndicatorView = findViewById(R.id.footer_email_indicator);
|
||||
locationIndicatorView = findViewById(R.id.footer_location_indicator);
|
||||
@@ -79,13 +91,33 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
}
|
||||
|
||||
locationIndicatorView.setVisibility(messageRecord.hasLocation() ? View.VISIBLE : View.GONE);
|
||||
presentDeliveryStatus(messageRecord);
|
||||
|
||||
boolean isOutChannel = DcHelper.getContext(context).getChat(messageRecord.getChatId()).isOutBroadcast();
|
||||
|
||||
if (isOutChannel && messageRecord.isOutgoing()) {
|
||||
try {
|
||||
int accId = rpc.getSelectedAccountId();
|
||||
int count = rpc.getMessageReadReceiptCount(accId, messageRecord.getId());
|
||||
viewsLabel.setText(String.format("%d", count));
|
||||
viewsLabel.setVisibility(View.VISIBLE);
|
||||
viewsIcon.setVisibility(View.VISIBLE);
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
viewsLabel.setVisibility(View.GONE);
|
||||
viewsIcon.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
presentDeliveryStatus(messageRecord, isOutChannel);
|
||||
}
|
||||
|
||||
public void setTextColor(int color) {
|
||||
textColor = color;
|
||||
dateView.setTextColor(color);
|
||||
editedView.setTextColor(color);
|
||||
viewsLabel.setTextColor(color);
|
||||
viewsIcon.setColorFilter(color);
|
||||
bookmarkIndicatorView.setColorFilter(color);
|
||||
emailIndicatorView.setColorFilter(color);
|
||||
locationIndicatorView.setColorFilter(color);
|
||||
@@ -106,7 +138,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
}
|
||||
}
|
||||
|
||||
private void presentDeliveryStatus(@NonNull DcMsg messageRecord) {
|
||||
private void presentDeliveryStatus(@NonNull DcMsg messageRecord, boolean isOutChannel) {
|
||||
// isDownloading is temporary and should be checked first.
|
||||
boolean isDownloading = messageRecord.getDownloadState() == DcMsg.DC_DOWNLOAD_IN_PROGRESS;
|
||||
boolean isCall = messageRecord.getType() == DcMsg.DC_MSG_CALL;
|
||||
@@ -114,7 +146,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
if (isDownloading) deliveryStatusView.setDownloading();
|
||||
else if (messageRecord.isPending()) deliveryStatusView.setPending();
|
||||
else if (messageRecord.isFailed()) deliveryStatusView.setFailed();
|
||||
else if (!messageRecord.isOutgoing() || isCall) deliveryStatusView.setNone();
|
||||
else if (!messageRecord.isOutgoing() || isCall || isOutChannel) deliveryStatusView.setNone();
|
||||
else if (messageRecord.isRemoteRead()) deliveryStatusView.setRead();
|
||||
else if (messageRecord.isDelivered()) deliveryStatusView.setSent();
|
||||
else if (messageRecord.isPreparing()) deliveryStatusView.setPreparing();
|
||||
|
||||
@@ -5,7 +5,6 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
@@ -14,7 +13,6 @@ import com.b44t.messenger.DcContext;
|
||||
|
||||
import org.thoughtcrime.securesms.ApplicationContext;
|
||||
import org.thoughtcrime.securesms.ConversationListActivity;
|
||||
import org.thoughtcrime.securesms.InstantOnboardingActivity;
|
||||
import org.thoughtcrime.securesms.WelcomeActivity;
|
||||
import org.thoughtcrime.securesms.accounts.AccountSelectionListFragment;
|
||||
|
||||
@@ -123,10 +121,6 @@ public class AccountManager {
|
||||
}
|
||||
|
||||
public void switchAccountAndStartActivity(Activity activity, int destAccountId) {
|
||||
switchAccountAndStartActivity(activity, destAccountId, null);
|
||||
}
|
||||
|
||||
private void switchAccountAndStartActivity(Activity activity, int destAccountId, @Nullable String backupQr) {
|
||||
if (destAccountId==0) {
|
||||
beginAccountCreation(activity);
|
||||
} else {
|
||||
@@ -134,12 +128,8 @@ public class AccountManager {
|
||||
}
|
||||
|
||||
activity.finishAffinity();
|
||||
if (destAccountId==0) {
|
||||
Intent intent = new Intent(activity, WelcomeActivity.class);
|
||||
if (backupQr != null) {
|
||||
intent.putExtra(WelcomeActivity.BACKUP_QR_EXTRA, backupQr);
|
||||
}
|
||||
activity.startActivity(intent);
|
||||
if (destAccountId == 0) {
|
||||
activity.startActivity(new Intent(activity, WelcomeActivity.class));
|
||||
} else {
|
||||
activity.startActivity(new Intent(activity.getApplicationContext(), ConversationListActivity.class));
|
||||
}
|
||||
@@ -147,12 +137,21 @@ public class AccountManager {
|
||||
|
||||
// ui
|
||||
|
||||
public void showSwitchAccountMenu(ConversationListActivity activity) {
|
||||
AccountSelectionListFragment dialog = new AccountSelectionListFragment(activity);
|
||||
public void showSwitchAccountMenu(ConversationListActivity activity, boolean selectOnly) {
|
||||
AccountSelectionListFragment dialog = new AccountSelectionListFragment(activity, selectOnly);
|
||||
dialog.show(((FragmentActivity) activity).getSupportFragmentManager(), null);
|
||||
}
|
||||
|
||||
public void addAccountFromSecondDevice(Activity activity, String backupQr) {
|
||||
switchAccountAndStartActivity(activity, 0, backupQr);
|
||||
DcAccounts accounts = DcHelper.getAccounts(activity);
|
||||
if (accounts.getSelectedAccount().isConfigured() == 1) {
|
||||
// the selected account is already configured, create a new one
|
||||
beginAccountCreation(activity);
|
||||
}
|
||||
|
||||
activity.finishAffinity();
|
||||
Intent intent = new Intent(activity, WelcomeActivity.class);
|
||||
intent.putExtra(WelcomeActivity.BACKUP_QR_EXTRA, backupQr);
|
||||
activity.startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,6 +101,10 @@ public class ThreadRecord {
|
||||
return spannable;
|
||||
}
|
||||
|
||||
public boolean isOutChannel() {
|
||||
return recipient.getChat() != null && recipient.getChat().isOutBroadcast();
|
||||
}
|
||||
|
||||
public int getUnreadCount() {
|
||||
return unreadCount;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ import java.io.IOException;
|
||||
|
||||
public class AvatarHelper {
|
||||
/* the maximum width/height an avatar should have */
|
||||
public static final int AVATAR_SIZE = 640;
|
||||
public static final int AVATAR_SIZE = 512;
|
||||
|
||||
public static void setGroupAvatar(Context context, int chatId, Bitmap bitmap) {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
|
||||
@@ -11,6 +11,7 @@ import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -56,6 +57,8 @@ public class BackupTransferActivity extends BaseActionBarActivity {
|
||||
private boolean notificationControllerClosed = false;
|
||||
public boolean warnAboutCopiedQrCodeOnAbort = false;
|
||||
|
||||
private OnBackPressedCallback backPressedCallback;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
@@ -89,6 +92,15 @@ public class BackupTransferActivity extends BaseActionBarActivity {
|
||||
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(findViewById(R.id.backup_provider_fragment));
|
||||
|
||||
backPressedCallback = new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
finishOrAskToFinish();
|
||||
}
|
||||
};
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, backPressedCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -107,18 +119,13 @@ public class BackupTransferActivity extends BaseActionBarActivity {
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
finishOrAskToFinish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == android.R.id.home) {
|
||||
finishOrAskToFinish();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.troubleshooting) {
|
||||
DcHelper.openHelp(this, "#multiclient");
|
||||
|
||||
@@ -58,7 +58,9 @@ public class QrCodeHandler {
|
||||
public void handleOnlySecureJoinQr(String rawString, SecurejoinSource source, SecurejoinUiPath uiPath) {
|
||||
final DcLot qrParsed = dcContext.checkQr(rawString);
|
||||
if (!handleSecureJoinQr(qrParsed, rawString, source, uiPath)) {
|
||||
handleDefault(new AlertDialog.Builder(activity), rawString, qrParsed);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||
handleDefault(builder, rawString, qrParsed);
|
||||
builder.create().show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,7 +124,9 @@ public class QrCodeHandler {
|
||||
public void handleOnlyAddRelayQr(String rawString) {
|
||||
final DcLot qrParsed = dcContext.checkQr(rawString);
|
||||
if (!handleAddRelayQr(qrParsed, rawString)) {
|
||||
handleDefault(new AlertDialog.Builder(activity), rawString, qrParsed);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||
handleDefault(builder, rawString, qrParsed);
|
||||
builder.create().show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,11 +27,4 @@ public class ScribbleActivity extends PassphraseRequiredActionBarActivity {
|
||||
boolean cropAvatar = getIntent().getBooleanExtra(CROP_AVATAR, false);
|
||||
imageEditorFragment = initFragment(R.id.scribble_container, ImageEditorFragment.newInstance(getIntent().getData(), cropAvatar));
|
||||
}
|
||||
|
||||
/* @Override
|
||||
public void onBackPressed() {
|
||||
if (!imageEditorFragment.onBackPressed()) {
|
||||
super.onBackPressed();
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ public class StickerSelectActivity extends FragmentActivity implements StickerSe
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.thoughtcrime.securesms.util;
|
||||
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getForwardedMessageAccountId;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getForwardedMessageIDs;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedText;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedUris;
|
||||
@@ -29,6 +30,11 @@ import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import chat.delta.rpc.Rpc;
|
||||
import chat.delta.rpc.RpcException;
|
||||
|
||||
public class SendRelayedMessageUtil {
|
||||
private static final String TAG = SendRelayedMessageUtil.class.getSimpleName();
|
||||
@@ -40,12 +46,27 @@ public class SendRelayedMessageUtil {
|
||||
public static void immediatelyRelay(Activity activity, final Long[] chatIds) {
|
||||
ConversationListRelayingActivity.finishActivity();
|
||||
if (isForwarding(activity)) {
|
||||
int forwardedMsgAccId = getForwardedMessageAccountId(activity);
|
||||
int[] forwardedMessageIDs = getForwardedMessageIDs(activity);
|
||||
resetRelayingMessageContent(activity);
|
||||
if (forwardedMessageIDs == null) return;
|
||||
if (forwardedMessageIDs == null || forwardedMsgAccId <= 0) return;
|
||||
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
DcContext dcContext = DcHelper.getContext(activity);
|
||||
int accId = dcContext.getAccountId();
|
||||
if (forwardedMsgAccId != accId) {
|
||||
Rpc rpc = DcHelper.getRpc(activity);
|
||||
List<Integer> list = Util.toList(forwardedMessageIDs);
|
||||
for (long longChatId : chatIds) {
|
||||
try {
|
||||
rpc.forwardMessagesToAccount(forwardedMsgAccId, list, accId, (int)longChatId);
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for (long longChatId : chatIds) {
|
||||
int chatId = (int) longChatId;
|
||||
if (dcContext.getChat(chatId).isSelfTalk()) {
|
||||
|
||||
@@ -14,6 +14,7 @@ import androidx.annotation.NonNull;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ShareUtil {
|
||||
private static final String FORWARDED_MESSAGE_ACCID = "forwarded_message_accid";
|
||||
private static final String FORWARDED_MESSAGE_IDS = "forwarded_message_ids";
|
||||
private static final String SHARED_URIS = "shared_uris";
|
||||
private static final String SHARED_CONTACT_ID = "shared_contact_id";
|
||||
@@ -27,11 +28,7 @@ public class ShareUtil {
|
||||
}
|
||||
|
||||
public static boolean isForwarding(Activity activity) {
|
||||
try {
|
||||
return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS) != null;
|
||||
} catch (NullPointerException npe) {
|
||||
return false;
|
||||
}
|
||||
return getForwardedMessageAccountId(activity) > 0;
|
||||
}
|
||||
|
||||
public static boolean isSharing(Activity activity) {
|
||||
@@ -66,6 +63,14 @@ public class ShareUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static int getForwardedMessageAccountId(Activity activity) {
|
||||
try {
|
||||
return activity.getIntent().getIntExtra(FORWARDED_MESSAGE_ACCID, -1);
|
||||
} catch (NullPointerException npe) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int[] getForwardedMessageIDs(Activity activity) {
|
||||
try {
|
||||
return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS);
|
||||
@@ -137,6 +142,7 @@ public class ShareUtil {
|
||||
|
||||
public static void resetRelayingMessageContent(Activity activity) {
|
||||
try {
|
||||
activity.getIntent().removeExtra(FORWARDED_MESSAGE_ACCID);
|
||||
activity.getIntent().removeExtra(FORWARDED_MESSAGE_IDS);
|
||||
activity.getIntent().removeExtra(SHARED_URIS);
|
||||
activity.getIntent().removeExtra(SHARED_CONTACT_ID);
|
||||
@@ -153,7 +159,8 @@ public class ShareUtil {
|
||||
|
||||
public static void acquireRelayMessageContent(Activity currentActivity, @NonNull Intent newActivityIntent) {
|
||||
if (isForwarding(currentActivity)) {
|
||||
newActivityIntent.putExtra(FORWARDED_MESSAGE_IDS, getForwardedMessageIDs(currentActivity));
|
||||
int accId = getForwardedMessageAccountId(currentActivity);
|
||||
setForwardingMessageIds(newActivityIntent, getForwardedMessageIDs(currentActivity), accId);
|
||||
} else if (isSharing(currentActivity)) {
|
||||
newActivityIntent.putExtra(IS_SHARING, true);
|
||||
if (isDirectSharing(currentActivity)) {
|
||||
@@ -180,7 +187,8 @@ public class ShareUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static void setForwardingMessageIds(Intent composeIntent, int[] messageIds) {
|
||||
public static void setForwardingMessageIds(Intent composeIntent, int[] messageIds, int accId) {
|
||||
composeIntent.putExtra(FORWARDED_MESSAGE_ACCID, accId);
|
||||
composeIntent.putExtra(FORWARDED_MESSAGE_IDS, messageIds);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.thoughtcrime.securesms.util;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.text.BidiFormatter;
|
||||
|
||||
public class TextUtil {
|
||||
@NonNull
|
||||
public static String bidiAppend(String text, String suffix) {
|
||||
return BidiFormatter.getInstance().unicodeWrap(text) + suffix;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String markAsExternal(String text) {
|
||||
return bidiAppend(text, " ↗");
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,9 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
@@ -115,6 +117,14 @@ public class Util {
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Integer> toList(int[] array) {
|
||||
ArrayList<Integer> list = new ArrayList<>(array.length);
|
||||
for (int i : array) {
|
||||
list.add(i);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static @NonNull int[] appendInt(@Nullable int[] cur, int val) {
|
||||
if (cur == null) {
|
||||
return new int[] { val };
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
|
||||
|
||||
<path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM4,12c0,-4.42 3.58,-8 8,-8 1.85,0 3.55,0.63 4.9,1.69L5.69,16.9C4.63,15.55 4,13.85 4,12zM12,20c-1.85,0 -3.55,-0.63 -4.9,-1.69L18.31,7.1C19.37,8.45 20,10.15 20,12c0,4.42 -3.58,8 -8,8z"/>
|
||||
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5M12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5s5,2.24 5,5s-2.24,5 -5,5m0,-8c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3s-1.34,-3 -3,-3"
|
||||
android:fillColor="#fff"/>
|
||||
</vector>
|
||||
@@ -62,6 +62,29 @@
|
||||
android:contentDescription="@string/location"
|
||||
tools:visibility="gone" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/footer_views_icon"
|
||||
android:layout_width="12sp"
|
||||
android:layout_height="11sp"
|
||||
android:layout_marginStart="6dp"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:src="@drawable/ic_baseline_eye"
|
||||
android:importantForAccessibility="no"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/footer_views"
|
||||
android:autoLink="none"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:linksClickable="false"
|
||||
style="@style/Signal.Text.Caption.MessageSent"
|
||||
android:textColor="?conversation_item_outgoing_text_secondary_color"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
tools:text="150" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/delivery_indicator"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -37,9 +37,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/Signal.Text.Body"
|
||||
android:singleLine="true"
|
||||
android:maxLines="1"
|
||||
android:clickable="false"
|
||||
android:ellipsize="end"
|
||||
android:ellipsize="middle"
|
||||
android:textColor="@color/document_icon_text"
|
||||
tools:text="The-Anarchist-Tension-by-Alfredo-Bonanno.pdf"/>
|
||||
|
||||
|
||||
@@ -5,4 +5,7 @@
|
||||
<item android:title="@string/menu_export_attachment"
|
||||
android:id="@+id/menu_export_attachment" />
|
||||
|
||||
<item android:title="@string/switch_account"
|
||||
android:id="@+id/menu_switch_account" />
|
||||
|
||||
</menu>
|
||||
|
||||
@@ -282,7 +282,7 @@
|
||||
<string name="menu_message_details">Nachrichteninfo</string>
|
||||
<string name="menu_copy_to_clipboard">In Zwischenablage kopieren</string>
|
||||
<string name="share_invite_link">Einladungslink teilen</string>
|
||||
<string name="share_invite_link_explain">Teile den Link nur mit Personen, denen du vertrauen. Alle, die diesen Link haben, können einen Chat mit dir starten.</string>
|
||||
<string name="share_invite_link_explain">Teile den Link nur mit Personen, denen du vertraust. Alle, die diesen Link haben, können einen Chat mit dir starten.</string>
|
||||
<string name="invite_friends">Freunde einladen</string>
|
||||
<!-- %1$s is replaced by the user's invitation link ("https://i.delta.chat/...") -->
|
||||
<string name="invite_friends_text">Kontaktiere mich auf Delta Chat:\n%1$s</string>
|
||||
@@ -1003,6 +1003,7 @@
|
||||
<string name="secure_join_replies">%1$s antwortet. Warte, zur Gruppe hinzugefügt zu werden…</string>
|
||||
<string name="secure_join_wait">Verbindungsaufbau, bitte warten…</string>
|
||||
<string name="contact_verified">%1$s eingeführt.</string>
|
||||
<string name="contact_blocked">Du hast den Kontakt blockiert</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Eingeführt von %1$s</string>
|
||||
<string name="verified_by_you">Durch mich eingeführt</string>
|
||||
|
||||
@@ -813,6 +813,9 @@
|
||||
<string name="disable_imap_idle">Lülita IMAP IDLE välja</string>
|
||||
<string name="disable_imap_idle_explain">Ära kasuta IMAP IDLE meetodit, seda isegi siis, kui server seda toetab. Sisselülitamisel tekib sõnumite laadimisel viivitusi. Kasuta seda vaid testimiseks.</string>
|
||||
<string name="send_stats_to_devs">Saada statistikat Delta Chati kasutajatele</string>
|
||||
<string name="stats_device_message">Kas sa tahad aidata Delta Chati paremaks muuta? Siis luba rakendusel kord nädalas saata anonüümset statistikat kasutuse kohta.\n\n👉 Klõpsa siia… 👈</string>
|
||||
<string name="stats_confirmation_dialog">Kas sa tahad aidata Delta Chati paremaks muuta? Siis luba rakendusel kord nädalas saata anonüümset statistikat kasutuse kohta.</string>
|
||||
<string name="stats_thanks">Suur tänu! Soovi korral võid saatmise siit välja lülitada: „Seadistused“ → „Täiendavad seadistused“.\n\nKas sul on ka 5 minuti jagu aega osalemaks Delta Chati turvalisust käsitlevas teaduslikus uuringus?</string>
|
||||
<string name="stats_disable_dialog">Statistika saatmine on juba kasutusel\n\nKas sa tahaksid ta välja lülitada?</string>
|
||||
<string name="disable">Lülita välja</string>
|
||||
<string name="stats_keep_sending">Jätka saatmist</string>
|
||||
@@ -999,6 +1002,7 @@
|
||||
<string name="secure_join_replies">%1$s vastas, ootan gruppi lisamist…</string>
|
||||
<string name="secure_join_wait">Panen aluse läbivale krüptimisele…</string>
|
||||
<string name="contact_verified">%1$s lisas vestlusesse.</string>
|
||||
<string name="contact_blocked">Sina blokeerisid selle kontakti</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">%1$s lisas kontakti vestlusesse</string>
|
||||
<string name="verified_by_you">Mina lisasin kontakti vestlusesse</string>
|
||||
|
||||
@@ -267,6 +267,9 @@
|
||||
<string name="add_recipients">Ajouter des destinataires</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="channel_name">Nom du canal</string>
|
||||
<string name="email">Courriel</string>
|
||||
<!-- "New" as in "Create New Email"; shown together with "New Group" and "New Channel" -->
|
||||
<string name="new_email">Nouveau courriel</string>
|
||||
<!-- the "Subject" of an email, use the term common in classic email apps -->
|
||||
<string name="subject">Sujet</string>
|
||||
<string name="menu_send">Envoyer</string>
|
||||
@@ -464,6 +467,7 @@
|
||||
<string name="chat_input_placeholder">Message</string>
|
||||
<string name="chat_archived_label">Archivé</string>
|
||||
<string name="chat_request_label">Invitation</string>
|
||||
<string name="chat_request_label_explain">Inclure les messages d\'invitations dans les compteurs et notifications</string>
|
||||
<string name="chat_no_messages">Aucun message.</string>
|
||||
<string name="chat_self_talk_subtitle">Messages envoyés à moi-même</string>
|
||||
<string name="archive_empty_hint">Les discussions archivées apparaîtront ici.</string>
|
||||
@@ -817,6 +821,12 @@
|
||||
<string name="disable_imap_idle">Désactiver IMAP IDLE</string>
|
||||
<string name="disable_imap_idle_explain">N\'utilisez pas d\'extension IMAP IDLE, même si elle est prise en charge par votre serveur, car elle provoque des retards dans la récupération des messages. Activez cette option uniquement pour effectuer des tests.</string>
|
||||
<string name="send_stats_to_devs">Envoyer les statistiques aux développeurs Delta Chat</string>
|
||||
<string name="stats_device_message">Voulez-vous aider à améliorer Delta Chat et soutenir notre recherche en envoyant des statistiques d\'utilisation hebdomadaires ?\n\n👉 Touchez ici... 👈</string>
|
||||
<string name="stats_confirmation_dialog">Voulez-vous aider à améliorer Delta Chat et soutenir notre recherche en envoyant des statistiques d\'utilisation hebdomadaires ?</string>
|
||||
<string name="stats_thanks">Merci ! Vous pouvez toujours désactiver l\'envoi dans \"Paramètres -> Avancé\".\n\nAvez-vous en plus 5 minutes pour participer à une étude scientifique sur la sécurité de Delta Chat ?</string>
|
||||
<string name="stats_disable_dialog">L\'envoi de statistiques est déjà activé.\n\nSouhaitez-vous le désactiver ?</string>
|
||||
<string name="disable">Désactiver</string>
|
||||
<string name="stats_keep_sending">Continuer l\'envoi</string>
|
||||
<string name="stats_msg_body">La pièce jointe contient des statistiques d\'usage anonymisés, qui nous aide à améliorer Delta Chat. Merci !</string>
|
||||
|
||||
<!-- Emoji picker and categories -->
|
||||
@@ -987,7 +997,7 @@
|
||||
<string name="qrshow_join_contact_hint">Scanner pour discuter avec %1$s</string>
|
||||
<string name="qrshow_join_contact_no_connection_toast">Pas de connexion Internet, ne peut pas effectuer la configuration du QR code.</string>
|
||||
<string name="qraccount_ask_create_and_login">Créer une nouvelle adresse de courriel sur « %1$s » et se connecter ici ?</string>
|
||||
<string name="set_name_and_avatar_explain">Choisissez un nom que vos contacts reconnaîtrons. Vous pouvez également définir une image pour votre profile.</string>
|
||||
<string name="set_name_and_avatar_explain">Choisissez un nom que vos contacts reconnaîtrons. Vous pouvez également définir une image pour votre profil.</string>
|
||||
<string name="please_enter_name">Veuillez saisir un nom.</string>
|
||||
<string name="qraccount_qr_code_cannot_be_used">Le code QR scanné ne peut pas être utilisé pour ouvrir un nouveau compte.</string>
|
||||
<!-- the placeholder will be replaced by the address of the profile -->
|
||||
@@ -1000,6 +1010,7 @@
|
||||
<string name="secure_join_replies">%1$s a répondu, en attente d’être ajouté au groupe…</string>
|
||||
<string name="secure_join_wait">Chiffrement de bout en bout en cours d\'établissement, merci de patienter...</string>
|
||||
<string name="contact_verified">%1$s connu.</string>
|
||||
<string name="contact_blocked">Vous avez bloqué le contact</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Connu par %1$s</string>
|
||||
<string name="verified_by_you">Connu par vous</string>
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
<!-- "Stickers" as known from other messengers; in some languages, the English "Sticker" is fine. -->
|
||||
<string name="sticker">Tamenṭaḍt</string>
|
||||
<string name="add_to_sticker_collection">Rnu ɣer tegrumma n tamenṭaḍt</string>
|
||||
<string name="add_stickers_instructions">Akken ad ternuḍ tamenṭaḍt, sit ɣef \" ldi akaram n tmenṭaḍt \", snulfu-d akaram anaddaw i ukemmus-ik-im n tmenṭaḍt, zuɣer tugna akked ifuyla n tmenṭaḍt din</string>
|
||||
<string name="add_stickers_instructions">Akken ad ternuḍ tamenṭaḍt, sit ɣef \" ldi akaram n tmenṭaḍt \", snulfu-d akaram anaddaw i ukemmus-ik·im n tmenṭaḍt, zuɣer tugna akked ifuyla n tmenṭaḍt din</string>
|
||||
<string name="open_sticker_folder">Ldi akaran n tmenṭaḍt</string>
|
||||
<string name="images">Tugniwin</string>
|
||||
<string name="audio">Ameslaw</string>
|
||||
@@ -282,7 +282,7 @@
|
||||
<string name="menu_message_details">Talɣut n yizen</string>
|
||||
<string name="menu_copy_to_clipboard">Nɣel ɣer tecfawt</string>
|
||||
<string name="share_invite_link">Bḍu aseɣwen n tinnubga</string>
|
||||
<string name="share_invite_link_explain">Yal yiwen s useɣwen-a yezmer ad iwali amaɣnu-ik-im daɣen ad yebdu adiwenni yid-k-m. Bḍu-t kan d wid i tettamneḍ.</string>
|
||||
<string name="share_invite_link_explain">Yal yiwen s useɣwen-a yezmer ad iwali amaɣnu-ik·im daɣen ad yebdu adiwenni yid-k·m. Bḍu-t kan d wid i tettamneḍ.</string>
|
||||
<string name="invite_friends">Snubeg imeddukal</string>
|
||||
<!-- %1$s is replaced by the user's invitation link ("https://i.delta.chat/...") -->
|
||||
<string name="invite_friends_text">Nermes-iyi-d deg Delta:\n%1$s</string>
|
||||
@@ -341,7 +341,7 @@
|
||||
<string name="title_share_location">Bḍu adeg akked iɛeggalen n ugraw meṛṛa</string>
|
||||
<string name="device_talk">Iznan n yibenk</string>
|
||||
<string name="device_talk_subtitle">Slalen-d iznan seg yidis adigan</string>
|
||||
<string name="device_talk_explain">Iznan n udiwenni-a ttlalen-d deg yibenk-ik-im kken ad d-mlen ileqman akked wuguren n usnas deg useqdec.</string>
|
||||
<string name="device_talk_explain">Iznan n udiwenni-a ttlalen-d deg yibenk-ik·im kken ad d-mlen ileqman akked wuguren n usnas deg useqdec.</string>
|
||||
<string name="edit_contact">Ẓreg anermis</string>
|
||||
<!-- Verb "to pin", making something sticky, not a noun or abbreviation for "pin number". -->
|
||||
<string name="pin_chat">Senteḍ adiwenni</string>
|
||||
@@ -357,7 +357,7 @@
|
||||
<!-- Menu item beside an app/chat that adds an icon to the system's home screen. If the user taps that icon, the app/chat is opened directly. -->
|
||||
<string name="add_to_home_screen">Rnu ɣer ugdil agejdan</string>
|
||||
<string name="donate">Mudd tawsa</string>
|
||||
<string name="donate_device_msg">❤️ Yettban-iyi-d dakken aql-ik-im tḥemmled Delta Chat!\n\nMa ulac aɣilif, mudd-d tawsa akken ad tḍemneḍ d akken Delta Chat ad yeqqim baṭel i yal yiwen.\n\nMa d Delta Chat baṭel i useqdec d uɣbalu yeldin, taneflit tesqam-d idrimen. Mudd-aɣ-d afus ad neḥrez Delta Chat d ilelli u ad t-nerr d imgerrez ugar ɣer zdat.\n\nhttps://delta.chat/donate</string>
|
||||
<string name="donate_device_msg">❤️ Yettban-iyi-d dakken aql-ik·im tḥemmled Delta Chat!\n\nMa ulac aɣilif, mudd-d tawsa akken ad tḍemneḍ d akken Delta Chat ad yeqqim baṭel i yal yiwen.\n\nMa d Delta Chat baṭel i useqdec d uɣbalu yeldin, taneflit tesqam-d idrimen. Mudd-aɣ-d afus ad neḥrez Delta Chat d ilelli u ad t-nerr d imgerrez ugar ɣer zdat.\n\nhttps://delta.chat/donate</string>
|
||||
|
||||
<string name="mute_for_one_hour"> Sgugem i 1 usrag</string>
|
||||
<string name="mute_for_eight_hours">Sgugem i 8 yisragen</string>
|
||||
@@ -394,15 +394,23 @@
|
||||
<!-- get confirmations -->
|
||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||
<string name="ask_leave_group">Tetḥeqqeḍ tebɣiḍ ad truḥeḍ? </string>
|
||||
<plurals name="ask_delete_chat">
|
||||
<item quantity="one">Kkes %d n udiwenni?</item>
|
||||
<item quantity="other">Kkes %d n tdiwenniyin?</item>
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Kkes adiwenni \"%1$s\"?</string>
|
||||
<string name="ask_delete_message">Kkes izen-a?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">Kkes %d n yizen?</item>
|
||||
<item quantity="other">Kkes %d n yiznan?</item>
|
||||
</plurals>
|
||||
<string name="ask_forward">Welleh iznan ɣer %1$s?</string>
|
||||
<string name="ask_forward_multiple">Welleh iznan ɣer %1$d n yidiwenniyen?</string>
|
||||
<string name="ask_export_attachment">Asifeḍ n imeddayen ad yeǧǧ isnasen-nniḍen deg yibenk-ik-im ad kecmen ɣur-sen.\n\nad tkemmleḍ?</string>
|
||||
<string name="ask_export_attachment">Asifeḍ n imeddayen ad yeǧǧ isnasen-nniḍen deg yibenk-ik·im ad kecmen ɣur-sen.\n\nad tkemmleḍ?</string>
|
||||
<string name="ask_block_contact">Sewḥel anermis-agi?\n\nUr d-ttbanen ara yiznan usriden neɣ igrawen i d-yettwaxelqen s yinermisen iweḥlen.\n\nIgrawen-nniḍen yesεan inermisen iweḥlen mazal ad d-sseknen iznan-nsen.</string>
|
||||
<string name="ask_unblock_contact">Kkes asewḥel i unermis-a </string>
|
||||
<string name="ask_delete_contacts">Kkes inermisen?\n\nInermisen s udiwenni i d-iteddun ulamek ara ttwakksen i lebda.</string>
|
||||
<string name="ask_delete_contact">Kkes anermis %1$s?\n\nInermisen s udiwenni i d-iteddun ulamek ara ttwakksen i lebda.</string>
|
||||
<string name="ask_start_chat_with">Qeṣṣir d %1$s?</string>
|
||||
<!-- %1$s is replaced by a comma-separated list of names -->
|
||||
<string name="ask_remove_members">Kkes %1$s seg unagraw?</string>
|
||||
@@ -436,7 +444,7 @@
|
||||
<!-- The placeholder will be replaced by the name of the recipient in a one-to-one chat. -->
|
||||
<string name="chat_new_one_to_one_hint">Azen izen i %1$s.</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="chat_new_channel_hint">Ibuda d afecku seg waṭas nniḍen i usiweḍ n yiznan-ik-im. </string>
|
||||
<string name="chat_new_channel_hint">Ibuda d afecku seg waṭas nniḍen i usiweḍ n yiznan-ik·im. </string>
|
||||
<string name="chat_new_group_hint">Wiyaḍ ad walin kan agraw-agi ticki tuzneḍ izen amezwaru.</string>
|
||||
<string name="chat_record_slide_to_cancel">Zuɣer akken ad tesfesxeḍ</string>
|
||||
<string name="chat_record_explain">Sit u ṭṭef akken ad teskelseḍ izen n taɣect, serreḥ i tuzna</string>
|
||||
@@ -476,7 +484,7 @@
|
||||
<!-- title shown above a list contacts where one should be selected (eg. when a webxdc attempts to send a message to a chat) -->
|
||||
<string name="send_message_to">Azen izen i...</string>
|
||||
<string name="enable_realtime">Isnasen n wakud ilaw</string>
|
||||
<string name="enable_realtime_explain">Rmed tuqqna n walud tilawt i yisnasen icudden ɣer idiwenniyen. Ma yella yermed, imttekkiyen n udiwenni zemren ad d-afen tansa-ik-im IP ticki tebdiḍ asnas.</string>
|
||||
<string name="enable_realtime_explain">Rmed tuqqna n walud tilawt i yisnasen icudden ɣer idiwenniyen. Ma yella yermed, imttekkiyen n udiwenni zemren ad d-afen tansa-ik·im IP ticki tebdiḍ asnas.</string>
|
||||
|
||||
<!-- map -->
|
||||
<string name="filter_map_on_time">Sken-d imeḍqan deg ukatar n wakud</string>
|
||||
@@ -544,7 +552,7 @@
|
||||
<string name="multidevice_title">Rnu ibenk wis sin</string>
|
||||
<string name="multidevice_same_network_hint">Wali ma yella sin n yibenkan-a deg yiwen n uzeṭṭa Wi-Fi neɣ deg yiwen n uẓeṭṭa</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Aya ad yernu tangalt QR i yezmer ad yeḍumm ibenk wis sin akken ad yenɣel amaɣnu.\n\nḍmen d akken ula d yiwen n umnadi neɣ n tkamra ur yezmer ad iwali agdil-a.</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Sebded delta Chat ɣef yibenk-ik-im nniḍen (https://get.delta.chat)</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Sebded delta Chat ɣef yibenk-ik·im nniḍen (https://get.delta.chat)</string>
|
||||
<!-- "I Already Have a Profile / Add as Second Device” should be the same text as defined by the keys onboarding_alternative_logins and multidevice_receiver_title -->
|
||||
<string name="multidevice_tap_scan_on_other_device">Bdu Delta Chat, sit “Sεiɣ yakan amaɣnu / Rnu am yibenk wis sin” sakin ḍumm tangalt i d-yettwaseknen dagi</string>
|
||||
<!-- Shown inside a "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the profile name eg. "Scan to set up second device for Alice" -->
|
||||
@@ -555,7 +563,7 @@
|
||||
<string name="multidevice_receiver_needs_update">Amaɣnu i tebɣiḍ ad d-tketreḍ seg lqem amaynut n Delta Chat.\n\nAkken ad tkemleḍ asebded n yibenk wis sin, ma ulac aɣilif leqqem ibenk-agi ɣer lqem aneggaru n Delta Chat. </string>
|
||||
<string name="multidevice_abort">Sefsex asbadu n yibenk wis sin?</string>
|
||||
<string name="multidevice_abort_will_invalidate_copied_qr">Aya ad yili d arameɣtu i tangalt QR i d-yettwanɣelen ɣer tecfawt.</string>
|
||||
<string name="multidevice_transfer_done_devicemsg">ℹ️ Amaɣnu yettusiweḍ ɣer yibenk-ik wis sin.</string>
|
||||
<string name="multidevice_transfer_done_devicemsg">ℹ️ Amaɣnu yettusiweḍ ɣer yibenk-ik·im wis sin.</string>
|
||||
<!-- Shown beside progress bar, stay short -->
|
||||
<string name="preparing_account">Aheggi n umaɣnu...</string>
|
||||
<!-- Shown beside progress bar, stay short -->
|
||||
@@ -580,7 +588,7 @@
|
||||
<string name="connectivity_connected">Yettwaqqen</string>
|
||||
<string name="sending">Tuzna...</string>
|
||||
<string name="last_msg_sent_successfully">Izen aneggaru yettwazen akken iwata. </string>
|
||||
<string name="not_supported_by_provider">ur yettusefrak ara ɣer usaǧǧaw-ik-im.</string>
|
||||
<string name="not_supported_by_provider">ur yettusefrak ara ɣer usaǧǧaw-ik·im.</string>
|
||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||
<string name="messages">Iznan</string>
|
||||
<!-- Used for describing resource usage, resulting string will be eg. "1.2 GiB of 3 GiB used" -->
|
||||
@@ -592,8 +600,10 @@
|
||||
<string name="onboarding_create_instant_account">Rnu amaɣnu amaynut</string>
|
||||
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
|
||||
<string name="onboarding_alternative_logins">Ɣur-i yakan amaɣnu</string>
|
||||
<!-- This is a button and a title, allowing to use existing, classic email, setting ports, passwords and so on -->
|
||||
<string name="manual_account_setup_option">Seqdec imayl aklasiki am Umsiweḍ</string>
|
||||
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
|
||||
<string name="instant_onboarding_title">Amaɣnu-ik-im</string>
|
||||
<string name="instant_onboarding_title">Amaɣnu-ik·im</string>
|
||||
<!-- The placeholder will be replaced by the default onboarding server -->
|
||||
<string name="instant_onboarding_agree_default2">Tsertit tabaḍnit i %1$s</string>
|
||||
<!-- The placeholder will be replaced by instance name, the whole text will link to the instance page -->
|
||||
@@ -615,6 +625,7 @@
|
||||
<string name="welcome_chat_over_email">Adiwenni Aɣelsan Aruslemmas</string>
|
||||
<string name="scan_invitation_code">Ḍumm tangalt n tinnubga</string>
|
||||
<string name="login_title">Kcem</string>
|
||||
<string name="login_advanced_hint">Tuqqna-agi i yiseqdacen leqqayen:\n\n• Ur sseqdac ara tansa i tseqdaceḍ deg usnas nniḍen.\n\n• Aqeddac n yimayl aklasik yesirig anekcum war awgelhen seg yixef ɣer yixef yettwacerḍen s tignit n yimayl.</string>
|
||||
<string name="login_inbox">Tanaka n urmas</string>
|
||||
<string name="login_imap_login">Isem n tuqqna IMAP. </string>
|
||||
<string name="login_imap_server">Aqeddac IMAP</string>
|
||||
@@ -637,10 +648,21 @@
|
||||
<string name="proxy_delete">Kkes apṛuksi</string>
|
||||
<string name="proxy_delete_explain">Tebɣiḍ ad tekkseḍ \"%1$s\"?</string>
|
||||
<string name="proxy_use_proxy_confirm">Tebɣiḍ ad tesqedceḍ apṛuksi \"%1$s\"?</string>
|
||||
<string name="proxy_share_explain">Imeddukal-ik zemren ad rnun apṛuksi-a s uḍumm n tengalt QR. </string>
|
||||
<string name="proxy_share_explain">Imeddukal-ik·im zemren ad rnun apṛuksi-a s uḍumm n tengalt QR. </string>
|
||||
<string name="proxy_share_link">Bḍu aseɣwen</string>
|
||||
<string name="proxy_enabled">Apṛuksi yermed</string>
|
||||
<string name="proxy_enabled_hint">Aql-ik-im tesseqdaced apṛuksi. Ma tesɛiḍ ugur deg tuqqna, ɛreḍ apṛuksi-nniḍen.</string>
|
||||
<string name="proxy_enabled_hint">Aql-ik·im tesseqdaced apṛuksi. Ma tesɛiḍ ugur deg tuqqna, ɛreḍ apṛuksi-nniḍen.</string>
|
||||
<!-- "Relay" refers to the relay servers used; please chose a common term in your language, no need to be literal. If in doubt, stay with "Relay" -->
|
||||
<string name="transports">Imsawaḍen</string>
|
||||
<string name="add_transport">Rnu amsiweḍ</string>
|
||||
<string name="remove_transport">Kkes amsiweḍ</string>
|
||||
<string name="edit_transport">Ẓreg amsiweḍ</string>
|
||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||
<string name="confirm_add_transport">Rnu amsiweḍ-agi?</string>
|
||||
<string name="invalid_transport_qr">Tangalt QR ittusemḍen ur tesɛi ara amsiweḍ ameɣtu</string>
|
||||
<!-- placeholder will be replaced by a relay server name -->
|
||||
<string name="confirm_remove_transport">Kkes amsiweḍ \"%1$s\"?\n\nInermisen-ik·im ur zmiren ara ad k·im-id-awḍen ala ma tnermseḍ-ten yakan s umsiweḍ-nniḍen.\n\nMa yella ccekk, kkes amsiweḍ ticki.</string>
|
||||
|
||||
<string name="login_certificate_checks">Asenqed n uselkin</string>
|
||||
<string name="login_error_mail">Ma ulac aɣilif, sekcem tansa imayl tameɣtut</string>
|
||||
<string name="login_error_server">Ma ulac aɣilif, sekcem aqeddac ameɣtu / tansa IP.</string>
|
||||
@@ -658,11 +680,11 @@
|
||||
<!-- for translations, you can also think of "Profile Tag" or "Profile Description" as the source string -->
|
||||
<string name="profile_tag">Tabzimt n umaɣnu</string>
|
||||
<string name="profile_tag_hint">eg. Axeddim, Tawacult</string>
|
||||
<string name="profile_tag_explain">Sbadu tabzimt i d-yettbanen kan i kečč-kemm ; mudd-d afus ad temgirrdeḍ gar imeɣna-ik-im. </string>
|
||||
<string name="profile_tag_explain">Sbadu tabzimt i d-yettbanen kan i kečč·kemm ; mudd-d afus ad temgirrdeḍ gar imeɣna-ik·im. </string>
|
||||
<!-- Menu entry to sort an item to the beginning of a list. Only "To Top" may do as well in some translations, if that helps to stay shorter. -->
|
||||
<string name="move_to_top">Ddu d asawen</string>
|
||||
<string name="delete_account">Kkes amaɣnu</string>
|
||||
<string name="delete_account_ask">Tebɣiḍ ad tekkseḍ isefka n umaɣnu-inek-inem? </string>
|
||||
<string name="delete_account_ask">Tebɣiḍ ad tekkseḍ isefka n umaɣnu-inek·inem? </string>
|
||||
<string name="delete_account_explain_with_name">Akk isefka n umaɣnu n \"%s\" ɣef yibenk-a ad ttwakksen, ula d asebded n uwgelhen seg yixef ɣer yixef, Inermisen, idiwenniyin, iznan akked umidya. Tigawt-a ur tezmir ara ad tuɣal ar deffir.</string>
|
||||
<string name="unconfigured_account">Amaɣnu ur yettwaswel ara</string>
|
||||
<string name="unconfigured_account_hint">Ldi amaɣnu akken ad t-tesweleḍ</string>
|
||||
@@ -685,12 +707,12 @@
|
||||
<!-- preferences -->
|
||||
<string name="pref_using_custom"> Aseqdec asagen: %s</string>
|
||||
<string name="pref_using_default">Aseqdec amezwer: %s</string>
|
||||
<string name="pref_profile_info_headline">Amaɣnu-inek-inem</string>
|
||||
<string name="pref_profile_info_headline">Amaɣnu-inek·inem</string>
|
||||
<string name="pref_profile_photo">Tugna n umaɣnu</string>
|
||||
<string name="pref_blocked_contacts">Inermisen yettusweḥlen</string>
|
||||
<string name="blocked_empty_hint">Inermisen yettusweḥlen ad d-banen dagi. </string>
|
||||
<string name="pref_who_can_see_profile_explain">Tugna-ik-im n umaɣnu, isem-ik-im akked tmeddurt ad ttwaznen akked iznan-ik-im ticki ttemseɣwalent akked iseqdacen-nniḍen.</string>
|
||||
<string name="pref_your_name">Isem-ik-im</string>
|
||||
<string name="pref_who_can_see_profile_explain">Tugna-ik·im n umaɣnu, isem-ik·im akked tmeddurt ad ttwaznen akked iznan-ik·im ticki ttemseɣwalent akked iseqdacen-nniḍen.</string>
|
||||
<string name="pref_your_name">Isem-ik·im</string>
|
||||
<!-- Label of the Bio/Signature/Status/Motto field -->
|
||||
<string name="pref_default_status_label">Tameddurt</string>
|
||||
<string name="pref_enter_sends">Kcem tisura i umazan</string>
|
||||
@@ -705,7 +727,7 @@
|
||||
<string name="pref_screen_security_please_restart_hint">Akken ad tesneseḍ tawila n tɣellist n ugdil, ales asenker n usnas. </string>
|
||||
<string name="pref_notifications">Ilɣa</string>
|
||||
<string name="pref_mention_notifications">Tibdarin</string>
|
||||
<string name="pref_mention_notifications_explain">Deg igrawen igugmen, iznan n telɣut rzuḍ ɣer-k-m, am tririyin neɣ tiririyin n tigawt</string>
|
||||
<string name="pref_mention_notifications_explain">Deg igrawen igugmen, iznan n telɣut rzuḍ ɣer-k·m, am tririyin neɣ tiririyin n tigawt</string>
|
||||
<string name="pref_notifications_show">Sken</string>
|
||||
<string name="pref_notifications_priority">Tazwart</string>
|
||||
<string name="pref_notifications_explain">Rmed ilɣa n unagraw i yiznan imaynuten</string>
|
||||
@@ -742,7 +764,7 @@
|
||||
<string name="pref_other">Wayeḍ</string>
|
||||
<string name="pref_backup">Aḥraz</string>
|
||||
<string name="pref_backup_explain">Aḥraz n idiwenniyen ɣer tkatut tazɣarayt</string>
|
||||
<string name="pref_backup_export_explain">Aḥraz ad ak-d-imudd afus ad tesbeddeḍ asebded amaynut ɣef wagi neɣ ɣef yibenk nniḍen.\n\nAḥraz ad yegber akk iznan, inermisen akked idiwenniyen akked usebded awurman n uwgelhen si tazwara ar tagara. Ḥrez afaylu n uḥrez deg umḍiq aɣelsan neɣ kkes-it s zreb. </string>
|
||||
<string name="pref_backup_export_explain">Aḥraz ad ak·m-d-imudd afus ad tesbeddeḍ asebded amaynut ɣef wagi neɣ ɣef yibenk nniḍen.\n\nAḥraz ad yegber akk iznan, inermisen akked idiwenniyen akked usebded awurman n uwgelhen si tazwara ar tagara. Ḥrez afaylu n uḥrez deg umḍiq aɣelsan neɣ kkes-it s zreb. </string>
|
||||
<string name="pref_backup_export_this">Sifeḍ amaɣnu-agi</string>
|
||||
<!-- the placeholder will be replaced by the number of profiles to export; the number is always larger than 1 -->
|
||||
<string name="pref_backup_export_all">Sifeḍ akk %1$d Imuɣna</string>
|
||||
@@ -752,11 +774,11 @@
|
||||
<string name="pref_background">Tugniwin n ugilal</string>
|
||||
<string name="pref_background_btn_default">Seqdec tugna tamezwert</string>
|
||||
<string name="pref_background_btn_gallery">Fren seg timidelt</string>
|
||||
<string name="pref_imap_folder_warn_disable_defaults">Ma tbeddleḍ aɣewwaṛ-a, senqed aqeddac-ik-im d yimsaɣen-ik-im-nniḍen ad ttuswelen akken iwata.\n\nMa ulac, yezmer lḥal ur tteddunt ara akk tɣawsiwin.</string>
|
||||
<string name="pref_imap_folder_warn_disable_defaults">Ma tbeddleḍ aɣewwaṛ-a, senqed aqeddac-ik·im d yimsaɣen-ik·im-nniḍen ad ttuswelen akken iwata.\n\nMa ulac, yezmer lḥal ur tteddunt ara akk tɣawsiwin.</string>
|
||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||
<string name="pref_multidevice">Askar n tugett n yibenk</string>
|
||||
<string name="pref_multidevice_explain">Mtawi iznan-ik akked ibenkan-nniḍen. Irmed s wudem awurman deg tmerna n yibenk wis sin</string>
|
||||
<string name="pref_multidevice_change_warn">Askar aget-ibenk yessefk ad yettwarmed mi ara tesqedceḍ yiwen n umaɣnu deg ddeqs n yibenkan. Sens kan aɣewwaṛ-agi ma yella tekkseḍ amaɣnu-yagi seg yibenkan-ik-im nniḍen.\n\nAsens n usakar n waget-ibenk mi ara tesqedceḍ amaɣnu ɣef ddeqs n yibenkan ad d-yeglu s yiznan yettwazeglen akked wuguren-nniḍen.</string>
|
||||
<string name="pref_multidevice_explain">Mtawi iznan-ik·im akked ibenkan-nniḍen. Irmed s wudem awurman deg tmerna n yibenk wis sin</string>
|
||||
<string name="pref_multidevice_change_warn">Askar aget-ibenk yessefk ad yettwarmed mi ara tesqedceḍ yiwen n umaɣnu deg ddeqs n yibenkan. Sens kan aɣewwaṛ-agi ma yella tekkseḍ amaɣnu-yagi seg yibenkan-ik·im nniḍen.\n\nAsens n usakar n waget-ibenk mi ara tesqedceḍ amaɣnu ɣef ddeqs n yibenkan ad d-yeglu s yiznan yettwazeglen akked wuguren-nniḍen.</string>
|
||||
<string name="pref_auto_folder_moves">Ddu s wudem awurman ɣer ukaram n DeltaChat</string>
|
||||
<string name="pref_only_fetch_mvbox_title">Awi-d kan seg akaram n DeltaChat</string>
|
||||
<string name="pref_show_emails">Sken imaylen iklasanen</string>
|
||||
@@ -764,6 +786,7 @@
|
||||
<string name="pref_show_emails_accepted_contacts">I yinermisen yettwaqeblen</string>
|
||||
<string name="pref_show_emails_all">Akk</string>
|
||||
<string name="pref_experimental_features">Timahilin tirmitanin</string>
|
||||
<string name="pref_experimental_features_explain">Timahilin-agi zemrent ad ilint ur rkident ara, daɣen zemrent ad ttwabeddlent neɣ ad ttwakksent</string>
|
||||
<string name="pref_on_demand_location_streaming">Seddu asuddem deg wadig s usuter</string>
|
||||
<string name="pref_background_default">Tugna tamezwert</string>
|
||||
<string name="pref_background_default_color">Ini amezwer</string>
|
||||
@@ -782,13 +805,21 @@
|
||||
<string name="download_max_available_until">Sader-d afellay i yellan alamma d %1$s</string>
|
||||
<string name="select_profile">Fren amaɣnu</string>
|
||||
<string name="profile_image_select">Fren tugna n umaɣnu</string>
|
||||
<string name="select_your_new_profile_image">Fren tugna-ik-im tamaynut n umaɣnu</string>
|
||||
<string name="select_your_new_profile_image">Fren tugna-ik·im tamaynut n umaɣnu</string>
|
||||
<string name="profile_image_delete">Kkes tugna n umaɣnu</string>
|
||||
<string name="pref_show_tray_icon">Sken Tignit n ufaggag n waddad</string>
|
||||
<string name="pref_edit_profile">Ẓreg amaɣnu</string>
|
||||
<string name="disable_imap_idle">Sens IMAP IDLE</string>
|
||||
<string name="disable_imap_idle_explain">Ur seqdac ara asiɣzef IMAP IDLE xas yella uqeddac isefrak-it. Asireg uɣewwaṛ-agi ad yerr izen iɛeṭṭel akken ad d-yuɣal, rmed-it kan i usekyed. </string>
|
||||
<string name="send_stats_to_devs">Azen tidaddanin i yineflayen n DeltaChat</string>
|
||||
<string name="stats_device_message">Tebɣiḍ ad tεawneḍ deg usnerni n Delta Chat u ad tεawneḍ anadi s tuzna n tesnaddadin n useqdec udrigen?\n\n👉 Tekki da... 👈</string>
|
||||
<string name="stats_confirmation_dialog">Tebɣiḍ ad tεawneḍ deg usnerni n Delta Chat u ad tεawneḍ anadi s tuzna n tesnaddadin n useqdec udrigen?</string>
|
||||
<string name="stats_thanks">Tanemmirt! Tzemreḍ dima ad tessenseḍ tuzna deg \"Iɣewwaṛen -> Talqayt\".\n\nƔur-k·m ugar n 5 n tesdatin akken ad ttekkiḍ deg yiwet n tezrawt tussnant ɣef tɣellist n Delta Chat?</string>
|
||||
<string name="stats_disable_dialog">Tuzzna n tdaddanin termed yakan.\n\nTebɣiḍ ad t-tessexsiḍ?</string>
|
||||
<string name="disable">Sens</string>
|
||||
<string name="stats_keep_sending">Eǧǧ tuzna</string>
|
||||
<string name="stats_msg_body">Afaylu amedday yegber tiddadanin tudrigin, i ɣ-iεawnen ad nesnerni Delta Chat. Wali https://delta.chat/help#statssending i wugar n telɣut. Tanemmirt-ik·im!</string>
|
||||
|
||||
<!-- Emoji picker and categories -->
|
||||
<string name="emoji_search_results">Igmaḍ n unadi</string>
|
||||
<string name="emoji_not_found">Ulac imujit</string>
|
||||
@@ -853,6 +884,8 @@
|
||||
<string name="remove_member_by_you">Tekkseḍ aɛeggal %1$s</string>
|
||||
<!-- %1$s will be replaced by name of the contact removed from the group, %2$s will be replaced by name of the contact who did the action -->
|
||||
<string name="remove_member_by_other">Aɛeggal %1$s yettwakkes sɣur %2$s.</string>
|
||||
<!-- %1$s will be replaced by name of the contact removed from the group; this string is used when it's unclear who did the action -->
|
||||
<string name="member_x_removed">Aεeggal %1$s yettwakkes.</string>
|
||||
<!-- "left" in the meaning of "exited". -->
|
||||
<string name="group_left_by_you">Teffɣeḍ seg ugraw.</string>
|
||||
<!-- "left" in the meaning of "exited". -->
|
||||
@@ -907,15 +940,17 @@
|
||||
<string name="ephemeral_timer_weeks_by_other">Amkud n yiznan ur nettdum ara yettwasbed ar %1$s n yimalas sɣur %2$s.</string>
|
||||
<string name="chat_unencrypted_explanation">Iznan deg udiwenni-a sseqdacen imayl aklasiki, ur ttwawgelhen ara seg yixef ɣer yixef.</string>
|
||||
<string name="chat_protection_enabled_tap_to_learn_more">Iznan ttwawgelhen seg yixef ɣer yixef. Sit akken ad tissineḍ ugar.</string>
|
||||
<string name="chat_protection_enabled_explanation">Iznan akk yellan deg udiwenni-a ttwawgelhen seg yixef ɣer yixef.\n\nAwgelhen n yixef ɣer yixef yettaǧǧa iznan d usligen gar-ak-am d yecriken n udiwenni. Ula d iqeddacen, isaǧǧawen neɣ isawaḍen ur zemren ad ten-ɣren.</string>
|
||||
<string name="chat_protection_enabled_explanation">Iznan akk yellan deg udiwenni-a ttwawgelhen seg yixef ɣer yixef.\n\nAwgelhen n yixef ɣer yixef yettaǧǧa iznan d usligen gar-ak·am d yecriken n udiwenni. Ula d iqeddacen, isaǧǧawen neɣ imsawaḍen ur zemren ad ten-ɣren.</string>
|
||||
<string name="invalid_unencrypted_tap_to_learn_more">⚠️%1$s Yesra awgelhen n yixef ɣer yixef ur nelli ara yakan i udiwenni-a. Sit akken ad tissineḍ ugar.</string>
|
||||
<string name="invalid_unencrypted_explanation">Akken ad tesbeddeḍ awgelhen n yixef ɣer yixef, tzemreḍ ad temlileḍ inermisen s timmad-nsen u ad ḍummeḍ tangalt-nsen QR akken ad ten-id-tesmendeḍ.</string>
|
||||
<string name="learn_more">Issin ugar</string>
|
||||
|
||||
<string name="devicemsg_self_deleted">Tekkseḍ adiwenni n \" iznan yettwakelsen \".\n\nℹ️ Akken ad tesqedceḍ tamahilt \" iznan yettwakelsen \", rnu adiwenni amaynut akked yiman-ik-im. </string>
|
||||
<string name="devicemsg_self_deleted">Tekkseḍ adiwenni n \" iznan yettwakelsen \".\n\nℹ️ Akken ad tesqedceḍ tamahilt \" iznan yettwakelsen \", rnu adiwenni amaynut akked yiman-ik·im. </string>
|
||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
||||
<string name="devicemsg_storage_exceeding">⚠️Asaǧǧaw-ik·im n usekles qrib ad yaččar: %1$s%% yettwaseqdec yakan.\n\nAhat ur tezmireḍ ara ad d-remseḍ iznan ma yella asekles yeččur.\n\n 👉 Ttxil-k·m senqed ma yella tzemreḍ ad tekkseḍ isefka iqburen deg ugrudem n web n isaǧǧawen syin rmed \"Iɣewwaṛen / Idiwenniyen / Kkes iznan iqbuṛen\". Tzemreḍ ad tesneqdeḍ aseqdec n usekles-inek·inem amiran deg \"Iɣewwaṛen / tuqqna\".</string>
|
||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||
<string name="devicemsg_bad_time">⚠️ Azemz neɣ akud deg yibenk-ik-im yettban-d ur iṣeḥḥa ara (%1$s).\n\nṢeggem tamasragt-nnek ⏰🔧Akken ad neḍmen d akken iznan-ik-im ad ttwaremsen akken iwata. </string>
|
||||
<string name="devicemsg_update_reminder">⚠️Yezmer lḥal alqem-ik-im n Delta Chat d aqbur.\n\nAya yezmer ad d-yeglu s wuguren acku imendiden-ik-im n udiwenni sseqdacen ileqman imaynuten - yerna txuṣṣeḍ timahilin tineggura 😳\nTtxil-k-m, ssefqed https://get.delta.chat neɣ taḥanut-nnek-nnem n usnas i uleqqem.</string>
|
||||
<string name="devicemsg_bad_time">⚠️ Azemz neɣ akud deg yibenk-ik·im yettban-d ur iṣeḥḥa ara (%1$s).\n\nṢeggem tamasragt-ik·im ⏰🔧Akken ad neḍmen d akken iznan-ik·im ad ttwaremsen akken iwata. </string>
|
||||
<string name="devicemsg_update_reminder">⚠️Yezmer lḥal alqem-ik·im n Delta Chat d aqbur.\n\nAya yezmer ad d-yeglu s wuguren acku imendiden-ik·im n udiwenni sseqdacen ileqman imaynuten - yerna txuṣṣeḍ timahilin tineggura 😳\nTtxil-k·m, ssefqed https://get.delta.chat neɣ taḥanut-nnek·nnem n usnas i uleqqem.</string>
|
||||
|
||||
<!-- Some options as "Add Second Device" or "Backup" may require the system PIN/Fingerprint/Gesture/Etc. to be entered in a system dialog. This hint is added to the system dialog, below a title as "Add Second Device" or "Backup". -->
|
||||
<string name="enter_system_secret_to_continue">Kkes assekeṛ akken ad tkemmleḍ</string>
|
||||
@@ -924,7 +959,7 @@
|
||||
<string name="qr_code">Tangalt QR</string>
|
||||
<string name="load_qr_code_as_image">Sali tangalt QR am tugna</string>
|
||||
<string name="qrscan_title">Ḍumm Tangalt QR</string>
|
||||
<string name="qrscan_hint">Ṭṭef takamra-nnek-nnem nnig n tangalt QR</string>
|
||||
<string name="qrscan_hint">Ṭṭef takamra-nnek·nnem nnig n tangalt QR</string>
|
||||
<string name="qrscan_hint_desktop">Awi tangalt QR ɣer tkamiṛat</string>
|
||||
<string name="qrscan_failed">Tangalt QR ur tezmir ara ad ttwakestengel</string>
|
||||
<string name="qrscan_ask_join_group">Tebɣiḍ ad tettekkiḍ deg ugraw \"%1$s\"?</string>
|
||||
@@ -934,7 +969,7 @@
|
||||
<string name="qrscan_contains_text">Aḍris n tengalt QR yettwaḍummen:\n\n%1$s</string>
|
||||
<string name="qrscan_contains_url">URL n tangalt QR yettwaḍummen:\n\n%1$s</string>
|
||||
<string name="qrscan_fingerprint_label">Adsil umḍin</string>
|
||||
<string name="withdraw_verifycontact_explain">Tangalt-a QR tezmer ad tt-id-ḍummen wiyaḍ akken ad k-id-nermsen.\n\nTzemreḍ ad talseḍ awennez, akken tangalt QR yellan neɣ aseɣwen n uεraḍ ur iteddu ara.</string>
|
||||
<string name="withdraw_verifycontact_explain">Tangalt-a QR tezmer ad tt-id-ḍummen wiyaḍ akken ad k·m-id-nermsen.\n\nTzemreḍ ad talseḍ awennez, akken tangalt QR yellan neɣ aseɣwen n uεraḍ ur iteddu ara.</string>
|
||||
<string name="withdraw_verifygroup_explain">Tangalt-a QR tezmer ad tt-id-ḍummen wiyaḍ akken ad kecmen ɣer ugraw \"%1$s\".\n\nTzemreḍ ad talseḍ awennez, akken tangalt QR yellan neɣ aseɣwen n uεraḍ ur iteddu ara.</string>
|
||||
<string name="withdraw_joinbroadcast_explain">Tangalt-a QR tezmer ad tt-id-ḍummen wiyaḍ akken ad ddun ɣer ubadu \"%1$s\".\n\nTzemreḍ ad talseḍ awennez, akken tangalt QR yellan neɣ aseɣwen n uεraḍ ur iteddu ara.</string>
|
||||
<string name="withdraw_qr_code">Ales Awennez n Tangalt QR</string>
|
||||
@@ -953,16 +988,18 @@
|
||||
<string name="qrshow_join_contact_hint">Ḍumm iwakken ad tmeslayeḍ d %1$s</string>
|
||||
<string name="qrshow_join_contact_no_connection_toast">Ulac tuqqna internet, ur izmir ara ad isebded tangalt QR.</string>
|
||||
<string name="qraccount_ask_create_and_login">Rnu amaɣnu amaynut di \"%1$s\" sakin tkecmeḍ dinna?</string>
|
||||
<string name="set_name_and_avatar_explain">Sbadu isem ara ɛeqlen inermisen-ik. Tzemreḍ daɣen ad tesbaduḍ tugna n umaɣnu.</string>
|
||||
<string name="set_name_and_avatar_explain">Sbadu isem ara ɛeqlen inermisen-ik·im. Tzemreḍ daɣen ad tesbaduḍ tugna n umaɣnu.</string>
|
||||
<string name="please_enter_name">Ma ulac aɣilif, sekcem isem.</string>
|
||||
<string name="qraccount_qr_code_cannot_be_used">Tangalt QR tettwaḍummen ur tezmir ara ad tettwaseqdec i usebded n umaɣnu amaynut. </string>
|
||||
<!-- the placeholder will be replaced by the address of the profile -->
|
||||
<string name="qrlogin_ask_login">Kcem ɣer \"%1$s\"?</string>
|
||||
<!-- first placeholder will be replaced by name of the inviter, second placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_started">%1$s yeɛreḍ-ik-im-id ad d-ternud ɣer ugraw-a.\n\nRǧu ibenk n %2$s ad d-yerr...</string>
|
||||
<string name="secure_join_started">%1$s yeɛreḍ-ik·im-id ad d-ternud ɣer ugraw-a.\n\nRǧu ibenk n %2$s ad d-yerr...</string>
|
||||
<!-- first placeholder will be replaced by name of the inviter, second placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_channel_started">%1$s inced-ik·m-id ad tkecmeḍ ɣer ubadu-a.\n\nAṛǧu n yibenk n %2$s akken ad d-yerr tiririt...</string>
|
||||
<!-- placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_replies">%1$s yerra-d, rǧu i tmerna-as ɣer ugraw...</string>
|
||||
<string name="secure_join_wait">Asbeddi n tuqqna, ttxil-k-m rǧu...</string>
|
||||
<string name="secure_join_wait">Asbeddi n tuqqna, ttxil-k·m rǧu...</string>
|
||||
<string name="contact_verified">%1$s ittwasenked.</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Yettwasenked sɣur %1$s</string>
|
||||
@@ -1091,7 +1128,7 @@
|
||||
<string name="open_settings">Ldi iɣewwaṛen</string>
|
||||
<!-- iOS device contact alert -->
|
||||
<string name="import_device_contacts">Kter inermisen n yibenk</string>
|
||||
<string name="import_device_contacts_hint">Iwakken ad tmeslayeḍ akked inermisen seg yibenk-ik-im, ldi Iɣewwaṛen sakkin rmed \"Iinermisen\".</string>
|
||||
<string name="import_device_contacts_hint">Iwakken ad tmeslayeḍ akked inermisen seg yibenk-ik·im, ldi Iɣewwaṛen sakkin rmed \"Iinermisen\".</string>
|
||||
<!-- iOS notification settings -->
|
||||
<string name="disabled_in_dc">Ittwasens deg Delta Chat</string>
|
||||
<string name="disabled_in_system_settings">Ittwasens deg iɣewwaren n unagraw</string>
|
||||
@@ -1112,26 +1149,26 @@
|
||||
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
|
||||
<string name="add_to_widget">Rnu ɣer uwiǧet</string>
|
||||
<!-- iOS permissions, copy from "deltachat-ios/Info.plist", which is used on missing translations in "deltachat-ios/LANG.lproj/InfoPlist.strings" -->
|
||||
<string name="InfoPlist_NSCameraUsageDescription">Delta Chat yesseqdac takamrat-ik-im akken ad d-yeṭṭfeḍ tiwlafin d tvidyutin yerna ad i uḍummu tingalin QR.</string>
|
||||
<string name="InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription">Delta Chat isra ad tebḍuḍ ideg-inek-inem ɣef wakud i tesremdeḍ ad tebḍuḍ ideg.</string>
|
||||
<string name="InfoPlist_NSLocationWhenInUseUsageDescription">Delta Chat yesra tasiregt akken ad yebḍu adig-inek-inem deg wakud i tremdeḍ buṭṭu n wadig.</string>
|
||||
<string name="InfoPlist_NSCameraUsageDescription">Delta Chat yesseqdac takamrat-ik·im akken ad d-yeṭṭfeḍ tiwlafin d tvidyutin yerna ad i uḍummu tingalin QR.</string>
|
||||
<string name="InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription">Delta Chat isra ad tebḍuḍ ideg-inek·inem ɣef wakud i tesremdeḍ ad tebḍuḍ ideg.</string>
|
||||
<string name="InfoPlist_NSLocationWhenInUseUsageDescription">Delta Chat yesra tasiregt akken ad yebḍu adig-inek·inem deg wakud i tremdeḍ buṭṭu n wadig.</string>
|
||||
<string name="InfoPlist_NSMicrophoneUsageDescription">Delta Chat yesseqdac amikrufun-ik·im i usekles d tuzna n yiznan n taɣect akked d tvidyutin s imesli.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryUsageDescription">Delta Chat ad k-yeǧǧ ad tferneḍ anwa tiwlafin seg temkarḍit-ik-im ara tazneḍ.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryAddUsageDescription">Delta Chat yebɣa ad yessekles tugniwin ɣer temkarḍit-ik-im n tewlafin.</string>
|
||||
<string name="InfoPlist_NSFaceIDUsageDescription">Delta cat yezmer ad iseqdec ID n wudem i ummesten n umaɣnu-ik-im adigan, asnulfu n uḥraz akked usebded n yibenk wis sin.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryUsageDescription">Delta Chat ad k-yeǧǧ ad tferneḍ anwa tiwlafin seg temkarḍit-ik·im ara tazneḍ.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryAddUsageDescription">Delta Chat yebɣa ad yessekles tugniwin ɣer temkarḍit-ik·im n tewlafin.</string>
|
||||
<string name="InfoPlist_NSFaceIDUsageDescription">Delta cat yezmer ad iseqdec ID n wudem i ummesten n umaɣnu-ik·im adigan, asnulfu n uḥraz akked usebded n yibenk wis sin.</string>
|
||||
|
||||
<!-- android specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||
<string name="pref_instant_delivery">asiweḍ dindin</string>
|
||||
<string name="pref_background_notifications">Seqdec tuqqna n ugilal</string>
|
||||
<string name="pref_background_notifications_explain">Yesra ad yettwazgel useggem n tbatrit, seqdec ma yella ilɣa ur d-ttawḍen ara di lawan. </string>
|
||||
<string name="pref_background_notifications_explain">Yesra ad yettwazgel useggem n udɣaɣ, seqdec ma yella ilɣa ur d-ttawḍen ara di lawan. </string>
|
||||
<string name="pref_reliable_service">Ḥettem tuqqna n ugilal</string>
|
||||
<string name="pref_reliable_service_explain">ad d-yeglu s telɣut timezgit</string>
|
||||
|
||||
<string name="pref_background_notifications_rationale">Akken ad tḥerzeḍ tuqqna daɣen ad d-remseḍ iznan deg ugilal, zgel aseggem n tbatrit deg usurif ay d-itteddun.\n\nDelṭa Chat yesseqdac kra n teɣbula udiɣ ur ttḥewwil ara akken ad yečč aṭas deg tbatrit.</string>
|
||||
<string name="pref_background_notifications_rationale">Akken ad tḥerzeḍ tuqqna daɣen ad d-remseḍ iznan deg ugilal, zgel aseggem n tbatrit deg usurif ay d-itteddun.\n\nDelṭa Chat yesseqdac kra n teɣbula udiɣ ur ttḥewwil ara akken ad yečč aṭas deg udɣaɣ-ik.im.</string>
|
||||
<!-- disabling "Reliable service" will hide a the maybe annoying permanent-notification with the drawback that new-message-notifications get potentially unreliable -->
|
||||
<string name="perm_enable_bg_reminder_title">Sit dagi akken ad tremseḍ iznan ticki Delta Chat yella deg ugilal.</string>
|
||||
<string name="perm_enable_bg_already_done">Tsirgeḍ yakan Delta Chat i wakken ad d-remseḍ iznan deg ugilal.\n\nMa yella iznan ur d-ttawḍen ara deg ugilal, ttxil-k-m senqed daɣen iɣewwaṛen n unagraw.</string>
|
||||
<string name="perm_enable_bg_already_done">Tsirgeḍ yakan Delta Chat i wakken ad d-remseḍ iznan deg ugilal.\n\nMa yella iznan ur d-ttawḍen ara deg ugilal, ttxil-k·m senqed daɣen iɣewwaṛen n unagraw.</string>
|
||||
|
||||
<!-- device messages for updates -->
|
||||
<string name="update_2_0">D acu i d amaynut?\n\n💯Awgelhen n yixef ɣer yixef d ayen iɣef ara tettekleḍ u i lebda. Inekcaman 🔒 ruḥen!\n\n✉️ Imayl aklasik war awgelhen yettwacreḍ s usekkil azamulan.\n\n 😻 Agdil amaynut yettwasneflin n umaɣnu i akk inermisen-ik-im\n\n🔲 Taqeffalt tamaynutt i unekcum uzrib ɣer yisnasen yettwasqedcen deg udiwenni usrid\n\n❤️ Ma ulac aɣilif mudd-aɣ-d afus akken ad neqqim d imunanen, daɣen ad nkemmel ad d-nawi asnerni: %1$s</string>
|
||||
<string name="update_2_0">D acu i d amaynut?\n\n💯Awgelhen n yixef ɣer yixef d ayen iɣef ara tettekleḍ u i lebda. Inekcaman 🔒 ruḥen!\n\n✉️ Imayl aklasik war awgelhen yettwacreḍ s usekkil azamulan.\n\n 😻 Agdil amaynut yettwasneflin n umaɣnu i akk inermisen-ik·im\n\n🔲 Taqeffalt tamaynutt i unekcum uzrib ɣer yisnasen yettwasqedcen deg udiwenni usrid\n\n❤️ Ma ulac aɣilif mudd-aɣ-d afus akken ad neqqim d imunanen, daɣen ad nkemmel ad d-nawi asnerni: %1$s</string>
|
||||
</resources>
|
||||
|
||||
@@ -1002,6 +1002,7 @@
|
||||
<string name="secure_join_replies">%1$s heeft geantwoord en wacht op toelating tot de groep…</string>
|
||||
<string name="secure_join_wait">Bezig met opzetten van eind-tot-eindversleuteling…</string>
|
||||
<string name="contact_verified">%1$s is goedgekeurd.</string>
|
||||
<string name="contact_blocked">Je hebt deze contactpersoon geblokkeerd</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Geïntroduceerd door %1$s</string>
|
||||
<string name="verified_by_you">Geïntroduceerd door mij</string>
|
||||
|
||||
@@ -364,7 +364,7 @@
|
||||
<string name="device_talk">Komunikaty urządzenia</string>
|
||||
<string name="device_talk_subtitle">Wiadomości generowane lokalnie</string>
|
||||
<string name="device_talk_explain">Wiadomości w tym czacie są generowane lokalnie przez twoją aplikację Delta Chat. Twórcy używają go do informowania o aktualizacjach aplikacji i problemach podczas użytkowania.</string>
|
||||
<string name="device_talk_welcome_message2">Skontaktuj się!\n\n🙌 Dotknij „Kod QR” na ekranie głównym obu urządzeń. Wybierz opcję „Zeskanuj kod QR” na jednym urządzeniu i skieruj go na drugie\n\n🌍 Jeśli nie znajdujesz się w tym samym pomieszczeniu, zeskanuj kod podczas rozmowy wideo lub udostępnij link z zaproszeniem w sekcji „Zeskanuj kod QR”\n\nNastępnie: korzystaj z komunikatora za pośrednictwem największej zdecentralizowanej sieci, jaka kiedykolwiek istniała: e-mail. W przeciwieństwie do innych popularnych aplikacji bez centralnej kontroli, śledzenia lub sprzedawania Ciebie, znajomych, współpracowników lub rodziny dużym organizacjom.</string>
|
||||
<string name="device_talk_welcome_message2">Skontaktuj się!\n\n🙌 Dotknij „Kod QR” na ekranie głównym obu urządzeń. Wybierz opcję „Zeskanuj kod QR” na jednym urządzeniu i skieruj go na drugie\n\n🌍 Jeśli nie znajdujesz się w tym samym pomieszczeniu, zeskanuj kod podczas rozmowy wideo lub udostępnij link z zaproszeniem w sekcji „Zeskanuj kod QR”\n\nNastępnie: korzystaj ze zdecentralizowanego komunikatora. W przeciwieństwie do innych popularnych aplikacji bez centralnej kontroli, śledzenia lub sprzedawania Ciebie, znajomych, współpracowników lub rodziny dużym organizacjom.</string>
|
||||
<string name="edit_contact">Edytuj kontakt</string>
|
||||
<!-- Verb "to pin", making something sticky, not a noun or abbreviation for "pin number". -->
|
||||
<string name="pin_chat">Przypnij czat</string>
|
||||
@@ -420,26 +420,26 @@
|
||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||
<string name="ask_leave_group">Na pewno chcesz opuścić?</string>
|
||||
<plurals name="ask_delete_chat">
|
||||
<item quantity="one">Usunąć %d czat ze wszystkich urządzeń?</item>
|
||||
<item quantity="few">Usunąć %d czaty ze wszystkich urządzeń?</item>
|
||||
<item quantity="many">Usunąć %d czatów ze wszystkich urządzeń?</item>
|
||||
<item quantity="other">Usunąć %d czatu ze wszystkich urządzeń?</item>
|
||||
<item quantity="one">Usunąć %d czat?</item>
|
||||
<item quantity="few">Usunąć %d czaty?</item>
|
||||
<item quantity="many">Usunąć %d czatów?</item>
|
||||
<item quantity="other">Usunąć %d czatu?</item>
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Usunąć czat „%1$s” ze wszystkich urządzeń?</string>
|
||||
<string name="ask_delete_message">Usunąć tę wiadomość ze wszystkich urządzeń?</string>
|
||||
<string name="ask_delete_named_chat">Usunąć czat „%1$s”?</string>
|
||||
<string name="ask_delete_message">Usunąć tę wiadomość?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">Usunąć %d wiadomość ze wszystkich urządzeń?</item>
|
||||
<item quantity="few">Usunąć %d wiadomości ze wszystkich urządzeń?</item>
|
||||
<item quantity="many">Usunąć %d wiadomości ze wszystkich urządzeń?</item>
|
||||
<item quantity="other">Usunąć %d wiadomości ze wszystkich urządzeń?</item>
|
||||
<item quantity="one">Usunąć %d wiadomość?</item>
|
||||
<item quantity="few">Usunąć %d wiadomości?</item>
|
||||
<item quantity="many">Usunąć %d wiadomości?</item>
|
||||
<item quantity="other">Usunąć %d wiadomości?</item>
|
||||
</plurals>
|
||||
<string name="ask_forward">Przekazać wiadomości do użytkownika %1$s?</string>
|
||||
<string name="ask_forward_multiple">Przekazać wiadomości do %1$d czatów?</string>
|
||||
<string name="ask_export_attachment">Eksportować załącznik? Eksportowanie załączników umożliwi dostęp do nich wszystkim aplikacjom na urządzeniu.\n\nKontynuować?</string>
|
||||
<string name="ask_block_contact">Zablokować ten kontakt? Nie będziesz już odbierać wiadomości od tego kontaktu.</string>
|
||||
<string name="ask_unblock_contact">Odblokować ten kontakt? Ponownie będzie można odbierać wiadomości od tego kontaktu.</string>
|
||||
<string name="ask_delete_contacts">Usunąć kontakty? Spowoduje to trwałe usunięcie wybranych kontaktów.\n\nKontaktów z trwającymi rozmowami i kontaktów z książki adresowej systemu nie można trwale usunąć.</string>
|
||||
<string name="ask_delete_contact">Usunąć trwale kontakt %1$s?\n\nKontaktów z trwającymi czatami i kontaktów z książki adresowej systemu nie można trwale usunąć.</string>
|
||||
<string name="ask_delete_contacts">Usunąć kontakty?\n\nKontaktów z trwającymi rozmowami nie można trwale usunąć.</string>
|
||||
<string name="ask_delete_contact">Usunąć kontakt %1$s?\n\nKontaktów z trwającymi czatami nie można trwale usunąć.</string>
|
||||
<string name="ask_start_chat_with">Rozpocząć czat z %1$s?</string>
|
||||
<!-- %1$s is replaced by a comma-separated list of names -->
|
||||
<string name="ask_remove_members">Usunąć %1$s z grupy?</string>
|
||||
@@ -593,7 +593,7 @@
|
||||
<!-- Shown inside a "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the profile name eg. "Scan to set up second device for Alice" -->
|
||||
<string name="multidevice_qr_subtitle">Zeskanuj, aby skonfigurować kolejne urządzenie dla %1$s</string>
|
||||
<string name="multidevice_receiver_title">Dodaj jako kolejne urządzenie</string>
|
||||
<string name="multidevice_open_settings_on_other_device">Na pierwszym urządzeniu przejdź do „Ustawienia » Dodaj kolejne urządzenie” i zeskanuj wyświetlony tam kod</string>
|
||||
<string name="multidevice_open_settings_on_other_device">Na pierwszym urządzeniu uruchom Delta Chat, przejdź do „Ustawienia » Dodaj kolejne urządzenie” i zeskanuj wyświetlony tam kod</string>
|
||||
<string name="multidevice_receiver_scanning_ask">Skopiować konto z innego urządzenia na to urządzenie?</string>
|
||||
<string name="multidevice_receiver_needs_update">Profil, który chcesz zaimportować, pochodzi z nowszej wersji aplikacji Delta Chat.\n\nAby kontynuować konfigurowanie drugiego urządzenia, zaktualizuj to urządzenie do najnowszej wersji aplikacji Delta Chat.</string>
|
||||
<string name="multidevice_abort">Przerwać konfigurowanie kolejnego urządzenia?</string>
|
||||
@@ -636,7 +636,7 @@
|
||||
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
|
||||
<string name="onboarding_alternative_logins">Mam już profil</string>
|
||||
<!-- This is a button and a title, allowing to use existing, classic email, setting ports, passwords and so on -->
|
||||
<string name="manual_account_setup_option">Transport przez klasyczny e-mail</string>
|
||||
<string name="manual_account_setup_option">Użyj klasycznego e-maila jako przekaźnika</string>
|
||||
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
|
||||
<string name="instant_onboarding_title">Twój profil</string>
|
||||
<!-- The placeholder will be replaced by the default onboarding server -->
|
||||
@@ -653,14 +653,14 @@
|
||||
<!-- Hint about what happens when "Create Profile" button in pressed; the placeholder will be replaced by contact name -->
|
||||
<string name="instant_onboarding_contact_info">Tworzy profil, aby rozmawiać z „%1$s”.</string>
|
||||
<!-- Question shown when another user's QR code is scanned from onboarding screen -->
|
||||
<string name="instant_onboarding_confirm_contact">Chcesz utworzyć nowy profil i rozpocząć rozmowę z %1$s?</string>
|
||||
<string name="instant_onboarding_confirm_contact">Utworzyć nowy profil i rozpocząć rozmowę z %1$s?</string>
|
||||
<!-- Question shown when group's/channel's QR code is scanned from onboarding screen -->
|
||||
<string name="instant_onboarding_confirm_group">Chcesz utworzyć nowy profil i dołączyć do grupy „%1$s”?</string>
|
||||
<string name="instant_onboarding_confirm_group">Utworzyć nowy profil i dołączyć do grupy „%1$s”?</string>
|
||||
|
||||
<string name="welcome_chat_over_email">Bezpieczny zdecentralizowany czat</string>
|
||||
<string name="scan_invitation_code">Zeskanuj kod zaproszenia</string>
|
||||
<string name="login_title">Zaloguj się</string>
|
||||
<string name="login_advanced_hint">To logowanie jest przeznaczone dla zaawansowanych użytkowników:\n\n• Nie używaj konta, z którego korzystasz w innej aplikacji.\n\n• Klasyczny serwer pocztowy umożliwia rozmowy bez szyfrowania end-to-end, oznaczone ikoną poczty.</string>
|
||||
<string name="login_advanced_hint">To logowanie jest przeznaczone dla zaawansowanych użytkowników:\n\n• Nie używaj adresu, z którego korzystasz w innej aplikacji.\n\n• Klasyczny serwer pocztowy umożliwia rozmowy bez szyfrowania end-to-end, oznaczone ikoną poczty.</string>
|
||||
<string name="login_inbox">Skrzynka odbiorcza</string>
|
||||
<string name="login_imap_login">Nazwa użytkownika IMAP</string>
|
||||
<string name="login_imap_server">Serwer IMAP</string>
|
||||
@@ -688,15 +688,15 @@
|
||||
<string name="proxy_enabled">Włączone proxy</string>
|
||||
<string name="proxy_enabled_hint">Używasz serwera proxy. Jeśli masz problemy z połączeniem, spróbuj użyć innego serwera proxy.</string>
|
||||
<!-- "Relay" refers to the relay servers used; please chose a common term in your language, no need to be literal. If in doubt, stay with "Relay" -->
|
||||
<string name="transports">Serwery transportowe</string>
|
||||
<string name="add_transport">Dodaj serwer transportowy</string>
|
||||
<string name="remove_transport">Usuń serwer transportowy</string>
|
||||
<string name="edit_transport">Edytuj serwer transportowy</string>
|
||||
<string name="transports">Serwery przekaźnikowe</string>
|
||||
<string name="add_transport">Dodaj serwer przekaźnikowy</string>
|
||||
<string name="remove_transport">Usuń serwer przekaźnikowy</string>
|
||||
<string name="edit_transport">Edytuj serwer przekaźnikowy</string>
|
||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||
<string name="confirm_add_transport">Dodać ten serwer transportowy?</string>
|
||||
<string name="invalid_transport_qr">Zeskanowany kod QR zawiera nieprawidłowy serwer transportowy.</string>
|
||||
<string name="confirm_add_transport">Dodać ten serwer przekaźnikowy?</string>
|
||||
<string name="invalid_transport_qr">Zeskanowany kod QR zawiera nieprawidłowy serwer przekaźnikowy.</string>
|
||||
<!-- placeholder will be replaced by a relay server name -->
|
||||
<string name="confirm_remove_transport">Usunąć serwer transportowy „%1$s”?\n\nTwoje kontakty mogą się z tobą skontaktować tylko wtedy, gdy kontaktowałeś się z nimi wcześniej za pośrednictwem innego serwera transportowego.\n\nW razie wątpliwości usuń ten serwer transportowy.</string>
|
||||
<string name="confirm_remove_transport">Usunąć serwer przekaźnikowy „%1$s”?\n\nTwoje kontakty mogą się z tobą skontaktować tylko wtedy, gdy kontaktowałeś się z nimi wcześniej za pośrednictwem innego serwera przekaźnikowego.\n\nW razie wątpliwości usuń ten serwer przekaźnikowy.</string>
|
||||
|
||||
<string name="login_certificate_checks">Sprawdzanie certyfikatów</string>
|
||||
<string name="login_error_mail">Podaj ważny adres e-mail</string>
|
||||
@@ -821,6 +821,7 @@
|
||||
<string name="pref_show_emails_accepted_contacts">Dla zaakceptowanych kontaktów</string>
|
||||
<string name="pref_show_emails_all">Wszystkie</string>
|
||||
<string name="pref_experimental_features">Funkcje eksperymentalne</string>
|
||||
<string name="pref_experimental_features_explain">Te funkcje mogą być niestabilne i mogą zostać zmienione lub usunięte</string>
|
||||
<string name="pref_on_demand_location_streaming">Przesyłanie strumieniowe lokalizacji na żądanie</string>
|
||||
<string name="pref_background_default">Domyślne tło</string>
|
||||
<string name="pref_background_default_color">Domyślny kolor</string>
|
||||
@@ -846,6 +847,14 @@
|
||||
<string name="disable_imap_idle">Wyłącz IMAP IDLE</string>
|
||||
<string name="disable_imap_idle_explain">Nie używaj rozszerzenia IMAP IDLE, nawet jeśli serwer je obsługuje. Włączenie tej opcji opóźni pobieranie wiadomości, włącz ją tylko na testy.</string>
|
||||
<string name="send_stats_to_devs">Wyślij statystyki do programistów Delta Chat</string>
|
||||
<string name="stats_device_message">Chcesz pomóc w ulepszeniu Delta Chat i wesprzeć badania, wysyłając co tydzień anonimowe statystyki użytkowania?\n\n👉 Kliknij tutaj… 👈</string>
|
||||
<string name="stats_confirmation_dialog">Chcesz pomóc w ulepszeniu Delta Chat i wesprzeć badania, wysyłając co tydzień anonimowe statystyki użytkowania?</string>
|
||||
<string name="stats_thanks">Dziękujemy! Zawsze możesz wyłączyć wysyłanie w „Ustawienia » Zaawansowane”.\n\nCzy masz dodatkowo 5 minut na udział w badaniu naukowym dotyczącym bezpieczeństwa Delta Chat?</string>
|
||||
<string name="stats_disable_dialog">Wysyłanie statystyk jest już włączone.\n\nChcesz je wyłączyć?</string>
|
||||
<string name="disable">Wyłącz</string>
|
||||
<string name="stats_keep_sending">Kontynuuj wysyłanie</string>
|
||||
<string name="stats_msg_body">Załącznik zawiera anonimowe statystyki użytkowania, które pomagają nam ulepszać Delta Chat. Więcej informacji można znaleźć na: https://delta.chat/help#statssending. Dziękujemy!</string>
|
||||
|
||||
<!-- Emoji picker and categories -->
|
||||
<string name="emoji_search_results">Wyniki wyszukiwania</string>
|
||||
<string name="emoji_not_found">Nie znaleziono emoji</string>
|
||||
@@ -911,7 +920,7 @@
|
||||
<!-- %1$s will be replaced by name of the contact removed from the group, %2$s will be replaced by name of the contact who did the action -->
|
||||
<string name="remove_member_by_other">Użytkownik %2$s usunął członka %1$s.</string>
|
||||
<!-- %1$s will be replaced by name of the contact removed from the group; this string is used when it's unclear who did the action -->
|
||||
<string name="member_x_removed">Usunięto członka %1$s</string>
|
||||
<string name="member_x_removed">Usunięto członka %1$s.</string>
|
||||
<!-- "left" in the meaning of "exited". -->
|
||||
<string name="group_left_by_you">Opuszczono grupę</string>
|
||||
<!-- "left" in the meaning of "exited". -->
|
||||
@@ -973,7 +982,7 @@
|
||||
|
||||
<string name="devicemsg_self_deleted">Usunięto czat „Zapisane wiadomości”.\n\nℹ️ Aby ponownie użyć funkcji „Zapisane wiadomości”, utwórz nowy czat ze sobą.</string>
|
||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
||||
<string name="devicemsg_storage_exceeding">⚠️ Limit pamięci u twojego dostawcy wkrótce zostanie przekroczony, wykorzystano już %1$s%%.\n\nMożesz nie być w stanie otrzymywać wiadomości, gdy pamięć jest pełna.\n\n👉 Sprawdzić, czy możesz usunąć stare dane w interfejsie internetowym dostawcy i rozważyć włączenie opcji \"Ustawienia » Czaty i media » Usuwanie starych wiadomości\". W dowolnym momencie możesz sprawdzić swoje bieżące wykorzystanie pamięci w \"Ustawienia » Łączność\".</string>
|
||||
<string name="devicemsg_storage_exceeding">⚠️ Limit pamięci u twojego dostawcy wkrótce zostanie przekroczony, wykorzystano już %1$s%%.\n\nMożesz nie być w stanie otrzymywać wiadomości, gdy pamięć jest pełna.\n\n👉 Sprawdzić, czy możesz usunąć stare dane w interfejsie internetowym dostawcy i rozważyć włączenie opcji \"Ustawienia » Czaty » Usuwanie starych wiadomości\". W dowolnym momencie możesz sprawdzić swoje bieżące wykorzystanie pamięci w \"Ustawienia » Łączność\".</string>
|
||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||
<string name="devicemsg_bad_time">⚠️ Data lub godzina urządzenia wydaje się być niedokładna (%1$s).\n\nDostosuj zegar ⏰🔧, aby upewnić się, że wiadomości są prawidłowo odbierane.</string>
|
||||
<string name="devicemsg_update_reminder">⚠️ Twoja wersja Delta Chat może być nieaktualna.\n\nMoże to powodować problemy, ponieważ Twoi partnerzy czatu korzystają z nowszych wersji, a Ty nie masz najnowszych funkcji 😳\nSprawdź aktualizacje na stronie https://get.delta.chat lub w sklepie z aplikacjami.</string>
|
||||
|
||||
@@ -1036,6 +1036,7 @@
|
||||
<string name="secure_join_replies">%1$s ответил(а), ожидаем добавления в группу…</string>
|
||||
<string name="secure_join_wait">Устанавливается соединение, пожалуйста, подождите…</string>
|
||||
<string name="contact_verified">%1$s подтверждён.</string>
|
||||
<string name="contact_blocked">Вы заблокировали контакт</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Подтверждён: %1$s</string>
|
||||
<string name="verified_by_you">Подтверждён: Лично</string>
|
||||
|
||||
@@ -996,6 +996,7 @@
|
||||
<string name="secure_join_replies">%1$s u përgjigj, po pritet që të shtohet te grupi…</string>
|
||||
<string name="secure_join_wait">Po vendoset fshehtëzim skaj-më-skaj, ju lutemi, pritni…</string>
|
||||
<string name="contact_verified">%1$s u soll.</string>
|
||||
<string name="contact_blocked">E bllokuat kontaktin</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Sjellë nga %1$s</string>
|
||||
<string name="verified_by_you">Sjellë nga unë</string>
|
||||
|
||||
@@ -1002,6 +1002,7 @@
|
||||
<string name="secure_join_replies">%1$s yanıtladı; gruba eklenmesi bekleniyor…</string>
|
||||
<string name="secure_join_wait">Bağlantı kuruluyor, lütfen bekleyin…</string>
|
||||
<string name="contact_verified">%1$s tanıtıldı.</string>
|
||||
<string name="contact_blocked">Kişiyi engellediniz</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">%1$s tarafından tanıtıldı</string>
|
||||
<string name="verified_by_you">Benim tarafımdan tanıtıldı</string>
|
||||
|
||||
@@ -985,6 +985,7 @@
|
||||
<string name="secure_join_replies">%1$s 已回复,等待被加入群组…</string>
|
||||
<string name="secure_join_wait">正在建立连接,请稍候…</string>
|
||||
<string name="contact_verified">%1$s 已验证。</string>
|
||||
<string name="contact_blocked">您已屏蔽该联系人</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">验证人 %1$s</string>
|
||||
<string name="verified_by_you">由您验证</string>
|
||||
|
||||
@@ -1002,6 +1002,7 @@
|
||||
<string name="secure_join_replies">%1$s replied, waiting for being added to the group…</string>
|
||||
<string name="secure_join_wait">Establishing connection, please wait…</string>
|
||||
<string name="contact_verified">%1$s introduced.</string>
|
||||
<string name="contact_blocked">You blocked the contact</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Introduced by %1$s</string>
|
||||
<string name="verified_by_you">Introduced by me</string>
|
||||
|
||||
Reference in New Issue
Block a user