Compare commits

...

74 Commits

Author SHA1 Message Date
adbenitez 98d711e0ca tweak createForExternal 2025-12-22 18:23:08 +01:00
copilot-swe-agent[bot] 99c848b1b7 Add clarifying comment about fallback logic
Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com>
2025-12-22 16:58:38 +00:00
copilot-swe-agent[bot] fe26af88b4 Fix quick-camera button crash on devices with external SD cards
Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com>
2025-12-22 16:55:15 +00:00
copilot-swe-agent[bot] 6af6ff80ba Initial plan 2025-12-22 16:51:35 +00:00
adb 76e4c59119 Merge pull request #87 from ArcaneChat/copilot/add-email-subject-field
Add subject field for mailing list chats
2025-12-16 20:31:45 +01:00
adbenitez 33b69b9f3a update scripts 2025-12-16 20:30:50 +01:00
adbenitez b4f5e2d124 allow to set subject in email threads 2025-12-16 20:25:05 +01:00
adbenitez fa7a3c9c32 Merge remote-tracking branch 'upstream/main' 2025-12-16 18:50:00 +01:00
adb a70c76f7f3 Merge pull request #4132 from deltachat/prep-2.34.0
prepare 2.34.0
2025-12-16 17:55:19 +01:00
adbenitez 87a6a12367 prepare 2.34.0 2025-12-16 17:50:29 +01:00
adb 9bcdcd918e Merge pull request #4130 from deltachat/update-core-and-stuff-2025.12.16
Update core to 2.34.0
2025-12-16 17:39:45 +01:00
adbenitez 7454454b63 update changelog 2025-12-16 17:35:11 +01:00
adbenitez 69a5e42640 update RPC bindings 2025-12-16 17:35:04 +01:00
adbenitez 1e86ed225d update translations 2025-12-16 17:34:28 +01:00
adbenitez 4cd7977ced update deltachat-core-rust to 'chore: prepare 2.34.0 release' of 'v2.34.0' 2025-12-16 17:29:44 +01:00
adb 0ce10cbb35 Merge pull request #4129 from deltachat/adb/issue-4116-p2
do accounts migration in background
2025-12-16 17:23:24 +01:00
Hocuri 114731f722 Make sending of statistics into a setting (#3794)
Counterpart of https://github.com/chatmail/core/pull/6851

* Make sending of statistics into a setting

* feat: Count securejoin sources and UI paths

* feat: Rename self_reporting to send_statistics

* Adapt core's API change

* WIP, untested: Adapt to a rename on the core side

* Adapt to generated jsonrpc

* New strings and a new dialog

* Adapt to the API change

* Rewording: `...and support research`

* "More Info" button rather than link

* Small fixes

* Open the correct survey (though it doesn't work yet)

* Changelog

* Update help

* Fix compile error

* Fix compilation

* Revert submodule change

* Don't show a device message yet

* Move "Send Statistics" setting

* Fix compilation error

* Remove unused constant

---------

Co-authored-by: adb <adb@merlinux.eu>
2025-12-16 13:10:51 +01:00
B. Petersen 2a7025ef17 stop using deprecated ask_delete_messages_simple 2025-12-15 18:09:06 +01:00
adb 257003ba09 Merge branch 'main' into adb/issue-4116-p2 2025-12-15 17:29:49 +01:00
adbenitez ca110c6d74 improve code 2025-12-15 17:28:48 +01:00
adbenitez 09f66caadc indent code 2025-12-15 17:23:49 +01:00
B. Petersen 4a73ac19c2 tweak another occurance of 'Chats and Media' 2025-12-15 17:21:04 +01:00
B. Petersen 9c3281e182 chats preferences is called just 'Chats'
it was renamed first on iOS from 'Chats and Media' to 'Chats'
to not confuse with 'All Apps and Media' -
however, that point is also valid for android,
but even if not, it is good for inner consistency and simpler documentation.

moreover, the settings are in reality also about contacts and more,
so just a broad chats is fine.

but also for outer consistency,
this seems better - also in quite some other apps,
it is just called 'chats'
2025-12-15 17:21:04 +01:00
adbenitez a84e17635a Merge branch 'adb/issue-4116-p2' of https://github.com/deltachat/deltachat-android into adb/issue-4116-p2 2025-12-15 17:20:50 +01:00
adbenitez af7d915d14 fix gplay flavor 2025-12-15 17:20:33 +01:00
adb f679376445 Merge branch 'main' into adb/issue-4116-p2 2025-12-15 16:38:00 +01:00
adbenitez 4f32b994fa do accounts migration in background
move accounts migration to background thread and wait for it in
foreground to avoid ANR in background in ApplicationContext
2025-12-15 16:29:13 +01:00
adb af640044c9 Merge pull request #4125 from deltachat/r10s/simplify-delete-wording
simpler 'really delete?' wordings
2025-12-15 12:55:06 +01:00
adb bece13d75e Merge pull request #4126 from deltachat/adb/issue-4059
avoid TransactionTooLargeException in LogViewActivity
2025-12-15 12:54:51 +01:00
adbenitez 1195945637 update changelog 2025-12-15 12:48:56 +01:00
adb 2e77ae8f4d Merge branch 'main' into adb/issue-4059 2025-12-15 12:48:08 +01:00
adbenitez c8fefca916 avoid TransactionTooLargeException in LogViewActivity 2025-12-15 12:44:50 +01:00
B. Petersen 6acb2203ef simpler 'really delete?' wordings
this removes the addendum 'on all your devices'
from the 'really delete?' questions.

- after polls, and looking at what other apps are doing,
  it is just the default expectation, that a message is deleted from all devices,
  also, we do not have an option (nor do not want to have)

- so, at that point - fresh user, one device -
  there is no need to clutter with other convepts and relativation.
  also, most user will never have more devices.

- ppl anyway do not read -
  but if they do, it is good to have things as much on point as possible :)

- the question fits better to the "delete for everyone" option

- simplify code and strings,
  as device message deletion is no longer special
  (there, we never said "on all your devices")

the addendum 'from your devices' was added as
one year ago, for technical limitations, deletion was really on one device.
when we removed that limitation, we added to addendum,
so ppl used to old apps have a chance to get the change.
meanwhile, the new default is clear and settled and the addendum
does more harm and raise questions than doing good.
2025-12-15 11:29:02 +01:00
adb 46c627dde1 Merge pull request #4123 from deltachat/adb/issue-4112
don't show `new_classic_contact` option in add-relay mode
2025-12-14 15:29:18 +01:00
adbenitez 1366bc3571 don't show new_classic_contact option in add-relay mode 2025-12-13 20:10:31 +01:00
adb 20c487be7a Merge pull request #4122 from deltachat/adb/update-rpc-bindings-2025.12.13
update RPC bindings
2025-12-13 20:05:40 +01:00
adbenitez ef674746d9 update RPC bindings 2025-12-13 20:04:43 +01:00
adbenitez e65268979c tweak intro image 2025-12-13 19:03:32 +01:00
adbenitez e289432a09 Merge remote-tracking branch 'upstream/main' 2025-12-13 11:51:12 +01:00
adbenitez 8509049791 update intro image 2025-12-13 11:50:35 +01:00
adbenitez d1b490a02d update spanish strings 2025-12-13 11:09:22 +01:00
adb 64d33bebbd Merge pull request #4119 from deltachat/adb/issue-4118
avoid NPE in InstantOnboardingActivity.onCreate
2025-12-12 17:14:38 +01:00
adbenitez 0a44d00451 add comment 2025-12-12 17:04:36 +01:00
adb 353b2c0488 Merge pull request #4121 from deltachat/adb/issue-4114
Allow to add relay from clipboard or image
2025-12-12 16:40:33 +01:00
B. Petersen 85c68d0485 remove dead account-creation-from-qr code 2025-12-12 16:39:27 +01:00
adbenitez 12c2237e00 remove leftover 2025-12-12 16:30:58 +01:00
adbenitez 68f9533392 Allow to add relay from clipboard or image if camera permission is not granted 2025-12-12 16:29:01 +01:00
adb e93efa318a Merge pull request #4117 from deltachat/adb/issue-4116
add more logging
2025-12-12 15:47:15 +01:00
adbenitez fbc01ff0a2 switch to new profile if no URI is available 2025-12-12 15:05:04 +01:00
adbenitez b0ca48740a avoid NPE in InstantOnboardingActivity.onCreate 2025-12-12 15:01:41 +01:00
adbenitez fa795dd149 add more logging 2025-12-12 14:28:17 +01:00
B. Petersen 0a4f1ded54 tune down 'account' wording 2025-12-11 18:40:00 +01:00
adbenitez b2e88d50fd fix typo 2025-12-10 17:24:01 +01:00
adbenitez 2a54867724 improve welcome message and intro graphic 2025-12-10 16:10:48 +01:00
adbenitez 210e5c7fbc Merge remote-tracking branch 'upstream/main' 2025-12-10 13:32:40 +01:00
adb a5818c7cba Merge pull request #4110 from deltachat/prep-2.33.1
prepare 2.33.1
2025-12-10 13:29:32 +01:00
adbenitez 059d517d0d update build.gradle 2025-12-10 12:51:05 +01:00
adbenitez 5c3eb0ac82 update changelog 2025-12-10 12:48:20 +01:00
adbenitez efa04fce18 update translations 2025-12-10 12:48:15 +01:00
adb fb9771adde Merge pull request #4106 from deltachat/adb/issue-4104
remove unnecessary lock
2025-12-10 12:44:42 +01:00
adb 2930d0dc2d Merge branch 'main' into adb/issue-4104 2025-12-10 12:18:39 +01:00
adb e6e85ed812 Merge pull request #4109 from deltachat/adb/add-missing-padding-conversationactivity
fix ConversationActivity on Android <11
2025-12-10 12:16:52 +01:00
adbenitez 7837a99e7b fix ConversationActivity on Android <11 2025-12-10 12:13:46 +01:00
adb 8c546dc358 Merge pull request #4107 from deltachat/adb/improve-add-relay-workflow
improve UX of adding new relays via QR or clicking links
2025-12-10 11:37:18 +01:00
adb f0c75ec3c6 Merge pull request #4108 from deltachat/adb/allow-dcaccount-in_webview
add dcaccount and dclogin to schema whitelist
2025-12-10 11:36:58 +01:00
adbenitez 658283c4e8 add dcaccount and dclogin to schema whitelist 2025-12-10 11:06:15 +01:00
adbenitez 0ef4d645df allow to add relays via link 2025-12-10 10:57:55 +01:00
adbenitez 91713911ee improve UX of adding new relays via QR 2025-12-10 09:58:56 +01:00
adbenitez 1c0a54d75e remove unnecessary lock 2025-12-09 18:39:55 +01:00
B. Petersen 0f82b3ca93 deprecate strings used to create profiles from main scanner
instead, one should be asked whether to add a transport.

- it is very probably the more wanted action -
  when one wants a new profile, it is better to learn first,
  that one has to go over "switch profil"

- less can go wrong -
  if ppl play around,
  adding a transport is less harmful than a new profile
  where they do not know how to switch, send from different ones etc.
2025-12-09 18:27:47 +01:00
adb 1a80187c07 Merge pull request #4103 from deltachat/adb/issue-4102
avoid NPE in WebxdcGarbageCollectionWorker
2025-12-09 18:25:34 +01:00
adbenitez e315d0505c fix startWork 2025-12-09 15:05:42 +01:00
adbenitez 10b966a7c8 store context and get Rpc on startWork 2025-12-09 12:34:39 +01:00
adbenitez 3c65408f25 avoid NPE in WebxdcGarbageCollectionWorker 2025-12-09 11:36:20 +01:00
138 changed files with 2684 additions and 1365 deletions
+9 -1
View File
@@ -1,11 +1,19 @@
# Delta Chat Android Changelog
## v2.33.0
## v2.34.0
2025-12
* Allow to add relay from clipboard or image if camera permission is not granted
* Avoid crash in the "View Log" screen
* Update to core 2.34.0
## v2.33.1
2025-12
* Target Android 16
* Change color of links in text messages
* Improve edge-to-edge support
* Add the option (opt-in) to send anonymous statistics to Delta Chat's developers
* Metadata protection: protect message recipients
* Allow to withdraw channel invite links and QR codes
* Allow to open externally links clicked inside in-chat apps
+2 -2
View File
@@ -33,8 +33,8 @@ android {
useLibrary 'org.apache.http.legacy'
defaultConfig {
versionCode 30000733
versionName "2.33.0"
versionCode 30000735
versionName "2.34.0"
applicationId "chat.delta.lite"
multiDexEnabled true
+1
View File
@@ -6,3 +6,4 @@ find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/Delta Chat
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/get.delta.chat/github.com\/ArcaneChat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/delta.chat\/donate/arcanechat.me\/#contribute/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/Delta Chat/ArcaneChat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/❤️/💜/g'
+1
View File
@@ -6,6 +6,7 @@ find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/ArcaneChat
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/github.com\/ArcaneChat/get.delta.chat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/arcanechat.me\/#contribute/delta.chat\/donate/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/ArcaneChat/Delta Chat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/💜/❤️/g'
# don't revert the app name
sed -i 's/>Delta Chat</>ArcaneChat</g' ./src/main/res/values/strings.xml
@@ -62,7 +62,7 @@ public class FcmReceiveService extends FirebaseMessagingService {
prefixedToken = addPrefix(rawToken);
Log.i(TAG, "FCM token: " + prefixedToken);
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
triedRegistering = true;
});
}
@@ -104,6 +104,6 @@ public class FcmReceiveService extends FirebaseMessagingService {
public void onNewToken(@NonNull String rawToken) {
prefixedToken = addPrefix(rawToken);
Log.i(TAG, "new FCM token: " + prefixedToken);
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
}
}
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#mám-zájem-o-technické-podrobnosti-kde-najdu-víc">Mám zájem o technické podrobnosti. Kde najdu víc?</a></li>
</ul>
</li>
@@ -948,22 +949,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="je-v-plánu-vytvořit-webovou-verzi-delta-chatu">
@@ -1007,33 +1007,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1100,6 +1111,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="mám-zájem-o-technické-podrobnosti-kde-najdu-víc">
+169 -135
View File
@@ -55,10 +55,11 @@
<li><a href="#erweitert">Erweitert</a>
<ul>
<li><a href="#experimentelle-features">Experimentelle Features</a></li>
<li><a href="#statssending">Was ist “Statistik an Delta Chat Entwickler senden”?</a></li>
<li><a href="#relays">Was sind Relays?</a></li>
<li><a href="#kann-ich-eine-klassische-e-mail-adresse-mit-delta-chat-verwenden">Kann ich eine klassische E-Mail-Adresse mit Delta Chat verwenden?</a></li>
<li><a href="#classic-email">Wie kann ich ein Chat-Profil mit einer klassischen E-Mail-Adresse als Relay konfigurieren?</a></li>
<li><a href="#ich-möchte-meinen-eigenen-server-für-delta-chat-verwalten-gibt-es-empfehlungen">Ich möchte meinen eigenen Server für Delta Chat verwalten. Gibt es Empfehlungen?</a></li>
<li><a href="#statssending">Was ist “Statistik an Delta Chat Entwickler senden”?</a></li>
<li><a href="#ich-bin-an-technischen-details-interessiert-gibt-es-hierzu-weitere-infos">Ich bin an technischen Details interessiert. Gibt es hierzu weitere Infos?</a></li>
</ul>
</li>
@@ -137,14 +138,17 @@ basierend auf <a href="https://github.com/chatmail/core/blob/main/standards.md#s
Es gibt keine öffentliches Verzeichnis, du entscheiden selbst über deine Kontakte.</p>
<ul>
<li>Wenn du <strong>persönlich</strong> mit deinen Freunden oder Familie zusammen bist,
<li>
<p>Wenn du <strong>persönlich</strong> mit deinen Freunden oder Familie zusammen bist,
tippe auf das <strong>QR-Code</strong>-Symbol <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
auf dem Hauptbildschirm.<br />
Bitte deinen Chatpartner den QR-Code mit Delta Chat zu <strong>scannen</strong>.</li>
Bitte deinen Chatpartner den QR-Code mit Delta Chat zu <strong>scannen</strong>.</p>
</li>
<li>
<p>Für eine Kontaktaufnahme <strong>aus der Ferne</strong>, klicke im selben Bildschirm auf “Kopieren” oder “Teilen” und sende den <strong>Einladungslink</strong> über einen anderen privaten Chat.</p>
</li>
</ul>
<p>Für eine Kontaktaufnahme <strong>aus der Ferne</strong>, klicke im selben Bildschirm auf “Kopieren” oder “Teilen” und sende den <strong>Einladungslink</strong> über einen anderen privaten Chat.</p>
<p>Wartet nun, bis die Verbindung hergestellt ist.</p>
<ul>
@@ -230,7 +234,7 @@ bzw. <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png
</h3>
<p>Ein Profil besteht aus <strong>einem Namen, einem Bild</strong> und einigen zusätzlichen Informationen zum Verschlüsseln von Nachrichten.
Ein Profil existiert nur auf Ihren Geräten
Ein Profil existiert nur auf deinen Geräten
und verwendet den Server nur für den Transport von Nachrichten.</p>
<p>Bei der Installation von Delta Chat wird ein erstes Profil erstellt.</p>
@@ -361,7 +365,7 @@ sei es durch den <a href="#edit">Absender</a>, durch <a href="#delold">Automatis
<p><strong>Zwei Häkchen</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" /> bedeuten, dass mindestens ein Gerät des Empfängers zurückgemeldet hat, die Nachricht empfangen zu haben.</p>
</li>
<li>
<p>Lesebestätigungen können deaktiviert werden. D.h. auch wenn Sie nur ein Häkchen sehen, kann die Nachricht gelesen worden sein.</p>
<p>Lesebestätigungen können deaktiviert werden. D.h. auch wenn du nur ein Häkchen siehst, kann die Nachricht gelesen worden sein.</p>
</li>
<li>
<p>Umgekehrt bedeuten zwei Häkchen nicht automatisch, dass ein Mensch die Nachricht gelesen oder verstanden hat ;)</p>
@@ -433,7 +437,7 @@ oder auf andere Weise Nachrichten vor dem Löschen speichern, kopieren oder weit
<ul>
<li>Wenn du Speicherplatz auf deinem Gerät sparen möchtest, kannst du alte Nachrichten automatisch löschen lassen.</li>
<li>Hierzu, öffne die “Chats und Medien”-Einstellungen und dort “Alte Nachrichten vom Gerät löschen”. Du kannst einen Zeitraum zwischen “1 Stunde” und “1 Jahr” festlegen; auf diese Weise werden <em>alle</em> Nachrichten von Ihrem Gerät gelöscht, sobald sie älter als angegeben sind.</li>
<li>Hierzu, öffne die “Chats und Medien”-Einstellungen und dort “Alte Nachrichten vom Gerät löschen”. Du kannst einen Zeitraum zwischen “1 Stunde” und “1 Jahr” festlegen; auf diese Weise werden <em>alle</em> Nachrichten von deinem Gerät gelöscht, sobald sie älter als angegeben sind.</li>
</ul>
<h3 id="remove-account">
@@ -444,16 +448,15 @@ oder auf andere Weise Nachrichten vor dem Löschen speichern, kopieren oder weit
</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>Wenn du mehr als ein Chat-Profil verwendest,
kannst du einzelne Profile über den Avatar oben links (Android/iOS)
oder über die Seitenleiste (Desktop, Rechtsklick) entfernen.
Chat-Profile werden nur auf dem Gerät entfernt, auf dem “Löschen” ausgewählt wurde.
Chat-Profile auf anderen Geräten funktionieren uneingeschränkt weiter.</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>Wenn du ein einzelnes Standard-Chat-Profil verwendest, kannst du die App einfach deinstallieren.
Dadurch werden automatisch alle zugehörigen Daten gelöscht.
Weitere Informationen findest du auf der Seite des ausgewählten <a href="https://chatmail.at/relays">Relay</a>.</p>
<h2 id="groups">
@@ -463,15 +466,15 @@ or the respective page from your chosen <a href="https://chatmail.at/relays">3rd
</h2>
<p>Groups let several people chat together privately with <strong>equal rights</strong>.</p>
<p>Gruppen ermöglichen es mehreren Personen, privat miteinander bei <strong>gleichen Rechte</strong> zu chatten.</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 members devices.</p>
<p>Jeder kann
den Gruppennamen oder Avatar ändern,
<a href="#addmembers">Mitglieder hinzufügen oder entfernen</a>,
<a href="#ephemeralmsgs">Verschwindende Nachrichten</a> einstellen
und seine <a href="#edit">eigenen Nachrichten von Geräten der Mitglieder löschen</a>.</p>
<p>Because all members have the same rights, groups work best among <strong>trusted friends and family</strong>.</p>
<p>Da alle Mitglieder die gleichen Rechte haben, funktionieren Gruppen am besten unter <strong>vertrauten Freunden und Familienmitgliedern</strong>.</p>
<h3 id="eine-gruppe-anlegen">
@@ -497,27 +500,20 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
<ul>
<li>
<p>All group members have the <strong>same rights</strong>.
For this reason, everyone can delete any member or add new ones.</p>
<p>Alle Gruppenmitglieder haben <strong>dieselben Rechte</strong>. Jeder kann daher jeden löschen oder weitere Mitglieder hinzufügen.</p>
</li>
<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>Um <strong>Mitglieder hinzuzufügen oder zu entfernen</strong>, tippe im Chat auf den Gruppennamen und wähle das Mitglied aus, das du hinzufügen oder entfernen möchtest.</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>Wenn das Mitglied noch nicht in deiner Kontaktliste ist, sie sich aber <strong>persönlich</strong> treffen, wählen Sie dort <strong>QR-Einladungscode</strong> an. Dein Chat-Partner kann nun den QR-Code mit seiner Delta Chat-App <strong>scannen</strong> indem er auf <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> auf dem Hauptbildschirm tippt.</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>Für eine Kontaktaufnahme <strong>aus der Ferne</strong>, tippe dort “Kopieren” oder “Teilen” und sende den Einladungslink über einen anderen privaten Chat zum neuen Mitglied.</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>Mit einem QR-Code und dem Einladungslink können mehrere Mitglieder hinzugefügt werden. Da Gruppen jedoch <a href="#groups">für vertrauenswürdige Personen gedacht sind</a>, solltest du diese nicht öffentlich teilen.</p>
<h3 id="ich-habe-mich-selbst-versehentlich-gelöscht">
@@ -558,21 +554,21 @@ Wenn du der Gruppe später erneut beitreten möchtest, bitten ein anderes Gruppe
</h3>
<p>You can duplicate a group to start a separate discussion
or to exclude members without them noticing.</p>
<p>Du kannst eine Gruppe duplizieren, um eine separate Diskussion zu starten
oder um Mitglieder auszuschließen, ohne dass diese es bemerken.</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>Öffnen das Gruppenprofil und tippe auf <strong>Chat klonen</strong> (Android/iOS)
oder klicken mit der rechten Maustaste auf die Gruppe in der Chat-Liste (Desktop).</p>
</li>
<li>
<p>Set a new name, choose an avatar, and adjust the member list if needed.</p>
<p>Legen einen neuen Namen fest, wähle einen Avatar und passe gegebenenfalls die Mitgliederliste an.</p>
</li>
</ul>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<p>Die neue Gruppe ist <strong>völlig unabhängig</strong> von der ursprünglichen,
die weiterhin wie bisher funktioniert.</p>
<h2 id="webxdc">
@@ -582,8 +578,8 @@ which continues to work as before.</p>
</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>Du kannst Apps an einen Chat senden Spiele, Editoren, Umfragen und andere Tools.
Dies macht Delta Chat zu einem wirklich erweiterbaren Messenger.</p>
<h3 id="wo-bekomme-ich-in-chat-apps">
@@ -595,10 +591,10 @@ This makes Delta Chat a truly extensible messenger.</p>
<ul>
<li>
<p>In a chat, using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → Apps</strong></p>
<p>Im Chat unter <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Anhängen → Apps</strong></p>
</li>
<li>
<p>You can also <a href="#create-xdc">create your own app</a> and attach it using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → File</strong></p>
<p>Du kannst deine <a href="#create-xdc">eigenen Apps erstellen</a> und mit <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Anhängen → Datei</strong> anhängen</p>
</li>
</ul>
@@ -612,19 +608,16 @@ This makes Delta Chat a truly extensible messenger.</p>
<ul>
<li>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
<p>In-Chat-Apps können keine Daten ins Internet senden oder etwas herunterladen.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
<p>Eine App kann nur Daten innerhalb eines Chats austauschen. Ansonsten ist sie vollständig vom Internet isoliert.</p>
</li>
<li>
<p>The privacy an in-chat app offers is the privacy of your chat - as long as you
trust the people you chat with, you can trust the in-chat app as well.</p>
<p>Die Privatsphäre, die eine App bietet, ist die Privatsphäre des Chats solange Sie den Personen, mit denen Sie chatten, vertrauen, können Sie auch der App vertrauen.</p>
</li>
<li>
<p>This also means: Just like for web links, do not open apps from untrusted contacts.</p>
<p>Das bedeutet auch: Genauso wie bei Weblinks, öffne keine Apps von nicht-vertrauenswürdigen Kontakten.</p>
</li>
</ul>
@@ -638,19 +631,18 @@ trust the people you chat with, you can trust the in-chat app as well.</p>
<ul>
<li>
<p>In-chat apps are zip files with <code class="language-plaintext highlighter-rouge">.xdc</code> extension containing html, css, and javascript code.</p>
<p>In-Chat-Apps sind ZIP-Dateien mit der Erweiterung <code class="language-plaintext highlighter-rouge">.xdc</code>, die HTML-, CSS- und JavaScript-Code enthalten.</p>
</li>
<li>
<p>You can extend the <a href="https://github.com/webxdc/hello">Hello World example app</a>
to get started.</p>
<p>Um loszulegen, kannst du das <a href="https://github.com/webxdc/hello">Hello-World-Beispiel</a> bearbeiten.</p>
</li>
<li>
<p>All else you need to know is written in the
<a href="https://webxdc.org/docs">Webxdc documentation</a>.</p>
<p>Alle weitere, was du wissen musst, ist in der
<a href="https://webxdc.org/docs">Webxdc-Dokumentation</a> beschrieben.</p>
</li>
<li>
<p>If you have question, you can ask others with experience
in the <a href="https://support.delta.chat/c/webxdc/20">Delta Chat Forum</a>.</p>
<p>Wenn du Fragen hast, kannst du andere mit mehr Erfahrung
im <a href="https://support.delta.chat/c/webxdc/20">Forum</a> ansprechen.</p>
</li>
</ul>
@@ -710,8 +702,8 @@ keine Daten an Apple weitergibt, die Apple nicht bereits hat.</p>
</h3>
<p>If a “Push Service” is available, Delta Chat enables Push Notifications
to achieve instant message delivery for all chatmail users.</p>
<p>Wenn ein „Push-Dienst“ verfügbar ist, aktiviert Delta Chat Push-Benachrichtigungen,
um eine sofortige Nachrichtenzustellung für alle Chatmail-Benutzer zu erreichen.</p>
<p>In den Delta-Chat-Einstellungen „Benachrichtigungen“ für „Sofortige Benachrichtigungen“
kannst du die folgenden Einstellungen ändern, die alle Chat-Profile betreffen:</p>
@@ -724,7 +716,7 @@ Einige Android-Hersteller schränken Apps sogar vollständig ein
und Delta Chat zeigt möglicherweise keine eingehenden Nachrichten an, bis du die App erneut manuell öffnest.</p>
</li>
<li>
<p>Hintergrundverbindung erzwingen: Dies ist die Ausweichoption wenn die vorherigen Optionen nicht verfügbar sind oder keine „sofortige Zustellung“ erreichen. Die Aktivierung dieser Option führt zu einer permanenten Benachrichtigung auf Ihrem Telefon, die bei neueren Android-Telefonen manchmal „verkleinert“ werden kann.</p>
<p>Hintergrundverbindung erzwingen: Dies ist die Ausweichoption wenn die vorherigen Optionen nicht verfügbar sind oder keine „sofortige Zustellung“ erreichen. Die Aktivierung dieser Option führt zu einer permanenten Benachrichtigung auf deinem Telefon, die bei neueren Android-Telefonen manchmal „verkleinert“ werden kann.</p>
</li>
</ul>
@@ -739,9 +731,9 @@ können sicher ausprobiert werden, wenn du feststellst, dass Nachrichten nur mit
</h3>
<p>Delta Chat Push Notification support avoids leakage of private information.
It does not leak profile data, IP address or message content (not even encrypted)
to any system involved in the delivery of Push Notifications.</p>
<p>Delta Chats Vorgehensweise, Push-Benachrichtigungen zu verwenden, vermeidet die Weitergabe privater Informationen.
Es werden keine Profildaten, IP-Adressen oder Nachrichteninhalte (auch nicht verschlüsselt)
an irgendein System, das an der Zustellung von Push-Benachrichtigungen beteiligt ist, weitergegeben.</p>
<p>So verwendet Delta Chat Push-Benachrichtigungen:</p>
@@ -751,21 +743,20 @@ to any system involved in the delivery of Push Notifications.</p>
auf dem <a href="https://delta.chat/chatmail">Chatmail</a>-Server.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives a message for a Delta Chat user
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
<p>Wenn ein <a href="https://delta.chat/chatmail">Chatmail</a>-Server eine Nachricht für einen Delta-Chat-Benutzer erhält
erhält, leitet er das verschlüsselte Geräte-Token an den zentralen Delta-Chat-Benachrichtigungs-Proxy weiter.</p>
</li>
<li>
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or profile data of Delta Chat users.</p>
<p>Der zentrale Delta-Chat-Benachrichtigungs-Proxy entschlüsselt das Geräte-Token und leitet es an den jeweiligen Push-Dienst (Apple, Google, etc.) weiter,
ohne jemals die Adresse oder IP-Adresse des Delta-Chat-Benutzers zu kennen.</p>
</li>
<li>
<p>The central Push Service (Apple, Google, etc.)
wakes up the Delta Chat app on your device
to check for new messages in the background.
It does not know about the profile data of the device it wakes up.
The central Apple/Google Push services never see any profile data (sender or receiver)
and also never see any message content (also not in encrypted forms).</p>
<p>Der zentrale Push-Dienst (Apple, Google, etc.)
weckt die Delta-Chat-App auf deinem Gerät auf
um im Hintergrund nach neuen Nachrichten zu suchen.
Der zentrale Push-Dienst weiß nichts über das Profil des Geräts, das er aufweckt,
sieht nie eine Adresse (weder Absender noch Empfänger)
und auch nie den Inhalt einer Nachricht (auch nicht in verschlüsselter Form).</p>
</li>
</ul>
@@ -773,10 +764,10 @@ and also never see any message content (also not in encrypted forms).</p>
und vergisst die Geräte-Token, sobald Apple/Google/etc. sie verarbeitet hat,
normalerweise innerhalb weniger Millisekunden.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees profile data, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Beachten, dass das Geräte-Token zwischen Anwendungen und dem Benachrichtigungs-Proxy verschlüsselt,
aber nicht signiert ist.
Der Benachrichtigungs-Proxy sieht also niemals Profildaten, IP-Adressen oder
irgendwelche kryptografischen Identitätsinformationen, die mit dem Gerät oder dem Geräte-Token eines Nutzers verbunden sind.</p>
<p>Aufgrund dieses umfassenden Datenschutzkonzepts würde sogar die Beschlagnahmung eines Chatmail-Servers,
oder die vollständige Beschlagnahmung des zentralen Delta-Chat-Benachrichtigungsproxys
@@ -795,10 +786,9 @@ aber wir wollen, dass die Nutzer eine zuverlässige „Sofortzustellung“ von N
wie sie es von WhatsApp, Signal oder Telegram kennen,
ohne im Vorfeld Fragen zu stellen, die eher für erfahrene Nutzer oder Entwickler geeignet sind.</p>
<p>Note that Delta Chat has a <a href="#privacy-notifications">small and privacy-preserving Push Notification system</a>
that achieves instant delivery” of messages for all chatmail servers
including a potential one <a href="https://delta.chat/chatmail#selfhosted">you might setup yourself without our permission</a>.
Welcome to the power of the interoperable chatmail relay network :)</p>
<p>Beachte, dass Delta Chat ein <a href="#privacy-notifications">kleines, die Privatsphäre wahrendes Push-Benachrichtigungssystem</a>
hat, das eine „sofortige Zustellung“ von Nachrichten für alle Chatmail-Server erreicht.
Einschließlich dem Chatmail-Server, <a href="https://delta.chat/chatmail#selfhosted">den du selbst ohne unsere Erlaubnis einrichten kannst</a>.</p>
<h2 id="multiclient">
@@ -897,14 +887,16 @@ versuche, einen <strong>Mobilen Hotspot</strong> auf einem Gerät zu öffnen und
<p>Diese Methode wird nur empfohlen, wenn “Zweites Gerät hinzufügen”, wie oben beschrieben, nicht funktioniert.</p>
<ul>
<li>Auf dem alten Gerät, gehe zu “Einstellungen → Chats und Medien → Chats auf externem Speicher speichern”. Gib deine PIN, dein Muster oder dein Passwort zum Entsperren des Bildschirms ein. Anschließend kannst du auf “Backup starten” klicken. Dadurch wird die Backup-Datei auf deinem Gerät gespeichert. Jetzt musst du sie auf das andere Gerät übertragen.</li>
<li>Auf dem neuen Gerät, auf dem Anmeldebildschirm, wähle “Ich habe bereits ein Profil” und dann “Wiederherstellen aus Backup”. Nach dem Import sind deine Chats, Medien und Einstellungen auf das neue Gerät kopiert.
<ul>
<li><strong>Wenn du iOS verwendest</strong> und auf Schwierigkeiten stößt, hilft dir vielleicht <a href="https://support.delta.chat/t/import-backup-to-ios/1628">diese Anleitung</a>.</li>
</ul>
<li>
<p>Auf dem alten Gerät, gehe zu <strong>Einstellungen → Chats und Medien → Chats auf externem Speicher speichern</strong>. Gib deine PIN, dein Muster oder dein Passwort zum Entsperren des Bildschirms ein. Anschließend kannst du auf “Backup starten” klicken. Dadurch wird die Backup-Datei auf deinem Gerät gespeichert. Jetzt musst du sie auf das andere Gerät übertragen.</p>
</li>
<li>
<p>Auf dem neuen Gerät, auf dem Anmeldebildschirm, wähle <strong>Ich habe bereits ein Profil → Wiederherstellen aus Backup</strong>. Nach dem Import sind deine Chats, Medien und Einstellungen auf das neue Gerät kopiert.
Wenn du iOS verwendest und auf Schwierigkeiten stößt, hilft dir vielleicht <a href="https://support.delta.chat/t/import-backup-to-ios/1628">diese Anleitung</a>.</p>
</li>
<li>Du bist nun synchronisiert und kannst beide Geräte zum Senden und Empfangen von Ende-zu-Ende-verschlüsselten-Nachrichten mit deinen Kommunikationspartnern verwenden.</li>
</ul>
<p>Du bist nun synchronisiert und kannst beide Geräte zum Senden und Empfangen von Ende-zu-Ende-verschlüsselten-Nachrichten mit deinen Kommunikationspartnern verwenden.</p>
<h3 id="gibt-es-pläne-für-eine-delta-chat-web-anwendung">
@@ -941,36 +933,45 @@ kannst du unfertige Features ausprobieren, an denen gearbeitet wird.</p>
<p>Die Features können <strong>instabil</strong> sein und <strong>geändert oder entfernt</strong> werden.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<p>Du findest weitere Informationen im <a href="https://support.delta.chat">Forum</a>, wo du auch Feedback geben kannst.</p>
<h3 id="statssending">
<h3 id="relays">
Was ist “Statistik an Delta Chat Entwickler senden”? <a href="#statssending" class="anchor"></a>
Was sind Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays werden verwendet, um Nachrichten vorübergehend zu speichern, falls dein Gerät offline ist.
Relays sind billige und einfache Server,
die keine Daten wie Gruppenstatus, deinen Namen oder deinen Avatar speichern
all das existiert nur auf deinem Gerät.
Relays werden von verschiedenen Gruppen und Personen betrieben.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>Standardmäßig wird nach der Installation ein Relay <strong>automatisch</strong> hinzugefügt;
darum musst du dich nicht kümmern.
Wenn du möchtest,
kannst du jedoch unter <strong>Einstellungen → Erweitert → Relays</strong> Änderungen vornehmen:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>Du kannst ein Relay <strong>hinzufügen</strong>, indem du einen QR-Code scannst,
z.B. von <a href="https://chatmail.at/relays">https://chatmail.at/relays</a>.
Bei mehreren Relays, empfängst du die Nachrichten von allen Relays.</p>
</li>
<li>
<p><strong>Standard</strong> legt das Relay fest, an das deine Chatpartner zukünftig Nachrichten senden.</p>
</li>
<li>
<p>Wenn du ein Relay <strong>entfernst</strong>,
stelle sicher, dass ein anderes Standard-Relay ausreichend lange verwendet wurde.
Andernfalls erreichen dich keine Nachrichten von deinen Kontakten.
Im Zweifelsfall entferne das Relay später.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>Weitere Details und zukünftige Möglichkeiten findest du im <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="kann-ich-eine-klassische-e-mail-adresse-mit-delta-chat-verwenden">
@@ -1037,6 +1038,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
Was ist “Statistik an Delta Chat Entwickler senden”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="ich-bin-an-technischen-details-interessiert-gibt-es-hierzu-weitere-infos">
@@ -1104,10 +1139,7 @@ Seit der Veröffentlichung von Delta Chat Version 2 (Juli 2025) gibt es keine Sc
<p>Wenn du die Standard-<a href="https://chatmail.at/relays">Chatmail-Relays</a> verwendest, ist es unmöglich, Nachrichten ohne End-to-End-Verschlüsselung zu empfangen oder zu senden.</p>
<p>If you instead use a <a href="#classic-email">classic email server</a>,
you can send and receive messages with or without end-to-end encryption.
Messages lacking end-to-end encryption are marked with an email icon
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
<p>Wenn du stattdessen ein Profil mit einem <a href="#classic-email">klassischen E-Mail-Server</a> erstellst, kannst du Nachrichten mit und ohne Ende-zu-Ende-Verschlüsselung senden und empfangen. Nachrichten ohne Ende-zu-Ende-Verschlüsselung werden mit einem E-Mail-Symbol gekennzeichnet <img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
<h3 id="e2eeguarantee">
@@ -1181,10 +1213,11 @@ die Sicherheitseigenschaften durch das im Sommer 2023 angenommene
</h3>
<p>Yes, we are following efforts like <a href="https://en.wikipedia.org/wiki/Messaging_Layer_Security">MLS</a>
but adopting them would mean breaking end-to-end encryption interoperability.
So it would not be a light decision to take
and there must be tangible improvements for users.</p>
<p>Ja, wir verfolgen Ansätze wie <a href="https://en.wikipedia.org/wiki/Messaging_Layer_Security">MLS</a>.
Diese zu übernehmen würde aber bedeuten, die Interoperabilität der Ende-zu-Ende-Verschlüsselung
mit allen anderen Anwendungen zu zerstören.
Die Entscheidung wäre also nicht leicht zu treffen
und müsste spürbare Verbesserungen für die Nutzer bringen.</p>
<p>Delta Chat verfolgt einen ganzheitlichen Ansatz bei der “nutzbaren Sicherheit”:
Wir arbeiteten mit vielen Aktivistengruppen sowie mit
@@ -1222,21 +1255,22 @@ so wie in der Autocrypt-Level-1-Spezifikation definiert.</p>
</h3>
<p>If you are sending or receiving email messages without end-to-end encryption (using a classic email server),
they are still protected from cell or cable companies who can not read or modify your email messages.
But both your and your recipients email providers
may read, analyze or modify your messages, including any attachments.</p>
<p>Wenn du E-Mail-Nachrichten ohne Ende-zu-Ende-Verschlüsselung sendest oder empfängst (mit einem klassischen E-Mail-Server),
sind sie immer noch vor Mobilfunkanbietern oder Kabelnetzbetreibern geschützt, die deine E-Mail-Nachrichten nicht lesen oder verändern können.</p>
<p>Delta Chat by default uses strict
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS encryption</a>
which secures connections between your device and your email provider.
All of Delta Chats TLS-handling has been independently <a href="#security-audits">security audited</a>.
Moreover, the connection between your and the recipients email provider
will typically be transport-encrypted as well.
If the involved email servers support <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a>
then transport encryption will be enforced between email providers
in which case Delta Chat communications will never be exposed in cleartext to the Internet
even if the message was not end-to-end encrypted.</p>
<p>Aber sowohl dein E-Mail-Anbieter als auch der E-Mail-Anbieter des Empfängers
können Nachrichten, einschließlich aller Anhänge, lesen, analysieren oder verändern.</p>
<p>Delta Chat verwendet standardmäßig strikte
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS-Verschlüsselung</a>,
die die Verbindungen zwischen deinem Gerät und dem E-Mail-Anbieter sichert.
Die gesamte TLS-Implementierung wurde unabhängig <a href="#security-audits">sicherheitsgeprüft</a>.
Die Verbindung zwischen deinem E-Mail-Provider und dem des Empfängers
ist in der Regel ebenfalls transportverschlüsselt.
Wenn die beteiligten E-Mail-Server <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a> unterstützen,
wird TLS zwischen den E-Mail-Anbietern durchgesetzt.
In diesem Fall wird die Delta-Chat-Kommunikation niemals im Klartext ins Internet gelangen
selbst wenn die Nachricht nicht Ende-zu-Ende-verschlüsselt war.</p>
<h3 id="message-metadata">
@@ -1351,7 +1385,7 @@ Wir beabsichtigen, PQC-Unterstützung zum <a href="https://github.com/chatmail/c
<p>Du kannst den Status der Ende-zu-Ende-Verschlüsselung manuell im Dialog “Verschlüsselung”
(Android/iOS: Benutzerprofil, Desktop: Rechtsklick auf den Chat eines Benutzers) überprüfen.
Delta Chat zeigt dort zwei Fingerabdrücke an.
Wenn die gleichen Fingerabdrücke auf Ihrem eigenen Gerät und auf dem Gerät Ihres Kontakts erscheinen,
Wenn die gleichen Fingerabdrücke auf deinem eigenen Gerät und auf dem Gerät deines Kontakts erscheinen,
ist die Verbindung sicher.</p>
<h3 id="importkey">
@@ -1454,10 +1488,10 @@ e.g. you need to grant camera permission if you want to <a href="#howtoe2ee">sca
<p>Falls nicht verfügbar, verwende den <strong>Mirror</strong> auf <a href="https://deltachat.github.io/deltachat-pages">https://deltachat.github.io/deltachat-pages</a></p>
</li>
<li>
<p>Öffne einen der folgenden <strong>App-Stores und suchen Sie nach „Delta Chat“:</strong> Google Play Store, F-Droid, Huawei App Gallery, iOS und macOS App Store, Microsoft Store</p>
<p>Öffne einen der folgenden <strong>App-Stores und suche nach „Delta Chat“:</strong> Google Play Store, F-Droid, Huawei App Gallery, iOS und macOS App Store, Microsoft Store</p>
</li>
<li>
<p>Im <strong>Paketmanager</strong> Ihrer Linux-Distribution nachschauen</p>
<p>Im <strong>Paketmanager</strong> deiner Linux-Distribution nachschauen</p>
</li>
<li>
<p><strong>Android-APKs</strong> sind auch auf <a href="https://github.com/deltachat/deltachat-android/releases">https://github.com/deltachat/deltachat-android/releases</a> verfügbar.</p>
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#im-interested-in-the-technical-details-can-you-tell-me-more">Im interested in the technical details. Can you tell me more?</a></li>
</ul>
</li>
@@ -949,22 +950,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="are-there-any-plans-for-introducing-a-delta-chat-web-client">
@@ -1009,33 +1009,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1102,6 +1113,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="im-interested-in-the-technical-details-can-you-tell-me-more">
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#estoy-interesado-en-los-detalles-técnicos-pueden-decirme-más">Estoy interesado en los detalles técnicos. ¿Pueden decirme más?</a></li>
</ul>
</li>
@@ -947,22 +948,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="tienen-planeado-crear-un-cliente-web-de-delta-chat">
@@ -1007,33 +1007,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1100,6 +1111,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="estoy-interesado-en-los-detalles-técnicos-pueden-decirme-más">
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#les-détails-techniques-mintéressent-pouvez-vous-men-dire-plus-">Les détails techniques mintéressent. Pouvez-vous men dire plus ?</a></li>
</ul>
</li>
@@ -937,22 +938,21 @@ Vous pouvez utiliser plusieurs comptes par appareil : <a href="#multiple-account
<p>Recourez à cette méthode uniquement si les instructions ci-dessus pour “Ajouter un deuxième appareil” ont échoué.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="le-lancement-dun-client-web-delta-chat-est-il-prévu-">
@@ -994,33 +994,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1087,6 +1098,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="les-détails-techniques-mintéressent-pouvez-vous-men-dire-plus-">
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#im-interested-in-the-technical-details-can-you-tell-me-more">Im interested in the technical details. Can you tell me more?</a></li>
</ul>
</li>
@@ -949,22 +950,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="are-there-any-plans-for-introducing-a-delta-chat-web-client">
@@ -1009,33 +1009,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1102,6 +1113,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="im-interested-in-the-technical-details-can-you-tell-me-more">
+204 -165
View File
@@ -54,19 +54,20 @@
</li>
<li><a href="#avanzato">Avanzato</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#funzionalità-sperimentali">Funzionalità Sperimentali</a></li>
<li><a href="#relays">Cosa sono i ripetitori?</a></li>
<li><a href="#posso-usare-un-indirizzo-email-classico-con-delta-chat">Posso usare un indirizzo email classico con Delta Chat?</a></li>
<li><a href="#classic-email">Come posso configurare un profilo chat con un indirizzo email classico come inoltro?</a></li>
<li><a href="#vorrei-gestire-il-mio-server-per-delta-chat-cosa-mi-consigliate">Vorrei gestire il mio server per Delta Chat. Cosa mi consigliate?</a></li>
<li><a href="#statssending">Che cosa significa “Invia statistiche agli sviluppatori di Delta Chat”?</a></li>
<li><a href="#sono-interessato-ai-dettagli-tecnici-mi-puoi-dire-di-più">Sono interessato ai dettagli tecnici. Mi puoi dire di più?</a></li>
</ul>
</li>
<li><a href="#e2ee">Crittografia e Sicurezza</a>
<ul>
<li><a href="#quali-standards-vengono-utilizzati-per-la-crittografia-end-to-end">Quali standards vengono utilizzati per la crittografia end-to-end?</a></li>
<li><a href="#whene2e">How can I know if messages are end-to-end encrypted?</a></li>
<li><a href="#can-i-still-receive-or-send-messages-without-end-to-end-encryption">Can I still receive or send messages without end-to-end encryption?</a></li>
<li><a href="#whene2e">Come posso sapere se i messaggi sono crittografati end-to-end?</a></li>
<li><a href="#posso-ancora-ricevere-o-inviare-messaggi-senza-crittografia-end-to-end">Posso ancora ricevere o inviare messaggi senza crittografia end-to-end?</a></li>
<li><a href="#e2eeguarantee">Cosa significa il segno di spunta verde nel profilo di un contatto?</a></li>
<li><a href="#gli-allegati-immagini-file-audio-ecc-sono-crittografati-end-to-end">Gli allegati (immagini, file, audio, ecc.) sono crittografati end-to-end?</a></li>
<li><a href="#openpgp-secure">OpenPGP è sicuro?</a></li>
@@ -108,7 +109,7 @@ disponibile per piattaforme mobili e desktop.</p>
<ul>
<li>
<p>Creazione istantanea di <strong>profili chat privati</strong>
con <a href="https://chatmail.at/relays">relay di chat</a>
con <a href="https://chatmail.at/relays">ripetitori di chat</a>
sicuri e interoperabili che offrono linvio di messaggi istantanei e notifiche push per dispositivi iOS e Android.</p>
</li>
<li>
@@ -655,7 +656,7 @@ copie sui dispositivi dei tuoi interlocutori. A parte questo, è completamente
isolata da Internet.</p>
</li>
<li>
<p>La privacy offerta da unapp di chat è la privacy della tua chat: finché
<p>La riservatezza offerta da unapp di chat è la riservatezza della tua chat: finché
ti fidi delle persone con cui chatti, puoi fidarti anche dellapp di chat.</p>
</li>
<li>
@@ -673,19 +674,19 @@ ti fidi delle persone con cui chatti, puoi fidarti anche dellapp di chat.</p>
<ul>
<li>
<p>In-chat apps are zip files with <code class="language-plaintext highlighter-rouge">.xdc</code> extension containing html, css, and javascript code.</p>
<p>Le apps in-chat sono file zip con estensione <code class="language-plaintext highlighter-rouge">.xdc</code> contenenti codice HTML, CSS e JavaScript.</p>
</li>
<li>
<p>You can extend the <a href="https://github.com/webxdc/hello">Hello World example app</a>
to get started.</p>
<p>Puoi estendere l<a href="https://github.com/webxdc/hello">app di esempio Hello World</a>
per iniziare.</p>
</li>
<li>
<p>All else you need to know is written in the
<a href="https://webxdc.org/docs">Webxdc documentation</a>.</p>
<p>Tutto il resto che devi sapere è scritto nella
<a href="https://webxdc.org/docs">Documentazione di Webxdc</a>.</p>
</li>
<li>
<p>If you have question, you can ask others with experience
in the <a href="https://support.delta.chat/c/webxdc/20">Delta Chat Forum</a>.</p>
<p>Se hai domande, puoi chiedere ad altri utenti esperti
nel <a href="https://support.delta.chat/c/webxdc/20">Forum Chat Delta</a>.</p>
</li>
</ul>
@@ -732,9 +733,9 @@ invece del codice proprietario di Google sul telefono.</p>
<p>Sì, Delta Chat utilizza automaticamente le notifiche push per i profili <a href="https://delta.chat/chatmail">chatmail</a>.
E no, non esiste alcuna alternativa sui telefoni Apple per ottenere la consegna dei messaggi istantanei
perché i dispositivi Apple non consentono a Delta Chat di recuperare i dati in background.
perché i dispositivi Apple non consentono a Delta Chat di recuperare i dati in secondo piano.
Le notifiche push vengono attivate automaticamente per gli utenti iOS perché
<a href="#privacy-notifications">Sistema di notifiche push che tutela la privacy di Delta Chat</a>
<a href="#privacy-notifications">Sistema di notifiche push che tutela la riservatezza di Delta Chat</a>
non espone ad Apple i dati che non possiede già.</p>
<h3 id="android-push">
@@ -745,8 +746,8 @@ non espone ad Apple i dati che non possiede già.</p>
</h3>
<p>If a “Push Service” is available, Delta Chat enables Push Notifications
to achieve instant message delivery for all chatmail users.</p>
<p>Se è disponibile un “Servizio Push”, Delta Chat abilita le Notifiche Push
per garantire la consegna istantanea dei messaggi a tutti gli utenti chatmail.</p>
<p>Nelle impostazioni “Notifiche” di Delta Chat per “Consegna istantanea”
puoi modificare le seguenti impostazioni che interessano tutti i profili chat:</p>
@@ -781,9 +782,9 @@ che a volte può essere “minimizzato” con i recenti telefoni Android.</p>
</h3>
<p>Delta Chat Push Notification support avoids leakage of private information.
It does not leak profile data, IP address or message content (not even encrypted)
to any system involved in the delivery of Push Notifications.</p>
<p>Il supporto alle Notifiche Push di Delta Chat impedisce la fuga di informazioni private.
Non divulga dati del profilo, indirizzo IP o contenuto dei messaggi (nemmeno crittografati)
a nessun sistema coinvolto nella trasmissione delle Notifiche Push.</p>
<p>Ecco come le app Delta Chat eseguono linvio delle Notifiche Push:</p>
@@ -792,21 +793,21 @@ to any system involved in the delivery of Push Notifications.</p>
<p>Unapp Delta Chat ottiene un “token del dispositivo” localmente, lo crittografa e lo memorizza sul server <a href="https://delta.chat/chatmail">chatmail</a>.</p>
</li>
<li>
<p>When a <a href="https://delta.chat/chatmail">chatmail</a> server receives a message for a Delta Chat user
it forwards the encrypted device token to the central Delta Chat notification proxy.</p>
<p>Quando un server <a href="https://delta.chat/chatmail">chatmail</a> riceve un messaggio per un utente Delta Chat
inoltra il token del dispositivo crittografato al proxy di notifica centrale di Delta Chat.</p>
</li>
<li>
<p>The central Delta Chat notification proxy decrypts the device token
and forwards it to the respective Push service (Apple, Google, etc.),
without ever knowing the IP or profile data of Delta Chat users.</p>
<p>Il proxy di notifica centrale di Delta Chat decripta il token del dispositivo
e lo inoltra al rispettivo servizio Push (Apple, Google, ecc.),
senza mai conoscere lIP o i dati del profilo degli utenti di Delta Chat.</p>
</li>
<li>
<p>The central Push Service (Apple, Google, etc.)
wakes up the Delta Chat app on your device
to check for new messages in the background.
It does not know about the profile data of the device it wakes up.
The central Apple/Google Push services never see any profile data (sender or receiver)
and also never see any message content (also not in encrypted forms).</p>
<p>Il Servizio Push centrale (Apple, Google, ecc.)
attiva lapp Delta Chat sul tuo dispositivo
per verificare la presenza di nuovi messaggi in background.
Non conosce i dati del profilo del dispositivo che attiva.
I servizi Push centrali di Apple/Google non vedono mai alcun dato del profilo (mittente o destinatario)
e non vedono mai il contenuto dei messaggi (nemmeno in formato crittografato).</p>
</li>
</ul>
@@ -814,10 +815,10 @@ and also never see any message content (also not in encrypted forms).</p>
e si dimentica dei gettoni del dispositivo non appena Apple/Google/ecc li elabora,
di solito nel giro di pochi millisecondi.</p>
<p>Note that the device token is encrypted between apps and notification proxy
but it is not signed.
The notification proxy thus never sees profile data, IP-addresses or
any cryptographic identity information associated with a users device (token).</p>
<p>Si noti che il token del dispositivo è crittografato tra le apps e il proxy di notifica
ma non è firmato.
Il proxy di notifica, quindi, non vede mai i dati del profilo, gli indirizzi IP o
alcune informazioni crittografiche sullidentità associate al dispositivo di un utente (token).</p>
<p>Come risultato di questo disegno complessivo sulla riservatezza, anche il sequestro di un server chatmail,
o il sequestro totale del proxy di notifica centrale di Delta Chat
@@ -836,10 +837,10 @@ ma vogliamo che gli utenti sperimentino in modo affidabile la “consegna istant
come sperimentano dalle app Whatsapp, Signal o Telegram,
senza porre domande in anticipo, più adatte a utenti esperti o sviluppatori.</p>
<p>Note that Delta Chat has a <a href="#privacy-notifications">small and privacy-preserving Push Notification system</a>
that achieves “instant delivery” of messages for all chatmail servers
including a potential one <a href="https://delta.chat/chatmail#selfhosted">you might setup yourself without our permission</a>.
Welcome to the power of the interoperable chatmail relay network :)</p>
<p>Tieni presente che Delta Chat ha un <a href="#privacy-notifications">sistema di notifiche push piccolo e rispettoso della riservatezza</a>
che garantisce la “consegna istantanea” dei messaggi a tutti i server di chatmail
incluso un potenziale <a href="https://delta.chat/chatmail#selfhosted">che potresti configurare autonomamente senza il nostro permesso</a>.
Benvenuti nella potenza della rete di inoltro interoperabile di chatmail :)</p>
<h2 id="multiclient">
@@ -948,19 +949,16 @@ provate il <strong>trasferimento manuale</strong> descritto di seguito</p>
<p>Questo metodo è consigliato solo se “Aggiungi Secondo Dispositivo” come descritto sopra non funziona.</p>
<ul>
<li>Sul vecchio dispositivo, vai su “Impostazioni -&gt; Chat e Media -&gt; Backup Chat su Memoria Esterna”. Inserisci il tuo
PIN, sequenza o password di sblocco dello schermo. Quindi puoi fare clic su “Avvia
Backup”. Questo salva il file di backup sul tuo dispositivo. Ora devi trasferirlo
in qualche modo allaltro dispositivo.</li>
<li>Sul nuovo dispositivo, nella schermata di accesso, invece di accedere al tuo profilo
e-mail, seleziona “Importa backup”. Dopo limportazione, le tue conversazioni, la crittografia
i tasti e i supporti devono essere copiati sul nuovo dispositivo.</li>
<li><strong>Se usi iOS:</strong> e incontri difficoltà, forse
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">questa guida</a>
Aiutarti.</li>
<li>Ora sei sincronizzato e puoi utilizzare entrambi i dispositivi per inviare e ricevere
messaggi crittografati end-to-end con i tuoi partner di comunicazione.</li>
<li>
<p>Sul vecchio dispositivo, vai su <strong>Impostazioni → Chat e Media → Backup Chat su Memoria Esterna</strong>. Inserisci il tuo PIN, sequenza o password di sblocco dello schermo. Quindi puoi fare clic su “Avvia Backup”. Questo salva il file di backup sul tuo dispositivo. Ora devi trasferirlo in qualche modo allaltro dispositivo.</p>
</li>
<li>
<p>Sul nuovo dispositivo, nella schermata di accesso, invece di accedere al tuo profilo e-mail, seleziona <strong>Importa backup</strong>. Dopo limportazione, le tue conversazioni, la crittografia i tasti e i supporti devono essere copiati sul nuovo dispositivo.
Se usi iOS: e incontri difficoltà, forse <a href="https://support.delta.chat/t/import-backup-to-ios/1628">questa guida</a> Aiutarti.</p>
</li>
</ul>
<p>Ora sei sincronizzato e puoi utilizzare entrambi i dispositivi per inviare e ricevere messaggi crittografati end-to-end con i tuoi partner di comunicazione.</p>
<h3 id="sono-previsti-piani-per-lintroduzione-di-un-client-web-delta-chat">
@@ -989,97 +987,106 @@ o lAppImage per Linux. Le trovi su
</h2>
<h3 id="experimental-features">
<h3 id="funzionalità-sperimentali">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Funzionalità Sperimentali <a href="#funzionalità-sperimentali" class="anchor"></a>
</h3>
<p>At <strong>Settings → Advanced → Experimental Features</strong>
you can try out features we are working on.</p>
<p>In <strong>Impostazioni → Avanzate → Funzionalità Sperimentali</strong>
puoi provare le funzionalità su cui stiamo lavorando.</p>
<p>The features may be <strong>unstable</strong> and may be <strong>changed or removed</strong>.</p>
<p>Le funzionalità potrebbero essere <strong>instabili</strong> e potrebbero essere <strong>modificate o rimosse</strong>.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<p>Puoi trovare maggiori informazioni
e lasciare un riscontro nel <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
Cosa sono i ripetitori? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>I ripetitori vengono utilizzati per conservare temporaneamente i messaggi nel caso in cui il dispositivo sia offline.
I ripetitori sono server economici e poco intelligenti,
che non memorizzano dati come stati di gruppo, nome o avatar,
tutti dati che esistono solo sul dispositivo.
I ripetitori sono gestiti da gruppi e persone diverse.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>Per impostazione predefinita, dopo linstallazione, un ripetitore viene <strong>configurato automaticamente</strong>,
quindi non è necessario preoccuparsene.
Tuttavia, se lo si desidera,
è possibile configurare i ripetitori in <strong>Impostazioni → Avanzate → Ripetitori</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>Puoi <strong>aggiungere</strong> un ripetitore scansionando il suo codice QR;<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> ne mostra alcuni noti.
Se hai più ripetitori, riceverai messaggi su tutti.</p>
</li>
<li>
<p>Lopzione <strong>predefinita</strong> definisce quella a cui i tuoi partner di chat invieranno messaggi futuri.</p>
</li>
<li>
<p>Se <strong>rimuovi</strong> un ripetitore,
assicurati che un altro ripetitore predefinito sia stato utilizzato per un periodo di tempo sufficiente.
In caso contrario, i messaggi dei tuoi interlocutori di chat non ti arriveranno.In caso di dubbio, rimuovilo in seguito.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>Per maggiori dettagli e future possibilità di utilizzo dei ripetitori,
potete seguire le discussioni nel <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
<h3 id="posso-usare-un-indirizzo-email-classico-con-delta-chat">
Can I use a classic email address with Delta Chat? <a href="#can-i-use-a-classic-email-address-with-delta-chat" class="anchor"></a>
Posso usare un indirizzo email classico con Delta Chat? <a href="#posso-usare-un-indirizzo-email-classico-con-delta-chat" class="anchor"></a>
</h3>
<p>Yes, but only if the email address is used exclusively by <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
<p>Sì, ma solo se lindirizzo e-mail viene utilizzato esclusivamente dai <a href="https://chatmail.at/clients">client di chatmail</a>.</p>
<p>It is not supported to share usage of an email address with non-chatmail apps or web-based mailers,
for the following reasons:</p>
<p>Non è supportata la condivisione dellutilizzo di un indirizzo email con apps diverse dalle chatmail o con servizi di posta basati sul web,
per i seguenti motivi:</p>
<ul>
<li>
<p>Non-chatmail apps are largely not accomplishing automatic end-to-end email encryption for their users,
while chatmail apps and relays pervasively enforce end-to-end encryption and security standards.</p>
<p>Le apps non-chatmail non implementano in gran parte la crittografia end-to-end automatica delle email per i propri utenti,
mentre le app e i ripetitori di chatmail applicano in modo pervasivo la crittografia end-to-end e gli standard di sicurezza.</p>
</li>
<li>
<p>Non-chatmail apps use email servers as a long-term message archive
while chatmail clients use email servers for ephemeral instant message relay.</p>
<p>Le apps non-chatmail utilizzano i server email come archivio di messaggi a lungo termine,
mentre i client di chatmail utilizzano i server email per linoltro temporaneo di messaggi istantanei.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
would require considerable development and maintenance efforts,
and complicate making chatmail-based messaging more resilient, reliable and fast.</p>
<p>Supportare lintera gamma di configurazioni email classiche
richiederebbe notevoli sforzi di sviluppo e manutenzione
e renderebbe più complicato rendere la messaggistica basata su chatmail più resiliente, affidabile e veloce.</p>
</li>
</ul>
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
Come posso configurare un profilo chat con un indirizzo email classico come inoltro? <a href="#classic-email" class="anchor"></a>
</h3>
<p>First off, <strong>please do not use the same classic email address also from non-chatmail classic email apps</strong>
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>Innanzitutto, <strong>ti preghiamo di non utilizzare lo stesso indirizzo email classico anche da apps email classiche diverse da chatmail</strong>
a meno che tu non sia disposto ad affrontare messaggi crittografati nella posta in arrivo,
doppie notifiche, email eliminate accidentalmente o fastidi simili.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Relay</strong>.
Note that classic email providers will generally not support <a href="#instant-delivery">Push Notifications</a>
and have other limitations, see <a href="https://providers.delta.chat">Provider Overview</a>.
Chatmail uses the default INBOX for relay; ensure the provider setup does too.
A chat profile using a classic email address allows to to send and receive unencrypted messages.
These messages, and the chats they appear in, are marked with an email icon
<p>Puoi configurare un indirizzo email per la chat in <strong>Crea Nuovo Profilo → Usa Altro Server → Accesso E-Mail Classico come inoltro</strong>.
Tieni presente che i fornitori email classici generalmente non supportano le <a href="#instant-delivery">Notifiche Push</a>
e presentano altre limitazioni, consulta <a href="https://providers.delta.chat">Panoramica Fornitori</a>.
Chatmail utilizza la POSTA IN ARRIVO predefinita per gli inoltri; assicurati che anche la configurazione del fornitore la faccia.
Un profilo chat che utilizza un indirizzo email classico consente di inviare e ricevere messaggi non crittografati.
Questi messaggi e le chat in cui compaiono sono contrassegnati da unicona email.
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
<h3 id="vorrei-gestire-il-mio-server-per-delta-chat-cosa-mi-consigliate">
@@ -1090,13 +1097,47 @@ These messages, and the chats they appear in, are marked with an email icon
</h3>
<p>Any well behaving email server setup will do fine
except if your users devices require Google/Apple <a href="#instant-delivery">Push Notifications</a> to work properly.</p>
<p>Qualsiasi configurazione di server email funzionante andrà bene,
a meno che i dispositivi dei tuoi utenti non richiedano le <a href="#instant-delivery">Notifiche Push</a> di Google/Apple per funzionare correttamente.</p>
<p>We generally recommend to <a href="https://chatmail.at/doc/relay/getting_started.html">set up a chatmail relay</a>.
<a href="https://chatmail.at">Chatmail</a> is a community-driven project that encompasses both the setup of relays
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<p>Generalmente consigliamo di <a href="https://chatmail.at/doc/relay/getting_started.html">configurare un ripetitore di chatmail</a>.
<a href="https://chatmail.at">Chatmail</a> è un progetto guidato dalla comunità che comprende sia la configurazione dei ripetitori
sia <a href="https://github.com/chatmail/core">gli sviluppi principali in Rust</a>
che alimentano i <a href="https://chatmail.at/clients">client di chatmail</a>, di cui Delta Chat è il più noto.</p>
<h3 id="statssending">
Che cosa significa “Invia statistiche agli sviluppatori di Delta Chat”? <a href="#statssending" class="anchor"></a>
</h3>
<p>Vorremmo migliorare Delta Chat con il tuo aiuto,
ecco perché Delta Chat per Android ti chiede se desideri
inviare statistiche di utilizzo anonime.</p>
<p>Puoi attivarla e disattivarla da
<strong>Impostazioni → Avanzate → Invia statistiche agli sviluppatori di Delta Chat</strong>.</p>
<p>Quando lo attivi,
statistiche settimanali verranno inviate automaticamente a un bot.</p>
<p>Siamo interessati, ad esempio, a statistiche come:</p>
<ul>
<li>
<p>Quanti contatti vengono introdotti tramite la scansione personale di un codice QR?</p>
</li>
<li>
<p>Quali versioni di Delta Chat vengono utilizzate?</p>
</li>
<li>
<p>Quali errori si verificano per gli utenti?</p>
</li>
</ul>
<p><em>Non</em> raccoglieremo alcuna informazione personale identificabile su di te.</p>
<h3 id="sono-interessato-ai-dettagli-tecnici-mi-puoi-dire-di-più">
@@ -1150,7 +1191,7 @@ consente ai destinatari di utilizzare la crittografia end-to-end con il contatto
<h3 id="whene2e">
How can I know if messages are end-to-end encrypted? <a href="#whene2e" class="anchor"></a>
Come posso sapere se i messaggi sono crittografati end-to-end? <a href="#whene2e" class="anchor"></a>
</h3>
@@ -1159,10 +1200,10 @@ consente ai destinatari di utilizzare la crittografia end-to-end con il contatto
Dalla serie di rilasci della Versione 2 di Delta Chat (Luglio 2025)
non ci sono più lucchetti o marcatori simili, sui messaggi crittografati end-to-end.</p>
<h3 id="can-i-still-receive-or-send-messages-without-end-to-end-encryption">
<h3 id="posso-ancora-ricevere-o-inviare-messaggi-senza-crittografia-end-to-end">
Can I still receive or send messages without end-to-end encryption? <a href="#can-i-still-receive-or-send-messages-without-end-to-end-encryption" class="anchor"></a>
Posso ancora ricevere o inviare messaggi senza crittografia end-to-end? <a href="#posso-ancora-ricevere-o-inviare-messaggi-senza-crittografia-end-to-end" class="anchor"></a>
</h3>
@@ -1170,9 +1211,9 @@ non ci sono più lucchetti o marcatori simili, sui messaggi crittografati end-to
<p>Se si utilizzano i <a href="https://chatmail.at/relays">relays di chatmail</a>,
è impossibile ricevere o inviare messaggi senza la crittografia end-to-end.</p>
<p>If you instead use a <a href="#classic-email">classic email server</a>,
you can send and receive messages with or without end-to-end encryption.
Messages lacking end-to-end encryption are marked with an email icon
<p>Se invece utilizzi un <a href="#classic-email">server email classico</a>,
puoi inviare e ricevere messaggi con o senza crittografia end-to-end.
I messaggi privi di crittografia end-to-end sono contrassegnati dallicona di une-mail
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
<h3 id="e2eeguarantee">
@@ -1247,10 +1288,10 @@ per migliorare ulteriormente le caratteristiche di sicurezza implementando il
</h3>
<p>Yes, we are following efforts like <a href="https://en.wikipedia.org/wiki/Messaging_Layer_Security">MLS</a>
but adopting them would mean breaking end-to-end encryption interoperability.
So it would not be a light decision to take
and there must be tangible improvements for users.</p>
<p>Sì, stiamo seguendo iniziative come <a href="https://en.wikipedia.org/wiki/Messaging_Layer_Security">MLS</a>
ma adottarle significherebbe interrompere linteroperabilità della crittografia end-to-end.
Quindi non sarebbe una decisione facile da prendere
e devono esserci miglioramenti tangibili per gli utenti.</p>
<p>Delta Chat adotta un approccio olistico di “sicurezza utilizzabile”.
e lavora anche con una vasta gamma di gruppi di attivisti
@@ -1288,21 +1329,21 @@ come definito dalla specifica Autocrypt Level 1.</p>
</h3>
<p>If you are sending or receiving email messages without end-to-end encryption (using a classic email server),
they are still protected from cell or cable companies who can not read or modify your email messages.
But both your and your recipients email providers
may read, analyze or modify your messages, including any attachments.</p>
<p>Se invii o ricevi messaggi email senza crittografia end-to-end (utilizzando un server email classico),
questi sono comunque protetti dalle compagnie telefoniche o via cavo che non possono leggere o modificare i tuoi messaggi.
Tuttavia, sia il tuo fornitore email che quello del destinatario
potrebbero leggere, analizzare o modificare i tuoi messaggi, inclusi eventuali allegati.</p>
<p>Delta Chat by default uses strict
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS encryption</a>
which secures connections between your device and your email provider.
All of Delta Chats TLS-handling has been independently <a href="#security-audits">security audited</a>.
Moreover, the connection between your and the recipients email provider
will typically be transport-encrypted as well.
If the involved email servers support <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a>
then transport encryption will be enforced between email providers
in which case Delta Chat communications will never be exposed in cleartext to the Internet
even if the message was not end-to-end encrypted.</p>
<p>Delta Chat utilizza per impostazione predefinita una rigorosa
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">crittografia TLS</a>
che protegge le connessioni tra il tuo dispositivo e il tuo fornitore email.
Tutta la gestione TLS di Delta Chat è stata sottoposta a <a href="#security-audits">verifica di sicurezza</a> indipendenti.
Inoltre, anche la connessione tra il tuo fornitore email e quello del destinatario
sarà in genere crittografata tramite trasporto.
Se i server email coinvolti supportano <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a>
la crittografia tramite trasporto verrà applicata tra i fornitori email,
nel qual caso le comunicazioni di Delta Chat non saranno mai esposte in chiaro su Internet,
anche se il messaggio non è stato crittografato end-to-end.</p>
<h3 id="message-metadata">
@@ -1316,14 +1357,14 @@ even if the message was not end-to-end encrypted.</p>
le apps Delta Chat non memorizzano alcun metadato sui contatti o sui gruppi sui server, né in forma crittografata.
Tutti i metadati dei gruppi sono invece crittografati end-to-end e memorizzati esclusivamente sui dispositivi degli utenti finali.</p>
<p>Servers can therefore only see:</p>
<p>I server possono quindi vedere solo:</p>
<ul>
<li>the sender and receiver addresses</li>
<li>and the message size.</li>
<li>gli indirizzi del mittente e del destinatario</li>
<li>e la dimensione del messaggio.</li>
</ul>
<p>By default, the addresses are randomly generated.</p>
<p>Per impostazione predefinita, gli indirizzi vengono generati in modo casuale.</p>
<p>Tutti gli altri metadati dei messaggi, dei contatti e dei gruppi risiedono nella parte crittografata end-to-end dei messaggi.</p>
@@ -1335,15 +1376,15 @@ Tutti i metadati dei gruppi sono invece crittografati end-to-end e memorizzati e
</h3>
<p>Both for protecting against metadata-collecting servers
as well as against the threat of device seizure
we recommend to use a <a href="https://chatmail.at/relays">chatmail relay</a>
to create chat profiles using random addresses for transport.
Note that Delta Chat apps on all platforms support multiple profiles
so you can easily use situation-specific profiles next to your “main” profile
with the knowledge that all their data, along with all metadata, will be deleted.
Moreover, if a device is seized then chat contacts using short-lived profiles
can not be identified easily.</p>
<p>Sia per proteggersi dai server che raccolgono metadati
sia dal rischio di sequestro del dispositivo,
consigliamo di utilizzare un <a href="https://chatmail.at/relays">ripetitore chatmail</a>
per creare profili di chat utilizzando indirizzi casuali per il trasporto.
Nota: le app Delta Chat su tutte le piattaforme supportano più profili,
quindi puoi facilmente utilizzare profili specifici per ogni situazione accanto al tuo profilo “principale”,
con la consapevolezza che tutti i loro dati, insieme a tutti i metadati, verranno eliminati.
Inoltre, se un dispositivo viene sequestrato, i contatti di chat che utilizzano profili di breve durata
non possono essere identificati facilmente.</p>
<h3 id="sealedsender">
@@ -1360,11 +1401,11 @@ per impedire che la propria infrastruttura server venga a conoscenza di chi sta
È particolarmente importante perché il server Signal conosce il numero di cellulare di ciascun profilo,
che di solito è associato a unidentità tramite passaporto.</p>
<p>Even if <a href="https://chatmail.at/relays">chatmail relays</a>
do not ask for any private data (including no phone numbers),
it might still be worthwhile to protect relational metadata between addresses.
We dont foresee bigger problems in using random throw-away addresses for sealed sending
but an implementation has not been agreed as a priority yet.</p>
<p>Anche se i <a href="https://chatmail.at/relays">ripetitori chatmail</a>
non richiedono dati privati (inclusi numeri di telefono),
potrebbe comunque valere la pena proteggere i metadati relazionali tra gli indirizzi.
Non prevediamo problemi maggiori nellutilizzo di indirizzi casuali usa e getta per linvio sigillato,
ma unimplementazione non è stata ancora concordata come priorità.</p>
<h3 id="pfs">
@@ -1431,12 +1472,12 @@ la connessione è sicura.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
We do not recommend or offer users to perform manual key management.
We want to ensure that security audits can focus on a few proven cryptographic algorithms
instead of the full breadth of possible algorithms allowed with OpenPGP.
If you want to extract your OpenPGP key, there only is an expert method:
you need to look it up in the “keypairs” SQLite table of a profile backup tar-file.</p>
<p>Delta Chat genera chiavi OpenPGP sicure secondo la specifica Autocrypt 1.1.
Non consigliamo né offriamo agli utenti la gestione manuale delle chiavi.
Vogliamo garantire che le revisioni di sicurezza possano concentrarsi su pochi algoritmi crittografici collaudati
anziché sullintera gamma di possibili algoritmi consentiti con OpenPGP.
Se si desidera estrarre la propria chiave OpenPGP, esiste solo un metodo avanzato:
è necessario cercarla nella tabella SQLite “keypairs” di un file tar di backup del profilo.</p>
<h3 id="security-audits">
@@ -1474,7 +1515,7 @@ Consulta il nostro post sul blog su <a href="https://delta.chat/en/2024-03-25-cr
articolo di ricerca pubblicato successivamente.</p>
</li>
<li>
<p>A partire dal 2023, abbiamo risolto i problemi di sicurezza e privacy con il servizio “web
<p>A partire dal 2023, abbiamo risolto i problemi di sicurezza e riservatezza con il servizio “web
app condivise in una chat”, relativa ai guasti del sandboxing
soprattutto con Chromium. Successivamente abbiamo ottenuto una sicurezza indipendente
audit da Cure53 e tutti i problemi rilevati sono stati risolti nella serie di app 1.36 rilasciata nellaprile 2023.
@@ -1531,10 +1572,10 @@ Puoi leggere il <a href="https://delta.chat/assets/blog/2019-first-security-revi
</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>Alcune funzionalità richiedono determinate autorizzazioni,
ad esempio, è necessario concedere lautorizzazione alla fotocamera se si desidera <a href="#howtoe2ee">scansionare un codice QR di invito</a>.</p>
<p>See <a href="https://delta.chat/en/gdpr#24-app-permissions">Privacy Policy</a> for a detailed overview.</p>
<p>Per una panoramica dettagliata, consultare l <a href="https://delta.chat/en/gdpr#24-app-permissions">Informativa sulla riservatezza</a>.</p>
<h3 id="dove-possono-trovare-delta-chat-i-miei-amici">
@@ -1554,8 +1595,8 @@ e.g. you need to grant camera permission if you want to <a href="#howtoe2ee">sca
<p>Se non disponibile, utilizzare <strong>mirror</strong> su <a href="https://deltachat.github.io/deltachat-pages">https://deltachat.github.io/deltachat-pages</a></p>
</li>
<li>
<p>Open one of the following <strong>app stores and search for “Delta Chat”:</strong>
Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microsoft Store</p>
<p>Apri uno dei seguenti <strong>app stores e cerca “Delta Chat”:</strong>
Google Play Store, F-Droid, Huawei App Gallery, iOS e macOS App Store, Microsoft Store</p>
</li>
<li>
<p>Controlla il <strong>gestore pacchetti</strong> delle tue distribuzioni Linux</p>
@@ -1605,15 +1646,13 @@ per fornire nuove funzionalità per tutte le piattaforme.</p>
completando i collegamenti Rust/Python e avviando un ecosistema Chat-bot.</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>
<p>Nel 2021 abbiamo ricevuto ulteriori finanziamenti dallUE 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>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>Da fine 2021 a marzo 2023 abbiamo ricevuto un finanziamento <em>Internet Freedom</em> (500.000 USD) dallUfficio 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 unampia gamma di server email in tutto il mondo, e più resiliente e sicura
in luoghi spesso colpiti da censura e blocchi di Internet.</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,
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">Ik wil graag meer weten over de gebruikte technieken. Waar kan ik meer informatie vinden?</a></li>
</ul>
</li>
@@ -947,22 +948,21 @@ volg dan onderstaande stappen omtrent handmatige overzetting</p>
<p>Deze methode is vooral bedoeld voor situaties waarin Tweede apparaat toevoegen niet lukt.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="bestaan-er-plannen-om-een-delta-chat-webclient-te-maken">
@@ -1007,33 +1007,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1100,6 +1111,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">
+71 -23
View File
@@ -55,10 +55,11 @@
<li><a href="#zaawansowane">Zaawansowane</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#chcę-zarządzać-własnym-serwerem-dla-delta-chat-co-polecacie">Chcę zarządzać własnym serwerem dla Delta Chat. Co polecacie?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#interesują-mnie-szczegóły-techniczne-możesz-powiedzieć-mi-coś-więcej">Interesują mnie szczegóły techniczne. Możesz powiedzieć mi coś więcej?</a></li>
</ul>
</li>
@@ -877,14 +878,16 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>Ta metoda jest zalecana tylko wtedy, gdy opisana powyżej opcja „Dodaj kolejne urządzenie” nie działa.</p>
<ul>
<li>Na starym urządzeniu przejdź do „Ustawienia » Czaty i media » Eksport kopii zapasowej”. Wprowadź swój PIN odblokowania ekranu, wzór lub hasło. Następnie możesz nacisnąć „Utwórz kopię”. Spowoduje to zapisanie pliku kopii zapasowej na urządzeniu. Teraz musisz jakoś przenieść go na inne urządzenie.</li>
<li>Na nowym urządzeniu, na ekranie logowania, zamiast logować się na swoje konto e-mail, wybierz „Przywróć z kopii zapasowej”. Po zaimportowaniu Twoje rozmowy, klucze szyfrujące i multimedia powinny zostać skopiowane na nowe urządzenie.
<ul>
<li><strong>Jeśli korzystasz z iOS</strong> i napotykasz trudności, może <a href="https://support.delta.chat/t/import-backup-to-ios/1628">ten poradnik</a> Ci pomoże.</li>
</ul>
<li>
<p>Na starym urządzeniu przejdź do <strong>Ustawienia → Czaty i media → Eksport kopii zapasowej</strong>. Wprowadź swój PIN odblokowania ekranu, wzór lub hasło. Następnie możesz nacisnąć „Utwórz kopię”. Spowoduje to zapisanie pliku kopii zapasowej na urządzeniu. Teraz musisz jakoś przenieść go na inne urządzenie.</p>
</li>
<li>
<p>Na nowym urządzeniu, na ekranie logowania, zamiast logować się na swoje konto e-mail, wybierz <strong>Przywróć z kopii zapasowej</strong>. Po zaimportowaniu Twoje rozmowy, klucze szyfrujące i multimedia powinny zostać skopiowane na nowe urządzenie.
Jeśli korzystasz z iOS i napotykasz trudności, może <a href="https://support.delta.chat/t/import-backup-to-ios/1628">ten poradnik</a> Ci pomoże.</p>
</li>
<li>Jesteś teraz zsynchronizowany i możesz używać obu urządzeń do wysyłania i odbierania wiadomości zaszyfrowanych end-to-end w komunikacji ze swoimi partnerami.</li>
</ul>
<p>Jesteś teraz zsynchronizowany i możesz używać obu urządzeń do wysyłania i odbierania wiadomości zaszyfrowanych end-to-end w komunikacji ze swoimi partnerami.</p>
<h3 id="czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">
@@ -924,33 +927,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1017,6 +1031,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="interesują-mnie-szczegóły-techniczne-możesz-powiedzieć-mi-coś-więcej">
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#estou-interessado-nos-detalhes-técnicos-pode-me-dizer-mais">Estou interessado nos detalhes técnicos. Pode me dizer mais?</a></li>
</ul>
</li>
@@ -945,22 +946,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="existe-algum-plano-para-a-introdução-de-um-cliente-web-para-delta-chat">
@@ -1005,33 +1005,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1098,6 +1109,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="estou-interessado-nos-detalhes-técnicos-pode-me-dizer-mais">
+82 -37
View File
@@ -55,10 +55,11 @@
<li><a href="#расширенные">Расширенные</a>
<ul>
<li><a href="#экспериментальные-функции">Экспериментальные функции</a></li>
<li><a href="#statssending">Что означает “Отправлять статистику разработчикам Delta Chat”?</a></li>
<li><a href="#relays">Что такое релеи chatmail?</a></li>
<li><a href="#могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat">Могу ли я использовать обычный адрес электронной почты с Delta Chat?</a></li>
<li><a href="#classic-email">Как настроить профиль чата с использованием классического адреса электронной почты в качестве транспорта?</a></li>
<li><a href="#classic-email">Как настроить профиль чата с использованием классического адреса электронной почты в качестве релея?</a></li>
<li><a href="#я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете">Я хочу управлять своим собственным сервером для Delta Chat. Что вы посоветуете?</a></li>
<li><a href="#statssending">Что означает “Отправлять статистику разработчикам Delta Chat”?</a></li>
<li><a href="#меня-интересуют-технические-детали-можете-рассказать-больше">Меня интересуют технические детали. Можете рассказать больше?</a></li>
</ul>
</li>
@@ -643,7 +644,7 @@
<p>Встроенные приложения не могут отправлять данные в Интернет или что-либо загружать.</p>
</li>
<li>
<p>Встроенное приложение может обмениваться данными только внутри чата Delta Chat с его
<p>Встроенное приложение может обмениваться данными только в рамках этого чата с его
копиями на устройствах ваших собеседников. В остальном оно полностью
изолировано от Интернета.</p>
</li>
@@ -941,22 +942,21 @@ Push-уведомления автоматически активируются
<p>Этот метод рекомендуется использовать только в том случае, если функция “Добавить второе устройство”, описанная выше, не работает.</p>
<ul>
<li>На старом устройстве, перейдите в “Настройки -&gt; Чаты и медиафайлы -&gt; Экспорт резервной копии”. Введите свой
PIN-код разблокировки экрана, графический ключ или пароль. Затем вы можете нажать “Начать
<li>
<p>На старом устройстве перейдите в <strong>Настройки → Чаты → Экспорт резервной копии</strong>. Введите свой
PIN-код разблокировки экрана, графический ключ или пароль. Затем нажмите на кнопку “Начать
резервное копирование”. Это сохранит файл резервной копии на вашем устройстве. Теперь вам нужно передать
его на другое устройство каким-то образом.</li>
<li>На новом устройстве, в меню “У меня уже есть профиль”,
выберите “Восстановить из резервной копии”. После импорта, ваши чаты, ключи
шифрования, медиафайлы будут скопированы на новое устройство.
<ul>
<li><strong>Если вы используете iOS:</strong> и у вас возникли трудности, возможно,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">это руководство</a>
поможет вам.</li>
</ul>
его на другое устройство каким-то образом.</p>
</li>
<li>
<p>На новом устройстве выберите <strong>У меня уже есть профиль → Восстановить из резервной копии</strong>.
Если вы используете iOS: и у вас возникли трудности,
возможно, <a href="https://support.delta.chat/t/import-backup-to-ios/1628">это руководство</a> поможет вам.</p>
</li>
<li>Теперь вы синхронизированы и можете использовать оба устройства для отправки и получения
зашифрованных сквозным шифрованием сообщений с вашими собеседниками.</li>
</ul>
<p>Теперь вы синхронизированы и можете использовать оба устройства для отправки и получения
зашифрованных сквозным шифрованием сообщений с вашими собеседниками.</p>
<h3 id="есть-ли-какие-либо-планы-по-внедрению-веб-клиента-delta-chat">
@@ -1001,33 +1001,44 @@ PIN-код разблокировки экрана, графический кл
<p>Вы можете найти дополнительную информацию
и оставить отзыв на <a href="https://support.delta.chat">Форуме</a>.</p>
<h3 id="statssending">
<h3 id="relays">
Что означает “Отправлять статистику разработчикам Delta Chat”? <a href="#statssending" class="anchor"></a>
Что такое релеи chatmail? <a href="#relays" class="anchor"></a>
</h3>
<p>Мы хотели бы улучшить Delta Chat с вашей помощью,
поэтому Delta Chat для Android спрашивает, хотите ли вы
отправлять анонимную статистику использования.</p>
<p>Релеи используются для временного хранения сообщений, если ваше устройство не в сети.
Релеи - это недорогие и простые серверы,
которые не хранят данные о статусах групп, вашем имени или аватаре, -
всё это существует только на вашем устройстве.
Релеи управляются разными группами и людьми.</p>
<p>Вы можете включить или отключить эту функцию
в разделе <strong>Настройки → Дополнительно → Отправить статистику разработчикам Delta Chat</strong>.</p>
<p>При включении
еженедельная статистика будет автоматически отправляться боту.</p>
<p>Нас интересует, например, следующая статистика:</p>
<p>По умолчанию, после установки, релей <strong>настраивается автоматически</strong>,
поэтому вам не нужно об этом волноваться.
Однако, если хотите,
вы можете настроить релеи в <strong>Настройки → Дополнительно → Релеи</strong>:</p>
<ul>
<li>Сколько контактов добавляется путём личного сканирования QR-кода?</li>
<li>Какие версии Delta Chat используются?</li>
<li>Сколько сообщений в незашифрованном виде?</li>
<li>
<p>Вы можете <strong>добавить</strong> релей, отсканировав его QR-код;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> содержит список известных релеев.
Если у вас несколько релеев, вы будете получать сообщения на все из них.</p>
</li>
<li>
<p><strong>По умолчанию</strong> определяет релей, на который ваши собеседники будут отправлять будущие сообщения.</p>
</li>
<li>
<p>Если вы <strong>удаляете</strong> релей,
убедитесь, что другой релей по умолчанию использовался в течение достаточного количества времени.
В противном случае сообщения от ваших собеседников не будут доходить до вас.
Если сомневаетесь, удалите его позже.</p>
</li>
</ul>
<p>Мы <em>не</em> собираем какую-либо информацию, позволяющую идентифицировать вас лично.</p>
<p>Для получения более подробной информации и ознакомления с будущими возможностями релеев,
вы можете следить за обсуждениями на <a href="https://support.delta.chat">Форуме</a>.</p>
<h3 id="могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat">
@@ -1049,7 +1060,7 @@ PIN-код разблокировки экрана, графический кл
</li>
<li>
<p>Приложения, не являющиеся клиентами chatmail, используют серверы электронной почты в качестве долгосрочного архива сообщений,
тогда как клиенты chatmail используют почтовые серверы для передачи мгновенных сообщений с коротким сроком жизни.</p>
тогда как клиенты chatmail используют их как релей для мгновенной пересылки сообщений.</p>
</li>
<li>
<p>Поддержка всего разнообразия классических настроек электронной почты
@@ -1061,7 +1072,7 @@ PIN-код разблокировки экрана, графический кл
<h3 id="classic-email">
Как настроить профиль чата с использованием классического адреса электронной почты в качестве транспорта? <a href="#classic-email" class="anchor"></a>
Как настроить профиль чата с использованием классического адреса электронной почты в качестве релея? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1070,10 +1081,10 @@ PIN-код разблокировки экрана, графический кл
если вы не готовы к зашифрованным сообщениям во входящих,
двойным уведомлениям, случайному удалению писем или подобным неудобствам.</p>
<p>Вы можете настроить адрес электронной почты для чата в разделе <strong>Новый профиль → Использовать другой сервер → Использовать классическую почту в качестве транспорта</strong>.
Обратите внимание, что классические почтовые провайдеры обычно не поддерживают <a href="#instant-delivery">Push-уведомления</a>
<p>Вы можете настроить адрес электронной почты для чата в разделе <strong>Новый профиль → Использовать другой сервер → Использовать электронную почту как релей</strong>.
Обратите внимание, что провайдеры классической почты обычно не поддерживают <a href="#instant-delivery">Push-уведомления</a>
и имеют другие ограничения, см. раздел <a href="https://providers.delta.chat">Обзор провайдеров</a>.
Chatmail использует INBOX по умолчанию для ретрансляции; убедитесь, что провайдер также настроен.
Chatmail использует INBOX по умолчанию для ретрансляции; убедитесь, что настройки провайдера этому соответствуют.
Профиль чата, использующий классический адрес электронной почты, позволяет отправлять и получать незашифрованные сообщения.
Эти сообщения и чаты, в которых они появляются, помечаются значком электронной почты
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
@@ -1093,6 +1104,40 @@ Chatmail использует INBOX по умолчанию для ретран
и <a href="https://github.com/chatmail/core">основные разработки на Rust</a>
которые обеспечивают работу <a href="https://chatmail.at/clients">клиентов chatmail</a> наиболее известным из которых является Delta Chat.</p>
<h3 id="statssending">
Что означает “Отправлять статистику разработчикам Delta Chat”? <a href="#statssending" class="anchor"></a>
</h3>
<p>Мы хотели бы улучшить Delta Chat с вашей помощью,
поэтому Delta Chat для Android спрашивает, хотите ли вы
отправлять анонимную статистику использования.</p>
<p>Вы можете включить или отключить эту функцию
в разделе <strong>Настройки → Дополнительно → Отправить статистику разработчикам Delta Chat</strong>.</p>
<p>При включении
еженедельная статистика будет автоматически отправляться боту.</p>
<p>Нас интересует, например, следующая статистика:</p>
<ul>
<li>
<p>Сколько контактов можно добавить ручным сканированием QR-кода?</p>
</li>
<li>
<p>Какие версии Delta Chat используются?</p>
</li>
<li>
<p>Какие ошибки возникают у пользователей?</p>
</li>
</ul>
<p>Мы <em>не</em> собираем какую-либо информацию, позволяющую идентифицировать вас лично.</p>
<h3 id="меня-интересуют-технические-детали-можете-рассказать-больше">
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">Zaujímajú ma technické detaily. Môžete mi povedať viac?</a></li>
</ul>
</li>
@@ -949,22 +950,21 @@ try the <strong>manual transfer</strong> described below</p>
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="máte-nejaké-plány-na-zavedenie-webového-klienta-delta-chat">
@@ -1009,33 +1009,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1102,6 +1113,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">
+74 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">Më interesojnë hollësitë teknike. Mund të më tregoni diçka më tepër?</a></li>
</ul>
</li>
@@ -951,22 +952,21 @@ provoni <strong>shpërnguljen dorazi</strong> të përshkruar më poshtë</p>
<p>Kjo metodë rekomandohet vetëm nëse “Shtoni Pajisje të Dytë” si përshkruhet më sipër sfunksionon.</p>
<ul>
<li>On the old device, go to “Settings -&gt; Chats and media -&gt; Export Backup”. Enter your
<li>
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
screen unlock PIN, pattern, or password. Then you can click on “Start
Backup”. This saves the backup file to your device. Now you have to transfer
it to the other device somehow.</li>
<li>On the new device, in the “I already have a profile” menu,
choose “restore from backup”. After import, your conversations, encryption
keys, and media should be copied to the new device.
<ul>
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
help you.</li>
</ul>
it to the other device somehow.</p>
</li>
<li>
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
If you use iOS and encounter difficulties,
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
</li>
<li>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</li>
</ul>
<p>You are now synchronized, and can use both devices for sending and receiving
end-to-end encrypted messages with your communication partners.</p>
<h3 id="a-ka-ndonjë-plan-për-të-sjellë-një-klient-web-delta-chat">
@@ -1013,33 +1013,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1106,6 +1117,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">
+72 -35
View File
@@ -54,10 +54,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#експериментальні-функції">Експериментальні функції</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте">Я хочу керувати власним сервером для Delta Chat. Що ви порекомендуєте?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#мене-цікавлять-технічні-деталі-можете-розповісти-більше">Мене цікавлять технічні деталі. Можете розповісти більше?</a></li>
</ul>
</li>
@@ -872,11 +873,14 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>Цей спосіб рекомендований, лише якщо «Додати другий пристрій», як описано вище, не працює.</p>
<ul>
<li>На старому пристрої перейдіть до “Налаштування -&gt; Чати та медіа -&gt; Експортувати резервну копію”. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</li>
<li>На новому пристрої в меню “У мене вже є профіль” виберіть “Відновити з резервної копії”. Після імпорту ваші розмови, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.</li>
<li>Якщо ви користуєтеся iOS:** і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
<li>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізних зашифрованих повідомлень зі своїми партнерами по спілкуванню.</li>
<li>
<p>На старому пристрої перейдіть до <strong>Налаштування → Чати та медіа → Експортувати резервну копію</strong>. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</p>
</li>
<li>На новому пристрої в меню <strong>У мене вже є профіль</strong> виберіть <strong>Відновити з резервної копії</strong>. Після імпорту ваші розмови, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.</li>
<li>Якщо ви користуєтеся iOS: і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
</ul>
<p>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізних зашифрованих повідомлень зі своїми партнерами по спілкуванню.</p>
<h3 id="чи-планується-впровадження-веб-клієнта-delta-chat">
@@ -916,33 +920,44 @@ you can try out features we are working on.</p>
<p>Ви можете знайти додаткову інформацію
та залишити відгук на <a href="https://support.delta.chat">форумі</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>Коли Ви увімкнете цю функцію,
щотижнева статистика буде автоматично надсилатися боту.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>Ми <em>не</em> будемо збирати жодних персональних даних, які б могли ідентифікувати Вас особисто.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1009,6 +1024,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>Коли Ви увімкнете цю функцію,
щотижнева статистика буде автоматично надсилатися боту.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>Ми <em>не</em> будемо збирати жодних персональних даних, які б могли ідентифікувати Вас особисто.</p>
<h3 id="мене-цікавлять-технічні-деталі-можете-розповісти-більше">
@@ -1154,21 +1203,9 @@ and there must be tangible improvements for users.</p>
</h3>
<p>If you are sending or receiving email messages without end-to-end encryption (using a classic email server),
they are still protected from cell or cable companies who can not read or modify your email messages.
But both your and your recipients email providers
may read, analyze or modify your messages, including any attachments.</p>
<p>Якщо ви надсилаєте або отримуєте електронні листи без наскрізного шифрування (використовуючи класичний сервер електронної пошти), вони все одно захищені від мобільних або кабельних компаній, які не можуть читати чи змінювати ваші повідомлення. Однак як ваш, так і поштовий провайдер одержувача можуть читати, аналізувати або змінювати ваші листи, включаючи будь-які вкладення.</p>
<p>Delta Chat by default uses strict
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS encryption</a>
which secures connections between your device and your email provider.
All of Delta Chats TLS-handling has been independently <a href="#security-audits">security audited</a>.
Moreover, the connection between your and the recipients email provider
will typically be transport-encrypted as well.
If the involved email servers support <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a>
then transport encryption will be enforced between email providers
in which case Delta Chat communications will never be exposed in cleartext to the Internet
even if the message was not end-to-end encrypted.</p>
<p>За замовчуванням Delta Chat використовує суворе <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS-шифрування</a> яке захищає з’єднання між вашим пристроєм і провайдером електронної пошти. Вся робота з TLS-шифруванням Delta Chat пройшла незалежний <a href="#security-audits">аудит безпеки</a>. Крім того, з’єднання між вашим провайдером та провайдером електронної пошти одержувача зазвичай також шифрується при передачі даних. Якщо задіяні поштові сервери підтримують <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a> то між провайдерами електронної пошти буде застосовуватися транспортне шифрування в цьому випадку повідомлення Delta Chat ніколи не будуть доступні в Інтернеті у вигляді відкритого тексту навіть якщо повідомлення не було наскрізь зашифровано.</p>
<h3 id="message-metadata">
+72 -29
View File
@@ -55,10 +55,11 @@
<li><a href="#advanced">Advanced</a>
<ul>
<li><a href="#experimental-features">Experimental Features</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#relays">What are Relays?</a></li>
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
<li><a href="#statssending">What is “Send statistics to Delta Chats developers”?</a></li>
<li><a href="#我对技术细节很感兴趣能告诉我更多吗">我对技术细节很感兴趣。能告诉我更多吗?</a></li>
</ul>
</li>
@@ -933,19 +934,16 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>仅当上述“添加第二台设备”方法不起作用时,才建议使用此方法。</p>
<ul>
<li>在旧设备上,转到“设置 -&gt; 聊天和媒体 -&gt; 导出备份”。 输入你的
屏幕解锁 PIN 码、图案或密码。 然后你可以点击“开始
备份”。 这会将备份文件保存到你的设备。 现在你必须
以某种方式将其传输到另一台设备。</li>
<li>在新设备上,在“我已经有一个配置文件”菜单中,
选择“从备份还原”。 导入后,你的对话、加密
密钥和媒体应复制到新设备。</li>
<li><strong>如果你使用 iOS</strong> 并且你遇到困难,也许
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">本指南</a>
帮助你。</li>
<li>你现在已同步,并且可以使用两台设备与你的通信伙伴发送和接收
端到端加密消息。</li>
<li>
<p>在旧设备上,转到“设置 -&gt; 聊天和媒体 -&gt; 导出备份”。 输入你的 屏幕解锁 PIN 码、图案或密码。 然后你可以点击“开始 备份”。 这会将备份文件保存到你的设备。 现在你必须 以某种方式将其传输到另一台设备。</p>
</li>
<li>
<p>在新设备上,在“我已经有一个配置文件”菜单中,选择“从备份还原”。 导入后,你的对话、加密 密钥和媒体应复制到新设备。
如果你使用 iOS: 并且你遇到困难,也许 <a href="https://support.delta.chat/t/import-backup-to-ios/1628">本指南</a> 将 帮助你。</p>
</li>
</ul>
<p>你现在已同步,并且可以使用两台设备与你的通信伙伴发送和接收 端到端加密消息。</p>
<h3 id="有推出-delta-chat-web-客户端的计划吗">
@@ -985,33 +983,44 @@ you can try out features we are working on.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="statssending">
<h3 id="relays">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
What are Relays? <a href="#relays" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>Relays are used to temporarily hold messages in case your device is offline.
Relays are cheap and dumb servers,
that do not store data as group states, your name or avatar -
all that exist only on your device.
Relays are operated by different groups and people.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
so you do not need to care about that.
However, if you want to,
you can configure relays at At <strong>Settings → Advanced → Relays</strong>:</p>
<ul>
<li>How many contacts are introduced by personally scanning a QR code?</li>
<li>Which versions of Delta Chat are being used?</li>
<li>How many messages are unencrypted?</li>
<li>
<p>You can <strong>add</strong> a relay by scanning its QR code;
<a href="https://chatmail.at/relays">https://chatmail.at/relays</a> shows some known ones.
If you have multiple relays, your will receive messages on all of them.</p>
</li>
<li>
<p>The <strong>default</strong> defines the one where your chat partners send future messages to.</p>
</li>
<li>
<p>If you <strong>remove</strong> a relay,
make sure another default relay was used for a sufficient amount of time.
Otherwise, messages from your chat partners wont reach you.
If in doubt, remove later.</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>For more details and future possibilities of relays,
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
@@ -1078,6 +1087,40 @@ except if your users devices require Google/Apple <a href="#instant-delivery"
and <a href="https://github.com/chatmail/core">core Rust developments</a>
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
<h3 id="statssending">
What is “Send statistics to Delta Chats developers”? <a href="#statssending" class="anchor"></a>
</h3>
<p>We would like to improve Delta Chat with your help,
which is why Delta Chat for Android asks whether you want
to send anonymous usage statistics.</p>
<p>You can turn it on and off at
<strong>Settings → Advanced → Send statistics to Delta Chats developers</strong>.</p>
<p>When you turn it on,
weekly statistics will be automatically sent to a bot.</p>
<p>We are interested e.g. in statistics like:</p>
<ul>
<li>
<p>How many contacts are introduced by personally scanning a QR code?</p>
</li>
<li>
<p>Which versions of Delta Chat are being used?</p>
</li>
<li>
<p>What errors occur for users?</p>
</li>
</ul>
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
<h3 id="我对技术细节很感兴趣能告诉我更多吗">
@@ -94,7 +94,7 @@ public abstract class BaseTransport implements Rpc.Transport {
}
if (response.error != null) {
future.setException(new RpcException(response.error.toString()));
future.setException(new RpcException(response.error.message));
} else if (response.result != null) {
future.set(response.result);
} else {
@@ -115,10 +115,15 @@ public abstract class BaseTransport implements Rpc.Transport {
}
}
private static class RpcError {
public int code;
public String message;
}
private static class Response {
public String jsonrpc;
public int id;
public JsonNode result;
public JsonNode error;
public RpcError error;
}
}
+53 -45
View File
@@ -23,17 +23,17 @@ public class Rpc {
this.mapper = transport.getObjectMapper();
}
/* Test function. */
/** Test function. */
public void sleep(Float delay) throws RpcException {
transport.call("sleep", mapper.valueToTree(delay));
}
/* Checks if an email address is valid. */
/** Checks if an email address is valid. */
public Boolean checkEmailValidity(String email) throws RpcException {
return transport.callForResult(new TypeReference<Boolean>(){}, "check_email_validity", mapper.valueToTree(email));
}
/* Returns general system info. */
/** Returns general system info. */
public java.util.Map<String, String> getSystemInfo() throws RpcException {
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "get_system_info");
}
@@ -73,12 +73,12 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_all_account_ids");
}
/* Select account in account manager, this saves the last used account to accounts.toml */
/** Select account in account manager, this saves the last used account to accounts.toml */
public void selectAccount(Integer id) throws RpcException {
transport.call("select_account", mapper.valueToTree(id));
}
/* Get the selected account from the account manager (on startup it is read from accounts.toml) */
/** Get the selected account from the account manager (on startup it is read from accounts.toml) */
public Integer getSelectedAccountId() throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "get_selected_account_id");
}
@@ -93,17 +93,17 @@ public class Rpc {
transport.call("set_accounts_order", mapper.valueToTree(order));
}
/* Get a list of all configured accounts. */
/** Get a list of all configured accounts. */
public java.util.List<Account> getAllAccounts() throws RpcException {
return transport.callForResult(new TypeReference<java.util.List<Account>>(){}, "get_all_accounts");
}
/* Starts background tasks for all accounts. */
/** Starts background tasks for all accounts. */
public void startIoForAllAccounts() throws RpcException {
transport.call("start_io_for_all_accounts");
}
/* Stops background tasks for all accounts. */
/** Stops background tasks for all accounts. */
public void stopIoForAllAccounts() throws RpcException {
transport.call("stop_io_for_all_accounts");
}
@@ -123,27 +123,27 @@ public class Rpc {
transport.call("stop_background_fetch");
}
/* Starts background tasks for a single account. */
/** Starts background tasks for a single account. */
public void startIo(Integer accountId) throws RpcException {
transport.call("start_io", mapper.valueToTree(accountId));
}
/* Stops background tasks for a single account. */
/** Stops background tasks for a single account. */
public void stopIo(Integer accountId) throws RpcException {
transport.call("stop_io", mapper.valueToTree(accountId));
}
/* Get top-level info for an account. */
/** Get top-level info for an account. */
public Account getAccountInfo(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<Account>(){}, "get_account_info", mapper.valueToTree(accountId));
}
/* Get the current push notification state. */
/** Get the current push notification state. */
public NotifyState getPushState(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<NotifyState>(){}, "get_push_state", mapper.valueToTree(accountId));
}
/* Get the combined filesize of an account in bytes */
/** Get the combined filesize of an account in bytes */
public Integer getAccountFileSize(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "get_account_file_size", mapper.valueToTree(accountId));
}
@@ -160,22 +160,22 @@ public class Rpc {
return transport.callForResult(new TypeReference<ProviderInfo>(){}, "get_provider_info", mapper.valueToTree(accountId), mapper.valueToTree(email));
}
/* Checks if the context is already configured. */
/** Checks if the context is already configured. */
public Boolean isConfigured(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<Boolean>(){}, "is_configured", mapper.valueToTree(accountId));
}
/* Get system info for an account. */
/** Get system info for an account. */
public java.util.Map<String, String> getInfo(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "get_info", mapper.valueToTree(accountId));
}
/* Get storage usage report as formatted string */
/** Get storage usage report as formatted string */
public String getStorageUsageReportString(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "get_storage_usage_report_string", mapper.valueToTree(accountId));
}
/* Get the blob dir. */
/** Get the blob dir. */
public String getBlobDir(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "get_blob_dir", mapper.valueToTree(accountId));
}
@@ -195,17 +195,17 @@ public class Rpc {
return transport.callForResult(new TypeReference<String>(){}, "get_migration_error", mapper.valueToTree(accountId));
}
/* Copy file to blob dir. */
/** Copy file to blob dir. */
public String copyToBlobDir(Integer accountId, String path) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "copy_to_blob_dir", mapper.valueToTree(accountId), mapper.valueToTree(path));
}
/* Sets the given configuration key. */
/** Sets the given configuration key. */
public void setConfig(Integer accountId, String key, String value) throws RpcException {
transport.call("set_config", mapper.valueToTree(accountId), mapper.valueToTree(key), mapper.valueToTree(value));
}
/* Updates a batch of configuration values. */
/** Updates a batch of configuration values. */
public void batchSetConfig(Integer accountId, java.util.Map<String, String> config) throws RpcException {
transport.call("batch_set_config", mapper.valueToTree(accountId), mapper.valueToTree(config));
}
@@ -225,7 +225,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Qr>(){}, "check_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
}
/* Returns configuration value for the given key. */
/** Returns configuration value for the given key. */
public String getConfig(Integer accountId, String key) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "get_config", mapper.valueToTree(accountId), mapper.valueToTree(key));
}
@@ -284,7 +284,7 @@ public class Rpc {
transport.call("add_or_update_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
}
/* Deprecated 2025-04. Alias for [Self::add_or_update_transport()]. */
/** Deprecated 2025-04. Alias for [Self::add_or_update_transport()]. */
public void addTransport(Integer accountId, EnteredLoginParam param) throws RpcException {
transport.call("add_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
}
@@ -315,7 +315,7 @@ public class Rpc {
transport.call("delete_transport", mapper.valueToTree(accountId), mapper.valueToTree(addr));
}
/* Signal an ongoing process to stop. */
/** Signal an ongoing process to stop. */
public void stopOngoingProcess(Integer accountId) throws RpcException {
transport.call("stop_ongoing_process", mapper.valueToTree(accountId));
}
@@ -608,7 +608,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_chat_contacts", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
/* Returns contact IDs of the past chat members. */
/** Returns contact IDs of the past chat members. */
public java.util.List<Integer> getPastChatContacts(Integer accountId, Integer chatId) throws RpcException {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_past_chat_contacts", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
@@ -647,7 +647,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "create_group_chat_unencrypted", mapper.valueToTree(accountId), mapper.valueToTree(name));
}
/* Deprecated 2025-07 in favor of create_broadcast(). */
/** Deprecated 2025-07 in favor of create_broadcast(). */
public Integer createBroadcastList(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "create_broadcast_list", mapper.valueToTree(accountId));
}
@@ -856,7 +856,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.Map<String, MessageLoadResult>>(){}, "get_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
}
/* Fetch info desktop needs for creating a notification for a message */
/** Fetch info desktop needs for creating a notification for a message */
public MessageNotificationInfo getMessageNotificationInfo(Integer accountId, Integer messageId) throws RpcException {
return transport.callForResult(new TypeReference<MessageNotificationInfo>(){}, "get_message_notification_info", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
@@ -888,12 +888,12 @@ public class Rpc {
return transport.callForResult(new TypeReference<String>(){}, "get_message_info", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
/* Returns additional information for single message. */
/** Returns additional information for single message. */
public MessageInfo getMessageInfoObject(Integer accountId, Integer messageId) throws RpcException {
return transport.callForResult(new TypeReference<MessageInfo>(){}, "get_message_info_object", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
/* Returns contacts that sent read receipts and the time of reading. */
/** 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));
}
@@ -941,7 +941,7 @@ public class Rpc {
transport.call("save_msgs", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
}
/* Get a single contact options by ID. */
/** Get a single contact options by ID. */
public Contact getContact(Integer accountId, Integer contactId) throws RpcException {
return transport.callForResult(new TypeReference<Contact>(){}, "get_contact", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
}
@@ -962,7 +962,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "create_contact", mapper.valueToTree(accountId), mapper.valueToTree(email), mapper.valueToTree(name));
}
/* Returns contact id of the created or existing DM chat with that contact */
/** Returns contact id of the created or existing DM chat with that contact */
public Integer createChatByContactId(Integer accountId, Integer contactId) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "create_chat_by_contact_id", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
}
@@ -1011,7 +1011,7 @@ public class Rpc {
transport.call("delete_contact", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
}
/* Sets display name for existing contact. */
/** Sets display name for existing contact. */
public void changeContactName(Integer accountId, Integer contactId, String name) throws RpcException {
transport.call("change_contact_name", mapper.valueToTree(accountId), mapper.valueToTree(contactId), mapper.valueToTree(name));
}
@@ -1046,7 +1046,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "lookup_contact_id_by_addr", mapper.valueToTree(accountId), mapper.valueToTree(addr));
}
/* Parses a vCard file located at the given path. Returns contacts in their original order. */
/** Parses a vCard file located at the given path. Returns contacts in their original order. */
public java.util.List<VcardContact> parseVcard(String path) throws RpcException {
return transport.callForResult(new TypeReference<java.util.List<VcardContact>>(){}, "parse_vcard", mapper.valueToTree(path));
}
@@ -1069,12 +1069,12 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "import_vcard_contents", mapper.valueToTree(accountId), mapper.valueToTree(vcard));
}
/* Returns a vCard containing contacts with the given ids. */
/** Returns a vCard containing contacts with the given ids. */
public String makeVcard(Integer accountId, java.util.List<Integer> contacts) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "make_vcard", mapper.valueToTree(accountId), mapper.valueToTree(contacts));
}
/* Sets vCard containing the given contacts to the message draft. */
/** Sets vCard containing the given contacts to the message draft. */
public void setDraftVcard(Integer accountId, Integer msgId, java.util.List<Integer> contacts) throws RpcException {
transport.call("set_draft_vcard", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(contacts));
}
@@ -1245,7 +1245,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<String>(){}, "get_webxdc_status_updates", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(lastKnownSerial));
}
/* Get info from a webxdc message */
/** Get info from a webxdc message */
public WebxdcMessageInfo getWebxdcInfo(Integer accountId, Integer instanceMsgId) throws RpcException {
return transport.callForResult(new TypeReference<WebxdcMessageInfo>(){}, "get_webxdc_info", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId));
}
@@ -1285,27 +1285,27 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "init_webxdc_integration", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
/* Starts an outgoing call. */
/** Starts an outgoing call. */
public Integer placeOutgoingCall(Integer accountId, Integer chatId, String placeCallInfo) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "place_outgoing_call", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(placeCallInfo));
}
/* Accepts an incoming call. */
/** Accepts an incoming call. */
public void acceptIncomingCall(Integer accountId, Integer msgId, String acceptCallInfo) throws RpcException {
transport.call("accept_incoming_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(acceptCallInfo));
}
/* Ends incoming or outgoing call. */
/** Ends incoming or outgoing call. */
public void endCall(Integer accountId, Integer msgId) throws RpcException {
transport.call("end_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
}
/* Returns information about the call. */
/** Returns information about the call. */
public CallInfo callInfo(Integer accountId, Integer msgId) throws RpcException {
return transport.callForResult(new TypeReference<CallInfo>(){}, "call_info", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
}
/* Returns JSON with ICE servers, to be used for WebRTC video calls. */
/** Returns JSON with ICE servers, to be used for WebRTC video calls. */
public String iceServers(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "ice_servers", mapper.valueToTree(accountId));
}
@@ -1331,6 +1331,14 @@ public class Rpc {
transport.call("forward_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds), mapper.valueToTree(chatId));
}
/**
* Forward messages to a chat in another account.
* See [`Self::forward_messages`] for more info.
*/
public void forwardMessagesToAccount(Integer srcAccountId, java.util.List<Integer> srcMessageIds, Integer dstAccountId, Integer dstChatId) throws RpcException {
transport.call("forward_messages_to_account", mapper.valueToTree(srcAccountId), mapper.valueToTree(srcMessageIds), mapper.valueToTree(dstAccountId), mapper.valueToTree(dstChatId));
}
/**
* Resend messages and make information available for newly added chat members.
* Resending sends out the original message, however, recipients and webxdc-status may differ.
@@ -1361,7 +1369,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<Integer>(){}, "send_reaction", mapper.valueToTree(accountId), mapper.valueToTree(messageId), mapper.valueToTree(reaction));
}
/* Returns reactions to the message. */
/** Returns reactions to the message. */
public Reactions getMessageReactions(Integer accountId, Integer messageId) throws RpcException {
return transport.callForResult(new TypeReference<Reactions>(){}, "get_message_reactions", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
}
@@ -1374,7 +1382,7 @@ public class Rpc {
transport.call("send_edit_request", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(newText));
}
/* Checks if messages can be sent to a given chat. */
/** Checks if messages can be sent to a given chat. */
public Boolean canSend(Integer accountId, Integer chatId) throws RpcException {
return transport.callForResult(new TypeReference<Boolean>(){}, "can_send", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
@@ -1392,7 +1400,7 @@ public class Rpc {
transport.call("remove_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
/* Get draft for a chat, if any. */
/** Get draft for a chat, if any. */
public Message getDraft(Integer accountId, Integer chatId) throws RpcException {
return transport.callForResult(new TypeReference<Message>(){}, "get_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
}
@@ -1401,7 +1409,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<String>(){}, "misc_get_sticker_folder", mapper.valueToTree(accountId));
}
/* Saves a sticker to a collection/folder in the account's sticker folder. */
/** Saves a sticker to a collection/folder in the account's sticker folder. */
public void miscSaveSticker(Integer accountId, Integer msgId, String collection) throws RpcException {
transport.call("misc_save_sticker", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(collection));
}
@@ -1414,7 +1422,7 @@ public class Rpc {
return transport.callForResult(new TypeReference<java.util.Map<String, java.util.List<String>>>(){}, "misc_get_stickers", mapper.valueToTree(accountId));
}
/* Returns the messageid of the sent message */
/** Returns the messageid of the sent message */
public Integer miscSendTextMessage(Integer accountId, Integer chatId, String text) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "misc_send_text_message", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(text));
}
@@ -18,7 +18,7 @@ public abstract class Account {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String displayName;
public Integer id;
/* Optional tag as "Work", "Family". Meant to help profile owner to differ between profiles with similar names. */
/** Optional tag as "Work", "Family". Meant to help profile owner to differ between profiles with similar names. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String privateTag;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -2,7 +2,7 @@
package chat.delta.rpc.types;
public class CallInfo {
/* True if SDP offer has a video. */
/** True if SDP offer has a video. */
public Boolean hasVideo;
/**
* SDP offer.
@@ -19,21 +19,21 @@ public abstract class CallState {
public static class Alerting extends CallState {
}
/* Active call. */
/** Active call. */
public static class Active extends CallState {
}
/* Completed call that was once active and then was terminated for any reason. */
/** Completed call that was once active and then was terminated for any reason. */
public static class Completed extends CallState {
/* Call duration in seconds. */
/** Call duration in seconds. */
public Integer duration;
}
/* Incoming call that was not picked up within a timeout or was explicitly ended by the caller before we picked up. */
/** Incoming call that was not picked up within a timeout or was explicitly ended by the caller before we picked up. */
public static class Missed extends CallState {
}
/* Incoming call that was explicitly ended on our side before picking up or outgoing call that was declined before the timeout. */
/** Incoming call that was explicitly ended on our side before picking up or outgoing call that was declined before the timeout. */
public static class Declined extends CallState {
}
@@ -16,7 +16,7 @@ public abstract class ChatListItemFetchResult {
public String avatarPath;
public ChatType chatType;
public String color;
/* contact id if this is a dm chat (for view profile entry in context menu) */
/** contact id if this is a dm chat (for view profile entry in context menu) */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer dmChatContact;
public Integer freshMessageCounter;
@@ -36,7 +36,7 @@ public abstract class ChatListItemFetchResult {
* See also `is_key_contact` on `Contact`.
*/
public Boolean isEncrypted;
/* deprecated 2025-07, use chat_type instead */
/** deprecated 2025-07, use chat_type instead */
public Boolean isGroup;
public Boolean isMuted;
public Boolean isPinned;
@@ -50,7 +50,7 @@ public abstract class ChatListItemFetchResult {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer lastUpdated;
public String name;
/* showing preview if last chat message is image */
/** showing preview if last chat message is image */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summaryPreviewImage;
public Integer summaryStatus;
@@ -14,9 +14,9 @@ public class Contact {
public Boolean e2eeAvail;
public Integer id;
public Boolean isBlocked;
/* If the contact is a bot. */
/** If the contact is a bot. */
public Boolean isBot;
/* Is the contact a key contact. */
/** Is the contact a key contact. */
public Boolean isKeyContact;
/**
* True if the contact can be added to protected chats because SELF and contact have verified their fingerprints in both directions.
@@ -24,7 +24,7 @@ public class Contact {
* See [`Self::verifier_id`]/`Contact.verifierId` for a guidance how to display these information.
*/
public Boolean isVerified;
/* the contact's last seen timestamp */
/** the contact's last seen timestamp */
public Integer lastSeen;
public String name;
public String nameAndAddr;
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public enum EnteredCertificateChecks {
/* `Automatic` means that provider database setting should be taken. If there is no provider database setting for certificate checks, check certificates strictly. */
/** `Automatic` means that provider database setting should be taken. If there is no provider database setting for certificate checks, check certificates strictly. */
automatic,
/* Ensure that TLS certificate is valid for the server hostname. */
/** Ensure that TLS certificate is valid for the server hostname. */
strict,
/* Accept certificates that are expired, self-signed or otherwise not valid for the server hostname. */
/** Accept certificates that are expired, self-signed or otherwise not valid for the server hostname. */
acceptInvalidCertificates,
}
@@ -7,27 +7,27 @@ package chat.delta.rpc.types;
* Usually it will be enough to only set `addr` and `password`, and all the other settings will be autoconfigured.
*/
public class EnteredLoginParam {
/* Email address. */
/** Email address. */
public String addr;
/* TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
/** TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public EnteredCertificateChecks certificateChecks;
/* Imap server port. */
/** Imap server port. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer imapPort;
/* Imap socket security. */
/** Imap socket security. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Socket imapSecurity;
/* Imap server hostname or IP address. */
/** Imap server hostname or IP address. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imapServer;
/* Imap username. */
/** Imap username. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imapUser;
/* If true, login via OAUTH2 (not recommended anymore). Default: false */
/** If true, login via OAUTH2 (not recommended anymore). Default: false */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Boolean oauth2;
/* Password. */
/** Password. */
public String password;
/**
* SMTP Password.
@@ -36,16 +36,16 @@ public class EnteredLoginParam {
*/
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpPassword;
/* SMTP server port. */
/** SMTP server port. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer smtpPort;
/* SMTP socket security. */
/** SMTP socket security. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Socket smtpSecurity;
/* SMTP server hostname or IP address. */
/** SMTP server hostname or IP address. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpServer;
/* SMTP username. */
/** SMTP username. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpUser;
}
@@ -11,11 +11,11 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonSubTypes({@Type(value = EphemeralTimer.Disabled.class, name="Disabled"), @Type(value = EphemeralTimer.Enabled.class, name="Enabled")})
public abstract class EphemeralTimer {
/* Timer is disabled. */
/** Timer is disabled. */
public static class Disabled extends EphemeralTimer {
}
/* Timer is enabled. */
/** Timer is enabled. */
public static class Enabled extends EphemeralTimer {
/**
* Timer duration in seconds.
@@ -2,8 +2,8 @@
package chat.delta.rpc.types;
public class Event {
/* Account ID. */
/** Account ID. */
public Integer contextId;
/* Event payload. */
/** Event payload. */
public EventType event;
}
@@ -20,41 +20,41 @@ public abstract class EventType {
public String msg;
}
/* Emitted when SMTP connection is established and login was successful. */
/** Emitted when SMTP connection is established and login was successful. */
public static class SmtpConnected extends EventType {
public String msg;
}
/* Emitted when IMAP connection is established and login was successful. */
/** Emitted when IMAP connection is established and login was successful. */
public static class ImapConnected extends EventType {
public String msg;
}
/* Emitted when a message was successfully sent to the SMTP server. */
/** Emitted when a message was successfully sent to the SMTP server. */
public static class SmtpMessageSent extends EventType {
public String msg;
}
/* Emitted when an IMAP message has been marked as deleted */
/** Emitted when an IMAP message has been marked as deleted */
public static class ImapMessageDeleted extends EventType {
public String msg;
}
/* Emitted when an IMAP message has been moved */
/** Emitted when an IMAP message has been moved */
public static class ImapMessageMoved extends EventType {
public String msg;
}
/* Emitted before going into IDLE on the Inbox folder. */
/** Emitted before going into IDLE on the Inbox folder. */
public static class ImapInboxIdle extends EventType {
}
/* Emitted when an new file in the $BLOBDIR was created */
/** Emitted when an new file in the $BLOBDIR was created */
public static class NewBlobFile extends EventType {
public String file;
}
/* Emitted when an file in the $BLOBDIR was deleted */
/** Emitted when an file in the $BLOBDIR was deleted */
public static class DeletedBlobFile extends EventType {
public String file;
}
@@ -79,26 +79,26 @@ public abstract class EventType {
public String msg;
}
/* An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
/** An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
public static class ErrorSelfNotInGroup extends EventType {
public String msg;
}
/* Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
/** Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
public static class MsgsChanged extends EventType {
/* Set if only a single chat is affected by the changes, otherwise 0. */
/** Set if only a single chat is affected by the changes, otherwise 0. */
public Integer chatId;
/* Set if only a single message is affected by the changes, otherwise 0. */
/** Set if only a single message is affected by the changes, otherwise 0. */
public Integer msgId;
}
/* Reactions for the message changed. */
/** Reactions for the message changed. */
public static class ReactionsChanged extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the contact whose reaction set is changed. */
/** ID of the contact whose reaction set is changed. */
public Integer contactId;
/* ID of the message for which reactions were changed. */
/** ID of the message for which reactions were changed. */
public Integer msgId;
}
@@ -108,28 +108,28 @@ public abstract class EventType {
* In addition to this event, ReactionsChanged is emitted.
*/
public static class IncomingReaction extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the contact whose reaction set is changed. */
/** ID of the contact whose reaction set is changed. */
public Integer contactId;
/* ID of the message for which reactions were changed. */
/** ID of the message for which reactions were changed. */
public Integer msgId;
/* The reaction. */
/** The reaction. */
public String reaction;
}
/* Incoming webxdc info or summary update, should be notified. */
/** Incoming webxdc info or summary update, should be notified. */
public static class IncomingWebxdcNotify extends EventType {
/* ID of the chat. */
/** ID of the chat. */
public Integer chatId;
/* ID of the contact sending. */
/** ID of the contact sending. */
public Integer contactId;
/* Link assigned to this notification, if any. */
/** Link assigned to this notification, if any. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String href;
/* ID of the added info message or webxdc instance in case of summary change. */
/** ID of the added info message or webxdc instance in case of summary change. */
public Integer msgId;
/* Text to notify. */
/** Text to notify. */
public String text;
}
@@ -139,42 +139,42 @@ public abstract class EventType {
* There is no extra #DC_EVENT_MSGS_CHANGED event sent together with this event.
*/
public static class IncomingMsg extends EventType {
/* ID of the chat where the message is assigned. */
/** ID of the chat where the message is assigned. */
public Integer chatId;
/* ID of the message. */
/** ID of the message. */
public Integer msgId;
}
/* Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
/** Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
public static class IncomingMsgBunch extends EventType {
}
/* Messages were seen or noticed. chat id is always set. */
/** Messages were seen or noticed. chat id is always set. */
public static class MsgsNoticed extends EventType {
public Integer chatId;
}
/* A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
/** A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
public static class MsgDelivered extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the message that was successfully sent. */
/** ID of the message that was successfully sent. */
public Integer msgId;
}
/* A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
/** A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
public static class MsgFailed extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the message that could not be sent. */
/** ID of the message that could not be sent. */
public Integer msgId;
}
/* A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
/** A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
public static class MsgRead extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chatId;
/* ID of the message that was read. */
/** ID of the message that was read. */
public Integer msgId;
}
@@ -188,9 +188,9 @@ public abstract class EventType {
* This event does not indicate the message deletion from the server.
*/
public static class MsgDeleted extends EventType {
/* ID of the chat where the message was prior to deletion. Never 0. */
/** ID of the chat where the message was prior to deletion. Never 0. */
public Integer chatId;
/* ID of the deleted message. Never 0. */
/** ID of the deleted message. Never 0. */
public Integer msgId;
}
@@ -203,37 +203,37 @@ public abstract class EventType {
public Integer chatId;
}
/* Chat ephemeral timer changed. */
/** Chat ephemeral timer changed. */
public static class ChatEphemeralTimerModified extends EventType {
/* Chat ID. */
/** Chat ID. */
public Integer chatId;
/* New ephemeral timer value. */
/** New ephemeral timer value. */
public Integer timer;
}
/* Chat deleted. */
/** Chat deleted. */
public static class ChatDeleted extends EventType {
/* Chat ID. */
/** Chat ID. */
public Integer chat_id;
}
/* Contact(s) created, renamed, blocked or deleted. */
/** Contact(s) created, renamed, blocked or deleted. */
public static class ContactsChanged extends EventType {
/* If set, this is the contact_id of an added contact that should be selected. */
/** If set, this is the contact_id of an added contact that should be selected. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contactId;
}
/* Location of one or more contact has changed. */
/** Location of one or more contact has changed. */
public static class LocationChanged extends EventType {
/* contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
/** contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contactId;
}
/* Inform about the configuration progress started by configure(). */
/** Inform about the configuration progress started by configure(). */
public static class ConfigureProgress extends EventType {
/* Progress comment or error, something to display to the user. */
/** Progress comment or error, something to display to the user. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String comment;
/**
@@ -244,9 +244,9 @@ public abstract class EventType {
public Integer progress;
}
/* Inform about the import/export progress started by imex(). */
/** Inform about the import/export progress started by imex(). */
public static class ImexProgress extends EventType {
/* 0=error, 1-999=progress in permille, 1000=success and done */
/** 0=error, 1-999=progress in permille, 1000=success and done */
public Integer progress;
}
@@ -267,62 +267,62 @@ public abstract class EventType {
* These events are typically sent after a joiner has scanned the QR code generated by getChatSecurejoinQrCodeSvg().
*/
public static class SecurejoinInviterProgress extends EventType {
/* ID of the chat in case of success. */
/** ID of the chat in case of success. */
public Integer chatId;
/* The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
/** The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
public ChatType chatType;
/* ID of the contact that wants to join. */
/** ID of the contact that wants to join. */
public Integer contactId;
/* Progress, always 1000. */
/** Progress, always 1000. */
public Integer progress;
}
/* Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
/** Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
public static class SecurejoinJoinerProgress extends EventType {
/* ID of the inviting contact. */
/** ID of the inviting contact. */
public Integer contactId;
/* Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
/** Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
public Integer progress;
}
/* The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
/** The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
public static class ConnectivityChanged extends EventType {
}
/* Deprecated by `ConfigSynced`. */
/** Deprecated by `ConfigSynced`. */
public static class SelfavatarChanged extends EventType {
}
/* A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
/** A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
public static class ConfigSynced extends EventType {
/* Configuration key. */
/** Configuration key. */
public String key;
}
public static class WebxdcStatusUpdate extends EventType {
/* Message ID. */
/** Message ID. */
public Integer msgId;
/* Status update ID. */
/** Status update ID. */
public Integer statusUpdateSerial;
}
/* Data received over an ephemeral peer channel. */
/** Data received over an ephemeral peer channel. */
public static class WebxdcRealtimeData extends EventType {
/* Realtime data. */
/** Realtime data. */
public java.util.List<Integer> data;
/* Message ID. */
/** Message ID. */
public Integer msgId;
}
/* Advertisement received over an ephemeral peer channel. This can be used by bots to initiate peer-to-peer communication from their side. */
/** Advertisement received over an ephemeral peer channel. This can be used by bots to initiate peer-to-peer communication from their side. */
public static class WebxdcRealtimeAdvertisementReceived extends EventType {
/* Message ID of the webxdc instance. */
/** Message ID of the webxdc instance. */
public Integer msgId;
}
/* Inform that a message containing a webxdc instance has been deleted */
/** Inform that a message containing a webxdc instance has been deleted */
public static class WebxdcInstanceDeleted extends EventType {
/* ID of the deleted message. */
/** ID of the deleted message. */
public Integer msgId;
}
@@ -342,9 +342,9 @@ public abstract class EventType {
public static class ChatlistChanged extends EventType {
}
/* Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
/** Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
public static class ChatlistItemChanged extends EventType {
/* ID of the changed chat */
/** ID of the changed chat */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer chatId;
}
@@ -365,47 +365,47 @@ public abstract class EventType {
public static class AccountsItemChanged extends EventType {
}
/* Inform than some events have been skipped due to event channel overflow. */
/** Inform than some events have been skipped due to event channel overflow. */
public static class EventChannelOverflow extends EventType {
/* Number of events skipped. */
/** Number of events skipped. */
public Integer n;
}
/* Incoming call. */
/** Incoming call. */
public static class IncomingCall extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/* True if incoming call is a video call. */
/** True if incoming call is a video call. */
public Boolean has_video;
/* ID of the info message referring to the call. */
/** ID of the info message referring to the call. */
public Integer msg_id;
/* User-defined info as passed to place_outgoing_call() */
/** User-defined info as passed to place_outgoing_call() */
public String place_call_info;
}
/* Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
/** Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
public static class IncomingCallAccepted extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/* ID of the info message referring to the call. */
/** ID of the info message referring to the call. */
public Integer msg_id;
}
/* Outgoing call accepted. */
/** Outgoing call accepted. */
public static class OutgoingCallAccepted extends EventType {
/* User-defined info passed to dc_accept_incoming_call( */
/** User-defined info passed to dc_accept_incoming_call( */
public String accept_call_info;
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/* ID of the info message referring to the call. */
/** ID of the info message referring to the call. */
public Integer msg_id;
}
/* Call ended. */
/** Call ended. */
public static class CallEnded extends EventType {
/* ID of the chat which the message belongs to. */
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/* ID of the info message referring to the call. */
/** ID of the info message referring to the call. */
public Integer msg_id;
}
@@ -31,12 +31,12 @@ public class FullChat {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String mailingListAddress;
public String name;
/* Contact IDs of the past chat members. */
/** Contact IDs of the past chat members. */
public java.util.List<Integer> pastContactIds;
public Boolean pinned;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
/* Note that this is different from [`ChatListItem::is_self_in_group`](`crate::api::types::chat_list::ChatListItemFetchResult::ChatListItem::is_self_in_group`). This property should only be accessed when [`FullChat::chat_type`] is [`Chattype::Group`]. */
/** Note that this is different from [`ChatListItem::is_self_in_group`](`crate::api::types::chat_list::ChatListItemFetchResult::ChatListItem::is_self_in_group`). This property should only be accessed when [`FullChat::chat_type`] is [`Chattype::Group`]. */
public Boolean selfInGroup;
public Boolean wasSeenRecently;
}
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public class HttpResponse {
/* base64-encoded response body. */
/** base64-encoded response body. */
public String blob;
/* Encoding, e.g. "utf-8". */
/** Encoding, e.g. "utf-8". */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String encoding;
/* MIME type, e.g. "text/plain" or "text/html". */
/** MIME type, e.g. "text/plain" or "text/html". */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String mimetype;
}
@@ -7,7 +7,7 @@ public class Message {
public Integer dimensionsWidth;
public DownloadState downloadState;
public Integer duration;
/* An error text, if there is one. */
/** An error text, if there is one. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String error;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -20,13 +20,13 @@ public class Message {
public Integer fromId;
public Boolean hasDeviatingTimestamp;
public Boolean hasHtml;
/* Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
public Boolean hasLocation;
public Integer id;
/* if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer infoContactId;
/* True if the message was sent by a bot. */
/** True if the message was sent by a bot. */
public Boolean isBot;
public Boolean isEdited;
public Boolean isForwarded;
@@ -57,7 +57,7 @@ public class Message {
public Integer sortTimestamp;
public Integer state;
public String subject;
/* when is_info is true this describes what type of system message it is */
/** when is_info is true this describes what type of system message it is */
public SystemMessageType systemMessageType;
public String text;
public Integer timestamp;
@@ -12,7 +12,7 @@ public class MessageData {
public Pair<Float, Float> location;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String overrideSenderName;
/* Quoted message id. Takes preference over `quoted_text` (see below). */
/** Quoted message id. Takes preference over `quoted_text` (see below). */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer quotedMessageId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -3,7 +3,7 @@ package chat.delta.rpc.types;
public class MessageInfo {
public EphemeralTimer ephemeralTimer;
/* When message is ephemeral this contains the timestamp of the message expiry */
/** When message is ephemeral this contains the timestamp of the message expiry */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer ephemeralTimestamp;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -15,9 +15,9 @@ public abstract class MessageListItem {
public Integer msg_id;
}
/* Day marker, separating messages that correspond to different days according to local time. */
/** Day marker, separating messages that correspond to different days according to local time. */
public static class DayMarker extends MessageListItem {
/* Marker timestamp, for day markers, in unix milliseconds */
/** Marker timestamp, for day markers, in unix milliseconds */
public Integer timestamp;
}
@@ -17,7 +17,7 @@ public abstract class MessageLoadResult {
public Integer dimensionsWidth;
public DownloadState downloadState;
public Integer duration;
/* An error text, if there is one. */
/** An error text, if there is one. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String error;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
@@ -30,13 +30,13 @@ public abstract class MessageLoadResult {
public Integer fromId;
public Boolean hasDeviatingTimestamp;
public Boolean hasHtml;
/* Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
public Boolean hasLocation;
public Integer id;
/* if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer infoContactId;
/* True if the message was sent by a bot. */
/** True if the message was sent by a bot. */
public Boolean isBot;
public Boolean isEdited;
public Boolean isForwarded;
@@ -67,7 +67,7 @@ public abstract class MessageLoadResult {
public Integer sortTimestamp;
public Integer state;
public String subject;
/* when is_info is true this describes what type of system message it is */
/** when is_info is true this describes what type of system message it is */
public SystemMessageType systemMessageType;
public String text;
public Integer timestamp;
@@ -12,9 +12,9 @@ public class MessageNotificationInfo {
public String image;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imageMimeType;
/* also known as summary_text1 */
/** also known as summary_text1 */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summaryPrefix;
/* also known as summary_text2 */
/** also known as summary_text2 */
public String summaryText;
}
@@ -18,7 +18,7 @@ public abstract class MessageQuote {
public static class WithMessage extends MessageQuote {
public String authorDisplayColor;
public String authorDisplayName;
/* The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
/** The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
public Integer chatId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String image;
@@ -4,7 +4,7 @@ package chat.delta.rpc.types;
public class MessageSearchResult {
public String authorColor;
public Integer authorId;
/* if sender name if overridden it will show it as ~alias */
/** if sender name if overridden it will show it as ~alias */
public String authorName;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String authorProfileImage;
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public enum NotifyState {
/* Not subscribed to push notifications. */
/** Not subscribed to push notifications. */
NotConnected,
/* Subscribed to heartbeat push notifications. */
/** Subscribed to heartbeat push notifications. */
Heartbeat,
/* Subscribed to push notifications for new messages. */
/** Subscribed to push notifications for new messages. */
Connected,
}
@@ -3,7 +3,7 @@ package chat.delta.rpc.types;
public class ProviderInfo {
public String beforeLoginHint;
/* Unique ID, corresponding to provider database filename. */
/** Unique ID, corresponding to provider database filename. */
public String id;
public String overviewPage;
public Integer status;
+71 -71
View File
@@ -17,45 +17,45 @@ public abstract class Qr {
* If the user agrees, pass this QR code to [`crate::securejoin::join_securejoin`].
*/
public static class AskVerifyContact extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* ID of the contact. */
/** ID of the contact. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user whether to join the group. */
/** Ask the user whether to join the group. */
public static class AskVerifyGroup extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* ID of the contact. */
/** ID of the contact. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Group ID. */
/** Group ID. */
public String grpid;
/* Group name. */
/** Group name. */
public String grpname;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user whether to join the broadcast channel. */
/** Ask the user whether to join the broadcast channel. */
public static class AskJoinBroadcast extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* ID of the contact who owns the broadcast channel and created the QR code. */
/** ID of the contact who owns the broadcast channel and created the QR code. */
public Integer contact_id;
/* Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
/** Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
public String fingerprint;
/* A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
/** A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
public String grpid;
/* Invite number. */
/** Invite number. */
public String invitenumber;
/* The user-visible name of this broadcast channel */
/** The user-visible name of this broadcast channel */
public String name;
}
@@ -65,41 +65,41 @@ public abstract class Qr {
* Ask the user if they want to start chatting.
*/
public static class FprOk extends Qr {
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
}
/* Scanned fingerprint does not match the last seen fingerprint. */
/** Scanned fingerprint does not match the last seen fingerprint. */
public static class FprMismatch extends Qr {
/* Contact ID. */
/** Contact ID. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contact_id;
}
/* The scanned QR code contains a fingerprint but no e-mail address. */
/** The scanned QR code contains a fingerprint but no e-mail address. */
public static class FprWithoutAddr extends Qr {
/* Key fingerprint. */
/** Key fingerprint. */
public String fingerprint;
}
/* Ask the user if they want to create an account on the given domain. */
/** Ask the user if they want to create an account on the given domain. */
public static class Account extends Qr {
/* Server domain name. */
/** Server domain name. */
public String domain;
}
/* Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
/** Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
public static class Backup2 extends Qr {
/* Authentication token. */
/** Authentication token. */
public String auth_token;
/* Iroh node address. */
/** Iroh node address. */
public String node_addr;
}
public static class BackupTooNew extends Qr {
}
/* Ask the user if they want to use the given service for video chats. */
/** Ask the user if they want to use the given service for video chats. */
public static class WebrtcInstance extends Qr {
public String domain;
public String instance_pattern;
@@ -111,9 +111,9 @@ public abstract class Qr {
* Note that HTTP(S) URLs without a path and query parameters are treated as HTTP(S) proxy URL. UI may want to still offer to open the URL in the browser if QR code contents starts with `http://` or `https://` and the QR code was not scanned from the proxy configuration screen.
*/
public static class Proxy extends Qr {
/* Host extracted from the URL to display in the UI. */
/** Host extracted from the URL to display in the UI. */
public String host;
/* Port extracted from the URL to display in the UI. */
/** Port extracted from the URL to display in the UI. */
public Integer port;
/**
* Proxy URL.
@@ -129,9 +129,9 @@ public abstract class Qr {
* Optionally, a draft message could be provided. Ask the user if they want to start chatting.
*/
public static class Addr extends Qr {
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Draft message. */
/** Draft message. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String draft;
}
@@ -154,91 +154,91 @@ public abstract class Qr {
public String text;
}
/* Ask the user if they want to withdraw their own QR code. */
/** Ask the user if they want to withdraw their own QR code. */
public static class WithdrawVerifyContact extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user if they want to withdraw their own group invite QR code. */
/** Ask the user if they want to withdraw their own group invite QR code. */
public static class WithdrawVerifyGroup extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Group ID. */
/** Group ID. */
public String grpid;
/* Group name. */
/** Group name. */
public String grpname;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user if they want to withdraw their own broadcast channel invite QR code. */
/** Ask the user if they want to withdraw their own broadcast channel invite QR code. */
public static class WithdrawJoinBroadcast extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. Always `ContactId::SELF`. */
/** Contact ID. Always `ContactId::SELF`. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* ID, uniquely identifying this chat. Called grpid for historic reasons. */
/** ID, uniquely identifying this chat. Called grpid for historic reasons. */
public String grpid;
/* Invite number. */
/** Invite number. */
public String invitenumber;
/* Broadcast name. */
/** Broadcast name. */
public String name;
}
/* Ask the user if they want to revive their own QR code. */
/** Ask the user if they want to revive their own QR code. */
public static class ReviveVerifyContact extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user if they want to revive their own group invite QR code. */
/** Ask the user if they want to revive their own group invite QR code. */
public static class ReviveVerifyGroup extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. */
/** Contact ID. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Group ID. */
/** Group ID. */
public String grpid;
/* Contact ID. */
/** Contact ID. */
public String grpname;
/* Invite number. */
/** Invite number. */
public String invitenumber;
}
/* Ask the user if they want to revive their own broadcast channel invite QR code. */
/** Ask the user if they want to revive their own broadcast channel invite QR code. */
public static class ReviveJoinBroadcast extends Qr {
/* Authentication code. */
/** Authentication code. */
public String authcode;
/* Contact ID. Always `ContactId::SELF`. */
/** Contact ID. Always `ContactId::SELF`. */
public Integer contact_id;
/* Fingerprint of the contact key as scanned from the QR code. */
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/* Globally unique chat ID. Called grpid for historic reasons. */
/** Globally unique chat ID. Called grpid for historic reasons. */
public String grpid;
/* Invite number. */
/** Invite number. */
public String invitenumber;
/* Broadcast name. */
/** Broadcast name. */
public String name;
}
@@ -1,12 +1,12 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/* A single reaction emoji. */
/** A single reaction emoji. */
public class Reaction {
/* Emoji frequency. */
/** Emoji frequency. */
public Integer count;
/* Emoji. */
/** Emoji. */
public String emoji;
/* True if we reacted with this emoji. */
/** True if we reacted with this emoji. */
public Boolean isFromSelf;
}
@@ -1,10 +1,10 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/* Structure representing all reactions to a particular message. */
/** Structure representing all reactions to a particular message. */
public class Reactions {
/* Unique reactions and their count, sorted in descending order. */
/** Unique reactions and their count, sorted in descending order. */
public java.util.List<Reaction> reactions;
/* Map from a contact to it's reaction to message. */
/** Map from a contact to it's reaction to message. */
public java.util.Map<String, java.util.List<String>> reactionsByContact;
}
@@ -2,21 +2,21 @@
package chat.delta.rpc.types;
public enum SecurejoinSource {
/* Because of some problem, it is unknown where the QR code came from. */
/** Because of some problem, it is unknown where the QR code came from. */
Unknown,
/* The user opened a link somewhere outside Delta Chat */
/** The user opened a link somewhere outside Delta Chat */
ExternalLink,
/* The user clicked on a link in a message inside Delta Chat */
/** The user clicked on a link in a message inside Delta Chat */
InternalLink,
/* The user clicked "Paste from Clipboard" in the QR scan activity */
/** The user clicked "Paste from Clipboard" in the QR scan activity */
Clipboard,
/* The user clicked "Load QR code as image" in the QR scan activity */
/** The user clicked "Load QR code as image" in the QR scan activity */
ImageLoaded,
/* The user scanned a QR code */
/** The user scanned a QR code */
Scan,
}
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public enum SecurejoinUiPath {
/* The UI path is unknown, or the user didn't open the QR code screen at all. */
/** The UI path is unknown, or the user didn't open the QR code screen at all. */
Unknown,
/* The user directly clicked on the QR icon in the main screen */
/** The user directly clicked on the QR icon in the main screen */
QrIcon,
/* The user first clicked on the `+` button in the main screen, and then on "New Contact" */
/** The user first clicked on the `+` button in the main screen, and then on "New Contact" */
NewContact,
}
@@ -2,15 +2,15 @@
package chat.delta.rpc.types;
public enum Socket {
/* Unspecified socket security, select automatically. */
/** Unspecified socket security, select automatically. */
automatic,
/* TLS connection. */
/** TLS connection. */
ssl,
/* STARTTLS connection. */
/** STARTTLS connection. */
starttls,
/* No TLS, plaintext connection. */
/** No TLS, plaintext connection. */
plain,
}
@@ -19,21 +19,21 @@ public enum SystemMessageType {
CallAccepted,
CallEnded,
/* 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
/** 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
SecurejoinWait,
/* 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
/** 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
SecurejoinWaitTimeout,
/* Chat ephemeral message timer is changed. */
/** Chat ephemeral message timer is changed. */
EphemeralTimerChanged,
/* Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
/** Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
MultiDeviceSync,
/* Webxdc info added with `info` set in `send_webxdc_status_update()`. */
/** Webxdc info added with `info` set in `send_webxdc_status_update()`. */
WebxdcInfoMessage,
/* This message contains a users iroh node address. */
/** This message contains a users iroh node address. */
IrohNodeAddr,
}
@@ -2,19 +2,19 @@
package chat.delta.rpc.types;
public class VcardContact {
/* Email address. */
/** Email address. */
public String addr;
/* Contact color as hex string. */
/** Contact color as hex string. */
public String color;
/* The contact's name, or the email address if no name was given. */
/** The contact's name, or the email address if no name was given. */
public String displayName;
/* Public PGP key in Base64. */
/** Public PGP key in Base64. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String key;
/* Profile image in Base64. */
/** Profile image in Base64. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
/* Last update timestamp. */
/** Last update timestamp. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer timestamp;
}
@@ -4,13 +4,13 @@ package chat.delta.rpc.types;
public enum Viewtype {
Unknown,
/* Text message. */
/** Text message. */
Text,
/* Image message. If the image is an animated GIF, the type `Viewtype.Gif` should be used. */
/** Image message. If the image is an animated GIF, the type `Viewtype.Gif` should be used. */
Image,
/* Animated GIF message. */
/** Animated GIF message. */
Gif,
/**
@@ -20,24 +20,24 @@ public enum Viewtype {
*/
Sticker,
/* Message containing an Audio file. */
/** Message containing an Audio file. */
Audio,
/* A voice message that was directly recorded by the user. For all other audio messages, the type `Viewtype.Audio` should be used. */
/** A voice message that was directly recorded by the user. For all other audio messages, the type `Viewtype.Audio` should be used. */
Voice,
/* Video messages. */
/** Video messages. */
Video,
/* Message containing any file, eg. a PDF. */
/** Message containing any file, eg. a PDF. */
File,
/* Message is a call. */
/** Message is a call. */
Call,
/* Message is an webxdc instance. */
/** Message is an webxdc instance. */
Webxdc,
/* Message containing shared contacts represented as a vCard (virtual contact file) with email addresses and possibly other fields. Use `parse_vcard()` to retrieve them. */
/** Message containing shared contacts represented as a vCard (virtual contact file) with email addresses and possibly other fields. Use `parse_vcard()` to retrieve them. */
Vcard,
}
@@ -2,7 +2,7 @@
package chat.delta.rpc.types;
public class WebxdcMessageInfo {
/* if the Webxdc represents a document, then this is the name of the document */
/** if the Webxdc represents a document, then this is the name of the document */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String document;
/**
@@ -13,7 +13,7 @@ public class WebxdcMessageInfo {
* App icons should should be square, the implementations will add round corners etc. as needed.
*/
public String icon;
/* True if full internet access should be granted to the app. */
/** True if full internet access should be granted to the app. */
public Boolean internetAccess;
/**
* The name of the app.
@@ -21,16 +21,16 @@ public class WebxdcMessageInfo {
* Defaults to the filename if not set in the manifest.
*/
public String name;
/* Address to be used for `window.webxdc.selfAddr` in JS land. */
/** Address to be used for `window.webxdc.selfAddr` in JS land. */
public String selfAddr;
/* Milliseconds to wait before calling `sendUpdate()` again since the last call. Should be exposed to `window.sendUpdateInterval` in JS land. */
/** Milliseconds to wait before calling `sendUpdate()` again since the last call. Should be exposed to `window.sendUpdateInterval` in JS land. */
public Integer sendUpdateInterval;
/* Maximum number of bytes accepted for a serialized update object. Should be exposed to `window.sendUpdateMaxSize` in JS land. */
/** Maximum number of bytes accepted for a serialized update object. Should be exposed to `window.sendUpdateMaxSize` in JS land. */
public Integer sendUpdateMaxSize;
/* URL where the source code of the Webxdc and other information can be found; defaults to an empty string. Implementations may offer an menu or a button to open this URL. */
/** URL where the source code of the Webxdc and other information can be found; defaults to an empty string. Implementations may offer an menu or a button to open this URL. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String sourceCodeUrl;
/* short string describing the state of the app, sth. as "2 votes", "Highscore: 123", can be changed by the apps */
/** short string describing the state of the app, sth. as "2 votes", "Highscore: 123", can be changed by the apps */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summary;
}
@@ -57,10 +57,13 @@ import chat.delta.rpc.RpcException;
public class ApplicationContext extends MultiDexApplication {
private static final String TAG = ApplicationContext.class.getSimpleName();
private static final Object initLock = new Object();
private static volatile boolean isInitialized = false;
private static DcAccounts dcAccounts;
private Rpc rpc;
private DcContext dcContext;
public static DcAccounts dcAccounts;
public Rpc rpc;
public DcContext dcContext;
public DcLocationManager dcLocationManager;
public DcEventCenter eventCenter;
public NotificationCenter notificationCenter;
@@ -75,6 +78,57 @@ public class ApplicationContext extends MultiDexApplication {
return (ApplicationContext)context.getApplicationContext();
}
private static void ensureInitialized() {
synchronized (initLock) {
while (!isInitialized) {
try {
initLock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("Interrupted while waiting for initialization", e);
}
}
}
}
/**
* Get DcAccounts instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public static DcAccounts getDcAccounts() {
ensureInitialized();
return dcAccounts;
}
/**
* Get Rpc instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public Rpc getRpc() {
ensureInitialized();
return rpc;
}
/**
* Get DcContext instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public DcContext getDcContext() {
ensureInitialized();
return dcContext;
}
/**
* Set DcContext instance. This should only be called by AccountManager when switching accounts,
* which only happens after initial initialization is complete.
* This method is thread-safe but does NOT trigger initialization or notify waiting threads.
*/
public void setDcContext(DcContext dcContext) {
synchronized (initLock) {
this.dcContext = dcContext;
}
}
@Override
public void onCreate() {
super.onCreate();
@@ -110,62 +164,88 @@ public class ApplicationContext extends MultiDexApplication {
System.loadLibrary("native-utils");
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
rpc = new Rpc(new FFITransport(dcAccounts.getJsonrpcInstance()));
AccountManager.getInstance().migrateToDcAccounts(this);
// Initialize DcAccounts in background to avoid ANR during SQL migrations
Util.runOnBackground(() -> {
synchronized (initLock) {
try {
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
Log.i(TAG, "DcAccounts created");
rpc = new Rpc(new FFITransport(dcAccounts.getJsonrpcInstance()));
Log.i(TAG, "Rpc created");
AccountManager.getInstance().migrateToDcAccounts(this);
int[] allAccounts = dcAccounts.getAll();
Log.i(TAG, "Number of profiles: " + allAccounts.length);
for (int accountId : allAccounts) {
DcContext ac = dcAccounts.getAccount(accountId);
if (!ac.isOpen()) {
try {
DatabaseSecret secret = DatabaseSecretProvider.getOrCreateDatabaseSecret(this, accountId);
boolean res = ac.open(secret.asString());
if (res) Log.i(TAG, "Successfully opened account " + accountId + ", path: " + ac.getBlobdir());
else Log.e(TAG, "Error opening account " + accountId + ", path: " + ac.getBlobdir());
} catch (Exception e) {
Log.e(TAG, "Failed to open account " + accountId + ", path: " + ac.getBlobdir() + ": " + e);
e.printStackTrace();
}
}
// 2025.11.12: this is needed until core starts ignoring "delete_server_after" for chatmail
if (ac.isChatmail()) {
ac.setConfig("delete_server_after", null); // reset
}
}
if (allAccounts.length == 0) {
try {
rpc.addAccount();
} catch (RpcException e) {
e.printStackTrace();
}
}
dcContext = dcAccounts.getSelectedAccount();
notificationCenter = new NotificationCenter(this);
eventCenter = new DcEventCenter(this);
// Mark as initialized before starting threads that depend on it
isInitialized = true;
initLock.notifyAll();
Log.i(TAG, "DcAccounts initialization complete");
dcLocationManager = new DcLocationManager(this); // depends on dcContext
new Thread(() -> {
Log.i(TAG, "Starting event loop");
DcEventEmitter emitter = dcAccounts.getEventEmitter();
Log.i(TAG, "DcEventEmitter obtained");
while (true) {
DcEvent event = emitter.getNextEvent();
if (event==null) {
break;
}
eventCenter.handleEvent(event);
}
Log.i("DeltaChat", "shutting down event handler");
}, "eventThread").start();
// set translations before starting I/O to avoid sending untranslated MDNs (issue #2288)
DcHelper.setStockTranslations(this);
dcAccounts.startIo();
} catch (Exception e) {
Log.e(TAG, "Fatal error during DcAccounts initialization", e);
// Mark as initialized even on error to avoid deadlock
isInitialized = true;
initLock.notifyAll();
throw new RuntimeException("Failed to initialize DcAccounts", e);
}
}
});
// October-2025 migration: delete deprecated "permanent channel" id
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.deleteNotificationChannel("dc_foreground_notification_ch");
// end October-2025 migration
int[] allAccounts = dcAccounts.getAll();
for (int accountId : allAccounts) {
DcContext ac = dcAccounts.getAccount(accountId);
if (!ac.isOpen()) {
try {
DatabaseSecret secret = DatabaseSecretProvider.getOrCreateDatabaseSecret(this, accountId);
boolean res = ac.open(secret.asString());
if (res) Log.i(TAG, "Successfully opened account " + accountId + ", path: " + ac.getBlobdir());
else Log.e(TAG, "Error opening account " + accountId + ", path: " + ac.getBlobdir());
} catch (Exception e) {
Log.e(TAG, "Failed to open account " + accountId + ", path: " + ac.getBlobdir() + ": " + e);
e.printStackTrace();
}
}
// 2025.11.12: this is needed until core starts ignoring "delete_server_after" for chatmail
if (ac.isChatmail()) {
ac.setConfig("delete_server_after", null); // reset
}
}
if (allAccounts.length == 0) {
try {
rpc.addAccount();
} catch (RpcException e) {
e.printStackTrace();
}
}
dcContext = dcAccounts.getSelectedAccount();
notificationCenter = new NotificationCenter(this);
eventCenter = new DcEventCenter(this);
new Thread(() -> {
DcEventEmitter emitter = dcAccounts.getEventEmitter();
while (true) {
DcEvent event = emitter.getNextEvent();
if (event==null) {
break;
}
eventCenter.handleEvent(event);
}
Log.i("DeltaChat", "shutting down event handler");
}, "eventThread").start();
// set translations before starting I/O to avoid sending untranslated MDNs (issue #2288)
DcHelper.setStockTranslations(this);
dcAccounts.startIo();
new ForegroundDetector(ApplicationContext.getInstance(this));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -175,7 +255,7 @@ public class ApplicationContext extends MultiDexApplication {
@Override
public void onAvailable(@NonNull android.net.Network network) {
Log.i("DeltaChat", "++++++++++++++++++ NetworkCallback.onAvailable() #" + debugOnAvailableCount++);
dcAccounts.maybeNetwork();
getDcAccounts().maybeNetwork();
}
@Override
@@ -204,7 +284,6 @@ public class ApplicationContext extends MultiDexApplication {
initializeJobManager();
InChatSounds.getInstance(this);
dcLocationManager = new DcLocationManager(this);
DynamicTheme.setDefaultDayNightMode(this);
IntentFilter filter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
@@ -253,6 +332,8 @@ public class ApplicationContext extends MultiDexApplication {
"WebxdcGarbageCollectionWorker",
ExistingPeriodicWorkPolicy.KEEP,
webxdcGarbageCollectionRequest);
Log.i("DeltaChat", "+++++++++++ ApplicationContext.onCreate() finished ++++++++++");
}
public JobManager getJobManager() {
@@ -37,8 +37,8 @@ public abstract class BaseActionBarActivity extends AppCompatActivity {
onPreCreate();
super.onCreate(savedInstanceState);
// Only enable Edge-to-Edge on API 30+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// Only enable Edge-to-Edge if it is well supported
if (ViewUtil.isEdgeToEdgeSupported()) {
// docs says to use: WindowCompat.enableEdgeToEdge(getWindow());
// but it actually makes things worse, the next takes care of setting the 3-buttons navigation bar background
EdgeToEdge.enable(this);
@@ -786,6 +786,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
return future;
}
inputPanel.setSubject(draft.getSubject());
final String text = TextUtils.isEmpty(sharedText)? draft.getText() : sharedText;
if(!text.isEmpty()) {
composeText.setText(text);
@@ -880,6 +882,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
ImageButton quickCameraToggle = ViewUtil.findById(this, R.id.quick_camera_toggle);
if (!ViewUtil.isEdgeToEdgeSupported()) {
// since insets will not be applied, we need to set top padding to avoid drawing behind toolbar
try (TypedArray typedArray = obtainStyledAttributes(new int[]{android.R.attr.actionBarSize})) {
int paddingTop = typedArray.getDimensionPixelSize(0, 0);
container.setPadding(container.getPaddingLeft(), paddingTop, container.getPaddingRight() , container.getPaddingBottom());
}
}
// apply padding top to avoid drawing behind top bar
ViewUtil.applyWindowInsets(findViewById(R.id.fragment_content), false, true, false, false);
// apply padding to root to avoid collision with system bars
@@ -952,8 +961,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, dcContext.getAccountId());
if (accountId != dcContext.getAccountId()) {
AccountManager.getInstance().switchAccount(context, accountId);
dcContext = context.dcContext;
fragment.dcContext = context.dcContext;
fragment.dcContext = dcContext = context.getDcContext();
initializeBackground();
}
chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, -1);
@@ -971,10 +979,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
if (dcChat.canSend()) {
composePanel.setVisibility(View.VISIBLE);
attachmentManager.setHidden(false);
inputPanel.setSubjectVisible(!dcChat.isEncrypted());
} else {
composePanel.setVisibility(View.GONE);
attachmentManager.setHidden(true);
hideSoftKeyboard();
inputPanel.setSubjectVisible(false);
}
}
@@ -1057,12 +1067,14 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
Optional<QuoteModel> quote = inputPanel.getQuote();
boolean editing = isEditing;
final String subject = inputPanel.getSubject();
// for a quick ui feedback, we clear the related controls immediately on sending messages.
// for drafts, however, we do not change the controls, the activity may be resumed.
if (action==ACTION_SEND_OUT) {
composeText.setText("");
inputPanel.clearQuote();
inputPanel.clearSubject();
}
Util.runOnAnyBackgroundThread(() -> {
@@ -1127,6 +1139,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
msg.setQuote(quote.get().getQuotedMsg());
}
if (!subject.isEmpty() && msg != null) {
msg.setSubject(subject);
}
if (action==ACTION_SEND_OUT) {
// for WEBXDC, drafts are just sent out as is.
@@ -763,6 +763,9 @@ public class ConversationFragment extends MessageSelectorFragment
else if(DozeReminder.isDozeReminderMsg(getContext(), messageRecord)) {
DozeReminder.dozeReminderTapped(getContext());
}
else if(StatsSending.isStatsSendingDeviceMsg(getContext(), messageRecord)) {
StatsSending.statsDeviceMsgTapped(getActivity());
}
else if(messageRecord.getInfoType() == DcMsg.DC_INFO_WEBXDC_INFO_MESSAGE) {
if (messageRecord.getParent() != null) {
// if the parent webxdc message still exists
@@ -411,8 +411,11 @@ public class ConversationItem extends BaseConversationItem
bodyText.setClickable(false);
bodyText.setFocusable(false);
String subject = messageRecord.getSubject();
String text = messageRecord.getText();
if (!subject.isEmpty() && messageRecord.isOutgoing() && !messageRecord.isSecure()) text = subject + "\n\n" + text;
if (messageRecord.getType() == DcMsg.DC_MSG_CALL || text.isEmpty()) {
bodyText.setVisibility(View.GONE);
}
@@ -82,6 +82,8 @@ import org.thoughtcrime.securesms.util.SendRelayedMessageUtil;
import org.thoughtcrime.securesms.util.StorageUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import chat.delta.rpc.types.SecurejoinSource;
import chat.delta.rpc.types.SecurejoinUiPath;
import java.util.ArrayList;
import java.util.Date;
@@ -118,7 +120,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
// 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_25_0_android-b";
final String deviceMsgLabel = "update_2_33_1_android";
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
DcMsg msg = null;
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
@@ -129,7 +131,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
// Util.copy(inputStream, new FileOutputStream(outputFile));
// msg.setFile(outputFile, "image/jpeg");
msg.setText(getString(R.string.update_2_25, "https://i.delta.chat/#0A45953086F0C166D3BAF1D4BB2025496E4C2704&x=MVPi07rQBEmHO4FRb3brpwDe&j=n8mkKqu42WAKKUCx1bQOVh23&s=RxuXoa0vhvTs0QLsWM45Ues0&a=adb%40arcanechat.me&n=adb&b=ArcaneChat+Channel", "https://arcanechat.me/#contribute"));
msg.setText(getString(R.string.update_2_33, "https://arcanechat.me/#contribute"));
}
dcContext.addDeviceMsg(deviceMsgLabel, msg);
@@ -495,7 +497,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
if (uri.getScheme().equalsIgnoreCase(OPENPGP4FPR) || Util.isInviteURL(uri)) {
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.handleQrData(uri.toString());
qrCodeHandler.handleQrData(uri.toString(), SecurejoinSource.ExternalLink, null);
}
}
}
@@ -577,7 +579,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
case IntentIntegrator.REQUEST_CODE:
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.onScanPerformed(scanResult);
qrCodeHandler.onScanPerformed(scanResult, SecurejoinUiPath.QrIcon);
break;
default:
break;
@@ -52,6 +52,7 @@ import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
import org.thoughtcrime.securesms.relay.EditRelayActivity;
import org.thoughtcrime.securesms.relay.RelayListActivity;
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
@@ -75,7 +76,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 QR_ACCOUNT_EXTRA = "qr_account_extra";
public static final String FROM_WELCOME = "from_welcome";
private static final int REQUEST_CODE_AVATAR = 1;
@@ -108,11 +108,22 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
boolean fromWelcome = getIntent().getBooleanExtra(FROM_WELCOME, false);
if (DcHelper.getContext(this).isConfigured() == 1) {
// 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 switch to a new account:
// instead, user clicked a dcaccount:// URI directly, so we need to just offer to add a new relay
Uri uri = getIntent().getData();
if (uri != null) {
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);
}
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(!fromWelcome) {
@Override
public void handleOnBackPressed() {
@@ -233,16 +244,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
@Override
public void onStart() {
super.onStart();
String accountQr = getIntent().getStringExtra(QR_ACCOUNT_EXTRA);
if (accountQr != null) {
getIntent().removeExtra(QR_ACCOUNT_EXTRA);
setProviderFromQr(accountQr);
}
}
@Override
protected void onPause() {
super.onPause();
@@ -344,9 +344,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
DcMsg dcMsg = dcContext.getMsg(mediaItem.msgId);
DcChat dcChat = dcContext.getChat(dcMsg.getChatId());
String text = getResources().getQuantityString(
dcChat.isDeviceTalk() ? R.plurals.ask_delete_messages_simple : R.plurals.ask_delete_messages,
1, 1);
String text = getResources().getQuantityString(R.plurals.ask_delete_messages,1, 1);
int positiveBtnLabel = dcChat.isSelfTalk() ? R.string.delete : R.string.delete_for_me;
final int[] messageIds = new int[]{mediaItem.msgId};
@@ -76,9 +76,7 @@ public abstract class MessageSelectorFragment
canDeleteForAll = false;
}
String text = getActivity().getResources().getQuantityString(
dcChat.isDeviceTalk() ? R.plurals.ask_delete_messages_simple : R.plurals.ask_delete_messages,
messageIds.length, messageIds.length);
String text = getActivity().getResources().getQuantityString(R.plurals.ask_delete_messages, messageIds.length, messageIds.length);
int positiveBtnLabel = dcChat.isSelfTalk() ? R.string.delete : R.string.delete_for_me;
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity())
@@ -39,6 +39,8 @@ import org.thoughtcrime.securesms.qr.QrActivity;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.util.MailtoUtil;
import chat.delta.rpc.types.SecurejoinUiPath;
/**
* Activity container for starting a new conversation.
*
@@ -142,7 +144,7 @@ public class NewConversationActivity extends ContactSelectionActivity {
case IntentIntegrator.REQUEST_CODE:
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.onScanPerformed(scanResult);
qrCodeHandler.onScanPerformed(scanResult, SecurejoinUiPath.NewContact);
break;
default:
break;
@@ -0,0 +1,100 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_STATS_SENDING;
import static org.thoughtcrime.securesms.connect.DcHelper.openHelp;
import android.app.Activity;
import android.content.Context;
import android.text.util.Linkify;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcMsg;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import java.util.Locale;
public class StatsSending {
/** @noinspection unused: We will start adding a device message once stats-sending is tested a bit */
public static void maybeAddStatsSendingDeviceMsg(Context context) {
if (Prefs.getStatsDeviceMsgId(context) != 0) {
return;
}
if (DcHelper.getInt(context, CONFIG_STATS_SENDING) != 0) {
return; // Stats-sending is already enabled
}
DcContext dcContext = DcHelper.getContext(context);
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText(context.getString(R.string.stats_device_message));
int msgId = dcContext.addDeviceMsg("stats_device_message", msg);
if (msgId!=0) {
Prefs.setStatsDeviceMsgId(context, msgId);
}
}
public static boolean isStatsSendingDeviceMsg(Context context, DcMsg msg) {
return msg != null
&& msg.getFromId() == DcContact.DC_CONTACT_ID_DEVICE
&& msg.getId() == Prefs.getStatsDeviceMsgId(context);
}
public static void statsDeviceMsgTapped(Activity activity) {
if (DcHelper.getInt(activity, CONFIG_STATS_SENDING) != 0) {
showStatsDisableDialog(activity);
} else {
showStatsConfirmationDialog(activity, () -> {});
}
}
public static void showStatsConfirmationDialog(Activity activity, Runnable onConfigChangedListener) {
AlertDialog d = new AlertDialog.Builder(activity)
.setMessage(R.string.stats_confirmation_dialog)
.setNegativeButton(R.string.cancel, (_d, i) -> {})
.setPositiveButton(R.string.yes, (_d, i) -> {
DcHelper.set(activity, DcHelper.CONFIG_STATS_SENDING, "1");
onConfigChangedListener.run();
showStatsThanksDialog(activity);
})
.setNeutralButton(R.string.more_info_desktop, (_d, i) -> openHelp(activity, "#statssending"))
.create();
d.show();
try {
//noinspection DataFlowIssue
Linkify.addLinks((TextView) d.findViewById(android.R.id.message), Linkify.WEB_URLS);
} catch (NullPointerException e) {
//noinspection CallToPrintStackTrace
e.printStackTrace();
}
}
private static void showStatsThanksDialog(Activity activity) {
String stats_id = DcHelper.get(activity, DcHelper.CONFIG_STATS_ID);
new AlertDialog.Builder(activity)
.setMessage(R.string.stats_thanks)
.setNeutralButton(R.string.no, (d, i) -> {})
.setPositiveButton(R.string.yes, (d, i) -> {
String ln = Locale.getDefault().getLanguage();
IntentUtils.showInBrowser(activity, "https://cispa.qualtrics.com/jfe/form/SV_9YmhkpGa48KxfLg?id=" + stats_id + "&ln=" + ln);
})
.show();
}
public static void showStatsDisableDialog(Activity activity) {
AlertDialog d = new AlertDialog.Builder(activity)
.setMessage(R.string.stats_disable_dialog)
.setNegativeButton(R.string.disable, (_d, i) -> {
DcHelper.set(activity, DcHelper.CONFIG_STATS_SENDING, "0");
})
.setPositiveButton(R.string.stats_keep_sending, (_d, i) -> {
})
.setNeutralButton(R.string.more_info_desktop, (_d, i) -> openHelp(activity, "#statssending"))
.create();
d.show();
}
}
@@ -28,6 +28,8 @@ import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import chat.delta.rpc.types.SecurejoinSource;
import java.net.IDN;
public class WebViewActivity extends PassphraseRequiredActionBarActivity
@@ -102,6 +104,8 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
case "mailto":
case "openpgp4fpr":
case "geo":
case "dcaccount":
case "dclogin":
return openOnlineUrl(url);
}
}
@@ -300,7 +304,7 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
// invite-links should be handled directly
String schema = url.split(":")[0].toLowerCase();
if (schema.equals("openpgp4fpr") || url.startsWith("https://" + Util.INVITE_DOMAIN + "/")) {
new QrCodeHandler(this).handleQrData(url);
new QrCodeHandler(this).handleQrData(url, SecurejoinSource.InternalLink, null);
return true; // abort internal loading
}
@@ -56,6 +56,7 @@ public class InputPanel extends ConstraintLayout
private QuoteView quoteView;
private EmojiToggle emojiToggle;
private ComposeText composeText;
private android.widget.EditText subjectText;
private View quickCameraToggle;
private View quickAudioToggle;
private View buttonToggle;
@@ -91,6 +92,7 @@ public class InputPanel extends ConstraintLayout
this.quoteView = findViewById(R.id.quote_view);
this.emojiToggle = findViewById(R.id.emoji_toggle);
this.composeText = findViewById(R.id.embedded_text_editor);
this.subjectText = findViewById(R.id.subject_text);
this.quickCameraToggle = findViewById(R.id.quick_camera_toggle);
this.quickAudioToggle = findViewById(R.id.quick_audio_toggle);
this.buttonToggle = findViewById(R.id.button_toggle);
@@ -198,6 +200,30 @@ public class InputPanel extends ConstraintLayout
composeText.performClick();
}
public void setSubjectVisible(boolean visible) {
subjectText.setVisibility(visible ? View.VISIBLE : View.GONE);
emojiToggle.setVisibility(!visible ? View.VISIBLE : View.GONE);
}
public String getSubject() {
if (subjectText != null && subjectText.getVisibility() == View.VISIBLE) {
return subjectText.getText().toString().trim();
}
return "";
}
public void clearSubject() {
if (subjectText != null) {
subjectText.setText("");
}
}
public void setSubject(String subject) {
if (subjectText != null && subject != null) {
subjectText.setText(subject);
}
}
public void setMediaKeyboard(@NonNull MediaKeyboard mediaKeyboard) {
mediaKeyboard.setKeyboardListener(this);
}
@@ -110,7 +110,7 @@ public class DozeReminder {
}
private static boolean isPushAvailableAndSufficient() {
return ApplicationContext.dcAccounts.isAllChatmail()
return ApplicationContext.getDcAccounts().isAllChatmail()
&& FcmReceiveService.getToken() != null;
}
@@ -31,7 +31,7 @@ public class AccountManager {
private void resetDcContext(Context context) {
ApplicationContext appContext = (ApplicationContext)context.getApplicationContext();
appContext.dcContext = ApplicationContext.dcAccounts.getSelectedAccount();
appContext.setDcContext(ApplicationContext.getDcAccounts().getSelectedAccount());
DcHelper.setStockTranslations(context);
DirectShareUtil.resetAllShortcuts(appContext);
}
@@ -55,7 +55,7 @@ public class AccountManager {
for (File file : files) {
// old accounts have the pattern "messenger*.db"
if (!file.isDirectory() && file.getName().startsWith("messenger") && file.getName().endsWith(".db")) {
int accountId = ApplicationContext.dcAccounts.migrateAccount(file.getAbsolutePath());
int accountId = ApplicationContext.getDcAccounts().migrateAccount(file.getAbsolutePath());
if (accountId != 0) {
String selName = PreferenceManager.getDefaultSharedPreferences(context)
.getString("curr_account_db_name", "messenger.db");
@@ -70,7 +70,7 @@ public class AccountManager {
}
if (selectAccountId != 0) {
ApplicationContext.dcAccounts.selectAccount(selectAccountId);
ApplicationContext.getDcAccounts().selectAccount(selectAccountId);
}
} catch (Exception e) {
Log.e(TAG, "Error in migrateToDcAccounts()", e);
@@ -152,14 +152,6 @@ public class AccountManager {
dialog.show(((FragmentActivity) activity).getSupportFragmentManager(), null);
}
public void addAccountFromQr(Activity activity, String qr) {
beginAccountCreation(activity);
activity.finishAffinity();
Intent intent = new Intent(activity, InstantOnboardingActivity.class);
intent.putExtra(InstantOnboardingActivity.QR_ACCOUNT_EXTRA, qr);
activity.startActivity(intent);
}
public void addAccountFromSecondDevice(Activity activity, String backupQr) {
switchAccountAndStartActivity(activity, 0, backupQr);
}
@@ -220,7 +220,7 @@ public class DcEventCenter {
break;
}
if (accountId != context.dcContext.getAccountId()) {
if (accountId != context.getDcContext().getAccountId()) {
return 0;
}
@@ -62,17 +62,19 @@ public class DcHelper {
public static final String CONFIG_PROXY_URL = "proxy_url";
public static final String CONFIG_WEBXDC_REALTIME_ENABLED = "webxdc_realtime_enabled";
public static final String CONFIG_PRIVATE_TAG = "private_tag";
public static final String CONFIG_STATS_SENDING = "stats_sending";
public static final String CONFIG_STATS_ID = "stats_id";
public static DcContext getContext(@NonNull Context context) {
return ApplicationContext.getInstance(context).dcContext;
return ApplicationContext.getInstance(context).getDcContext();
}
public static Rpc getRpc(@NonNull Context context) {
return ApplicationContext.getInstance(context).rpc;
return ApplicationContext.getInstance(context).getRpc();
}
public static DcAccounts getAccounts(@NonNull Context context) {
return ApplicationContext.getInstance(context).dcAccounts;
return ApplicationContext.getInstance(context).getDcAccounts();
}
public static DcEventCenter getEventCenter(@NonNull Context context) {
@@ -131,7 +133,7 @@ public class DcHelper {
dcContext.setStockTranslation(68, context.getString(R.string.device_talk));
dcContext.setStockTranslation(69, context.getString(R.string.saved_messages));
dcContext.setStockTranslation(70, context.getString(R.string.device_talk_explain));
dcContext.setStockTranslation(71, context.getString(R.string.device_talk_welcome_message2));
dcContext.setStockTranslation(71, context.getString(R.string.device_welcome_message, "https://i.delta.chat/#0A45953086F0C166D3BAF1D4BB2025496E4C2704&x=MVPi07rQBEmHO4FRb3brpwDe&j=n8mkKqu42WAKKUCx1bQOVh23&s=RxuXoa0vhvTs0QLsWM45Ues0&a=adb%40arcanechat.me&n=adb&b=ArcaneChat+Channel"));
dcContext.setStockTranslation(73, context.getString(R.string.systemmsg_subject_for_new_contact));
dcContext.setStockTranslation(74, context.getString(R.string.systemmsg_failed_sending_to));
dcContext.setStockTranslation(84, context.getString(R.string.configuration_failed_with_error));
@@ -22,6 +22,8 @@ import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.util.ViewUtil;
import chat.delta.rpc.types.SecurejoinUiPath;
public class NewContactActivity extends PassphraseRequiredActionBarActivity
{
@@ -105,7 +107,7 @@ public class NewContactActivity extends PassphraseRequiredActionBarActivity
if (requestCode == IntentIntegrator.REQUEST_CODE) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.onScanPerformed(scanResult);
qrCodeHandler.onScanPerformed(scanResult, SecurejoinUiPath.NewContact);
}
}
}
@@ -426,7 +426,7 @@ public class NotificationCenter {
public void notifyCall(int accId, int callId, String payload) {
Util.runOnAnyBackgroundThread(() -> {
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
DcContext dcContext = context.dcAccounts.getAccount(accId);
DcContext dcContext = context.getDcAccounts().getAccount(accId);
int chatId = dcContext.getMsg(callId).getChatId();
DcChat dcChat = dcContext.getChat(chatId);
String name = dcChat.getName();
@@ -478,7 +478,7 @@ public class NotificationCenter {
public void notifyMessage(int accountId, int chatId, int msgId) {
Util.runOnAnyBackgroundThread(() -> {
DcContext dcContext = context.dcAccounts.getAccount(accountId);
DcContext dcContext = context.getDcAccounts().getAccount(accountId);
DcChat dcChat = dcContext.getChat(chatId);
DcMsg dcMsg = dcContext.getMsg(msgId);
@@ -508,7 +508,7 @@ public class NotificationCenter {
public void notifyReaction(int accountId, int contactId, int msgId, String reaction) {
Util.runOnAnyBackgroundThread(() -> {
DcContext dcContext = context.dcAccounts.getAccount(accountId);
DcContext dcContext = context.getDcAccounts().getAccount(accountId);
DcMsg dcMsg = dcContext.getMsg(msgId);
NotificationPrivacyPreference privacy = Prefs.getNotificationPrivacy(context);
@@ -530,7 +530,7 @@ public class NotificationCenter {
return; // showing "New Message" is wrong, just do nothing.
}
DcContext dcContext = context.dcAccounts.getAccount(accountId);
DcContext dcContext = context.getDcAccounts().getAccount(accountId);
DcMsg dcMsg = dcContext.getMsg(msgId);
DcMsg parentMsg;
if(dcMsg.getType() == DcMsg.DC_MSG_WEBXDC) {
@@ -554,7 +554,7 @@ public class NotificationCenter {
@WorkerThread
private void maybeAddNotification(int accountId, DcChat dcChat, int msgId, String shortLine, String tickerLine, boolean playInChatSound, boolean isMention) {
DcContext dcContext = context.dcAccounts.getAccount(accountId);
DcContext dcContext = context.getDcAccounts().getAccount(accountId);
int chatId = dcChat.getId();
ChatData chatData = new ChatData(accountId, chatId);
isMention = isMention && dcContext.isMentionsEnabled();
@@ -602,7 +602,7 @@ public class NotificationCenter {
}
String accountTag = dcContext.getConfig(CONFIG_PRIVATE_TAG);
if (accountTag.isEmpty() && context.dcAccounts.getAll().length > 1) {
if (accountTag.isEmpty() && context.getDcAccounts().getAll().length > 1) {
accountTag = dcContext.getName();
}
@@ -5,6 +5,7 @@ import static android.text.InputType.TYPE_TEXT_VARIATION_URI;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_BCC_SELF;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_MVBOX_MOVE;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_ONLY_FETCH_MVBOX;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_STATS_SENDING;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SHOW_EMAILS;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_WEBXDC_REALTIME_ENABLED;
@@ -16,6 +17,8 @@ import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -28,10 +31,11 @@ import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.LogViewActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.relay.RelayListActivity;
import org.thoughtcrime.securesms.StatsSending;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.ScreenLockUtil;
import org.thoughtcrime.securesms.util.StreamUtil;
import org.thoughtcrime.securesms.util.Util;
@@ -49,6 +53,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
private static final String TAG = AdvancedPreferenceFragment.class.getSimpleName();
private ListPreference showEmails;
CheckBoxPreference selfReportingCheckbox;
CheckBoxPreference multiDeviceCheckbox;
CheckBoxPreference mvboxMoveCheckbox;
CheckBoxPreference onlyFetchMvboxCheckbox;
@@ -138,6 +143,22 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
}
updateWebxdcStoreSummary();
selfReportingCheckbox = this.findPreference("pref_stats_sending");
if (selfReportingCheckbox != null) {
selfReportingCheckbox.setOnPreferenceChangeListener((preference, newValue) -> {
boolean enabled = (Boolean) newValue;
if (enabled) {
StatsSending.showStatsConfirmationDialog(requireActivity(), () -> {
((CheckBoxPreference)preference).setChecked(true);
});
return false;
} else {
dcContext.setConfigInt(CONFIG_STATS_SENDING, 0);
return true;
}
});
}
Preference proxySettings = this.findPreference("proxy_settings_button");
if (proxySettings != null) {
proxySettings.setOnPreferenceClickListener((preference) -> {
@@ -149,10 +170,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
Preference relayListBtn = this.findPreference("pref_relay_list_button");
if (relayListBtn != null) {
relayListBtn.setOnPreferenceClickListener(((preference) -> {
boolean result = ScreenLockUtil.applyScreenLock(requireActivity(), getString(R.string.transports), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT);
if (!result) {
openRelayListActivity();
}
openRelayListActivity();
return true;
}));
}
@@ -176,6 +194,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment
showEmails.setValue(value);
updateListSummary(showEmails, value);
selfReportingCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_STATS_SENDING));
multiDeviceCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_BCC_SELF));
mvboxMoveCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_MVBOX_MOVE));
onlyFetchMvboxCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_ONLY_FETCH_MVBOX));
@@ -69,7 +69,7 @@ public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment {
@Override
public void onResume() {
super.onResume();
((ApplicationPreferencesActivity)getActivity()).getSupportActionBar().setTitle(R.string.pref_chats_and_media);
((ApplicationPreferencesActivity)getActivity()).getSupportActionBar().setTitle(R.string.pref_chats);
String value = Integer.toString(dcContext.getConfigInt(DcHelper.CONFIG_MEDIA_QUALITY));
mediaQuality.setValue(value);
@@ -122,8 +122,26 @@ public class PersistentBlobProvider {
}
public Uri createForExternal(@NonNull Context context, @NonNull String mimeType) throws IOException, IllegalStateException, NullPointerException {
File target = new File(getExternalDir(context), System.currentTimeMillis() + "." + getExtensionFromMimeType(mimeType));
return FileProviderUtil.getUriFor(context, target);
String filename = System.currentTimeMillis() + "." + getExtensionFromMimeType(mimeType);
// Try external cache first
try {
File externalDir = getExternalDir(context);
File target = new File(externalDir, filename);
return FileProviderUtil.getUriFor(context, target);
} catch (IllegalArgumentException e) {
// FileProvider doesn't support the external cache path (e.g., on removable SD card).
// Note: getExternalDir() already falls back to internal cache when external cache is null,
// but when external cache exists on a removable SD card, FileProvider may reject it.
// In that case, we explicitly use internal cache which FileProvider always supports.
Log.w(TAG, "FileProvider doesn't support external cache path, falling back to internal cache", e);
File internalDir = context.getCacheDir();
if (internalDir == null) {
throw new IOException("no cache directory available");
}
File target = new File(internalDir, filename);
return FileProviderUtil.getUriFor(context, target);
}
}
public boolean delete(@NonNull Context context, @NonNull Uri uri) {
@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.qr;
import android.Manifest;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
@@ -29,6 +30,8 @@ import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import org.thoughtcrime.securesms.BaseActionBarActivity;
import org.thoughtcrime.securesms.ConversationListActivity;
import org.thoughtcrime.securesms.NewConversationActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.contacts.NewContactActivity;
@@ -41,6 +44,9 @@ import org.thoughtcrime.securesms.util.ViewUtil;
import java.io.FileNotFoundException;
import java.io.InputStream;
import chat.delta.rpc.types.SecurejoinSource;
import chat.delta.rpc.types.SecurejoinUiPath;
public class QrActivity extends BaseActionBarActivity implements View.OnClickListener {
private final static String TAG = QrActivity.class.getSimpleName();
@@ -110,7 +116,7 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
.onAllGranted(() -> ((QrScanFragment) adapter.getItem(TAB_SCAN)).handleQrScanWithPermissions(QrActivity.this))
.onAnyDenied(() -> {
if (scanRelay) {
finish();
Toast.makeText(this, getString(R.string.chat_camera_unavailable), Toast.LENGTH_LONG).show();
} else {
viewPager.setCurrentItem(TAB_SHOW);
}
@@ -123,7 +129,7 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
getMenuInflater().inflate(R.menu.qr_show, menu);
menu.findItem(R.id.new_classic_contact).setVisible(!DcHelper.getContext(this).isChatmail());
menu.findItem(R.id.new_classic_contact).setVisible(!scanRelay && !DcHelper.getContext(this).isChatmail());
Util.redMenuItem(menu, R.id.withdraw);
if(tabLayout.getSelectedTabPosition() == TAB_SCAN) {
@@ -149,7 +155,7 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
AttachmentManager.selectImage(this, REQUEST_CODE_IMAGE);
} else if (itemId == R.id.paste) {
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.handleQrData(Util.getTextFromClipboard(this));
qrCodeHandler.handleQrData(Util.getTextFromClipboard(this), SecurejoinSource.Clipboard, getUiPath());
}
return false;
@@ -162,7 +168,7 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
&& Manifest.permission.CAMERA.equals(permissions[0])
&& grantResults[0] == PackageManager.PERMISSION_DENIED) {
if (scanRelay) {
finish();
Toast.makeText(this, getString(R.string.chat_camera_unavailable), Toast.LENGTH_LONG).show();
} else {
viewPager.setCurrentItem(TAB_SHOW);
}
@@ -200,7 +206,7 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
try {
Result result = reader.decode(bBitmap);
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.handleQrData(result.getText());
qrCodeHandler.handleQrData(result.getText(), SecurejoinSource.ImageLoaded, getUiPath());
} catch (NotFoundException e) {
Log.e(TAG, "decode exception", e);
Toast.makeText(this, getString(R.string.qrscan_failed), Toast.LENGTH_LONG).show();
@@ -213,6 +219,21 @@ public class QrActivity extends BaseActionBarActivity implements View.OnClickLis
}
}
private SecurejoinUiPath getUiPath() {
SecurejoinUiPath uiPath = null;
ComponentName caller = this.getCallingActivity();
if (caller != null) {
if (caller.getClassName().equals(NewConversationActivity.class.getName())) {
uiPath = SecurejoinUiPath.NewContact;
} else if (caller.getClassName().equals(ConversationListActivity.class.getName())
// RoutingActivity is an alias for ConversationListActivity
|| caller.getClassName().endsWith(".RoutingActivity")) {
uiPath = SecurejoinUiPath.QrIcon;
}
}
return uiPath;
}
@Override
public void onClick(View v) {
viewPager.setCurrentItem(TAB_SCAN);
@@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.ConversationActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.AccountManager;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.relay.RelayListActivity;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
@@ -24,10 +25,22 @@ import org.thoughtcrime.securesms.util.views.ProgressDialog;
import chat.delta.rpc.Rpc;
import chat.delta.rpc.RpcException;
public class QrCodeHandler {
import chat.delta.rpc.types.SecurejoinSource;
import chat.delta.rpc.types.SecurejoinUiPath;
public class QrCodeHandler {
private static final String TAG = QrCodeHandler.class.getSimpleName();
public static int SECUREJOIN_SOURCE_EXTERNAL_LINK = 1;
public static int SECUREJOIN_SOURCE_INTERNAL_LINK = 2;
public static int SECUREJOIN_SOURCE_CLIPBOARD = 3;
public static int SECUREJOIN_SOURCE_IMAGE_LOADED = 4;
public static int SECUREJOIN_SOURCE_SCAN = 5;
public static int SECUREJOIN_UIPATH_QR_ICON = 1;
public static int SECUREJOIN_UIPATH_NEW_CONTACT = 2;
private final Activity activity;
private final DcContext dcContext;
private final Rpc rpc;
@@ -40,15 +53,15 @@ public class QrCodeHandler {
accId = dcContext.getAccountId();
}
public void onScanPerformed(IntentResult scanResult) {
public void onScanPerformed(IntentResult scanResult, SecurejoinUiPath uipath) {
if (scanResult == null || scanResult.getFormatName() == null) {
return; // aborted
}
handleQrData(scanResult.getContents());
handleQrData(scanResult.getContents(), SecurejoinSource.Scan, uipath);
}
public void handleQrData(String rawString) {
public void handleQrData(String rawString, SecurejoinSource source, SecurejoinUiPath uiPath) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
final DcLot qrParsed = dcContext.checkQr(rawString);
String name = dcContext.getContact(qrParsed.getId()).getDisplayName();
@@ -56,7 +69,7 @@ public class QrCodeHandler {
case DcContext.DC_QR_ASK_VERIFYCONTACT:
case DcContext.DC_QR_ASK_VERIFYGROUP:
case DcContext.DC_QR_ASK_JOIN_BROADCAST:
showVerifyContactOrGroup(activity, builder, rawString, qrParsed, name);
showVerifyContactOrGroup(activity, builder, rawString, qrParsed, name, source, uiPath);
break;
case DcContext.DC_QR_FPR_WITHOUT_ADDR:
@@ -223,7 +236,13 @@ public class QrCodeHandler {
});
}
private void showVerifyContactOrGroup(Activity activity, AlertDialog.Builder builder, String qrRawString, DcLot qrParsed, String name) {
private void showVerifyContactOrGroup(Activity activity,
AlertDialog.Builder builder,
String qrRawString,
DcLot qrParsed,
String name,
SecurejoinSource source,
SecurejoinUiPath uipath) {
String msg;
switch (qrParsed.getState()) {
case DcContext.DC_QR_ASK_VERIFYGROUP:
@@ -238,17 +257,17 @@ public class QrCodeHandler {
}
builder.setMessage(msg);
builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
DcHelper.getEventCenter(activity).captureNextError();
int newChatId = dcContext.joinSecurejoin(qrRawString);
DcHelper.getEventCenter(activity).endCaptureNextError();
try {
int newChatId = DcHelper.getRpc(activity).secureJoinWithUxInfo(dcContext.getAccountId(), qrRawString, source, uipath);
if (newChatId == 0) throw new Exception("Securejoin failed to create a chat");
if (newChatId != 0) {
Intent intent = new Intent(activity, ConversationActivity.class);
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, newChatId);
activity.startActivity(intent);
} else {
} catch (Exception e) {
e.printStackTrace();
AlertDialog.Builder builder1 = new AlertDialog.Builder(activity);
builder1.setMessage(dcContext.getLastError());
builder1.setMessage(e.getMessage());
builder1.setPositiveButton(android.R.string.ok, null);
builder1.create().show();
}
@@ -282,7 +301,16 @@ public class QrCodeHandler {
Util.runOnMain(() -> {
if (!progressDialog.isShowing()) return; // canceled dialog, nothing to do
if (finalError != null) {
Toast.makeText(activity, finalError, Toast.LENGTH_LONG).show();
new AlertDialog.Builder(activity)
.setTitle(R.string.error)
.setMessage(finalError)
.setPositiveButton(R.string.ok, null)
.show();
} else {
showDoneToast(activity);
if (!(activity instanceof RelayListActivity)) {
activity.startActivity(new Intent(activity, RelayListActivity.class));
}
}
try {
progressDialog.dismiss();
@@ -32,11 +32,14 @@ import java.util.List;
import chat.delta.rpc.Rpc;
import chat.delta.rpc.RpcException;
import chat.delta.rpc.types.EnteredLoginParam;
import chat.delta.rpc.types.SecurejoinSource;
import chat.delta.rpc.types.SecurejoinUiPath;
public class RelayListActivity extends BaseActionBarActivity
implements RelayListAdapter.OnRelayClickListener, DcEventCenter.DcEventDelegate {
private static final String TAG = RelayListActivity.class.getSimpleName();
public static final String EXTRA_QR_DATA = "qr_data";
private RelayListAdapter adapter;
private Rpc rpc;
@@ -83,6 +86,12 @@ public class RelayListActivity extends BaseActionBarActivity
DcEventCenter eventCenter = DcHelper.getEventCenter(this);
eventCenter.addObserver(DcContext.DC_EVENT_CONFIGURE_PROGRESS, this);
String qrdata = getIntent().getStringExtra(EXTRA_QR_DATA);
if (qrdata != null) {
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.handleQrData(qrdata, SecurejoinSource.Unknown, SecurejoinUiPath.Unknown);
}
}
@Override
@@ -166,7 +175,7 @@ public class RelayListActivity extends BaseActionBarActivity
if (requestCode == IntentIntegrator.REQUEST_CODE) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
qrCodeHandler.onScanPerformed(scanResult);
qrCodeHandler.onScanPerformed(scanResult, SecurejoinUiPath.Unknown);
}
}
@@ -45,7 +45,7 @@ public final class FetchForegroundService extends Service {
// we need to handle the message within 20s, and the time window may be even shorter than 20s,
// so, use 10s to be safe.
fetchingSynchronously = true;
if (ApplicationContext.dcAccounts.backgroundFetch(10)) {
if (ApplicationContext.getDcAccounts().backgroundFetch(10)) {
// The background fetch was successful, but we need to wait until all events were processed.
// After all events were processed, we will get DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE,
// and stop() will be called.
@@ -92,7 +92,7 @@ public final class FetchForegroundService extends Service {
Util.runOnAnyBackgroundThread(() -> {
Log.i(TAG, "Starting fetch");
if (!ApplicationContext.dcAccounts.backgroundFetch(300)) { // as startForeground() was called, there is time
if (!ApplicationContext.getDcAccounts().backgroundFetch(300)) { // as startForeground() was called, there is time
FetchForegroundService.stop(this);
} // else we stop FetchForegroundService on DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE
});
@@ -111,7 +111,7 @@ public final class FetchForegroundService extends Service {
@Override
public void onTimeout(int startId, int fgsType) {
ApplicationContext.dcAccounts.stopBackgroundFetch();
ApplicationContext.getDcAccounts().stopBackgroundFetch();
stopSelf();
}
@@ -19,6 +19,8 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import chat.delta.rpc.types.SecurejoinSource;
public class LongClickCopySpan extends ClickableSpan {
private static final String PREFIX_MAILTO = "mailto:";
private static final String PREFIX_TEL = "tel:";
@@ -80,13 +82,13 @@ public class LongClickCopySpan extends ClickableSpan {
}
} else if (Util.isInviteURL(url)) {
QrCodeHandler qrCodeHandler = new QrCodeHandler((Activity) widget.getContext());
qrCodeHandler.handleQrData(url);
qrCodeHandler.handleQrData(url, SecurejoinSource.InternalLink, null);
} else {
Activity activity = (Activity) widget.getContext();
DcContext dcContext = DcHelper.getContext(activity);
if (dcContext.checkQr(url).getState() == DcContext.DC_QR_PROXY) {
QrCodeHandler qrCodeHandler = new QrCodeHandler(activity);
qrCodeHandler.handleQrData(url);
qrCodeHandler.handleQrData(url, null, null);
} else {
IntentUtils.showInBrowser(widget.getContext(), url);
}
@@ -12,12 +12,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import com.b44t.messenger.DcAccounts;
import com.b44t.messenger.DcContext;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.notifications.FcmReceiveService;
import org.thoughtcrime.securesms.preferences.widgets.NotificationPrivacyPreference;
import java.util.ArrayList;
@@ -46,6 +44,7 @@ public class Prefs {
public static final String SCREEN_SECURITY_PREF = "pref_screen_security";
private static final String ENTER_SENDS_PREF = "pref_enter_sends";
private static final String PROMPTED_DOZE_MSG_ID_PREF = "pref_prompted_doze_msg_id";
private static final String STATS_DEVICE_MSG_ID_PREF = "pref_stats_device_msg_id";
public static final String DOZE_ASKED_DIRECTLY = "pref_doze_asked_directly";
public static final String ASKED_FOR_NOTIFICATION_PERMISSION= "pref_asked_for_notification_permission";
private static final String IN_THREAD_NOTIFICATION_PREF = "pref_key_inthread_notifications";
@@ -154,6 +153,14 @@ public class Prefs {
return getIntegerPreference(context, PROMPTED_DOZE_MSG_ID_PREF, 0);
}
public static void setStatsDeviceMsgId(Context context, int msg_id) {
setIntegerPreference(context, STATS_DEVICE_MSG_ID_PREF, msg_id);
}
public static int getStatsDeviceMsgId(Context context) {
return getIntegerPreference(context, STATS_DEVICE_MSG_ID_PREF, 0);
}
public static boolean isPushEnabled(Context context) {
return BuildConfig.USE_PLAY_SERVICES;
}
@@ -299,6 +299,11 @@ public class ViewUtil {
return selection;
}
/** Return true if the system supports edge-to-edge properly */
public static boolean isEdgeToEdgeSupported() {
return Build.VERSION.SDK_INT >= VERSION_CODES.R;
}
/**
* Get combined insets from status bar, navigation bar and display cutout areas.
*
@@ -335,7 +340,7 @@ public class ViewUtil {
*/
public static void applyWindowInsetsAsMargin(@NonNull View view, boolean left, boolean top, boolean right, boolean bottom) {
// Only enable on API 30+ where WindowInsets APIs work correctly
if (Build.VERSION.SDK_INT < VERSION_CODES.R) return;
if (!isEdgeToEdgeSupported()) return;
// Store the original margin as a tag only if not already stored
// This prevents losing the true original margin on subsequent calls
@@ -406,7 +411,7 @@ public class ViewUtil {
*/
public static void applyWindowInsets(@NonNull View view, boolean left, boolean top, boolean right, boolean bottom) {
// Only enable on API 30+ where WindowInsets APIs work correctly
if (Build.VERSION.SDK_INT < VERSION_CODES.R) return;
if (!isEdgeToEdgeSupported()) return;
// Store the original padding as a tag only if not already stored
// This prevents losing the true original padding on subsequent calls
@@ -475,7 +480,7 @@ public class ViewUtil {
*/
public static void adjustToolbarForE2E(@NonNull AppCompatActivity activity) {
// Only enable on API 30+ where WindowInsets APIs work correctly
if (Build.VERSION.SDK_INT < VERSION_CODES.R) return;
if (!isEdgeToEdgeSupported()) return;
// The toolbar/app bar should extend behind the status bar with padding applied
View toolbar = activity.findViewById(R.id.toolbar);
@@ -18,11 +18,11 @@ import org.thoughtcrime.securesms.connect.DcHelper;
public class WebxdcGarbageCollectionWorker extends ListenableWorker {
private static final String TAG = WebxdcGarbageCollectionWorker.class.getSimpleName();
private Rpc rpc;
private Context context;
public WebxdcGarbageCollectionWorker(Context context, WorkerParameters params) {
super(context, params);
rpc = DcHelper.getRpc(context);
this.context = context;
}
@Override
@@ -42,6 +42,13 @@ public class WebxdcGarbageCollectionWorker extends ListenableWorker {
return;
}
Rpc rpc = DcHelper.getRpc(context);
if (rpc == null) {
Log.e(TAG, "Failed to get access to RPC, Webxdc storage garbage collection aborted.");
completer.set(Result.failure());
return;
}
for (Object key : origins.keySet()) {
String url = (String)key;
Matcher m = WEBXDC_URL_PATTERN.matcher(url);
Binary file not shown.

Before

Width:  |  Height:  |  Size: 630 KiB

After

Width:  |  Height:  |  Size: 92 KiB

@@ -25,11 +25,28 @@
app:message_type="preview"
tools:visibility="visible" />
<EditText
android:id="@+id/subject_text"
style="@style/ComposeEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="6dp"
android:hint="@string/subject"
android:inputType="text"
android:maxLines="1"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/quote_view"
tools:visibility="visible" />
<FrameLayout
android:id="@+id/input_field_frame_layout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/button_toggle"
app:layout_constraintTop_toBottomOf="@id/quote_view"
app:layout_constraintTop_toBottomOf="@id/subject_text"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
@@ -28,6 +28,7 @@
android:scrollHorizontally="true"
android:inputType="textImeMultiLine|textNoSuggestions|textMultiLine"
android:textSize="12sp"
android:saveEnabled="false"
tools:ignore="UnusedAttribute,SmallSp"/>
</LinearLayout>
</ScrollView>
+1
View File
@@ -175,6 +175,7 @@
<string name="pref_led_color">لون ضوء التنبيه LED</string>
<string name="pref_sound">الصوت</string>
<string name="pref_privacy">الخصوصية</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">الدردشة والوسائط</string>
<string name="pref_system_default">افتراضيات النظام</string>
<!-- Translators: as in "opposite of dark" -->
+1
View File
@@ -295,6 +295,7 @@
<string name="pref_sound">Səs</string>
<string name="pref_silent">Səssiz</string>
<string name="pref_privacy">Gizlilik</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Çatlar və faillar</string>
<!-- Translators: as in "opposite of dark" -->
<string name="pref_light_theme">Açıq</string>
+6 -3
View File
@@ -304,7 +304,7 @@
</plurals>
<string name="file_saved_to">Файлът е записан в \"%1$s\"</string>
<!-- Used for the deletion of Device messages -->
<!-- deprecated, use ask_delete_messages -->
<plurals name="ask_delete_messages_simple">
<item quantity="one">Да бъде ли изтрито %d съобщение?</item>
<item quantity="other">Да бъдат ли изтрити %d съобщения?</item>
@@ -373,6 +373,7 @@
<!-- mailing lists -->
<string name="mailing_list">Пощенски списък</string>
<!-- deprecated -->
<string name="mailing_list_profile_info">Промените по имена и изображения на пощенски списъци са приложими само за това устройство.</string>
<!-- webxdc -->
@@ -490,7 +491,7 @@
<string name="onboarding_create_instant_account">Създаване на нов профил</string>
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
<string name="onboarding_alternative_logins">Вече имам профил</string>
<!-- This is a button and a title, allowing to log in to existing, classic email accounts, setting ports, passwords and so on -->
<!-- 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">Вход в класическа електронна поща</string>
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
<string name="instant_onboarding_title">Вашият профил</string>
@@ -589,6 +590,7 @@
<string name="pref_sound">Звук</string>
<string name="pref_silent">Без звук</string>
<string name="pref_privacy">Поверителност</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Чатове и медийни файлове</string>
<string name="pref_system_default">Подразбиращото се за системата</string>
<!-- Translators: as in "opposite of dark" -->
@@ -807,13 +809,14 @@
<string name="qrshow_join_contact_hint">Сканирайте, за да чатите с %1$s</string>
<string name="qrshow_join_contact_no_connection_toast">Няма връзка към Интернет, не може да бъде извършена настройка чрез QR код.</string>
<string name="qraccount_ask_create_and_login">Да бъде ли създаден нов адрес за електронна поща на \"%1$s\" и да бъде ли осъществено влизане там?</string>
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qraccount_ask_create_and_login_another">Да бъде ли създаден нов адрес за електронна поща в \"%1$s\" и да бъде ли осъществено влизане там?\n\nВашият съществуващ акаунт няма да бъде изтрит. Използвайте опцията \"Превключване към друг акаунт\", за да превключвате между Вашите акаунти.</string>
<string name="set_name_and_avatar_explain">Задайте име, което Вашите контакти ще разпознават. Можете също да установите изображение за профил.</string>
<string name="please_enter_name">Моля, въведете име.</string>
<string name="qraccount_qr_code_cannot_be_used">Не може да бъде създаден нов акаунт със сканирания QR код.</string>
<!-- the placeholder will be replaced by the address of the profile -->
<string name="qrlogin_ask_login">Желаете ли да влезете в \"%1$s\"?</string>
<!-- the placeholder will be replaced by the address of the profile -->
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qrlogin_ask_login_another">Желаете ли да влезете в \"%1$s\"?\n\nСъщестуващият Ви акаунт няма да бъде изтрит. Превключвайте между акаунтите си чрез \"Превключване към друг акаунт\".</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 Ви покани да се присъедините към тази група.\n\nИзчаква се устройството на %2$s да отговори…</string>
+6 -2
View File
@@ -322,9 +322,13 @@
<string name="file_saved_to">فایل من «%1$s» زفت وابی.</string>
<!-- Used for the deletion of Device messages -->
<plurals name="ask_delete_messages">
<item quantity="one">اخۊی %d پیوم پاک بۊ؟</item>
<item quantity="other">اخۊی %d پیوم پاک بۊ؟</item>
</plurals>
<!-- deprecated, use ask_delete_messages -->
<plurals name="ask_delete_messages_simple">
<item quantity="one">êxuy %d payom pāk bu?</item>
<item quantity="one">اخۊی %d پیوم پاک بۊ؟</item>
<item quantity="other">اخۊی %d پیوم پاک بۊ؟</item>
</plurals>
<string name="ask_start_chat_with">گوفت وو لوفت وا %1$s؟</string>
+6 -3
View File
@@ -409,7 +409,7 @@
<item quantity="one">¿Esborra %d missatge de tots els teus dispositius?</item>
<item quantity="other">¿Esborra %d missatges de tots els teus dispositius?</item>
</plurals>
<!-- Used for the deletion of Device messages -->
<!-- deprecated, use ask_delete_messages -->
<plurals name="ask_delete_messages_simple">
<item quantity="one">Vols esborrar %d missatge?</item>
<item quantity="other">Voleu esborrar %d missatges?</item>
@@ -483,6 +483,7 @@
<!-- mailing lists -->
<string name="mailing_list">Llista de correu</string>
<!-- deprecated -->
<string name="mailing_list_profile_info">Els canvis al nom i la imatge de la llista de correu només s\'aplicaran en aquest dispositiu.</string>
<!-- webxdc -->
@@ -611,7 +612,7 @@
<string name="onboarding_create_instant_account">Crea un perfil nou</string>
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
<string name="onboarding_alternative_logins">Ja tinc un perfil</string>
<!-- This is a button and a title, allowing to log in to existing, classic email accounts, setting ports, passwords and so on -->
<!-- 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">Inici de sessió correu-e clàssic</string>
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
<string name="instant_onboarding_title">El vostre perfil</string>
@@ -734,6 +735,7 @@
<string name="pref_sound">So</string>
<string name="pref_silent">Silenci</string>
<string name="pref_privacy">Privacitat</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Xats i multimèdia</string>
<string name="pref_system_default">Per defecte del sistema</string>
<!-- Translators: as in "opposite of dark" -->
@@ -967,13 +969,14 @@
<string name="qrshow_join_contact_hint">Escanegeu això per establir contacte amb %1$s</string>
<string name="qrshow_join_contact_no_connection_toast">No hi ha connexió a internet, no es pot fer la configuració amb codi QR.</string>
<string name="qraccount_ask_create_and_login">Voleu crear un perfil nou a «%1$s» i iniciar sessió allà?</string>
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qraccount_ask_create_and_login_another">Voleu crear un perfil nou a «%1$s» i iniciar-hi sessió?\n\nEl vostre perfil existent no s\'esborrarà. Useu l\'element «Canvia el perfil» per a canviar entre els vostres perfils.</string>
<string name="set_name_and_avatar_explain">Indiqueu un nom que els vostres contactes puguin reconèixer. També podeu establir una imatge de perfil.</string>
<string name="please_enter_name">Introduïu un nom</string>
<string name="qraccount_qr_code_cannot_be_used">El codi QR escanejat no es pot usar per a configurar un perfil nou.</string>
<!-- the placeholder will be replaced by the address of the profile -->
<string name="qrlogin_ask_login">Voleu iniciar sessió a «%1$s»?</string>
<!-- the placeholder will be replaced by the address of the profile -->
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qrlogin_ask_login_another">Voleu iniciar «%1$s»?\n\nNo s\'esborrarà el perfil existent. Useu l\'element «Canvia el perfil» per a canviar entre els vostres perfils.</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 us ha convidat a unir-vos a aquest grup.\n\nS\'està esperant el dispositiu de %2$s per a respondre...</string>
+1
View File
@@ -366,6 +366,7 @@
<string name="pref_sound">دەنگ</string>
<string name="pref_silent">بێدەنگ</string>
<string name="pref_privacy">پاراستنی تاکەکەسی</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">وتووێژ و ڕەنگاڵەکان</string>
<string name="pref_system_default">بنەڕەتی سیستەم</string>
<!-- Translators: as in "opposite of dark" -->
+111 -7
View File
@@ -4,7 +4,7 @@
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
<string name="cancel">Zrušit</string>
<string name="clear_search">Zrušit vyhledávání</string>
<string name="clear_search">Vyčistit vyhledávání</string>
<!-- a noun, used on a button, short for "show link" -->
<string name="link">Odkaz</string>
<!-- "scan" in the meaning of "scan QR code" -->
@@ -34,6 +34,8 @@
<string name="update">Aktualizovat</string>
<string name="emoji">Emoji</string>
<string name="attachment">Příloha</string>
<!-- the placeholder will be replaced by the name of the image or file to attach -->
<string name="ask_attach">Připojit \"%1$s\"?</string>
<string name="back">Zpět</string>
<string name="close">Zavřít</string>
<string name="close_window">Zavřít okno</string>
@@ -58,8 +60,10 @@
<string name="media">Multimédia</string>
<string name="apps_and_media">Aplikace a multimédia</string>
<string name="profile">Profil</string>
<string name="all_profiles">Všechny profily</string>
<string name="current_profile">Aktuální profil</string>
<string name="main_menu">Hlavní nabídka</string>
<string name="start_chat">Chatovat</string>
<string name="start_chat">Začít chatovat</string>
<string name="show_full_message">Zobrazit celou zprávu…</string>
<!-- Stay short here, say ~16 characters. The source string could also be "All Read", maybe that hint can make translations easier :) -->
<string name="mark_all_as_read">Označit vše jako přečtené</string>
@@ -94,6 +98,8 @@
<string name="no_app_to_handle_data">Aplikace pro tento typ dat nenalezena.</string>
<string name="no_browser_installed">Není nainstalován žádný prohlížeč.</string>
<string name="file_not_found">Nelze najít %1$s.</string>
<!-- the placeholder will be replaced by the name of a file -->
<string name="cannot_save_file">Nelze uložit %1$s</string>
<string name="copied_to_clipboard">Zkopírováno do schránky.</string>
<string name="contacts_headline">Kontakty</string>
<string name="email_address">E-mailová adresa</string>
@@ -113,7 +119,21 @@
<string name="last_seen_at">Naposledy viděni v %1$s</string>
<!-- Refers to the time a contact was last seen. Shown below contact name in the profile. The placeholder will be replaced by a relative point in time as "3 minutes ago" (see https://momentjs.com for more examples and languages)-->
<string name="last_seen_relative">Naposledy viděni %1$s</string>
<string name="last_seen_unknown">Naposledy viděni: Neznámo</string>
<string name="last_seen_unknown">Naposledy viděno: Neznámý</string>
<!-- Shown in call duration. Avoid abbreviations, prefer full words ex. "N seconds". -->
<plurals name="n_seconds_ext">
<item quantity="one">%d druhý</item>
<item quantity="few">%d sekundy</item>
<item quantity="many">%d sekundy</item>
<item quantity="other">%d vteřny</item>
</plurals>
<!-- Shown in call duration. Avoid abbreviations, prefer full words ex. "N minutes". -->
<plurals name="n_minutes_ext">
<item quantity="one">%d minuta</item>
<item quantity="few">%d minuty</item>
<item quantity="many">%d minuty</item>
<item quantity="other">%d minuty</item>
</plurals>
<!-- Shown beside messages that are "N minutes old". Prefer short strings, or well-known abbreviations. -->
<plurals name="n_minutes">
<item quantity="one">%d min.</item>
@@ -172,6 +192,7 @@
<item quantity="many">%d vybráno</item>
<item quantity="other">%d vybráno</item>
</plurals>
<string name="selected_colon">Vybráno:</string>
<string name="self"></string>
<string name="draft">Rozepsané</string>
<string name="image">Obrázek</string>
@@ -254,8 +275,21 @@
<!-- "Chat" is a verb here, "Message to" would also fit. the string might be used in the "New Chat" screen above the contact list -->
<string name="chat_with">Chatovat s...</string>
<string name="clone_chat">Klonovat chat</string>
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
<string name="channel">Kanál</string>
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
<string name="channels">Kanály</string>
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
<string name="new_channel">Nový kanál</string>
<!-- deprecated -->
<string name="add_recipients">Přidat příjemce</string>
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
<string name="channel_name">Název kanálu</string>
<string name="email">E-mail</string>
<!-- "New" as in "Create New Email"; shown together with "New Group" and "New Channel" -->
<string name="new_email">Nový e-mail</string>
<!-- the "Subject" of an email, use the term common in classic email apps -->
<string name="subject">Předmět</string>
<string name="menu_send">Odeslat</string>
<string name="menu_toggle_keyboard">Přepnout emoji klávesnici</string>
<string name="menu_edit_group">Upravit skupinu</string>
@@ -265,6 +299,7 @@
<string name="menu_unarchive_chat">Obnovit chat z archivu</string>
<string name="menu_add_attachment">Přidat přílohu</string>
<string name="menu_leave_group">Opustit skupinu</string>
<string name="menu_leave_channel">Opustit kanál</string>
<string name="menu_delete_chat">Smazat chat</string>
<!-- Command to delete all messages in a chat. The chat itself will not be deleted but will be empty afterwards, so make sure to be different from "Delete Chat" here. "Clear" is a verb here, "Empty Chat" would also be fine (eg. in German "Chat leeren") -->
<string name="clear_chat">Vyprázdnit chat</string>
@@ -349,6 +384,8 @@
<!-- 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">Přidat na domovskou obrazovku</string>
<string name="donate">Darovat</string>
<string name="donate_device_msg">❤️ Vypadá to, že se vám Delta Chat líbí! \n\n Prosím, zvažte možnost darování, abyste pomohli zajistit, že Delta Chat zůstane zdarma pro všechny. \n\n Ačkoli je Delta Chat zdarma a má otevřený zdrojový kód, vývoj stojí peníze. Pomozte nám udržet Delta Chat nezávislý a v budoucnu jej udělat ještě úžasnějším. \n\n https://delta.chat/donate</string>
<string name="mute_for_one_hour">Ztlumit na 1 hodinu</string>
<string name="mute_for_eight_hours">Ztlumit na 8 hodin</string>
<string name="mute_for_one_day">Ztlumit na 1 den</string>
@@ -369,6 +406,23 @@
</plurals>
<string name="file_saved_to">Soubor uložen do \"%1$s\".</string>
<!-- the action "to call someone", used as a tooltip for the "phone" icon. not: "the call" -->
<string name="start_call">Hovor</string>
<!-- the action "to answer" or to "accept" or to "pick up" a call. not: "the answer" -->
<string name="answer_call">Zvedni</string>
<!-- the action "to decline" a call, not: "the decline" -->
<string name="end_call">Pokles</string>
<string name="outgoing_call">Odchozí hovor</string>
<string name="incoming_call">Příchozí hovor</string>
<string name="declined_call">Odmítnutý hovor</string>
<string name="canceled_call">Zrušený hovor</string>
<string name="missed_call">Zmeškaný hovor</string>
<!-- the first placeholder will be replaced by a date, the second placeholder by duration, example: "Thu, 08:12 pm, 2 minutes" -->
<string name="call_date_and_duration">%1$s, %2$s</string>
<!-- 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">Jste si jistý, že chcete odejít?</string>
<plurals name="ask_delete_chat">
<item quantity="one">Smazat %d chat ze všech vašich zařízení?</item>
<item quantity="few">Smazat %d chaty ze všech vašich zařízení?</item>
@@ -383,7 +437,7 @@
<item quantity="many">Smazat %d zpráv ze všech Vašich zařízení?</item>
<item quantity="other">Smazat %d zpráv ze všech vašich zařízení?</item>
</plurals>
<!-- Used for the deletion of Device messages -->
<!-- deprecated, use ask_delete_messages -->
<plurals name="ask_delete_messages_simple">
<item quantity="one">Smazat %d zprávu?</item>
<item quantity="few">Smazat %d zprávy?</item>
@@ -400,6 +454,8 @@
<string name="ask_start_chat_with">Přejete si chatovat s uživatelem %1$s?</string>
<!-- %1$s is replaced by a comma-separated list of names -->
<string name="ask_remove_members">Přejete si odstranit uživatele %1$s ze skupiny?</string>
<!-- %1$s is replaced by a comma-separated list of names -->
<string name="ask_remove_from_channel">Odstranit %1$s z kanálu?</string>
<string name="open_url_confirmation">Přejete si otevřít tento odkaz?</string>
@@ -433,6 +489,8 @@
</plurals>
<!-- 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">Poslat zprávu uživateli %1$s.</string>
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
<string name="chat_new_channel_hint">Kanály jsou nástrojem pro vysílání zpráv typu (jeden-k-mnoha).</string>
<string name="chat_new_group_hint">Ostatní tuto skupinu uvidí až poté, co odešlete první zprávu.</string>
<string name="chat_record_slide_to_cancel">Zrušit tahem</string>
<string name="chat_record_explain">Pro nahrání hlasové zprávy stiskněte a držte ikonu mikrofonu; uvolněte pro odeslání.</string>
@@ -442,6 +500,7 @@
<string name="chat_input_placeholder">Zpráva</string>
<string name="chat_archived_label">Archivováno</string>
<string name="chat_request_label">Žádost</string>
<string name="chat_request_label_explain">Zahrnutí požadavků do čítačů a oznámení</string>
<string name="chat_no_messages">Žádné zprávy.</string>
<string name="chat_self_talk_subtitle">Zprávy poslané sobě</string>
<string name="archive_empty_hint">Zde se zobrazí archivované chaty.</string>
@@ -460,6 +519,7 @@
<!-- mailing lists -->
<string name="mailing_list">E-mailový seznam</string>
<!-- deprecated -->
<string name="mailing_list_profile_info">Změny názvu a obrázku e-mailového seznamu se projeví pouze na tomto zařízení.</string>
<!-- webxdc -->
@@ -588,7 +648,7 @@
<string name="onboarding_create_instant_account">Vytvořit nový profil</string>
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
<string name="onboarding_alternative_logins">Již mám svůj profil</string>
<!-- This is a button and a title, allowing to log in to existing, classic email accounts, setting ports, passwords and so on -->
<!-- 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">Přihlášení ke klasickému e-mailu</string>
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
<string name="instant_onboarding_title">Váš profil</string>
@@ -613,6 +673,7 @@
<string name="welcome_chat_over_email">Zabezpečený decentralizovaný chat</string>
<string name="scan_invitation_code">Naskenovat kód pozvánky</string>
<string name="login_title">Přihlaš se</string>
<string name="login_advanced_hint">Toto přihlášení je určeno pro pokročilé uživatele: \n\n Nepoužívejte adresu, kterou používáte v jiné aplikaci. \n\n- Klasický e-mailový server umožňuje chatování bez koncového šifrování označeného ikonou pošty.</string>
<string name="login_inbox">Příchozí</string>
<string name="login_imap_login">IMAP uživatelské jméno</string>
<string name="login_imap_server">IMAP server</string>
@@ -637,6 +698,19 @@
<string name="proxy_use_proxy_confirm">Přejete si použít proxy server \"%1$s\"?</string>
<string name="proxy_share_explain">Vaši přátele si mohou tento proxy server přidat naskenováním tohoto QR kódu.</string>
<string name="proxy_share_link">Sdílet odkaz</string>
<string name="proxy_enabled">Proxy zapnuto</string>
<string name="proxy_enabled_hint">Používáte proxy server. Pokud máte potíže s připojením, zkuste použít jiný proxy server.</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">Přenosy</string>
<string name="add_transport">Přidat vysílání</string>
<string name="remove_transport">Odstranit vysílání</string>
<string name="edit_transport">Upravit vysílání</string>
<!-- shown if a QR code was scanned that can be used as a relay -->
<string name="confirm_add_transport">Přidat toto vysílání?</string>
<string name="invalid_transport_qr">Naskenovaný kód QR neobsahuje platné vysílání.</string>
<!-- placeholder will be replaced by a relay server name -->
<string name="confirm_remove_transport">Odstranit vysílání \"%1$s\"? \n\n Vaše kontakty se s vámi spojí pouze tehdy, pokud jste je předtím kontaktovali prostřednictvím jiného vysílání. \n\n Pokud máte pochybnosti, odstraňte spojení později.</string>
<string name="login_certificate_checks">Kontroly certifikátu</string>
<string name="login_error_mail">Prosím, zadejte platnou e-mailovou adresu</string>
<string name="login_error_server">Prosím, zadejte platný server / IP adresu</string>
@@ -711,6 +785,7 @@
<string name="pref_sound">Zvuk</string>
<string name="pref_silent">Ticho</string>
<string name="pref_privacy">Soukromí</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Chaty a multimédia</string>
<string name="pref_system_default">Podle systému</string>
<!-- Translators: as in "opposite of dark" -->
@@ -738,6 +813,7 @@
<string name="pref_backup">Záloha</string>
<string name="pref_backup_explain">Zálohovat chaty na externí úložiště</string>
<string name="pref_backup_export_explain">Záloha vám pomůže s novou instalací na tomto či jiném zařízení.\n\nZáloha bude obsahovat všechny zprávy, kontakty a chaty, a nastavení automatického koncového šifrování. Soubor se zálohou uchovávejte na bezpečném místě, nebo jej co nejdříve smažte.</string>
<string name="pref_backup_export_this">Exportovat tento profil</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">Exportovat všech %1$d profilů</string>
<string name="pref_backup_export_start_button">Spustit zálohu</string>
@@ -747,6 +823,10 @@
<string name="pref_background_btn_default">Použít výchozí obrázek</string>
<string name="pref_background_btn_gallery">Vybrat z galerie</string>
<string name="pref_imap_folder_warn_disable_defaults">Při změně této volby se ujistěte, že váš server a ostatní klientské aplikace mají odpovídající nastavení.\n\nJinak může vše přestat fungovat.</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">Režim pro více zařízení</string>
<string name="pref_multidevice_explain">Synchronizujte zprávy s ostatními zařízeními. Automaticky povoleno při přidání druhého zařízení</string>
<string name="pref_multidevice_change_warn">Při použití stejného profilu na více zařízeních musí být povolen \"režim více zařízení\". Toto nastavení zakažte pouze v případě, že jste tento profil odstranili ze všech ostatních zařízení. \n\n Zakázání režimu \"režim více zařízení\" při používání profilu na více zařízeních bude mít za následek zmeškané zprávy a další problémy.</string>
<string name="pref_auto_folder_moves">Automaticky přesouvat do složky DeltaChat </string>
<string name="pref_only_fetch_mvbox_title">Načítat pouze ze složky DeltaChat</string>
<string name="pref_show_emails">Zobrazovat běžné e-maily</string>
@@ -754,6 +834,7 @@
<string name="pref_show_emails_accepted_contacts">Pro přijaté kontakty</string>
<string name="pref_show_emails_all">Vše</string>
<string name="pref_experimental_features">Experimentální funkce </string>
<string name="pref_experimental_features_explain">Tyto funkce mohou být nestabilní a mohou být změněny nebo odstraněny.</string>
<string name="pref_on_demand_location_streaming">Streamování polohy na vyžádání</string>
<string name="pref_background_default">Výchozí obrázek</string>
<string name="pref_background_default_color">Výchozí barva</string>
@@ -770,6 +851,7 @@
<string name="n_bytes_message">%1$s zpráva</string>
<!-- %1$s will be replaced by human-readable date and time -->
<string name="download_max_available_until">Stahovat dostupné maximum do %1$s</string>
<string name="select_profile">Vyberte profil</string>
<string name="profile_image_select">Vybrat profilový obrázek</string>
<string name="select_your_new_profile_image">Vyberte si svůj nový profilový obrázek</string>
<string name="profile_image_delete">Smazat profilový obrázek</string>
@@ -778,6 +860,9 @@
<string name="disable_imap_idle">Zakázat IMAP IDLE</string>
<string name="disable_imap_idle_explain">Nepoužívat rozšíření IMAP IDLE ani když jej server podporuje. Zapnutí této volby zvýší prodlevu při získávání zpráv, použijte ji jen pro testování.</string>
<string name="send_stats_to_devs">Odeslat statistiky vývojářům Delta Chatu</string>
<string name="stats_msg_body">Příloha obsahuje anonymní statistiky používání, které nám pomáhají zlepšovat službu Delta Chat. Děkujeme vám!</string>
<!-- Emoji picker and categories -->
<string name="emoji_search_results">Výsledky hledání</string>
<string name="emoji_not_found">Emoji nenalezeno</string>
@@ -844,6 +929,11 @@
<string name="remove_member_by_other">Člen %1$s byl odebrán uživatelem %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">Člen %1$s byl odebrán.</string>
<!-- "left" in the meaning of "exited". -->
<string name="group_left_by_you">Opustili jste skupinu.</string>
<!-- "left" in the meaning of "exited". -->
<string name="channel_left_by_you">Opustili jste kanál.</string>
<string name="you_joined_the_channel">Připojili jste se ke kanálu.</string>
<!-- "left" in the meaning of "exited"; %1$s will be replaced by name of the contact leaving the group -->
<string name="group_left_by_other">Uživatel %1$s opustil skupinu.</string>
<string name="group_image_deleted_by_you">Smazali jste obrázek skupiny.</string>
@@ -872,6 +962,9 @@
<string name="ephemeral_timer_1_week_by_you">Nastavili jste časovač mizejících zpráv na 1 týden.</string>
<!-- %1$s will be replaced by name of the contact -->
<string name="ephemeral_timer_1_week_by_other">Uživatel %1$s změnil časovač mizejících zpráv na 1 týden.</string>
<string name="ephemeral_timer_1_year_by_you">Časovač mizejících zpráv jste nastavili na 1 rok.</string>
<!-- %1$s will be replaced by name of the contact -->
<string name="ephemeral_timer_1_year_by_other">Časovač zmizení zpráv nastavený na 1 rok pomocí %1$s.</string>
<!-- %1$s will be replaced by the number of minutes (always >1) the timer is set to -->
<string name="ephemeral_timer_minutes_by_you">Nastavili jste časovač mizejících zpráv na %1$s minut.</string>
<!-- %1$s will be replaced by the number of minutes (always >1) the timer is set to, %2$s will be replaced by name of the contact -->
@@ -888,6 +981,7 @@
<string name="ephemeral_timer_weeks_by_you">Samomazací zprávy vyprší po %1$s týdnech ode mě.</string>
<!-- %1$s will be replaced by the number of weeks (always >1) the timer is set to, %2$s will be replaced by name of the contact -->
<string name="ephemeral_timer_weeks_by_other">Uživatel %2$s změnil časovač mizejících zpráv na %1$s týdnů.</string>
<string name="chat_unencrypted_explanation">Zprávy v tomto chatu používají klasický e-mail a nejsou šifrovány end-to-end.</string>
<string name="chat_protection_enabled_tap_to_learn_more">Nyní je garantováno koncové šifrování vašich zpráv. Stiskněte pro více informací.</string>
<string name="chat_protection_enabled_explanation">Nyní je garantováno, že všechny zprávy v tomto chatu jsou koncově šifrovány.\n\nKoncové šifrování zajišťuje soukromí mezi vámi a vašimi kontakty. Nedokáže je přečíst ani váš poskytovatel e-mailu.</string>
<string name="invalid_unencrypted_tap_to_learn_more">⚠️%1$s vyžaduje koncové šifrování, které pro tento chat ještě není nastaveno. Stiskněte pro více informací. </string>
@@ -912,6 +1006,7 @@
<string name="qrscan_hint_desktop">Přibližte QR kód ke kameře</string>
<string name="qrscan_failed">QR kód nelze přečíst</string>
<string name="qrscan_ask_join_group">Přejete si přidat ke skupině \"%1$s\"?</string>
<string name="qrscan_ask_join_channel">Chcete se připojit ke kanálu \"%1$s\"?</string>
<string name="qrscan_fingerprint_mismatch">Rozpoznaný otisk uživatele %1$s neodpovídá jeho poslednímu otisku.</string>
<string name="qrscan_no_addr_found">Tento QR kód obsahuje otisk, ale žádný e-mail.\n\nK ověření nezávislou cestou nejprve vytvořte šifrované připojení k příjemci.</string>
<string name="qrscan_contains_text">Text z QR kódu:\n\n%1$s</string>
@@ -919,6 +1014,7 @@
<string name="qrscan_fingerprint_label">Otisk</string>
<string name="withdraw_verifycontact_explain">Tento QR kód mohou ostatní uživatelé použít, aby vás kontaktovali.\n\nMůžete také vygenerovat nový, čímž dosavadní QR kód či odkaz s pozvánkou zneplatníte.</string>
<string name="withdraw_verifygroup_explain">Tento QR kód mohou ostatní uživatelé použít k připojení ke skupině \"%1$s\".\n\nMůžete také vygenerovat nový, čímž dosavadní QR kód či odkaz s pozvánkou zneplatníte.</string>
<string name="withdraw_joinbroadcast_explain">Tento QR kód mohou ostatní naskenovat a připojit se ke kanálu \"%1$s\".\n\n Můžete jej resetovat, takže stávající QR kód nebo odkaz na pozvánku již nebude fungovat.</string>
<string name="withdraw_qr_code">Vygenerovat nový QR kód</string>
<string name="revive_verifycontact_explain">Tento QR kód již není aktivní, protože byl vygenerován nový.</string>
<string name="revive_qr_code">Aktivovat QR kód</string>
@@ -929,21 +1025,25 @@
<string name="qrshow_join_group_title">QR kód s pozvánkou</string>
<!-- This text is shown inside the "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the group name, eg. "Scan to join group \"Testing group\"" -->
<string name="qrshow_join_group_hint">Naskenujte k připojení ke skupině \"%1$s\"</string>
<string name="qrshow_join_channel_hint">Skenování pro připojení ke kanálu \"%1$s\"</string>
<string name="qrshow_join_contact_title">QR kód s pozvánkou</string>
<!-- This text is shown inside the "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 chat with Alice" -->
<string name="qrshow_join_contact_hint">Naskenujte k navázání spojení s uživatelem %1$s</string>
<string name="qrshow_join_contact_no_connection_toast">Žádné připojení k Internetu. Zprovoznění QR kódem nelze provést.</string>
<string name="qraccount_ask_create_and_login">Přejete si vytvořit nový profil na \"%1$s\" a připojit se k němu?</string>
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qraccount_ask_create_and_login_another">Přejete si vytvořit nový profil na \"%1$s\" a přihlásit se k němu?\n\nVáš stávající profil nebude smazán. K přepínání mezi profily můžete využít volbu \"Přepnout profil\".</string>
<string name="set_name_and_avatar_explain">Nastavte si jméno, podle kterého vás ostatní poznají. Můžete si také nastavit profilový obrázek.</string>
<string name="please_enter_name">Prosím, zadejte jméno.</string>
<string name="qraccount_qr_code_cannot_be_used">Tento QR kód neumožňuje nastavení nového účtu.</string>
<!-- the placeholder will be replaced by the address of the profile -->
<string name="qrlogin_ask_login">Přejete si přihlásit k \"%1$s\"?</string>
<!-- the placeholder will be replaced by the address of the profile -->
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qrlogin_ask_login_another">Přejete si přihlásit k \"%1$s\"?\n\nVáš stávající profil nebude smazán. K přepínání mezi profily můžete využít volbu \"Přepnout profil\".</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">Uživatel %1$s vás pozval do této skupiny.\n\nČekání na odpověď od zařízení uživatele %2$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_channel_started">%1$s vás pozval, abyste se připojili k tomuto kanálu. \n\n Čekáme na zařízení %2$s odpovědět...</string>
<!-- placeholder will be replaced by the name of the inviter. -->
<string name="secure_join_replies">Uživatel %1$s odpověděl, čekání na přidání do skupiny...</string>
<string name="secure_join_wait">Navazování koncově šifrovaného spojení, prosím, čekejte...</string>
@@ -951,6 +1051,7 @@
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
<string name="verified_by">Ověřeni uživatelem %1$s.</string>
<string name="verified_by_you">Ověřeni mnou</string>
<string name="verified_by_unknown">Představeno</string>
<!-- deprecated -->
<string name="verified_contact_required_explain">Aby mohlo být garantováno koncové šifrování, můžete do této skupiny přidávat pouze uživatele se zeleným zaškrtávátkem.\n\nSe svými kontakty se můžete setkat osobně a naskenovat jejich QR kód, abyste je ověřili.</string>
<string name="mailto_dialog_header_select_chat">Vyberte chat, do kterého chcete zprávu poslat</string>
@@ -968,6 +1069,7 @@
<string name="notify_name_only">Pouze jméno</string>
<string name="notify_no_name_or_message">Ani jméno ani zpráva</string>
<string name="notifications_disabled">Oznámení vypnuta</string>
<string name="unreliable_bg_notifications">Povolení možnosti \"Vynutit připojení na pozadí\" pro spolehlivá oznámení</string>
<string name="new_messages">Nové zprávy</string>
<!-- Body text for a generic "New messages" notification. Shown if we do not have more information about a new messages. Note, that the string is also referenced at https://github.com/deltachat/notifiers -->
<string name="new_messages_body">Máte nové zprávy</string>
@@ -1114,4 +1216,6 @@
<string name="perm_enable_bg_reminder_title">Stiskem nastavíte přijímání zpráv, když je aplikace Delta Chat na pozadí.</string>
<string name="perm_enable_bg_already_done">Přijímání zpráv na pozadí jste již aplikaci Delta Chat povolili.\n\nV případě, že vám zprávy na pozadí stále nechodí, prosím zkontrolujte svá systémová nastavení.</string>
</resources>
<!-- device messages for updates -->
<string name="update_2_0">Co je nového? \n\n💯 Koncové šifrování je nyní spolehlivé a navždy. Visací zámky 🔒 jsou pryč! \n\n✉️ Klasické e-maily bez koncového šifrování jsou označeny symbolem písmene \n\n😻 Nová vylepšená profilová obrazovka pro všechny kontakty \n\n🔲 Nové tlačítko pro rychlý přístup k aplikacím používaným v chatu \n\n❤️ Přispějte nám, abychom zůstali nezávislí a mohli pokračovat ve vylepšování: %1$s</string>
</resources>
+7 -1
View File
@@ -242,7 +242,11 @@
</plurals>
<string name="file_saved_to">Fil gemt til \"%1$s\".</string>
<!-- Used for the deletion of Device messages -->
<plurals name="ask_delete_messages">
<item quantity="one">Slet %d besked?</item>
<item quantity="other">Slet %d beskeder?</item>
</plurals>
<!-- deprecated, use ask_delete_messages -->
<plurals name="ask_delete_messages_simple">
<item quantity="one">Slet %d besked?</item>
<item quantity="other">Slet %d beskeder?</item>
@@ -426,6 +430,7 @@
<string name="pref_sound">Lyd</string>
<string name="pref_silent">Stille</string>
<string name="pref_privacy">Privatliv</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Samtaler og medie</string>
<string name="pref_system_default">Systemstandard</string>
<!-- Translators: as in "opposite of dark" -->
@@ -590,6 +595,7 @@
<string name="qrshow_join_contact_hint">Skan dette for at indstille kontakt med %1$s</string>
<string name="qrshow_join_contact_no_connection_toast">Ingen internet forbindelse, kan ikke udføre QR kode opsætning.</string>
<string name="qraccount_ask_create_and_login">Opret ny e-mail adresse på \"%1$s\" og log ind der?</string>
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qraccount_ask_create_and_login_another">Opret ny e-mail adresse på \"%1$s\" og log ind der?\n\nDin eksisterende konto bliver ikke slettet. Brug \"Skift konto\" for at skifte imellem dine konti.</string>
<string name="qraccount_qr_code_cannot_be_used">Den skannede QR-kode kan ikke bruges til at opsætte en ny konto.</string>
<string name="contact_verified">%1$s bekræftet.</string>
+14 -11
View File
@@ -401,16 +401,16 @@
<!-- 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">Diesen Chat verlassen?</string>
<plurals name="ask_delete_chat">
<item quantity="one">%d Chat von allen Geräten löschen?</item>
<item quantity="other">%d Chats von allen Geräten löschen?</item>
<item quantity="one">%d Chat löschen?</item>
<item quantity="other">%d Chats löschen?</item>
</plurals>
<string name="ask_delete_named_chat">Chat \"%1$s\" von allen Geräten löschen?</string>
<string name="ask_delete_message">Diese Nachricht von allen Geräten löschen?</string>
<string name="ask_delete_named_chat">Chat \"%1$s\" löschen?</string>
<string name="ask_delete_message">Diese Nachricht löschen?</string>
<plurals name="ask_delete_messages">
<item quantity="one">%d Nachricht von allen Geräten löschen?</item>
<item quantity="other">%d Nachrichten von allen Geräten löschen?</item>
<item quantity="one">%d Nachricht löschen?</item>
<item quantity="other">%d Nachrichten löschen?</item>
</plurals>
<!-- Used for the deletion of Device messages -->
<!-- deprecated, use ask_delete_messages -->
<plurals name="ask_delete_messages_simple">
<item quantity="one">%d Nachricht löschen?</item>
<item quantity="other">%d Nachrichten löschen?</item>
@@ -484,6 +484,7 @@
<!-- mailing lists -->
<string name="mailing_list">Mailingliste</string>
<!-- deprecated -->
<string name="mailing_list_profile_info">Änderungen an Name und Bild der Mailingliste gelten nur für dieses Gerät.</string>
<!-- webxdc -->
@@ -612,7 +613,7 @@
<string name="onboarding_create_instant_account">Neues Profil erstellen</string>
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
<string name="onboarding_alternative_logins">Ich habe bereits ein Profil</string>
<!-- This is a button and a title, allowing to log in to existing, classic email accounts, setting ports, passwords and so on -->
<!-- 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">Klassische E-Mail als Relay</string>
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
<string name="instant_onboarding_title">Dein Profil</string>
@@ -637,7 +638,7 @@
<string name="welcome_chat_over_email">Sicherer dezentraler Chat</string>
<string name="scan_invitation_code">Einladungscode scannen</string>
<string name="login_title">Login</string>
<string name="login_advanced_hint">Für fortgeschrittene Benutzer:\n\n• Verwenden Sie kein Konto, das Sie bereits in einer anderen App nutzen.\n\n• Klassische E-Mail-Server ermöglichen Chats ohne Ende-zu-Ende-Verschlüsselung, gekennzeichnet durch ein E-Mail-Symbol.</string>
<string name="login_advanced_hint">Für fortgeschrittene Benutzer:\n\n• Verwende keine Adresse, die du bereits in einer anderen App nutzt.\n\n• Klassische E-Mail-Server ermöglichen Chats ohne Ende-zu-Ende-Verschlüsselung, gekennzeichnet durch ein E-Mail-Symbol.</string>
<string name="login_inbox">Posteingang</string>
<string name="login_imap_login">IMAP-Anmeldename</string>
<string name="login_imap_server">IMAP-Server</string>
@@ -749,6 +750,7 @@
<string name="pref_sound">Ton</string>
<string name="pref_silent">Leise</string>
<string name="pref_privacy">Datenschutz</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Chats und Medien</string>
<string name="pref_system_default">Systemstandard</string>
<!-- Translators: as in "opposite of dark" -->
@@ -953,7 +955,7 @@
<string name="devicemsg_self_deleted">Du hast den Chat \"Gespeicherte Nachrichten\" gelöscht.\n\n️ Um die Funktion \"Gespeicherte Nachrichten\" erneut zu verwenden, erstelle einfach einen Chat mit dir selbst.</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">⚠️ Der Speicherplatz deines Anbieters ist bald erschöpft; bereits %1$s%% sind verbraucht.\n\nDu kannst möglicherweise keine Nachrichten mehr empfangen, wenn der Speicherplatz komplett verbraucht ist.\n\n👉 Bitte prüfe, ob du alte Daten im Webinterface des Anbieters löschen kannst, und erwäge, \"Einstellungen / Chats und Medien / Alte Nachrichten löschen\" zu aktivieren. Den aktuellen Speicherverbrauch kannst du jederzeit unter \"Einstellungen / Verbindungsstatus\" überprüfen.</string>
<string name="devicemsg_storage_exceeding">⚠️ Der Speicherplatz deines Anbieters ist bald erschöpft; bereits %1$s%% sind verbraucht.\n\nDu kannst möglicherweise keine Nachrichten mehr empfangen, wenn der Speicherplatz komplett verbraucht ist.\n\n👉 Bitte prüfe, ob du alte Daten im Webinterface des Anbieters löschen kannst, und erwäge, \"Einstellungen / Chats / Alte Nachrichten löschen\" zu aktivieren. Den aktuellen Speicherverbrauch kannst du jederzeit unter \"Einstellungen / Verbindungsstatus\" überprüfen.</string>
<!-- %1%s will be replaced by date and time in some human-readable format -->
<string name="devicemsg_bad_time">⚠️ Dein Gerät scheint ein falsches Datum oder eine falsche Uhrzeit (%1$s) zu verwenden.\n\nStelle deine Uhr ⏰🔧 richtig ein, um sicherzustellen, dass deine Nachrichten korrekt empfangen werden.</string>
<string name="devicemsg_update_reminder">⚠️ Deine Delta-Chat-Version ist möglicherweise veraltet.\n\nDies kann zu Problemen führen, wenn deine Chat-PartnerInnen neuere Versionen verwenden - und dir die neuesten Funktionen fehlen. 😳\nBitte überprüfe https://get.delta.chat oder den App-Store auf Updates.</string>
@@ -994,13 +996,14 @@
<string name="qrshow_join_contact_hint">Scannen für Chat mit %1$s</string>
<string name="qrshow_join_contact_no_connection_toast">Keine Verbindung zum Internet, Austausch des QR-Codes nicht möglich.</string>
<string name="qraccount_ask_create_and_login">Profil auf \"%1$s\" erzeugen und dort anmelden?</string>
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qraccount_ask_create_and_login_another">Profil auf \"%1$s\" erzeugen und dort anmelden?\n\nDein bisheriges Profil wird dabei nicht gelöscht. Du kannst mit der Option \"Profil wechseln\" jederzeit zwischen den Konten hin- und herschalten.</string>
<string name="set_name_and_avatar_explain">Lege einen Namen fest, unter dem deine Kontakte dich kennen. Du kannst auch ein Profilbild festlegen.</string>
<string name="please_enter_name">Bitte gib einen Namen an.</string>
<string name="qraccount_qr_code_cannot_be_used">Der eingescannte QR-Code kann nicht dazu verwendet werden, eine neues Profil zu erstellen.</string>
<!-- the placeholder will be replaced by the address of the profile -->
<string name="qrlogin_ask_login">Bei \"%1$s\" anmelden?</string>
<!-- the placeholder will be replaced by the address of the profile -->
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qrlogin_ask_login_another">Bei \"%1$s\" anmelden?\n\nDein bisheriges Profil wird dabei nicht gelöscht. Du kannst mit der Option \"Profil wechseln\" jederzeit zwischen den Profilen hin- und herschalten.</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 hat dich zu dieser Gruppe eingeladen.\n\nWarte auf die Antwort des Gerätes von %2$s...</string>
+9 -2
View File
@@ -277,7 +277,11 @@
</plurals>
<string name="file_saved_to">Αποθήκευση στο \"%1$s\".</string>
<!-- Used for the deletion of Device messages -->
<plurals name="ask_delete_messages">
<item quantity="one">Διαγραφή %d μηνύματος;</item>
<item quantity="other">Διαγραφή %d μηνυμάτων;</item>
</plurals>
<!-- deprecated, use ask_delete_messages -->
<plurals name="ask_delete_messages_simple">
<item quantity="one">Διαγραφή %d μηνύματος;</item>
<item quantity="other">Διαγραφή %d μηνυμάτων;</item>
@@ -346,6 +350,7 @@
<!-- mailing lists -->
<string name="mailing_list">Λίστα Αλληλογραφίας</string>
<!-- deprecated -->
<string name="mailing_list_profile_info">Οι αλλαγές στο όνομα και την εικόνα της λίστας αλληλογραφίας ισχύουν μόνο σε αυτήν τη συσκευή.</string>
<!-- webxdc -->
@@ -501,6 +506,7 @@
<string name="pref_sound">Ήχος</string>
<string name="pref_silent">Σε σίγαση</string>
<string name="pref_privacy">Ιδιωτικότητα</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Συνομιλίες και Πολυμέσα</string>
<string name="pref_system_default">Προκαθορισμένο του συστήματος</string>
<!-- Translators: as in "opposite of dark" -->
@@ -694,11 +700,12 @@
<string name="qrshow_join_contact_hint">Σάρωση για συνομιλία με %1$s</string>
<string name="qrshow_join_contact_no_connection_toast">Δεν υπάρχει σύνδεση στο διαδίκτυο, δεν είναι δυνατή η ρύθμιση κωδικού QR.</string>
<string name="qraccount_ask_create_and_login">Δημιουργήστε νέα διεύθυνση e-mail στο \"%1$s\" και συνδεθείτε εκεί;</string>
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qraccount_ask_create_and_login_another">Δημιουργήστε νέα διεύθυνση e-mail στο \"%1$s\" και συνδεθείτε εκεί;\n\nΟ υπάρχων λογαριασμός σας δεν θα διαγραφεί. Χρησιμοποιήστε τη λειτουργία \"Εναλλαγή λογαριασμού\" για εναλλαγή μεταξύ των λογαριασμών σας.</string>
<string name="qraccount_qr_code_cannot_be_used">Ο σαρωμένος κωδικός QR δεν μπορεί να χρησιμοποιηθεί για τη δημιουργία νέου λογαριασμού.</string>
<!-- the placeholder will be replaced by the address of the profile -->
<string name="qrlogin_ask_login">Σύνδεση στο \"%1$s\";</string>
<!-- the placeholder will be replaced by the address of the profile -->
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qrlogin_ask_login_another">Σύνδεση στο \"%1$s\";\n\nΟ υπάρχων λογαριασμός σας δεν θα διαγραφεί. Χρησιμοποιήστε τη λειτουργία \"Εναλλαγή λογαριασμού\" για εναλλαγή μεταξύ των λογαριασμών σας.</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 σας προσκάλεσε να συμμετάσχετε σε αυτήν την ομάδα.\n\nΑναμονή για απάντηση από τη συσκευή του %2$s…</string>
+1
View File
@@ -416,6 +416,7 @@
<string name="pref_sound">Sono</string>
<string name="pref_silent">Silenta</string>
<string name="pref_privacy">Privateco</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Interparoloj kaj aŭdvidaĵoj</string>
<string name="pref_system_default">Sistema defaŭlto</string>
<!-- Translators: as in "opposite of dark" -->
+7 -22
View File
@@ -1,16 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<!-- custom strings -->
<string name="description">Descripción</string>
<string name="or_separator">o</string>
<string name="online">en línea</string>
<string name="pink">Rosa</string>
<string name="gray">Gris</string>
<string name="share_location_for_12_hours">Por 12 horas</string>
<string name="force_e2ee">Forzar el cifrado de extremo a extremo</string>
<string name="disable_force_e2ee_warning">⚠️ Si desactivas esta opción, no estarás protegido contra el envío accidental de mensajes no cifrados. Desactiva esta opción únicamente si quieres enviar correos electrónicos no cifrados con tu cuenta de correo electrónico clásica.</string>
<!-- End of custom strings -->
<!-- common strings without special context -->
<string name="app_name">Delta Chat</string>
<string name="ok">OK</string>
@@ -434,7 +423,7 @@
<item quantity="many">¿Eliminar %d mensajes de todos tus dispositivos?</item>
<item quantity="other">¿Eliminar %d mensajes de todos tus dispositivos?</item>
</plurals>
<!-- Used for the deletion of Device messages -->
<!-- deprecated, use ask_delete_messages -->
<plurals name="ask_delete_messages_simple">
<item quantity="one">¿Eliminar %d mensaje?</item>
<item quantity="many">¿Eliminar %d mensajes?</item>
@@ -512,6 +501,7 @@
<!-- mailing lists -->
<string name="mailing_list">Lista de correo</string>
<!-- deprecated -->
<string name="mailing_list_profile_info">Los cambios en el nombre y la imagen de la lista de correo solo se aplican a este dispositivo.</string>
<!-- webxdc -->
@@ -640,7 +630,7 @@
<string name="onboarding_create_instant_account">Crear perfil nuevo</string>
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
<string name="onboarding_alternative_logins">Ya tengo un perfil</string>
<!-- This is a button and a title, allowing to log in to existing, classic email accounts, setting ports, passwords and so on -->
<!-- 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">Iniciar sesión con correo electrónico</string>
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
<string name="instant_onboarding_title">Tu perfil</string>
@@ -777,6 +767,7 @@
<string name="pref_sound">Sonido</string>
<string name="pref_silent">Silencio</string>
<string name="pref_privacy">Privacidad</string>
<!-- deprecated, use pref_chats -->
<string name="pref_chats_and_media">Chats y multimedia</string>
<string name="pref_system_default">Predeterminado del sistema</string>
<!-- Translators: as in "opposite of dark" -->
@@ -1019,13 +1010,14 @@ Desactiva este ajuste solo si has eliminado este perfil de todos tus demás disp
<string name="qrshow_join_contact_hint">Escanea esto para configurar un contacto con %1$s</string>
<string name="qrshow_join_contact_no_connection_toast">No hay conexión a Internet, no se puede configurar con código QR.</string>
<string name="qraccount_ask_create_and_login">¿Crear una nueva dirección de correo en \"%1$s\" e ingresar allí?</string>
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qraccount_ask_create_and_login_another">¿Crear una nueva dirección de correo en \"%1$s\" e ingresar ahí?\n\nTu cuenta existente no será eliminada. Usar el ítem \"Cambiar cuenta\" para cambiar entre tus cuentas.</string>
<string name="set_name_and_avatar_explain">Establece un nombre que tus contactos puedan reconocer. También puedes establecer una foto de perfil.</string>
<string name="please_enter_name">Por favor, introduce un nombre.</string>
<string name="qraccount_qr_code_cannot_be_used">El código QR escaneado no puede ser usado para configurar una nueva cuenta.</string>
<!-- the placeholder will be replaced by the address of the profile -->
<string name="qrlogin_ask_login">¿Iniciar sesión en \"%1$s\"?</string>
<!-- the placeholder will be replaced by the address of the profile -->
<!-- deprecated, use confirm_add_transport when scanning such a QR code from the main scanner -->
<string name="qrlogin_ask_login_another">¿Iniciar sesión en \"%1$s\"?\n\nTu cuenta existente no será eliminada. Usa la opción \"Cambiar cuenta\" para cambiar entre tus cuentas.</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 te invitó a unirte a este grupo.\n\nEsperando que el dispositivo de %2$s responda…</string>
@@ -1202,12 +1194,5 @@ Desactiva este ajuste solo si has eliminado este perfil de todos tus demás disp
<string name="perm_enable_bg_already_done">Ya has permitido que Delta Chat reciba mensajes en segundo plano.\n\nSi los mensajes aún no llegan en segundo plano, compruebe también la configuración de su sistema.</string>
<!-- device messages for updates -->
<string name="update_2_25">🔮 ¿Qué hay de nuevo?\n\n★ Ahora es posible crear canales con enlace de invitación. Únete al canal oficial (en inglés) de Delta Chat aquí: %1$s\n\n★ Ahorro de datos: reducido el tamaño de las notificaciones de lectura\n\n★ Ahora es posible guardar en el almacenamiento archivos compartidos por mini-apps\n\n★ Más protección de metadatos\n\n★ La creación de grupos se sincroniza immediatamente en todos tus dispositivos\n\n★ Arreglado el ordenamiento de multimedia en la galería del chat\n\n★ Varios otros arreglos y pequeñas mejoras\n\n\n💜 Dona para ayudarnos a mantener nuestra independencia y seguir mejorando: %1$s</string>
<string name="update_2_0">🔮 ¿Qué hay de nuevo?\n\n★ El cifrado del chat es ahora más confiable, no puede degradarse, por lo que los candados 🔒 en los mensajes ya no son necesarios.\n\n★ Los correos sin cifrado aparecerán en su propio chat y marcados con un símbolo de correo ✉️\n\n★ Nueva pantalla de perfil mejorado\n\n★ Nuevo botón para acceder rápidamente a las mini-apps del chat\n\n\n💜 Dona para ayudarnos a mantener nuestra independencia y seguir mejorando: %1$s</string>
<!-- deprecated -->
<string name="update_1_50_android">¿Qué hay de nuevo?\n\n❤️‍🔥 Nuevo selector de emojis con más emojis\n\n🎮 Aplicaciones de chat mejoradas: recibe notificaciones y abre aplicaciones en contexto, por ejemplo, abre una entrada de calendario agregada directamente\n\n👍 Recibe notificaciones sobre las reacciones a tus mensajes\n\n... 🛠️ CORRECCIONES y AÚN MÁS en %1$s</string>
<!-- deprecated -->
<string name="update_switch_profile_placement">️ Se movió la opción \"Cambiar perfil\": toca tu imagen de perfil en la esquina superior de la pantalla principal para agregar o cambiar perfiles 💡</string>
<string name="update_2_0">¿Qué hay de nuevo?\n\n💯 El cifrado de extremo a extremo es fiable y para siempre. ¡Se acabaron los candados 🔒!\n\n✉️ El correo electrónico clásico sin cifrado de extremo a extremo es marcado con un símbolo de carta.\n\n😻 Nueva pantalla de perfil mejorada para todos tus contactos.\n\n🔲 Nuevo botón para acceder rápidamente a las apps usadas en el chat.\n\n❤️ Dona para ayudarnos a mantener nuestra independencia y seguir mejorando: %1$s</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More