Compare commits

..

216 Commits

Author SHA1 Message Date
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
adbenitez 6f1f446aa8 Merge remote-tracking branch 'upstream/main' 2025-12-08 19:17:03 +01:00
adbenitez e5149ac255 Merge remote-tracking branch 'upstream/main' 2025-12-08 19:16:02 +01:00
adb 403539da35 Merge pull request #4100 from deltachat/prep-2.33.0
prepare 2.33.0
2025-12-08 17:40:18 +01:00
adbenitez 443501112d prepare 2.33.0 2025-12-08 17:39:31 +01:00
adb bea2effb89 Merge pull request #4099 from deltachat/adb/update-translations-2025.12.08
update translations
2025-12-08 17:34:41 +01:00
adbenitez b2d875cc61 update translations 2025-12-08 17:30:55 +01:00
B. Petersen e94f571744 remove more deprecated strings 2025-12-08 16:25:19 +01:00
adb 69c6fdd070 Merge pull request #4096 from deltachat/adb/rename-relayutil
Rename RelayUtil to ShareUtil
2025-12-08 15:37:39 +01:00
B. Petersen 1b9bfc37ad remove deprecated strings 2025-12-08 15:20:30 +01:00
B. Petersen 8cb1c195b1 mark unused string as deprecated 2025-12-08 13:38:20 +01:00
B. Petersen 41f963332c remove 'email' from welcome message 2025-12-08 13:38:20 +01:00
B. Petersen dc6dee6a1a reword 'transport' to 'relay' 2025-12-08 13:38:20 +01:00
adbenitez 35becfc63b rename RelayUtil to ShareUtil 2025-12-08 12:54:42 +01:00
adb f6c25a2015 Merge pull request #4085 from deltachat/adb/issue-4082
improve KeepAliveService
2025-12-08 12:47:58 +01:00
adb be01c3b14f Merge branch 'main' into adb/issue-4082 2025-12-07 17:21:50 +01:00
adb bf435f4303 Merge pull request #4090 from deltachat/adb/issue-4089
only save common image formats to Pictures
2025-12-07 17:21:31 +01:00
adb 1f455c435f Merge pull request #4093 from deltachat/adb/improve-relay-list-item-layout
improve realy_list_item layout
2025-12-07 12:55:03 +01:00
adbenitez db8d4b5daf improve realy_list_item layout 2025-12-07 12:53:29 +01:00
adb 5ac7f9ee11 Merge branch 'main' into adb/issue-4082 2025-12-07 12:34:43 +01:00
adb 6c80f85290 Merge branch 'main' into adb/issue-4089 2025-12-07 12:34:30 +01:00
adb 744bca93e8 Merge pull request #4092 from deltachat/link2xt/flake-android-36
flake.nix: update Android SDK from 35 to 36
2025-12-07 12:34:13 +01:00
adb 601a65a1cb Merge pull request #4080 from deltachat/adb/add-transport-list-activity
add screen to list/add/remove transports/relays
2025-12-07 12:33:50 +01:00
adbenitez 9f2523da21 use R.string.def, don't add extra string 2025-12-07 11:50:47 +01:00
link2xt c936d51bac flake.nix: update Android SDK from 35 to 36
Closes <https://github.com/deltachat/deltachat-android/issues/4091>
2025-12-06 21:02:00 +00:00
adbenitez b77862c290 update changelog 2025-12-05 23:48:21 +01:00
adbenitez c495c3936b only save common image formats to Pictures 2025-12-05 23:45:27 +01:00
adbenitez a5a5819eec add makefile 2025-12-05 23:18:41 +01:00
adbenitez 429c3fb57c tweak changelog 2025-12-05 23:08:10 +01:00
adb 0c9bec1d3d Merge branch 'main' into adb/add-transport-list-activity 2025-12-05 23:07:06 +01:00
adb 51771669d3 Merge pull request #4088 from deltachat/update-core-and-stuff-2025.12.5
Update core to 2.33.0
2025-12-05 23:06:18 +01:00
adbenitez f32651cd9d update RPC bindings 2025-12-05 23:03:33 +01:00
adbenitez 07a2663591 update translations 2025-12-05 22:59:22 +01:00
adbenitez fe9ee4c484 update changelog 2025-12-05 22:55:12 +01:00
adbenitez 1425815467 update deltachat-core-rust to 'chore(release): prepare for 2.33.0' of 'v2.33.0' 2025-12-05 22:52:47 +01:00
adbenitez eea4a1b124 Merge remote-tracking branch 'upstream/main' 2025-12-05 22:37:50 +01:00
adb 72c7772e89 Merge pull request #4086 from deltachat/adb/set-clipToPadding-in-xml
set clipToPadding in xml instead of dynamically
2025-12-05 22:37:18 +01:00
adb c4f0dc2f2d Merge branch 'main' into adb/set-clipToPadding-in-xml 2025-12-05 22:36:47 +01:00
adb 2d0645465e Merge pull request #4087 from deltachat/adb/make-last-item-visible-in-chatlist
make last item fully visible when scrolling bottom of chat list
2025-12-05 22:27:06 +01:00
adbenitez 5031993289 update changelog 2025-12-05 21:22:07 +01:00
adbenitez 8e944552b3 make last item fully visible in chat list 2025-12-05 21:18:16 +01:00
adbenitez 342b071189 set clipToPadding in xml instead of dynamically 2025-12-05 21:12:11 +01:00
Korb 32248b4635 Adding Russian metadata translation (#62)
* Create ru-RU/title.txt

* Create ru-RU/short_description.txt
2025-12-05 19:00:30 +01:00
adbenitez 89b4be49c8 tweak dialog buttons's color 2025-12-05 01:55:04 +01:00
adbenitez b3230abd68 update changelog 2025-12-05 01:40:17 +01:00
adbenitez e26ac3d264 improve KeepAliveService 2025-12-05 00:29:58 +01:00
adbenitez fcc98e81d5 Merge remote-tracking branch 'upstream/main' 2025-12-04 23:19:42 +01:00
adb bd4fa0b032 Merge branch 'main' into adb/add-transport-list-activity 2025-12-04 23:16:58 +01:00
adb d4675f25ec Merge pull request #4084 from deltachat/adb/fix-log-view
use DcContext.getInfo() in LogViewFragment
2025-12-04 21:49:05 +01:00
adbenitez a2a440e57b use DcContext.getInfo() in LogViewFragment 2025-12-04 21:19:17 +01:00
adbenitez f24b2e2540 update changelog 2025-12-04 20:15:55 +01:00
adbenitez f8d2cd7bf3 Merge branch 'adb/add-transport-list-activity' of https://github.com/deltachat/deltachat-android into adb/add-transport-list-activity 2025-12-04 20:12:14 +01:00
adbenitez 1ff99ddbe4 add "add transport" floating button 2025-12-04 20:11:42 +01:00
adb 13bf0d6f9f Merge branch 'main' into adb/add-transport-list-activity 2025-12-04 18:42:58 +01:00
adbenitez d24f53895e allow to add transport from QR scanner 2025-12-04 18:42:14 +01:00
B. Petersen 66e8fa9d9e clearly say that experiments may be unstable/changed/removed
by the bare title, this is not clear to everyone.
technically, i also tried <PreferenceCategory summary>,
but that does not wrap text.

moved down 'app picker' for better layout and to match
order of other UI.
2025-12-03 20:28:33 +01:00
adbenitez 230fb79584 allow removing transports 2025-12-02 05:32:21 +01:00
adbenitez 9181a9c398 add uncommited/missing import in RelayListActivity 2025-12-02 05:21:02 +01:00
adbenitez 2f05b20b0f allow editing transports 2025-12-02 05:20:42 +01:00
adbenitez 115ffae588 create RelayListActivity with basic listing of relays/transports 2025-12-02 04:46:30 +01:00
adb 7455e56f11 Merge branch 'main' into adb/add-transport-list-activity 2025-12-01 23:34:05 +01:00
adb d4b8e4bafa Merge pull request #4081 from deltachat/adb/remove-superfluous-dynamic-theme-usage
remove superfluous DynamicTheme usage
2025-12-01 23:21:15 +01:00
adbenitez 67a2e3fcd9 Merge remote-tracking branch 'upstream/main' 2025-12-01 22:04:51 +01:00
adbenitez f12d6855e9 remove superfluous DynamicTheme usage 2025-12-01 21:46:09 +01:00
adbenitez 56459e7e7a add TransportListActivity 2025-12-01 21:26:37 +01:00
adb d5244f5f96 Merge pull request #4079 from deltachat/update-core-and-stuff-2025.12.01
update core to 2.29.0
2025-12-01 21:02:16 +01:00
adbenitez c8722ddcc6 update translations 2025-12-01 20:59:37 +01:00
adbenitez 5874001ec2 update changelog 2025-12-01 20:58:00 +01:00
adbenitez b94a4cbe8b update deltachat-core-rust to 'chore(release): prepare for 2.29.0' of 'v2.29.0' 2025-12-01 20:04:20 +01:00
B. Petersen 5d0b5f7947 remove InfoPlist_NSContactsUsageDescription, this should no longer go to InfoPlist files 2025-12-01 17:54:57 +01:00
adbenitez a193ee6cdf add publishing to ZapStore to CI 2025-11-30 03:00:58 +01:00
B. Petersen ff438731d8 mark strings as deprecated 2025-11-29 13:20:55 +01:00
B. Petersen 08913a5e76 adapt wording to 'delete contact' question; we no longer check the address book 2025-11-29 13:19:24 +01:00
adb e7d2656613 Merge pull request #4074 from deltachat/adb/remove-read-contacts-permission
remove need for READ_CONTACS permission
2025-11-29 02:42:58 +01:00
adbenitez f3210f2626 remove need for READ_CONTACS permission 2025-11-29 02:25:23 +01:00
adb 0b1fa7c7d1 Merge pull request #4073 from deltachat/adb/remove-dev-mode
remove mostly unused dev mode
2025-11-29 02:14:27 +01:00
adbenitez 6b6d48f5da remove mostly unused dev mode 2025-11-29 02:02:22 +01:00
adbenitez 3b9e989195 Merge remote-tracking branch 'upstream/main' 2025-11-29 01:56:03 +01:00
adbenitez 4af065aad9 Merge remote-tracking branch 'upstream/main' 2025-11-29 00:46:41 +01:00
B. Petersen b0e918caab remove explains partly refering to shared usage 2025-11-28 23:55:11 +01:00
B. Petersen a6384dc679 clearer category name 2025-11-28 23:55:11 +01:00
B. Petersen 838db45a74 hiding a categoty hides its options 2025-11-28 23:55:11 +01:00
B. Petersen 44328f1086 update advanced settings
- move 'server' up
- move other options down, after experimental
- introduce 'legacy' section
2025-11-28 23:55:11 +01:00
adb 2064a2f0ea Merge pull request #4071 from deltachat/adb/edge-to-edge3
use recommended way of enabling edge-to-edge
2025-11-28 22:01:58 +01:00
adbenitez 6b066d9428 update comment in BaseActionBarActivity 2025-11-28 21:56:25 +01:00
adb d68508c0cf Merge pull request #4070 from deltachat/adb/update-changelog-2025.11.28
update changelog
2025-11-28 18:15:50 +01:00
adbenitez 5f5f303a93 update changelog 2025-11-28 18:14:38 +01:00
adb 71bb0105ab Merge pull request #4066 from deltachat/adb/webview-links-tweaks
add URL schemes whitelist
2025-11-28 18:12:23 +01:00
adb 796c81af61 Merge pull request #4067 from deltachat/adb/target-sdk-36
Target SDK 36
2025-11-28 18:11:39 +01:00
adb 329c7a52a7 Merge pull request #4064 from deltachat/adb/edge-to-edge2
Make  edge-to-edge great again
2025-11-28 18:10:16 +01:00
B. Petersen b19d39b794 use updated texts in tests 2025-11-28 14:27:18 +01:00
B. Petersen b4d8f1e04f remove all png files before help creation 2025-11-28 14:25:03 +01:00
adbenitez febf2cb105 (temporarily) opt-out predictive back 2025-11-28 02:19:00 +01:00
adbenitez ef00e04638 update compileSdk and targetSdkVersion to 36 in build.gradle 2025-11-28 01:49:49 +01:00
adb 1042f4b4f8 Merge branch 'adb/edge-to-edge2' into adb/webview-links-tweaks 2025-11-28 01:38:39 +01:00
adb 0180d63821 Merge branch 'main' into adb/edge-to-edge2 2025-11-28 01:38:20 +01:00
adb 8b8c6b6bbb Merge pull request #4050 from deltachat/adb/issue-4049
garbage-collect storage of deleted webxdc apps
2025-11-28 01:37:31 +01:00
adbenitez fe8ad85f89 assume core will handle unexisting accounts 2025-11-28 01:35:03 +01:00
adbenitez c938c4dcd9 check for existing account IDs 2025-11-28 01:26:51 +01:00
adb 35f6a06406 Merge branch 'main' into adb/issue-4049 2025-11-27 19:28:49 +01:00
adbenitez db7365c3b3 restrict supported URL schemas 2025-11-27 19:10:18 +01:00
adbenitez 51d7e5df62 update changelog 2025-11-27 07:39:51 +01:00
adb 28f7fbf806 Merge branch 'main' into adb/edge-to-edge2 2025-11-27 07:39:00 +01:00
adbenitez d6d3dd8930 enable edge-to-edge only in SDK 30+ 2025-11-27 07:20:05 +01:00
adbenitez 83571ba0bf ConversationListActivity: fix display of searchToolbar 2025-11-26 23:55:51 +01:00
adbenitez 34fc888c5e WebViewActivity: improve integrated map's edge-to-edge 2025-11-26 23:40:23 +01:00
adbenitez 0a7be040c3 NewContactActivity: small tweaks 2025-11-26 23:11:27 +01:00
adbenitez 448334a8a2 ShareActivity: properly implement edge-to-edge 2025-11-26 23:01:28 +01:00
adbenitez 5141116f38 QrShowActivity: properly implement edge-to-edge 2025-11-26 22:54:20 +01:00
adbenitez 310500b8d7 ProfileActivity: properly implement edge-to-edge 2025-11-26 22:20:59 +01:00
adbenitez 7bc0ab858a ContactSelectionActivity: properly implement edge-to-edge 2025-11-26 22:13:49 +01:00
adbenitez ca438ca3a3 AllMediaActivity: properly implement edge-to-edge 2025-11-26 21:55:45 +01:00
adbenitez 2a2cb7c26e QrActivity: properly implement edge-to-edge 2025-11-26 21:24:58 +01:00
adbenitez 9e5a2d30ed WelcomeActivity: properly implement edge-to-edge 2025-11-26 20:57:50 +01:00
adbenitez 5b8c0db287 WebxdcStoreActivity: properly implement edge-to-edge 2025-11-26 20:32:06 +01:00
adbenitez 08864ae250 WebViewActivity: properly implement edge-to-edge 2025-11-26 20:26:48 +01:00
adbenitez ea6bd9283c EditTransportActivity: properly implement edge-to-edge 2025-11-26 20:11:49 +01:00
adbenitez 83dfca249d LogViewActivity: properly implement edge-to-edge 2025-11-26 19:59:23 +01:00
adbenitez c7d41d1b84 InstantOnboardingActivity: properly implement edge-to-edge 2025-11-26 19:38:55 +01:00
adbenitez b09838f033 ConversationListActivity: properly implement edge-to-edge 2025-11-26 07:55:35 +01:00
adbenitez 10164032f0 GroupCreateActivity: properly implement edge-to-edge 2025-11-26 06:28:25 +01:00
adbenitez 7829ff0a83 CreateProfileActivity: properly implement edge-to-edge 2025-11-26 06:01:49 +01:00
adbenitez aaa8a07511 ConversationListArchiveActivity: properly implement edge-to-edge 2025-11-26 05:43:12 +01:00
adbenitez cd2aedcc6b ConversationActivity: properly implement edge-to-edge 2025-11-26 04:05:09 +01:00
adbenitez 553610cfa4 BlockedContactsActivity: properly implement edge-to-edge 2025-11-26 03:14:43 +01:00
adbenitez ceea00e2cc ApplicationPreferencesActivity: properly implement edge-to-edge 2025-11-26 02:41:33 +01:00
adbenitez ef512b0f14 RegistrationQrActivity: properly implement edge-to-edge 2025-11-26 01:10:57 +01:00
adbenitez 83a7e4df3f BackupTransferActivity: properly implement edge-to-edge 2025-11-26 00:49:08 +01:00
adbenitez d4aa90cc0c ProxySettingsActivity: properly implement edge-to-edge 2025-11-26 00:31:12 +01:00
adbenitez 342d820095 ChatBackgroundActivity: properly implement edge-to-edge 2025-11-25 23:29:19 +01:00
adbenitez 18d9c00d13 NewContactActivity: properly implement edge-to-edge 2025-11-25 22:30:20 +01:00
B. Petersen 8df792a8e3 mark strings that are about to be no longer needed as deprecated 2025-11-25 20:25:06 +01:00
B. Petersen 0693f8ad60 mark strings that are about to be no longer needed as deprecated 2025-11-25 13:50:39 +01:00
adb eaa6a68e4f Merge pull request #4060 from deltachat/adb/issue-4058
add output of `Rpc.getStorageUsageReportString()` to log
2025-11-24 21:16:23 +01:00
adbenitez 174170ee4f update changelog 2025-11-24 00:54:09 +01:00
adbenitez 3ee2c3f0be add output of Rpc.getStorageUsageReportString() to log 2025-11-24 00:44:34 +01:00
adbenitez 339ab13f64 update changelog 2025-11-24 00:18:54 +01:00
adbenitez 777e6f40cb use getExistingMsgIds() 2025-11-23 23:39:47 +01:00
adb 577ec92c53 Merge branch 'main' into adb/issue-4049 2025-11-23 23:29:50 +01:00
adb 9f40d84a51 Merge branch 'main' into adb/issue-4049 2025-11-23 22:50:04 +01:00
adb f1d9ddeed6 Merge branch 'main' into adb/issue-4049 2025-11-23 16:20:05 +01:00
adb da1e71b2d2 Merge branch 'main' into adb/issue-4049 2025-11-22 22:28:03 +01:00
adbenitez 00027ad8f3 remove unused imports 2025-11-22 20:05:46 +01:00
adbenitez 81e7f37d61 move WebxdcGarbageCollectionWorker to webxdc package 2025-11-22 20:05:21 +01:00
adb 4e6c1e3eaf Merge pull request #4051 from deltachat/link2xt/webxdc-garbage-collector-worker
Add WebxdcGarbageCollectionWorker
2025-11-22 19:25:01 +01:00
link2xt 77eda90923 Add WebxdcGarbageCollectionWorker 2025-11-22 16:40:58 +00:00
adbenitez e96b4db126 Merge branch 'adb/issue-4049' of https://github.com/deltachat/deltachat-android into adb/issue-4049 2025-11-22 00:06:02 +01:00
adbenitez 118d4f864f add startup delay to avoid bottleneck on app start 2025-11-22 00:05:40 +01:00
adb d6259f112e Merge branch 'main' into adb/issue-4049 2025-11-22 00:03:16 +01:00
adbenitez 2a3934cbd7 garbage-collect storage of deleted webxdc apps 2025-11-21 22:47:25 +01:00
215 changed files with 4912 additions and 4017 deletions
+12 -1
View File
@@ -60,7 +60,7 @@ jobs:
./gradlew assembleGplayRelease
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
- name: Release
- name: Release on GitHub
uses: softprops/action-gh-release@v1
with:
token: "${{ secrets.GITHUB_TOKEN }}"
@@ -68,3 +68,14 @@ jobs:
prerelease: ${{ contains(github.event.ref, '-beta') }}
fail_on_unmatched_files: true
files: build/outputs/apk/foss/release/*.apk
- name: Release on ZapStore
run: |
export CHECKSUM=6e2c7cf6da53c3f1a78b523a6aacd6316dce3d74ace6f859c2676729ee439990
curl -sL https://cdn.zapstore.dev/$CHECKSUM -o zapstore
if echo "$CHECKSUM zapstore" | sha256sum -c --status; then
chmod +x zapstore
SIGN_WITH=${{ secrets.NOSTR_KEY }} ./zapstore publish --indexer-mode
else
echo "ERROR: checksum doesn't match!"
fi
+21 -2
View File
@@ -1,19 +1,38 @@
# Delta Chat Android Changelog
## Unreleased
## 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
* Do not show "1 member" when the process of joining the group is not finished
* Make search case-insensitive for non-ASCII chat and contact names
* Improve handling of video recoding
* Send .webm videos as file, they are not supported by all platforms
* Tweak advanced section and wording of some advanced options
* Fix: avoid crash in push notifications handling
* Fix: avoid freezing in background
* Fix: clean up web storage of deleted in-chat apps
* Fix: avoid crash when exporting some files with wrong image MIME type
* Expose new "Multi-device mode" option instead of "Delete from server" for chatmail profiles
* Opened in-chat apps got a 'About Apps' menu item
* Avoid gray avatar on profile creation
* Update to core 2.28.0
* Avoid last item in chat list being covered by the floating button
* Add disk usage statistics to log
* New experimental feature: several addresses per profile
* Update to core 2.33.0
## v2.25.0
2025-11
+5 -4
View File
@@ -21,7 +21,7 @@ android {
}
namespace "org.thoughtcrime.securesms"
flavorDimensions "none"
compileSdk 35
compileSdk 36
// Set NDK version to strip native libraries.
// Even though we compile our libraries outside Gradle with `scripts/ndk-make.sh`,
@@ -33,14 +33,14 @@ android {
useLibrary 'org.apache.http.legacy'
defaultConfig {
versionCode 30000732
versionName "2.25.0"
versionCode 30000735
versionName "2.34.0"
applicationId "chat.delta.lite"
multiDexEnabled true
minSdkVersion 21
targetSdkVersion 35
targetSdkVersion 36
vectorDrawables.useSupportLibrary = true
@@ -211,6 +211,7 @@ dependencies {
implementation "io.noties.markwon:inline-parser:$markwon_version"
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
implementation 'androidx.concurrent:concurrent-futures:1.3.0'
implementation 'androidx.sharetarget:sharetarget:1.2.0'
implementation 'androidx.webkit:webkit:1.14.0'
implementation 'androidx.multidex:multidex:2.0.1'
@@ -0,0 +1,36 @@
ArcaneChat — децентрализованный и защищённый мессенджер, удобный для друзей и семьи.
• Анонимность. Мгновенный вход без номера телефона, e-mail или других личных данных.
• Гибкость. Поддерживает несколько профилей чатов и легко настраивается на нескольких устройствах.
• Расширяемость. В чатах можно использовать мини-приложения: списки покупок, календари или игры.
• Надёжность. Работает даже при плохом соединении и в сложных сетевых условиях.
• Безопасность. Проверенное сквозное шифрование, защищённое от сетевых и серверных атак.
• Самостоятельность. Может работать с вашим собственным e-mail-адресом или сервером.
ArcaneChat — клиент Delta Chat, разработанный с акцентом на удобство, качественный UX и экономию трафика. Также приложение часто экспериментирует с новыми функциями, которые со временем могут быть добавлены в официальный клиент Delta Chat.
<b>Основные отличия от официального клиента Delta Chat:</b>
<ul>
<li>Поддержка некоторых стилей markdown в текстовых сообщениях (жирный, курсив, зачёркнутый и т.д.)</li>
<li>Поддержка отображения анимированных стикеров Telegram (.tgs-файлы)</li>
<li>Поддержка предпросмотра SVG-изображений</li>
<li>Несколько цветовых тем/скинов</li>
<li>Возможность отключать профили, полностью отключая им доступ в сеть для экономии трафика</li>
<li>На панели переключения профилей видно состояние подключения каждого профиля</li>
<li>Дополнительная опция для обмена местоположением на 12 часов</li>
<li>Нажатие на сообщение с POI открывает его на карте</li>
<li>Статус «был(а) в сети» отображается в списке контактов, как в WhatsApp, Telegram и т.д.</li>
<li>Видео воспроизводятся по кругу — удобно для коротких GIF-видео</li>
<li>У чата «Device Messages» в списке чатов отображается значок подтверждения</li>
<li>В режиме «низкое качество» голосовые сообщения сжимаются сильнее для экономии трафика</li>
<li>Автоматическая загрузка сообщений по умолчанию ограничена 640KB</li>
<li>Отображаемое имя профиля всегда видно в заголовке приложения вместо названия приложения</li>
<li>Для разработчиков мини-приложений: доступны дополнительные возможности WebXDC API, см. https://github.com/ArcaneChat/android/#webxdc</li>
<li>Более удобная организация настроек с дополнительным разделом «Privacy»</li>
</ul>
@@ -0,0 +1 @@
⚡ Быстрые зашифрованные чаты для семьи 🎉
@@ -0,0 +1 @@
ArcaneChat
+1 -1
View File
@@ -18,7 +18,7 @@
build-tools-35-0-0
cmdline-tools-latest
platform-tools
platforms-android-35
platforms-android-36
ndk-27-2-12479018
]);
rust-version = pkgs.lib.removeSuffix "\n"
+83
View File
@@ -0,0 +1,83 @@
.PHONY: apk
apk:
./scripts/rebrand.sh
./gradlew --offline assembleGplayRelease
./scripts/undo_rebrand.sh
.PHONY: aab
aab:
./scripts/rebrand.sh
sed -i 's/signingConfigs.releaseApk/signingConfigs.releaseBundle/g' build.gradle
./gradlew --offline bundleGplayRelease
sed -i 's/signingConfigs.releaseBundle/signingConfigs.releaseApk/g' build.gradle
./scripts/undo_rebrand.sh
.PHONY: foss
foss:
./scripts/rebrand.sh
./gradlew --offline assembleFossRelease
./scripts/undo_rebrand.sh
.PHONY: install
install:
adb -d install -r build/outputs/apk/gplay/release/*universal*.apk
.PHONY: emulator-install
emulator-install:
adb install -r build/outputs/apk/gplay/release/*universal*.apk
.PHONY: fetch
fetch:
git fetch upstream
.PHONY: clean
clean:
./gradlew --offline clean
# CORE:
.PHONY: fetch-core
fetch-core:
cd ../core && git fetch upstream
.PHONY: core
core:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-fast
core-fast:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh arm64-v8a; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-v7
core-v7:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh armeabi-v7a; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-x86
core-x86:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh x86; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: link
link:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
.PHONY: unlink
unlink:
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
+1
View File
@@ -1 +1,2 @@
rm src/main/assets/help/*.png
../deltachat-pages/tools/create-local-help.py ../deltachat-pages/result src/main/assets/help
@@ -41,7 +41,7 @@ public class OnboardingTest {
}
onView(withText(R.string.scan_invitation_code)).check(matches(isClickable()));
onView(withText(R.string.import_backup_title)).check(matches(isClickable()));
onView(withText(R.string.login_header)).perform(click());
onView(withText(R.string.manual_account_setup_option)).perform(click());
onView(withHint(R.string.email_address)).perform(replaceText(BuildConfig.TEST_ADDR));
onView(withHint(R.string.existing_password)).perform(replaceText(BuildConfig.TEST_MAIL_PW));
onView(withContentDescription(R.string.ok)).perform(click());
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<application>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="specialUse"
android:enabled="true" />
</application>
</manifest>
+5
View File
@@ -10,6 +10,11 @@
<meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" />
<application>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="dataSync"
android:enabled="true" />
<service
android:name=".notifications.FcmReceiveService"
android:foregroundServiceType="dataSync"
@@ -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);
}
}
+3 -8
View File
@@ -13,7 +13,6 @@
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
<!-- dangerous permissions - we need to as the user with a PermissionsRequest -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
@@ -55,6 +54,7 @@
android:requestLegacyExternalStorage="true"
tools:targetApi="TIRAMISU"
android:hasFragileUserData="true"
android:enableOnBackInvokedCallback="false"
>
<!-- android car support, see https://developer.android.com/training/auto/start/,
@@ -233,14 +233,14 @@
android:theme="@style/TextSecure.LightNoActionBar"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name=".EditTransportActivity"
<activity android:name=".relay.EditRelayActivity"
android:launchMode="singleTask"
android:windowSoftInputMode="stateUnchanged"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
android:exported="true">
</activity>
<activity android:name=".TransportListActivity"
<activity android:name=".relay.RelayListActivity"
android:windowSoftInputMode="stateHidden"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
@@ -391,11 +391,6 @@
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
</activity>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="dataSync"
android:enabled="true" />
<service
android:name=".geolocation.LocationBackgroundService"
android:foregroundServiceType="location" />
+85 -40
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 transport?</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>
@@ -649,7 +650,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1055,7 +1066,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1067,7 +1078,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1076,7 +1087,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1435,12 +1480,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+237 -220
View File
@@ -16,23 +16,23 @@
<li><a href="#edit">Schreibfehler korrigieren und Nachrichten nach dem Senden löschen</a></li>
<li><a href="#ephemeralmsgs">Wie funktionieren “Verschwindende Nachrichten”?</a></li>
<li><a href="#delold">Was passiert, wenn ich “Alte Nachrichten vom Gerät löschen” aktiviere?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
<li><a href="#remove-account">Wie kann ich mein Chat-Profil löschen?</a></li>
</ul>
</li>
<li><a href="#groups">Groups</a>
<li><a href="#groups">Gruppen</a>
<ul>
<li><a href="#eine-gruppe-anlegen">Eine Gruppe anlegen</a></li>
<li><a href="#addmembers">Add and remove members</a></li>
<li><a href="#addmembers">Mitglieder hinzufügen und entfernen</a></li>
<li><a href="#ich-habe-mich-selbst-versehentlich-gelöscht">Ich habe mich selbst versehentlich gelöscht.</a></li>
<li><a href="#ich-möchte-keine-nachrichten-einer-gruppe-mehr-empfangen">Ich möchte keine Nachrichten einer Gruppe mehr empfangen.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#eine-gruppe-klonen">Eine Gruppe klonen</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
<li><a href="#webxdc">In-Chat-Apps</a>
<ul>
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
<li><a href="#how-private-are-in-chat-apps">How private are in-chat apps?</a></li>
<li><a href="#create-xdc">How can I create my own in-chat apps?</a></li>
<li><a href="#wo-bekomme-ich-in-chat-apps">Wo bekomme ich In-Chat-Apps?</a></li>
<li><a href="#wie-privat-sind-in-chat-apps">Wie privat sind In-Chat-Apps?</a></li>
<li><a href="#create-xdc">Wie kann mich meine eigene In-Chat-Apps erstellen?</a></li>
</ul>
</li>
<li><a href="#instant-delivery">Sofortige Nachrichtenzustellung und Push-Benachrichtigungen</a>
@@ -54,19 +54,20 @@
</li>
<li><a href="#erweitert">Erweitert</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 transport?</a></li>
<li><a href="#experimentelle-features">Experimentelle Features</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>
<li><a href="#e2ee">Verschlüsselung und Sicherheit</a>
<ul>
<li><a href="#welche-standards-werden-für-die-ende-zu-ende-verschlüsselung-verwendet">Welche Standards werden für die Ende-zu-Ende-Verschlüsselung verwendet?</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">Wie kann ich wissen, ob Nachrichten Ende-zu-Ende-verschlüsselt sind?</a></li>
<li><a href="#kann-ich-nachrichten-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden">Kann ich Nachrichten ohne Ende-zu-Ende-Verschlüsselung empfangen oder senden?</a></li>
<li><a href="#e2eeguarantee">Was bedeutet das grüne Häkchen in einem Kontaktprofil?</a></li>
<li><a href="#sind-anhänge-bilder-dateien-audio-usw-ende-zu-ende-verschlüsselt">Sind Anhänge (Bilder, Dateien, Audio usw.) Ende-zu-Ende-verschlüsselt?</a></li>
<li><a href="#openpgp-secure">Ist OpenPGP sicher?</a></li>
@@ -102,30 +103,26 @@
</h2>
<p>Delta Chat is a reliable, decentralized and secure instant messaging app,
available for mobile and desktop platforms.</p>
<p>Delta Chat ist eine zuverlässige, dezentralisierte und sichere Instant-Messaging-App, verfügbar für Mobile- und Desktop-Plattformen.</p>
<ul>
<li>
<p>Instant creation of <strong>private chat profiles</strong>
with secure and interoperable <a href="https://chatmail.at/relays">chatmail relays</a>
that offer instant message delivery, and Push Notifications for iOS and Android devices.</p>
<p>Einfache Erstellung von <strong>privaten Chat-Profile</strong> mit sicheren, schnellen und interoperablen <a href="https://chatmail.at/relays">Chatmail-Servern</a>,
die sofortige Push-Benachrichtigungen für iOS- und Android-Geräte bieten.</p>
</li>
<li>
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and
<a href="#multiclient">multi-device</a> support on all platforms
and between different <a href="https://chatmail.at/clients">chatmail apps</a>.</p>
<p>Durchgängige <a href="#multiple-accounts">Mehrprofil</a>- und <a href="#multiclient">Mehrgeräte</a>-Unterstützung auf allen Plattformen und zwischen verschiedenen <a href="https://chatmail.at/clients">Chatmail Apps</a></p>
</li>
<li>
<p>Interactive <a href="#webxdc">in-chat apps</a> for gaming and collaboration</p>
<p>Interaktive <a href="#webxdc">In-Chats-Apps</a> zum Spielen und für die Zusammenarbeit</p>
</li>
<li>
<p><a href="#security-audits">Audited end-to-end encryption</a>
safe against network and server attacks.</p>
<p><a href="#security-audits">Geprüfte Ende-zu-Ende-Verschlüsselung</a>,
sicher gegen Netzwerk- und Serverangriffe.</p>
</li>
<li>
<p>Free and Open Source software, both app and server side,
built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet Standards</a>.</p>
<p>Freie und quelloffene Software, sowohl app- als auch serverseitig,
basierend auf <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet-Standards</a>.</p>
</li>
</ul>
@@ -137,41 +134,38 @@ built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standa
</h3>
<p>First, note that Delta Chat is a private messenger.
There is no public discovery, <em>you</em> decide about your contacts.</p>
<p>Beachte zunächst, dass Delta Chat ein privater Messenger ist.
Es gibt keine öffentliches Verzeichnis, du entscheiden selbst über deine Kontakte.</p>
<ul>
<li>
<p>If you are <strong>face to face</strong> with your friend or family,
tap the <strong>QR Code</strong> icon <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
on the main screen.<br />
Ask your chat partner to <strong>scan</strong> the QR image
with their Delta Chat app.</p>
<p>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>.</p>
</li>
<li>
<p>For a <strong>remote</strong> contact setup,
from the same screen,
click “Copy” or “Share” and send the <strong>invite link</strong>
through another private chat.</p>
<p>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>Now wait while connection gets established.</p>
<p>Wartet nun, bis die Verbindung hergestellt ist.</p>
<ul>
<li>
<p>If both sides are online, they will soon see a chat
and can start messaging securely.</p>
<p>Wenn beide Seiten online sind, wird ein Chat angezeigt und ihr könnt sicher miteinander chatten.</p>
</li>
<li>
<p>If one side is offline or in bad network,
the ability to chat is delayed until connectivity is restored.</p>
<p>Wenn eine Seite offline ist oder eine schlechte Netzwerkverbindung hat,
wird die Chat-Funktion verzögert, bis die Verbindung wiederhergestellt ist.</p>
</li>
</ul>
<p>Congratulations!
You now will automatically use <a href="#e2ee">end-to-end encryption</a> with this contact.
If you add each other to <a href="#groups">groups</a>, end-to-end encryption will be established among all members.</p>
<p>Glückwunsch!
Du verwendest jetzt automatisch eine <a href="#e2ee">Ende-zu-Ende-Verschlüsselung</a>
mit deinem Kontakt.
Wenn man sich gegenseitig zu <a href="#groups">Gruppen</a> hinzufügt,
wird eine Ende-zu-Ende-Verschlüsselung zwischen allen Mitgliedern eingerichtet.</p>
<h3 id="warum-ist-ein-chat-als-anfrage-markiert">
@@ -207,11 +201,11 @@ receive messages from this person, consider <strong>blocking</strong> them.</p>
</h3>
<p>Attach the first contact to the chat of the second using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → Contact</strong>.
You can also add a little introduction message.</p>
<p>Füge den ersten Kontakt zum Chat des zweiten Kontakts hinzu, indem du auf <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Anhängen → Kontakt</strong> klickst.
Du kannst auch eine kurze Nachricht hinzufügen.</p>
<p>The second contact will receive a <strong>card</strong> then
and can tap it to start chatting with the first contact.</p>
<p>Der zweite Kontakt erhält dann die <strong>Kontaktdaten</strong> und
kann darauf tippen, um mit dem ersten Kontakt zu chatten.</p>
<h3 id="unterstützt-delta-chat-bilder-videos-und-dateianhänge">
@@ -240,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>
@@ -371,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>
@@ -431,9 +425,7 @@ als auch in den Apps selbst gelöscht.</p>
böswillige Chatpartner können Fotos machen,
oder auf andere Weise Nachrichten vor dem Löschen speichern, kopieren oder weiterleiten.</p>
<p>Apart from that,
if one chat partner uninstalls Delta Chat,
the (anyway encrypted) messages may take longer to get deleted from their server.</p>
<p>Abgesehen davon, wenn ein Chat-Partner Delta Chat deinstalliert, kann es länger dauern, bis die (ohnehin verschlüsselten) Nachrichten vom Server gelöscht werden.</p>
<h3 id="delold">
@@ -445,45 +437,44 @@ the (anyway encrypted) messages may take longer to get deleted from their server
<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">
How can I delete my chat profile? <a href="#remove-account" class="anchor"></a>
Wie kann ich mein Chat-Profil löschen? <a href="#remove-account" class="anchor"></a>
</h3>
<p>If you are using more than one chat profile,
you can remove single ones in the top profile switcher menu (on Android and iOS),
or in the sidebar with a right click (in the Desktop app).
Chat profiles are only removed on the device where deletion was triggered.
Chat profiles on other devices will continue to fully function.</p>
<p>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">
Groups <a href="#groups" class="anchor"></a>
Gruppen <a href="#groups" class="anchor"></a>
</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">
@@ -502,34 +493,27 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
<h3 id="addmembers">
Add and remove members <a href="#addmembers" class="anchor"></a>
Mitglieder hinzufügen und entfernen <a href="#addmembers" class="anchor"></a>
</h3>
<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">
@@ -562,107 +546,103 @@ Wenn du der Gruppe später erneut beitreten möchtest, bitten ein anderes Gruppe
</li>
</ul>
<h3 id="cloning-a-group">
<h3 id="eine-gruppe-klonen">
Cloning a group <a href="#cloning-a-group" class="anchor"></a>
Eine Gruppe klonen <a href="#eine-gruppe-klonen" class="anchor"></a>
</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">
In-chat apps <a href="#webxdc" class="anchor"></a>
In-Chat-Apps <a href="#webxdc" class="anchor"></a>
</h2>
<p>You can send apps to a chat - games, editors, polls and other tools.
This makes Delta Chat a truly extensible messenger.</p>
<p>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="where-can-i-get-in-chat-apps">
<h3 id="wo-bekomme-ich-in-chat-apps">
Where can I get in-chat apps? <a href="#where-can-i-get-in-chat-apps" class="anchor"></a>
Wo bekomme ich In-Chat-Apps? <a href="#wo-bekomme-ich-in-chat-apps" class="anchor"></a>
</h3>
<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>
<h3 id="how-private-are-in-chat-apps">
<h3 id="wie-privat-sind-in-chat-apps">
How private are in-chat apps? <a href="#how-private-are-in-chat-apps" class="anchor"></a>
Wie privat sind In-Chat-Apps? <a href="#wie-privat-sind-in-chat-apps" class="anchor"></a>
</h3>
<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 Delta Chat 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>
<h3 id="create-xdc">
How can I create my own in-chat apps? <a href="#create-xdc" class="anchor"></a>
Wie kann mich meine eigene In-Chat-Apps erstellen? <a href="#create-xdc" class="anchor"></a>
</h3>
<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>
@@ -722,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>
@@ -736,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>
@@ -751,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>
@@ -763,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>
@@ -785,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
@@ -807,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">
@@ -909,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ählen, anstatt sich bei Ihrem E-Mail-Konto anzumelden, “Wiederherstellen aus Backup”. Nach dem Import sollten Ihre Unterhaltungen, Verschlüsselungsschlüssel und Medien auf das neue Gerät kopiert sein.
<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">
@@ -940,54 +920,63 @@ versuche, einen <strong>Mobilen Hotspot</strong> auf einem Gerät zu öffnen und
</h2>
<h3 id="experimental-features">
<h3 id="experimentelle-features">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Experimentelle Features <a href="#experimentelle-features" class="anchor"></a>
</h3>
<p>At <strong>Settings → Advanced → Experimental Features</strong>
you can try out features we are working on.</p>
<p>Unter <strong>Einstellungen → Erweitert → Experimentelle Features</strong>
kannst du unfertige Features ausprobieren, an denen gearbeitet wird.</p>
<p>The features may be <strong>unstable</strong> and may be <strong>changed or removed</strong>.</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">
What is “Send statistics to Delta Chats developers”? <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="can-i-use-a-classic-email-address-with-delta-chat">
<h3 id="kann-ich-eine-klassische-e-mail-adresse-mit-delta-chat-verwenden">
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>
Kann ich eine klassische E-Mail-Adresse mit Delta Chat verwenden? <a href="#kann-ich-eine-klassische-e-mail-adresse-mit-delta-chat-verwenden" class="anchor"></a>
</h3>
@@ -1004,7 +993,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1016,7 +1005,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
Wie kann ich ein Chat-Profil mit einer klassischen E-Mail-Adresse als Relay konfigurieren? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1025,7 +1014,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -1049,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">
@@ -1098,7 +1121,7 @@ ermöglicht es den Empfängern, eine Ende-zu-Ende-Verschlüsselung mit dem Konta
<h3 id="whene2e">
How can I know if messages are end-to-end encrypted? <a href="#whene2e" class="anchor"></a>
Wie kann ich wissen, ob Nachrichten Ende-zu-Ende-verschlüsselt sind? <a href="#whene2e" class="anchor"></a>
</h3>
@@ -1106,20 +1129,17 @@ ermöglicht es den Empfängern, eine Ende-zu-Ende-Verschlüsselung mit dem Konta
<p>Alle Nachrichten in Delta Chat sind <strong>standardmäßig Ende-zu-Ende-verschlüsselt</strong>.
Seit der Veröffentlichung von Delta Chat Version 2 (Juli 2025) gibt es keine Schlösser oder ähnliche Markierungen mehr an EndezuEnde-verschlüsselten Nachrichten.</p>
<h3 id="can-i-still-receive-or-send-messages-without-end-to-end-encryption">
<h3 id="kann-ich-nachrichten-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden">
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>
Kann ich Nachrichten ohne Ende-zu-Ende-Verschlüsselung empfangen oder senden? <a href="#kann-ich-nachrichten-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden" class="anchor"></a>
</h3>
<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">
@@ -1193,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
@@ -1234,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">
@@ -1363,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">
@@ -1376,11 +1398,12 @@ ist die Verbindung sicher.</p>
<p>Nein.</p>
<p>Delta Chat erzeugt sichere OpenPGP-Schlüssel gemäß der Autocrypt-Spezifikation 1.1.
Du kannst deinen privaten Schlüssel exportieren, aber du kannst keinen weiteren privaten Schlüssel importieren.</p>
<p>Im Allgemeinen empfehlen wir, die Schlüsselverwaltung nicht manuell vorzunehmen, und bieten dies auch nicht an.
Wir wollen sicherstellen, dass sich Sicherheitsaudits auf wenige, bewährte kryptographische Algorithmen konzentrieren können - statt einen Strauß möglicher Algorithmen, die mit OpenPGP erlaubt sind.</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>
<h3 id="security-audits">
@@ -1465,11 +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>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>Ö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>
@@ -1501,15 +1523,10 @@ Die zweite Förderung 2019/2020 (~$300K) half uns bei der Erstellung der iOS-Ve
<p>Die <a href="https://nlnet.nl/">NLnet-Stiftung</a> bewilligte 2019/2020 46K EUR für die Fertigstellung von Rust-/Python-Bindungs und die Einrichtung eines Chat-Bot-Ökosystems.</p>
</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>Im Jahr 2021 erhielten wir weitere EU-Mittel für zwei “Next-Generation-Internet”-Anträge, nämlich für <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - E-Mail-Provider-Portabilitätsverzeichnis</a> (~97K EUR) und <a href="https://nlnet.nl/project/EmailPorting/">AEAP - E-Mail-Adressportierung</a> (~90K EUR). Ziel sind bessere Unterstützung von Mehrfachkonten, verbesserten QR-Code-Kontakt- und -Gruppen-Setups sowie Netzwerkverbesserungen auf allen Plattformen.</p>
</li>
<li>
<p>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>Von Ende 2021 bis März 2023 erhielten wir eine <em>Internet-Freedom</em>-Finanzierung (500K USD) vom U.S. Bureau of Democracy, Human Rights and Labor (DRL). Diese Finanzierung unterstützte unsere langjährigen Ziele, Delta Chat benutzerfreundlicher und kompatibel mit einer breiten Palette von E-Mail-Servern weltweit zu machen, sowie widerstandsfähiger und sicherer an Orten, die häufig von Internetzensur und Abschaltungen betroffen sind.</p>
</li>
<li>
<p>2023-2024 schlossen wir erfolgreich das vom OTF finanzierte
Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

+85 -40
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 transport?</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>
@@ -650,7 +651,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1057,7 +1068,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1069,7 +1080,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1078,7 +1089,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1437,12 +1482,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+85 -40
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 transport?</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>
@@ -648,7 +649,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1055,7 +1066,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1067,7 +1078,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1076,7 +1087,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1428,12 +1473,12 @@ in collaboration with other OpenPGP implementers.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+85 -40
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 transport?</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>
@@ -641,7 +642,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1042,7 +1053,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1054,7 +1065,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1063,7 +1074,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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-">
@@ -1422,12 +1467,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+85 -40
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 transport?</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>
@@ -650,7 +651,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1057,7 +1068,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1069,7 +1080,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1078,7 +1089,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1437,12 +1482,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+247 -208
View File
@@ -19,20 +19,20 @@
<li><a href="#remove-account">Come posso eliminare il mio profilo chat?</a></li>
</ul>
</li>
<li><a href="#gruppi">Gruppi</a>
<li><a href="#groups">Gruppi</a>
<ul>
<li><a href="#creazione-di-un-gruppo">Creazione di un gruppo</a></li>
<li><a href="#addmembers">Aggiungi e rimuovi membri</a></li>
<li><a href="#mi-sono-cancellato-per-sbaglio">Mi sono cancellato per sbaglio.</a></li>
<li><a href="#non-desidero-più-ricevere-i-messaggi-di-un-gruppo">Non desidero più ricevere i messaggi di un gruppo.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#clonazione-di-un-gruppo">Clonazione di un gruppo</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
<li><a href="#webxdc">Apps in chat</a>
<ul>
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
<li><a href="#how-private-are-in-chat-apps">How private are in-chat apps?</a></li>
<li><a href="#create-xdc">How can I create my own in-chat apps?</a></li>
<li><a href="#dove-posso-trovare-le-apps-in-chat">Dove posso trovare le apps in chat?</a></li>
<li><a href="#quanto-sono-private-le-apps-di-chat">Quanto sono private le apps di chat?</a></li>
<li><a href="#create-xdc">Come posso creare le mie app di chat?</a></li>
</ul>
</li>
<li><a href="#instant-delivery">Consegna messaggi istantanei e Notifiche Push</a>
@@ -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 transport?</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>
@@ -489,10 +490,10 @@ Ciò attiverà comunque leliminazione automatica di tutti i dati di indirizzo
Per maggiori informazioni, consulta <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org cancellazione dellindirizzo</a>
o la pagina corrispondente del <a href="https://chatmail.at/relays">server chatmail di 3e parti</a> da te scelto.</p>
<h2 id="gruppi">
<h2 id="groups">
Gruppi <a href="#gruppi" class="anchor"></a>
Gruppi <a href="#groups" class="anchor"></a>
</h2>
@@ -535,23 +536,23 @@ ed <a href="#edit">eliminare i propri messaggi</a> dai dispositivi di tutti i me
Per questo motivo, tutti possono eliminare qualsiasi membro o aggiungerne di nuovi.</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>Per <strong>aggiungere o eliminare membri</strong>, tocca il nome del gruppo nella chat e seleziona il membro da aggiungere o rimuovere.</p>
</li>
<li>
<p>If the member is not yet in your contact list, but <strong>face to face</strong> with you,
from the same screen, show a <strong>QR code</strong>.<br />
Ask your chat partner to <strong>scan</strong> the QR image with their Delta Chat app by tapping
<img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> on the main screen.</p>
<p>Se il membro non è ancora nella tua lista contatti, ma è <strong>faccia a faccia</strong> con te,
dalla stessa schermata, mostra un <strong>codice QR</strong>.
Chiedi al tuo interlocutore di <strong>scansionare</strong> limmagine QR con la sua app Delta Chat toccando
<img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> nella schermata principale.</p>
</li>
<li>
<p>For a <strong>remote</strong> member addition,
click “Copy” orShare” and send the <strong>invite link</strong>
through another private chat to the new member.</p>
<p>Per aggiungere un membro <strong>da remoto</strong>,
clicca su “Copia” o “Condividi” e invia il <strong>link di invito</strong>
tramite unaltra chat privata al nuovo membro.</p>
</li>
</ul>
<p>QR code and invite link can be used to add several members.
However, since groups are <a href="#groups">meant for trusted people</a>, avoid sharing them publicly.</p>
<p>Il codice QR e il link di invito possono essere utilizzati per aggiungere più membri.
Tuttavia, poiché i gruppi sono <a href="#groups">destinati a persone fidate</a>, evita di condividerli pubblicamente.</p>
<h3 id="mi-sono-cancellato-per-sbaglio">
@@ -585,107 +586,107 @@ puoi ancora scrivere, ma non viene più notificato alcun nuovo messaggio.</p>
</li>
</ul>
<h3 id="cloning-a-group">
<h3 id="clonazione-di-un-gruppo">
Cloning a group <a href="#cloning-a-group" class="anchor"></a>
Clonazione di un gruppo <a href="#clonazione-di-un-gruppo" class="anchor"></a>
</h3>
<p>You can duplicate a group to start a separate discussion
or to exclude members without them noticing.</p>
<p>Puoi duplicare un gruppo per avviare una discussione separata
o per escludere membri senza che se ne accorgano.</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>Apri il profilo del gruppo e tocca <strong>Clona Chat</strong> (Android/iOS),
oppure fai clic con il pulsante destro del mouse sul gruppo nellelenco delle chat (Desktop).</p>
</li>
<li>
<p>Set a new name, choose an avatar, and adjust the member list if needed.</p>
<p>Imposta un nuovo nome, scegli un avatar e modifica lelenco dei membri, se necessario.</p>
</li>
</ul>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<p>Il nuovo gruppo è <strong>completamente indipendente</strong> dalloriginale,
che continua a funzionare come prima.</p>
<h2 id="webxdc">
In-chat apps <a href="#webxdc" class="anchor"></a>
Apps in chat <a href="#webxdc" class="anchor"></a>
</h2>
<p>You can send apps to a chat - games, editors, polls and other tools.
This makes Delta Chat a truly extensible messenger.</p>
<p>È possibile inviare apps a una chat: giochi, editor, sondaggi e altri strumenti.
Questo rende Delta Chat un servizio di messaggistica davvero espandibile.</p>
<h3 id="where-can-i-get-in-chat-apps">
<h3 id="dove-posso-trovare-le-apps-in-chat">
Where can I get in-chat apps? <a href="#where-can-i-get-in-chat-apps" class="anchor"></a>
Dove posso trovare le apps in chat? <a href="#dove-posso-trovare-le-apps-in-chat" class="anchor"></a>
</h3>
<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>In una chat, utilizzando <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Pulsante Allegato → 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>Puoi anche <a href="#create-xdc">creare la tua app</a> e allegarla usando <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Pulsante Allegato → File</strong></p>
</li>
</ul>
<h3 id="how-private-are-in-chat-apps">
<h3 id="quanto-sono-private-le-apps-di-chat">
How private are in-chat apps? <a href="#how-private-are-in-chat-apps" class="anchor"></a>
Quanto sono private le apps di chat? <a href="#quanto-sono-private-le-apps-di-chat" class="anchor"></a>
</h3>
<ul>
<li>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
<p>Le apps di chat non possono inviare dati a Internet né scaricare nulla.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
<p>Unapp in-chat può scambiare dati solo allinterno di una chat Delta Chat, con le sue
copie sui dispositivi dei tuoi interlocutori. A parte questo, è completamente
isolata da Internet.</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>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>
<p>This also means: Just like for web links, do not open apps from untrusted contacts.</p>
<p>questo significa anche: proprio come per i link web, non aprire app provenienti da contatti non attendibili.</p>
</li>
</ul>
<h3 id="create-xdc">
How can I create my own in-chat apps? <a href="#create-xdc" class="anchor"></a>
Come posso creare le mie app di chat? <a href="#create-xdc" class="anchor"></a>
</h3>
<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 transport.</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 transport? <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 Transport</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 genera chiavi OpenPGP sicure in conformità alle specifiche di Autocrypt 1.1.
Puoi esportare le tue chiavi private ma non puoi importare chiavi private aggiuntive.</p>
<p>In generale, non raccomandiamo o proponiamo agli utenti di gestire manualmente le chiavi.
Noi vogliamo assicurare che gli audits di sicurezza si possano focalizzare su pochi algoritmi crittografici comprovati
invece che sullintera estensione dei possibili algoritmi consentiti con OpenPGP.</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,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 778 B

+85 -40
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 transport?</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>
@@ -649,7 +650,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1055,7 +1066,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1067,7 +1078,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1076,7 +1087,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1435,12 +1480,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+82 -31
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 transport?</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>
@@ -622,7 +623,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -972,7 +986,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -984,7 +998,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -993,7 +1007,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1278,9 +1326,12 @@ but an implementation has not been agreed as a priority yet.</p>
<p>Nie.</p>
<p>Delta Chat generuje bezpieczne klucze OpenPGP zgodnie ze specyfikacją Autocrypt 1.1. Możesz wyeksportować swój prywatny klucz, ale nie możesz zaimportować dodatkowych kluczy prywatnych.</p>
<p>Generalnie nie zalecamy ani nie oferujemy użytkownikom wykonywania ręcznego zarządzania kluczami. Chcemy się upewnić, że audyty bezpieczeństwa mogą skupić się na kilku sprawdzonych algorytmach kryptograficznych, a nie na pełnym zakresie możliwych algorytmów dozwolonych w OpenPGP.</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>
<h3 id="security-audits">
+85 -40
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 transport?</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>
@@ -646,7 +647,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1053,7 +1064,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1065,7 +1076,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1074,7 +1085,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1433,12 +1478,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+273 -229
View File
@@ -2,13 +2,13 @@
<html lang="ru"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
<li><a href="#что-такое-delta-chat">Что такое Delta Chat?</a>
<ul>
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
<li><a href="#howtoe2ee">Как найти людей для общения?</a></li>
<li><a href="#почему-чат-помечен-как-запрос">Почему чат помечен как “Запрос”?</a></li>
<li><a href="#как-я-могу-связать-двух-своих-друзей-друг-с-другом">Как я могу связать двух своих друзей друг с другом?</a></li>
<li><a href="#поддерживает-ли-delta-chat-изображения-видео-и-другие-вложения">Поддерживает ли Delta Chat изображения, видео и другие вложения?</a></li>
<li><a href="#multiple-accounts">Что такое профили? Как я могу переключатся между ними?</a></li>
<li><a href="#кто-видит-изображение-моего-профиля">Кто видит изображение моего профиля?</a></li>
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
<li><a href="#signature">Могу ли я установить статус/подпись в Delta Chat?</a></li>
<li><a href="#что-означают-закрепить-отключить-уведомления-и-отправить-в-архив">Что означают: Закрепить, Отключить уведомления и Отправить в архив?</a></li>
<li><a href="#save">Как работают “Сохраненные сообщения”?</a></li>
<li><a href="#что-означает-зеленая-точка">Что означает зеленая точка?</a></li>
@@ -16,21 +16,21 @@
<li><a href="#edit">Исправление опечаток и удаление сообщений после отправки</a></li>
<li><a href="#ephemeralmsgs">Как работают исчезающие сообщения?</a></li>
<li><a href="#delold">Что произойдет, если я включу функцию “Удалять старые сообщения с устройства”?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
<li><a href="#remove-account">Как удалить свой профиль в чате?</a></li>
</ul>
</li>
<li><a href="#groups">Groups</a>
<li><a href="#groups">Группы</a>
<ul>
<li><a href="#создание-группы">Создание группы</a></li>
<li><a href="#addmembers">Add and remove members</a></li>
<li><a href="#addmembers">Добавление и удаление участников</a></li>
<li><a href="#я-случайно-удалил-самого-себя">Я случайно удалил самого себя.</a></li>
<li><a href="#я-больше-не-хочу-получать-сообщения-группы">Я больше не хочу получать сообщения группы.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#клонирование-группы">Клонирование группы</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
<li><a href="#webxdc">Встроенные приложения чата</a>
<ul>
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
<li><a href="#где-можно-найти-встроенные-приложения">Где можно найти встроенные приложения?</a></li>
<li><a href="#насколько-конфиденциальны-приложения-внутри-чата">Насколько конфиденциальны приложения внутри чата?</a></li>
<li><a href="#create-xdc">Как создать собственные приложения внутри чата?</a></li>
</ul>
@@ -55,10 +55,11 @@
<li><a href="#расширенные">Расширенные</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">Что такое релеи chatmail?</a></li>
<li><a href="#могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat">Могу ли я использовать обычный адрес электронной почты с Delta Chat?</a></li>
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as transport?</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>
@@ -107,84 +108,84 @@
<ul>
<li>
<p>Instant creation of <strong>private chat profiles</strong>
with secure and interoperable <a href="https://chatmail.at/relays">chatmail relays</a>
that offer instant message delivery, and Push Notifications for iOS and Android devices.</p>
<p>Мгновенное создание <strong>приватных профилей чата</strong>
с безопасными и совместимыми <a href="https://chatmail.at/relays">релеями chatmail</a>
которые обеспечивают мгновенную доставку сообщений, а также Push-уведомления для устройств iOS и Android.</p>
</li>
<li>
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and
<a href="#multiclient">multi-device</a> support on all platforms
and between different <a href="https://chatmail.at/clients">chatmail apps</a>.</p>
<p>Повсеместная поддержка <a href="#multiple-accounts">мультипрофиля</a> и
поддержка <a href="#multiclient">multi-device</a> на всех платформах
и между различными приложениями <a href="https://chatmail.at/clients">chatmail</a>.</p>
</li>
<li>
<p>Interactive <a href="#webxdc">in-chat apps</a> for gaming and collaboration</p>
<p>Интерактивные <a href="#webxdc">приложения чата</a> для игр и совместной работы</p>
</li>
<li>
<p><a href="#security-audits">Audited end-to-end encryption</a>
safe against network and server attacks.</p>
<p><a href="#security-audits">Проверенное сквозное шифрование</a>
защита от сетевых и серверных атак.</p>
</li>
<li>
<p>Free and Open Source software, both app and server side,
built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet Standards</a>.</p>
<p>Бесплатное программное обеспечение с открытым исходным кодом, как на стороне приложений, так и на стороне сервера,
построенное на <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Интернет-стандартах</a>.</p>
</li>
</ul>
<h3 id="howtoe2ee">
How can I find people to chat with? <a href="#howtoe2ee" class="anchor"></a>
Как найти людей для общения? <a href="#howtoe2ee" class="anchor"></a>
</h3>
<p>First, note that Delta Chat is a private messenger.
There is no public discovery, <em>you</em> decide about your contacts.</p>
<p>Во-первых, обратите внимание, что Delta Chat — это приватный мессенджер.
Публичного поиска контактов нет, вы сами решаете, с кем общаться.</p>
<ul>
<li>
<p>If you are <strong>face to face</strong> with your friend or family,
tap the <strong>QR Code</strong> icon <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
on the main screen.<br />
Ask your chat partner to <strong>scan</strong> the QR image
with their Delta Chat app.</p>
<p>Если вы находитесь <strong>рядом</strong> с другом или членом семьи,
нажмите значок <strong>QR-код</strong> <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
на главном экране.<br />
Попросите вашего собеседника <strong>отсканировать</strong> QR-код
с помощью приложения Delta Chat.</p>
</li>
<li>
<p>For a <strong>remote</strong> contact setup,
from the same screen,
click “Copy” or “Share” and send the <strong>invite link</strong>
through another private chat.</p>
<p>Для <strong>удалённой</strong> настройки контакта,
на том же экране,
нажмите “Копировать” или “Поделиться” и отправьте <strong>ссылку-приглашение</strong>
через другой приватный чат.</p>
</li>
</ul>
<p>Now wait while connection gets established.</p>
<p>Теперь подождите, пока устанавливается соединение.</p>
<ul>
<li>
<p>If both sides are online, they will soon see a chat
and can start messaging securely.</p>
<p>Если оба пользователя онлайн, вскоре они увидят чат
и смогут начать безопасное общение.</p>
</li>
<li>
<p>If one side is offline or in bad network,
the ability to chat is delayed until connectivity is restored.</p>
<p>Если один из пользователей не в сети или имеет плохое соединение,
возможность общаться появится после восстановления соединения.</p>
</li>
</ul>
<p>Congratulations!
You now will automatically use <a href="#e2ee">end-to-end encryption</a> with this contact.
If you add each other to <a href="#groups">groups</a>, end-to-end encryption will be established among all members.</p>
<p>Поздравляем!
Теперь вы будете автоматически использовать <a href="#e2ee">сквозное шифрование</a> с этим контактом.
Если вы добавите друг друга в <a href="#groups">группы</a>, сквозное шифрование будет установлено между всеми участниками.</p>
<h3 id="why-is-a-chat-marked-as-request">
<h3 id="почему-чат-помечен-как-запрос">
Why is a chat marked as “Request”? <a href="#why-is-a-chat-marked-as-request" class="anchor"></a>
Почему чат помечен как “Запрос”? <a href="#почему-чат-помечен-как-запрос" class="anchor"></a>
</h3>
<p>As being a private messenger,
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
<p>Поскольку это приватный мессенджер,
писать вам могут только друзья и члены семьи, с которыми вы <a href="#howtoe2ee">поделились QR-кодом или ссылкой-приглашением.</a></p>
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
<p>Ваши друзья могут поделиться вашим контактом с другими друзьями, это отображается как <strong>запрос</strong>.</p>
<p>— Нужно <strong>принять</strong> запрос, прежде чем ответить.</p>
@@ -196,19 +197,19 @@ only friends and family you <a href="#howtoe2ee">share your QR code or invite li
получать сообщения от этого человека, подумайте о его <strong>блокировке</strong>.</li>
</ul>
<h3 id="how-can-i-put-two-of-my-friends-in-contact-with-each-other">
<h3 id="как-я-могу-связать-двух-своих-друзей-друг-с-другом">
How can I put two of my friends in contact with each other? <a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other" class="anchor"></a>
Как я могу связать двух своих друзей друг с другом? <a href="#как-я-могу-связать-двух-своих-друзей-друг-с-другом" class="anchor"></a>
</h3>
<p>Attach the first contact to the chat of the second using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → Contact</strong>.
You can also add a little introduction message.</p>
<p>Прикрепите первый контакт к чату второго используя кнопку <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Вложение → Контакт</strong>.
Вы также можете добавить небольшое вступительное сообщение.</p>
<p>The second contact will receive a <strong>card</strong> then
and can tap it to start chatting with the first contact.</p>
<p>Второй контакт получит <strong>карточку</strong>
на которую можно нажать, чтобы начать общение с первым контактом.</p>
<h3 id="поддерживает-ли-delta-chat-изображения-видео-и-другие-вложения">
@@ -220,8 +221,8 @@ and can tap it to start chatting with the first contact.</p>
<ul>
<li>
<p>Да. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
<p>Да. Изображения, видео, файлы, голосовые сообщения и т.д. можно отправлять с помощью кнопок <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Вложение</strong>
или <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Голосовое сообщение</strong>.</p>
</li>
<li>
<p>Для лучшей производительности изображения по умолчанию оптимизируются и отправляются в меньшем размере, но вы можете отправить их как “файл”, чтобы сохранить оригинал.</p>
@@ -236,16 +237,16 @@ or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png"
</h3>
<p>A profile is <strong>a name, a picture</strong> and some additional information for encrypting messages.
A profile lives on your device(s) only
and uses the server only to relay messages.</p>
<p>Профиль - это <strong>имя, фотография</strong> и некоторая дополнительная информация для шифрования сообщений.
Профиль живет только на вашем устройстве (устройствах)
и использует сервер только для передачи сообщений.</p>
<p>При первой установке Delta Chat создаётся первый профиль.</p>
<p>Позже, вы можете нажать на изображение вашего профиля в верхнем левом углу, чтобы <strong>Добавить профили</strong>
или <strong>Сменить профили</strong>.</p>
<p>You may want to use separate profiles for political, family or work related activities.</p>
<p>Возможно, вы захотите использовать разные профили для политической деятельности, общения с семьёй или работы.</p>
<p>Вы также можете изучить <a href="#multiclient">как использовать один и тот же профиль на нескольких устройствах</a>.</p>
@@ -271,15 +272,15 @@ and uses the server only to relay messages.</p>
<h3 id="signature">
Can I set a Bio/Status with Delta Chat? <a href="#signature" class="anchor"></a>
Могу ли я установить статус/подпись в Delta Chat? <a href="#signature" class="anchor"></a>
</h3>
<p>Yes,
you can do so under <strong>Settings → Profile → Bio</strong>.
Once you sent a message to a contact,
they will see it when they view your contact details.</p>
<p>Да,
вы можете сделать это в разделе <strong>Настройки → Профиль → О себе</strong>.
После отправки сообщения контакту,
они увидят его при просмотре ваших контактных данных.</p>
<h3 id="что-означают-закрепить-отключить-уведомления-и-отправить-в-архив">
@@ -353,13 +354,12 @@ they will see it when they view your contact details.</p>
</h3>
<p>You can sometimes see a <strong>green dot</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
next to the avatar of a contact.
It means they were <strong>recently seen by you</strong> in the last 10 minutes,
e.g. because they messaged you or sent a read receipt.</p>
<p>Иногда рядом с аватаром контакта можно увидеть <strong>зелёную точку</strong>. <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
Это означает, что вы <strong>недавно видели</strong> этого человека в течение последних 10 минут,
например, потому что он вам написал или отправил подтверждение прочтения.</p>
<p>So this is not a real time online status
and others will as well not always see that you are “online”.</p>
<p>Таким образом, это не индикатор онлайн-статуса в реальном времени
и другие пользователи не всегда будут видеть, что вы “онлайн”.</p>
<h3 id="что-означают-галочки-рядом-с-исходящими-сообщениями">
@@ -371,21 +371,21 @@ and others will as well not always see that you are “online”.</p>
<ul>
<li>
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
means that the message was sent successfully to your provider.</p>
<p><strong>Одна галочка</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
означает, что сообщение было успешно отправлено вашему провайдеру.</p>
</li>
<li>
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
mean that at least one recipients device
reported back to having received the message.</p>
<p><strong>Две галочки</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
означают, что по крайней мере одно устройство получателя
сообщило об успешном получении сообщения.</p>
</li>
<li>
<p>Recipients may have disabled read-receipts,
so even if you see only one tick, the message may have been read.</p>
<p>Получатели могли отключить подтверждения прочтения,
поэтому даже если вы видите только одну галочку, сообщение могло быть прочитано.</p>
</li>
<li>
<p>The other way round, two ticks do not automatically mean
that a human has read or understood the message ;)</p>
<p>И наоборот, две галочки не обязательно означают
что человек прочитал или понял сообщение ;)</p>
</li>
</ul>
@@ -430,24 +430,24 @@ that a human has read or understood the message ;)</p>
выбрав временной интервал
от 5 минут до 1 года.</p>
<p>Until the setting is turned off again,
each chat members Delta Chat app takes care
of deleting the messages
after the selected time span.
The time span begins
when the receiver first sees the message in Delta Chat.
The messages are deleted both,
on the servers,
and in the apps itself.</p>
<p>Пока эта настройка не будет отключена,
приложение Delta Chat каждого участника чата позаботится
об удалении сообщений
по истечении выбранного периода времени.
Отсчёт времени начинается
с момента первого просмотра сообщения получателем в Delta Chat.
Сообщения будут удалены
как на серверах,
так и в самих приложениях.</p>
<p>Обратите внимание, что на исчезающие сообщения можно полагаться
только до тех пор, пока вы доверяете своим собеседникам;
злонамеренные собеседники могут делать фотографии,
или иным образом сохранить, скопировать или переслать сообщения перед удалением.</p>
<p>Apart from that,
if one chat partner uninstalls Delta Chat,
the (anyway encrypted) messages may take longer to get deleted from their server.</p>
<p>Кроме того,
если один из собеседников удалит Delta Chat,
(зашифрованные) сообщения могут дольше оставаться на сервере перед удалением.</p>
<h3 id="delold">
@@ -468,39 +468,39 @@ the (anyway encrypted) messages may take longer to get deleted from their server
<h3 id="remove-account">
How can I delete my chat profile? <a href="#remove-account" class="anchor"></a>
Как удалить свой профиль в чате? <a href="#remove-account" class="anchor"></a>
</h3>
<p>If you are using more than one chat profile,
you can remove single ones in the top profile switcher menu (on Android and iOS),
or in the sidebar with a right click (in the Desktop app).
Chat profiles are only removed on the device where deletion was triggered.
Chat profiles on other devices will continue to fully function.</p>
<p>Если вы используете несколько профилей чата,
вы можете удалить отдельные из них в верхнем переключателе профилей (на Android и iOS),
или в боковой панели щелчком правой кнопкой мыши (в настольном приложении).
Профили чата удаляются только с устройства, на котором была запущена операция удаления.
Профили чата на других устройствах будут продолжать полностью функционировать.</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>Если вы используете один профиль чата по умолчанию, вы можете просто удалить приложение.
Это автоматически инициирует удаление всех связанных данных об адресе на сервере chatmail.
Подробную информацию смотрите на странице <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org address-deletion</a>
или на соответствующей странице выбранного вами <a href="https://chatmail.at/relays">стороннего сервера chatmail</a>.</p>
<h2 id="groups">
Groups <a href="#groups" class="anchor"></a>
Группы <a href="#groups" class="anchor"></a>
</h2>
<p>Groups let several people chat together privately with <strong>equal rights</strong>.</p>
<p>Группы позволяют нескольким пользователям общаться друг с другом конфиденциально <strong>на равных правах</strong>.</p>
<p>Anyone can
change the group name or avatar,
<a href="#addmembers">add or remove members</a>,
set <a href="#ephemeralmsgs">disappearing messages</a>,
and <a href="#edit">delete their own messages</a> from all members devices.</p>
<p>Любой может
изменить название группы или аватар,
<a href="#addmembers">добавить или удалить участников</a>,
включить <a href="#ephemeralmsgs">исчезающие сообщения</a>,
и <a href="#edit">удалять собственные сообщения</a> со всех устройств участников.</p>
<p>Because all members have the same rights, groups work best among <strong>trusted friends and family</strong>.</p>
<p>Поскольку все участники имеют одинаковые права, группы лучше всего подходят для общения с <strong>проверенными друзьями и семьёй</strong>.</p>
<h3 id="создание-группы">
@@ -519,34 +519,34 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
<h3 id="addmembers">
Add and remove members <a href="#addmembers" class="anchor"></a>
Добавление и удаление участников <a href="#addmembers" class="anchor"></a>
</h3>
<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>У всех участников группы <strong>одинаковые права</strong>.
Поэтому каждый может удалить любого участника или добавить новых.</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>Чтобы <strong>добавлять или удалять участников</strong>, коснитесь названия группы в чате и выберите участника, которого нужно добавить или удалить.</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>Если участника еще нет в вашем списке контактов, но он находится с <strong>вами лично</strong>,
на том же экране покажите <strong>QR-код</strong>.<br />
Попросите его <strong>отсканировать</strong> QR-код приложением Delta Chat, нажав
<img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> на главном экране.</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>Для <strong>удалённого</strong> добавления участника,
нажмите “Копировать” или “Поделиться” и отправьте <strong>ссылку-приглашение</strong>
через другой приватный чат новому участнику.</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>QR-код и ссылку-приглашение можно использовать для добавления нескольких участников.
Однако, поскольку группы <a href="#groups">предназначены для проверенных людей</a>, не распространяйте их публично.</p>
<h3 id="я-случайно-удалил-самого-себя">
@@ -579,55 +579,55 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</li>
</ul>
<h3 id="cloning-a-group">
<h3 id="клонирование-группы">
Cloning a group <a href="#cloning-a-group" class="anchor"></a>
Клонирование группы <a href="#клонирование-группы" class="anchor"></a>
</h3>
<p>You can duplicate a group to start a separate discussion
or to exclude members without them noticing.</p>
<p>Вы можете дублировать группу, чтобы начать отдельное обсуждение
или исключить участников, незаметно для них.</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>Откройте профиль группы и нажмите <strong>Клонировать чат</strong> (Android/iOS),
или щелкните правой кнопкой мыши по группе в списке чатов (приложение для ПК).</p>
</li>
<li>
<p>Set a new name, choose an avatar, and adjust the member list if needed.</p>
<p>Установите новое имя, выберите аватар и при необходимости отредактируйте список участников.</p>
</li>
</ul>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<p>Новая группа <strong>полностью независима</strong> от исходной,
которая продолжает работать как прежде.</p>
<h2 id="webxdc">
In-chat apps <a href="#webxdc" class="anchor"></a>
Встроенные приложения чата <a href="#webxdc" class="anchor"></a>
</h2>
<p>You can send apps to a chat - games, editors, polls and other tools.
This makes Delta Chat a truly extensible messenger.</p>
<p>Вы можете отправлять приложения в чат - игры, редакторы, опросы и другие инструменты.
Это делает Delta Chat по-настоящему расширяемым мессенджером.</p>
<h3 id="where-can-i-get-in-chat-apps">
<h3 id="где-можно-найти-встроенные-приложения">
Where can I get in-chat apps? <a href="#where-can-i-get-in-chat-apps" class="anchor"></a>
Где можно найти встроенные приложения? <a href="#где-можно-найти-встроенные-приложения" class="anchor"></a>
</h3>
<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>В чате используйте кнопку <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Вложение → Приложения</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>Вы также можете <a href="#create-xdc">создать собственное приложение</a> и прикрепить его с помощью кнопки <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Вложение → Файл</strong>.</p>
</li>
</ul>
@@ -641,19 +641,19 @@ 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>Встроенные приложения не могут отправлять данные в Интернет или что-либо загружать.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
copies on the devices of your chat partners. Other than that, its completely
isolated from the Internet.</p>
<p>Встроенное приложение может обмениваться данными только в рамках этого чата с его
копиями на устройствах ваших собеседников. В остальном оно полностью
изолировано от Интернета.</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>Конфиденциальность встроенного приложения соответствует конфиденциальности вашего чата
— пока вы доверяете людям, с которыми общаетесь, можете доверять и встроенному приложению.</p>
</li>
<li>
<p>This also means: Just like for web links, do not open apps from untrusted contacts.</p>
<p>Это также означает: как и в случае с веб-ссылками, не открывайте приложения от ненадежных контактов.</p>
</li>
</ul>
@@ -667,19 +667,19 @@ 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>Встроенные приложения - это ZIP-файлы с расширением .xdc, содержащие HTML-, CSS- и 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>Вы можете расширить пример приложения <a href="https://github.com/webxdc/hello">Hello World</a>
чтобы начать работу.</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>Всю остальную информацию вы найдёте в
<a href="https://webxdc.org/docs">документации 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>Если у вас есть вопросы, вы можете обратиться к другим пользователям с опытом
на форуме <a href="https://support.delta.chat/c/webxdc/20">Delta Chat</a>.</p>
</li>
</ul>
@@ -774,9 +774,9 @@ Push-уведомления автоматически активируются
</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>Поддержка push-уведомлений в Delta Chat предотвращает утечку личной информации.
Она не передаёт данные профиля, IP-адрес или содержимое сообщений (даже зашифрованных)
ни одной системе, участвующей в доставке уведомлений.</p>
<p>Вот как приложения Delta Chat выполняют доставку Push-уведомлений:</p>
@@ -786,21 +786,21 @@ to any system involved in the delivery of Push Notifications.</p>
на сервере <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>Когда сервер <a href="https://delta.chat/chatmail">chatmail</a> получает сообщение для пользователя Delta Chat,
он пересылает зашифрованный токен устройства центральному прокси-серверу уведомлений 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>Центральный прокси-сервер уведомлений Delta Chat расшифровывает токен устройства
и пересылает его соответствующему сервису push-уведомлений (Apple, Google и т.д.),
не зная IP-адреса или данных профиля пользователей 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>Центральный сервис push-уведомлений (Apple, Google и т.д.)
пробуждает приложение Delta Chat на вашем устройстве
для проверки новых сообщений в фоновом режиме.
Он не знает о данных профиля устройства, которое он пробуждает.
Центральные сервисы Apple/Google Push никогда не видят никаких данных профиля (отправителя или получателя),
а также не видят содержимого сообщений (в том числе в зашифрованном виде).</p>
</li>
</ul>
@@ -942,22 +942,21 @@ and also never see any message content (also not in encrypted forms).</p>
<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">
@@ -994,41 +993,52 @@ PIN-код разблокировки экрана, графический кл
</h3>
<p>At <strong>Settings → Advanced → Experimental Features</strong>
you can try out features we are working on.</p>
<p>В разделе <strong>Настройки → Дополнительно → Экспериментальные функции</strong>
вы можете опробовать функции, над которыми мы работаем.</p>
<p>The features may be <strong>unstable</strong> and may be <strong>changed or removed</strong>.</p>
<p>Эти функции могут быть <strong>нестабильными</strong> и могут быть <strong>изменены или удалены</strong>.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</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>
Что такое релеи chatmail? <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>Релеи используются для временного хранения сообщений, если ваше устройство не в сети.
Релеи - это недорогие и простые серверы,
которые не хранят данные о статусах групп, вашем имени или аватаре, -
всё это существует только на вашем устройстве.
Релеи управляются разными группами и людьми.</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>По умолчанию, после установки, релей <strong>настраивается автоматически</strong>,
поэтому вам не нужно об этом волноваться.
Однако, если хотите,
вы можете настроить релеи в <strong>Настройки → Дополнительно → Релеи</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>Вы можете <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>We will <em>not</em> collect any personally identifiable information about you.</p>
<p>Для получения более подробной информации и ознакомления с будущими возможностями релеев,
вы можете следить за обсуждениями на <a href="https://support.delta.chat">Форуме</a>.</p>
<h3 id="могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat">
@@ -1038,45 +1048,45 @@ weekly statistics will be automatically sent to a bot.</p>
</h3>
<p>Yes, but only if the email address is used exclusively by <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
<p>Да, но только если адрес электронной почты используется исключительно <a href="https://chatmail.at/clients">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>Не поддерживается совместное использование адреса электронной почты с приложениями, не являющимися клиентами chatmail или веб-интерфейсами для работы с почтой,
по следующим причинам:</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>Приложения, не являющиеся клиентами chatmail, в основном не обеспечивают автоматическое сквозное шифрование электронной почты для своих пользователей,
тогда как приложения и релеи chatmail повсеместно применяют сквозное шифрование и стандарты безопасности.</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 transport.</p>
<p>Приложения, не являющиеся клиентами chatmail, используют серверы электронной почты в качестве долгосрочного архива сообщений,
тогда как клиенты chatmail используют их как релей для мгновенной пересылки сообщений.</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>Поддержка всего разнообразия классических настроек электронной почты
потребует значительных усилий по разработке и сопровождению,
а также усложнит повышение устойчивости, надёжности и скорости обмена сообщениями на основе chatmail.</p>
</li>
</ul>
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
Как настроить профиль чата с использованием классического адреса электронной почты в качестве релея? <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>Прежде всего, <strong>не используйте те же классические адреса электронной почты, которые используются в обычных приложениях для отправки писем</strong>
если вы не готовы к зашифрованным сообщениям во входящих,
двойным уведомлениям, случайному удалению писем или подобным неудобствам.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</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>Вы можете настроить адрес электронной почты для чата в разделе <strong>Новый профиль → Использовать другой сервер → Использовать электронную почту как релей</strong>.
Обратите внимание, что провайдеры классической почты обычно не поддерживают <a href="#instant-delivery">Push-уведомления</a>
и имеют другие ограничения, см. раздел <a href="https://providers.delta.chat">Обзор провайдеров</a>.
Chatmail использует INBOX по умолчанию для ретрансляции; убедитесь, что настройки провайдера этому соответствуют.
Профиль чата, использующий классический адрес электронной почты, позволяет отправлять и получать незашифрованные сообщения.
Эти сообщения и чаты, в которых они появляются, помечаются значком электронной почты
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
<h3 id="я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете">
@@ -1089,11 +1099,45 @@ These messages, and the chats they appear in, are marked with an email icon
<p>Подойдет любая корректная настройка почтового сервера, за исключением случаев, когда для корректной работы устройств ваших пользователей требуются <a href="#instant-delivery">Push-уведомления</a> Google/Apple.</p>
<p>Мы обычно рекомендуем <a href="https://chatmail.at/doc/relay/getting_started.html">настроить chatmail relay</a>.
<p>Мы обычно рекомендуем <a href="https://chatmail.at/doc/relay/getting_started.html">настроить chatmail релей</a>.
<a href="https://chatmail.at">Chatmail</a> — это проект, поддерживаемый сообществом который охватывает как настройку релеев, так
и <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="меня-интересуют-технические-детали-можете-рассказать-больше">
@@ -1163,7 +1207,7 @@ These messages, and the chats they appear in, are marked with an email icon
</h3>
<p>Если вы используете стандартные <a href="https://chatmail.at/relays">ретрансляторы chatmail</a>,
<p>Если вы используете стандартные <a href="https://chatmail.at/relays">релеи chatmail</a>,
невозможно получать или отправлять сообщения без сквозного шифрования.</p>
<p>Если вы вместо этого используете <a href="#classic-email">классический почтовый сервер</a>,
@@ -1429,12 +1473,12 @@ Delta Chat показывает там два отпечатка.
<p>Нет.</p>
<p>Delta Chat генерирует безопасные ключи OpenPGP в соответствии со спецификацией Autocrypt 1.1.
Вы можете экспортировать свой закрытый ключ, но не можете импортировать дополнительные закрытые ключи.</p>
<p>В целом, мы не рекомендуем и не предлагаем пользователям выполнять ручное управление ключами.
Мы стремимся к тому, чтобы аудиты безопасности могли сосредоточиться на нескольких проверенных криптографических алгоритмах,
а не на всем разнообразии возможных алгоритмов, доступных с OpenPGP.</p>
<p>Delta Chat генерирует безопасные ключи OpenPGP в соответствии со спецификацией Autocrypt 1.1.
Мы не рекомендуем и не предлагаем пользователям управлять ключами вручную.
Мы хотим, чтобы аудиты безопасности могли сосредоточиться на нескольких проверенных криптографических алгоритмах
а не на всем многообразии возможных алгоритмов, разрешенных в OpenPGP.
Если вы хотите извлечь свой ключ OpenPGP, существует только экспертный метод:
вам нужно найти его в SQLite-таблице “keypairs” в tar-файле резервной копии профиля.</p>
<h3 id="security-audits">
+85 -40
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 transport?</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>
@@ -650,7 +651,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1057,7 +1068,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1069,7 +1080,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1078,7 +1089,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1437,12 +1482,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+85 -40
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 transport?</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>
@@ -652,7 +653,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1061,7 +1072,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1073,7 +1084,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1082,7 +1093,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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">
@@ -1441,12 +1486,12 @@ the connection is safe.</p>
<p>No.</p>
<p>Delta Chat generates secure OpenPGP keys according to the Autocrypt specification 1.1.
You can export your private key but you can not import additional private keys.</p>
<p>In general, 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.</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>
<h3 id="security-audits">
+128 -99
View File
@@ -8,7 +8,7 @@
<li><a href="#чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">Чи підтримує Delta Chat вкладення у вигляді фото, відео тощо?</a></li>
<li><a href="#multiple-accounts">Що таке профілі? Як я можу перемикатися між ними?</a></li>
<li><a href="#хто-бачить-моє-зображення-профілю">Хто бачить моє зображення профілю?</a></li>
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
<li><a href="#signature">Чи можу я встановити біографію/статус у Delta Chat?</a></li>
<li><a href="#що-значить-закріплення-приглушення-архівування">Що значить Закріплення, Приглушення, Архівування?</a></li>
<li><a href="#save">Як працюють “Збережені повідомлення”?</a></li>
<li><a href="#що-означає-зелена-точка">Що означає зелена точка?</a></li>
@@ -16,16 +16,15 @@
<li><a href="#edit">Виправлення помилок та видалення повідомлень після надсилання</a></li>
<li><a href="#ephemeralmsgs">Як працюють повідомлення, що зникають?</a></li>
<li><a href="#delold">Що станеться, якщо я ввімкну «Видаляти старі повідомлення з пристрою»?</a></li>
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
</ul>
</li>
<li><a href="#groups">Groups</a>
<li><a href="#groups">Групи</a>
<ul>
<li><a href="#створення-групи">Створення групи</a></li>
<li><a href="#addmembers">Add and remove members</a></li>
<li><a href="#addmembers">Додавання та видалення учасників</a></li>
<li><a href="#я-випадково-себе-видалив">Я випадково себе видалив</a></li>
<li><a href="#я-більше-не-хочу-отримувати-повідомлення-групи">Я більше не хочу отримувати повідомлення групи.</a></li>
<li><a href="#cloning-a-group">Cloning a group</a></li>
<li><a href="#клонування-групи">Клонування групи</a></li>
</ul>
</li>
<li><a href="#webxdc">In-chat apps</a>
@@ -54,19 +53,20 @@
</li>
<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="#експериментальні-функції">Експериментальні функції</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 transport?</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>
<li><a href="#e2ee">Шифрування та безпека</a>
<ul>
<li><a href="#які-стандарти-використовуються-для-наскрізного-шифрування">Які стандарти використовуються для наскрізного шифрування?</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">Як дізнатися, чи повідомлення зашифровано наскрізним шифруванням?</a></li>
<li><a href="#чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування">Чи можу я отримувати та надсилати пошту без наскрізного шифрування?</a></li>
<li><a href="#e2eeguarantee">Що означає зелена галочка в профілі контакту?</a></li>
<li><a href="#чи-зашифровані-наскрізно-вкладення-зображення-файли-аудіо-тощо">Чи зашифровані наскрізно вкладення (зображення, файли, аудіо тощо)?</a></li>
<li><a href="#openpgp-secure">Чи безпечний OpenPGP?</a></li>
@@ -112,20 +112,17 @@
які пропонують миттєву доставку повідомлень та push-сповіщення для пристроїв iOS та Android.</p>
</li>
<li>
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and
<a href="#multiclient">multi-device</a> support on all platforms
and between different <a href="https://chatmail.at/clients">chatmail apps</a>.</p>
<p>Повсюдна підтримка багатьох <a href="#multiple-accounts">профілів</a> та <a href="#multiclient">пристроїв</a> на всіх платформах та між різними <a href="https://chatmail.at/clients">поштовими програмами</a>.</p>
</li>
<li>
<p>Interactive <a href="#webxdc">in-chat apps</a> for gaming and collaboration</p>
<p>Інтерактивні <a href="https://webxdc.org/">веб-застосунки у чатах</a> для ігор та співпраці</p>
</li>
<li>
<p><a href="#security-audits">Audited end-to-end encryption</a>
safe against network and server attacks.</p>
<p><a href="#security-audits">Аудитоване наскрізне шифрування</a>
захищене від мережевих та серверних атак.</p>
</li>
<li>
<p>Free and Open Source software, both app and server side,
built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet Standards</a>.</p>
<p>Вільне програмне забезпечення з відкритим вихідним кодом, як застосунок, так серверна частина, побудоване на основі <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Інтернет-стандартів</a>.</p>
</li>
</ul>
@@ -137,8 +134,7 @@ built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standa
</h3>
<p>First, note that Delta Chat is a private messenger.
There is no public discovery, <em>you</em> decide about your contacts.</p>
<p>По-перше, зверніть увагу, що Delta Chat - це приватний месенджер. Тут немає публічного розкриття, <em>ви</em> самі вирішуєте, з ким спілкуватися.</p>
<ul>
<li>
@@ -156,7 +152,7 @@ through another private chat.</p>
</li>
</ul>
<p>Now wait while connection gets established.</p>
<p>Зараз зачекайте, поки встановлюється з’єднання.</p>
<ul>
<li>
@@ -169,9 +165,9 @@ the ability to chat is delayed until connectivity is restored.</p>
</li>
</ul>
<p>Congratulations!
You now will automatically use <a href="#e2ee">end-to-end encryption</a> with this contact.
If you add each other to <a href="#groups">groups</a>, end-to-end encryption will be established among all members.</p>
<p>Вітаємо!
Тепер Ви автоматично використовуватимете <a href="#e2ee">наскрізне шифрування</a> з цим контактом.
Якщо ви додасте один одного у <a href="#groups">групи</a>, наскрізне шифрування буде встановлено між усіма учасниками.</p>
<h3 id="why-is-a-chat-marked-as-request">
@@ -246,7 +242,7 @@ and uses the server only to relay messages.</p>
<p>Пізніше ви можете натиснути на зображення вашого профілю у верхньому лівому кутку, щоб вибрати <strong>Додати профілі</strong> або <strong>Переключити профілі</strong>.</p>
<p>You may want to use separate profiles for political, family or work related activities.</p>
<p>Ви можете використовувати окремі профілі для політичної, сімейної або робочої діяльності.</p>
<p>Ви також можете дізнатися <a href="#multiclient">як використовувати один і той самий профіль на декількох пристроях</a>.</p>
@@ -270,7 +266,7 @@ and uses the server only to relay messages.</p>
<h3 id="signature">
Can I set a Bio/Status with Delta Chat? <a href="#signature" class="anchor"></a>
Чи можу я встановити біографію/статус у Delta Chat? <a href="#signature" class="anchor"></a>
</h3>
@@ -447,14 +443,8 @@ the (anyway encrypted) messages may take longer to get deleted from their server
<li>Щоб увімкнути його, перейдіть до «видалити старі повідомлення з пристрою» в налаштуваннях «Чатів та медіа» . Ви можете встановити часові рамки від «через годину» до «через рік»;
Таким чином, <em>усі</em> повідомлення будуть видалені з вашого пристрою, як тільки вони будуть старішими за це.</li>
</ul>
<h3 id="remove-account">
How can I delete my chat profile? <a href="#remove-account" class="anchor"></a>
</h3>
<p>Як я можу видалити свій профіль у Delta Chat? {#remove-account}</p>
<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),
@@ -470,12 +460,12 @@ or the respective page from your chosen <a href="https://chatmail.at/relays">3rd
<h2 id="groups">
Groups <a href="#groups" class="anchor"></a>
Групи <a href="#groups" class="anchor"></a>
</h2>
<p>Groups let several people chat together privately with <strong>equal rights</strong>.</p>
<p>Групи дозволяють кільком людям спілкуватися у приватному чаті з <strong>рівними правами</strong>.</p>
<p>Anyone can
change the group name or avatar,
@@ -483,7 +473,7 @@ change the group name or avatar,
set <a href="#ephemeralmsgs">disappearing messages</a>,
and <a href="#edit">delete their own messages</a> from all members devices.</p>
<p>Because all members have the same rights, groups work best among <strong>trusted friends and family</strong>.</p>
<p>Оскільки усі учасники мають однакові права, групи найкраще працюють серед <strong>довірених друзів та родичів</strong>.</p>
<h3 id="створення-групи">
@@ -502,15 +492,15 @@ and <a href="#edit">delete their own messages</a> from all members devices.</
<h3 id="addmembers">
Add and remove members <a href="#addmembers" class="anchor"></a>
Додавання та видалення учасників <a href="#addmembers" class="anchor"></a>
</h3>
<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>Усі учасники групи мають <strong>однакові права</strong>.
Тому кожен може видалити будь-якого учасника або додати нових.</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>
@@ -560,10 +550,10 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
</li>
</ul>
<h3 id="cloning-a-group">
<h3 id="клонування-групи">
Cloning a group <a href="#cloning-a-group" class="anchor"></a>
Клонування групи <a href="#клонування-групи" class="anchor"></a>
</h3>
@@ -581,8 +571,8 @@ or right-click the group in the chat list (Desktop).</p>
</li>
</ul>
<p>The new group is <strong>fully independent</strong> from the original,
which continues to work as before.</p>
<p>Нова група є <strong>цілком незалежною</strong> від оригінальної,
котра продовжує працювати як раніше.</p>
<h2 id="webxdc">
@@ -625,7 +615,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</li>
@@ -655,8 +645,8 @@ trust the people you chat with, you can trust the in-chat app as well.</p>
to get started.</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>Все інше, що Вам потрібно знати, написано у
<a href="https://webxdc.org/docs">документації Webxdc</a>.</p>
</li>
<li>
<p>If you have question, you can ask others with experience
@@ -883,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">
@@ -911,10 +904,10 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
</h2>
<h3 id="experimental-features">
<h3 id="експериментальні-функції">
Experimental Features <a href="#experimental-features" class="anchor"></a>
Експериментальні функції <a href="#експериментальні-функції" class="anchor"></a>
</h3>
@@ -922,38 +915,49 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
<p>At <strong>Settings → Advanced → Experimental Features</strong>
you can try out features we are working on.</p>
<p>The features may be <strong>unstable</strong> and may be <strong>changed or removed</strong>.</p>
<p>Ці функції можуть бути <strong>нестабільними</strong> та можуть бути <strong>змінені або видалені</strong>.</p>
<p>You can find more information
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</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>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">
@@ -975,7 +979,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -987,7 +991,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -996,7 +1000,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -1020,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="мене-цікавлять-технічні-деталі-можете-розповісти-більше">
@@ -1067,17 +1105,17 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
<h3 id="whene2e">
How can I know if messages are end-to-end encrypted? <a href="#whene2e" class="anchor"></a>
Як дізнатися, чи повідомлення зашифровано наскрізним шифруванням? <a href="#whene2e" class="anchor"></a>
</h3>
<p>Всі повідомлення в Delta Chat за замовчуванням <strong>наскрізно зашифровані</strong>. Починаючи з версії 2 Delta Chat (липень 2025 року) на наскрізних зашифрованих повідомленнях більше немає замків або інших подібних маркерів.</p>
<h3 id="can-i-still-receive-or-send-messages-without-end-to-end-encryption">
<h3 id="чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування">
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>
Чи можу я отримувати та надсилати пошту без наскрізного шифрування? <a href="#чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування" class="anchor"></a>
</h3>
@@ -1165,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">
@@ -1194,11 +1220,11 @@ even if the message was not end-to-end encrypted.</p>
<p>Servers can therefore only see:</p>
<ul>
<li>the sender and receiver addresses</li>
<li>and the message size.</li>
<li>адреси відправника та одержувача</li>
<li>та розмір повідомлення.</li>
</ul>
<p>By default, the addresses are randomly generated.</p>
<p>За замовчуванням адреси генеруються випадковим чином.</p>
<p>Усі інші метадані повідомлень, контактів і груп містяться в наскрізно зашифрованій частині повідомлень.</p>
@@ -1284,9 +1310,12 @@ but an implementation has not been agreed as a priority yet.</p>
<p>Ні.</p>
<p>Delta Chat генерує безпечні ключі OpenPGP відповідно до специфікації Autocrypt 1.1. Ви можете експортувати свій приватний ключ, але не можете імпортувати додаткові приватні ключі.</p>
<p>Загалом, ми не рекомендуємо і не пропонуємо користувачам керувати ключами вручну. Ми хочемо гарантувати, що аудит безпеки може зосередитися на декількох перевірених криптографічних алгоритмах а не на всій широті можливих алгоритмів, дозволених у OpenPGP.</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>
<h3 id="security-audits">
@@ -1345,7 +1374,7 @@ but an implementation has not been agreed as a priority yet.</p>
<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>See <a href="https://delta.chat/en/gdpr#24-app-permissions">Privacy Policy</a> for a detailed overview.</p>
<p>Дивіться <a href="https://delta.chat/en/gdpr#24-app-permissions">політику конфіденційності</a> для детального огляду.</p>
<h3 id="де-мої-друзі-можуть-знайти-delta-chat">
+83 -40
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 transport?</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>
@@ -637,7 +638,7 @@ This makes Delta Chat a truly extensible messenger.</p>
<p>In-chat apps can not send data to the Internet, or download anything.</p>
</li>
<li>
<p>An in-chat app can only exchange data within a Delta Chat chat, with its
<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>
</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">
@@ -1033,7 +1042,7 @@ while chatmail apps and relays pervasively enforce end-to-end encryption and sec
</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 transport.</p>
while chatmail clients use email servers for ephemeral instant message relay.</p>
</li>
<li>
<p>Supporting the full variety of classic email setups
@@ -1045,7 +1054,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
<h3 id="classic-email">
How can I configure a chat profile with a classic email address as transport? <a href="#classic-email" class="anchor"></a>
How can I configure a chat profile with a classic email address as relay? <a href="#classic-email" class="anchor"></a>
</h3>
@@ -1054,7 +1063,7 @@ and complicate making chatmail-based messaging more resilient, reliable and fast
unless you are prepared to deal with encrypted messages in the inbox,
double notifications, accidentally deleted emails or similar annoyances.</p>
<p>You can configure a email address for chatting at <strong>New Profile → Use Other Server → Use Classic Mail as Transport</strong>.
<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.
@@ -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="我对技术细节很感兴趣能告诉我更多吗">
@@ -1410,12 +1453,12 @@ Delta Chat 在此处显示两个指纹。
<p>不。</p>
<p>Delta Chat 采用 Autocrypt 1.1 标准规范生成 OpenPGP 加密密钥。
用户虽可导出自身私钥进行备份,但系统设计上不支持导入其他私钥。</p>
<p>基于安全考量,系统默认不开放手动密钥管理功能。
此项设计旨在让安全审计工作聚焦于少量成熟加密算法(如 Autocrypt 标准),
避免因支持 OpenPGP 协议所允许的所有算法而增加潜在安全风险。</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>
<h3 id="security-audits">
@@ -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;
}
+102 -94
View File
@@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = EventType.Info.class, name="Info"), @Type(value = EventType.SmtpConnected.class, name="SmtpConnected"), @Type(value = EventType.ImapConnected.class, name="ImapConnected"), @Type(value = EventType.SmtpMessageSent.class, name="SmtpMessageSent"), @Type(value = EventType.ImapMessageDeleted.class, name="ImapMessageDeleted"), @Type(value = EventType.ImapMessageMoved.class, name="ImapMessageMoved"), @Type(value = EventType.ImapInboxIdle.class, name="ImapInboxIdle"), @Type(value = EventType.NewBlobFile.class, name="NewBlobFile"), @Type(value = EventType.DeletedBlobFile.class, name="DeletedBlobFile"), @Type(value = EventType.Warning.class, name="Warning"), @Type(value = EventType.Error.class, name="Error"), @Type(value = EventType.ErrorSelfNotInGroup.class, name="ErrorSelfNotInGroup"), @Type(value = EventType.MsgsChanged.class, name="MsgsChanged"), @Type(value = EventType.ReactionsChanged.class, name="ReactionsChanged"), @Type(value = EventType.IncomingReaction.class, name="IncomingReaction"), @Type(value = EventType.IncomingWebxdcNotify.class, name="IncomingWebxdcNotify"), @Type(value = EventType.IncomingMsg.class, name="IncomingMsg"), @Type(value = EventType.IncomingMsgBunch.class, name="IncomingMsgBunch"), @Type(value = EventType.MsgsNoticed.class, name="MsgsNoticed"), @Type(value = EventType.MsgDelivered.class, name="MsgDelivered"), @Type(value = EventType.MsgFailed.class, name="MsgFailed"), @Type(value = EventType.MsgRead.class, name="MsgRead"), @Type(value = EventType.MsgDeleted.class, name="MsgDeleted"), @Type(value = EventType.ChatModified.class, name="ChatModified"), @Type(value = EventType.ChatEphemeralTimerModified.class, name="ChatEphemeralTimerModified"), @Type(value = EventType.ChatDeleted.class, name="ChatDeleted"), @Type(value = EventType.ContactsChanged.class, name="ContactsChanged"), @Type(value = EventType.LocationChanged.class, name="LocationChanged"), @Type(value = EventType.ConfigureProgress.class, name="ConfigureProgress"), @Type(value = EventType.ImexProgress.class, name="ImexProgress"), @Type(value = EventType.ImexFileWritten.class, name="ImexFileWritten"), @Type(value = EventType.SecurejoinInviterProgress.class, name="SecurejoinInviterProgress"), @Type(value = EventType.SecurejoinJoinerProgress.class, name="SecurejoinJoinerProgress"), @Type(value = EventType.ConnectivityChanged.class, name="ConnectivityChanged"), @Type(value = EventType.SelfavatarChanged.class, name="SelfavatarChanged"), @Type(value = EventType.ConfigSynced.class, name="ConfigSynced"), @Type(value = EventType.WebxdcStatusUpdate.class, name="WebxdcStatusUpdate"), @Type(value = EventType.WebxdcRealtimeData.class, name="WebxdcRealtimeData"), @Type(value = EventType.WebxdcRealtimeAdvertisementReceived.class, name="WebxdcRealtimeAdvertisementReceived"), @Type(value = EventType.WebxdcInstanceDeleted.class, name="WebxdcInstanceDeleted"), @Type(value = EventType.AccountsBackgroundFetchDone.class, name="AccountsBackgroundFetchDone"), @Type(value = EventType.ChatlistChanged.class, name="ChatlistChanged"), @Type(value = EventType.ChatlistItemChanged.class, name="ChatlistItemChanged"), @Type(value = EventType.AccountsChanged.class, name="AccountsChanged"), @Type(value = EventType.AccountsItemChanged.class, name="AccountsItemChanged"), @Type(value = EventType.EventChannelOverflow.class, name="EventChannelOverflow"), @Type(value = EventType.IncomingCall.class, name="IncomingCall"), @Type(value = EventType.IncomingCallAccepted.class, name="IncomingCallAccepted"), @Type(value = EventType.OutgoingCallAccepted.class, name="OutgoingCallAccepted"), @Type(value = EventType.CallEnded.class, name="CallEnded")})
@JsonSubTypes({@Type(value = EventType.Info.class, name="Info"), @Type(value = EventType.SmtpConnected.class, name="SmtpConnected"), @Type(value = EventType.ImapConnected.class, name="ImapConnected"), @Type(value = EventType.SmtpMessageSent.class, name="SmtpMessageSent"), @Type(value = EventType.ImapMessageDeleted.class, name="ImapMessageDeleted"), @Type(value = EventType.ImapMessageMoved.class, name="ImapMessageMoved"), @Type(value = EventType.ImapInboxIdle.class, name="ImapInboxIdle"), @Type(value = EventType.NewBlobFile.class, name="NewBlobFile"), @Type(value = EventType.DeletedBlobFile.class, name="DeletedBlobFile"), @Type(value = EventType.Warning.class, name="Warning"), @Type(value = EventType.Error.class, name="Error"), @Type(value = EventType.ErrorSelfNotInGroup.class, name="ErrorSelfNotInGroup"), @Type(value = EventType.MsgsChanged.class, name="MsgsChanged"), @Type(value = EventType.ReactionsChanged.class, name="ReactionsChanged"), @Type(value = EventType.IncomingReaction.class, name="IncomingReaction"), @Type(value = EventType.IncomingWebxdcNotify.class, name="IncomingWebxdcNotify"), @Type(value = EventType.IncomingMsg.class, name="IncomingMsg"), @Type(value = EventType.IncomingMsgBunch.class, name="IncomingMsgBunch"), @Type(value = EventType.MsgsNoticed.class, name="MsgsNoticed"), @Type(value = EventType.MsgDelivered.class, name="MsgDelivered"), @Type(value = EventType.MsgFailed.class, name="MsgFailed"), @Type(value = EventType.MsgRead.class, name="MsgRead"), @Type(value = EventType.MsgDeleted.class, name="MsgDeleted"), @Type(value = EventType.ChatModified.class, name="ChatModified"), @Type(value = EventType.ChatEphemeralTimerModified.class, name="ChatEphemeralTimerModified"), @Type(value = EventType.ChatDeleted.class, name="ChatDeleted"), @Type(value = EventType.ContactsChanged.class, name="ContactsChanged"), @Type(value = EventType.LocationChanged.class, name="LocationChanged"), @Type(value = EventType.ConfigureProgress.class, name="ConfigureProgress"), @Type(value = EventType.ImexProgress.class, name="ImexProgress"), @Type(value = EventType.ImexFileWritten.class, name="ImexFileWritten"), @Type(value = EventType.SecurejoinInviterProgress.class, name="SecurejoinInviterProgress"), @Type(value = EventType.SecurejoinJoinerProgress.class, name="SecurejoinJoinerProgress"), @Type(value = EventType.ConnectivityChanged.class, name="ConnectivityChanged"), @Type(value = EventType.SelfavatarChanged.class, name="SelfavatarChanged"), @Type(value = EventType.ConfigSynced.class, name="ConfigSynced"), @Type(value = EventType.WebxdcStatusUpdate.class, name="WebxdcStatusUpdate"), @Type(value = EventType.WebxdcRealtimeData.class, name="WebxdcRealtimeData"), @Type(value = EventType.WebxdcRealtimeAdvertisementReceived.class, name="WebxdcRealtimeAdvertisementReceived"), @Type(value = EventType.WebxdcInstanceDeleted.class, name="WebxdcInstanceDeleted"), @Type(value = EventType.AccountsBackgroundFetchDone.class, name="AccountsBackgroundFetchDone"), @Type(value = EventType.ChatlistChanged.class, name="ChatlistChanged"), @Type(value = EventType.ChatlistItemChanged.class, name="ChatlistItemChanged"), @Type(value = EventType.AccountsChanged.class, name="AccountsChanged"), @Type(value = EventType.AccountsItemChanged.class, name="AccountsItemChanged"), @Type(value = EventType.EventChannelOverflow.class, name="EventChannelOverflow"), @Type(value = EventType.IncomingCall.class, name="IncomingCall"), @Type(value = EventType.IncomingCallAccepted.class, name="IncomingCallAccepted"), @Type(value = EventType.OutgoingCallAccepted.class, name="OutgoingCallAccepted"), @Type(value = EventType.CallEnded.class, name="CallEnded"), @Type(value = EventType.TransportsModified.class, name="TransportsModified")})
public abstract class EventType {
/**
@@ -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,48 +365,56 @@ 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;
}
/**
* One or more transports has changed.
* <p>
* This event is used for tests to detect when transport synchronization messages arrives. UIs don't need to use it, it is unlikely that user modifies transports on multiple devices simultaneously.
*/
public static class TransportsModified extends EventType {
}
}
@@ -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;
}
@@ -70,6 +70,9 @@ public class AllMediaDocumentsFragment
this.noMedia = ViewUtil.findById(view, R.id.no_documents);
this.gridManager = new StickyHeaderGridLayoutManager(1);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
this.recyclerView.setAdapter(new AllMediaDocumentsAdapter(getContext(),
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
this));
@@ -66,6 +66,9 @@ public class AllMediaGalleryFragment
this.noMedia = ViewUtil.findById(view, R.id.no_images);
this.gridManager = new StickyHeaderGridLayoutManager(getCols());
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
this.recyclerView.setAdapter(new AllMediaGalleryAdapter(getContext(),
GlideApp.with(this),
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
@@ -45,6 +45,7 @@ import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.webxdc.WebxdcGarbageCollectionWorker;
import java.io.File;
import java.io.PrintWriter;
@@ -56,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;
@@ -74,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();
@@ -109,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) {
@@ -174,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
@@ -203,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);
@@ -240,6 +320,20 @@ public class ApplicationContext extends MultiDexApplication {
ExistingPeriodicWorkPolicy.KEEP,
fetchWorkRequest);
}
PeriodicWorkRequest webxdcGarbageCollectionRequest = new PeriodicWorkRequest.Builder(
WebxdcGarbageCollectionWorker.class,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
TimeUnit.MILLISECONDS,
PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
TimeUnit.MILLISECONDS)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"WebxdcGarbageCollectionWorker",
ExistingPeriodicWorkPolicy.KEEP,
webxdcGarbageCollectionRequest);
Log.i("DeltaChat", "+++++++++++ ApplicationContext.onCreate() finished ++++++++++");
}
public JobManager getJobManager() {
@@ -49,6 +49,7 @@ import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.ScreenLockUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
/**
* The Activity for application preference display and management.
@@ -79,7 +80,9 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
//noinspection ConstantConditions
this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(findViewById(R.id.fragment));
if (icicle == null) {
initFragment(R.id.fragment, new ApplicationPreferenceFragment());
@@ -1,5 +1,6 @@
package org.thoughtcrime.securesms;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
@@ -17,6 +18,7 @@ import androidx.fragment.app.Fragment;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.lang.reflect.Field;
@@ -33,9 +35,24 @@ public abstract class BaseActionBarActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
onPreCreate();
EdgeToEdge.enable(this); // docs says to use: WindowCompat.enableEdgeToEdge(getWindow()); but it is not available
super.onCreate(savedInstanceState);
WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView()).setAppearanceLightStatusBars(false); // force white text in status bar
// 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);
// force white text in status bar so it visible over background color
WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView()).setAppearanceLightStatusBars(false);
}
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Apply adjustments to the toolbar for edge-to-edge display
ViewUtil.adjustToolbarForE2E(this);
}
@Override
@@ -1,10 +1,10 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedText;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedUris;
import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedText;
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedUris;
import static org.thoughtcrime.securesms.util.ShareUtil.isForwarding;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -36,7 +36,7 @@ import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionB
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.connect.DirectShareUtil;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.SendRelayedMessageUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.task.SnackbarAsyncTask;
@@ -382,7 +382,7 @@ public abstract class BaseConversationListFragment extends Fragment implements A
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
if (isRelayingMessageContent(getActivity())) {
if (RelayUtil.getSharedContactId(getActivity()) != 0) {
if (ShareUtil.getSharedContactId(getActivity()) != 0) {
return false; // no sharing of a contact to multiple recipients at the same time, we can reconsider when that becomes a real-world need
}
Context context = getContext();
@@ -33,7 +33,6 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity
setContentView(R.layout.activity_blocked_contacts);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(R.string.pref_blocked_contacts);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
initFragment(R.id.fragment, new BlockedAndShareContactsFragment(), getIntent().getExtras());
}
@@ -60,6 +59,10 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity
View view = inflater.inflate(R.layout.contact_selection_list_fragment, container, false);
recyclerView = ViewUtil.findById(view, R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView);
emptyStateView = ViewUtil.findById(view, android.R.id.empty);
emptyStateView.setText(R.string.blocked_empty_hint);
return view;
@@ -17,15 +17,11 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -51,13 +47,11 @@ import com.b44t.messenger.DcEvent;
import org.thoughtcrime.securesms.connect.DcContactsLoader;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.contacts.ContactAccessor;
import org.thoughtcrime.securesms.contacts.ContactSelectionListAdapter;
import org.thoughtcrime.securesms.contacts.ContactSelectionListItem;
import org.thoughtcrime.securesms.contacts.NewContactActivity;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.qr.QrActivity;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
@@ -112,13 +106,6 @@ public class ContactSelectionListFragment extends Fragment
public void onStart() {
super.onStart();
this.getLoaderManager().initLoader(0, null, this);
if (dcContext.getConfigInt("ui.android.show_system_contacts") != 0 && !dcContext.isChatmail()) {
Permissions.with(this)
.request(Manifest.permission.READ_CONTACTS)
.ifNecessary()
.onAllGranted(this::handleContactPermissionGranted)
.execute();
}
}
@Override
@@ -126,6 +113,10 @@ public class ContactSelectionListFragment extends Fragment
View view = inflater.inflate(R.layout.contact_selection_list_fragment, container, false);
recyclerView = ViewUtil.findById(view, R.id.recycler_view);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
actionModeCallback = new ActionMode.Callback() {
@Override
@@ -283,38 +274,6 @@ public class ContactSelectionListFragment extends Fragment
((ContactSelectionListAdapter) recyclerView.getAdapter()).changeData(null);
}
@SuppressLint("StaticFieldLeak")
private void handleContactPermissionGranted() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
loadSystemContacts();
return null;
}
}.execute();
}
private void loadSystemContacts() {
Thread thread = new Thread() {
@Override
public void run() {
try {
ContactAccessor contactAccessor = ContactAccessor.getInstance();
String allSystemContacts = contactAccessor.getAllSystemContactsAsString(getContext());
if (!allSystemContacts.isEmpty()) {
dcContext.addAddressBook(allSystemContacts);
}
} catch (SecurityException e) {
Log.e(TAG, "Caught a weird bug in the Android OS https://github.com/deltachat/deltachat-android/issues/1639: " + e);
e.printStackTrace();
}
}
};
thread.start();
}
private class ListClickListener implements ContactSelectionListAdapter.ItemClickListener {
@Override
public void onItemClick(ContactSelectionListItem contact, boolean handleActionMode)
@@ -17,12 +17,9 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.TransportOption.Type;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedHtml;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedSubject;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedText;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedType;
import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding;
import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedText;
import static org.thoughtcrime.securesms.util.ShareUtil.isForwarding;
import static org.thoughtcrime.securesms.util.ShareUtil.isSharing;
import android.Manifest;
import android.annotation.SuppressLint;
@@ -109,7 +106,7 @@ import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.SendRelayedMessageUtil;
import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.Util;
@@ -748,18 +745,18 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
private void handleSharing() {
ArrayList<Uri> uriList = RelayUtil.getSharedUris(this);
int sharedContactId = RelayUtil.getSharedContactId(this);
ArrayList<Uri> uriList = ShareUtil.getSharedUris(this);
int sharedContactId = ShareUtil.getSharedContactId(this);
if (uriList.size() > 1) {
askSendingFiles(uriList, () -> SendRelayedMessageUtil.immediatelyRelay(this, chatId));
} else {
if (sharedContactId != 0) {
addAttachmentContactInfo(sharedContactId);
} else if (getSharedHtml(this) != null || getSharedSubject(this) != null || ("sticker".equals(getSharedType(this)) && !uriList.isEmpty())) {
} else if (ShareUtil.getSharedHtml(this) != null || ShareUtil.getSharedSubject(this) != null || ("sticker".equals(ShareUtil.getSharedType(this)) && !uriList.isEmpty())) {
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
} else {
Uri uri = uriList.isEmpty()? null : uriList.get(0);
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, getSharedType(this), null, null, getSharedText(this)));
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, ShareUtil.getSharedType(this), null, null, getSharedText(this)));
}
initializeDraft();
}
@@ -775,7 +772,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
isEditing = false;
final SettableFuture<Boolean> future = new SettableFuture<>();
DcMsg draft = dcContext.getDraft(chatId);
final String sharedText = RelayUtil.getSharedText(this);
final String sharedText = ShareUtil.getSharedText(this);
if (!draft.isOk()) {
if (TextUtils.isEmpty(sharedText)) {
@@ -883,6 +880,18 @@ 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
ViewUtil.applyWindowInsets(findViewById(R.id.root_layout), true, false, true, true);
container.addOnKeyboardShownListener(this);
container.addOnKeyboardHiddenListener(backgroundView);
container.addOnKeyboardShownListener(backgroundView);
@@ -940,7 +949,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
supportActionBar.setCustomView(R.layout.conversation_title_view);
supportActionBar.setDisplayShowCustomEnabled(true);
supportActionBar.setDisplayShowTitleEnabled(false);
supportActionBar.setElevation(0); // TODO: use custom toolbar instead
Toolbar parent = (Toolbar) supportActionBar.getCustomView().getParent();
parent.setPadding(0,0,0,0);
@@ -951,8 +959,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);
@@ -17,7 +17,7 @@
package org.thoughtcrime.securesms;
import static com.b44t.messenger.DcContact.DC_CONTACT_ID_SELF;
import static org.thoughtcrime.securesms.util.RelayUtil.setForwardingMessageIds;
import static org.thoughtcrime.securesms.util.ShareUtil.setForwardingMessageIds;
import android.annotation.SuppressLint;
import android.app.Activity;
@@ -60,13 +60,13 @@ import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.reactions.AddReactionView;
import org.thoughtcrime.securesms.reactions.ReactionsDetailsFragment;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.relay.EditRelayActivity;
import org.thoughtcrime.securesms.util.AccessibilityUtil;
import org.thoughtcrime.securesms.util.Debouncer;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.ConversationAdaptiveActionsToolbar;
import org.thoughtcrime.securesms.calls.CallUtil;
import java.util.Collections;
import java.util.LinkedList;
@@ -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
@@ -785,7 +788,9 @@ public class ConversationFragment extends MessageSelectorFragment
&& messageRecord.getText().contains(self_mail)
&& getListAdapter().getChat().isDeviceTalk()) {
// This is a device message informing the user that the password is wrong
startActivity(new Intent(getActivity(), EditTransportActivity.class));
Intent intent = new Intent(getActivity(), EditRelayActivity.class);
intent.putExtra(EditRelayActivity.EXTRA_ADDR, self_mail);
startActivity(intent);
}
}
}
@@ -20,13 +20,13 @@ import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.getDirectSharingChatId;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedTitle;
import static org.thoughtcrime.securesms.util.RelayUtil.isDirectSharing;
import static org.thoughtcrime.securesms.util.RelayUtil.isForwarding;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.resetRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.getDirectSharingChatId;
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedTitle;
import static org.thoughtcrime.securesms.util.ShareUtil.isDirectSharing;
import static org.thoughtcrime.securesms.util.ShareUtil.isForwarding;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.resetRelayingMessageContent;
import android.Manifest;
import android.content.Intent;
@@ -76,12 +76,14 @@ import org.thoughtcrime.securesms.search.SearchFragment;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
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);
@@ -159,6 +161,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
searchAction = findViewById(R.id.search_action);
fragmentContainer = findViewById(R.id.fragment_container);
// add margin to avoid content hidden behind system bars
ViewUtil.applyWindowInsetsAsMargin(searchToolbar, true, true, true, false);
Bundle bundle = new Bundle();
conversationListFragment = initFragment(R.id.fragment_container, new ConversationListFragment(), bundle);
@@ -360,7 +365,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
if (isRelayingMessageContent(this)) {
inflater.inflate(R.menu.forwarding_menu, menu);
menu.findItem(R.id.menu_export_attachment).setVisible(
RelayUtil.isFromWebxdc(this) && RelayUtil.getSharedUris(this).size() == 1
ShareUtil.isFromWebxdc(this) && ShareUtil.getSharedUris(this).size() == 1
);
} else {
inflater.inflate(R.menu.text_secure_normal, menu);
@@ -470,7 +475,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
}
private void performSave() {
ArrayList<Uri> uriList = RelayUtil.getSharedUris(this);
ArrayList<Uri> uriList = ShareUtil.getSharedUris(this);
Uri uri = uriList.get(0);
String mimeType = PersistentBlobProvider.getMimeType(this, uri);
String fileName = PersistentBlobProvider.getFileName(this, uri);
@@ -492,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);
}
}
}
@@ -574,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;
@@ -2,9 +2,9 @@ package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.FROM_ARCHIVED_CHATS_EXTRA;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.isSharing;
import android.content.Intent;
import android.os.Bundle;
@@ -23,7 +23,6 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
protected void onCreate(Bundle icicle, boolean ready) {
setContentView(R.layout.activity_conversation_list_archive);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
if (isRelayingMessageContent(this)) {
getSupportActionBar().setTitle(isSharing(this) ? R.string.chat_share_with_title : R.string.forward_to);
getSupportActionBar().setSubtitle(R.string.chat_archived_label);
@@ -48,7 +48,7 @@ import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.notifications.FcmReceiveService;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
@@ -108,6 +108,9 @@ public class ConversationListFragment extends BaseConversationListFragment
emptyState = ViewUtil.findById(view, R.id.empty_state);
emptySearch = ViewUtil.findById(view, R.id.empty_search);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(list, true, archive, true, true);
if (archive) {
fab.setVisibility(View.GONE);
TextView emptyTitle = ViewUtil.findById(view, R.id.empty_title);
@@ -115,6 +118,8 @@ public class ConversationListFragment extends BaseConversationListFragment
} else {
fab.setVisibility(View.VISIBLE);
}
// Apply insets to prevent fab from being covered by system bars
ViewUtil.applyWindowInsetsAsMargin(fab);
list.setHasFixedSize(true);
list.setLayoutManager(new LinearLayoutManager(getActivity()));
@@ -259,7 +264,7 @@ public class ConversationListFragment extends BaseConversationListFragment
int listflags = 0;
if (archive) {
listflags |= DcContext.DC_GCL_ARCHIVED_ONLY;
} else if (RelayUtil.isRelayingMessageContent(getActivity())) {
} else if (ShareUtil.isRelayingMessageContent(getActivity())) {
listflags |= DcContext.DC_GCL_FOR_FORWARDING;
} else {
listflags |= DcContext.DC_GCL_ADD_ALLDONE_HINT;
@@ -79,7 +79,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
getSupportActionBar().setTitle(R.string.pref_profile_info_headline);
getSupportActionBar().setDisplayHomeAsUpEnabled(!this.fromWelcome);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
attachmentManager = new AttachmentManager(this, () -> {});
avatarChanged = false;
@@ -185,6 +184,9 @@ public class CreateProfileActivity extends BaseActionBarActivity {
this.container = ViewUtil.findById(this, R.id.container);
this.statusView = ViewUtil.findById(this, R.id.status_text);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(container);
if (fromWelcome) {
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
ViewUtil.findById(this, R.id.status_text_layout).setVisibility(View.GONE);
@@ -80,7 +80,6 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
unencrypted = getIntent().getBooleanExtra(UNENCRYPTED, false);
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
groupChatId = getIntent().getIntExtra(EDIT_GROUP_CHAT_ID, 0);
attachmentManager = new AttachmentManager(this, () -> {});
@@ -143,6 +142,11 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
groupName = ViewUtil.findById(this, R.id.group_name);
TextView chatHints = ViewUtil.findById(this, R.id.chat_hints);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(lv, false, false, false, true);
// apply padding to root to avoid collision with system bars
ViewUtil.applyWindowInsets(findViewById(R.id.root_layout), true, false, true, false);
initializeAvatarView();
SelectedContactsAdapter adapter = new SelectedContactsAdapter(this, GlideApp.with(this), broadcast, unencrypted);
@@ -51,10 +51,13 @@ import org.thoughtcrime.securesms.permissions.Permissions;
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;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
import java.io.File;
@@ -73,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;
@@ -104,14 +106,24 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
Objects.requireNonNull(getSupportActionBar()).setTitle(R.string.onboarding_create_instant_account);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
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() {
@@ -232,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();
@@ -330,6 +332,9 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
this.privacyPolicyBtn = findViewById(R.id.privacy_policy_button);
this.signUpBtn = findViewById(R.id.signup_button);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(findViewById(R.id.container));
privacyPolicyBtn.setOnClickListener(view -> {
if (!isDcLogin) {
IntentUtils.showInBrowser(this, "https://" + providerHost + "/privacy.html");
@@ -342,18 +347,13 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
IntentUtils.showInBrowser(this, INSTANCES_URL);
});
findViewById(R.id.login_button).setOnClickListener((v) -> {
startRegistrationActivity();
startActivity(new Intent(this, EditRelayActivity.class));
});
findViewById(R.id.scan_qr_button).setOnClickListener((v) -> {
new IntentIntegrator(this).setCaptureActivity(RegistrationQrActivity.class).initiateScan();
});
}
private void startRegistrationActivity() {
Intent intent = new Intent(this, EditTransportActivity.class);
startActivity(intent);
}
private void updateProvider() {
if (isDcLogin) {
signUpBtn.setText(R.string.login_title);
@@ -36,7 +36,6 @@ public class LogViewActivity extends BaseActionBarActivity {
transaction.commit();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
}
@Override
@@ -37,12 +37,11 @@ import androidx.annotation.NonNull;
import androidx.core.content.PermissionChecker;
import androidx.fragment.app.Fragment;
import com.b44t.messenger.DcContext;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.notifications.FcmReceiveService;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -55,6 +54,9 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import chat.delta.rpc.Rpc;
import chat.delta.rpc.RpcException;
public class LogViewFragment extends Fragment {
private EditText logPreview;
@@ -77,6 +79,10 @@ public class LogViewFragment extends Fragment {
super.onViewCreated(view, savedInstanceState);
logPreview = (EditText) getView().findViewById(R.id.log_preview);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(getView().findViewById(R.id.content_container), true, false, true, true);
new PopulateLogcatAsyncTask(this).execute();
}
@@ -124,10 +130,7 @@ public class LogViewFragment extends Fragment {
}
private static String grabLogcat(LogViewFragment fragment) {
String command = "logcat -v threadtime -d -t 10000";
if (!Prefs.isDeveloperModeEnabled(fragment.getActivity())) {
command += " *:I";
}
String command = "logcat -v threadtime -d -t 10000 *:I";
try {
final Process process = Runtime.getRuntime().exec(command);
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
@@ -211,7 +214,6 @@ public class LogViewFragment extends Fragment {
PowerManager powerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
final PackageManager pm = context.getPackageManager();
final StringBuilder builder = new StringBuilder();
final DcContext dcContext = DcHelper.getContext(context);
builder.append("device=")
.append(Build.MANUFACTURER).append(" ")
@@ -266,8 +268,16 @@ public class LogViewFragment extends Fragment {
builder.append("Unknown\n");
}
final Rpc rpc = DcHelper.getRpc(context);
final int accId = DcHelper.getContext(context).getAccountId();
builder.append("\n");
builder.append(dcContext.getInfo());
try {
builder.append(rpc.getStorageUsageReportString(accId));
} catch (RpcException e) {
builder.append(e);
}
builder.append(DcHelper.getContext(context).getInfo());
return builder.toString();
}
@@ -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())
@@ -18,8 +18,8 @@ package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.TEXT_EXTRA;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
import android.content.Intent;
import android.net.Uri;
@@ -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;
@@ -28,7 +28,7 @@ import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
@@ -393,9 +393,9 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
Intent composeIntent = new Intent();
DcContact dcContact = dcContext.getContact(contactId);
if (dcContact.isKeyContact()) {
RelayUtil.setSharedContactId(composeIntent, contactId);
ShareUtil.setSharedContactId(composeIntent, contactId);
} else {
RelayUtil.setSharedText(composeIntent, dcContact.getAddr());
ShareUtil.setSharedText(composeIntent, dcContact.getAddr());
}
ConversationListRelayingActivity.start(this, composeIntent);
}
@@ -68,6 +68,10 @@ public class ProfileFragment extends Fragment
adapter = new ProfileAdapter(this, GlideApp.with(this), this);
RecyclerView list = ViewUtil.findById(view, R.id.recycler_view);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(list);
list.setAdapter(adapter);
list.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
@@ -39,7 +39,7 @@ import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.MailtoUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.ShareUtil;
import java.util.ArrayList;
import java.util.List;
@@ -274,7 +274,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
startActivity(composeIntent);
} else {
composeIntent = getBaseShareIntent(ConversationListRelayingActivity.class);
RelayUtil.setIsFromWebxdc(composeIntent, RelayUtil.isFromWebxdc(this));
ShareUtil.setIsFromWebxdc(composeIntent, ShareUtil.isFromWebxdc(this));
ConversationListRelayingActivity.start(this, composeIntent);
}
finish();
@@ -283,11 +283,11 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
private Intent getBaseShareIntent(final @NonNull Class<?> target) {
final Intent intent = new Intent(this, target);
RelayUtil.setSharedTitle(intent, RelayUtil.getSharedTitle(this));
RelayUtil.setSharedType(intent, RelayUtil.getSharedType(this));
RelayUtil.setSharedSubject(intent, RelayUtil.getSharedSubject(this));
RelayUtil.setSharedHtml(intent, RelayUtil.getSharedHtml(this));
RelayUtil.setSharedUris(intent, resolvedExtras);
ShareUtil.setSharedTitle(intent, ShareUtil.getSharedTitle(this));
ShareUtil.setSharedType(intent, ShareUtil.getSharedType(this));
ShareUtil.setSharedSubject(intent, ShareUtil.getSharedSubject(this));
ShareUtil.setSharedHtml(intent, ShareUtil.getSharedHtml(this));
ShareUtil.setSharedUris(intent, resolvedExtras);
String text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
if (text==null) {
@@ -298,7 +298,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
}
if (text != null) {
RelayUtil.setSharedText(intent, text.toString());
ShareUtil.setSharedText(intent, text.toString());
}
if (resolvedExtras.size() > 0) {
@@ -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();
}
}
@@ -1,156 +0,0 @@
package org.thoughtcrime.securesms;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.Util;
import java.util.List;
import chat.delta.rpc.Rpc;
import chat.delta.rpc.RpcException;
import chat.delta.rpc.types.EnteredLoginParam;
public class TransportListActivity extends BaseActionBarActivity
implements TransportListAdapter.OnTransportClickListener {
public static final String EXTRA_TRANSPORT_ADDR = "transport_addr";
private RecyclerView recyclerView;
private TransportListAdapter adapter;
private FloatingActionButton fabAdd;
private Rpc rpc;
private int accId;
private String mainTransportAddr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transport_list);
rpc = DcHelper.getRpc(this);
accId = DcHelper.getContext(this).getAccountId();
// Setup toolbar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(R.string.transports);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
recyclerView = findViewById(R.id.transport_list);
fabAdd = findViewById(R.id.fab_add_transport);
adapter = new TransportListAdapter(this);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
fabAdd.setOnClickListener(v -> openAddTransport());
// Handle window insets for FAB to stay above navigation bar
ViewCompat.setOnApplyWindowInsetsListener(fabAdd, (v, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
CoordinatorLayout.LayoutParams fabParams = (CoordinatorLayout.LayoutParams) fabAdd.getLayoutParams();
int fabMargin = (int) (16 * getResources().getDisplayMetrics().density);
fabParams.bottomMargin = insets.bottom + fabMargin;
fabParams.rightMargin = fabMargin;
fabAdd.setLayoutParams(fabParams);
return windowInsets;
});
loadTransports();
}
@Override
protected void onResume() {
super.onResume();
loadTransports();
}
private void loadTransports() {
Util.runOnBackground(() -> {
try {
List<EnteredLoginParam> transports = rpc.listTransports(accId);
mainTransportAddr = DcHelper.get(this, DcHelper.CONFIG_CONFIGURED_ADDRESS);
Util.runOnMain(() -> adapter.setTransports(transports, mainTransportAddr));
} catch (RpcException e) {
mainTransportAddr = DcHelper.get(this, DcHelper.CONFIG_CONFIGURED_ADDRESS);
Util.runOnMain(() -> adapter.setTransports(null, mainTransportAddr));
}
});
}
private void openAddTransport() {
Intent intent = new Intent(this, EditTransportActivity.class);
startActivity(intent);
}
@Override
public void onTransportClick(EnteredLoginParam transport) {
// Clicking on a transport makes it the main transport
if (transport.addr != null && !transport.addr.equals(mainTransportAddr)) {
Util.runOnBackground(() -> {
DcHelper.getContext(this).setConfig(DcHelper.CONFIG_CONFIGURED_ADDRESS, transport.addr);
Util.runOnMain(this::loadTransports);
});
}
}
@Override
public void onTransportEdit(EnteredLoginParam transport) {
Intent intent = new Intent(this, EditTransportActivity.class);
intent.putExtra(EXTRA_TRANSPORT_ADDR, transport.addr);
startActivity(intent);
}
@Override
public void onTransportDelete(EnteredLoginParam transport) {
new AlertDialog.Builder(this)
.setTitle(R.string.remove_transport)
.setMessage(getString(R.string.confirm_remove_transport, transport.addr))
.setPositiveButton(R.string.ok, (dialog, which) -> deleteTransport(transport))
.setNegativeButton(R.string.cancel, null)
.show();
}
private void deleteTransport(EnteredLoginParam transport) {
Util.runOnBackground(() -> {
try {
rpc.deleteTransport(accId, transport.addr);
Util.runOnMain(this::loadTransports);
} catch (RpcException e) {
Util.runOnMain(() -> {
new AlertDialog.Builder(this)
.setMessage(getString(R.string.error) + ": " + e.getMessage())
.setPositiveButton(R.string.ok, null)
.show();
});
}
});
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
@@ -1,106 +0,0 @@
package org.thoughtcrime.securesms;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import chat.delta.rpc.types.EnteredLoginParam;
public class TransportListAdapter extends RecyclerView.Adapter<TransportListAdapter.TransportViewHolder> {
private List<EnteredLoginParam> transports = new ArrayList<>();
private final OnTransportClickListener listener;
private String mainTransportAddr;
public interface OnTransportClickListener {
void onTransportClick(EnteredLoginParam transport);
void onTransportEdit(EnteredLoginParam transport);
void onTransportDelete(EnteredLoginParam transport);
}
public TransportListAdapter(OnTransportClickListener listener) {
this.listener = listener;
}
public void setTransports(List<EnteredLoginParam> transports, String mainTransportAddr) {
this.transports = transports != null ? transports : new ArrayList<>();
this.mainTransportAddr = mainTransportAddr;
notifyDataSetChanged();
}
@NonNull
@Override
public TransportViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.transport_list_item, parent, false);
return new TransportViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull TransportViewHolder holder, int position) {
EnteredLoginParam transport = transports.get(position);
boolean isMain = transport.addr != null && transport.addr.equals(mainTransportAddr);
holder.bind(transport, isMain, listener);
}
@Override
public int getItemCount() {
return transports.size();
}
static class TransportViewHolder extends RecyclerView.ViewHolder {
private final TextView emailText;
private final TextView serverText;
private final ImageView mainIndicator;
private final ImageView editButton;
private final ImageView deleteButton;
public TransportViewHolder(@NonNull View itemView) {
super(itemView);
emailText = itemView.findViewById(R.id.transport_email);
serverText = itemView.findViewById(R.id.transport_server);
mainIndicator = itemView.findViewById(R.id.main_transport_indicator);
editButton = itemView.findViewById(R.id.edit_button);
deleteButton = itemView.findViewById(R.id.delete_button);
}
public void bind(EnteredLoginParam transport, boolean isMain, OnTransportClickListener listener) {
emailText.setText(transport.addr);
String serverInfo = "";
if (transport.imapServer != null && !transport.imapServer.isEmpty()) {
serverInfo = transport.imapServer;
}
serverText.setText(serverInfo);
serverText.setVisibility(serverInfo.isEmpty() ? View.GONE : View.VISIBLE);
mainIndicator.setVisibility(isMain ? View.VISIBLE : View.GONE);
itemView.setOnClickListener(v -> {
if (listener != null) {
listener.onTransportClick(transport);
}
});
editButton.setOnClickListener(v -> {
if (listener != null) {
listener.onTransportEdit(transport);
}
});
deleteButton.setOnClickListener(v -> {
if (listener != null) {
listener.onTransportDelete(transport);
}
});
}
}
}
@@ -26,6 +26,9 @@ import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.util.DynamicTheme;
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;
@@ -37,6 +40,9 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
protected WebView webView;
/** Return true the window content should display fullscreen/edge-to-edge ex. in the integrated maps app */
protected boolean immersiveMode() { return false; }
protected boolean shouldAskToOpenLink() { return false; }
protected void toggleFakeProxy(boolean enable) {
@@ -62,10 +68,18 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setElevation(0); // TODO: use custom toolbar instead
}
webView = findViewById(R.id.webview);
if(immersiveMode()) {
// set a shadow in the status bar to make it more readable
findViewById(R.id.status_bar_background).setBackgroundResource(R.drawable.search_toolbar_shadow);
} else {
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(findViewById(R.id.content_container));
}
webView.setWebViewClient(new WebViewClient() {
// IMPORTANT: this is will likely not be called inside iframes unless target=_blank is used in the anchor/link tag.
// `shouldOverrideUrlLoading()` is called when the user clicks a URL,
@@ -79,7 +93,22 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
// so, to support all systems, for now, using the old one seems to be the simplest way.
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null) return openOnlineUrl(url);
if (url != null) {
String schema = url.split(":")[0].toLowerCase();
switch (schema) {
case "http":
case "https":
case "gemini":
case "tel":
case "sms":
case "mailto":
case "openpgp4fpr":
case "geo":
case "dcaccount":
case "dclogin":
return openOnlineUrl(url);
}
}
return true; // returning `true` aborts loading
}
@@ -275,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
}
@@ -127,9 +127,6 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
public static void openWebxdcActivity(Context context, int msgId, boolean hideActionBar, String href) {
if (!Util.isClickedRecently()) {
if (Prefs.isDeveloperModeEnabled(context)) {
WebView.setWebContentsDebuggingEnabled(true);
}
context.startActivity(getWebxdcIntent(context, msgId, hideActionBar, href));
}
}
@@ -160,14 +157,18 @@ public class WebxdcActivity extends WebViewActivity implements DcEventCenter.DcE
.getIntents();
}
@Override
protected boolean immersiveMode() { return hideActionBar; }
@Override
protected void onCreate(Bundle state, boolean ready) {
Bundle b = getIntent().getExtras();
hideActionBar = b.getBoolean(EXTRA_HIDE_ACTION_BAR, false);
super.onCreate(state, ready);
rpc = DcHelper.getRpc(this);
initTTS();
Bundle b = getIntent().getExtras();
hideActionBar = b.getBoolean(EXTRA_HIDE_ACTION_BAR, false);
webView.setWebChromeClient(new WebChromeClient() {
@Override
@@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.util.JsonUtils;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
@@ -46,11 +47,13 @@ public class WebxdcStoreActivity extends PassphraseRequiredActionBarActivity {
dcContext = DcHelper.getContext(this);
WebView webView = findViewById(R.id.webview);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(findViewById(R.id.content_container));
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle(R.string.webxdc_apps);
actionBar.setElevation(0); // TODO: use custom toolbar instead
}
webView.setWebViewClient(new WebViewClient() {
@@ -39,6 +39,7 @@ import org.thoughtcrime.securesms.service.NotificationController;
import org.thoughtcrime.securesms.util.StorageUtil;
import org.thoughtcrime.securesms.util.StreamUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
import java.io.File;
@@ -63,6 +64,9 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
super.onCreate(bundle);
setContentView(R.layout.welcome_activity);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(findViewById(R.id.content_container));
findViewById(R.id.signup_button).setOnClickListener((v) -> startInstantOnboardingActivity());
findViewById(R.id.add_as_second_device_button).setOnClickListener((v) -> startAddAsSecondDeviceActivity());
findViewById(R.id.backup_button).setOnClickListener((v) -> startImportBackup());
@@ -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;
}

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