Compare commits

...

992 Commits

Author SHA1 Message Date
adbenitez fa75294472 add device message 2025-11-07 11:34:25 +01:00
adbenitez 75498e7fa7 Merge remote-tracking branch 'upstream/main' 2025-11-06 16:21:57 +01:00
adbenitez f57d44cea7 update full_description.txt 2025-11-06 15:34:33 +01:00
adb 242e3beb93 Merge pull request #3999 from deltachat/prep-2.25.0
prepare 2.25.0
2025-11-06 14:52:25 +01:00
B. Petersen 21d4a1604b the whole login is 'advanced', so an 'advanced -> advanced' is a bit weird' 2025-11-06 12:05:20 +01:00
B. Petersen f33805abb0 'For advanced users:' could be misunderstood as if the following points are valid for advanced users, but the login is fine for beginners. clarify this 2025-11-06 12:05:20 +01:00
B. Petersen 5fd4a60af4 in the help and elsewhere, we say 'mail icon' 2025-11-06 11:36:54 +01:00
B. Petersen a59eaea0e4 use term e2ee as elsewhere 2025-11-06 11:36:54 +01:00
adbenitez b11628346f update build.gradle 2025-11-05 22:08:51 +01:00
adbenitez a6f99bdb58 update changelog 2025-11-05 22:08:32 +01:00
adb e44bc65ca2 Merge pull request #3998 from deltachat/update-core-and-stuff-5/11/25
Update core to 2.25.0
2025-11-05 22:03:13 +01:00
adbenitez 77f4e9f116 update changelog 2025-11-05 21:36:54 +01:00
adbenitez b40f98a00e update deltachat-core-rust to 'chore(release): prepare for 2.25.0' of 'v2.25.0' 2025-11-05 21:17:37 +01:00
adb 596983d2c1 Merge pull request #3996 from deltachat/adb/issue-3926
tweak registraction screen and empty chat hints for classic email
2025-11-05 21:11:07 +01:00
adb 78f061bc9d Merge branch 'main' into adb/issue-3926 2025-11-05 20:33:49 +01:00
adbenitez 2f42d3bcd2 update changelog 2025-11-05 20:05:32 +01:00
adbenitez d67b71297d tweak registraction screen and empty chat hints for classic email 2025-11-05 20:01:51 +01:00
Hocuri 629ae0b16e fix: Don't crash when QR code can't be loaded (#3995)
Before this PR, when a QR code couldn't be loaded because of https://github.com/chatmail/core/pull/7399, Delta Chat crashed.

Now, the button does nothing.

It's not perfect, but easy to do, and only about an edge case where the user tried out the experimental broadcast channels in the past, and now tries to add a new member to a broadcast channel created with an old version of DC.

The hollistic alternative would be to switch to RPC for getSecurejoinQrSvg, so that the UI can get a proper error message.

---------

Co-authored-by: adb <adb@merlinux.eu>
2025-11-05 17:26:32 +01:00
adbenitez 7e1930abc5 Merge remote-tracking branch 'upstream/main' 2025-11-05 17:13:44 +01:00
adbenitez e5c9fd05f2 update build.gradle 2025-11-05 16:00:27 +01:00
adb c4427c198e Merge pull request #3994 from deltachat/adb/issue-3993
fix QRShowActivity screen
2025-11-04 23:21:07 +01:00
adbenitez a9d1d2d631 update changelog 2025-11-04 23:20:35 +01:00
adbenitez 3a4bf8eaea fix code indentation 2025-11-04 20:46:38 +01:00
adbenitez 4b903c73dc fix QRShowActivity screen 2025-11-04 20:43:15 +01:00
adb 90a0f75823 Merge pull request #3992 from deltachat/prep-2.24.0
prepare 2.24.0
2025-11-04 19:52:52 +01:00
adbenitez 0546ea2c91 bump version number to 2.24.0 2025-11-04 19:31:59 +01:00
adb 66b619cc48 Merge pull request #3991 from deltachat/adb/issue-3941
remove forcing of LTR
2025-11-04 19:28:54 +01:00
adbenitez fbe8888c71 update changelog 2025-11-04 19:26:30 +01:00
adbenitez 2b156cff17 remove forcing of LTR 2025-11-04 19:08:49 +01:00
adb 90d485ba16 Merge pull request #3978 from deltachat/adb/issue-3918
update flake.nix
2025-11-04 18:35:43 +01:00
adb 4978c555da Merge pull request #3989 from deltachat/adb/issue-3959
allow to export files from "send to chat" (webxdc)
2025-11-04 18:33:30 +01:00
adb 383e50da32 Merge branch 'main' into adb/issue-3959 2025-11-04 18:33:21 +01:00
adb 22af7427cb Merge pull request #3986 from deltachat/adb/optimize-app-build
minify app (reduce app size)
2025-11-04 18:25:04 +01:00
adbenitez 6d7ec658a2 update changelog 2025-11-04 00:47:13 +01:00
adb df175f40e1 Merge branch 'main' into adb/issue-3959 2025-11-04 00:44:26 +01:00
adb 9c2a885553 Merge pull request #3886 from deltachat/hoc/channels-encryption-only-qrcodes
feat: Adapt to channel-invite QR codes
2025-11-04 00:43:43 +01:00
adb 81809f6906 Merge branch 'main' into hoc/channels-encryption-only-qrcodes 2025-11-04 00:42:49 +01:00
adb 19248025ec Merge pull request #3990 from deltachat/update-core-and-stuff-4/11/25
Update core to 2.24.0
2025-11-04 00:42:31 +01:00
adbenitez 54a31722e0 update changelog 2025-11-04 00:34:03 +01:00
adbenitez dde84fc0a3 update translations 2025-11-04 00:33:07 +01:00
adbenitez a6823d2140 update deltachat-core-rust to 'core(release): prepare for v2.24.0' of 'v2.24.0' 2025-11-04 00:20:11 +01:00
adbenitez 9897f286ff allow to export attachment from "send to chat" (webxdc) 2025-11-04 00:02:13 +01:00
Hocuri 2881ea7150 feat: Adapt to channel-invite QR codes 2025-11-03 22:50:19 +01:00
adb 5ab83e71c8 Merge pull request #3988 from deltachat/adb/remove-selfreporting
remove "self report" option for now
2025-11-03 19:32:37 +01:00
adbenitez 993670c7be update changelog 2025-11-03 17:47:40 +01:00
adb 90df47d352 Merge branch 'main' into adb/remove-selfreporting 2025-11-03 17:33:33 +01:00
adb 73ff1560ae Merge pull request #3987 from deltachat/adb/issue-3984
remove address from vcard
2025-11-03 17:28:58 +01:00
adb b0f719e791 Merge pull request #3964 from deltachat/adb/issue-3963
update to new dcaccount scheme
2025-11-03 17:22:45 +01:00
adbenitez ec0ffd3b8e remove "self report" option for now 2025-11-03 15:40:15 +01:00
adbenitez f4dc4ea66d update changelog 2025-11-02 00:45:10 +01:00
adbenitez 867327d34c remove address from vcard 2025-11-02 00:43:46 +01:00
adbenitez 1f1d16d4ed update changelog 2025-11-02 00:31:37 +01:00
adbenitez 776c7d129d add R8 rules and set minifyEnabled true 2025-11-02 00:23:58 +01:00
adb a9be7555de Merge branch 'main' into adb/issue-3963 2025-11-02 00:03:31 +01:00
adb 51a9998848 Merge pull request #3985 from deltachat/update-core-and-stuff-1/11/25
update core to 2.23.0
2025-11-02 00:02:42 +01:00
adbenitez 96068be20b update code at src/androidTest 2025-11-01 23:50:37 +01:00
adbenitez c59a682837 update changelog 2025-11-01 23:32:42 +01:00
adbenitez b4f026b04e remove deprecated chat verification code 2025-11-01 23:32:27 +01:00
adbenitez 4dbd2f23df update deltachat-core-rust to 'chore(release): prepare for 2.23.0' of 'v2.23.0' 2025-11-01 22:32:17 +01:00
B. Petersen b842392555 this really removes the watch-sent option
a kind of sticky option :)
2025-11-01 18:52:44 +01:00
B. Petersen 7e0e6b6cab update CHANGELOG 2025-11-01 00:14:35 +01:00
B. Petersen f1911d3910 Remove "Watch Sent folder" preference
It is going to be removed in the next core release: https://github.com/chatmail/core/pull/7189

counterpart of desktop PR at https://github.com/deltachat/deltachat-desktop/pull/5611
2025-11-01 00:14:35 +01:00
adb f9c675de0e Merge pull request #3981 from deltachat/adb/remove-companion-app-code
remove deprecated companion app
2025-10-31 23:27:40 +01:00
adbenitez 79ded65e47 update changelog 2025-10-31 23:22:21 +01:00
adbenitez d54ae28a73 remove deprecated companion app 2025-10-31 23:16:10 +01:00
adb 6365062275 Merge pull request #3977 from deltachat/adb/remove-oauth
remove deprecated oauth code
2025-10-31 21:22:37 +01:00
B. Petersen 394a749e7f add 'proxy enabled' hints needed by https://github.com/chatmail/core/pull/7359 at some point 2025-10-31 21:10:06 +01:00
adbenitez f082949cab update flake.nix 2025-10-31 17:09:43 +01:00
adbenitez 222e5092d2 remove oauth code from DcContext 2025-10-30 23:44:16 +01:00
adbenitez 69b0e953af remove oauth2 url redirection handling 2025-10-30 23:39:50 +01:00
adbenitez 954ac96069 mark strings as deprecated 2025-10-30 23:39:30 +01:00
adbenitez 91cc79d395 remove deprecated oauth code 2025-10-30 23:35:10 +01:00
adb f5191255fe Merge pull request #3976 from deltachat/adb/issue-3304
improve all media screen
2025-10-30 22:24:16 +01:00
adbenitez a0ffd8b34e update changelog 2025-10-30 22:10:04 +01:00
adbenitez c2ac3dea15 improve all media screen 2025-10-30 22:06:11 +01:00
adb e543827320 Merge pull request #3973 from deltachat/adb/remove-amazon
remove deprecated amazon instructions
2025-10-30 19:57:00 +01:00
adb 916b5f7b8a Merge pull request #3975 from deltachat/adb/issue-3971
don't show email address in export button
2025-10-30 19:49:34 +01:00
adb df2e870025 Merge pull request #3974 from deltachat/adb/update-chatmail-relays-url
update chatmail relays URL
2025-10-30 19:49:09 +01:00
adbenitez 54c3b6bc4c don't show email address in export button 2025-10-30 19:08:41 +01:00
adbenitez 46816b2c0c update chatmail relays URL 2025-10-30 18:41:14 +01:00
adbenitez 4387585ddc remove deprecated amazon instructions 2025-10-30 18:08:10 +01:00
B. Petersen 4f70cd1229 mark systemmsg_unknown_sender_for_chat as deprecated 2025-10-29 12:25:49 +01:00
adb d290acc3ae Merge pull request #3950 from deltachat/adb/issue-3944
don't show badge-counter in app icon for permanent notification
2025-10-29 00:11:39 +01:00
adb dc84613c61 Merge pull request #3968 from deltachat/adb/issue-3948
don't force circle shape for shared shortcuts
2025-10-29 00:02:25 +01:00
adb b98cb839cc Merge pull request #3967 from deltachat/adb/remove-deprecated-stock-string-72
remove deprecated stock string 72
2025-10-29 00:01:13 +01:00
adbenitez 2b798e8126 don't force circle shape for shared shortcuts 2025-10-28 23:46:22 +01:00
adbenitez 3ffc71bc0f remove deprecated stock string 72 2025-10-28 23:24:11 +01:00
adbenitez 4f4e2bb291 update changelog 2025-10-28 23:17:03 +01:00
adbenitez 8a57954eb3 rename permanent channel id, delete old/deprecated one 2025-10-28 23:16:35 +01:00
adb 00ec33b1e8 Merge branch 'main' into adb/issue-3944 2025-10-28 23:00:01 +01:00
adb c4e04cbc71 Merge branch 'main' into adb/issue-3963 2025-10-28 22:59:41 +01:00
B. Petersen cccd6ae225 add missing strings for 'channels' 2025-10-28 20:15:25 +01:00
adbenitez 882aa30e5f update to new dcaccount scheme 2025-10-28 03:47:40 +01:00
B. Petersen bc372d5406 'Start Messaging' does no longer exist; however, the flow is also clear without that hint and the string is anyway only used on older phones 2025-10-24 23:09:10 +02:00
B. Petersen 0f8d4ad8f2 remove unused strings 2025-10-24 22:42:13 +02:00
bjoern c5f98d09f2 cleanup deprecated strings and QR codes (#3958)
* cleanup deprecated strings and QR codes

* more cleanup
2025-10-23 18:55:06 +02:00
adbenitez 091ecc0329 update full_description 2025-10-23 14:22:18 +02:00
adbenitez f76b1cb3d3 change call icon to videocall 2025-10-23 14:15:42 +02:00
adbenitez 98551713ae Merge remote-tracking branch 'upstream/main' 2025-10-23 14:06:32 +02:00
Hocuri bc2e4002c3 refactor: Remove stock string that is rarely used these days (#3957) 2025-10-21 09:09:47 +00:00
adb 40b8f1297e Merge pull request #3955 from deltachat/prep-2.22.0
prepare 2.22.0
2025-10-20 16:24:09 +02:00
adbenitez 84f8a39355 prepare 2.22.0 2025-10-19 18:00:43 +02:00
Hocuri 6874191143 fix: Remove warning about unknown architecture in PR preview builds (#3951)
Co-authored-by: adb <adb@merlinux.eu>
2025-10-18 12:12:03 +02:00
adb 7ecc1d0381 Merge branch 'main' into adb/issue-3944 2025-10-17 14:58:43 +02:00
adb aea7e912e0 Merge pull request #3953 from deltachat/update-core-and-stuff-17/10/25
Update core to 2.22
2025-10-17 14:56:17 +02:00
adbenitez 4f8068f144 update translations 2025-10-17 14:42:30 +02:00
adbenitez 4f4e42e20c update changelog 2025-10-17 14:39:11 +02:00
adbenitez 8ddb51382e update deltachat-core-rust to 'chore(release): prepare for 2.22.0' of 'v2.22.0' 2025-10-17 14:36:53 +02:00
adbenitez 7cba6edca9 update changelog 2025-10-16 19:46:19 +02:00
adbenitez 8fb870c51c don't show badge-counter in app icon for permanent notification 2025-10-16 19:35:14 +02:00
adb 252263e6db Merge pull request #3949 from deltachat/adb/improve-readme
improve readme
2025-10-16 18:04:51 +02:00
adb 4efdc0b1c8 Update BUILDING.md
Co-authored-by: bjoern <r10s@b44t.com>
2025-10-16 16:03:34 +00:00
adb 30858c51d6 Update README.md
Co-authored-by: bjoern <r10s@b44t.com>
2025-10-16 16:02:49 +00:00
adb 42cd1c6ad1 Merge branch 'main' into adb/improve-readme 2025-10-16 17:12:34 +02:00
B. Petersen e6b40adf8a remove 1 year old mute-migration from global-setting to profile-setting; if ppl did not upgrade since then, they do not care much 2025-10-16 16:57:55 +02:00
B. Petersen 500e5a910d verified_one_on_one_chats option was removed in core 2.17 2025-10-16 16:57:55 +02:00
adbenitez fe3f34222d improve downloads hints 2025-10-16 16:54:01 +02:00
adbenitez 408c7ae727 update chatmail core link 2025-10-16 16:44:52 +02:00
adbenitez 5198191728 move building to its own file 2025-10-16 16:44:26 +02:00
adb 6f2cc60017 Merge pull request #3942 from deltachat/adb/remove-duplicate-classes
remove duplicated ListenableFuture and SettableFuture
2025-10-16 14:21:50 +02:00
adb 091cb931d7 Merge branch 'main' into adb/remove-duplicate-classes 2025-10-16 14:10:20 +02:00
adb 26ec26e75c Merge pull request #3946 from deltachat/prep-2.20.0
prepare 2.20.0
2025-10-16 14:08:54 +02:00
adbenitez 1b0b87f148 update build.gradle 2025-10-15 18:19:26 +02:00
adbenitez 9dbb918ed8 update changelog 2025-10-13 16:30:42 +02:00
adbenitez a955d6f2f7 Merge remote-tracking branch 'upstream/main' 2025-10-13 16:28:46 +02:00
adbenitez 42f8eb9153 update version number 2025-10-13 16:08:29 +02:00
adb 2143bc01d1 Merge pull request #3945 from deltachat/update-core-and-stuff-13/10/25
Update core to 2.20.0
2025-10-13 16:07:51 +02:00
adbenitez 5a3728428b update changelog 2025-10-13 15:47:38 +02:00
adbenitez f236085b92 update deltachat-core-rust to 'chore(release): prepare for 2.20.0' of 'v2.20.0' 2025-10-13 15:44:58 +02:00
adb ac6119792f Merge branch 'main' into adb/remove-duplicate-classes 2025-10-10 18:04:47 +02:00
adb b0cea8f099 Merge pull request #3943 from deltachat/update-core-and-stuff-10/10/25
Update core to 2.18.0
2025-10-10 18:04:23 +02:00
adbenitez 7590b21928 update version number and strings 2025-10-10 17:39:05 +02:00
adbenitez ea7fd0ec22 update deltachat-core-rust to 'chore(release): prepare for 2.18.0' of 'v2.18.0' 2025-10-10 15:57:51 +02:00
adbenitez cf4cb2f839 remove duplicated ListenableFuture and SettableFuture 2025-10-10 15:38:25 +02:00
adb 6a4e40d17b Merge pull request #3937 from deltachat/link2xt/recommend-lix-instead-of-determinate-nix-installer
Recommend Lix instead of Determinate Nix Installer
2025-10-10 15:28:02 +02:00
adb 5302e86011 Merge pull request #3938 from deltachat/adb/speedup-ci
speed up the PR's apk preview building
2025-10-10 13:30:18 +02:00
adb 5382e880a9 Merge branch 'main' into adb/speedup-ci 2025-10-10 12:29:24 +02:00
adb 2385b236c7 Merge pull request #3940 from deltachat/prep-2.17.0
update build.gradle
2025-10-10 12:28:30 +02:00
adbenitez 5224119f9e update build.gradle 2025-10-09 20:09:12 +02:00
adb dfef2b4120 Merge pull request #3939 from deltachat/update-translations-9/10/25
update translations
2025-10-09 20:05:55 +02:00
adbenitez 6d7f417233 update translations 2025-10-09 20:04:07 +02:00
adb 05ef95e757 Merge branch 'main' into adb/speedup-ci 2025-10-09 18:45:54 +02:00
adbenitez 8aa45b7bc9 speed up the PR's apk preview building 2025-10-09 16:49:29 +02:00
link2xt 7cea23caf5 Recommend Lix instead of Determinate Nix Installer
Determinate Systems server is installing its own fork of Nix
that is apparently not open source:
<https://lobste.rs/s/be78ef/dropping_upstream_nix_from_determinate#c_m3hq6r>
The company behind it also pushes the users to use FlakeHub
and has other problems.

[Lix] installer is a fork of The Determinate Nix Installer.
I uninstalled Nix preivously installed with The Determinate Nix Installer
and installed Lix, it works just the same for Android builds.

Upstream Nix would also be fine,
but it still has old installer that does not enable Flakes
and breaks on macOS on upgrades apparently,
so we cannot recommend it as the easiest way.

[Lix]: https://lix.systems/
2025-10-09 14:08:03 +00:00
adbenitez 4a2bed3e6c Merge remote-tracking branch 'upstream/main' 2025-10-09 15:39:22 +02:00
adbenitez 3aa2fbf67a Merge remote-tracking branch 'upstream/main' 2025-10-09 15:34:30 +02:00
adb c5d9471f2a Merge pull request #3936 from deltachat/adb/remove-awebp-dep
remove dependency for awebp, it is supported by Android
2025-10-09 15:01:38 +02:00
adb 5117b70c58 Merge pull request #3935 from deltachat/adb/deprecated-videochat-stock
don't set deprecated/unused stock strings
2025-10-09 14:27:54 +02:00
adbenitez da4d17aa14 remove dependency for awebp, it is supported by Android 2025-10-09 14:22:51 +02:00
adbenitez 6135813bff don't set deprecated/unused stock strings 2025-10-09 14:08:08 +02:00
adb 8547f7aab8 Merge pull request #3934 from deltachat/adb/update-calls-webapp-v0.10.0-beta
update calls webapp to v0.10.0-beta
2025-10-08 20:02:41 +02:00
adb 6dca20045c Merge branch 'main' into adb/update-calls-webapp-v0.10.0-beta 2025-10-08 19:17:17 +02:00
adbenitez 58ef777091 update calls webapp to v0.10.0-beta 2025-10-08 19:16:12 +02:00
B. Petersen 4a836b3d82 string 'Calls' not used at all 2025-10-08 19:11:09 +02:00
B. Petersen 363122fd15 clarify some strings 2025-10-08 19:11:09 +02:00
adb b751219c78 Merge pull request #3785 from deltachat/adb/integrated-videocalls
Android calls UI
2025-10-08 18:36:19 +02:00
adbenitez e586fafc54 tweak call footer's date format 2025-10-08 16:58:27 +02:00
adbenitez 2c04319c52 Merge branch 'adb/integrated-videocalls' of https://github.com/deltachat/deltachat-android into adb/integrated-videocalls 2025-10-08 16:45:55 +02:00
adbenitez f9607e4453 tweak call message-type colors 2025-10-08 16:45:17 +02:00
adb 6aec209ebc Update src/main/res/values/strings.xml
Co-authored-by: bjoern <r10s@b44t.com>
2025-10-08 14:31:33 +00:00
adbenitez 9adc9b34e5 fix string 2025-10-08 15:58:32 +02:00
adb 9267501bc1 Merge branch 'main' into adb/integrated-videocalls 2025-10-08 15:47:00 +02:00
adb 924c3f8920 Update src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java
Co-authored-by: bjoern <r10s@b44t.com>
2025-10-08 13:45:21 +00:00
adb 8f93dacbff Update src/main/res/xml/preferences_advanced.xml
Co-authored-by: bjoern <r10s@b44t.com>
2025-10-08 13:40:10 +00:00
adb a07e9312ea Merge pull request #3932 from deltachat/adb/issue-3930
process permissions result in GroupCreateActivity
2025-10-08 12:48:26 +02:00
adbenitez 79f6010d5f update changelog 2025-10-08 12:08:39 +02:00
adbenitez c5af1d4f2b process permissions result in GroupCreateActivity 2025-10-08 12:05:38 +02:00
adb 20a3820871 Merge pull request #3931 from deltachat/adb/media-preview-edge2edge
fix edge-to-edge in MediaPreviewActivity
2025-10-08 11:52:08 +02:00
adb cb0d1106b4 Merge branch 'main' into adb/media-preview-edge2edge 2025-10-08 11:19:52 +02:00
adb 291ef86a4f Merge branch 'main' into adb/integrated-videocalls 2025-10-08 11:17:40 +02:00
adb b0457bc036 Merge pull request #3925 from deltachat/adb/new-rpc-bindings
use auto-generated RPC bindings
2025-10-08 11:17:01 +02:00
adbenitez 4d7107314a fix edge-to-edge in MediaPreviewActivity 2025-10-07 19:15:07 +02:00
adbenitez 4185219088 update calls webapp to v0.9.0-beta 2025-10-07 14:32:18 +02:00
adb ef51492d0b Merge branch 'main' into adb/new-rpc-bindings 2025-10-06 18:20:00 +02:00
adbenitez 4dc10f977e update calls-webapp 0.8.0 2025-10-06 16:06:49 +02:00
adbenitez aaba52dba6 Merge branch 'adb/integrated-videocalls' of https://github.com/deltachat/deltachat-android into adb/integrated-videocalls 2025-10-06 15:51:22 +02:00
adbenitez ca4808aaca tweak strings 2025-10-06 15:51:10 +02:00
adb 66324fe914 Merge branch 'adb/new-rpc-bindings' into adb/integrated-videocalls 2025-10-06 15:49:19 +02:00
adbenitez a5f67e9d9f update core to 2.17.0 2025-10-06 15:48:22 +02:00
B. Petersen 8b5c887402 add 'Save Message' string
the string can be used for the action to put a message to 'Saved Messages'.

it will be useful esp. on desktop,
where plain 'Save' often has the mindset of 'Files',
esp. for older ppl :)
the added noun tries to break that.

additionally, desktop can resort menu items,
but that alone would not solve the issue.

there are also thoughs about renaming that alltogether,
eg. to bookmark, but that is a larger and more breaking change,
also the messages are not just 'bookmarked' on purpose,
to eg. survive auto deletion.
2025-10-03 14:33:20 +02:00
adbenitez 183cb03577 set new calls-related stock strings 2025-10-02 17:09:28 +02:00
adbenitez b1e6d59ba9 now it is CallState.Canceled not CallState.Cancelled 2025-10-02 17:05:43 +02:00
adb 33f38889c1 Merge branch 'adb/new-rpc-bindings' into adb/integrated-videocalls 2025-10-02 15:45:19 +02:00
adbenitez f97e800907 update core 2025-10-02 15:44:49 +02:00
adbenitez 21e597d09e add instructions on JSON-RPC binding generation 2025-10-02 15:28:21 +02:00
adbenitez 6b040b160d update changelog 2025-10-02 15:11:00 +02:00
adbenitez 57e5523bf3 update core to v2.16.0 2025-10-02 15:07:01 +02:00
adbenitez 874492c9ae update calls web-app 2025-10-01 16:16:52 +02:00
adbenitez 8ae6407461 add call duration to message bubble 2025-09-30 22:41:14 +02:00
adbenitez ae8ce94c00 add spaces around == 2025-09-30 22:39:37 +02:00
adbenitez 74208fff69 update CallInfo 2025-09-30 22:37:47 +02:00
adbenitez 7ace2b9baf add spaces arround == 2025-09-30 20:46:01 +02:00
adbenitez f28fffb9df update core 2025-09-30 20:07:47 +02:00
adbenitez 349e8d80c8 hide delivery status if not sending or error 2025-09-30 17:30:38 +02:00
adbenitez 4b9217e3e6 rename calls package 2025-09-30 16:29:47 +02:00
adbenitez 4e6e805ede remove unused old videochat invitation API 2025-09-30 15:59:58 +02:00
adbenitez 02a1c86f01 allow to pick call and call back by clicking call messages 2025-09-27 19:43:00 +02:00
adbenitez b28fb4ac9e update calls webapp 2025-09-27 19:36:35 +02:00
adbenitez fddc80e60b use new call_info RPC API 2025-09-27 01:09:50 +02:00
adb e5b1becf13 Merge branch 'adb/new-rpc-bindings' into adb/integrated-videocalls 2025-09-27 01:02:32 +02:00
adbenitez 01b78e37fd update src/main/java/chat/delta/rpc/types/CallState.java 2025-09-27 01:02:06 +02:00
adbenitez d0b1f36f60 fix imports, import from new Rpc package 2025-09-27 00:17:34 +02:00
adb e388464d28 Merge branch 'adb/new-rpc-bindings' into adb/integrated-videocalls 2025-09-27 00:14:07 +02:00
adbenitez afc7a04b63 revert changes in Rpc class 2025-09-27 00:13:13 +02:00
adbenitez b871e42b86 use auto-generated RPC bindings 2025-09-26 23:40:26 +02:00
adbenitez 3479233f82 offer incoming call when clicking on the notification 2025-09-26 18:00:06 +02:00
adbenitez 7e3e35a9a1 update calls-app to 0.6.0-beta 2025-09-26 17:47:35 +02:00
adbenitez 92711444e4 update calls-app to 0.6.0-beta 2025-09-26 17:25:47 +02:00
adb ec576d7159 Merge branch 'main' into adb/integrated-videocalls 2025-09-24 16:29:51 +02:00
adb 70a05221ab Merge pull request #3924 from deltachat/adb/update-workflows
update workflows and fix adding artifact link as comment to PRs
2025-09-24 16:29:27 +02:00
adbenitez 6335cfa178 update workflows and fix adding artifact link as comment to PRs 2025-09-24 15:35:55 +02:00
adbenitez ebda8c4577 hide calls button in "Saved Messages" and "Device Messages" 2025-09-24 14:23:52 +02:00
adbenitez de9a2df1b4 update DeclineCallReceiver.java 2025-09-22 18:43:20 +02:00
adbenitez a3c7e3db3d use RPC for call API 2025-09-22 18:33:59 +02:00
adbenitez 249fc829be fix constant numbering in ConversationAdapter.java 2025-09-22 17:44:27 +02:00
adb 5b62f7bf25 Merge pull request #3920 from deltachat/adb/issue-3916
improve displaying of call messages
2025-09-19 20:17:54 +02:00
adbenitez df6c858b92 improve displaying of calls messages 2025-09-19 18:44:06 +02:00
adbenitez c9816ae785 don't allow to edit call messages 2025-09-19 14:29:46 +02:00
adbenitez a24069ce3d ask for required permissions in incoming call 2025-09-17 19:27:45 +02:00
adbenitez f770f817d0 tweak preference name 2025-09-17 17:52:00 +02:00
adbenitez bee804e095 update to new calls-app's API 2025-09-12 18:59:34 +02:00
adbenitez 6b1c6b37ac add support for calls.getIceServers() and calls.getAvatar() 2025-09-12 15:59:00 +02:00
adbenitez 881e69c176 remove unused code 2025-09-11 21:58:54 +02:00
adbenitez ac6df2ff85 update changelog 2025-09-11 21:50:03 +02:00
adbenitez 7698ac5c06 some tweaks 2025-09-11 21:44:15 +02:00
adbenitez c2abe42b60 don't reject call on notification dismiss 2025-09-11 16:50:28 +02:00
adbenitez 3e95197d02 tweak calls channel 2025-09-11 16:33:15 +02:00
adbenitez 534a75feaa remove notification on accepted call 2025-09-11 13:22:21 +02:00
adbenitez 7a11234431 go back to chat after finishing call 2025-09-10 21:04:08 +02:00
adbenitez 0e91537a4d allow to decline calls and remove call notification 2025-09-10 20:47:25 +02:00
adbenitez b074bf1819 allow to answer from notification 2025-09-10 18:55:19 +02:00
adbenitez b8d2552aa8 remove unused imports 2025-09-10 16:04:55 +02:00
adbenitez 320c120a61 don't use calls integration API 2025-09-10 13:01:05 +02:00
adbenitez 6c1a3c850a tweak preview-apk workflow 2025-09-09 18:18:05 +02:00
adbenitez 7ec87f55b6 auto-accept calls for testing 2025-09-09 17:39:29 +02:00
adbenitez f6ce98f9a2 remove DC_MSG_VIDEOCHAT_INVITATION 2025-09-09 16:10:42 +02:00
adbenitez cb465ec85e remove outdated info message types 2025-09-09 15:16:56 +02:00
adbenitez 6f10a90c5f update calls webapp 0.4.0-beta 2025-09-09 14:58:05 +02:00
adb 9f439c852f Merge branch 'main' into adb/integrated-videocalls 2025-09-09 13:48:53 +02:00
adbenitez 2cc0451a8a update core 2025-09-09 13:48:40 +02:00
adb 02230d05a1 Merge pull request #3912 from deltachat/update-core-and-stuff-9/9/25
Update core to 2.13.0
2025-09-09 13:47:39 +02:00
adbenitez 9a6f6d7ea6 update strings 2025-09-09 13:45:24 +02:00
adbenitez f4cd299f70 update changelog 2025-09-09 13:35:49 +02:00
adbenitez d0358a4d0c update deltachat-core-rust to 'chore(release): prepare for 2.13.0' of 'v2.13.0' 2025-09-09 13:23:33 +02:00
adbenitez 4fc115b93d add basic notification 2025-09-09 13:22:20 +02:00
adbenitez 0157510c5d don't ask to start call 2025-09-06 21:39:06 +02:00
adbenitez 831ce19689 update core 2025-09-05 18:43:16 +02:00
adbenitez 9431e26696 end call on closing webview 2025-09-05 14:58:10 +02:00
adbenitez 9ef01dd352 add calls button 2025-09-03 16:07:19 +02:00
adbenitez 01c766db41 remove old videochat invitations 2025-09-03 16:02:09 +02:00
adb 364d15442a Merge branch 'main' into adb/integrated-videocalls 2025-09-03 14:21:53 +02:00
adb 32eefaab42 Merge pull request #3908 from deltachat/adb/issue-3893
show warning if background notifications will be unreliable
2025-09-02 18:12:46 +02:00
adb 4b8177f7f0 Merge branch 'main' into adb/issue-3893 2025-09-02 18:12:24 +02:00
B. Petersen 092a5caf8b deprecate another string 2025-09-02 18:11:39 +02:00
B. Petersen bfe4438773 deprecate some strings 2025-09-02 18:11:39 +02:00
adbenitez d251fffc07 update changelog 2025-09-02 17:37:22 +02:00
adb 180c2bc8de Merge branch 'main' into adb/issue-3893 2025-09-02 17:35:57 +02:00
adb 082815f676 Merge pull request #3910 from deltachat/adb/issue-3907
disable clone option for incoming channel
2025-09-02 17:02:07 +02:00
adbenitez 640688d774 update code to new calls app path 2025-09-02 14:59:06 +02:00
adbenitez 30868198a2 update calls webapp 2025-09-02 14:17:30 +02:00
adb 75673ef1ad Merge branch 'main' into adb/integrated-videocalls 2025-09-02 14:15:25 +02:00
adbenitez 478d937b3c tweak behavior 2025-09-02 00:01:36 +02:00
adb 7a5eb6bea6 Update src/main/res/values/strings.xml
Co-authored-by: bjoern <r10s@b44t.com>
2025-09-01 14:46:45 +00:00
adbenitez 0142d51835 update changelog 2025-09-01 16:45:51 +02:00
adbenitez 075bad3638 hide member list on incoming channels 2025-09-01 16:44:51 +02:00
adbenitez 1f173bae9b disable clone option for incoming channel 2025-09-01 16:33:52 +02:00
adbenitez 2deb61477f show warning if background notifications will be unreliable 2025-09-01 15:52:10 +02:00
adb fcc1ab1079 Merge pull request #3899 from deltachat/link2xt/nix-35
nix: update to Android platform 35
2025-08-27 17:14:25 +02:00
link2xt c72207da8a nix: update to Android platform 35 2025-08-27 00:32:50 +00:00
adb 82233d7862 Merge pull request #3898 from deltachat/adb/issue-3894
default to permanent notification if push is not possible
2025-08-26 16:26:28 +02:00
adbenitez 2547a0435c improve preference handling 2025-08-26 15:54:09 +02:00
adbenitez b6ce6d908f Merge branch 'adb/issue-3894' of https://github.com/deltachat/deltachat-android into adb/issue-3894 2025-08-26 13:24:04 +02:00
adbenitez c6bbb0a524 improve code 2025-08-26 13:23:54 +02:00
adb 826258a1be Merge branch 'main' into adb/issue-3894 2025-08-22 17:42:41 +02:00
B. Petersen 05dde13e68 update CHANGELOG 2025-08-22 17:35:32 +02:00
B. Petersen 06130c7cd8 fix initial selection 2025-08-22 17:35:32 +02:00
B. Petersen 5d7c701da8 drop disappearing messages options 1 and 30 minutes
- with the recent change to start the timer when the chat is opened,
  one minute is too easy too short to miss important information

- "30 minutes" does not really fit into the distribution;
  all other option have at least the factor 5 to the previous one,
  from "30 minutes" to "60 minutes", the time is doubled only.

removing the overall number of options and dropping the ones without larger usecases,
does not only simplifies UI;
having less tiny details also reduces noise in groups
where ppl people changing it very often for various weird reasons
(found the latter point somewhere in the Signal forum, btw)
2025-08-22 17:35:32 +02:00
adbenitez 91e898ee96 update changelog 2025-08-22 16:39:33 +02:00
adb 61e9466c59 Merge branch 'main' into adb/issue-3894 2025-08-22 16:38:37 +02:00
adbenitez 39c48d3dcd default to permanent notification if push is not possible 2025-08-22 16:36:00 +02:00
adbenitez 1c7c3f06e6 prototype with TelecomManager and ConnectionService APIs 2025-08-22 15:17:32 +02:00
B. Petersen d4ddb68137 remove deprecated strings 2025-08-20 17:47:07 +02:00
adbenitez c9ac421315 update call.html 2025-08-19 14:00:51 +02:00
adb e14bf24bb1 Merge branch 'main' into adb/integrated-videocalls 2025-08-18 15:22:52 +02:00
adb 700d11f600 Merge pull request #3889 from deltachat/adb/issue-3688
avoid superfluous error message when user cancel configuration
2025-08-18 15:12:16 +02:00
adbenitez fbb33c735c Merge branch 'adb/integrated-videocalls' of https://github.com/deltachat/deltachat-android into adb/integrated-videocalls 2025-08-18 14:58:46 +02:00
adbenitez 7cc9d7ea2f update core 2025-08-18 14:58:35 +02:00
adb ca27be240e Merge branch 'main' into adb/integrated-videocalls 2025-08-18 14:53:03 +02:00
adbenitez 8ab9b92517 update core 2025-08-18 14:47:57 +02:00
adbenitez f95b48ad6a Merge remote-tracking branch 'upstream/main' 2025-08-17 19:31:59 +02:00
adbenitez 8ebdc5414a update changelog 2025-08-17 18:33:03 +02:00
adbenitez a0e07cb2ea avoid superfluous error message when user cancel configuration 2025-08-17 18:30:22 +02:00
adb 152360d94a Merge pull request #3888 from deltachat/adb/issue-3853
fix direct share shortcuts
2025-08-16 21:31:26 +02:00
adbenitez 8513f7cd36 update changelog 2025-08-16 20:18:12 +02:00
adbenitez 17e3f3afdd fix direct share shortcuts 2025-08-16 20:10:53 +02:00
adb 7d7f62dae1 Merge pull request #3814 from deltachat/adb/issue-3795
target SDK 35 and implement edge-to-edge
2025-08-16 19:24:50 +02:00
adb 2bd0a0d935 Merge branch 'main' into adb/issue-3795 2025-08-16 17:08:37 +02:00
B. Petersen cf0414dd66 update CHANGELOG 2025-08-16 17:02:41 +02:00
B. Petersen 5fbd065882 improve info messages for dark theme
this improves readability of info messages
by setting the foreground to while.
`universal_overlay` was made for that;
it is in use like that on iOS/desktop since a long time.

moreover, other parts using the combination of
`conversation_item_update_bg_color`/`conversation_item_update_text_color`
are improved equally, eg. the day titles.
2025-08-16 17:02:41 +02:00
adb 5982a9dd8f Merge branch 'main' into adb/issue-3795 2025-08-16 16:15:59 +02:00
adbenitez 4b20e3f41f update changelog 2025-08-16 16:15:23 +02:00
adb ac8d8886cc Merge pull request #3885 from deltachat/link2xt/build-tools-35
Update Android SDK Build Tools to 35.0.0 in flake.nix
2025-08-16 16:13:58 +02:00
adbenitez a803d472bf don't use setStatusBarColor 2025-08-16 03:19:37 +02:00
adbenitez 396ed14067 adapt activities to edge-to-edge 2025-08-16 02:10:02 +02:00
adbenitez 5faea5e40a revert empty line 2025-08-15 23:24:19 +02:00
adbenitez 08bb248919 revert status bar color hack 2025-08-15 23:23:02 +02:00
link2xt 30dd7a9c33 Update Android SDK Build Tools to 35.0.0 in flake.nix
Since buildToolsVersion is not specified in `build.gradle`,
default version is set by Android Gradle Plugin.
Gradle plugin was updated in a77b1a5dd6,
so build tools version should be updated in flake.nix
to the corresponding version, otherwise building
fails while trying to install 35.0.0 into
read-only path managed by Nix.
2025-08-14 16:13:49 +00:00
adb 28f57a2ccb Merge branch 'main' into adb/issue-3795 2025-08-14 16:25:04 +02:00
adbenitez c0717237ad Merge remote-tracking branch 'upstream/main' 2025-08-13 16:28:56 +02:00
adb 5716372453 Merge pull request #3884 from deltachat/prep-2.11.0
prepare 2.11.0
2025-08-13 14:45:56 +02:00
adbenitez d362cf4467 bump version 2025-08-13 14:45:06 +02:00
adb 56118d3732 Merge pull request #3883 from deltachat/imgbot
[ImgBot] Optimize images
2025-08-13 14:00:48 +02:00
adb a03f51f7c5 Merge pull request #3875 from deltachat/adb/issue-3874
avoid NPE in DecryptableUri
2025-08-13 13:56:49 +02:00
ImgBotApp 6cf59133c2 [ImgBot] Optimize images
*Total -- 3,963.23kb -> 2,946.99kb (25.64%)

/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png -- 981.79kb -> 657.29kb (33.05%)
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png -- 481.97kb -> 350.50kb (27.28%)
/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png -- 357.58kb -> 272.44kb (23.81%)
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png -- 967.63kb -> 750.70kb (22.42%)
/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png -- 1,174.26kb -> 916.06kb (21.99%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2025-08-13 11:56:18 +00:00
adb ef8d833f5e Merge branch 'main' into adb/issue-3874 2025-08-13 13:55:37 +02:00
adb b110c1f91e Merge pull request #3467 from deltachat/adb/issue-3437
add "After 1 year" option to disappearing messages
2025-08-13 13:55:04 +02:00
adbenitez e53a1f0b22 update changelog 2025-08-13 13:54:41 +02:00
adb 5a5cbfceb7 Merge branch 'main' into adb/issue-3437 2025-08-13 13:47:42 +02:00
adb 57a557a9b4 Merge pull request #3882 from deltachat/update-core-and-stuff-13/8/25
update core to 2.11.0
2025-08-13 13:45:20 +02:00
adbenitez 2328bf1e2a update translations 2025-08-13 13:44:34 +02:00
adbenitez ce4c9aaba0 update changelog 2025-08-13 13:18:54 +02:00
adbenitez 71a2cb7a5b update deltachat-core-rust to 'chore(release): prepare for 2.11.0' of 'v2.11.0' 2025-08-13 13:11:36 +02:00
adb 79462c0596 Merge branch 'main' into adb/issue-3795 2025-08-12 17:16:36 +02:00
adb 68f5d1ae27 Merge pull request #3881 from deltachat/adb/dont-use-android.R.id.content
don't use android.R.id.content
2025-08-12 16:34:31 +02:00
adbenitez 77caced5ed don't use android.R.id.content 2025-08-12 15:56:25 +02:00
adb 88a4f99cf8 Merge branch 'main' into adb/issue-3795 2025-08-12 15:19:37 +02:00
B. Petersen 42544fd447 update translations 2025-08-12 14:57:13 +02:00
adb 5ff869cd4a Merge pull request #3879 from deltachat/adb/issue-3878
call dcContext.deleteMsgs() in background thread
2025-08-09 16:35:00 +02:00
adbenitez 4af1666a31 call dcContext.deleteMsgs() in background thread 2025-08-09 16:01:46 +02:00
adbenitez 786fd3f47d avoid NPE in DecryptableUri 2025-08-09 15:24:02 +02:00
adb a0d9315ff4 Merge pull request #3873 from deltachat/adb/improve-screenshots
update screenshots
2025-08-09 00:51:07 +02:00
adbenitez 86954a3c42 update screenshots 2025-08-09 00:15:05 +02:00
adb f136b6d7d1 Merge branch 'main' into adb/issue-3795 2025-08-08 15:44:23 +02:00
adbenitez 9e4b744046 set ephemeral timer stock strings for 1 year 2025-08-08 15:36:24 +02:00
adb 8db4604224 Merge branch 'main' into adb/issue-3437 2025-08-08 15:12:01 +02:00
adb 43f9094c04 Merge pull request #3872 from deltachat/r10s/allow-cloning-email-chats
allow to clone email chats
2025-08-08 15:08:56 +02:00
adb 1217e65889 Merge branch 'main' into adb/issue-3437 2025-08-08 15:08:28 +02:00
adb d8eaf0ad4b Merge branch 'main' into adb/issue-3795 2025-08-08 15:04:52 +02:00
adb 4fbb8d2b78 Merge branch 'main' into r10s/allow-cloning-email-chats 2025-08-08 14:50:06 +02:00
adb 7cebd04086 Merge pull request #3867 from deltachat/adb/issue-3608
make apk builds more reproducible
2025-08-08 14:33:22 +02:00
adb b584fdfd89 Merge pull request #3870 from deltachat/adb/issue-3782
improve group image quality
2025-08-08 14:32:51 +02:00
B. Petersen db35fef6db update CHANGELOG 2025-08-08 13:39:15 +02:00
B. Petersen 068102a0d8 allow to clone email chats
this was disallowed at a time where we had no api
to create ad-hoc "new email" chats
2025-08-08 13:36:00 +02:00
adb 02ff8a2a6b Merge branch 'main' into adb/issue-3608 2025-08-08 13:03:28 +02:00
adbenitez 321b5a223b fix comment for 1 year value 2025-08-08 00:42:29 +02:00
adb ab7fd960ca Merge branch 'main' into adb/issue-3437 2025-08-08 00:38:46 +02:00
adbenitez dec685023e use same max. avatar size for groups and profiles, remove superflous class 2025-08-08 00:17:30 +02:00
adbenitez 168d2ae16c improve group image quality 2025-08-07 23:59:05 +02:00
adb e55249182a Merge pull request #3869 from deltachat/adb/update-deps-6/8/25
remove some dependecies and upgrade others
2025-08-07 23:50:43 +02:00
adbenitez 0966487978 pin firebase version 2025-08-07 23:14:06 +02:00
adbenitez fd057485db remove com.annimon:stream dependency 2025-08-07 17:45:01 +02:00
adbenitez a68f3a7024 remove dependecy on com.pnikosis:materialish-progress 2025-08-06 19:40:47 +02:00
adbenitez 1dad6ebf8a remove unused me.leolin:ShortcutBadger and com.jpardogo.materialtabstrip:library 2025-08-06 19:39:49 +02:00
adbenitez a77b1a5dd6 update gradle and some deps 2025-08-06 19:38:41 +02:00
adbenitez c0a65e2e9f properly set the pre-selected option 2025-08-06 15:48:27 +02:00
adbenitez 82ef0560a5 change to 1 year 2025-08-06 15:19:40 +02:00
adb 9166b2a42a Merge branch 'main' into adb/issue-3437 2025-08-06 15:01:14 +02:00
adb 2ef3811a56 Merge branch 'main' into adb/issue-3795 2025-08-06 14:47:41 +02:00
adb 1b91c1c482 Merge branch 'main' into adb/issue-3608 2025-08-06 14:47:13 +02:00
adbenitez 0d8962f76c make apk builds more reproducible 2025-08-06 14:45:25 +02:00
adb e98535418c Merge pull request #3865 from deltachat/adb/issue-3860
update screenshots
2025-08-06 14:06:45 +02:00
adbenitez 5eb9065d89 update screenshots 2025-08-05 18:35:08 +02:00
adb 9e70c43ab8 Merge pull request #3862 from deltachat/prep-2.10.0
Prepare 2.10.0
2025-08-05 12:37:28 +02:00
adbenitez fc8bfabeb2 update changelog 2025-08-05 11:56:40 +02:00
adbenitez 681c22293f update version number 2025-08-05 11:51:14 +02:00
adb bed8d511fe Merge pull request #3861 from deltachat/update-core-and-stuff-5/8/25
Update core to 2.10.0
2025-08-05 11:49:15 +02:00
adbenitez eeeb686868 update strings 2025-08-05 11:33:38 +02:00
adbenitez 76dda10a31 update changelog 2025-08-05 11:26:33 +02:00
adbenitez 6a7c4f24e9 update deltachat-core-rust to 'chore(release): prepare for 2.10.0' of 'v2.10.0' 2025-08-05 11:22:29 +02:00
adb 8cdfafd7c3 Merge pull request #3859 from deltachat/hoc/lookup-key-contacts-too
fix: Lookup key contacts by addr when clicking on a link
2025-08-05 11:20:46 +02:00
Hocuri 1c6faeac04 fix: Lookup key contacts by addr when clicking on a link
Companion PR to https://github.com/chatmail/core/pull/7073
2025-08-04 16:02:39 +02:00
adbenitez 7ecf0a7daa Merge remote-tracking branch 'upstream/main' 2025-08-03 00:25:01 +02:00
adb b2bf7e8ae7 Merge pull request #3858 from deltachat/adb/issue-3850
share address for email contacts
2025-08-02 22:24:15 +00:00
adbenitez 0a34456302 update changelog 2025-08-02 21:51:10 +02:00
adb 3ebcc1dd99 Merge branch 'main' into adb/issue-3850 2025-08-02 19:50:24 +00:00
adb ff7df0e1e6 Merge pull request #3856 from deltachat/adb/issue-3855
don't enlarge avatars for special chats
2025-08-02 19:49:42 +00:00
adbenitez 68cd070b98 share address for email contacts 2025-08-02 21:48:58 +02:00
adb 8ff8cffa15 Merge branch 'main' into adb/issue-3855 2025-08-02 19:31:59 +00:00
adb dc216feb30 Merge pull request #3857 from deltachat/adb/fix-changelog-typos-2/8/25
fix typos in changelog
2025-08-02 19:31:21 +00:00
adbenitez 84fc885617 fix typos in changelog 2025-08-02 21:30:31 +02:00
adbenitez 72bcbe80c0 update changelog 2025-08-02 21:27:49 +02:00
adbenitez b4ed26b842 don't enlarge avatars for special chats 2025-08-02 21:25:45 +02:00
adb 7be6b0a1ee Merge pull request #3854 from deltachat/adb/fix-archived-link-item
fix archived link item's layout
2025-08-01 18:17:43 +00:00
adbenitez 9a2fdcdcbd update changelogC 2025-08-01 19:42:48 +02:00
adbenitez e81960f98a fix "Archived" item's layout in chatlit 2025-08-01 19:41:49 +02:00
adbenitez a37fcfcaf7 Merge remote-tracking branch 'upstream/main' 2025-07-31 23:14:46 +02:00
adb fd4a377752 Merge pull request #3852 from deltachat/prep-2.9.0
prepare 2.9.0
2025-07-31 19:45:21 +00:00
adbenitez d40652d394 prepare 2.9.0 2025-07-31 21:44:18 +02:00
adb aacca5531c Merge pull request #3851 from deltachat/update-core-and-stuff-31/7/25
update to core v2.9.0
2025-07-31 19:17:39 +00:00
adbenitez 51cb844e63 update strings 2025-07-31 21:17:09 +02:00
adbenitez ef0b8efcfa update changelog 2025-07-31 21:13:53 +02:00
adbenitez 3e943483da update deltachat-core-rust to 'chore(release): prepare for 2.9.0' of 'v2.9.0' 2025-07-31 21:10:26 +02:00
adb a9013bb574 Merge pull request #3846 from deltachat/adb/issue-3841
improve footer layout
2025-07-31 19:09:07 +00:00
adbenitez aa5fcb139e update changelog 2025-07-31 17:00:00 +02:00
adb c526c42d19 Merge branch 'main' into adb/issue-3841 2025-07-31 14:56:54 +00:00
adb f66003c6b1 Merge pull request #3847 from deltachat/adb/disable-edit-on-classic-email
improve classic email threads/chats UX
2025-07-31 14:56:31 +00:00
adbenitez cc64142e7b don't enlage email chats avatar placeholder 2025-07-31 16:47:58 +02:00
adbenitez a280407370 update changelog 2025-07-31 16:26:44 +02:00
adb dda5efedc4 Merge branch 'main' into adb/issue-3841 2025-07-31 14:21:14 +00:00
adb 1cd4ec1ec9 Merge branch 'main' into adb/disable-edit-on-classic-email 2025-07-31 14:17:58 +00:00
adb 1a8b905071 Merge pull request #3848 from deltachat/adb/issue-3845
hide address in search results
2025-07-31 14:17:43 +00:00
adbenitez de13a70c66 update changelog 2025-07-31 16:17:15 +02:00
adb 2caa98e08a Merge branch 'main' into adb/issue-3841 2025-07-30 21:54:32 +00:00
adb ba997d9f71 Merge branch 'main' into adb/disable-edit-on-classic-email 2025-07-30 21:54:20 +00:00
B. Petersen 3985f2f468 remove stock strings no longer in use 2025-07-30 23:49:39 +02:00
adbenitez 86bd38bdad hide address in search results 2025-07-30 23:49:36 +02:00
adbenitez ffa1c69be2 improve code efficiency 2025-07-30 23:37:54 +02:00
adbenitez 3a3388ed59 disable non-functional disappearing timer option for email threads 2025-07-30 23:37:16 +02:00
adbenitez 8c04c199e6 disable editing messages on classic email threads 2025-07-30 23:30:59 +02:00
adbenitez ecdbbed8c1 improve footer layout 2025-07-30 23:22:51 +02:00
adbenitez e6f4a616fb Merge remote-tracking branch 'upstream/main' 2025-07-28 22:55:43 +02:00
adb 68f270eea3 Merge pull request #3844 from deltachat/prep-2.8.0
prepare 2.8.0
2025-07-28 20:44:37 +00:00
adbenitez 52aeec8d17 update version number 2025-07-28 22:44:01 +02:00
adb bdcaffde3d Merge pull request #3843 from deltachat/update-core-and-stuff-28/7/25
Update to core 2.8.0
2025-07-28 20:32:27 +00:00
adbenitez d19dcb41ec update translations 2025-07-28 22:31:11 +02:00
adbenitez 5525cfa5a9 update changelog 2025-07-28 22:01:46 +02:00
adbenitez 8715e9eba2 update deltachat-core-rust to 'chore(release): prepare for 2.8.0' of 'v2.8.0' 2025-07-28 21:58:11 +02:00
adbenitez 3cc58c2a0f update readme 2025-07-25 01:12:57 +02:00
adbenitez 5cc5a80990 Merge remote-tracking branch 'upstream/main' 2025-07-24 18:43:44 +02:00
adb 52c0197682 Merge pull request #3837 from deltachat/update-to-core-2.6.0
prepare 2.6.0
2025-07-23 16:07:40 +00:00
adbenitez c75adbe93c update strings 2025-07-23 15:55:02 +02:00
adbenitez f16c59897d update version number 2025-07-23 15:54:44 +02:00
adbenitez 636235148f update deltachat-core-rust to 'chore(release): prepare for 2.6.0' of 'v2.6.0' 2025-07-23 15:51:58 +02:00
adb 46226a7ab5 Merge pull request #3835 from deltachat/prep-2.5.0
prepare 2.5.0
2025-07-22 20:06:40 +00:00
adbenitez f11ae0a5ff prepare 2.5.0 2025-07-22 17:35:42 +02:00
adb 2264e1bf22 Merge pull request #3834 from deltachat/adb/issue-3827
don't show "delete for everyone" in unencrypted chats
2025-07-22 15:33:24 +00:00
adbenitez c095510a42 don't show "delete for everyone" in unnecrypted chats 2025-07-22 16:56:25 +02:00
adbenitez fe6838e315 Merge remote-tracking branch 'upstream/main' 2025-07-22 16:47:51 +02:00
adb 6dbbdae2df Merge pull request #3833 from deltachat/adb/update-core-2.5.0
update core to v2.5.0
2025-07-22 14:46:04 +00:00
adbenitez a5070c879a update changelog 2025-07-22 16:45:45 +02:00
adbenitez 1bbf352c4c update deltachat-core-rust to 'chore(release): prepare for 2.5.0' of 'v2.5.0' 2025-07-22 16:37:58 +02:00
adbenitez 011ba4595b Merge remote-tracking branch 'upstream/main' 2025-07-22 16:08:45 +02:00
adb 10345ab8c3 Merge pull request #3818 from deltachat/adb/tune-down-fetchworker
don't use FetchWorker if we have push notifications
2025-07-22 13:36:08 +00:00
adb b5d0878511 Merge pull request #3832 from deltachat/update-core-and-stuff-22.7.25
Update core to 2.4.0
2025-07-22 13:35:37 +00:00
adbenitez 8a393ad274 update translations 2025-07-22 15:29:41 +02:00
adbenitez 84e8be9776 update changelog 2025-07-22 15:05:05 +02:00
adbenitez da6aa901ca update deltachat-core-rust to 'chore(release): prepare for 2.4.0' of 'v2.4.0' 2025-07-22 15:03:19 +02:00
adb 8b52a99327 tune down green checkmark (#3828)
* remove green checkmarks from chatlist

* remove green checkmark from contact lists

* remove green checkmark from chat-protected info-message (DC_INFO_PROTECTION_ENABLED)

* remove green checkmark from profile title

* add green checkmark to "Introduced by..." line

* when tapping chat-protected or chat-e2ee info-message, open help at #e2ee

* update changelog

* Update CHANGELOG.md

Co-authored-by: Hocuri <hocuri@gmx.de>

* add verified checkmark when verifier is unknown but contact is verified

* Update CHANGELOG.md

---------

Co-authored-by: Hocuri <hocuri@gmx.de>
Co-authored-by: bjoern <r10s@b44t.com>
2025-07-22 14:21:59 +02:00
B. Petersen 9c6271b1d1 update translations 2025-07-22 14:18:39 +02:00
B. Petersen 8564259787 update local help 2025-07-22 14:18:39 +02:00
B. Petersen 9e7ee3170e message about moved profile-switch no longer needed 2025-07-22 00:50:41 +02:00
B. Petersen b2cdff820a deprecate some stock strings; none of them are in use in core any longer 2025-07-22 00:50:41 +02:00
adbenitez f1789950a6 Merge remote-tracking branch 'upstream/main' 2025-07-20 21:29:15 +02:00
adb 0bc8750984 Merge pull request #3826 from deltachat/prep-2.3.0-beta
bump version
2025-07-20 19:18:18 +00:00
adbenitez 6351bcc11e bump version 2025-07-20 21:17:16 +02:00
adb 66ae731a37 Merge pull request #3825 from deltachat/adb/update-translations-20-07-25
update translations and changelog
2025-07-20 19:13:27 +00:00
adbenitez cc1fd53021 update translations and changelog 2025-07-20 21:11:07 +02:00
adbenitez 3937f0e149 remove unnecessary "force encryption" 2025-07-20 20:23:02 +02:00
adbenitez 2839250011 don't show last seen for saved messages and device chats 2025-07-20 01:15:27 +02:00
adbenitez 5844563de4 update core 2025-07-19 19:55:25 +02:00
adbenitez a8698a03df update scripts 2025-07-19 19:53:53 +02:00
adbenitez 6a6044c77d improve profile 2025-07-19 19:52:12 +02:00
adbenitez 2a0be883c2 Merge remote-tracking branch 'upstream/main' 2025-07-19 16:44:15 +02:00
B. Petersen 5ff8101c2c replace 'half blocked' by 'contact request' 2025-07-19 15:02:52 +02:00
B. Petersen 9e87a4b2a8 allow tapping new e2ee-info-messages; remove outdated protection-broken path 2025-07-19 15:02:52 +02:00
B. Petersen 9740921f25 update translations 2025-07-19 15:01:34 +02:00
B. Petersen de2892a4c2 update deltachat-core-rust to 'chore(release): prepare for 2.3.0' of 'v2.3.0' 2025-07-19 15:01:34 +02:00
adb c344b18326 add device message (#3820)
* add device message

* apply tweaks of @hpk42 and @hocuri

* change two emojis, donate as discussed and 🔲 instead of ⌘ which is known as a keyboard shortcut symbol, at least on mac, and adds confusion

---------

Co-authored-by: B. Petersen <r10s@b44t.com>
2025-07-19 14:47:26 +02:00
B. Petersen 54d2516f6c add string 'E-Mail' 2025-07-18 13:32:49 +02:00
B. Petersen 8f61bec805 update translations 2025-07-18 13:32:49 +02:00
B. Petersen 107fe00afa simplify e2ee strings
as discussed with @hpk42, we want to simplify the terms used in UI,
as there is no switch-forth-and-back, the "from now on" is superfluous,
and the "guaranteed" at least noisy and raises questions.

also, this allows us to use the same string when establishing via vcard contacts,
which is a good thing to move forward just now.

the faq will explain nuances then
2025-07-16 23:57:58 +02:00
adbenitez 8642563c86 don't use FetchWorker if we have push notifications 2025-07-16 18:51:57 +02:00
adb c9d4d2bdbc Merge pull request #3815 from deltachat/adb/allow-to-create-new-unencrypted-group
Add new option to create unencrypted email thread
2025-07-16 14:16:04 +00:00
adbenitez 83f5d0793a hide "add contact manually" from "new chat" screen and from group memeber selection 2025-07-16 15:47:27 +02:00
adbenitez 16dd79aa9a hide edit pencil when enlarging avatar of unencrypted group 2025-07-15 22:03:55 +02:00
adbenitez d7c3303cec allow to create new unencrypted group 2025-07-15 22:03:31 +02:00
adbenitez a9541a936e implement edge-to-edge 2025-07-15 17:43:32 +02:00
adb 54f2d2e991 Merge pull request #3810 from deltachat/adb/account-move-to-top
allow to "move to top" accounts in the accounts list
2025-07-15 15:38:37 +00:00
adb 8daaa45aa3 Merge branch 'main' into adb/account-move-to-top 2025-07-15 15:38:24 +00:00
bjoern fa40d4fb44 make donate device message translatable (#3813)
* make donate device message translatable

* update CHANGELOG

* Update CHANGELOG.md

Co-authored-by: Hocuri <hocuri@gmx.de>

* Update src/main/res/values/strings.xml

---------

Co-authored-by: Hocuri <hocuri@gmx.de>
2025-07-14 11:25:45 +02:00
B. Petersen a26ce76964 update translations 2025-07-13 14:05:48 +02:00
B. Petersen 2e798c5b04 add strings missing for 'new email' 2025-07-13 14:05:48 +02:00
adbenitez 9104971baa update changelog 2025-07-12 01:13:37 +02:00
adbenitez 3d6dc80d8a update deltachat-core-rust to 'chore(release): prepare for 2.1.0' of 'v2.1.0' 2025-07-12 01:12:13 +02:00
adbenitez 410072358d temporarily check core's main branch with "set_accounts_order" support 2025-07-11 16:01:32 +02:00
adbenitez 1d7d0dd329 allow to "move to top" accounts in the account selector 2025-07-11 16:01:10 +02:00
adb 15ed570dce Merge pull request #3809 from deltachat/adb/prep-1.59.0
update version number
2025-07-10 20:35:43 +00:00
Hocuri 90cf75421b fix: Small channel fixes (#3807)
* fix: Small channel fixes

- In the profile view of an InBroadcast, the subtitle said "Contact".
  I just removed the subtitle, because it already says "Channel" at the
  top.
- When tapping on the avatar of an InBroadcast, an "Edit" button was shown

* fix: Also disable edit button for mailinglists
2025-07-10 19:30:52 +02:00
adbenitez a8aecea814 update version number 2025-07-10 18:33:55 +02:00
adb fcf98ab7e9 Merge pull request #3808 from deltachat/adb/update-strings
update strings and local help
2025-07-10 16:32:35 +00:00
adbenitez e1d6b8f3b8 update strings and local help 2025-07-10 18:05:41 +02:00
bjoern 629532a996 Update translations 2025 07 10 (#3806)
* pull translations

* update channel hint as discussed

* add some more translator hints

* pull again after uploading new strings
2025-07-10 13:45:14 +02:00
B. Petersen 36798a2f57 fix profile's edit display
this was lost on merging main to channels-pr at
https://github.com/deltachat/deltachat-android/pull/3783/files#diff-4e3273297b4c47b24d3616a9030a5c2de21519ebcfc0c6d5e49c6ded45476a72L117
2025-07-10 13:03:26 +02:00
Hocuri 717777f628 Show channels in a proper "Channel" chat (#3783)
* Rename "broadcast list" to "channel"/"broadcast channel" both in UI and code

* feat: Add new channel types

* Update CHANGELOG.md

* adb's review

* refactor: Rename BroadcastChannel to Broadcast

* Revert accidental change

* Make it possible to leave channels

- In a chat, if the chat is an InBroadcast, and it's not a contact
  request, then the `Leave` menu option is shown with the translated
  stock string `menu_leave_channel` as its label.
- If the user clicks on it, the confirmation dialog has
  `menu_leave_channel` (rather than `menu_leave_group`) as its positive
  option.

Counterpart of https://github.com/chatmail/core/pull/6984.

---------

Co-authored-by: adbenitez <asieldbenitez@gmail.com>
Co-authored-by: adb <adb@merlinux.eu>
2025-07-10 10:32:04 +02:00
adbenitez 5af2d4fa8f Merge remote-tracking branch 'upstream/main' 2025-07-09 23:51:26 +02:00
adb 23d521beed Merge pull request #3793 from deltachat/adb/pgp-contacts2
adapt to new key-contacts
2025-07-09 21:07:00 +00:00
adb b699451c2a Update CHANGELOG.md
Co-authored-by: Hocuri <hocuri@gmx.de>
2025-07-09 20:34:53 +00:00
adbenitez fa6fad5787 update changelog 2025-07-09 22:20:49 +02:00
adbenitez ab641df8f9 update core to 2.0.0 2025-07-09 22:13:08 +02:00
adbenitez 90ced3efb0 Merge remote-tracking branch 'origin/main' into adb/pgp-contacts2 2025-07-09 17:36:10 +02:00
B. Petersen 0d50af1aa5 mailinglist profile: addr in subtitle, no members
this is follow up for #3792 and does the same as before -
showing no members for mailinglists and showing its address in the subtitle
2025-07-09 17:32:27 +02:00
adbenitez 7f982e6302 update core 2025-07-08 23:24:01 +02:00
adb 0ba20e9fc8 Merge branch 'main' into adb/pgp-contacts2 2025-07-08 21:20:15 +00:00
adb cf0df03d9f Merge pull request #3803 from deltachat/adb/issue-3798
modify QR icon
2025-07-08 21:19:34 +00:00
adbenitez 111629ace2 Merge remote-tracking branch 'upstream/main' 2025-07-08 22:14:42 +02:00
adbenitez 8afe5739a8 Merge commit '466329995' 2025-07-08 22:13:38 +02:00
adbenitez b9520c95ed Merge branch 'main' into adb/pgp-contacts2 2025-07-08 18:08:51 +02:00
adb 1cf01c6414 Merge branch 'main' into adb/issue-3798 2025-07-08 15:21:49 +00:00
bjoern 98d5259d0e tweak new profile (#3800)
* adapt divider to style used elsewhere

* offer copy-to-clipboard on long-tap address

* Revert "offer copy-to-clipboard on long-tap address"

This reverts commit 92570b8e1ef5898b99a9a2769eea0e1e16bf25e1.

* show copy-context menu on long pressing address
2025-07-08 05:27:42 +02:00
adb 0945696450 Merge pull request #3802 from deltachat/adb/issue-3801
hidde "chats in common" header when no chats in common
2025-07-07 23:20:27 +00:00
adbenitez 59ec5826aa update changelog 2025-07-07 18:39:51 +02:00
adbenitez e6415abda2 modify QR icon 2025-07-07 17:42:16 +02:00
adbenitez f9885fbcad hidde "chats in common" header when no chats in common 2025-07-07 17:30:45 +02:00
bjoern 4663299951 re-focus profile (#3792)
* duplicate ProfileActivity to AllMediaActivity

* update CHANGELOG

* remove profile stuff from AllMediaActivity

* remove media stuff from ProfileActivity

* remove TabLayout from ProfileActivity

* decouple header from viewType

* easier name editing

* add link to 'apps & media'

* move bio up

* move 'send message' up

* prepare avatar/title/subtitle

* set title

* set subtitle to member count

* add address to profile

* rename ProfileSettings* to just Profile*

* set avatar

* use avatar view

* adaptive avatar cell height

* no endless growing of online-indicator

* simplify

* handle tap on avatars

* rename Profile* to AllMedia*

* set title accordingly

* move 'last seen' up

* edit name by tapping

* Revert "edit name by tapping"

This reverts commit 6727b168302fbe50cbde803fbc83692965d3df59.

Reason is that it introduces uncertainity what happens if the name is tapped -
we do not want to nudge ppl to edit the group name in a similar way.

we may revert this revert,
but for now, let's see if the icon atop isn't sufficient.

* add media count

* space below avatar

* refactor allmedia viewtypes

* select the first tab that has content

* format footer

* remove unused headers

* space above header

* add dividers

* tweak some spacings

* tap on avatar only for enlarge/set avatar

* immediate view of first tap

* tweak value display

* add icons to buttons

* tweak paddings

* no address for self-talk and device-chat

* use signature background for less cluttered UI

* avoid global state modification and showing eg. app-icon tinted also elsewhere

* tweak sizes

* move introduced-by/server down. these information become less important the more chats you have with the contact - and otherwise just clutter UI

* update CHANGELOG

* typo

* use more normal font and spacing for footer

* open "media" deterministically

remove the smart forwarding to "tab with content",
which results in unclear behaviour.

also, we want to push for apps,
which is also the thing that really changes.
when searching for an image, another tap is fine.
2025-07-05 11:16:30 +02:00
adbenitez 0ee08fee42 update core 2025-06-30 20:49:50 +02:00
adbenitez bd8698c3f3 add DcContact.isKeyContact() 2025-06-30 18:58:28 +02:00
adbenitez 0f694876f5 update core submodule 2025-06-27 00:39:10 +02:00
adbenitez 55ea8bbbce Merge branch 'adb/pgp-contacts2' of https://github.com/deltachat/deltachat-android into adb/pgp-contacts2 2025-06-25 14:47:12 +02:00
adbenitez ae2c152382 don't allow to edit mailinglist name
it will get reset on next incoming message anyways
2025-06-25 14:45:22 +02:00
adbenitez 825ee6a79e don't allow to leave email threads 2025-06-25 14:45:05 +02:00
adb edd7938497 Merge branch 'main' into adb/pgp-contacts2 2025-06-24 18:13:01 +00:00
adbenitez f0d62f41c9 show email address for email contacts 2025-06-24 20:12:37 +02:00
adbenitez b5e7f13819 don't allow to edit or clone email threads 2025-06-24 20:05:18 +02:00
adbenitez 9a1c6ce2ad don't show email icon on pending downloads 2025-06-24 18:01:52 +02:00
adbenitez 966d8784f3 adapt to new PGP-contacts 2025-06-24 17:46:51 +02:00
adbenitez 571f49ab13 revert meeting change 2025-06-20 19:04:42 +02:00
adbenitez 365f1dbbe6 basic call 2025-06-20 18:56:45 +02:00
adbenitez 100bb06e20 Merge remote-tracking branch 'origin/r10s/call-api' into adb/integrated-videocalls 2025-06-20 18:54:58 +02:00
adbenitez 27f662707a fix VideochatUtil 2025-06-19 17:20:46 +02:00
adbenitez 3086c72304 undo temporary test 2025-06-19 17:17:53 +02:00
B. Petersen eee218a3b6 add call api 2025-06-19 00:48:59 +02:00
adbenitez fa868077b0 test integrated webxdc 2025-06-18 17:41:09 +02:00
adb e8776177ba Merge branch 'main' into adb/integrated-videocalls 2025-06-18 15:28:04 +00:00
bjoern 9caf94d035 add some DeltaTouch specific strings (#3788)
* add some DeltaTouch specific strings

* typo
2025-06-13 16:43:49 +02:00
B. Petersen 7593ec1831 reword 'Shared Chats' to 'Chats in Common' 2025-06-12 19:36:30 +02:00
adb 677c0592fc Merge branch 'main' into adb/integrated-videocalls 2025-06-12 12:57:07 +00:00
adb 0cc58006ba Merge pull request #3786 from deltachat/adb/improve-reactions-dialog
allow to react with same emoji as others
2025-06-12 12:56:47 +00:00
adbenitez 60e3f475de update build.gradle 2025-06-10 17:45:34 +02:00
adbenitez 8f47783aaf update core 2025-06-10 17:11:34 +02:00
adbenitez a521974b3b Merge remote-tracking branch 'upstream/adb/integrated-videocalls' 2025-06-10 17:10:17 +02:00
adbenitez 2aa71e3eb2 Merge remote-tracking branch 'upstream/adb/improve-reactions-dialog' 2025-06-10 16:35:06 +02:00
adbenitez 005cf835a1 allow to react with same emoji as others 2025-06-10 16:28:56 +02:00
adbenitez 5fb61b008b set name when joining call 2025-06-10 16:05:56 +02:00
adbenitez dd93de3833 improve the videocalls: open in internal webview 2025-06-10 15:20:34 +02:00
adbenitez a13e31a5f7 don't register to open arbitrary files and links 2025-06-10 12:58:20 +02:00
adbenitez 3d891d07a9 undo unnecessary changes 2025-06-10 12:58:04 +02:00
adb bd3c4f9186 Merge pull request #3780 from deltachat/adb/webxdc-tts
add Web API's TTS support to webxdc
2025-05-31 10:46:24 +00:00
adbenitez f4f0df3adb Merge remote-tracking branch 'upstream/adb/webxdc-tts' 2025-05-27 16:08:21 +02:00
adbenitez 6fbe5e2f56 update core 2025-05-27 16:07:30 +02:00
adbenitez edeec415a1 Merge remote-tracking branch 'upstream/main' 2025-05-27 16:05:23 +02:00
adbenitez 90350729d5 Merge branch 'adb/webxdc-tts' of https://github.com/deltachat/deltachat-android into adb/webxdc-tts 2025-05-26 17:40:44 +02:00
adbenitez 7ae4cd4dd3 update changelog 2025-05-26 17:40:03 +02:00
adbenitez 0b50dd445f update changelog 2025-05-26 17:39:01 +02:00
adb bd40f4eb04 Merge branch 'main' into adb/webxdc-tts 2025-05-26 15:38:26 +00:00
adbenitez cfdfab1716 check if lang is empty 2025-05-26 17:37:06 +02:00
adbenitez f8d0fd3f77 update webxdc.js 2025-05-26 17:33:47 +02:00
adbenitez 7186afa321 add Web API's TTS support to webxdc 2025-05-26 17:31:47 +02:00
B. Petersen 201f6e46b0 remove 'metadata' folder again
the 'metadata' folder was already removed at
https://github.com/deltachat/deltachat-android/pull/3211/files ,
however then re-created with unimportant files by weblate,
cmp. https://github.com/deltachat/deltachat-android/issues/3414

as the latter seems to be no longer the case,
remove the folder again and see if it stays away now :)
2025-05-25 11:51:14 +02:00
Yurt Page 813d4324f7 README.md: add link Transifex translations 2025-05-25 11:05:33 +02:00
B. Petersen 27875b83bc unify singular/plural in attach menu
also otherwise, we say "[attach] Contact", "[attach] File", "[attach] Video" etc. -
so it should be "[attach] App" as well.

this is also what desktop/iOS are doing.

the title in the app picker itself, however,
is fine with reading "Apps" - it shows multiple ones
2025-05-24 16:26:08 +02:00
B. Petersen 29d04afc51 update CHANGELOG 2025-05-24 13:24:53 +02:00
B. Petersen e6655fa21d point out that app drafts need to be sent
we got some feedback,
that ppl were wondering if others can use an app
once drafted and opend.

the old title "Tap to open" might even underline that impression.

this PR changes the title to "Tap 'Send' to share"
(we need to be super-short here, "Tap 'Send' to let others use the app" is already too much :)

the sending out of apps is the much more important step than to open,
play a game and then wondering ...
ppl will figure out the latter themselves,
wondering if one can configure eg. a poll before sending -
and if not, then it's that.
2025-05-24 13:24:53 +02:00
adb 7712ada816 Merge pull request #3776 from deltachat/adb/add-direct-action-for-apps-tab
show action button to see the list of apps sent in chat
2025-05-23 14:59:13 +00:00
adbenitez 52788976e3 update changelog 2025-05-23 15:13:24 +02:00
adbenitez 56f55be938 update apps icon 2025-05-23 15:07:19 +02:00
adbenitez 47350b1809 show action button to see the list of apps sent in chat 2025-05-23 14:26:34 +02:00
B. Petersen bb410a1bb1 update CHANGELOG 2025-05-23 13:43:35 +02:00
B. Petersen 04ed9e27c1 remove ambigious time from app list
it is unclear, which time this is - time of adding or time of last update?
it is the prior, however,
both are not important enough to clutter the list,
also desktop/ios do not show them.

i assume, the time display was just kept when adapting from files view.

by making the apps easier accessible,
(cmp https://github.com/deltachat/deltachat-ios/pull/2721 )
we really only want an uncluttered list.
2025-05-23 13:43:35 +02:00
B. Petersen 93c52ec527 remove redundant 'App' subtitle in 'Apps' list 2025-05-23 13:43:35 +02:00
B. Petersen a7b86dd59a update translations 2025-05-21 19:17:20 +02:00
B. Petersen 5587eda657 clearer instructions how to add apps&co to a chat
the instructions are shown when there are no Apps, Images etc. in a chat.

while the "shared in this chat" wording
is maybe more correct on an abstract way
(there are other ways than "attach" to have an app),
the "attached in this chat" points implicitly better to the new app selector -
esp. as the same wording is used for "images",
where the avg user usually knows about how to get that attached.

this little rewording comes from a discussion with @hpk42,
surely, there can be more improvements :)
2025-05-19 22:42:43 +02:00
adb b8a1daff45 Merge pull request #3769 from deltachat/adb/fix-changelog-19/5/25
fix version header
2025-05-19 11:12:17 +00:00
adbenitez deddc5dd29 fix version header 2025-05-19 13:11:31 +02:00
adbenitez 2f371c69cf Merge remote-tracking branch 'upstream/main' 2025-05-19 12:56:38 +02:00
adbenitez c4aa00d40d Merge remote-tracking branch 'upstream/main' 2025-05-15 17:56:41 +02:00
adb 46b5ae4831 Merge pull request #3767 from deltachat/adb/tweak-dcmsg-getWebxdcInfo
avoid causing and logging exception in getWebxdcInfo
2025-05-15 15:38:43 +00:00
adbenitez 16e89bb58a avoid causing and logging exception in getWebxdcInfo if getWebxdcInfoJson returns empty string 2025-05-15 14:19:52 +02:00
adb 1566ea87d3 Merge pull request #3766 from deltachat/prep-1.58.4
prepare 1.58.4
2025-05-15 11:38:11 +00:00
adbenitez cf653f41b7 prepare 1.58.4 2025-05-15 12:49:47 +02:00
adb 785729272a Merge pull request #3765 from deltachat/update-core-and-stuff-15/5/25
Update core to 1.159.5
2025-05-15 10:48:05 +00:00
adbenitez a881f84a03 update changelog 2025-05-15 12:11:09 +02:00
adbenitez d3b2f2df97 update translations 2025-05-15 12:11:01 +02:00
adbenitez f518a3eea9 update deltachat-core-rust to 'chore(release): prepare for 1.159.5' of 'v1.159.5' 2025-05-15 11:56:48 +02:00
l 20819912ee Update Rust to 1.86.0 (#3763) 2025-05-13 15:59:01 +00:00
adb 25ad133e1f Merge pull request #3764 from deltachat/simon/fix-typo-in-full-description
fix typo in full_description
2025-05-13 11:17:19 +00:00
Simon Laux 4eef4a86b5 fix typo in full_description 2025-05-13 00:13:31 +00:00
adb fb50b03af4 Merge pull request #3760 from deltachat/prep-1.58.3
prepare v1.58.3
2025-05-06 14:29:26 +00:00
adbenitez b6ffc8df9e prepare v1.58.3 2025-05-06 16:03:15 +02:00
adb 9a71de6944 Merge pull request #3759 from deltachat/update-core-and-stuff-6/5/25
Update core to 1.159.3
2025-05-06 14:00:59 +00:00
adbenitez f6ab0b18a2 update strings 2025-05-06 15:50:41 +02:00
adbenitez f023961239 update changelog 2025-05-06 15:43:43 +02:00
adbenitez aeb78d579e update deltachat-core-rust to 'chore(release): prepare for 1.159.3' of 'v1.159.3' 2025-05-06 15:37:55 +02:00
B. Petersen cdc47423f9 update translations 2025-05-06 11:47:00 +02:00
B. Petersen 9790730d75 remove deprecated strings 2025-05-06 11:47:00 +02:00
B. Petersen 6cc9a2594f add strings needed for iOS 2025-05-06 11:47:00 +02:00
adb 6814df2976 Merge pull request #3757 from deltachat/adb/add-donate-button
add "Donate" button to main settings
2025-05-05 21:41:30 +00:00
adbenitez 8e8b49508d update changelog 2025-05-05 22:11:15 +02:00
adbenitez 619ac2bb21 put donate and help in category 2025-05-05 21:48:15 +02:00
adbenitez f6750a1583 add "Donate" button to main settings 2025-05-05 19:11:21 +02:00
adb ce895355f5 Merge pull request #3756 from deltachat/r10s/fix-jsonrpc-crash
fix crash in JSONRPC
2025-05-05 14:31:54 +00:00
B. Petersen 17e45fd2ab log error if JSONRPC fails 2025-05-05 13:36:25 +02:00
B. Petersen 8f2b761361 update CHANGELOG 2025-05-03 21:01:15 +02:00
B. Petersen bc72fce060 fix crash in JSONRPC
the fix could have been avoid by checking for null
or not being overly specific with the exception.

as this is a very sensible area,
where any failure is dramatic,
we do both.
2025-05-03 20:39:20 +02:00
Hocuri 501a77e1dc refactor: Rename addTransport -> addOrUpdateTransport() (#3754)
The API was renamed in https://github.com/chatmail/core/pull/6800 (i.e. core v1.159.2)
2025-04-30 14:03:50 +02:00
adbenitez ad6f232d34 undo community hack 2025-04-27 02:11:35 +02:00
adbenitez efbe43ec70 Merge remote-tracking branch 'upstream/main' 2025-04-27 02:09:10 +02:00
B. Petersen 5e38b25c43 make 'microphone' hint fitting for desktop as well
i think, it is even an improvement for Android:
the hint is now also anchored by 'System Settings'
which is more in focus by casual users than 'App Settings' (long tap icon).
also, some android derivates may have different order,
which is captured better by a broader hint.
2025-04-26 17:33:06 +02:00
B. Petersen 6f3f356997 update CHANGELOG 2025-04-26 17:29:55 +02:00
B. Petersen d6f485511c fix selfName if displayname is not set
classic onboarding allows not setting a displayname on purpose,
however, that results in broken webxdc layouts
as the name is then replaced by a 40-or-so-chars-hash-without-spaces.

one can argue, that apps should handle that gracefully,
but most do not and just look buggy.

it seems reasonable,
to use the email address in that case,
same as we do at other places if the name is unknwon.
(tbh, i thought it was like that, but i mixed sth up in OS comparison).
this was also the situation before we changed selfAddr calculation, btw.
it is anyway a cornercase, webxdc cannot send the address somewhere
nor can correlate reasonably, and if the user sets a name, things are fine
(and more often than not we nudge user to set one :)
2025-04-26 17:29:55 +02:00
adb a527b2f404 Merge pull request #3747 from deltachat/prep-1.58.2
prepare 1.58.2
2025-04-24 12:46:41 +00:00
adbenitez 7c77b946ed update version number 2025-04-24 14:45:50 +02:00
adb ca77886012 Merge pull request #3746 from deltachat/update-core-and-stuff-24/4/25
Update core to 1.159.2
2025-04-24 12:42:17 +00:00
adbenitez fa5e305dff update local help 2025-04-24 14:31:01 +02:00
adbenitez 9e70bfb5ae update changelog: fix core version 2025-04-24 14:08:57 +02:00
adbenitez f4c7a9439d update strings 2025-04-24 13:47:09 +02:00
adbenitez 5d05e99ad6 update changelog 2025-04-24 13:45:32 +02:00
adbenitez 79bd1c7cb3 update deltachat-core-rust to 'chore(release): prepare for 1.159.2' of 'v1.159.2' 2025-04-24 13:42:04 +02:00
adb 848a86c718 Merge pull request #3745 from deltachat/adb/fix-warnings-in-profile
fix some linter warnings in classes related to profile
2025-04-23 14:05:43 +00:00
adb e759efc389 Merge pull request #3744 from deltachat/adb/fix-some-linter-warnings-22/4/25
fix some linter warnings
2025-04-22 22:11:40 +00:00
adb 63ea218b98 Merge pull request #3743 from deltachat/adb/fix-lint-warnings-conversationlistitem
fix linter warnings in ConversationListItem
2025-04-22 21:49:16 +00:00
adbenitez 07f4a859f3 fix some linter warnings in classes related to profile 2025-04-22 23:22:57 +02:00
adbenitez 34eeec4a39 fix some linter warnings 2025-04-22 23:02:57 +02:00
adbenitez 7f1734b57c fix linter warnings in ConversationListItem 2025-04-22 22:53:47 +02:00
adbenitez 83fa4c493d Merge remote-tracking branch 'upstream/main' 2025-04-21 23:00:52 +02:00
adb cbc8d2b659 Merge pull request #3741 from deltachat/prep-1.58.1
Prepare 1.58.1
2025-04-19 21:20:25 +00:00
adbenitez 6ff1c7a689 update version number 2025-04-19 22:07:59 +02:00
adbenitez b10185b6b9 update changelog 2025-04-19 22:07:22 +02:00
adb 6ef35c6ce1 Merge pull request #3740 from deltachat/update-core-and-stuff-19/4/25
update core to 1.159.1
2025-04-19 20:05:20 +00:00
adbenitez e04e6dfe06 update changelog 2025-04-19 22:05:01 +02:00
adb 60b322d83e Merge branch 'main' into update-core-and-stuff-19/4/25 2025-04-19 19:59:31 +00:00
adb 94e597d2d1 Merge pull request #3583 from deltachat/adb/issue-3575
show profiles connectivity state
2025-04-19 19:56:14 +00:00
adbenitez c1168566f3 update translations 2025-04-19 21:32:02 +02:00
adbenitez 72fc6ca4dc update deltachat-core-rust to 'chore(release): prepare for 1.159.1' of 'v1.159.1' 2025-04-19 21:27:27 +02:00
adb b2a3042d02 Merge branch 'main' into adb/issue-3575 2025-04-19 19:24:55 +00:00
adb ed4c5e7a72 Merge pull request #3736 from deltachat/adb/issue-3735
fix and update PhotoView dependency
2025-04-17 11:15:47 +00:00
B. Petersen 29a0f3dadb update translations 2025-04-17 11:14:56 +02:00
B. Petersen 1820af288e update translations 2025-04-16 21:06:44 +02:00
B. Petersen be48179a25 update script to grep for strings to chatmail dirs 2025-04-16 21:06:44 +02:00
adbenitez 2aa4245563 fix and update PhotoView dependency 2025-04-15 17:48:55 +02:00
adbenitez 54b5dba6ea update changelog 2025-04-14 19:39:25 +02:00
adb 60fa0c98df Merge branch 'main' into adb/issue-3575 2025-04-14 17:32:37 +00:00
adbenitez ea60418a70 Merge remote-tracking branch 'upstream/main' 2025-04-13 14:34:50 +02:00
adb 2bd1493a42 Merge pull request #3732 from deltachat/prep-1.58.0
prepare 1.58.0
2025-04-13 10:56:34 +00:00
adbenitez 04a22cc8c6 update version number 2025-04-13 12:55:16 +02:00
adbenitez d2780c4c03 Merge remote-tracking branch 'upstream/main' 2025-04-13 12:21:53 +02:00
bjoern bc73e1a2ba open contact in scope when tapping info messages (#3710)
* open contact in scope when tapping info messages

* update CHANGELOG

---------

Co-authored-by: adb <adb@merlinux.eu>
2025-04-12 00:22:24 +02:00
adbenitez 0522aef0fd enable broadcast lists for chatmail again 2025-04-11 20:50:20 +02:00
adbenitez d5a0be0c9c Merge remote-tracking branch 'upstream/main' 2025-04-11 20:21:26 +02:00
adb d66acbb71e Merge pull request #3731 from deltachat/update-core-and-stuff-11/4/25
Update core to 1.159.0
2025-04-11 16:41:56 +00:00
adbenitez 5c06156463 Merge remote-tracking branch 'upstream/main' 2025-04-11 18:40:37 +02:00
adb c07b2b4aa1 Merge branch 'main' into update-core-and-stuff-11/4/25 2025-04-11 16:17:31 +00:00
bjoern 389dddc9ea remove address from primary settings UI (#3730)
* remove address from primary settings UI

showing the address here prominently results in bad UX
as ppl try to pass the address around,
which will not result in e2ee and will often not work.

see https://github.com/deltachat/deltachat-ios/pull/2664
for more resoning and discussion, eg. why remove it unconditionally

* show status

* update changelog

---------

Co-authored-by: adb <adb@merlinux.eu>
Co-authored-by: adbenitez <asieldbenitez@gmail.com>
2025-04-11 18:15:36 +02:00
adbenitez 5dfdc94468 update translations 2025-04-11 18:12:57 +02:00
adbenitez 52d65c1bbb update deltachat-core-rust to 'chore(release): perpare for 1.159.0' of 'v1.159.0' 2025-04-11 18:00:51 +02:00
adbenitez f0f07055cf update changelog 2025-04-11 18:00:35 +02:00
adb c6c66f19f2 Merge pull request #3729 from deltachat/adb/issue-3701
remove address from contact list and group member list
2025-04-11 14:35:05 +00:00
adbenitez fb3d95264a Merge branch 'adb/issue-3701' of https://github.com/deltachat/deltachat-android into adb/issue-3701 2025-04-11 16:33:04 +02:00
adbenitez 92e67bd80a remove unused import 2025-04-11 16:32:53 +02:00
adb 1518bab671 Merge branch 'main' into adb/issue-3701 2025-04-11 14:32:06 +00:00
adb 632da643af Merge pull request #3724 from deltachat/adb/issue-3721
avoid NPE in UriGlideRenderer
2025-04-11 14:31:01 +00:00
adb 7353873281 Merge pull request #3725 from deltachat/adb/issue-3717
avoid SecurityException in NotificationsPreferenceFragment
2025-04-11 14:30:18 +00:00
adb f9ac0375b9 Update src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.java
Co-authored-by: bjoern <r10s@b44t.com>
2025-04-11 14:29:14 +00:00
adbenitez 78820ec18a update changelog 2025-04-11 16:25:10 +02:00
adbenitez 3c0e4fd853 don't display last-seen etc. just hide address 2025-04-11 16:22:29 +02:00
adb 31c9de1f03 Merge pull request #3723 from deltachat/adb/issue-3719
catch IllegalArgumentException in InstantOnboardingActivity.progressError()
2025-04-10 21:43:09 +00:00
adbenitez 4240c8b324 remove address from contact list and group member list 2025-04-10 22:09:41 +02:00
B. Petersen f47fff292f update translations 2025-04-08 00:10:17 +02:00
B. Petersen 9106f12b77 remove now unused stock translations 2025-04-08 00:10:17 +02:00
B. Petersen be709fb6df update translations 2025-04-07 16:47:27 +02:00
B. Petersen fca0c03087 add a hint to 'Add Second Device' for ASM 2025-04-07 16:39:28 +02:00
adbenitez 2613be7216 update changelog 2025-04-06 18:34:39 +02:00
adbenitez 43941f9075 avoid SecurityException in NotificationsPreferenceFragment 2025-04-06 18:20:51 +02:00
adbenitez 765e2b490e avoid NPE in UriGlideRenderer 2025-04-06 16:12:49 +02:00
adbenitez cfae361b88 catch IllegalArgumentException in InstantOnboardingActivity.progressError() 2025-04-06 16:03:55 +02:00
B. Petersen bdebd98627 update translations 2025-04-04 20:01:42 +02:00
Hocuri be159407ff feat: In ndk-make.sh, support custom CARGO_TARGET_DIR (#3716)
Running ndk-make.sh triggers a complete rust rebuild, because some compiler flags are changed. Then when you run a normal cargo command again (cargo check etc.), there is another rebuild. My solution is to locally change the target directory. This PR makes ndk-make.sh support such custom target directories.
2025-04-03 12:35:00 +00:00
Hocuri 9daa2d77cd refactor: Remove dead 'configure' code (#3714)
* refactor: Remove dead configure code

* refactor: Remove unnecessary startIo() call; addTransport starts IO itself
2025-04-03 14:12:09 +02:00
Hocuri 05d2d0964f fix: Avoid NPE because of progressDialog (#3715) 2025-04-03 14:11:08 +02:00
Hocuri 10c4a105bb feat: Move to addTransport / addTransportFromQr API (#3676), remove AEAP message (#3698) 2025-04-02 18:14:49 +02:00
adbenitez fe602004c7 Merge remote-tracking branch 'upstream/main' 2025-04-02 17:18:16 +02:00
bjoern e2d7f2c3d3 prefer NAME over NAME (ADDR) (#3699)
* prefer NAME over NAME (ADDR)

this tunes the usage of email addresses further down,
in all cases, the profile should only be a tap away before or afterwards,
so, these mentionings were never really critical

* update CHANGELOG

* Update CHANGELOG.md

Co-authored-by: adb <adb@merlinux.eu>

---------

Co-authored-by: adb <adb@merlinux.eu>
2025-04-02 16:41:36 +02:00
B. Petersen 6996836f80 update translations 2025-04-02 14:44:57 +02:00
bjoern 7d689dc1d6 tune down email wording (#3707)
* tune down usage of 'e-mail' wording, where not needed in primary UI

* strike another provider

* remove e2ee hint for address book, the option was introduced at #2950 where hiding for chatmail (#3050) was not in place

* Update src/main/res/values/strings.xml

Co-authored-by: Hocuri <hocuri@gmx.de>

* Update src/main/res/values/strings.xml

Co-authored-by: Hocuri <hocuri@gmx.de>

* Update src/main/res/values/strings.xml

Co-authored-by: Hocuri <hocuri@gmx.de>

* leave aeap as is, it will be removed anyways

* pick up 'relay' wording

* reword deletion warning

* revert 'messages relayed'; this is not really the experience user can expect

---------

Co-authored-by: Hocuri <hocuri@gmx.de>
2025-04-02 14:34:56 +02:00
B. Petersen 9960423b57 better remove headline alltogether than trying to get an artificial ordering 2025-04-02 12:46:24 +02:00
B. Petersen 06183a9135 'App Access' is not about webxdc as the other options few lines above. use less confusing term 'System Integration' 2025-04-02 12:46:24 +02:00
B. Petersen 796acf1bb0 update translations 2025-04-02 12:45:37 +02:00
bjoern 64e4816f5e add stock string needed when securejoin takes longer than expected (#3709)
* add stock string needed when securejoin takes longer than expected

* apply wording suggestions

* stroke 'as expected', this is not an error, we're offline first, it is fine and continues in bg
2025-04-02 12:35:19 +02:00
bjoern 1680d332f5 hide 'show classic email' for chatmail (#3708)
* hide 'show classic email' for chatmail

* update CHANGELOG
2025-04-01 16:42:48 +02:00
adb 77ee5c6bc0 Merge pull request #3706 from deltachat/adb/update-release-file
remove mention of Apklis
2025-03-30 16:26:01 +00:00
adbenitez f8c678b7ff Merge remote-tracking branch 'upstream/main' 2025-03-30 16:54:49 +02:00
adbenitez cde74ae2e1 remove mention of Apklis 2025-03-30 16:31:31 +02:00
adb 5fd3352d81 Merge pull request #3705 from deltachat/prep-1.56.1
prepare 1.56.1
2025-03-30 14:18:45 +00:00
adbenitez e41b7a4701 update version number 2025-03-30 16:03:45 +02:00
adb dd85322333 Merge pull request #3704 from deltachat/adb/issue-3702
avoid some ANRs in MessageSelectorFragment
2025-03-30 14:00:56 +00:00
adbenitez c7bffb85fd avoid ANR in MessageSelectorFragment.handleDeleteMessages 2025-03-30 15:51:16 +02:00
adbenitez 3518f3d213 avoid ANR in MessageSelectorFragment.handleResendMessage 2025-03-30 15:42:49 +02:00
adbenitez b31774c899 Merge remote-tracking branch 'upstream/main' 2025-03-30 15:28:03 +02:00
adb eebb64ff04 Merge pull request #3700 from deltachat/update-core-and-stuff-30/3/25
Update core  to 1.158.0
2025-03-30 13:17:34 +00:00
adbenitez ee1a6ea5c6 update changelog 2025-03-30 13:22:18 +02:00
adbenitez 063e80bbf7 update translations and built-in help 2025-03-30 13:03:13 +02:00
adbenitez 9f30ebd62c update release instructions 2025-03-30 13:02:49 +02:00
adbenitez ae53415545 update deltachat-core-rust to 'chore(release): prepare for 1.158.0' of 'v1.158.0' 2025-03-30 12:51:46 +02:00
adbenitez 8a495411a3 update release instructions 2025-03-30 12:50:47 +02:00
B. Petersen 2f432bfd3b depreacte the whole string 2025-03-22 21:11:09 +01:00
B. Petersen b2b006c512 improve copy-qr-code success wording; thanks for a translator hint 2025-03-22 21:11:09 +01:00
B. Petersen 7b63d383ee update translations 2025-03-22 14:22:41 +01:00
B. Petersen 2b3a56bb26 remove deprecated asm strings 2025-03-22 14:22:41 +01:00
adb e3408af5be Merge pull request #3694 from deltachat/adb/issue-3692
use Rpc to set contact's name
2025-03-21 13:47:32 +00:00
adbenitez b14b8eea9d use change_contact_name 2025-03-20 18:41:11 +01:00
B. Petersen 5e6c5d7c5e remove unused ASM code; the API calls were only partly removed at #3594 2025-03-20 18:40:29 +01:00
adbenitez c1eff8362f use Rpc.createContact() to set contact's name 2025-03-20 17:38:57 +01:00
B. Petersen fbca401488 update translations 2025-03-19 14:21:17 +01:00
B. Petersen 39fe0dd523 remove unused emoji resources; emoji were refactored at https://github.com/deltachat/deltachat-android/pull/3411 ff 2025-03-19 13:33:05 +01:00
B. Petersen 0491018c24 remove asm input field; importing keys was removed at https://github.com/deltachat/deltachat-android/pull/3594 2025-03-19 13:33:05 +01:00
B. Petersen f91ceb8463 remove quick camera resources; quick camera was removed at https://github.com/deltachat/deltachat-android/pull/3582 2025-03-19 13:33:05 +01:00
B. Petersen 9f1def20cd remove deprecated strings that are no longer in use; mark some strings as deprecated that are in use partly still 2025-03-19 13:33:05 +01:00
adb 64a8c7755d Merge pull request #3689 from deltachat/adb/dont-use-email-address
don't use email address as contact unique identifier
2025-03-19 12:27:56 +00:00
adbenitez 12807763d6 remove TODO comment 2025-03-19 13:03:18 +01:00
adbenitez fbf8637c97 don't use email address as contact unique identifier 2025-03-18 22:56:28 +01:00
adb 8aedbc60a4 Merge pull request #3687 from deltachat/adb/fix-crash-orphan-webxdc-info-msg
avoid crash when clicking orphan info messages from webxdc
2025-03-18 19:17:56 +00:00
adbenitez 38c3b5561b update changelog 2025-03-18 19:44:50 +01:00
adbenitez 3e21f9be4d avoid crash in orphan info messages from webxdc 2025-03-18 19:41:19 +01:00
B. Petersen ad1159c05c remove 'experimental, 1.36 required' hint from add-second-device 2025-03-17 13:51:46 +01:00
adbenitez 314ecf1639 add device message 2025-03-15 23:09:28 +01:00
adbenitez df6ac480c6 Merge remote-tracking branch 'upstream/main' 2025-03-15 22:05:36 +01:00
adb 8974a62a0c Merge pull request #3684 from deltachat/prep-1.56.0
prepare 1.56.0
2025-03-15 19:12:26 +00:00
adbenitez d2c8e2e63a Merge remote-tracking branch 'upstream/main' 2025-03-15 19:08:27 +01:00
adbenitez 11600184be update version number 2025-03-15 18:52:59 +01:00
adb ee78397614 Merge pull request #3594 from deltachat/adb/issue-3591
hide some option in Encryption category
2025-03-15 17:50:49 +00:00
adb b33311b9fb Merge branch 'main' into adb/issue-3591 2025-03-15 17:50:30 +00:00
adb b90f6e296a Merge pull request #3683 from deltachat/update-core-and-stuff-15/3/25
Update core to 1.157.2
2025-03-15 17:49:45 +00:00
adbenitez 5789390451 update changelog 2025-03-15 18:48:34 +01:00
adbenitez 1a84cd05a5 update translations 2025-03-15 18:44:49 +01:00
adbenitez 3578a9bef1 update deltachat-core-rust to 'chore(release): prepare for 1.157.2' of 'v1.157.2' 2025-03-15 18:24:35 +01:00
adbenitez 52280bf744 reduce padding of "or" separator in registration screen 2025-03-15 18:18:07 +01:00
adbenitez 26645da56d Merge remote-tracking branch 'upstream/main' 2025-03-15 17:44:58 +01:00
adbenitez 828ff3d8ca add scroll to registration screen for small screens 2025-03-15 17:25:12 +01:00
adb 7954e94d45 Merge pull request #3680 from deltachat/adb/paste-as-plain-text
force "paste as plain text" in composer
2025-03-15 15:24:42 +00:00
adb c1e47f4a9c Merge pull request #3681 from deltachat/adb/add-symbols-instructions-to-readme
add instructions about decoding symbols in core crash
2025-03-15 15:23:29 +00:00
adbenitez d3193221f6 add instructions about decoding symbols in core crash 2025-03-14 15:54:30 +01:00
adbenitez e7b4accea0 update changelog 2025-03-14 01:04:58 +01:00
adbenitez 67baedc0dc force "paste as plain text" in composer 2025-03-14 00:20:56 +01:00
adbenitez 74c02932c3 Merge remote-tracking branch 'upstream/main' 2025-03-13 18:24:28 +01:00
adbenitez 2968d033f2 update strings.xml 2025-03-13 17:47:43 +01:00
adbenitez 43d48fa510 update changelog 2025-03-13 17:47:36 +01:00
adb 337f353220 Merge branch 'main' into adb/issue-3591 2025-03-13 16:24:18 +00:00
adbenitez 218295c4f3 remove ASM handling 2025-03-13 17:22:53 +01:00
B. Petersen bf86d4f1b7 update CHANGELOG 2025-03-13 16:56:03 +01:00
B. Petersen d383bcc451 add mute option for 8 hours 2025-03-13 16:56:03 +01:00
adb 2e1a40b606 Merge branch 'main' into adb/issue-3591 2025-03-13 15:53:54 +00:00
B. Petersen 10c538ac8e no 'delete on all devices' for device messages
do not say "Delete on all your devices"
when deleting a message in the "Device Messages" chat.

while this is a minor,
it is one of the first things the user may see,
better be correct there to not give a false first impression of correctness :)
2025-03-12 22:25:49 +01:00
adb 35852604ea Merge pull request #3633 from deltachat/adb/allow-to-edit-and-delete-for-all
allow to edit and delete for all
2025-03-12 19:18:43 +00:00
adbenitez 0c8ecaf8df add changelog entry 2025-03-12 20:06:27 +01:00
adb cbe70a93db Merge branch 'main' into adb/allow-to-edit-and-delete-for-all 2025-03-12 18:50:17 +00:00
adb 7768ef3ff9 Merge pull request #3674 from deltachat/adb/issue-3599
add action menu icon option to toggle message bookmark
2025-03-12 18:49:57 +00:00
adbenitez d337230a4b Merge branch 'adb/issue-3599' of https://github.com/deltachat/deltachat-android into adb/issue-3599 2025-03-12 19:31:13 +01:00
adbenitez de76377f3b change bookmark icons 2025-03-12 19:30:45 +01:00
adb f223b22ff8 Merge branch 'main' into adb/issue-3599 2025-03-12 17:56:08 +00:00
adb 9850e6fff7 Merge pull request #3673 from deltachat/adb/avoid-npe-in-processComposeControls
avoid NPE in processComposeControls
2025-03-12 16:56:22 +00:00
adbenitez 6ab94814ca update changelog 2025-03-12 17:32:25 +01:00
adb e0db504b18 Merge branch 'main' into adb/avoid-npe-in-processComposeControls 2025-03-12 16:25:22 +00:00
adb fe44eec6c8 Merge branch 'main' into adb/issue-3599 2025-03-12 16:23:55 +00:00
B. Petersen 7bc595a889 check for CHANGELOG in PRs changing .java files 2025-03-12 17:22:54 +01:00
adbenitez 5133461eb7 set title 2025-03-12 17:12:47 +01:00
adbenitez b4b12862fd add action menu icon option to toggle message bookmark 2025-03-12 17:06:18 +01:00
adbenitez 1340166a91 don't allow to delete info-messages for all 2025-03-12 16:22:45 +01:00
adbenitez 1663502d35 avoid NPE in processComposeControls 2025-03-12 16:16:34 +01:00
adbenitez 9a67f5b32a remove e2ee_enabled and import/export keys from advanced settings 2025-03-12 16:13:04 +01:00
adbenitez 773913409f hide the Encryption category completed for chatmail accounts 2025-03-12 14:47:40 +00:00
link2xt e6988e3f61 Format flake.nix 2025-03-12 02:43:37 +00:00
link2xt 0047259457 Update NDK in flake.nix from 27.0.11902837 to 27.2.12479018 2025-03-12 02:43:37 +00:00
adbenitez 3e9c977b3f Merge remote-tracking branch 'upstream/main' 2025-03-11 22:16:52 +01:00
adb 3a49e30d93 Merge pull request #3671 from deltachat/adb/issue-3670
check if activity is finishing before creating "one moment" dialog
2025-03-11 21:12:02 +00:00
adbenitez 11addb6522 check if activity is finishing before creating "one moment" dialog 2025-03-11 20:40:30 +01:00
adbenitez 6353bb94f4 improve "force encryption" option and warn when disabling 2025-03-11 18:23:12 +01:00
adb 5df2ba4325 Merge pull request #3667 from deltachat/adb/issue-3662
avoid ANR in ConversationActivity.processComposeControls
2025-03-10 23:20:37 +00:00
adbenitez 2f79310db6 update strings 2025-03-11 00:12:29 +01:00
adbenitez 129278443d Merge remote-tracking branch 'upstream/main' 2025-03-10 23:45:08 +01:00
adbenitez 0e27692c32 rename changelog 2025-03-10 23:39:35 +01:00
adbenitez 92be6947db update changelog 2025-03-10 23:39:03 +01:00
adb 884ba32ce9 Merge pull request #3669 from deltachat/prep-1.54.4
prepare 1.54.4
2025-03-10 22:22:14 +00:00
adbenitez fe2ac243c7 update changelog and increase version number 2025-03-10 22:20:26 +00:00
adb 4b978c0124 Merge pull request #3656 from deltachat/adb/use-chat-deleted-event
remove notifications from chat that was deleted from other device
2025-03-10 22:20:03 +00:00
adb 8bf799ec2a Merge pull request #3668 from deltachat/update-core-and-stuff-10/3/25
Update core to 1.156.3
2025-03-10 22:17:33 +00:00
adbenitez f92225528c update translations 2025-03-10 22:45:02 +01:00
adbenitez 796b723be7 update core submodule URL 2025-03-10 22:39:13 +01:00
adbenitez 544ab41aa4 update deltachat-core-rust to 'chore(release): prepare for 1.156.3' of 'v1.156.3' 2025-03-10 22:37:13 +01:00
adbenitez cca9dfb04a avoid ANR in ConversationActivity.processComposeControls 2025-03-10 22:17:47 +01:00
adb faa94acbcb Merge pull request #3666 from deltachat/adb/issue-3660
avoid ANR in ProfileSettingsFragment.onActivityResult
2025-03-10 19:46:00 +00:00
adbenitez e7517c23ad avoid ANR in ProfileSettingsFragment.onActivityResult 2025-03-10 18:20:28 +01:00
adb 370afbf2ce Merge pull request #3665 from deltachat/adb/issue-3664
call rpc.start() before it is used
2025-03-10 17:07:00 +00:00
adbenitez bcee64317d call rpc.start() before it is used 2025-03-10 17:30:59 +01:00
adbenitez 6fe4d57b48 remove IzzyOnDroid 2025-03-09 00:55:45 +01:00
B. Petersen 906db9155a bring back 'add attachment later', which was removed at #3601 2025-03-08 20:41:11 +01:00
l 9b7b35acb1 Merge pull request #3655 from deltachat/weblate
Translations update from Hosted Weblate
2025-03-07 22:56:43 +00:00
adbenitez 5d25ed7715 remove notifications from chat that was deleted from other device 2025-03-07 23:22:34 +01:00
Andrea Enzo Lattmann 5691ab9e84 Translated using Weblate (Italian)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/it/
2025-03-07 23:13:19 +01:00
adb 64aa0fb49c Merge pull request #3652 from deltachat/adb/issue-3651
avoid IllegalArgumentException in BaseConversationListFragment.handleAddToHomeScreen
2025-03-07 19:01:43 +00:00
l d3fe672ec0 Merge https://hosted.weblate.org/git/deltachat/android-metadata/ 2025-03-07 02:53:08 +00:00
link2xt 4e199c0080 Merge https://hosted.weblate.org/git/deltachat/android-metadata/ 2025-03-07 02:50:58 +00:00
adbenitez 8fd8927293 avoid IllegalArgumentException in BaseConversationListFragment.handleAddToHomeScreen 2025-03-06 20:12:55 +00:00
Hosted Weblate 320f0ba27d Merge remote-tracking branch 'origin/main' 2025-03-06 19:23:44 +01:00
l c7d903f64a Merge pull request #3649 from deltachat/link2xt/merge-weblate
Manually merge weblate
2025-03-06 18:23:39 +00:00
link2xt f394b22e45 Merge remote-tracking branch 'weblate/main'
Merging from https://hosted.weblate.org/git/deltachat/android-metadata/
into main.

Weblate stopped making PRs because there were conflicts.
2025-03-06 18:15:44 +00:00
adbenitez e7ced91670 Merge remote-tracking branch 'upstream/main' 2025-03-06 01:38:42 +01:00
adbenitez 35836ad18f update translations 2025-03-05 21:28:12 +01:00
Hosted Weblate 2e99f6ee93 Merge remote-tracking branch 'origin/main' 2025-03-05 20:58:49 +01:00
B. Petersen 5c551cb2a8 go for 'Profile Label' 2025-03-05 20:58:42 +01:00
B. Petersen 6490a641da reword 'Private Tag' to 'Profile Description' 2025-03-05 20:58:42 +01:00
adbenitez 06164d240d add back "reply" option to menu 2025-03-05 20:19:11 +01:00
Максим Горпиніч b729e93b8a Translated using Weblate (Ukrainian)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/uk/
2025-03-04 22:37:41 +01:00
Hosted Weblate d7345f75e2 Merge remote-tracking branch 'origin/main' 2025-03-03 21:10:05 +00:00
adbenitez 695e1e06dd update f-droid description 2025-03-03 22:09:58 +01:00
adbenitez ccedf31b96 update core 2025-03-03 17:16:15 +01:00
adbenitez 31f89cec02 Merge remote-tracking branch 'upstream/main' 2025-03-03 15:49:30 +01:00
Hosted Weblate 42561266ba Merge remote-tracking branch 'origin/main' 2025-03-03 15:31:12 +01:00
adb 17a182625d Merge pull request #3644 from deltachat/prep-1.54.3
prepare 1.54.3
2025-03-03 15:31:06 +01:00
adbenitez 625d0ed66c update changelog and version number 2025-03-03 13:58:33 +01:00
Hosted Weblate f7f1f29531 Merge remote-tracking branch 'origin/main' 2025-03-03 13:57:24 +01:00
adb 134fbc7188 Merge pull request #3643 from deltachat/update-core-and-stuff-3/3/25
Update core to 1.156.2
2025-03-03 13:57:14 +01:00
adbenitez 5d26387aa3 update translations 2025-03-03 13:36:33 +01:00
adbenitez 4a3070bb54 update deltachat-core-rust to 'chore(release): prepare for 1.156.2' of 'v1.156.2' 2025-03-03 13:35:14 +01:00
Hosted Weblate 8377f23c58 Merge remote-tracking branch 'origin/main' 2025-03-02 23:03:31 +01:00
B. Petersen ec4c96dd92 clarify chat deletion impact 2025-03-02 23:03:24 +01:00
Hosted Weblate 7a44182c3f Merge remote-tracking branch 'origin/main' 2025-02-28 20:25:07 +01:00
Hosted Weblate 5e88059283 Merge remote-tracking branch 'origin/main' 2025-02-28 16:43:31 +01:00
Hosted Weblate 96e635f0bd Merge remote-tracking branch 'origin/main' 2025-02-28 14:37:01 +00:00
Hosted Weblate 8aa7dfabe6 Merge remote-tracking branch 'origin/main' 2025-02-28 14:00:55 +01:00
Hosted Weblate cd344daf5a Merge remote-tracking branch 'origin/main' 2025-02-27 22:29:28 +01:00
Hosted Weblate 4658adc2cd Merge remote-tracking branch 'origin/main' 2025-02-27 22:24:57 +01:00
Hosted Weblate 62ad0e942f Merge remote-tracking branch 'origin/main' 2025-02-27 19:31:25 +00:00
Hosted Weblate 7e0fc59687 Merge remote-tracking branch 'origin/main' 2025-02-27 17:54:48 +00:00
Hosted Weblate 4ec02a59de Merge remote-tracking branch 'origin/main' 2025-02-27 17:38:52 +00:00
Hosted Weblate bcad4a7302 Merge remote-tracking branch 'origin/main' 2025-02-27 18:30:11 +01:00
Hosted Weblate 55eab9dd0b Merge remote-tracking branch 'origin/main' 2025-02-27 18:26:49 +01:00
Hosted Weblate 6f6cd80516 Merge remote-tracking branch 'origin/main' 2025-02-27 18:25:30 +01:00
Hosted Weblate c88a1b53b0 Merge remote-tracking branch 'origin/main' 2025-02-27 16:25:35 +00:00
Hosted Weblate 669d8f4cba Merge remote-tracking branch 'origin/main' 2025-02-27 00:04:13 +01:00
Hosted Weblate c083195acf Merge remote-tracking branch 'origin/main' 2025-02-27 00:03:02 +01:00
Hosted Weblate 7c6d47bfae Merge remote-tracking branch 'origin/main' 2025-02-26 23:14:09 +01:00
Hosted Weblate ef4f79b4a3 Merge remote-tracking branch 'origin/main' 2025-02-26 23:13:22 +01:00
Hosted Weblate 491bbfade0 Merge remote-tracking branch 'origin/main' 2025-02-26 18:55:00 +00:00
Hosted Weblate dce7d56fb2 Merge remote-tracking branch 'origin/main' 2025-02-26 19:37:48 +01:00
Hosted Weblate 1787d8665c Merge remote-tracking branch 'origin/main' 2025-02-26 18:37:27 +00:00
Hosted Weblate 2134f97956 Merge remote-tracking branch 'origin/main' 2025-02-26 16:57:08 +01:00
Hosted Weblate bf138aa2e7 Merge remote-tracking branch 'origin/main' 2025-02-26 16:49:08 +01:00
Hosted Weblate cbd4e2b520 Merge remote-tracking branch 'origin/main' 2025-02-26 12:00:18 +00:00
Hosted Weblate 713623c11d Merge remote-tracking branch 'origin/main' 2025-02-25 23:48:31 +01:00
Hosted Weblate 66339d77bf Merge remote-tracking branch 'origin/main' 2025-02-25 22:48:14 +00:00
Hosted Weblate 8b5b2d2f95 Merge remote-tracking branch 'origin/main' 2025-02-25 21:01:43 +01:00
Hosted Weblate 19c158d1c4 Merge remote-tracking branch 'origin/main' 2025-02-25 20:54:49 +01:00
Hosted Weblate be6f30da24 Merge remote-tracking branch 'origin/main' 2025-02-25 17:22:15 +00:00
Hosted Weblate c38c5a5d36 Merge remote-tracking branch 'origin/main' 2025-02-25 16:55:01 +00:00
Hosted Weblate 9d9630041e Merge remote-tracking branch 'origin/main' 2025-02-25 17:40:14 +01:00
Hosted Weblate ff0e004e20 Merge remote-tracking branch 'origin/main' 2025-02-22 20:07:55 +01:00
Hosted Weblate a8f17d618b Merge remote-tracking branch 'origin/main' 2025-02-22 20:00:56 +01:00
Hosted Weblate ca8767e0b0 Merge remote-tracking branch 'origin/main' 2025-02-20 23:47:10 +01:00
Hosted Weblate 04d8437b89 Merge remote-tracking branch 'origin/main' 2025-02-20 23:28:49 +01:00
XblateX f08d5a64b0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/uk/
2025-02-20 17:59:36 +01:00
Hosted Weblate d467285036 Merge remote-tracking branch 'origin/main' 2025-02-20 14:17:01 +00:00
Hosted Weblate 205a7fd10e Merge remote-tracking branch 'origin/main' 2025-02-19 16:50:19 +00:00
Hosted Weblate ddd4cacd1d Merge remote-tracking branch 'origin/main' 2025-02-17 05:30:42 +01:00
Hosted Weblate 4ca4d81345 Merge remote-tracking branch 'origin/main' 2025-02-12 20:32:50 +01:00
Hosted Weblate ba34971d2b Merge remote-tracking branch 'origin/main' 2025-02-11 13:08:53 +00:00
Hosted Weblate deed7a569c Merge remote-tracking branch 'origin/main' 2025-02-11 10:31:37 +00:00
Hosted Weblate 24d1ca9015 Merge remote-tracking branch 'origin/main' 2025-02-11 11:31:01 +01:00
Hosted Weblate e6325578ca Merge remote-tracking branch 'origin/main' 2025-02-08 20:25:30 +01:00
Hosted Weblate 669a1a769d Merge remote-tracking branch 'origin/main' 2025-02-07 18:43:47 +01:00
Hosted Weblate ab7b2f4b1b Merge remote-tracking branch 'origin/main' 2025-02-07 15:51:32 +01:00
Hosted Weblate 07b55b739e Merge remote-tracking branch 'origin/main' 2025-02-06 12:46:26 +00:00
adbenitez 78b3c3883d change offline color 2025-02-05 16:20:29 +01:00
adbenitez e28e6b9b73 don't display dot when connected 2025-02-05 16:20:29 +01:00
adbenitez 4ed51b6b56 show profiles connectivity state 2025-02-05 16:20:29 +01:00
Hosted Weblate 084707eb67 Merge remote-tracking branch 'origin/main' 2025-02-05 15:55:23 +01:00
Hosted Weblate 00d411dd5a Merge remote-tracking branch 'origin/main' 2025-02-05 12:36:19 +01:00
Hosted Weblate 1816a50dee Merge remote-tracking branch 'origin/main' 2025-02-03 23:41:19 +01:00
Hosted Weblate 6c6c04ba53 Merge remote-tracking branch 'origin/main' 2025-02-03 10:58:11 +00:00
Hosted Weblate 145432a57d Merge remote-tracking branch 'origin/main' 2025-02-03 11:52:01 +01:00
Hosted Weblate 20acd38ab4 Merge remote-tracking branch 'origin/main' 2025-02-03 11:45:23 +01:00
Hosted Weblate bf7095d0ee Merge remote-tracking branch 'origin/main' 2025-02-03 00:49:08 +01:00
Hosted Weblate a6b168f4eb Merge remote-tracking branch 'origin/main' 2025-02-01 00:24:51 +01:00
Hosted Weblate 883536a3a5 Merge remote-tracking branch 'origin/main' 2025-01-31 12:38:01 +01:00
Hosted Weblate 3013af2a7a Merge remote-tracking branch 'origin/main' 2025-01-31 11:26:16 +00:00
Hosted Weblate 7b52bb6c85 Merge remote-tracking branch 'origin/main' 2025-01-29 13:47:12 +00:00
Hosted Weblate 1439bc0a86 Merge remote-tracking branch 'origin/main' 2025-01-28 17:24:30 +01:00
Hosted Weblate 9a5415eb66 Merge remote-tracking branch 'origin/main' 2025-01-28 15:31:22 +00:00
Hosted Weblate 5da3748a6a Merge remote-tracking branch 'origin/main' 2025-01-27 17:40:51 +00:00
Hosted Weblate 2308feea8c Merge remote-tracking branch 'origin/main' 2025-01-27 18:13:08 +01:00
Hosted Weblate a3b0ee1ef9 Merge remote-tracking branch 'origin/main' 2025-01-25 13:48:46 +00:00
Hosted Weblate 4fa5f1f5c6 Merge remote-tracking branch 'origin/main' 2025-01-23 23:37:05 +01:00
Hosted Weblate f4701b92e2 Merge remote-tracking branch 'origin/main' 2025-01-23 19:28:06 +01:00
Hosted Weblate 6649165b56 Merge remote-tracking branch 'origin/main' 2025-01-23 13:23:08 +01:00
Hosted Weblate 1c9b5977a8 Merge remote-tracking branch 'origin/main' 2025-01-23 00:51:15 +01:00
Hosted Weblate 49471999b9 Merge remote-tracking branch 'origin/main' 2025-01-22 13:40:13 +01:00
Hosted Weblate 86a8fbf463 Merge remote-tracking branch 'origin/main' 2025-01-21 20:09:55 +01:00
Hosted Weblate 238ec5b299 Merge remote-tracking branch 'origin/main' 2025-01-21 19:01:25 +01:00
Hosted Weblate 4c810c2b50 Merge remote-tracking branch 'origin/main' 2025-01-21 18:51:22 +01:00
Hosted Weblate f4d5547da7 Merge remote-tracking branch 'origin/main' 2025-01-21 16:47:35 +00:00
Hosted Weblate 52850c25b0 Merge remote-tracking branch 'origin/main' 2025-01-20 15:15:02 +01:00
Hosted Weblate 5117e103bb Merge remote-tracking branch 'origin/main' 2025-01-17 16:40:42 +00:00
Hosted Weblate 056f9bd4fb Merge remote-tracking branch 'origin/main' 2025-01-17 09:39:28 +00:00
Hosted Weblate 877989b5c1 Merge remote-tracking branch 'origin/main' 2025-01-16 20:42:46 +01:00
Hosted Weblate eef8609a66 Merge remote-tracking branch 'origin/main' 2025-01-16 14:55:13 +01:00
Andrea Enzo Lattmann b43685bcdf Translated using Weblate (Italian)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/it/
2025-01-16 06:58:09 +01:00
Hosted Weblate 794062b9ed Merge remote-tracking branch 'origin/main' 2025-01-15 21:02:08 +01:00
Hosted Weblate 876721fae5 Merge remote-tracking branch 'origin/main' 2025-01-15 16:18:50 +00:00
Hosted Weblate 0fdac57c68 Merge remote-tracking branch 'origin/main' 2025-01-15 16:40:55 +01:00
Hosted Weblate b3375f4f19 Merge remote-tracking branch 'origin/main' 2025-01-14 11:49:13 +01:00
Hosted Weblate b607ca21ff Merge remote-tracking branch 'origin/main' 2025-01-10 18:37:43 +00:00
Hosted Weblate d6efa3c7e5 Merge remote-tracking branch 'origin/main' 2025-01-10 18:45:16 +01:00
Hosted Weblate e461e2f7f1 Merge remote-tracking branch 'origin/main' 2025-01-10 17:26:19 +01:00
Hosted Weblate 684f8834fa Merge remote-tracking branch 'origin/main' 2025-01-10 15:06:19 +00:00
Hosted Weblate b440a31820 Merge remote-tracking branch 'origin/main' 2025-01-09 19:03:24 +01:00
Hosted Weblate 568a3f383f Merge remote-tracking branch 'origin/main' 2025-01-09 15:08:25 +00:00
Hosted Weblate 6c212a5d3d Merge remote-tracking branch 'origin/main' 2025-01-09 15:26:46 +01:00
Hosted Weblate b6e43a6994 Merge remote-tracking branch 'origin/main' 2025-01-06 14:40:59 +00:00
Hosted Weblate d1f85e6dc4 Merge remote-tracking branch 'origin/main' 2025-01-06 14:58:18 +01:00
Hosted Weblate 74ef8dc1c6 Merge remote-tracking branch 'origin/main' 2025-01-04 18:13:50 +00:00
Hosted Weblate 1da2d35af4 Merge remote-tracking branch 'origin/main' 2025-01-04 16:02:53 +01:00
Hosted Weblate bb3f4a2e06 Merge remote-tracking branch 'origin/main' 2025-01-03 19:58:58 +01:00
Hosted Weblate 8e4c5d6b63 Merge remote-tracking branch 'origin/main' 2025-01-03 16:48:55 +01:00
Hosted Weblate 1b46edaddf Merge remote-tracking branch 'origin/main' 2025-01-03 14:04:14 +00:00
தமிழ்நேரம் aa0c72356f Translated using Weblate (Tamil)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/ta/
2024-12-21 09:00:22 +01:00
Hosted Weblate ee8fd429f4 Merge remote-tracking branch 'origin/main' 2024-12-20 11:41:04 +00:00
Hosted Weblate bc022f5196 Merge remote-tracking branch 'origin/main' 2024-12-19 13:30:30 +01:00
Hosted Weblate d4dcdcf3bd Merge remote-tracking branch 'origin/main' 2024-12-18 17:31:48 +00:00
Hosted Weblate 74b2369ca9 Merge remote-tracking branch 'origin/main' 2024-12-18 17:19:37 +01:00
Hosted Weblate 9eafdbd817 Merge remote-tracking branch 'origin/main' 2024-12-18 15:41:48 +01:00
Hosted Weblate 0a21d1d1b4 Merge remote-tracking branch 'origin/main' 2024-12-18 13:19:55 +01:00
Hosted Weblate b0cb6c73ba Merge remote-tracking branch 'origin/main' 2024-12-17 17:43:26 +01:00
Максим Горпиніч b6367416e5 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/uk/
2024-12-17 17:21:37 +01:00
Hosted Weblate 0b582dd287 Merge remote-tracking branch 'origin/main' 2024-12-17 17:07:06 +01:00
Hosted Weblate d5cf919bcb Merge remote-tracking branch 'origin/main' 2024-12-17 16:32:48 +01:00
Hosted Weblate 490f1efe36 Merge remote-tracking branch 'origin/main' 2024-12-17 14:47:49 +01:00
Hosted Weblate c125d4fa24 Merge remote-tracking branch 'origin/main' 2024-12-13 20:12:12 +01:00
Hosted Weblate 389098699a Merge remote-tracking branch 'origin/main' 2024-12-13 13:12:47 +00:00
Hosted Weblate df696e5fab Merge remote-tracking branch 'origin/main' 2024-12-13 14:00:16 +01:00
Hosted Weblate e8801d1b64 Merge remote-tracking branch 'origin/main' 2024-12-13 12:51:00 +01:00
Hosted Weblate 8bfc44c8ca Merge remote-tracking branch 'origin/main' 2024-12-13 11:33:57 +00:00
김인수 36e963e717 Translated using Weblate (Korean)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/ko/
2024-12-13 05:00:33 +01:00
Eryk Michalak 9e8fcf8ed7 Translated using Weblate (Polish)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/pl/
2024-12-11 23:00:32 +00:00
Hosted Weblate 6412d25420 Merge remote-tracking branch 'origin/main' 2024-12-11 12:53:42 +00:00
Hosted Weblate a470366f03 Merge remote-tracking branch 'origin/main' 2024-12-07 16:59:38 +01:00
Hosted Weblate 1434ce6f57 Merge remote-tracking branch 'origin/main' 2024-12-07 14:19:34 +01:00
Hosted Weblate 654ba5b460 Merge remote-tracking branch 'origin/main' 2024-12-06 15:33:58 +01:00
Hosted Weblate e3835f70f7 Merge remote-tracking branch 'origin/main' 2024-12-06 09:57:59 +00:00
Hosted Weblate bbb803f91c Merge remote-tracking branch 'origin/main' 2024-12-06 07:47:14 +01:00
Hosted Weblate 6a4c73c821 Merge remote-tracking branch 'origin/main' 2024-12-06 06:40:34 +00:00
Hosted Weblate 853ce3c7a3 Merge remote-tracking branch 'origin/main' 2024-12-06 00:19:50 +00:00
Hosted Weblate d2ab4817b1 Merge remote-tracking branch 'origin/main' 2024-12-05 20:40:44 +00:00
Hosted Weblate 9ff1cafd5e Merge remote-tracking branch 'origin/main' 2024-12-05 17:47:38 +01:00
adbenitez 40a79fbad5 add "After 90 days" option to disappearing messages 2024-12-04 17:46:00 +01:00
Hosted Weblate bf6b678e2b Merge remote-tracking branch 'origin/main' 2024-12-04 15:54:42 +00:00
Hosted Weblate 6c1f787a38 Merge remote-tracking branch 'origin/main' 2024-12-03 14:08:04 +01:00
Hosted Weblate b059741161 Merge remote-tracking branch 'origin/main' 2024-12-03 13:22:33 +01:00
Hosted Weblate fdd5cc5d4b Merge remote-tracking branch 'origin/main' 2024-12-03 11:02:52 +01:00
Hosted Weblate 77465b5802 Merge remote-tracking branch 'origin/main' 2024-12-02 18:40:35 +01:00
Hosted Weblate d17567029d Merge remote-tracking branch 'origin/main' 2024-12-02 14:41:08 +01:00
Hosted Weblate 4610a64732 Merge remote-tracking branch 'origin/main' 2024-12-02 13:30:44 +01:00
Hosted Weblate 0358e8ffcb Merge remote-tracking branch 'origin/main' 2024-11-27 20:36:50 +01:00
Hosted Weblate 406c263d82 Merge remote-tracking branch 'origin/main' 2024-11-27 20:36:33 +01:00
Hosted Weblate 6ed070e437 Merge remote-tracking branch 'origin/main' 2024-11-27 18:15:46 +00:00
Hosted Weblate 1e4cfa124e Merge remote-tracking branch 'origin/main' 2024-11-27 18:02:12 +01:00
Hosted Weblate c42ba0f599 Merge remote-tracking branch 'origin/main' 2024-11-27 14:37:32 +01:00
Hosted Weblate 8798275170 Merge remote-tracking branch 'origin/main' 2024-11-27 14:36:54 +01:00
Hosted Weblate ac6495ff20 Merge remote-tracking branch 'origin/main' 2024-11-26 15:23:14 +00:00
Hosted Weblate 8ae47e97cf Merge remote-tracking branch 'origin/main' 2024-11-26 11:35:27 +00:00
Hosted Weblate 6a1ff0bace Merge remote-tracking branch 'origin/main' 2024-11-25 20:42:51 +01:00
Hosted Weblate 047cd9a121 Merge remote-tracking branch 'origin/main' 2024-11-25 14:44:35 +01:00
Hosted Weblate 555547b6cc Merge remote-tracking branch 'origin/main' 2024-11-25 00:56:20 +01:00
Hosted Weblate 5fe355fe90 Merge remote-tracking branch 'origin/main' 2024-11-24 20:37:20 +00:00
Hosted Weblate 6af3b0d985 Merge remote-tracking branch 'origin/main' 2024-11-24 21:20:39 +01:00
Hosted Weblate 92d6147644 Merge remote-tracking branch 'origin/main' 2024-11-23 23:34:05 +00:00
Hosted Weblate 72fb9992a1 Merge remote-tracking branch 'origin/main' 2024-11-23 23:05:09 +01:00
Hosted Weblate e8413019ff Merge remote-tracking branch 'origin/main' 2024-11-23 18:22:54 +01:00
Hosted Weblate 289118e671 Merge remote-tracking branch 'origin/main' 2024-11-22 22:07:18 +00:00
Hosted Weblate 286a84b1d4 Merge remote-tracking branch 'origin/main' 2024-11-21 00:31:16 +00:00
Hosted Weblate 8c8c003f2b Merge remote-tracking branch 'origin/main' 2024-11-20 12:59:55 +00:00
Hosted Weblate a06e36993d Merge remote-tracking branch 'origin/main' 2024-11-19 13:24:13 +01:00
Hosted Weblate ce054d93a8 Merge remote-tracking branch 'origin/main' 2024-11-19 10:38:14 +00:00
hsfg6 cabc159cd8 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/zh_Hant/
2024-11-18 23:00:26 +01:00
Hosted Weblate c78cbbe145 Merge remote-tracking branch 'origin/main' 2024-11-15 22:01:58 +01:00
Hosted Weblate a297c71a90 Merge remote-tracking branch 'origin/main' 2024-11-15 04:27:38 +01:00
Hosted Weblate 247de63362 Merge remote-tracking branch 'origin/main' 2024-11-13 20:08:39 +01:00
Hosted Weblate 20f7c7c616 Merge remote-tracking branch 'origin/main' 2024-11-13 00:16:57 +01:00
Hosted Weblate 6364903a28 Merge remote-tracking branch 'origin/main' 2024-11-12 20:35:03 +01:00
Hosted Weblate 48bb77cfae Merge remote-tracking branch 'origin/main' 2024-11-12 15:29:21 +01:00
Hosted Weblate 53bfe52797 Merge remote-tracking branch 'origin/main' 2024-11-12 09:02:21 +00:00
Hosted Weblate a8bc01e6c1 Merge remote-tracking branch 'origin/main' 2024-11-11 17:23:02 +01:00
Hosted Weblate 3fbccf3408 Merge remote-tracking branch 'origin/main' 2024-11-11 16:11:47 +01:00
Hosted Weblate 86656f1155 Merge remote-tracking branch 'origin/main' 2024-11-11 15:09:03 +00:00
Hosted Weblate 89473b8067 Merge remote-tracking branch 'origin/main' 2024-11-11 15:05:12 +00:00
Hosted Weblate 887f5881f0 Merge remote-tracking branch 'origin/main' 2024-11-09 17:33:23 +01:00
Hosted Weblate aee757e71c Merge remote-tracking branch 'origin/main' 2024-11-08 11:54:31 +00:00
Hosted Weblate 30d5eeeb45 Merge remote-tracking branch 'origin/main' 2024-11-05 15:32:37 +01:00
Hosted Weblate d2c2f2cf07 Merge remote-tracking branch 'origin/main' 2024-11-05 15:28:53 +01:00
bittin1ddc447d824349b2 f83d5a0dbb Translated using Weblate (Swedish)
Currently translated at 66.6% (2 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/sv/
2024-11-03 13:00:36 +01:00
Priit Jõerüüt c30ddf9c77 Translated using Weblate (Estonian)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://translate.codeberg.org/projects/delta-chat/android-metadata/et/
2024-08-16 08:36:46 +00:00
Outbreak2096 e14b878aef Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://translate.codeberg.org/projects/delta-chat/android-metadata/zh_Hans/
2024-08-16 08:36:46 +00:00
NicholasV 9e3ebda12a Translated using Weblate (Portuguese (Brazil))
Currently translated at 16.6% (3 of 18 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://translate.codeberg.org/projects/delta-chat/android-metadata/pt_BR/
2024-08-16 08:36:46 +00:00
gitcookie-1 4bb42b9995 Translated using Weblate (German)
Currently translated at 58.8% (10 of 17 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://translate.codeberg.org/projects/delta-chat/android-metadata/de/
2024-08-16 08:36:46 +00:00
German 59b158fe09 Translated using Weblate (German)
Currently translated at 17.6% (3 of 17 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://translate.codeberg.org/projects/delta-chat/android-metadata/de/
2024-08-16 08:36:46 +00:00
395 changed files with 15830 additions and 15894 deletions
+22
View File
@@ -0,0 +1,22 @@
version: 2
mergeable:
- when: pull_request.*
name: "Changelog check"
validate:
- do: or
validate:
- do: description
must_include:
regex: '#skip-changelog'
- do: and
validate:
- do: dependent
changed:
file: '**/*.java'
required: ['CHANGELOG.md']
fail:
- do: checks
status: 'action_required'
payload:
title: CHANGELOG.md might need an update
summary: "Please update CHANGELOG.md or add #skip-changelog to the description"
+1 -1
View File
@@ -7,7 +7,7 @@ on:
jobs:
artifacts-url-comments:
name: add artifact links to pull request
runs-on: windows-2019
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- name: add artifact links to pull request
+10 -10
View File
@@ -2,16 +2,16 @@ name: Upload Preview APK
on: pull_request
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
jobs:
build:
name: Upload Preview APK
runs-on: ubuntu-latest
steps:
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.1
with:
access_token: ${{ github.token }}
- uses: actions/checkout@v3
- uses: actions/checkout@v5
with:
submodules: recursive
- name: Validate Fastlane Metadata
@@ -19,12 +19,12 @@ jobs:
- uses: Swatinem/rust-cache@v2
with:
working-directory: jni/deltachat-core-rust
- uses: actions/setup-java@v3
- uses: actions/setup-java@v5
with:
java-version: 17
distribution: 'temurin'
- uses: android-actions/setup-android@v3
- uses: actions/cache@v3
- uses: actions/cache@v4
with:
path: |
~/.gradle/caches
@@ -37,6 +37,9 @@ jobs:
with:
ndk-version: r27
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v4
- name: Compile core
env:
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
@@ -44,9 +47,6 @@ jobs:
export PATH="${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/"
scripts/install-toolchains.sh && scripts/ndk-make.sh armeabi-v7a
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- name: Build APK
run: ./gradlew --no-daemon -PABI_FILTER=armeabi-v7a assembleFossDebug
+1 -1
View File
@@ -64,7 +64,7 @@ jobs:
uses: softprops/action-gh-release@v1
with:
token: "${{ secrets.GITHUB_TOKEN }}"
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="48">](https://apt.izzysoft.de/fdroid/index/apk/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
prerelease: ${{ contains(github.event.ref, '-beta') }}
fail_on_unmatched_files: true
files: build/outputs/apk/foss/release/*.apk
+257
View File
@@ -0,0 +1,257 @@
# Building and Testing
This document describes how to set up the build environment,
build and test the app. Before diving into developing, please
first read [CONTRIBUTING.md](./CONTRIBUTING.md) for general
contribution hints and conventions.
Please follow all steps precisely.
If you run into troubles,
ask on one of the [communication channels](https://delta.chat/contribute) for help
## Check Out Repository
When checking out _deltachat-android_, make sure also to check out the
subproject _deltachat-core-rust_:
- When using Git, you can do this initially by
`$ git clone --recursive https://github.com/deltachat/deltachat-android`
or later by `git submodule update --init --recursive`. If you do this in your
home directory, this results in the folder `~/deltachat-android` which is just fine.
## Generate JSON-RPC bindings
To generate the JSON-RPC bindings (ex. `chat.delta.rpc.*` package)
install the [dcrpcgen tool](https://github.com/chatmail/dcrpcgen)
then generate the `schema.json` file:
```
# install deltachat-rpc-server program:
cargo install --path ./jni/deltachat-core-rust/deltachat-rpc-server
# check the version of core matches:
deltachat-rpc-server --version
# generate the schema:
deltachat-rpc-server --openrpc > schema.json
```
then pass the schema file to the `dcrpcgen` tool to generate the
code:
```
dcrpcgen java --schema schema.json -o ./src/main/java/
```
## Build Using Nix
The repository contains [Nix](https://nixos.org/) development environment
described in `flake.nix` file.
If you don't have Nix installed,
the easiest way is to follow the [Lix installation instructions](https://lix.systems/install/)
as this results in a setup with [Flakes](https://nixos.wiki/wiki/Flakes) feature enabled out of the box
and can be cleanly uninstalled with `/nix/nix-installer uninstall` once you don't need it anymore.
Once you have Nix with Flakes feature set up start the development environment shell:
```
nix develop
```
Nix development environment contains Rust with cross-compilation toolchains and Android SDK.
To [build an APK](https://developer.android.com/studio/build/building-cmdline) run the following 2 steps.
Note that the first step may take some time to build for all architectures. You can optionally read
[the first comment block in the `ndk-make.sh` script](https://github.com/deltachat/deltachat-android/blob/master/scripts/ndk-make.sh)
for pointers on how to build for a specific architecture.
```
$ scripts/ndk-make.sh
$ ./gradlew assembleDebug
```
Resulting APK files can be found in
`build/outputs/apk/gplay/debug/` and
`build/outputs/apk/fat/debug/`.
## Build Using Dockerfile
Another way to build APK is to use provided `Dockerfile`
with [Docker](https://www.docker.com/) or [Podman](https://podman.io/).
Podman is a drop-in replacement for Docker that does not require root privileges.
If you don't have Docker or Podman setup yet, read [how to setup Podman](#setup-podman)
below. If you don't want to use Docker or Podman, read [how to manually install the
build environment](#install-build-environment).
First, build the image `deltachat-android` by running
```
podman build --build-arg UID=$(id -u) --build-arg GID=$(id -g) . -t deltachat-android
```
or
```
docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) . -t deltachat-android
```
Then, run the image:
```
podman run --userns=keep-id -it --name deltachat -v $(pwd):/home/app:z -w /home/app localhost/deltachat-android
```
or
```
docker run -it --name deltachat -v $(pwd):/home/app:z -w /home/app localhost/deltachat-android
```
You can leave the container with Ctrl+D or by typing `exit` and re-enter it with
`docker start -ia deltachat` or `podman start -ia deltachat`.
Within the container, install toolchains and build the native library:
```
deltachat@6012dcb974fe:/home/app$ scripts/install-toolchains.sh
deltachat@6012dcb974fe:/home/app$ scripts/ndk-make.sh
```
Then, [build an APK](https://developer.android.com/studio/build/building-cmdline):
```
deltachat@6012dcb974fe:/home/app$ ./gradlew assembleDebug
```
### Troubleshooting
- Executing `./gradlew assembleDebug` inside the container fails with `The SDK directory '/home/user/Android/Sdk' does not exist.`:
The problem is that Android Studio (outside the container) automatically creates a file `local.properties` with a content like `sdk.dir=/home/username/Android/Sdk`,
so, Gradle-inside-the-container looks for the Sdk at `/home/username/Android/Sdk`, where it can't find it.
You could:
- either: remove the file or just the line starting with `sdk.dir`
- or: run `./gradlew assembleDebug` from outside the container (however, there may be incompatibility issues if different versions are installed inside and outside the container)
- Running the image fails with `ERRO[0000] The storage 'driver' option must be set in /etc/containers/storage.conf, guarantee proper operation.`:
In /etc/containers/storage.conf, replace the line: `driver = ""` with: `driver = "overlay"`.
You can also set the `driver` option to something else, you just need to set it to _something_.
[Read about possible options here](https://github.com/containers/storage/blob/master/docs/containers-storage.conf.5.md#storage-table).
## <a name="setup-podman"></a>Setup Podman
These instructions were only tested on a Manjaro machine so far. If anything doesn't work, please open an issue.
First, [Install Podman](https://podman.io/getting-started/installation).
Then, if you want to run Podman without root, run:
```
sudo touch /etc/subgid
sudo touch /etc/subuid
sudo usermod --add-subuids 165536-231072 --add-subgids 165536-231072 yourusername
```
(replace `yourusername` with your username).
See https://wiki.archlinux.org/index.php/Podman#Rootless_Podman for more information.
## <a name="install-build-environment"></a>Install Build Environment (without Docker or Podman)
To setup build environment manually:
- _Either_, in Android Studio, go to "Tools / SDK Manager / SDK Tools", enable "Show Package Details",
select "CMake" and the desired NDK (install the same NDK version as the [Dockerfile](https://github.com/deltachat/deltachat-android/blob/master/Dockerfile)), hit "Apply".
- _Or_ read [Dockerfile](https://github.com/deltachat/deltachat-android/blob/master/Dockerfile) and mimic what it does.
Then, in both cases, install Rust using [rustup](https://rustup.rs/)
and Rust toolchains for cross-compilation by executing `scripts/install-toolchains.sh`.
Then, configure `ANDROID_NDK_ROOT` environment variable to point to the Android NDK
installation directory e.g. by adding this to your `.bashrc`:
```bash
export ANDROID_NDK_ROOT=${HOME}/Android/Sdk/ndk/[version] # (or wherever your NDK is) Note that there is no `/` at the end!
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
```
After that, call `scripts/ndk-make.sh` in the root directory to build core-rust.
Afterwards run the project in Android Studio. The project requires API 25.
With chance, that's it :) - if not, read on how to set up a proper development
environment.
## Install Development Environment
1. Some libs required by Android Studio may be missing on 64 bit Linux machines
[Source](https://developer.android.com/studio/install.html)], so for Ubuntu execute
`$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386`
and for Fedora execute
`$ sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686`.
2. Download Android Studio from <https://developer.android.com> (android-studio-ide-...-linux.zip)
and unpack the archive which contains a single folder called `android-studio`;
move this folder e.g. to `~/android-studio`.
3. To launch Android Studio for the first time, open a terminal, navigate to
`~/android-studio/bin`, execute `./studio.sh` and use all the standard values
from the wizard.
4. Android Studio now asks you if you want to open an existing project;
choose `~/deltachat-android` as created in the "Build" chapter (Android Studio starts to
build the project, however, there are some steps missing before this will
succeed).
5. If components are missing, click on the corresponding error
message and install eg. required SDKs and the "Build-Tools" (you should
also find the option at "Tools / Android / SDK Manager / SDK Platforms").
Now the build should succeed - but the app still misses the native part.
6. Download Android NDK from
[NDK Archives](https://developer.android.com/ndk/downloads)
and extract the archive containing a single folder
called something like `android-ndk-r23b-linux`; move this folder e.g. to `~/android-ndk`.
7. Export the folder path to your environment as `ANDROID_NDK_ROOT` and add it to `PATH`.
You can achieve this e.g. by adding this to your `.bashrc`
```bash
export ANDROID_NDK_ROOT=${HOME}/android-ndk
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
```
## Run UI Tests and Benchmarks
- You don't necessarily need a dedicated testing device.
Backup your current account first, maybe there are some bugs in switching accounts.
- You can run benchmarks on either an emulated device or a real device.
You need at least Android 9. For better benchmark results,
you should run the benchmark on a real device and make sure that the core is compiled in release mode.
- Disable animations on your device, otherwise the test may fail:
at "Developer options"
set all of "Window animation scale", "Transition animation scale" and "Animator duration scale" to 0x
- In Android Studio: "File" / "Sync project with gradle files"
- In Android Studio: "Run" / "Edit configurations" / "+" / "Android Instrumented test":
Either select a specific class or select "All in Module" / "OK" /
Select your configuration in the toolbar / Click on the green "run" button in the toolbar to run the tests
### Get the benchmark results
When the benchmark is done, you will get a result like
`MEASURED RESULTS (Benchmark) - Going thorough all 10 chats: 11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`.
You can paste `11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`
into a cell in a LibreOffice spreadsheet, do "Data" / "Text to columns",
choose `,` as a separator, hit "OK", and create a diagram.
### Run online tests
For some tests, you need to provide the credentials to an actual email account.
You have 2 ways to do this:
1. (Recommended): Put them into the file ~/.gradle/gradle.properties (create it if it doesn't exist):
```
TEST_ADDR=youraccount@yourdomain.org
TEST_MAIL_PW=youpassword
```
2. Or set them via environment variables.
## Decoding Symbols in Crash Reports
```
$ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decoded.txt
```
`obj/local/armeabi-v7a` is the extracted path from `deltachat-gplay-release-X.X.X.apk-symbols.zip` file from https://download.delta.chat/android/symbols/
Replace `armeabi-v7a` by the correct architecture the logs come from (can be guessed by trial and error)
+177 -4
View File
@@ -1,13 +1,186 @@
# ArcaneChat Android Changelog
# Delta Chat Android Changelog
## v1.54.2
2025-02
## v2.25.0
2025-11
* Make it possible to invite members into a channel via a QR code,
and make channels more secure
* metadata protection: protect Date header
* metadata protection: protect Autocrypt header
* better multi-device: synchronize group creation across devices
* data saving: do not send Autocrypt header in read receipts
* improve onboarding speed
* allow to save to storage files shared from inside in-chat apps
* reduce app size
* don't show badge counter in app icon for the permanent background notification
* fix sorting of old media in gallery
* fix text direction in "x members" subtitle for RTL languages
* fix group invite QR screen's layout
* tweak text hints in advanced classic e-mail configuration
* remove deprecated "companion app" code
* remove deprecated "Watch Sent Folder" preference
* remove deprecated "send self-report" preference
* don't show email address in shared vcard
* update to core 2.25.0
## v2.22.0
2025-10
* target Android 15
* improve readability of info messages in dark mode
* drop too short disappearing messages options
* fix Direct Share shortcuts
* fix: don't show error message when cancelling profile creation
* enable permanent notification by default if push notifications are not available
* hide "clone chat" and member list for incoming channels
* show warning if background notifications will be unreliable
* warn if the app has not been updated after 6 months instead of 1 year
* avoid "unknown sender for this chat" error
* properly display "Messages are end-to-end encrypted." in all encrypted groups
* show dialog if user has permanently denied camera permission and tries to take picture for group avatar
* several small fixes and improvements
* add experimental built-in calls
* update to core 2.22.0
## v2.11.0
2025-08
* add "After 1 year" option to disappearing messages
* improve image quality when setting group avatars
* add Estonian translation, update other translations
* allow to clone email chats
* fix some small bugs
* update to core 2.11.0
## v2.10.0
2025-08
* fix "Archived" item's layout in chat-list
* don't enlarge "Saved Messages" and "Devices Messages" avatars on click
* share email address for email contacts instead of vCard
* open existing encrypted chat when opening a mailto link or clicking an email address in a message bubble
* update to core 2.10.0
## v2.9.0
2025-07
* hide contact email addresses in search results
* disable non-functional message editing and ephemeral messages timer settings in classic email thread chat
* don't enlarge email chats avatar placeholder
* improve message date/status footer layout, also in RTL languages
* display correct text when receiving a "Disappearing messages enabled" system message
* Update to core 2.9.0
## v2.8.0
2025-07
* Profiles focus on recognizing contacts
* See the number of media directly in the profile, no need to tap around
* Clearer app lists by removing redundant "App" subtitle
* New button for quick access to the apps sent in current chat
* New icon for the in-chat apps button
* Improve hint for app drafts
* Add Text-To-Speech (TTS) support for in-chat apps
* New icon for the QR icon
* Start rebuilding the experimental broadcast lists
into proper channels - note that this is work-in-progress
* Improved separation between unencrypted chats/contacts and encrypted ones, avoiding mixing of encrypted and unencrypted messages in the same chat
* Removed padlocks, as encrypted is the default "normal" state. Instead, unencrypted email is marked with a small email / letter (✉️) icon
* Classic email chats/threads get a big email / letter icon making it easy to recognize
* After some time, add a device message asking to donate. Can't wait? Donate today at https://delta.chat/donate
* Allow to sort profiles up in the profile switcher
* Add new option to create unencrypted email thread
* Green checkmarks are removed where they mostly refer to guaranteed encryption, which is the default now. They are still used for profile's "Introduced by"
* Update to core 2.8.0
## v1.58.4
2025-05
* make in-chat apps properly work when they are not sent yet, in draft mode
* better avatar quality
* some more bug fixes and updated translations
* update to core 1.159.5
## v1.58.3
2025-05
* fix: webxdc.selfName uses the name otherwise displayed
* fix potential crash on startup
* add donation link to app settings
* update to core 1.159.3
## v1.58.2
2025-04
* fix draft writing area disappearing for some chats
* update to core 1.159.2
## v1.58.1
2025-04
* tapping info messages with contacts open the contact's profile
* hide superfluous "Show Classic E-mails" advanced setting for chatmail
* show profile bio/status under name in main settings screen
* remove mostly non-telling transport addresses when referring to a contact;
the contact's profile gives a much better overview
* Disable AEAP to enable us to overhaul some things - there are big changes underway in this area, which will come in a few months
* don't display email address in contact list and member list for contacts with green-checkmark
* avoid crash in Notifications preferences if ringtone title can't be read
* don't display forwarded messages as "edited" if original message was edited
* support importing contact from ProtonMail vCard attachments received in chats
* send encrypted in the experimental broadcast lists feature
* wait for QR scan (or invite link click) process to complete before allowing to send messages
* show connectivity status dot when profile is connecting or not connected
* never send Autocrypt-Gossip in broadcast lists.
* update to core 1.159.1
## v1.56.1
2025-03
* ignore click in info-messages from deleted in-chat apps
* data saving: do not send messages to the server if user is the only member of the chat in single-device usage
* protect metadata: encrypt message's sent date
* do not fail to send messages in groups if some encryption keys are missing
* synchronize contact name changes across devices
* fix changing group names that was not working in some situations
* fix: do not show outdated message text in "Message Info" of an edited message
* some more small bug fixes and updated translations
* update to core 1.158.0
## v1.56.0
2025-03
* allow to edit messages
* allow to delete messages for everyone
* add mute option "8 hours"
* add menu option to easily save/unsave selected message
* improve deletion confirmation for "Device Messages"
* remove dangerous encryption options
* always paste as plain text in message draft area
* some small bug fixes and updated translations
* update to core 1.157.2
## v1.54.4
2025-03
* allow better avatar (profile picture) quality
* remove notifications from chat that was deleted from other device
* when a chat is deleted, also delete its messages from server
* avoid freezing when opening the app for the first time after install
* avoid crash when adding chat shortcut to home screen
* some small bug fixes and updated translations
* update to core 1.156.3
## v1.54.3
2025-03
* allow to add any chat to the home screen
* update "forward message" icon and organize the messages actions bar
* do not allow non-members to change ephemeral timer settings of groups
* properly display padlock when the message is not sent over the network
* sync message deletion to other devices
* sync chat deletion across devices
* Show sender in "Saved Messages"
* allow scanning multiple QR-invitation codes without needing to wait for completion to scan the next one
* when reactions are seen in one device, remove notification from your other devices
* don't disturb with notification when someone leave a group
@@ -16,7 +189,7 @@
* prepare the app for receiving message deletion requests
* do some small bug fixes
* update translations
* update to core 1.156.1
* update to core 1.156.2
## v1.54.0
2025-02
+1 -1
View File
@@ -45,7 +45,7 @@ Some rough ideas, that may be helpful when thinking about how to enhance things:
## Contributing Code
The [README](./README.md) explains in detail how to set up the build environment.
The [BUILDING.md](./BUILDING.md) file explains in detail how to set up the build environment.
Please follow all steps precisely.
If you run into troubles,
ask on one of the [communication channels](https://delta.chat/contribute) for help.
+1 -3
View File
@@ -4,7 +4,6 @@ A [Delta Chat](https://delta.chat/) client for Android. Learn more at: https://a
[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat)
[<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite)
[<img src="store/get-it-on-IzzyOnDroid.png" alt="Get it on IzzyOnDroid" height="48">](https://apt.izzysoft.de/fdroid/index/apk/chat.delta.lite)
[<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)
@@ -16,7 +15,6 @@ This app has some extended support for WebXDC apps:
- `window.webxdc.arcanechat` a string with the ArcaneChat version and can be used by app developers
to detect when they can use the ArcaneChat-specific features.
- `window.webxdc.isCommunity` true if the current account is a community account
- `sendToChat()`: extra property `subject` can be set to a text string to set message/email's subject.
- `sendToChat()`: extra property `html` can be set to a string of html markup to set the HTML part of the email/message.
- `sendToChat()`: the file object parameter also accepts a `type` field that can be one of:
@@ -32,4 +30,4 @@ This app has some extended support for WebXDC apps:
This app is based on the [official Delta Chat client](https://github.com/deltachat/deltachat-android) with several improvements.
This app uses a [modified](https://github.com/ArcaneChat/core) version of the [Delta Chat Core Library](https://github.com/deltachat/deltachat-core-rust).
This app uses a [modified](https://github.com/ArcaneChat/core) version of the [Chatmail Core Library](https://github.com/chatmail/core).
+11 -23
View File
@@ -13,25 +13,24 @@ on the command-line, in a PR called "update-core-and-stuff-DATE":
./scripts/ndk-make.sh
```
a) Update `CHANGELOG.md`
from <https://github.com/chatmail/core/blob/main/CHANGELOG.md>,
do not just copy and avoid technical terms.
The changelog is for the end user and shall show impacts form that angle.
Add used core version to end of changelog entry
as `update to core 1.2.3` or `using core 1.2.3`
2. update translations and local help:
```
./scripts/tx-pull-translations.sh
./scripts/create-local-help.sh # requires deltachat-pages checked out at ../deltachat-pages
```
the "update-core-and-stuff-DATE" PR can be merged without review
(as everything was already reviewed in their repos).
the following steps are done in a PR called `prep-VERSION` (no leading "v"):
3. a) update `CHANGELOG.md`
from <https://github.com/deltachat/deltachat-core-rust/blob/main/CHANGELOG.md>
and <https://github.com/deltachat/deltachat-android/pulls?q=is%3Apr+is%3Aclosed+sort%3Aupdated-desc>.
do not just copy and avoid technical terms.
the changelog is for the end user and shall show impacts form that angle.
b) update changelog date as `YYYY-MM`
c) add used core version to end of changelog entry
as `update to core 1.2.3` or `using core 1.2.3`
3. Update `CHANGELOG.md`:
Rename header with version number and add date as `YYYY-MM`
in case previous entries of the changelog refer to betas or to not officially released versions,
the entries can be summarized.
@@ -110,17 +109,6 @@ This may take some days.
c) tap "Publish release"
## Release on Amazon Appstore
on <https://developer.amazon.com/dashboard>:
12. a) click "App List", for "Delta Chat", select "Add upcoming version" on the left
b) at "Step 1 / Existing file(s)" hit "Replace", upload the APK from above
c) on the "Step 1" page, add "Release notes" from CHANGELOG.md, hit "Next"
d) on "Step 2" and "Step 3" pages, hit "Next"
e) on "Step 4" page: "Submit app"
## Release on Huawei AppGallery
on <https://developer.huawei.com/consumer/en/appgallery>:
@@ -131,7 +119,7 @@ on <https://developer.huawei.com/consumer/en/appgallery>:
d) Hit "Submit"; on the next page, confirm version and language
## Releases on Apklis, Passkoocheh
## Releases on other stores (ex. Passkoocheh)
These stores are not under our control.
On important updates **ping store maintainers** and ask to update.
+31 -34
View File
@@ -1,5 +1,5 @@
plugins {
id 'com.android.application' version '8.5.2'
id 'com.android.application' version '8.11.1'
id 'com.google.gms.google-services' version '4.4.1'
}
@@ -21,7 +21,7 @@ android {
}
namespace "org.thoughtcrime.securesms"
flavorDimensions "none"
compileSdk 34
compileSdk 35
// 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 30000713
versionName "1.54.3"
versionCode 30000732
versionName "2.25.0"
applicationId "chat.delta.lite"
multiDexEnabled true
minSdkVersion 21
targetSdkVersion 34
targetSdkVersion 35
vectorDrawables.useSupportLibrary = true
@@ -130,7 +130,9 @@ android {
buildTypes {
debug {
minifyEnabled false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
testProguardFiles 'test-proguard-rules.pro'
applicationIdSuffix ".beta"
}
release {
@@ -144,9 +146,10 @@ android {
// nb: it is highly recommended to use the same settings in debug+release -
// otherwise problems might be noticed delayed only
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
testProguardFiles 'test-proguard-rules.pro'
productFlavors.foss.signingConfig signingConfigs.releaseFdroid
productFlavors.gplay.signingConfig signingConfigs.releaseApk
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
@@ -209,9 +212,9 @@ dependencies {
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
implementation 'androidx.sharetarget:sharetarget:1.2.0'
implementation 'androidx.webkit:webkit:1.12.1'
implementation 'androidx.webkit:webkit:1.14.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation ('androidx.preference:preference:1.2.1') {
@@ -219,7 +222,7 @@ dependencies {
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel-ktx'
}
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
implementation 'androidx.exifinterface:exifinterface:1.3.7'
implementation 'androidx.exifinterface:exifinterface:1.4.1'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.2'
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.2'
@@ -233,52 +236,46 @@ dependencies {
implementation 'com.google.zxing:core:3.3.0' // fixed version to support SDK<24
implementation ('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } // QR Code scanner
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' // used as JSON library
implementation 'com.google.code.gson:gson:2.12.1' // used as JSON library.
implementation "me.leolin:ShortcutBadger:1.1.16" // display messagecount on the home screen icon.
implementation 'com.jpardogo.materialtabstrip:library:1.0.9' // used in the emoji selector for the tab selection.
implementation 'com.github.chrisbanes:PhotoView:2.1.3' // does the zooming on photos / media
implementation 'com.github.penfeizhou.android.animation:awebp:3.0.2' // animated webp support.
implementation 'com.github.Baseflow:PhotoView:2.3.0' // does the zooming on photos / media
implementation 'com.caverock:androidsvg-aar:1.4' // SVG support.
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
implementation 'com.github.bumptech.glide:glide:4.16.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
annotationProcessor 'androidx.annotation:annotation:1.9.1'
implementation 'com.makeramen:roundedimageview:2.1.0' // crops the avatars to circles
implementation 'com.pnikosis:materialish-progress:1.5' // used only in the "Progress Wheel" in Share Activity.
implementation 'com.makeramen:roundedimageview:2.3.0' // crops the avatars to circles
implementation 'com.github.amulyakhare:TextDrawable:558677ea31' // number of unread messages,
// the one-letter circle for the contacts (when there is not avatar) and a white background.
implementation 'com.googlecode.mp4parser:isoparser:1.0.6' // MP4 recoding; upgrading eg. to 1.1.22 breaks recoding, however, i have not investigated further, just reset to 1.0.6
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.6.0') { // for the zooming on photos / media
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.10.0') { // for the zooming on photos / media
exclude group: 'com.android.support', module: 'support-annotations'
}
implementation 'com.annimon:stream:1.1.8' // brings future java streams api to SDK Version < 24
// Replacement for ContentResolver
// that protects against the Surreptitious Sharing attack.
// <https://github.com/cketti/SafeContentResolver>
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0'
gplayImplementation('com.google.firebase:firebase-messaging:24.1.0') { // for PUSH notifications
gplayImplementation('com.google.firebase:firebase-messaging:24.1.2') { // for PUSH notifications, don't upgrade: v25.0.0 requires minSdk>=23
exclude group: 'com.google.firebase', module: 'firebase-core'
exclude group: 'com.google.firebase', module: 'firebase-analytics'
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
}
testImplementation 'junit:junit:4.13.2'
testImplementation 'org.assertj:assertj-core:1.7.1'
testImplementation 'org.mockito:mockito-core:1.9.5'
testImplementation 'org.powermock:powermock-api-mockito:1.6.1'
testImplementation 'org.powermock:powermock-module-junit4:1.6.1'
testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1'
testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1'
testImplementation 'org.assertj:assertj-core:3.27.3'
testImplementation 'org.mockito:mockito-core:5.18.0'
testImplementation 'org.powermock:powermock-api-mockito:1.7.4'
testImplementation 'org.powermock:powermock-module-junit4:2.0.9'
testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.9'
testImplementation 'org.powermock:powermock-classloading-xstream:2.0.9'
androidTestImplementation 'androidx.test:runner:1.6.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.6.1'
androidTestImplementation 'androidx.test:rules:1.6.1'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test:runner:1.7.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.7.0'
androidTestImplementation 'androidx.test:rules:1.7.0'
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
androidTestImplementation 'com.android.support:support-annotations:28.0.0'
androidTestImplementation ('org.assertj:assertj-core:1.7.1') {
androidTestImplementation ('org.assertj:assertj-core:3.27.3') {
exclude group: 'org.hamcrest', module: 'hamcrest-core'
}
}
@@ -1,16 +1,16 @@
ArcaneChat is a decentralized and secure messenger app that is compatible with the existing e-mail infrastructure.
ArcaneChat is a decentralized and secure instant messenger that is easy to use for friends and family.
Some features at a glance:
• Anonymous. Instant onboarding without a phone number, e-mail or other private data.
💬 Reliable instant messaging with multi-profile and multi-device support.
• Flexible. Supports multiple chat profiles and is easy to setup on multiple devices.
⚡️ Sign-up easily using secure fast chatmail servers. You dont need a phone number or any private data.
• Extensible. Use mini-apps in chats like shopping lists, calendars or games.
📧 Alternatively, use your existing classic e-mail address to read your inbox as chats.
• Reliable. Works under bad and adversarial network conditions.
🎮 Interactive mini-apps in chats for gaming and collaboration.
• Secure. Audited End-to-End encryption safe against network and server attacks.
🔒 Audited end-to-end encryption safe against network and server attacks.
• Sovereign. Can be run with your own e-mail address or server.
ArcaneChat is a Delta Chat client and was created with a focus on usability, good user experience, and saving data plan. Also the app usually experiments with new features that eventually might get added to the official Delta Chat client.
@@ -24,7 +24,7 @@ ArcaneChat is a Delta Chat client and was created with a focus on usability, goo
<li>It is possible to disable profiles to completely disconnect them saving data/bandwidth</li>
<li>You can easily see the connection status of all your profiles in the profile switcher</li>
<li>A videochat instance is set by default</li>
<li>Location streaming feature enabled by default and extra option to share location for 12 hours</li>
<li>Extra option to share location for 12 hours</li>
<li>Clicking on a message with a POI location, will open the POI on the map</li>
<li>Last-seen status of contacts is shown in your contact list, like in WhatsApp, Telegram, etc.</li>
<li>Videos are played in loop, useful for short GIF videos</li>
@@ -32,8 +32,6 @@ ArcaneChat is a Delta Chat client and was created with a focus on usability, goo
<li>Voice messages have more aggressive compression in "worse quality" mode to save data plan</li>
<li>Automatic download of messages limited to 640KB by default</li>
<li>Profile's display name is always shown in the app's title bar instead of the name of the app</li>
<li>Your avatar is visible to other users in Mailing Lists</li>
<li>Can be selected as app to open .xdc files</li>
<li>For mini-apps developers: there are some extra features in the WebXDC API, check https://github.com/ArcaneChat/android/#webxdc</li>
<li>Better settings organization with additional "Privacy" section</li>
</ul>
Generated
+18 -18
View File
@@ -7,11 +7,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1733948466,
"narHash": "sha256-o/uq/tU458Ykudi8Zk3sRga5iazkuSczt9wDOCUDOSU=",
"lastModified": 1756239746,
"narHash": "sha256-0ibN685tT+u/Nbmbrrq9G3mRUzct2Votyv/a7Wwv26s=",
"owner": "tadfisher",
"repo": "android-nixpkgs",
"rev": "0bf99ffaea6a7c0948ae10cf2e40c2905e4e4d6b",
"rev": "256631d162ec883b2341ee59621516e1f65f0f6b",
"type": "github"
},
"original": {
@@ -28,11 +28,11 @@
]
},
"locked": {
"lastModified": 1728330715,
"narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=",
"lastModified": 1741473158,
"narHash": "sha256-kWNaq6wQUbUMlPgw8Y+9/9wP0F8SHkjy24/mN3UAppg=",
"owner": "numtide",
"repo": "devshell",
"rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef",
"rev": "7c9e793ebe66bcba8292989a68c0419b737a22a0",
"type": "github"
},
"original": {
@@ -79,11 +79,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1733759999,
"narHash": "sha256-463SNPWmz46iLzJKRzO3Q2b0Aurff3U1n0nYItxq7jU=",
"lastModified": 1756125398,
"narHash": "sha256-XexyKZpf46cMiO5Vbj+dWSAXOnr285GHsMch8FBoHbc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "a73246e2eef4c6ed172979932bc80e1404ba2d56",
"rev": "3b9f00d7a7bf68acd4c4abb9d43695afb04e03a5",
"type": "github"
},
"original": {
@@ -95,11 +95,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1733749988,
"narHash": "sha256-+5qdtgXceqhK5ZR1YbP1fAUsweBIrhL38726oIEAtDs=",
"lastModified": 1756159630,
"narHash": "sha256-ohMvsjtSVdT/bruXf5ClBh8ZYXRmD4krmjKrXhEvwMg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "bc27f0fde01ce4e1bfec1ab122d72b7380278e68",
"rev": "84c256e42600cb0fdf25763b48d28df2f25a0c8b",
"type": "github"
},
"original": {
@@ -111,11 +111,11 @@
},
"nixpkgs_3": {
"locked": {
"lastModified": 1728538411,
"narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=",
"lastModified": 1744536153,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221",
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
"type": "github"
},
"original": {
@@ -138,11 +138,11 @@
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1733970833,
"narHash": "sha256-sPEKtSaZk2CtfF9cdhtbY93S6qGq+d2PKI1fcoDfDaI=",
"lastModified": 1756197489,
"narHash": "sha256-S16rPaBH1TnMbDyL5NlGSJcYd7wPlOEWTStdBDL7BHw=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "f7f4c59ccdf1bec3f1547d27398e9589aa94e3e8",
"rev": "8ec04f46f1edeeed3f870da62191745b93975da7",
"type": "github"
},
"original": {
+10 -6
View File
@@ -15,19 +15,23 @@
pkgs = import nixpkgs { inherit system overlays; };
android-sdk = android.sdk.${system} (sdkPkgs:
with sdkPkgs; [
build-tools-34-0-0
build-tools-35-0-0
cmdline-tools-latest
platform-tools
platforms-android-34
ndk-27-0-11902837
platforms-android-35
ndk-27-2-12479018
]);
rust-version = pkgs.lib.removeSuffix "\n"
(builtins.readFile ./scripts/rust-toolchain);
in {
devShells.default = pkgs.mkShell {
in
{
formatter = pkgs.nixpkgs-fmt;
devShells.default = pkgs.mkShell rec {
ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk";
ANDROID_NDK_ROOT =
"${android-sdk}/share/android-sdk/ndk/27.0.11902837";
"${android-sdk}/share/android-sdk/ndk/27.2.12479018";
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/35.0.0/aapt2";
buildInputs = [
android-sdk
pkgs.openjdk17
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+20 -62
View File
@@ -536,10 +536,10 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_createChatByContactId(JNIEnv *e
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_createGroupChat(JNIEnv *env, jobject obj, jboolean verified, jstring name)
JNIEXPORT jint Java_com_b44t_messenger_DcContext_createGroupChat(JNIEnv *env, jobject obj, jstring name)
{
CHAR_REF(name);
jint ret = (jint)dc_create_group_chat(get_dc_context(env, obj), verified, namePtr);
jint ret = (jint)dc_create_group_chat(get_dc_context(env, obj), 0, namePtr);
CHAR_UNREF(name);
return ret;
}
@@ -735,12 +735,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendTextMsg(JNIEnv *env, jobjec
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendVideochatInvitation(JNIEnv *env, jobject obj, jint chat_id)
{
return (jint)dc_send_videochat_invitation(get_dc_context(env, obj), chat_id);
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_sendWebxdcStatusUpdate(JNIEnv *env, jobject obj, jint msg_id, jstring payload)
{
CHAR_REF(payload);
@@ -922,15 +916,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_initiateKeyTransfer(JNIEnv *
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_continueKeyTransfer(JNIEnv *env, jobject obj, jint msg_id, jstring setupCode)
{
CHAR_REF(setupCode);
jboolean ret = dc_continue_key_transfer(get_dc_context(env, obj), msg_id, setupCodePtr);
CHAR_UNREF(setupCode);
return ret;
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_imex(JNIEnv *env, jobject obj, jint what, jstring dir)
{
CHAR_REF(dir);
@@ -1246,6 +1231,12 @@ JNIEXPORT jint Java_com_b44t_messenger_DcChat_getColor(JNIEnv *env, jobject obj)
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isEncrypted(JNIEnv *env, jobject obj)
{
return dc_chat_is_encrypted(get_dc_chat(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isUnpromoted(JNIEnv *env, jobject obj)
{
return dc_chat_is_unpromoted(get_dc_chat(env, obj))!=0;
@@ -1270,16 +1261,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_canSend(JNIEnv *env, jobject o
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isProtected(JNIEnv *env, jobject obj)
{
return dc_chat_is_protected(get_dc_chat(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isProtectionBroken(JNIEnv *env, jobject obj)
{
return dc_chat_is_protection_broken(get_dc_chat(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isSendingLocations(JNIEnv *env, jobject obj)
{
@@ -1382,11 +1363,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getId(JNIEnv *env, jobject obj)
return dc_msg_get_id(get_dc_msg(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getSenderColor(JNIEnv *env, jobject obj)
{
return dc_msg_get_sender_color(get_dc_msg(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getText(JNIEnv *env, jobject obj)
{
char* temp = dc_msg_get_text(get_dc_msg(env, obj));
@@ -1441,6 +1417,12 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getInfoType(JNIEnv *env, jobject ob
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getInfoContactId(JNIEnv *env, jobject obj)
{
return dc_msg_get_info_contact_id(get_dc_msg(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getState(JNIEnv *env, jobject obj)
{
return dc_msg_get_state(get_dc_msg(env, obj));
@@ -1600,12 +1582,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isInfo(JNIEnv *env, jobject obj
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isSetupMessage(JNIEnv *env, jobject obj)
{
return dc_msg_is_setupmessage(get_dc_msg(env, obj));
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_hasHtml(JNIEnv *env, jobject obj)
{
return dc_msg_has_html(get_dc_msg(env, obj))!=0;
@@ -1621,21 +1597,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getSetupCodeBegin(JNIEnv *env, j
}
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getVideochatUrl(JNIEnv *env, jobject obj)
{
char* temp = dc_msg_get_videochat_url(get_dc_msg(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getVideochatType(JNIEnv *env, jobject obj)
{
return (jint)dc_msg_get_videochat_type(get_dc_msg(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setSubject(JNIEnv *env, jobject obj, jstring text)
{
CHAR_REF(text);
@@ -1823,15 +1784,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getAddr(JNIEnv *env, jobject
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getNameNAddr(JNIEnv *env, jobject obj)
{
char* temp = dc_contact_get_name_n_addr(get_dc_contact(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContact_getProfileImage(JNIEnv *env, jobject obj)
{
char* temp = dc_contact_get_profile_image(get_dc_contact(env, obj));
@@ -1879,6 +1831,12 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isVerified(JNIEnv *env, job
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContact_isKeyContact(JNIEnv *env, jobject obj)
{
return dc_contact_is_key_contact(get_dc_contact(env, obj))==1;
}
JNIEXPORT jint Java_com_b44t_messenger_DcContact_getVerifierId(JNIEnv *env, jobject obj)
{
return dc_contact_get_verifier_id(get_dc_contact(env, obj));
+4 -9
View File
@@ -1,15 +1,10 @@
# native methods
-keep class com.b44t.messenger.** { * ; }
# Gson uses generic type information stored in a class file when working with
# fields. Proguard removes such information by default, keep it.
-keepattributes Signature
# This is also needed for R8 in compat mode since multiple
# optimizations will remove the generic signature such as class
# merging and argument removal. See:
# https://r8.googlesource.com/r8/+/refs/heads/main/compatibility-faq.md#troubleshooting-gson-gson
-keep class com.google.gson.reflect.TypeToken { *; }
-keep class * extends com.google.gson.reflect.TypeToken
# Keep metadata needed by the JSON parser
-keep class chat.delta.rpc.** { * ; }
-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; }
# bug with video recoder
-keep class com.coremedia.iso.** { *; }
+2 -2
View File
@@ -11,13 +11,13 @@ echo "==================== ANDROID USAGE ===================="
grep --exclude={*.apk,*.a,*.o,*.so,strings.xml,*symbols.zip} --exclude-dir={.git,.gradle,obj,release,.idea,build,deltachat-core-rust} -ri $TEXT .
echo "==================== IOS USAGE ===================="
grep --exclude=*.strings --exclude-dir={.git,libraries,Pods,deltachat-ios.xcodeproj,deltachat-ios.xcworkspace} -ri $TEXT ../deltachat-ios/
grep --exclude=*.strings* --exclude-dir={.git,libraries,Pods,deltachat-ios.xcodeproj,deltachat-ios.xcworkspace} -ri $TEXT ../deltachat-ios/
echo "==================== DESKTOP USAGE ===================="
grep --exclude-dir={.cache,.git,html-dist,node_modules,_locales} -ri $TEXT ../deltachat-desktop/
echo "==================== JSONRPC USAGE ===================="
grep --exclude-dir={.git} -ri $TEXT ../deltachat-core-rust/deltachat-jsonrpc
grep --exclude-dir={.git} -ri $TEXT ../chatmail/core/deltachat-jsonrpc
echo "==================== UBUNTU TOUCH USAGE ===================="
grep --exclude-dir={.git} -ri $TEXT ../deltatouch/
+15 -12
View File
@@ -53,7 +53,6 @@ fi
# for reproducible build:
export RUSTFLAGS="-C link-args=-Wl,--build-id=none --remap-path-prefix=$HOME/.cargo= --remap-path-prefix=$(realpath $(dirname $(dirname "$0")))="
export SOURCE_DATE_EPOCH=1
export CARGO_TARGET_DIR=/tmp/arcanechat-build
# always use the same path to NDK:
rm -f /tmp/android-ndk-root
ln -s "$ANDROID_NDK_ROOT" /tmp/android-ndk-root
@@ -74,6 +73,10 @@ if test -z "$NDK_HOST_TAG"; then
NDK_HOST_TAG="$KERNEL-$ARCH"
fi
if test -z "$CARGO_TARGET_DIR"; then
export CARGO_TARGET_DIR=/tmp/arcanechat-build
fi
TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$NDK_HOST_TAG"
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang"
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/aarch64-linux-android21-clang"
@@ -127,7 +130,7 @@ if test -z $1 || test $1 = armeabi-v7a; then
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi
cp $CARGO_TARGET_DIR/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a
cp "$CARGO_TARGET_DIR/armv7-linux-androideabi/$RELEASE/libdeltachat.a" "$jnidir/armeabi-v7a"
fi
if test -z $1 || test $1 = arm64-v8a; then
@@ -136,7 +139,7 @@ if test -z $1 || test $1 = arm64-v8a; then
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi
cp $CARGO_TARGET_DIR/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a
cp "$CARGO_TARGET_DIR/aarch64-linux-android/$RELEASE/libdeltachat.a" "$jnidir/arm64-v8a"
fi
if test -z $1 || test $1 = x86; then
@@ -145,17 +148,17 @@ if test -z $1 || test $1 = x86; then
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi
cp $CARGO_TARGET_DIR/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
cp "$CARGO_TARGET_DIR/i686-linux-android/$RELEASE/libdeltachat.a" "$jnidir/x86"
fi
if test -z $1 || test $1 = x86_64; then
echo "-- cross compiling to x86_64-linux-android (x86_64) --"
TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi
cp $CARGO_TARGET_DIR/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64
fi
if test -z $1 || test $1 = x86_64; then
echo "-- cross compiling to x86_64-linux-android (x86_64) --"
TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi
cp "$CARGO_TARGET_DIR/x86_64-linux-android/$RELEASE/libdeltachat.a" "$jnidir/x86_64"
fi
echo -- ndk-build --
+2 -1
View File
@@ -1,7 +1,8 @@
#!/bin/sh
# replace Delta Chat with ArcaneChat
find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/get.delta.chat/github.com\/ArcaneChat/g'
find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/Delta Chat/ArcaneChat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/get.delta.chat/github.com\/ArcaneChat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/delta.chat\/donate/arcanechat.me\/#contribute/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/Delta Chat/ArcaneChat/g'
+1 -1
View File
@@ -1 +1 @@
1.83.0
1.86.0
+4
View File
@@ -2,6 +2,10 @@
find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/github.com\/ArcaneChat/get.delta.chat/g'
find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/ArcaneChat/Delta Chat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/github.com\/ArcaneChat/get.delta.chat/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/arcanechat.me\/#contribute/delta.chat\/donate/g'
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/ArcaneChat/Delta Chat/g'
# don't revert the app name
sed -i 's/>Delta Chat</>ArcaneChat</g' ./src/main/res/values/strings.xml
@@ -54,7 +54,7 @@ public class ForwardingTest {
// The thing is, DC_STATE_OUT_PENDING show a rotating circle animation, and Espresso doesn't work
// with animations, and the tests would hang and never finish.
dcContext.setConfig("bcc_self", "0");
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat(false, "group"));
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat( "group"));
}
@After
@@ -52,7 +52,7 @@ public class SharingTest {
@Before
public void createGroup() {
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat(false, "group"));
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat( "group"));
}
@Before
+22 -36
View File
@@ -78,17 +78,6 @@
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.GET_CONTENT"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="content"/>
<data android:scheme="file"/>
<data android:mimeType="*/*" />
<data android:mimeType="application/octet-stream" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT"/>
@@ -224,8 +213,6 @@
<intent-filter>
<data android:scheme="mailto"/>
<data android:scheme="http"/>
<data android:scheme="https"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
@@ -251,18 +238,6 @@
android:windowSoftInputMode="stateUnchanged"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- this scheme is used as the redirect_url for getOauth2Url()
and should be whitelisted by the supported oauth2 services -->
<data android:scheme="chat.delta" android:path="/${applicationId}/auth" tools:ignore="AppLinkUrlError"/>
<data android:scheme="chat.delta" android:path="/auth" tools:ignore="AppLinkUrlError"/>
</intent-filter>
</activity>
<activity android:name=".proxy.ProxySettingsActivity"
@@ -300,6 +275,10 @@
android:theme="@style/TextSecure.LightNoActionBar"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name=".AllMediaActivity"
android:theme="@style/TextSecure.LightNoActionBar"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name=".DummyActivity"
android:theme="@android:style/Theme.NoDisplay"
android:enabled="true"
@@ -379,6 +358,13 @@
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
</activity>
<activity android:name=".calls.CallActivity"
android:label=""
android:theme="@style/TextSecure.LightTheme"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
android:exported="true">
</activity>
<activity android:name=".WebxdcActivity"
android:label=""
android:theme="@style/TextSecure.LightTheme"
@@ -418,17 +404,6 @@
android:name=".service.FetchForegroundService"
android:foregroundServiceType="dataSync" />
<service
android:name=".service.IPCAddAccountsService"
android:foregroundServiceType="dataSync"
android:enabled="true"
android:exported="true"
>
<intent-filter>
<action android:name="chat.delta.addaccount" />
</intent-filter>
</service>
<receiver android:name=".notifications.MarkReadReceiver"
android:enabled="true"
android:exported="false">
@@ -438,6 +413,14 @@
</intent-filter>
</receiver>
<receiver android:name=".notifications.DeclineCallReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="org.thoughtcrime.securesms.notifications.DECLINE_CALL_NOTICED"/>
</intent-filter>
</receiver>
<receiver android:name=".notifications.RemoteReplyReceiver"
android:enabled="true"
android:exported="false">
@@ -511,5 +494,8 @@
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
</manifest>
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+337 -364
View File
@@ -10,7 +10,9 @@
<li><a href="#wer-sieht-mein-profilbild">Wer sieht mein Profilbild?</a></li>
<li><a href="#signature">Kann ich eine Signatur (Status/Motto) festlegen?</a></li>
<li><a href="#was-bedeutet-anheften-stummschalten-archivieren">Was bedeutet Anheften, Stummschalten, Archivieren?</a></li>
<li><a href="#save">Wie funktionieren “Gespeicherte Nachrichten”?</a></li>
<li><a href="#was-bedeutet-der-grüne-punkt">Was bedeutet der grüne Punkt?</a></li>
<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>
</ul>
</li>
@@ -34,29 +36,25 @@
<li><a href="#warum-integriert-sich-delta-chat-in-zentralisierte-proprietäre-applegoogle-push-dienste">Warum integriert sich Delta Chat in zentralisierte, proprietäre Apple/Google-Push-Dienste?</a></li>
</ul>
</li>
<li><a href="#verschlüsselung-und-sicherheit">Verschlüsselung und Sicherheit</a>
<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">Wie kann ich wissen, ob Nachrichten Ende-zu-Ende-verschlüsselt sind?</a></li>
<li><a href="#howtoe2ee">Wie kann ich garantierte Ende-zu-Ende-Verschlüsselung und grüne Häkchen erhalten?</a></li>
<li><a href="#e2eeguarantee">Was bedeuten das “Grüne Häkchen” und die “garantierte Ende-zu-Ende-Verschlüsselung”?</a></li>
<li><a href="#nocryptanymore">Ein Kontakt hat eine Nachricht von einem anderen Gerät gesendet”, was kann ich tun?</a></li>
<li><a href="#kann-ich-e-mails-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden">Kann ich E-Mails ohne Ende-zu-Ende-Verschlüsselung empfangen oder senden?</a></li>
<li><a href="#howtoe2ee">Wie kann ich einen Chat mit einem neuen Kontakt erstellen?</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>
<li><a href="#openpgp-alternatives">Wurden Alternativen zu OpenPGP für die Ende-zu-Ende-Verschlüsselung in Betracht gezogen?</a></li>
<li><a href="#ist-delta-chat-anfällig-für-efail">Ist Delta Chat anfällig für EFAIL?</a></li>
<li><a href="#tls">Wird eine Nachricht im Klartext gesendet, wenn keine Ende-zu-Ende-Verschlüsselung verfügbar ist?</a></li>
<li><a href="#tls">Sind mit dem Mail-Symbol markierte Nachrichten im Internet sichtbar?</a></li>
<li><a href="#message-metadata">Wie schützt Delta Chat Metadaten in Nachrichten?</a></li>
<li><a href="#device-seizure">Wie schützt man Metadaten und Kontakte, wenn ein Gerät beschlagnahmt wird?</a></li>
<li><a href="#wie-kann-ich-die-verschlüsselungsinformationen-überprüfen">Wie kann ich die Verschlüsselungsinformationen überprüfen?</a></li>
<li><a href="#wie-kann-ich-den-verschlüsselungsstatus-von-nachrichten-überprüfen">Wie kann ich den Verschlüsselungsstatus von Nachrichten überprüfen?</a></li>
<li><a href="#warum-sehe-ich-unverschlüsselte-nachrichten">Warum sehe ich unverschlüsselte Nachrichten?</a></li>
<li><a href="#wie-kann-ich-einen-ende-zu-ende-verschlüsselten-chat-mit-einem-delta-chat-kontakt-führen-der-manchmal-webmail-oder-eine-andere-e-mail-anwendung-ohne-autocrypt-verwendet">Wie kann ich einen Ende-zu-Ende-verschlüsselten Chat mit einem Delta-Chat-Kontakt führen, der manchmal Webmail oder eine andere E-Mail-Anwendung ohne Autocrypt verwendet?</a></li>
<li><a href="#wie-kann-ich-ende-zu-ende-verschlüsselung-und-löschen-von-nachrichten-sicherstellen">Wie kann ich Ende-zu-Ende-Verschlüsselung und Löschen von Nachrichten sicherstellen?</a></li>
<li><a href="#sealedsender">Unterstützt Delta Chat „Sealed Sender“?</a></li>
<li><a href="#pfs">Unterstützt Delta Chat “Perfect Forward Secrecy”?</a></li>
<li><a href="#ist-die-ende-zu-ende-verschlüsselung-von-delta-chat-genauso-sicher-wie-die-von-signal">Ist die Ende-zu-Ende-Verschlüsselung von Delta Chat genauso sicher wie die von Signal?</a></li>
<li><a href="#pqc">Unterstützt Delta Chat Post-Quantum-Verschlüsselung?</a></li>
<li><a href="#wie-kann-ich-die-verschlüsselung-manuell-überprüfen">Wie kann ich die Verschlüsselung manuell überprüfen?</a></li>
<li><a href="#importkey">Kann ich meinen existierenden privaten Schlüssel weiter verwenden?</a></li>
<li><a href="#ich-kann-meinen-existierenden-pgp-schlüssel-nicht-in-delta-chat-importieren">Ich kann meinen existierenden PGP-Schlüssel nicht in Delta Chat importieren.</a></li>
<li><a href="#security-audits">Wurde Delta Chat unabhängig auf Sicherheitslücken geprüft?</a></li>
</ul>
</li>
@@ -65,6 +63,7 @@
<li><a href="#kann-ich-delta-chat-auf-mehreren-geräten-zur-selben-zeit-verwenden">Kann ich Delta Chat auf mehreren Geräten zur selben Zeit verwenden?</a></li>
<li><a href="#fehlersuche">Fehlersuche</a></li>
<li><a href="#backup">Manueller Transfer</a></li>
<li><a href="#wird-löschen-anheften-archivieren-speichern-stummschalten-usw-über-alle-geräte-synchronisiert">Wird Löschen, Anheften, Archivieren, Speichern, Stummschalten usw. über alle Geräte synchronisiert?</a></li>
<li><a href="#gibt-es-pläne-für-eine-delta-chat-web-anwendung">Gibt es Pläne für eine Delta-Chat-Web-Anwendung?</a></li>
</ul>
</li>
@@ -88,7 +87,8 @@
<ul>
<li><a href="#welche-app-berechtigungen-benötigt-delta-chat">Welche App-Berechtigungen benötigt Delta Chat?</a></li>
<li><a href="#funktioniert-delta-chat-mit-meinem-e-mail-anbieter">Funktioniert Delta Chat mit <em>meinem</em> E-Mail-Anbieter?</a></li>
<li><a href="#ich-möchte-meinen-eigenen-e-mail-server-für-delta-chat-verwalten-gibt-es-empfehlungen">Ich möchte meinen eigenen E-Mail-Server für Delta Chat verwalten. Gibt es Empfehlungen?</a></li>
<li><a href="#can-i-use-delta-chat-in-parallel-with-other-e-mail-apps">Can I use Delta Chat in parallel with other E-Mail apps?</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="#weshalb-muss-ich-mein-e-mail-kennwort-in-delta-chat-eingeben-ist-das-sicher">Weshalb muss ich mein E-Mail-Kennwort in Delta Chat eingeben? Ist das sicher?</a></li>
<li><a href="#welche-nachrichten-erscheinen-in-delta-chat">Welche Nachrichten erscheinen in Delta Chat?</a></li>
<li><a href="#unterstützt-delta-chat-html-e-mails">Unterstützt Delta Chat HTML-E-Mails?</a></li>
@@ -96,7 +96,7 @@
<li><a href="#was-macht-die-option-kopie-an-mich-selbst-senden">Was macht die Option “Kopie an mich selbst senden”?</a></li>
<li><a href="#warum-gibt-es-die-funktion-gesendet-ordner-beobachten">Warum gibt es die Funktion “Gesendet-Ordner beobachten”?</a></li>
<li><a href="#warum-kann-ich-deltachat-ordner-beobachten-ausschalten">Warum kann ich “DeltaChat-Ordner beobachten” ausschalten?</a></li>
<li><a href="#ist-delta-chat-kompatibel-mit-protonmail--tutanota--criptext">Ist Delta Chat kompatibel mit Protonmail / Tutanota / Criptext?</a></li>
<li><a href="#ist-delta-chat-kompatibel-mit-proton-mail--tutanota--criptext">Ist Delta Chat kompatibel mit Proton Mail / Tutanota / Criptext?</a></li>
<li><a href="#remove-account">Wie kann ich mein Konto löschen?</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>
<li><a href="#wo-können-meine-freunde-delta-chat-finden">Wo können meine Freunde Delta Chat finden?</a></li>
@@ -164,7 +164,7 @@ sicher gegen Netzwerk- und Serverangriffe.</p>
</li>
<li>
<p>Freie und quelloffene Software, sowohl app- als auch serverseitig.
Basiert auf <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">E-Mail- und Web-Internet-Standards</a>,
Basiert auf <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">E-Mail- und Web-Internet-Standards</a>,
um das <a href="https://xkcd.com/927/">„Noch-ein-Standard-Syndrom“ (xkcd 927)</a> zu vermeiden.</p>
</li>
</ul>
@@ -177,10 +177,20 @@ um das <a href="https://xkcd.com/927/">„Noch-ein-Standard-Syndrom“ (xkcd 927
</h3>
<p>Wenn eine Nachricht von einem unbekannten Kontakt stammt, erscheint sie als <strong>Anfrage</strong>.</p>
<ul>
<li>Wenn eine Nachricht von einem unbekannten Kontakt stammt, erscheint sie als <strong>Anfrage</strong>. Sie müssen die Anfrage akzeptieren, bevor Sie antworten können.</li>
<li>Sie können sie auch “löschen”, wenn Sie vorerst nicht mit ihm chatten möchten. Dadurch wird die Nachricht <em>nicht</em> auf dem Server gelöscht, sondern nur auf Ihrem Gerät. Sie können die Nachricht also weiterhin in einer anderen E-Mail-App bearbeiten.</li>
<li>Wenn Sie eine Anfrage löschen, werden zukünftige Nachrichten von diesem Kontakt weiterhin als Nachrichtenanfrage angezeigt, sodass Sie Ihre Meinung ändern können. Wenn Sie wirklich keine Nachrichten von dieser Person erhalten möchten, sollten Sie sie <em>blockieren</em>.</li>
<li>
<p>Sie müssen die Anfrage <strong>akzeptieren</strong>, bevor Sie antworten können.</p>
</li>
<li>
<p>Sie können sie auch “löschen”, wenn Sie vorerst nicht mit ihm chatten möchten.</p>
</li>
<li>
<p>If you delete a request, future messages from that contact will still appear
as message request, so you can change your mind. If you really dont want to
receive messages from this person, consider <strong>blocking</strong> them.</p>
</li>
</ul>
<h3 id="unterstützt-delta-chat-bilder-videos-und-dateianhänge">
@@ -193,7 +203,7 @@ um das <a href="https://xkcd.com/927/">„Noch-ein-Standard-Syndrom“ (xkcd 927
<ul>
<li>
<p>Ja. Alle E-Mail-Anhänge werden als separate Nachrichten angezeigt. Ausgehende Nachrichten erhalten bei Bedarf automatisch Anhänge.</p>
<p>Ja. Bilder, Videos, Dokumente, Sprachnachrichten usw. funktionieren wie üblich.</p>
</li>
<li>
<p>Um die Leistung zu verbessern, werden die Bilder standardmäßig optimiert und in einer kleineren Größe gesendet, aber Sie können sie auch als “Datei” senden, um das Original zu erhalten.</p>
@@ -289,6 +299,41 @@ unter dem Text Ihrer Nachrichten.</p>
<p>Um die Funktionen zu nutzen, lang auf einen Chat in der Chatliste tippen oder den Chat mit der rechten Maustaste anklicken.</p>
<h3 id="save">
Wie funktionieren “Gespeicherte Nachrichten”? <a href="#save" class="anchor"></a>
</h3>
<p><strong>Gespeicherte Nachrichten</strong> ist ein Chat, den Sie verwenden können, um sich Nachrichten zu merken und wiederzufinden.</p>
<ul>
<li>
<p>Tippen Sie in einem beliebigen Chat lange auf eine Nachricht oder klicken Sie mit der rechten Maustaste darauf und wählen <strong>Speichern</strong>.</p>
</li>
<li>
<p>Gespeicherte Nachrichten werden mit dem Symbol
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" />
neben dem Datum markiert</p>
</li>
<li>
<p>Öffnen Sie später den Chat „Gespeicherte Nachrichten“, sehen Sie dort die gespeicherten Nachrichten.
Durch Tippen auf <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />,
können Sie zu der ursprünglichen Nachricht im ursprünglichen Chat zurückkehren</p>
</li>
<li>
<p>Schließlich können Sie auch „Gespeicherte Nachrichten“ verwenden, um <strong>persönliche Notizen</strong> zu machen - öffnen Sie den Chat, geben Sie etwas ein, fügen Sie ein Foto oder eine Sprachnachricht hinzu usw.</p>
</li>
<li>
<p>Da „Gespeicherte Nachrichten“ synchronisiert werden, können sie sehr praktisch für die Übertragung von Daten zwischen Geräten sein</p>
</li>
</ul>
<p>Nachrichten bleiben gespeichert, auch wenn sie bearbeitet oder gelöscht werden -
sei es durch den <a href="#edit">Absender</a>, durch <a href="#delold">Automatisches Löschen</a> oder durch <a href="#ephemeralmsgs">verschwindende Nachrichten anderer Chats</a>.</p>
<h3 id="was-bedeutet-der-grüne-punkt">
@@ -297,19 +342,45 @@ unter dem Text Ihrer Nachrichten.</p>
</h3>
<p>Sie können manchmal einen “grünen Punkt” <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> neben dem Avatar eines Kontakts sehen. Es bedeutet, dass der Kontakt <strong>kürzlich gesehen</strong> wurde, in den letzten 10 Minuten:</p>
<ul>
<li>Seit Delta Chat 1.34 sehen Sie manchmal einen “grünen Punkt” neben dem Avatar eines Kontakts. Es bedeutet, dass der Kontakt “kürzlich gesehen” wurde.</li>
<li>Im Detail: Das bedeutet, dass Delta Chat den Kontakt in den letzten 10 Minuten gesehen hat:
<ul>
<li>entweder weil der Kontakt Ihnen direkt eine Nachricht gesendet hat,</li>
<li>weil der Kontakt etwas an eine Gruppe geschrieben hat, in der sie beide Mitglied sind,</li>
<li>weil der Kontakt Ihnen eine Lesebestätigung für eine von Ihnen geschriebene Nachricht gesendet hat</li>
<li>oder weil der Kontakt Daten mithilfe einer <a href="#webxdc">Webxdc-App</a> an Ihre Delta-Chat-App gesendet hat.</li>
</ul>
</li>
<li>Dies ist also kein Echtzeit-Online-Status - und wenn jemand nicht sofort antwortet, obwohl er online zu sein scheint, machen Sie sich keine Sorgen und geben Sie ihm etwas Raum. ;-)</li>
<li>Andererseits werden andere nicht immer “sehen, dass Sie online sind”. Wenn Sie Lesebestätigungen deaktiviert haben, sehen sie den grünen Punkt erst, wenn Sie ihnen eine Nachricht senden oder einer Gruppe schreiben, in der sie sich ebenfalls befinden.</li>
<li>entweder weil der Kontakt Ihnen direkt eine Nachricht gesendet hat,</li>
<li>weil der Kontakt etwas an eine Gruppe geschrieben hat, in der sie beide Mitglied sind,</li>
<li>weil der Kontakt Ihnen eine Lesebestätigung für eine von Ihnen geschriebene Nachricht gesendet hat</li>
<li>weil der Kontakt eine Nachricht bearbeitet oder gelöscht hat</li>
<li>oder weil der Kontakt Daten mithilfe einer <a href="#webxdc">App</a> in einem geteilten Chat gesendet hat.</li>
</ul>
<p>Dies ist also kein Echtzeit-Online-Status - und wenn jemand nicht sofort antwortet, obwohl er online zu sein scheint, machen Sie sich keine Sorgen und geben Sie ihm etwas Raum. ;-)</p>
<p>Andererseits werden andere nicht immer “sehen, dass Sie online sind”. Wenn Sie Lesebestätigungen deaktiviert haben, sehen sie den grünen Punkt erst, wenn einer der oben aufgeführten Punkte erfüllt ist.</p>
<h3 id="edit">
Schreibfehler korrigieren und Nachrichten nach dem Senden löschen <a href="#edit" class="anchor"></a>
</h3>
<ul>
<li>
<p>Sie können den Text Ihrer Nachrichten nach dem Senden bearbeiten.
Tippen Sie dazu lange auf die Nachricht oder klicken Sie mit der rechten Maustaste auf die Nachricht und wählen Sie <strong>Bearbeiten</strong> oder <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" /></p>
</li>
<li>
<p>Wenn Sie versehentlich eine Nachricht gesendet haben,
wählen Sie im selben Menü <strong>Löschen</strong> und dann <strong>Für alle löschen</strong>.</p>
</li>
</ul>
<p>Während bei bearbeiteten Nachrichten das „Bearbeitet“ neben dem Datum erscheint,
werden gelöschte Nachrichten ohne Markierung im Chat entfernt.
Es werden keine Benachrichtigungen verschickt und es gibt kein Zeitlimit.</p>
<p>Beachten Sie, dass die ursprüngliche Nachricht dennoch von Chatteilnehmern empfangen werden konnte,
die die Nachricht bereits beantwortet, weitergeleitet, gespeichert, mit einem Screenshot versehen oder anderweitig kopiert haben könnten.</p>
<h3 id="ephemeralmsgs">
@@ -319,10 +390,11 @@ unter dem Text Ihrer Nachrichten.</p>
</h3>
<p>Sie schalten “Verschwindende Nachrichten
oben rechts im Chatfenster,
durch Auswahl einer Zeitspanne
zwischen 1 Minute und 5 Wochen ein.</p>
<p>You can turn on “disappearing messages
in the settings of a chat,
at the top right of the chat window,
by selecting a time span
between 5 minutes and 1 year.</p>
<p>Bis die Einstellung wieder ausgeschaltet wird,
kümmern sich die Delta-Chat-Apps der Chat-Teilnehmer
@@ -600,7 +672,7 @@ keine privaten Informationen preisgeben, die den zentralen Push-Diensten nicht b
<p>Delta Chat ist ein freier, quelloffener, dezentraler Messenger mit freier Serverwahl,
aber wir wollen, dass die Nutzer eine zuverlässige „Sofortzustellung“ von Nachrichten haben,
wie sie es von Whatsapp, Signal oder Telegram kennen,
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>Beachten Sie, dass Delta Chat ein <a href="#privacy-notifications">kleines, die Privatsphäre wahrendes Push-Benachrichtigungssystem</a>
@@ -608,10 +680,10 @@ hat, das eine „sofortige Zustellung“ von Nachrichten für alle Chatmail-Serv
Einschließlich dem Chatmail-Server, <a href="https://delta.chat/chatmail#selfhosted">den Sie selbst ohne unsere Erlaubnis einrichten könnten</a>.
Willkommen bei der Macht des interoperablen und massiven Chatmail- und E-Mail-Systems :)</p>
<h2 id="verschlüsselung-und-sicherheit">
<h2 id="e2ee">
Verschlüsselung und Sicherheit <a href="#verschlüsselung-und-sicherheit" class="anchor"></a>
Verschlüsselung und Sicherheit <a href="#e2ee" class="anchor"></a>
</h2>
@@ -624,17 +696,23 @@ Willkommen bei der Macht des interoperablen und massiven Chatmail- und E-Mail-Sy
</h3>
<p><a href="https://autocrypt.org">Autocrypt</a> wird verwendet, um automatisch
eine Ende-zu-Ende-Verschlüsselung mit Kontakten und Gruppenchats herzustellen.
Autocrypt verwendet eine begrenzte und <a href="#openpgp-secure">sichere Untermenge des OpenPGP-Standards</a>.
Ende-zu-Ende-verschlüsselte Nachrichten sind mit einem Vorhängeschloss gekennzeichnet <img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" /></p>
<p>Delta Chat verwendet eine <a href="#openpgp-secure">sichere Teilmenge des OpenPGP-Standards</a>, um eine automatische End-to-End-Verschlüsselung mit folgenden Protokollen bereitzustellen:</p>
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join-Protokolle</a>
werden für Chats mit garantierter Ende-zu-Ende-Verschlüsselung verwendet,
die vor Netzwerkangriffen und kompromittierten Servern schützt.
Chats, die mit einem grünen Häkchen markiert sind
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
garantieren Ende-zu-Ende-verschlüsselte Nachrichten.</p>
<ul>
<li>
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a>
zum Austausch von Verschlüsselungsinformationen durch Scannen von QR-Codes oder „Einladungslinks“.</p>
</li>
<li>
<p><a href="https://autocrypt.org">Autocrypt</a> wird verwendet, um automatisch eine Ende-zu-Ende-Verschlüsselung zwischen Kontakten und allen Mitgliedern einer Gruppe herzustellen.</p>
</li>
<li>
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Teilen eines Kontakts im Chat</a>
ermöglicht es den Empfängern, eine Ende-zu-Ende-Verschlüsselung mit dem Kontakt zu verwenden.</p>
</li>
</ul>
<p>Delta Chat fragt keine OpenPGP-Keyserver ab, veröffentlicht dort keine Daten und interagiert auch sonst nicht mit diesen.</p>
<h3 id="whene2e">
@@ -644,28 +722,35 @@ garantieren Ende-zu-Ende-verschlüsselte Nachrichten.</p>
</h3>
<p>Ende-zu-Ende-verschlüsselten Nachrichten sind mit einem Vorhängeschloss versehen:</p>
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="padlock in bubble" /></p>
<p>Die Ende-zu-Ende-Verschlüsselung ist garantiert, wenn neben dem Chat-Titel ein grünes Häkchen zu sehen ist:</p>
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="green checkmark in title" /></p>
<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="howtoe2ee">
<h3 id="kann-ich-e-mails-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden">
Wie kann ich garantierte Ende-zu-Ende-Verschlüsselung und grüne Häkchen erhalten? <a href="#howtoe2ee" class="anchor"></a>
Kann ich E-Mails ohne Ende-zu-Ende-Verschlüsselung empfangen oder senden? <a href="#kann-ich-e-mails-ohne-ende-zu-ende-verschlüsselung-empfangen-oder-senden" class="anchor"></a>
</h3>
<p>Wenn Sie einen zweiten Kommunikationskanal mit Ihrem Chatpartner haben,
wie einen Video-Chat oder einen anderen Messenger,
können Sie einen Einladungslink erstellen.</p>
<p>Wenn Sie die Standard-<a href="https://chatmail.at/relays">Chatmail-Relays</a> verwenden, ist es unmöglich, Nachrichten ohne End-to-End-Verschlüsselung zu empfangen oder zu senden.</p>
<p>Wenn Sie persönlich zusammen sind,
können Sie Ihrem Chat-Partner einen QR-Code zeigen.</p>
<p>If you instead create a profile using a classic e-mail server,
you can send and receive messages with or without end-to-end encryption.
Messages lacking end-to-end encryption are marked with an e-mail icon
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
<h3 id="howtoe2ee">
Wie kann ich einen Chat mit einem neuen Kontakt erstellen? <a href="#howtoe2ee" class="anchor"></a>
</h3>
<p>Man kann einen Einladungslink über einen anderen privaten Chat senden,
einen Einladungs-QR-Code zeigen, wenn man nebeneinander steht oder einen Videoanruf tätigen,
oder auf einen “Kontakt” klicken der per Chat geteilt wurde.</p>
<ul>
<li>
@@ -674,133 +759,60 @@ tippen Sie auf den Titel der Gruppe, um die Mitgliederliste anzuzeigen,
und wählen Sie „QR-Einladungscode“.</p>
</li>
<li>
<p>Für <strong>Direktchat-Einladungen</strong>,
tippen Sie auf das QR-Code-Symbol <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
<p>Für <strong>direkte 1:1-Chat-Einladungen</strong>,
tippt man auf das QR-Code-Symbol <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" />
auf dem Hauptbildschirm der Delta-Chat-App.</p>
</li>
</ul>
<p>Lassen Sie Ihren Chat-Partner den QR-Code mit der Delta-Chat-App scannen.
Oder Sie klicken auf „Kopieren“ oder „Teilen“, um einen Einladungslink zu erstellen und diesen mit Ihrem Chat-Partner zu teilen.</p>
<p>Man kann seinen Chat-Partner bitten, denn QR-Code
mit seiner Delta Chat-App zu scannen,
oder auf “Kopieren” oder “Teilen” drücken, um einen Einladungslink zu erstellen
und diesen mit seinem Chat-Partner zu teilen.</p>
<p>Warten Sie nun, während das <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">Secure-Join-Protokoll</a> zwischen beiden Geräten abläuft.</p>
<p>Nun wartet man, während die <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">Ende-zu-Ende-Verschlüsselung eingerichtet wird</a>.</p>
<ul>
<li>
<p>Wenn beide Geräte online sind,
sehen beide Seiten schließlich einen Gruppen- oder Direkt-Chat mit einem grünen Häkchen
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
neben dem Titel.</p>
<p>Wenn beide Seiten online sind, sehen sie bald einen (Gruppen- oder direkten) Chat
und können mit der sicheren Nachrichtenübermittlung beginnen.</p>
</li>
<li>
<p>Wenn eines der Geräte offline ist, erscheinen die grünen Häkchen erst
später, wenn das Gerät wieder mit dem Internet verbunden ist
und das Secure-Join-Protokoll abgeschlossen werden kann.</p>
<p>Wenn eine Seite offline ist oder eine schlechte Verbindung hat,
wird die Möglichkeit zu chatten verzögert, bis die Verbindung wiederhergestellt ist.</p>
</li>
</ul>
<p>Herzlichen Glückwunsch! 🎉
Sie verwenden nun eine garantierte Ende-zu-Ende-Verschlüsselung
mit diesem Kontakt und Sie beide können sich gegenseitig zu grün markierten Gruppen hinzufügen
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />,
Dadurch wird die garantierte Ende-zu-Ende-Verschlüsselung automatisch unter den Mitgliedern dieser Gruppe verbreitet.</p>
<p>Glückwunsch!
Du verwenden jetzt automatisch eine Ende-zu-Ende-Verschlüsselung
mit diesem Kontakt.
Wenn man sich gegenseitig zu Chatgruppen hinzufügt,
wird eine Ende-zu-Ende-Verschlüsselung zwischen allen Mitgliedern eingerichtet.</p>
<h3 id="e2eeguarantee">
Was bedeuten das “Grüne Häkchen” und die “garantierte Ende-zu-Ende-Verschlüsselung”? <a href="#e2eeguarantee" class="anchor"></a>
Was bedeutet das grüne Häkchen in einem Kontaktprofil? <a href="#e2eeguarantee" class="anchor"></a>
</h3>
<p><strong>Chat-Titel mit grünen Häkchen</strong>
<p>A contact profile might show a green checkmark
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
bedeuten, dass alle Nachrichten im Chat Ende-zu-Ende-verschlüsselt werden
und nicht von kompromittierten E-Mail-Servern oder Internet-Providern gelesen oder verändert werden können.
Beim Beitritt zu Gruppenchats mit grünen Häkchen
werden Verschlüsselungsinformationen (und die grünen Häkchen) aller Teilnehmer sicher so weitergegeben,
dass die Ende-zu-Ende-Verschlüsselung in der Gruppe und zwischen den Mitgliedern garantiert werden kann.</p>
<p><strong>Kontaktprofile mit grünen Häkchen</strong>
<img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />
bedeuten, dass die Nachrichtenübermittlung an einen Kontakt derzeit garantiert Ende-zu-Ende-verschlüsselt ist.
Jeder grün markierte Kontakt hat entweder einen direkten <a href="#howtoe2ee">QR-Scan</a> mit Ihnen durchgeführt
oder wurde von einem anderen Kontakt mit grünem Häkchen eingeführt.
Das Einführen geschieht automatisch, wenn Sie Mitglieder zu Gruppen hinzufügen.
Wer einen Kontakt zu einer Gruppe mit grünem Häkchen hinzufügt, wird zum Einführenden
für die Mitglieder, die noch nichts von dem hinzugefügten Kontakt wussten.
In einem Kontaktprofil können Sie wiederholt auf den Text “Eingeführt von …” tippen
bis Sie zu demjenigen gelangen, mit dem Sie einen direkten <a href="#howtoe2ee">QR-Scan</a> gemacht haben.</p>
<p>Beachten Sie, dass Sie in einem Kontaktprofil unter Umständen Einführende sehen und antippen können, aber kein grünes Häkchen im Profiltitel vorhanden ist.
Dies bedeutet normalerweise, dass der Kontakt <a href="#nocryptanymore">“eine Nachricht von einem anderen Gerät gesendet hat”</a>.</p>
and an “Introduced by” line.
Every green-checkmarked contact either did a direct <a href="#howtoe2ee">QR-scan</a> with you
or was introduced by a another green-checkmarked contact.
Introductions happen automatically when adding members to groups.
Whoever adds a green-checkmarked contact to a group with only green-checkmarked members
becomes an introducer.
In a contact profile you can tap on the “Introduced by …” text repeatedly
until you get to the one with whom you directly did a <a href="#howtoe2ee">QR-scan</a>.</p>
<p>Für eine ausführlichere Diskussion der “Garantierten Ende-zu-Ende-Verschlüsselung”,
siehe <a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join-Protokolle</a>
und dort speziell den Abschnitt zu “Verified Groups”, dem technischen Begriff
für “Chats mit grünem Häkchen” oder “Garantierter Ende-zu-Ende-Verschlüsselung”.</p>
<h3 id="nocryptanymore">
Ein Kontakt hat eine Nachricht von einem anderen Gerät gesendet”, was kann ich tun? <a href="#nocryptanymore" class="anchor"></a>
</h3>
<p>Wenn Sie diese Warnung sehen, wurde das grüne Häkchen entfernt, da für den Kontakt die Ende-zu-Ende-Verschlüsselung nicht mehr garantiert werden kann.
<strong>Wenn Sie den Wegfall der garantierten Ende-zu-Ende-Verschlüsselung
für diesen Kontakt überraschend finden, akzeptieren Sie die Warnung nicht!</strong>
Versuchen Sie stattdessen mit Ihrem Kontakt über einen zweiten Kanal (z.B. Videoanruf, Telefon oder ein anderer Messenger) herauszufinden, was passiert ist.</p>
<p>Wenn Ihr Kontakt tatsächlich den Ausfall der garantierten Ende-zu-Ende-Verschlüsselung verursacht hat,
finden Sie in den nächsten Abschnitten häufige Gründe und Abhilfe.
Unabhängig davon bleiben alle anderen Chats mit einem grünen Häkchen garantiert Ende-zu-Ende-verschlüsselt,
auch wenn der Kontakt dort Mitglied ist.</p>
<p><strong>Ihr Kontakt verwendet Delta Chat auf einem zweiten Gerät (Smartphone oder Laptop)</strong></p>
<p>Wenn Ihr Kontakt ein weiteres Gerät mit Delta Chat eingerichtet hat,
sollte das Konto von dem neuen Gerät entfernen werden und <a href="#multiclient">als zweites Gerät, wie hier beschrieben</a>, erneut hinzugefügt werden.
Sobald sie sich danach schreiben, wird die Warnung verschwinden
und die Verschlüsselung ist mit beiden Geräten Ihres Kontakts garantiert.</p>
<p><strong>Ihr Kontakt hat Delta Chat mit seinem alten Login neu installiert</strong></p>
<p>Wenn Ihr Kontakt <a href="#backup">ein Backup</a> hat,
sollte das Profil auf dem neuen Gerät
entfernt werden und stattdessen das Backup importiert werden, um das Konto neu zu erstellen.
Sobald sie sich danach schreiben, wird die Warnung verschwinden
und die garantierte Verschlüsselung wird für diesen Kontakt wiederhergestellt.</p>
<p>Wenn Ihr Kontakt kein Backup hat, ist es am besten, einen <a href="#howtoe2ee">QR-Code-Scan</a>
mit Ihrem Chat-Partner durchzuführen, um die garantierte Ende-zu-Ende-Verschlüsselung wiederherzustellen.</p>
<p><strong>Ihr Kontakt hat eine E-Mail über Webmail oder eine andere E-Mail-Anwendung gesendet,
wird Delta Chat aber bald wieder benutzen.</strong></p>
<p>Wenn Sie wissen, dass der Kontakt manchmal Webmail,
oder andere E-Mail-Anwendungen ohne Ende-zu-Ende-Verschlüsselung verwendet,
dann können Sie die Warnung akzeptieren.
Sobald Ihr Kontakt Delta Chat wieder benutzt,
wird die garantierte Ende-zu-Ende-Verschlüsselung automatisch wiederhergestellt.</p>
<p><strong>Ihr Kontakt hat die Nutzung von Delta Chat komplett eingestellt</strong></p>
<p>Manchmal ist es wichtiger, in Kontakt zu bleiben als eine Ende-zu-Ende-Verschlüsselung zu haben;
die <a href="#tls">“Transport Layer Encryption” (TLS)</a> kann die Vertraulichkeit
Ihrer Nachrichten zwischen Ihrem Gerät und dem E-Mail-Server dennoch schützen.
Ohne Ende-zu-Ende-Verschlüsselung vertrauen Sie und Ihr Chat-Partner jedoch darauf, dass Ihr E-Mail-Server Nachrichten nicht liest oder manipuliert und sie nicht an Dritte weitergibt.</p>
<p>In jedem Fall können Sie nicht viel mehr tun, als die Warnung zu akzeptieren.
Bitte entfernen Sie den Kontakt auch aus allen aktiven, grün markierten Gruppen
die Sie unter “Gemeinsame Chats” im Profil des Kontakts finden können.
So vermeiden Sie, dass Ihr Kontakt “unlesbare” Nachrichten erhält.</p>
<p>Wenn der Kontakt Delta Chat aufgrund von Fehlern oder Bugs nicht mehr verwendet,
können Sie diese in unser <a href="https://support.delta.chat">Support-Forum</a> schreiben,
und uns so dabei helfen, häufige Probleme zu identifizieren und zu lösen. Vielen Dank!</p>
<h3 id="sind-anhänge-bilder-dateien-audio-usw-ende-zu-ende-verschlüsselt">
@@ -824,10 +836,9 @@ und Anhang-Metadaten wie Dateinamen.</p>
</h3>
<p>Ja, Delta Chat verwendet eine sichere Untermenge von OpenPGP
und zeigt nur dann ein Vorhängeschloss auf einer Nachricht an,
wenn die gesamte Nachricht ordnungsgemäß verschlüsselt und signiert ist.
Zum Beispiel werden “Detached Signatures” nicht als sicher betrachtet.</p>
<p>Ja, Delta Chat verwendet ein sicheres subset von OpenPGP
das verlangt, dass die gesamte Nachricht ordnungsgemäß verschlüsselt und signiert wurde.
Als Beispiel, werden “angehängte Signaturen” nicht als sicher behandelt.</p>
<p>Die meisten öffentlich diskutierten OpenPGP-Probleme
resultieren in Wirklichkeit aus schlechter Usability oder schlechter Implementierung von Tools oder Anwendungen - oder beidem.
@@ -888,16 +899,16 @@ so wie in der Autocrypt-Level-1-Spezifikation definiert.</p>
<h3 id="tls">
Wird eine Nachricht im Klartext gesendet, wenn keine Ende-zu-Ende-Verschlüsselung verfügbar ist? <a href="#tls" class="anchor"></a>
Sind mit dem Mail-Symbol markierte Nachrichten im Internet sichtbar? <a href="#tls" class="anchor"></a>
</h3>
<p>Auch wenn Ihre Nachrichten nicht Ende-zu-Ende-verschlüsselt sind,
sind sie dennoch vor Internetanbietern wie Mobilfunk- oder Telefongesellschaften geschützt.
Allerdings können Ihr E-Mail-Provider und der des Empfängers
Ihre Nachrichten lesen, analysieren oder sogar verändern,
wenn sie nicht Ende-zu-Ende-verschlüsselt sind.</p>
<p>Wenn Sie E-Mail-Nachrichten ohne Ende-zu-Ende-Verschlüsselung senden oder empfangen (mit einem klassischen E-Mail-Server),
sind sie immer noch vor Mobilfunkanbietern oder Kabelnetzbetreibern geschützt, die Ihre E-Mail-Nachrichten nicht lesen oder verändern können.</p>
<p>Aber sowohl Ihr E-Mail-Anbieter als auch der E-Mail-Anbieter des Empfängers
können Ihre 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>,
@@ -909,10 +920,6 @@ Wenn die beteiligten E-Mail-Server <a href="https://datatracker.ietf.org/doc/htm
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>
<p>Beachten Sie, dass die <a href="#howtoe2ee">Beibehaltung der garantierten Ende-zu-Ende-Verschlüsselung</a> zusätzlich zur TLS-Verschlüsselung
eine allumfassende Sicherheit zwischen Ihrem Gerät und dem des Empfängers bietet.
Nicht einmal Ihr E-Mail- oder Internet-Provider wird in der Lage sein, Ihre Nachrichten zu lesen oder zu verändern.</p>
<h3 id="message-metadata">
@@ -922,24 +929,25 @@ Nicht einmal Ihr E-Mail- oder Internet-Provider wird in der Lage sein, Ihre Nach
</h3>
<p>Delta Chat schützt die meisten Metadaten von Nachrichten, indem es die folgenden Informationen
in den Ende-zu-Ende-verschlüsselten Teil der Nachrichten verschiebt:</p>
<p>Anders als die meisten anderen Messenger
speichern Delta-Chat-Apps keine Metadaten über Kontakte oder Gruppen auf Servern. Auch nicht in verschlüsselter Form.
Stattdessen werden alle Gruppen-Metadaten durchgängig verschlüsselt und ausschließlich auf den Endgeräten der Nutzer gespeichert.</p>
<p>E-Mail-Server können deshalb nur das Folgende sehen:</p>
<ul>
<li>Betreffzeile</li>
<li>Avatar und Name der Gruppe</li>
<li>Lesebestätigungen (<code class="language-plaintext highlighter-rouge">Chat-Disposition-Notification-To</code>)</li>
<li>Timer für verschwindende Nachrichten (<code class="language-plaintext highlighter-rouge">Ephemeral-Timer</code>)</li>
<li><code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code></li>
<li><code class="language-plaintext highlighter-rouge">Secure-Join</code>-Header</li>
<li>Aktivierung des Standort-Streamings</li>
<li>WebRTC-Raum-URL</li>
<li>
<p>Uhrzeit und Datum der Nachricht</p>
</li>
<li>
<p>Absende- und Empfangsadresse</p>
</li>
<li>
<p>Größe der Nachricht</p>
</li>
</ul>
<p>E-Mail-Server erhalten keinen Zugriff auf diese geschützten Metadaten,
sehen aber Datum und Größe der Nachricht sowie die Absender- und Empfängeradressen.
E-Mail-Server benötigen Empfängeradressen, um Nachrichten
Nachrichten an die Geräte der Empfänger weiterzuleiten und zuzustellen.</p>
<p>Alle anderen Metadaten zu Nachrichten, Kontakten und Gruppen befinden sich im Ende-zu-Ende-verschlüsselten Teil der Nachrichten.</p>
<h3 id="device-seizure">
@@ -949,20 +957,81 @@ Nachrichten an die Geräte der Empfänger weiterzuleiten und zuzustellen.</p>
</h3>
<p>Sowohl zum Schutz vor E-Mail-Servern, die Metadaten sammeln,
als auch gegen die Gefahr der Beschlagnahmung von Geräten
empfehlen wir die Verwendung einer für Delta Chat optimierten <a href="https://delta.chat/serverguide">E-Mail-Server-Instanz</a>, um pseudonym-temporäre Konten durch Scannen von QR-Codes zu erstellen.
Beachten Sie, dass Delta-Chat-Apps auf allen Plattformen mehrere Konten unterstützen.
Sie können also problemlos aktionsspezifische “1-Wochen-“ oder “1-Monats-Konten” neben Ihrem “Hauptkonto” verwenden,
mit dem Wissen, dass alle temporären Kontodaten zusammen mit allen Metadaten gelöscht werden.
Wenn ein Gerät beschlagnahmt wird, können Kontakte mit temporären E-Mail-Konten
Konten nicht so leicht identifiziert werden, wie dies bei Messengern der Fall ist, die die
Telefonnummern in Chatgruppen preisgeben, die wiederum oft mit legalen Identitäten verbunden sind.</p>
<p>Both for protecting against metadata-collecting e-mail 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 e-mail 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>
<h3 id="wie-kann-ich-die-verschlüsselungsinformationen-überprüfen">
<h3 id="sealedsender">
Wie kann ich die Verschlüsselungsinformationen überprüfen? <a href="#wie-kann-ich-die-verschlüsselungsinformationen-überprüfen" class="anchor"></a>
Unterstützt Delta Chat „Sealed Sender“? <a href="#sealedsender" class="anchor"></a>
</h3>
<p>Nein, noch nichts.</p>
<p>Der Signal-Messenger führte 2018 <a href="https://signal.org/blog/sealed-sender/">“Sealed Sender”</a> ein
um seine Serverinfrastruktur darüber im Unklaren zu lassen, wer eine Nachricht an eine Gruppe von Empfängern sendet.
Dies ist besonders wichtig, weil der Signal-Server die Handynummer jedes Kontos kennt,
die in der Regel mit einer Passidentität verbunden ist.</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 e-mail addresses for sealed sending
but an implementation has not been agreed as a priority yet.</p>
<h3 id="pfs">
Unterstützt Delta Chat “Perfect Forward Secrecy”? <a href="#pfs" class="anchor"></a>
</h3>
<p>Nein, noch nichts.</p>
<p>Delta Chat today doesnt support Perfect Forward Secrecy (PFS).
This means that if your private decryption key is leaked,
and someone has collected your prior in-transit messages,
they will be able to decrypt and read them using the leaked decryption key.
Note that Forward Secrecy only increases security if you delete messages.
Otherwise, someone obtaining your decryption keys
is typically also able to get all your non-deleted messages
and doesnt even need to decrypt any previously collected messages.</p>
<p>We designed a Forward Secrecy approach that withstood
initial examination from some cryptographers and implementation experts
but is pending a more formal write up
to ascertain it reliably works in federated messaging and with multi-device usage,
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
<h3 id="pqc">
Unterstützt Delta Chat Post-Quantum-Verschlüsselung? <a href="#pqc" class="anchor"></a>
</h3>
<p>Nein, noch nichts.</p>
<p>Delta Chat verwendet die Rust OpenPGP-Bibliothek <a href="https://github.com/rpgp/rpgp">rPGP</a>
die den neuesten <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP Entwurf</a> unterstützt.
Wir beabsichtigen, PQC-Unterstützung zum <a href="https://github.com/chatmail/core">chatmail core</a> hinzuzufügen, sobald der Entwurf bei der IETF in Zusammenarbeit mit anderen OpenPGP-Implementierern fertiggestellt ist.</p>
<h3 id="wie-kann-ich-die-verschlüsselung-manuell-überprüfen">
Wie kann ich die Verschlüsselung manuell überprüfen? <a href="#wie-kann-ich-die-verschlüsselung-manuell-überprüfen" class="anchor"></a>
</h3>
@@ -973,115 +1042,6 @@ 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,
ist die Verbindung sicher.</p>
<h3 id="wie-kann-ich-den-verschlüsselungsstatus-von-nachrichten-überprüfen">
Wie kann ich den Verschlüsselungsstatus von Nachrichten überprüfen? <a href="#wie-kann-ich-den-verschlüsselungsstatus-von-nachrichten-überprüfen" class="anchor"></a>
</h3>
<p>Ein kleines <strong>Vorhängeschloss</strong> in einer Nachrichten zeigt an,
dass die Nachricht vom Absender korrekt Ende-zu-Ende-verschlüsselt wurde.
Wenn <strong>kein Vorhängeschloss</strong> vorhanden ist, wurde die Nachricht nicht oder nicht korrekt Ende-zu-Ende-verschlüsselt.
Höchstwahrscheinlich, weil der Absender ein Webmail-Interface oder eine App
ohne Ende-zu-Ende-Unterstützung verwendet.</p>
<h3 id="warum-sehe-ich-unverschlüsselte-nachrichten">
Warum sehe ich unverschlüsselte Nachrichten? <a href="#warum-sehe-ich-unverschlüsselte-nachrichten" class="anchor"></a>
</h3>
<p>Wenn ein Kontakt keine Autocrypt-fähige App verwendet,
werden alle Nachrichten, die diesen Kontakt betreffen (in Gruppen- oder Direkt-Chats),
nicht Ende-zu-Ende-verschlüsselt und zeigen daher kein “Vorhängeschloss”.
Beachten Sie, auch Kontakte, die primär Delta Chat verwenden,
können gleichzeitig auch nicht-Autocrypt-fähige Apps verwenden.
Das unverschlüsselte Antworten auf unverschlüsselte Nachrichten wird von Autocrypt vorgeschrieben
um zu verhindern, dass unlesbare Nachrichten auf der Seite Ihrer Kontakte ankommen.</p>
<h3 id="wie-kann-ich-einen-ende-zu-ende-verschlüsselten-chat-mit-einem-delta-chat-kontakt-führen-der-manchmal-webmail-oder-eine-andere-e-mail-anwendung-ohne-autocrypt-verwendet">
Wie kann ich einen Ende-zu-Ende-verschlüsselten Chat mit einem Delta-Chat-Kontakt führen, der manchmal Webmail oder eine andere E-Mail-Anwendung ohne Autocrypt verwendet? <a href="#wie-kann-ich-einen-ende-zu-ende-verschlüsselten-chat-mit-einem-delta-chat-kontakt-führen-der-manchmal-webmail-oder-eine-andere-e-mail-anwendung-ohne-autocrypt-verwendet" class="anchor"></a>
</h3>
<p>Wenn Sie einen sicheren Ende-zu-Ende-verschlüsselten Chat mit einem Kontakt benötigen,
der sowohl Delta Chat als auch Nicht-Autocrypt-Anwendungen nutzt,
können Sie eine <a href="#howtoe2ee">garantierte Ende-zu-Ende-Verschlüsselung</a> einrichten, mit einer Gruppe mit Ihnen beiden als Mitgliedern.
In diesem Gruppenchat werden alle Nachrichten Ende-zu-Ende verschlüsselt werdejn,
auch wenn im Direkt-Chat eine
<a href="#nocryptanymore">“Nachricht von einem anderen Gerät gesendet”</a> wurde.</p>
<h3 id="wie-kann-ich-ende-zu-ende-verschlüsselung-und-löschen-von-nachrichten-sicherstellen">
Wie kann ich Ende-zu-Ende-Verschlüsselung und Löschen von Nachrichten sicherstellen? <a href="#wie-kann-ich-ende-zu-ende-verschlüsselung-und-löschen-von-nachrichten-sicherstellen" class="anchor"></a>
</h3>
<p>Der beste Weg, um sicherzustellen, dass alle Nachrichten Ende-zu-Ende-verschlüsselt sind
und Metadaten so schnell wie möglich gelöscht werden,
ist <a href="#howtoe2ee">die Verwendung von Chats mit garantierter Ende-zu-Ende-Verschlüsselung</a>
und die Aktivierung von <a href="#ephemeralmsgs">verschwindenden Nachrichten</a>.</p>
<p>Garantierte Ende-zu-Ende-Verschlüsselung schützt vor <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">MITM-Angriffen</a>
und das Aktivieren von “Verschwindende Nachrichten” löscht die Nachrichten
auf dem Server und Lokal nach einer vom Benutzer eingestellten Zeit.</p>
<p>Wenn Sie die Nachrichten auf Ihrem Gerät, aber nicht auf dem Server benötigen, können Sie auch in der Gruppe vereinbaren, <a href="#delold">“Nachrichten automatisch vom Server löschen”</a> einzuschalten.</p>
<h3 id="pfs">
Unterstützt Delta Chat “Perfect Forward Secrecy”? <a href="#pfs" class="anchor"></a>
</h3>
<p>Nein, Delta Chat unterstützt kein “Perfect Forward Secrecy” (PFS).
Das bedeutet, wenn Ihr privater Delta-Chat-Schlüssel durchgesickert ist
und jemand Ihre vorherigen In-Transit-Nachrichten gesammelt hat,
können diese mit dem veröffentlichtem Schlüssel entschlüsselt werden.</p>
<p>Beachten Sie jedoch, dass jemand, der in den Besitz Ihrer privaten Schlüssel gelangt, in der Regel auch in der Lage sein wird, Ihre Nachrichten zu lesen - unabhängig davon, ob Perfect Forward Secrecy nun verwendet wird oder nicht.
Die typische, reale Situation für durchgesickerte private Schlüssel, ist die <a href="#device-seizure">Beschlagnahme von Geräten</a>.</p>
<p>Es ist möglich, dass Delta Chat eine Tages “Perfect Forward Secrecy” unterstützt -
OpenPGP ist nur ein Container für verschlüsselte Nachrichten mit dem
die Verwaltung der Schlüssel (und damit die Schlüsselrotation oder das Schlüssel-“Ratcheting”)
auf flexible Weise organisiert werden kann.
Siehe <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">Seqouias PFS-Prototyp</a>
für bestehende Experimente in der OpenPGP-Community.</p>
<h3 id="ist-die-ende-zu-ende-verschlüsselung-von-delta-chat-genauso-sicher-wie-die-von-signal">
Ist die Ende-zu-Ende-Verschlüsselung von Delta Chat genauso sicher wie die von Signal? <a href="#ist-die-ende-zu-ende-verschlüsselung-von-delta-chat-genauso-sicher-wie-die-von-signal" class="anchor"></a>
</h3>
<p>Das hängt davon ab, was für Sie wichtig ist.
Delta Chat <a href="#pfs">unterstützt kein PFS</a>,
bietet aber <a href="#e2eeguarantee">garantierte Ende-zu-Ende-Verschlüsselung</a>,
die vor kompromittierten Servern oder korrupten Netzwerken schützt.
Signal und die meisten anderen PFS-unterstützenden Messenger bieten kein
praktisches System zum Schutz von Chatgruppen vor Netzwerkangriffen.
Diese sind besorgniserregender und realer
als ein potenzieller Angreifer, der zwar Ihr Telefon und Ihre privaten Schlüssel beschlagnahmt,
aber irgendwie nicht Ihre Nachrichten - gleichzeitig aber eine vollständige Aufzeichnung aller
vergangenen verschlüsselten Nachrichten hat.</p>
<p>In jedem Fall verwendet die Ende-zu-Ende-Verschlüsselung von Delta Chat eine <a href="#openpgp-secure">sichere Untermenge von OpenPGP</a>
das <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">unabhängig sicherheitsgeprüft</a> wurde.</p>
<h3 id="importkey">
@@ -1090,45 +1050,13 @@ das <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">unab
</h3>
<p>Ja.
The best way is to send an Autocrypt Setup Message from the other e-mail client.
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
<p>Nein.</p>
<ul>
<li>
<p>Alternativ können Sie den Schlüssel manuell unter “Einstellungen → Erweitert → Schlüssel verwalten → Importiere geheime Schlüssel” importieren. Achtung: Stellen Sie sicher, dass der Schlüssel nicht durch ein Passwort geschützt ist, oder entfernen Sie das Passwort vorher.</p>
</li>
<li>
<p>Wenn Sie keinen Schlüssel besitzen oder nicht einmal wissen, dass Sie einen benötigen - keine Sorge: Delta Chat erstellt einen Schlüssel, wenn er benötigt wird. Sie müssen nichts weiter tun.</p>
</li>
</ul>
<h3 id="ich-kann-meinen-existierenden-pgp-schlüssel-nicht-in-delta-chat-importieren">
Ich kann meinen existierenden PGP-Schlüssel nicht in Delta Chat importieren. <a href="#ich-kann-meinen-existierenden-pgp-schlüssel-nicht-in-delta-chat-importieren" class="anchor"></a>
</h3>
<p>Delta Chat erzeugt sichere OpenPGP-Schlüssel gemäß der Autocrypt-Spezifikation 1.1.
Sie können Ihren privaten Schlüssel exportieren, aber Sie können keine weiteren privaten Schlüssel importieren.</p>
<p>Mit sehr großer Wahrscheinlichkeit besteht das Problem darin, dass Ihr Schlüssel verschlüsselt ist und/oder ein Passwort verwendet. Solche Schlüssel werden von Delta Chat nicht unterstützt. Bitte entfernen Sie die Verschlüsselung und das Passwort und versuchen Sie den Import danach erneut.</p>
<p>Ein weiterer häufiger Fehler ist die falsche Dateiendung.
Verwenden Sie das ASCII-Armored-Format und die Dateiendung <code class="language-plaintext highlighter-rouge">.asc</code>.</p>
<ul>
<li>
<p>Delta Chat unterstützt “gängige” private Schlüsselformate, allerdings ist es unwahrscheinlich, dass wir 100% aller privaten Schlüssel aus sämtlichen Quellen unterstützen.
Dies ist auch nicht das Hauptaugenmerk von Delta Chat. Tatsächlich besitzt die große Mehrheit der Delta-Chat-NutzerInnen keinen Schlüssel, bevor sie Delta Chat verwendet.
Wir versuchen jedoch, private Schlüssel aus anderen Quellen so gut wie möglich zu unterstützen.</p>
</li>
<li>
<p>Das Entfernen des Passworts vom privaten Schlüssel ist abhängig von der Software, mit der Sie Ihre PGP-Schlüssel verwalten.
Bei Enigmail können Sie Ihr Passwort im Fenster Schlüsselverwaltung auf einen leeren Wert setzen.
Bei GnuPG können Sie es über die <a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">Kommandozeile einstellen</a>.
Für andere Programme können Sie online eine Lösung finden.</p>
</li>
</ul>
<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>
<h3 id="security-audits">
@@ -1190,7 +1118,7 @@ Es wurden keine kritischen Probleme gefunden, aber zwei Probleme mit hohem Schwe
</h3>
<p>Ja. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
<p>Ja. You can use the same profile on different devices:</p>
<ul>
<li>
@@ -1241,6 +1169,10 @@ und sicherstellen, dass <strong>Privates Netzwerk</strong> als “Netzwerkprofil
<li>
<p>In <strong>Gastnetzwerken</strong> z.B. der <strong>Fritz!Box</strong>, können Geräte möglicherweise nicht miteinander kommunizieren.
Verwenden Sie nach Möglichkeit ein Nicht-Gast-Netzwerk. Wenn Sie Zugriff auf den Router haben, können Sie auch die Kommunikation der Geräte untereinander für die Dauer der Übertragung erlauben.</p>
</li>
<li>
<p>Wenn Sie immer noch Probleme bei der Verwendung desselben Netzwerks haben,
versuchen Sie, einen <strong>Mobilen Hotspot</strong> auf einem Gerät zu öffnen und sich mit dem anderen Gerät in dieses WLAN einzuwählen.</p>
</li>
<li>
<p>Vergewissern Sie sich, dass das Zielgerät über <strong>genügend Speicher</strong> verfügt</p>
@@ -1276,6 +1208,23 @@ Verwenden Sie nach Möglichkeit ein Nicht-Gast-Netzwerk. Wenn Sie Zugriff auf de
<li>Sie sind nun synchronisiert und können beide Geräte zum Senden und Empfangen von Ende-zu-Ende-verschlüsselten-Nachrichten mit Ihren Kommunikationspartnern verwenden.</li>
</ul>
<h3 id="wird-löschen-anheften-archivieren-speichern-stummschalten-usw-über-alle-geräte-synchronisiert">
Wird Löschen, Anheften, Archivieren, Speichern, Stummschalten usw. über alle Geräte synchronisiert? <a href="#wird-löschen-anheften-archivieren-speichern-stummschalten-usw-über-alle-geräte-synchronisiert" class="anchor"></a>
</h3>
<p>Ja.</p>
<p>Wenn Sie z.B. einen Chat oder eine Nachricht von Ihrem Telefon löschen,
wird sie auch auf Ihrem Desktop gelöscht, sobald dieser online ist.</p>
<p>Ausnahmen sind <a href="#delold">Alte Nachrichten vom Gerät löschen</a>,
da verschiedene Geräte unterschiedliche Speicherkapazitäten haben können,
und systemspezifische Einstellungen wie Benachrichtigungstöne.</p>
<h3 id="gibt-es-pläne-für-eine-delta-chat-web-anwendung">
@@ -1312,7 +1261,7 @@ Verwenden Sie nach Möglichkeit ein Nicht-Gast-Netzwerk. Wenn Sie Zugriff auf de
<li>Webxdc Apps können keine Daten ins Internet senden oder etwas herunterladen.</li>
<li>Eine Webxdc App kann Daten nur innerhalb eines Delta-Chat-Chats mit ihren Kopien auf den Geräten Ihrer Chat-Partner austauschen. Ansonsten ist sie komplett vom Internet isoliert.</li>
<li>Die Privatsphäre, die eine Webxdc App bietet, ist die Privatsphäre Ihres Chats - solange Sie den Personen vertrauen, mit denen Sie chatten, können Sie auch der Webxdc App vertrauen.</li>
<li>Das bedeutet auch: Es kann ein Datenschutzrisiko darstellen, Webxdc Apps in Chats zu öffnen, in denen man den Mitgliedern nicht vertraut - so wie man es von E-Mail-Anhängen kennt, wo man nur Anhänge von Absendern öffnet, denen man vertraut, und nicht von Spammern.</li>
<li>Das bedeutet auch: Es kann ein Datenschutzrisiko darstellen, Webxdc Apps in Chats zu öffnen, in denen man den Mitgliedern nicht vertraut - so wie man es von E-Mail-Anhängen kennt, wo man nur Anhänge von Absendern öffnet, denen man vertraut, und nicht von Spammern. Spammer erhalten alle Daten, die Sie Ihnen senden zusammen mit Ihrer IP-Adresse.</li>
</ul>
<h3 id="wo-bekomme-ich-webxdc-apps">
@@ -1382,13 +1331,7 @@ forum</a> veröffentlicht und diskutiert.</li>
</h3>
<ul>
<li>Mit einer Broadcast-Liste können Sie eine Nachricht an viele Empfänger gleichzeitig senden; wenn sie Ihnen antworten, erhalten Sie die Antwort im Direktchat mit ihnen. Die Empfänger können einander nicht sehen.</li>
<li>Technisch gesehen handelt es sich um eine E-Mail mit vielen Empfängern in BCC.</li>
<li>Sie können die Funktion im Abschnitt “Experimentelle Features” in den erweiterten Einstellungen aktivieren. Dann können Sie im Dialogfeld “Neuer Chat” eine Broadcast-Liste erstellen.</li>
<li>Falls Sie mehr als ein Gerät verwenden, werden Broadcast-Listen derzeit nicht zwischen ihnen synchronisiert.</li>
<li>An Broadcast-Listen gesendete Nachrichten werden nicht verschlüsselt. Eine Verschlüsselung würde die Anonymität brechen, denn dann wüssten alle Empfänger, wer sie sonst noch erhalten hat. (Das Senden einzelner E-Mails an alle wäre aus Gründen der Ratenbegrenzung und des Netzwerkverbrauchs schlechter.)</li>
</ul>
<p>Mit einer Broadcast-Liste können Sie eine Nachricht an viele Empfänger auf einmal senden; die Empfänger können in dieser Liste nicht antworten. Broadcast-Listen sind experimentell und werden sehr wahrscheinlich durch etwas anderes ersetzt werden, bleiben Sie dran :)</p>
<h3 id="wie-kann-ich-meinen-standort-mit-meinen-chat-partnern-teilen">
@@ -1434,6 +1377,11 @@ forum</a> veröffentlicht und diskutiert.</li>
</h3>
<p>Anmerkung:
Das Ändern von E-Mail-Adressen ist vorübergehend deaktiviert
wegen laufender Änderungen am DeltaChat-Core.
Es sollte in ein paar Monaten wieder verfügbar sein.</p>
<ol>
<li>
<p>Ändern Sie Ihre E-Mail-Adresse unter “Einstellungen → Erweitert → Passwort und E-Mail-Konto” und
@@ -1532,17 +1480,42 @@ gesendet haben, Nachrichten an Ihre neue Adresse senden.</p>
Allerdings benötigen einige Anbieter besondere Einstellungen, um ordnungsgemäß zu funktionieren; eine von NutzerInnen erstellte Sammlung zu einigen Optionen findet sich unter <a href="https://providers.delta.chat">Provider Overview</a>.</li>
</ul>
<h3 id="ich-möchte-meinen-eigenen-e-mail-server-für-delta-chat-verwalten-gibt-es-empfehlungen">
<h3 id="can-i-use-delta-chat-in-parallel-with-other-e-mail-apps">
Ich möchte meinen eigenen E-Mail-Server für Delta Chat verwalten. Gibt es Empfehlungen? <a href="#ich-möchte-meinen-eigenen-e-mail-server-für-delta-chat-verwalten-gibt-es-empfehlungen" class="anchor"></a>
Can I use Delta Chat in parallel with other E-Mail apps? <a href="#can-i-use-delta-chat-in-parallel-with-other-e-mail-apps" class="anchor"></a>
</h3>
<p>Yes, but it is not recommended.</p>
<p>Parallel usage with the same E-Mail address might lead to the following inconveniences:</p>
<ul>
<li>Next to your Delta Chat notifications,
you might also get notifications for (encrypted, so unreadable) chat mail messages
in your other email app</li>
<li>If Delta Chat is not running
or “Advanced &gt; Move automatically to the DeltaChat Folder” is disabled,
encrypted Delta Chat messages might clutter the Inbox in your other E-Mail apps.</li>
</ul>
<p><a href="https://support.delta.chat/t/sieve-rule-to-move-deltachat-mails-to-deltachat-folder/288/10">Sieve rules</a> can solve these problems.</p>
<h3 id="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 href="#ich-möchte-meinen-eigenen-server-für-delta-chat-verwalten-gibt-es-empfehlungen" class="anchor"></a>
</h3>
<ul>
<li>Die meisten Mailserver werden gut funktionieren. Was wir persönlich jedoch empfehlen, ist eine Kombination aus mailcow und mailadm, wie <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">in diesem Blogpost</a> beschrieben.</li>
<li>Auf unserer Webseite finden Sie eine <a href="https://delta.chat/de/serverguide">Installationsanleitung</a>.</li>
<li>Die meisten Mailserver werden gut funktionieren. Aber wir persönlich empfehlen ein
Chatmail-Relay-Server, wie er <a href="https://delta.chat/en/2023-12-13-chatmail">in diesem
Blogpost</a> beschrieben wird.</li>
<li>Man kann eine <a href="https://github.com/chatmail/relay">Installationsanleitung auf GitHub</a> finden.</li>
</ul>
<h3 id="weshalb-muss-ich-mein-e-mail-kennwort-in-delta-chat-eingeben-ist-das-sicher">
@@ -1555,7 +1528,7 @@ Allerdings benötigen einige Anbieter besondere Einstellungen, um ordnungsgemä
<p>Genau wie auch bei anderen E-Mail-Programmen (z. B. Thunderbird, K9-Mail oder Outlook) benötigt Delta Chat das Passwort, um E-Mails versenden zu können. Das Passwort wird nur auf Ihrem Gerät gespeichert und bei der Anmeldung an Ihren E-Mail-Anbieter gesendet.</p>
<p>Da Delta Chat Open Source ist, können Sie den <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">Quellcode</a> einsehen und sich davon überzeugen, dass Ihre Zugangsdaten sicher gehandhabt werden. Wir freuen uns über Feedback, das unsere App sicherer für all unsere NutzerInnen macht.</p>
<p>Da Delta Chat Open Source ist, können Sie den <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">Quellcode</a> einsehen und sich davon überzeugen, dass Ihre Zugangsdaten sicher gehandhabt werden. Wir freuen uns über Feedback, das unsere App sicherer für all unsere NutzerInnen macht.</p>
<h3 id="welche-nachrichten-erscheinen-in-delta-chat">
@@ -1645,17 +1618,17 @@ wenn Sie eine <a href="#signature">Signaturtext</a> einfügen.</p>
<p>Einige BenutzerInnen verwenden Delta Chat als reguläres E-Mail-Programm und möchten lieber den Posteingang anstatt des DeltaChat-Ordners verwenden. Wenn Sie “DeltaChat-Ordner beobachten” ausschalten, sollten Sie auch “Autom. Verschieben in den DeltaChat-Ordner” ausschalten. Andernfalls funktioniert die Verwendung auf mehreren Geräten möglicherweise nicht richtig.</p>
<h3 id="ist-delta-chat-kompatibel-mit-protonmail--tutanota--criptext">
<h3 id="ist-delta-chat-kompatibel-mit-proton-mail--tutanota--criptext">
Ist Delta Chat kompatibel mit Protonmail / Tutanota / Criptext? <a href="#ist-delta-chat-kompatibel-mit-protonmail--tutanota--criptext" class="anchor"></a>
Ist Delta Chat kompatibel mit Proton Mail / Tutanota / Criptext? <a href="#ist-delta-chat-kompatibel-mit-proton-mail--tutanota--criptext" class="anchor"></a>
</h3>
<ul>
<li>Ja und Nein.</li>
<li>Nein, Sie können sich nicht mit Delta Chat in ein Protonmail-, Tutanota- oder Criptext-Konto einloggen, da diese keinen Standard-E-Mail-Empfang über IMAP anbieten.</li>
<li>Nein, Sie können sich nicht mit Delta Chat in ein Proton-Mail-, Tutanota- oder Criptext-Konto einloggen, da diese keinen Standard-E-Mail-Empfang über IMAP anbieten.</li>
<li>Ja, Sie können Delta Chat verwenden, um Nachrichten an Personen zu senden, die Protonmail, Tutanota oder Criptext verwenden. Diese Nachrichten werden jedoch nicht Ende-zu-Ende-verschlüsselt, da diese Anbieter keine mit dem <a href="https://autocrypt.org/">Autocrypt</a>-Standard kompatible Verschlüsselung verwenden.</li>
<li>Delta Chat kann Ende-zu-Ende-Verschlüsselung über jeden E-Mail-Anbieter mit jeder
<a href="https://autocrypt.org/dev-status.html">Autocrypt-fähige E-Mail-Anwendung</a> herstellen</li>
@@ -1698,7 +1671,7 @@ Andernfalls könnten Sie unverschlüsselte Nachrichten aus diesen Gruppenchats e
</h3>
<ul>
<li>Siehe hierzu <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">in Delta Chat genutzte Standards</a>.</li>
<li>Siehe hierzu <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">in Delta Chat genutzte Standards</a>.</li>
</ul>
<h3 id="wo-können-meine-freunde-delta-chat-finden">
@@ -1794,4 +1767,4 @@ Der Erhalt von Spenden hilft uns auch, unabhängiger und langfristig lebensfähi
</body></html>
</body></html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because it is too large Load Diff
+233 -198
View File
@@ -10,7 +10,9 @@
<li><a href="#kto-widzi-moje-zdjęcie-profilowe">Kto widzi moje zdjęcie profilowe?</a></li>
<li><a href="#signature">Czy w Delta Chat mogę ustawić Biografię/Podpis/Status/Motto?</a></li>
<li><a href="#co-oznacza-przypinanie-wyciszanie-i-archiwizowanie">Co oznacza przypinanie, wyciszanie i archiwizowanie?</a></li>
<li><a href="#save">Jak działają „Zapisane wiadomości”?</a></li>
<li><a href="#co-oznacza-zielona-kropka">Co oznacza zielona kropka?</a></li>
<li><a href="#edit">Poprawianie literówek i usuwanie wiadomości po wysłaniu</a></li>
<li><a href="#ephemeralmsgs">Jak działają znikające wiadomości?</a></li>
</ul>
</li>
@@ -34,29 +36,25 @@
<li><a href="#dlaczego-delta-chat-integruje-się-ze-scentralizowanymi-zastrzeżonymi-usługami-push-applegoogle">Dlaczego Delta Chat integruje się ze scentralizowanymi, zastrzeżonymi usługami push Apple/Google?</a></li>
</ul>
</li>
<li><a href="#szyfrowanie-i-bezpieczeństwo">Szyfrowanie i bezpieczeństwo</a>
<li><a href="#e2ee">Szyfrowanie i bezpieczeństwo</a>
<ul>
<li><a href="#jakie-standardy-są-stosowane-do-szyfrowania-end-to-end">Jakie standardy są stosowane do szyfrowania end-to-end?</a></li>
<li><a href="#whene2e">Skąd mogę wiedzieć, czy wiadomości są szyfrowane metodą e2e?</a></li>
<li><a href="#howtoe2ee">Jak mogę uzyskać gwarancję kompleksowego szyfrowania i zielone znaczniki wyboru?</a></li>
<li><a href="#e2eeguarantee">Co oznacza zielony znacznik wyboru i „gwarantowane kompleksowe szyfrowanie”?</a></li>
<li><a href="#nocryptanymore">Kontakt „wysłał wiadomość z innego urządzenia”, co mogę zrobić?</a></li>
<li><a href="#czy-nadal-mogę-odbierać-lub-wysyłać-wiadomości-bez-szyfrowania-end-to-end">Czy nadal mogę odbierać lub wysyłać wiadomości bez szyfrowania end-to-end?</a></li>
<li><a href="#howtoe2ee">Jak mogę nawiązać czat z nowym kontaktem?</a></li>
<li><a href="#e2eeguarantee">Co oznacza zielony znacznik wyboru w profilu kontaktu?</a></li>
<li><a href="#czy-załączniki-zdjęcia-pliki-pliki-audio-itp-są-szyfrowane-metodą-end-to-end">Czy załączniki (zdjęcia, pliki, pliki audio itp.) są szyfrowane metodą end-to-end?</a></li>
<li><a href="#openpgp-secure">Czy OpenPGP jest bezpieczny?</a></li>
<li><a href="#openpgp-alternatives">Czy rozważałeś użycie alternatyw dla OpenPGP do szyfrowania typu end-to-end?</a></li>
<li><a href="#czy-delta-chat-jest-podatny-na-efail">Czy Delta Chat jest podatny na EFAIL?</a></li>
<li><a href="#tls">Czy wiadomość jest udostępniana w postaci zwykłego tekstu, jeśli szyfrowanie end-to-end nie jest dostępne?</a></li>
<li><a href="#tls">Czy wiadomości oznaczone ikoną poczty są widoczne w internecie?</a></li>
<li><a href="#message-metadata">W jaki sposób Delta Chat chroni metadane w wiadomościach?</a></li>
<li><a href="#device-seizure">Jak chronić metadane i kontakty w przypadku przejęcia urządzenia?</a></li>
<li><a href="#jak-mogę-sprawdzić-informacje-o-szyfrowaniu">Jak mogę sprawdzić informacje o szyfrowaniu?</a></li>
<li><a href="#jak-mogę-sprawdzić-stan-szyfrowania-wiadomości">Jak mogę sprawdzić stan szyfrowania wiadomości?</a></li>
<li><a href="#dlaczego-widzę-niezaszyfrowane-wiadomości">Dlaczego widzę niezaszyfrowane wiadomości?</a></li>
<li><a href="#jak-mogę-uzyskać-zaszyfrowany-ened-to-end-czat-z-kontaktem-delta-chat-który-czasami-korzysta-z-poczty-internetowej-lub-innej-aplikacji-e-mail-bez-autocrypt">Jak mogę uzyskać zaszyfrowany ened-to-end czat z kontaktem Delta Chat, który czasami korzysta z poczty internetowej lub innej aplikacji e-mail bez Autocrypt?</a></li>
<li><a href="#jak-mogę-zapewnić-kompleksowe-szyfrowanie-i-usuwanie-wiadomości">Jak mogę zapewnić kompleksowe szyfrowanie i usuwanie wiadomości?</a></li>
<li><a href="#sealedsender">Czy Delta Chat obsługuje funkcję „Sealed Sender”?</a></li>
<li><a href="#pfs">Czy Delta Chat obsługuje funkcję Perfect Forward Secrecy?</a></li>
<li><a href="#czy-szyfrowanie-end-to-end-delta-chat-jest-tak-samo-bezpieczne-jak-signal">Czy szyfrowanie end-to-end Delta Chat jest tak samo bezpieczne jak Signal?</a></li>
<li><a href="#pqc">Czy Delta Chat obsługuje kryptografię postkwantową?</a></li>
<li><a href="#jak-mogę-ręcznie-sprawdzić-informacje-o-szyfrowaniu">Jak mogę ręcznie sprawdzić informacje o szyfrowaniu?</a></li>
<li><a href="#importkey">Czy mogę ponownie wykorzystać mój istniejący klucz prywatny?</a></li>
<li><a href="#nie-mogę-zaimportować-istniejącego-klucza-pgp-do-delta-chat">Nie mogę zaimportować istniejącego klucza PGP do Delta Chat.</a></li>
<li><a href="#security-audits">Czy Delta Chat był niezależnie kontrolowany pod kątem luk w zabezpieczeniach?</a></li>
</ul>
</li>
@@ -65,6 +63,7 @@
<li><a href="#czy-mogę-korzystać-z-delta-chat-na-wielu-urządzeniach-w-tym-samym-czasie">Czy mogę korzystać z Delta Chat na wielu urządzeniach w tym samym czasie?</a></li>
<li><a href="#rozwiązywanie-problemów">Rozwiązywanie problemów</a></li>
<li><a href="#backup">Ręczny transfer</a></li>
<li><a href="#czy-usuwanie-przypinanie-archiwizowanie-zapisywanie-wyciszanie-itp-jest-synchronizowane-ze-wszystkimi-urządzeniami">Czy usuwanie, przypinanie, archiwizowanie, zapisywanie, wyciszanie itp. jest synchronizowane ze wszystkimi urządzeniami?</a></li>
<li><a href="#czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">Czy są jakieś plany wprowadzenia klienta Web Delta Chat?</a></li>
</ul>
</li>
@@ -88,7 +87,8 @@
<ul>
<li><a href="#jakich-uprawnień-potrzebuje-delta-chat">Jakich uprawnień potrzebuje Delta Chat?</a></li>
<li><a href="#czy-delta-chat-działa-z-moim-dostawcą-poczty-e-mail">Czy Delta Chat działa z <em>moim</em> dostawcą poczty e-mail?</a></li>
<li><a href="#chcę-zarządzać-własnym-serwerem-e-mail-dla-delta-chat-co-polecacie">Chcę zarządzać własnym serwerem e-mail dla Delta Chat. Co polecacie?</a></li>
<li><a href="#can-i-use-delta-chat-in-parallel-with-other-e-mail-apps">Can I use Delta Chat in parallel with other E-Mail apps?</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="#dlaczego-muszę-wpisać-moje-hasło-e-mail-do-delta-chat-czy-to-jest-bezpieczne">Dlaczego muszę wpisać moje hasło e-mail do Delta Chat? Czy to jest bezpieczne?</a></li>
<li><a href="#jakie-wiadomości-pojawiają-się-w-delta-chat">Jakie wiadomości pojawiają się w Delta Chat?</a></li>
<li><a href="#czy-delta-chat-obsługuje-wiadomości-e-mail-w-formacie-html">Czy Delta Chat obsługuje wiadomości e-mail w formacie HTML?</a></li>
@@ -96,7 +96,7 @@
<li><a href="#do-czego-służy-ustawienie-wyślij-kopię-do-siebie">Do czego służy ustawienie „Wyślij kopię do siebie”?</a></li>
<li><a href="#po-co-mam-wybrać-opcję-oglądania-folderu-wysłane">Po co mam wybrać opcję oglądania folderu „Wysłane”?</a></li>
<li><a href="#dlaczego-mogę-nie-widzieć-folderu-deltachat">Dlaczego mogę nie widzieć folderu DeltaChat?</a></li>
<li><a href="#czy-delta-chat-jest-kompatybilny-z-protonmail--tutanota--criptext">Czy Delta Chat jest kompatybilny z Protonmail / Tutanota / Criptext?</a></li>
<li><a href="#czy-delta-chat-jest-kompatybilny-z-proton-mail--tutanota--criptext">Czy Delta Chat jest kompatybilny z Proton Mail / Tutanota / Criptext?</a></li>
<li><a href="#remove-account">Jak mogę usunąć swoje konto?</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>
<li><a href="#gdzie-moi-znajomi-mogą-znaleźć-delta-chat">Gdzie moi znajomi mogą znaleźć Delta Chat?</a></li>
@@ -154,7 +154,7 @@
<p><a href="#security-audits">Audytowne szyfrowanie end-to-end</a> zabezpieczające przed atakami sieciowymi i serwerowymi.</p>
</li>
<li>
<p>Bezpłatne i otwartoźródłowe oprogramowanie zarówno po stronie aplikacji, jak i serwera. Stworzone w oparciu o <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">standardy e-mail i internetowe</a>, <a href="https://xkcd.com/927/">aby uniknąć „kolejnego standardowego syndromu (xkcd 927)”</a>.</p>
<p>Bezpłatne i otwartoźródłowe oprogramowanie zarówno po stronie aplikacji, jak i serwera. Stworzone w oparciu o <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">standardy e-mail i internetowe</a>, <a href="https://xkcd.com/927/">aby uniknąć „kolejnego standardowego syndromu (xkcd 927)”</a>.</p>
</li>
</ul>
@@ -166,10 +166,18 @@
</h3>
<p>Jeśli wiadomość pochodzi od nieznanego kontaktu, wyświetla się jako <strong>prośba</strong>.</p>
<ul>
<li>Jeśli wiadomość przychodzi od nieznanego kontaktu, pojawia się jako <strong>prośba</strong>. Musisz zaakceptować prośbę, zanim będziesz mógł odpowiedzieć.</li>
<li>Możesz również „usunąć” ją, jeśli nie chcesz na razie z nią rozmawiać. To <em>nie</em> usuwa wiadomości na serwerze, tylko na Twoim urządzeniu. Możesz więc nadal zajmować się tą wiadomością w innej aplikacji pocztowej.</li>
<li>Jeśli usuniesz prośbę, przyszłe wiadomości od tego kontaktu będą nadal wyświetlane jako prośba o wiadomość, więc możesz zmienić zdanie. Jeśli naprawdę nie chcesz otrzymywać wiadomości od tej osoby, rozważ <em>zablokowanie</em> jej.</li>
<li>
<p>Musisz <strong>zaakceptować</strong> prośbę, zanim będziesz mógł odpowiedzieć.</p>
</li>
<li>
<p>Możesz także <strong>usunąć</strong> wiadomość, jeśli nie chcesz w tej chwili z nią rozmawiać.</p>
</li>
<li>
<p>Jeśli usuniesz prośbę, przyszłe wiadomości od tego kontaktu nadal będą wyświetlane jako prośba o wiadomość, więc możesz zmienić zdanie. Jeśli naprawdę nie chcesz otrzymywać wiadomości od tej osoby, rozważ <strong>zablokowanie</strong> jej.</p>
</li>
</ul>
<h3 id="czy-delta-chat-obsługuje-obrazy-filmy-i-inne-załączniki">
@@ -182,7 +190,7 @@
<ul>
<li>
<p>Tak. Oprócz zwykłego tekstu wszystkie załączniki wiadomości e-mail są wyświetlane jako oddzielne wiadomości. Wiadomości wychodzące automatycznie otrzymują załączniki w razie potrzeby.</p>
<p>Tak. Obrazy, filmy, pliki, wiadomości głosowe itp. są obsługiwane jak zwykle.</p>
</li>
<li>
<p>Ze względu na wydajność obrazy są domyślnie optymalizowane i wysyłane w mniejszym rozmiarze, ale można je wysłać jako „plik”, aby zachować oryginał.</p>
@@ -268,6 +276,36 @@
<p>Aby skorzystać z tych funkcji, przytrzymaj dłużej lub kliknij prawym przyciskiem myszy czat na liście czatów.</p>
<h3 id="save">
Jak działają „Zapisane wiadomości”? <a href="#save" class="anchor"></a>
</h3>
<p><strong>Zapisane wiadomości</strong> to czat, którego możesz użyć, aby łatwo zapisać i znaleźć wiadomości.</p>
<ul>
<li>
<p>W dowolnym czacie naciśnij i przytrzymaj lub kliknij prawym przyciskiem myszy wiadomość i wybierz <strong>Zapisz</strong></p>
</li>
<li>
<p>Zapisane wiadomości są oznaczone symbolem <img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="ikona Zapisz" /> obok znacznika czasu</p>
</li>
<li>
<p>Później otwórz czat „Zapisane wiadomości” — zobaczysz tam zapisane wiadomości. Naciskając <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="ikona strzałki w prawo" />, możesz wrócić do oryginalnej wiadomości w oryginalnym czacie</p>
</li>
<li>
<p>Na koniec możesz również użyć „Zapisz wiadomości”, aby robić <strong>osobiste notatki</strong> — otwórz czat, wpisz coś, dodaj zdjęcie lub wiadomość głosową itp.</p>
</li>
<li>
<p>Ponieważ „Zapisane wiadomości” są zsynchronizowane, mogą być bardzo przydatne do przesyłania danych między urządzeniami</p>
</li>
</ul>
<p>Wiadomości pozostają zapisane, nawet jeśli zostaną edytowane lub usunięte — może to być przez <a href="#edit">nadawcę</a>, <a href="#delold">czyszczenie urządzenia</a> lub <a href="#ephemeralmsgs">znikające wiadomości z innych czatów</a>.</p>
<h3 id="co-oznacza-zielona-kropka">
@@ -276,16 +314,40 @@
</h3>
<p>Czasami można zobaczyć <strong>zieloną kropkę</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> obok awatara kontaktu. Oznacza to, że był on „niedawno widziany” w ciągu ostatnich 10 minut:</p>
<ul>
<li>Od wersji Delta Chat 1.34 czasami można zobaczyć „zieloną kropkę” obok awatara kontaktu. Oznacza to, że był on „niedawno widziany”.</li>
<li>Dokładnie oznacza to, że w ciągu ostatnich 10 minut Delta Chat widział go:</li>
<li>dlatego, że wysłał Ci bezpośrednio wiadomość,</li>
<li>ponieważ napisał coś do grupy, której oboje jesteście członkami,</li>
<li>ponieważ wysłał Ci potwierdzenie przeczytania napisanej przez Ciebie wiadomości,</li>
<li>lub dlatego, że wysłał dane do Twojej aplikacji Delta Chat za pomocą <a href="#webxdc">Webxdc aplikacji</a>.</li>
<li>Nie jest to więc status online w czasie rzeczywistym a jeśli ktoś nie odpowie od razu, mimo że wydaje się, że jest online, nie martw się i daj mu trochę miejsca ;-)</li>
<li>Z drugiej strony inni nie zawsze „zobaczą, że jesteś online”. Jeśli wyłączyłeś potwierdzenia odczytu, nie zobaczą oni zielonej kropki, dopóki nie wyślesz do nich wiadomości lub nie napiszesz do grupy, w której również się znajdują.</li>
<li>ponieważ edytował lub usunął wiadomość w udostępnionym Tobie czacie,</li>
<li>lub dlatego, że używał <a href="#webxdc">aplikacji</a> w udostępnionym Tobie czacie.</li>
</ul>
<p>Nie jest to więc status online w czasie rzeczywistym a jeśli ktoś nie odpowie od razu, mimo że wydaje się, że jest online, nie martw się i daj mu trochę czasu :)</p>
<p>Z drugiej strony, inni nie zawsze „zauważą, że jesteś online”. Jeśli wyłączyłeś potwierdzenia odczytu, nie zobaczą zielonej kropki, dopóki nie zostanie spełniony jeden z powyższych warunków.</p>
<h3 id="edit">
Poprawianie literówek i usuwanie wiadomości po wysłaniu <a href="#edit" class="anchor"></a>
</h3>
<ul>
<li>
<p>Możesz edytować tekst wiadomości po wysłaniu. W tym celu naciśnij i przytrzymaj lub kliknij prawym przyciskiem myszy wiadomość i wybierz Edytuj, lub<img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="ikona Edytuj" />.</p>
</li>
<li>
<p>Jeśli wysłałeś wiadomość przypadkowo, z tego samego menu wybierz <strong>Usuń</strong>, a następnie <strong>Usuń u wszystkich</strong>.</p>
</li>
</ul>
<p>Podczas gdy edytowane wiadomości będą miały słowo „Edytowana” obok znacznika czasu, usunięte wiadomości zostaną usunięte bez znacznika na czacie. Powiadomienia nie są wysyłane i nie ma limitu czasowego.</p>
<p>Pamiętaj, że oryginalną wiadomość nadal mogą otrzymać członkowie czatu, którzy mogli już odpowiedzieć, przesłać dalej, zapisać, wykonać zrzut ekranu lub w inny sposób skopiować wiadomość.</p>
<h3 id="ephemeralmsgs">
@@ -295,7 +357,11 @@
</h3>
<p>Możesz włączyć „znikające wiadomości” w ustawieniach czatu, w prawym górnym rogu okna czatu, wybierając przedział czasu od 1 minuty do 5 tygodni.</p>
<p>You can turn on “disappearing messages”
in the settings of a chat,
at the top right of the chat window,
by selecting a time span
between 5 minutes and 1 year.</p>
<p>Dopóki ustawienie nie zostanie ponownie wyłączone, aplikacja Delta Chat u każdego członka czatu zajmie się usuwaniem wiadomości po wybranym okresie. Przedział czasu rozpoczyna się w momencie, gdy odbiorca po raz pierwszy zobaczy wiadomość w Delta Chat. Wiadomości są usuwane zarówno na każdym koncie e-mail na serwerze, jak i w samej aplikacji.</p>
@@ -525,10 +591,10 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<p>Pamiętaj, że Delta Chat posiada <a href="#privacy-notifications">mały i chroniący prywatność system powiadomień push</a>, który zapewnia „natychmiastowe dostarczanie” wiadomości ze wszystkich serwerów chatmail, w tym potencjalnego, który <a href="https://delta.chat/chatmail#selfhosted">możesz skonfigurować samodzielnie bez naszej zgody</a>. Witamy w potędze interoperacyjnego i ogromnego systemu chatmail i e-mail :)</p>
<h2 id="szyfrowanie-i-bezpieczeństwo">
<h2 id="e2ee">
Szyfrowanie i bezpieczeństwo <a href="#szyfrowanie-i-bezpieczeństwo" class="anchor"></a>
Szyfrowanie i bezpieczeństwo <a href="#e2ee" class="anchor"></a>
</h2>
@@ -541,9 +607,21 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p><a href="https://autocrypt.org">Autocrypt</a> służy do automatycznego ustanawiania szyfrowania end-to-end kontaktów i czatów grupowych. Autocrypt wykorzystuje ograniczony i <a href="#openpgp-secure">bezpieczny podzbiór standardu OpenPGP</a>. W pełni zaszyfrowane wiadomości są oznaczone kłódką <img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" />.</p>
<p>Delta Chat wykorzystuje <a href="#openpgp-secure">bezpieczny podzbiór standardu OpenPGP</a> do automatycznego szyfrowania typu end-to-end za pomocą następujących protokołów:</p>
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Protokoły Secure-Join</a> służą do nawiązywania rozmów z gwarantowanym szyfrowaniem typu end-to-end, które chroni przed atakami sieciowymi i zagrożonymi serwerami. Czaty oznaczone zielonym znacznikiem wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> gwarantują szyfrowanie end-to-end wiadomości.</p>
<ul>
<li>
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a> do wymiany informacji o konfiguracji szyfrowania poprzez skanowanie kodów QR lub „linki zaproszeń”.</p>
</li>
<li>
<p><a href="https://autocrypt.org">Autocrypt</a> służy do automatycznego ustanawiania szyfrowania typu end-to-end między kontaktami a wszystkimi członkami czatu grupowego.</p>
</li>
<li>
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Udostępnienie kontaktu na czacie</a> umożliwia odbiorcom korzystanie z szyfrowania typu end-to-end z tym kontaktem.</p>
</li>
</ul>
<p>Delta Chat nie wysyła zapytań, nie publikuje ani nie wchodzi w interakcję z żadnymi serwerami kluczy OpenPGP.</p>
<h3 id="whene2e">
@@ -553,100 +631,69 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Wszystkie całkowicie zaszyfrowane wiadomości są oznaczone kłódką:</p>
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="padlock in bubble" /></p>
<p>Pełne szyfrowanie jest gwarantowane, jeśli obok tytułu czatu znajduje się zielony znacznik wyboru:</p>
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="green checkmark in title" /></p>
<p>Wszystkie wiadomości w Delta Chat są <strong>domyślnie szyfrowane metodą end-to-end</strong>. Od wydania Delta Chat w wersji 2 (lipiec 2025 r.) nie ma już blokad ani podobnych znaczników na wiadomościach szyfrowanych metodą end-to-end.</p>
<h3 id="howtoe2ee">
<h3 id="czy-nadal-mogę-odbierać-lub-wysyłać-wiadomości-bez-szyfrowania-end-to-end">
Jak mogę uzyskać gwarancję kompleksowego szyfrowania i zielone znaczniki wyboru? <a href="#howtoe2ee" class="anchor"></a>
Czy nadal mogę odbierać lub wysyłać wiadomości bez szyfrowania end-to-end? <a href="#czy-nadal-mogę-odbierać-lub-wysyłać-wiadomości-bez-szyfrowania-end-to-end" class="anchor"></a>
</h3>
<p>Jeśli masz drugi kanał komunikacji ze swoim partnerem na czacie, np. czat wideo lub inny komunikator, możesz wygenerować link zaproszenia.</p>
<p>Jeśli korzystasz z domyślnych <a href="https://chatmail.at/relays">przekaźników chatmail</a>, odbieranie ani wysyłanie wiadomości bez szyfrowania end-to-end jest niemożliwe.</p>
<p>Jeśli jesteście razem osobiście, możesz pokazać kod QR swojemu rozmówcy.</p>
<p>If you instead create a profile using a classic e-mail server,
you can send and receive messages with or without end-to-end encryption.
Messages lacking end-to-end encryption are marked with an e-mail icon
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
<h3 id="howtoe2ee">
Jak mogę nawiązać czat z nowym kontaktem? <a href="#howtoe2ee" class="anchor"></a>
</h3>
<p>Możesz wysłać link z zaproszeniem za pośrednictwem innego prywatnego czatu, wyświetlić kod QR zaproszenia, gdy kontakty znajdują się obok siebie lub w rozmowie wideo, albo dotknąć „kontakt”, który został udostępniony na czacie.</p>
<ul>
<li>
<p>W przypadku <strong>zaproszeń grupowych</strong> dotknij tytułu czatu grupy, aby wyświetlić listę jej członków, i wybierz „Kod QR zaproszenia”.</p>
</li>
<li>
<p>Aby uzyskać <strong>bezpośrednie zaproszenia na czat 1:1</strong>, dotknij ikony kodu QR <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> na ekranie głównym aplikacji Delta Chat.</p>
<p>Aby <strong>wysłać zaproszenie do czatu 1:1</strong>, dotknij ikony kodu QR <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> na ekranie głównym aplikacji Delta Chat.</p>
</li>
</ul>
<p>Pozwól swojemu partnerowi czatu zeskanować obraz QR za pomocą aplikacji Delta Chat lub dotknij „Kopiuj” lub „Udostępnij”, aby utworzyć link zaproszenia i udostępnić go swojemu partnerowi czatu.</p>
<p>Poproś rozmówcę o zeskanowanie obrazu QR za pomocą aplikacji Delta Chat lub dotknij „Kopiuj” lub „Udostępnij”, aby utworzyć link zaproszenia i udostępnić go rozmówcy.</p>
<p>Teraz poczekaj, aż między obydwoma urządzeniami <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">nastąpi wymiana wiadomości sieciowych Secure-Join</a>.</p>
<p>Poczekaj, aż <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">szyfrowanie typu end-to-end zostanie nawiązane</a>.</p>
<ul>
<li>
<p>Jeśli oba urządzenia są w trybie online, obie strony ostatecznie zobaczą czat (grupowy lub bezpośredni) z zielonym znacznikiem wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> obok tytułu.</p>
<p>Jeśli obie strony są online, wkrótce zobaczą czat (grupowy lub bezpośredni) i będą mogły bezpiecznie wysyłać wiadomości.</p>
</li>
<li>
<p>Jeśli jedno z urządzeń jest w trybie offline, zielone znaczniki wyboru pojawią się później, dopiero gdy urządzenie zostanie ponownie połączone z Internetem i zostanie zrealizowany protokół sieciowy Secure-Join.</p>
<p>Jeśli jedna ze stron jest offline lub ma słaby zasięg, możliwość czatowania zostanie wstrzymana do czasu przywrócenia połączenia.</p>
</li>
</ul>
<p>Gratulacje! Teraz będziecie automatycznie korzystać z gwarantowanego kompleksowego szyfrowania tego kontaktu i oboje będziecie mogli dodawać się nawzajem do grup oznaczonych zielonym znacznikiem wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> , w ten sposób automatycznie rozpowszechniając gwarantowane kompleksowe szyfrowanie wśród swoich członków.</p>
<p>Gratulacje! Teraz będziesz automatycznie korzystać z szyfrowania typu end-to-end dla tego kontaktu. Jeśli dodacie się nawzajem do czatów grupowych, szyfrowanie typu end-to-end zostanie nawiązane między wszystkimi członkami.</p>
<h3 id="e2eeguarantee">
Co oznacza zielony znacznik wyboru i „gwarantowane kompleksowe szyfrowanie”? <a href="#e2eeguarantee" class="anchor"></a>
Co oznacza zielony znacznik wyboru w profilu kontaktu? <a href="#e2eeguarantee" class="anchor"></a>
</h3>
<p>Tytuły czatów z zielonymi znacznikami wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> oznaczają, że wszystkie wiadomości na czacie będą w pełni szyfrowane i nie będą mogły zostać odczytane ani zmodyfikowane przez zhakowane serwery poczty e-mail lub dostawców Internetu. Dołączanie do czatów grupowych oznaczonych zielonym znacznikiem bezpiecznie rozpowszechnia informacje o szyfrowaniu wszystkich osób (i zielone znaczniki wyboru) w sposób gwarantujący kompleksowe szyfrowanie w grupie i pomiędzy członkami.</p>
<p>Profile kontaktów z zielonymi znacznikami wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> oznaczają, że obecnie gwarantujemy, że wiadomości kontaktu będą szyfrowane metodą end-to-end. Każdy kontakt oznaczony zielonym znacznikiem albo wykonał z tobą bezpośrednie <a href="#howtoe2ee">skanowanie QR</a>, albo został zweryfikowany przez inny kontakt oznaczony zielonym znacznikiem. Weryfikacje odbywają się automatycznie podczas dodawania członków do grup. Ktokolwiek doda kontakt do grupy oznaczonej zielonym znacznikiem, staje się osobą weryfikującą dla tych członków, którzy jeszcze nie wiedzieli o dodanym kontakcie. W profilu kontaktu możesz wielokrotnie dotykać tekstu „Zweryfikowano przez…”, aż dojdziesz do osoby, z którą bezpośrednio wykonałeś <a href="#howtoe2ee">skanowanie QR</a>.</p>
<p>Pamiętaj, że w profilu kontaktu możesz widzieć i klikać osoby weryfikujące, ale w tytule profilu nie ma zielonego znacznika wyboru. Zwykle oznacza to, że kontakt <a href="#nocryptanymore">„wysłał wiadomość z innego urządzenia”</a>.</p>
<p>Profil kontaktu może wyświetlać zielony znacznik wyboru <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> i wiersz „Zweryfikowano przez…”. Każdy kontakt oznaczony zielonym znacznikiem albo wykonał z tobą bezpośrednie <a href="#howtoe2ee">skanowanie QR</a>, albo został zweryfikowany przez inny kontakt oznaczony zielonym znacznikiem. Weryfikacje odbywają się automatycznie podczas dodawania członków do grup. Osoba, która doda kontakt oznaczony zielonym znacznikiem wyboru do grupy zawierającej wyłącznie członków oznaczonych zielonym znacznikiem wyboru, staje się osobą weryfikującą. W profilu kontaktu możesz wielokrotnie dotykać tekstu „Zweryfikowano przez…”, aż dojdziesz do osoby, z którą bezpośrednio wykonałeś <a href="#howtoe2ee">skanowanie QR</a>.</p>
<p>Aby uzyskać bardziej szczegółowe omówienie „gwarantowanego szyfrowania typu end-to-end”, zobacz <a href="https://securejoin.delta.chat/en/latest/new.html">Protokoły Secure-Join</a>, a w szczególności przeczytaj o „zweryfikowanych grupach”, technicznym określeniu tak zwanego tutaj „zielonego znacznika wyboru” lub „gwarantowanego szyfrowania end-to-end” czatów.</p>
<h3 id="nocryptanymore">
Kontakt „wysłał wiadomość z innego urządzenia”, co mogę zrobić? <a href="#nocryptanymore" class="anchor"></a>
</h3>
<p>Twój czat z kontaktem utracił gwarantowane szyfrowanie typu end-to-end. Gdy zobaczysz to ostrzeżenie, zielony znacznik wyboru dla tego czatu i kontaktu został usunięty. <strong>Jeśli zdziwi cię nagły spadek gwarantowanego szyfrowania end-to-end tego kontaktu, nie akceptuj ostrzeżenia!</strong> Zamiast tego skontaktuj się ze swoim kontaktem za pośrednictwem drugiego kanału, takiego jak rozmowa wideo, inny komunikator lub rozmowa telefoniczna, aby dowiedzieć się, co się stało.</p>
<p>Jeśli twój kontakt rzeczywiście spowodował spadek gwarantowanego szyfrowania typu end-to-end, zapoznaj się z kolejnymi akapitami, aby poznać typowe przyczyny i sposoby ich łagodzenia. Niezależnie od tego, wszystkie inne czaty oznaczone zielonym znacznikiem są w pełni szyfrowane, nawet jeśli kontakt jest ich członkiem.</p>
<p><strong>Twój kontakt korzysta z Delta Chat na drugim urządzeniu (telefonie lub laptopie)</strong></p>
<p>Jeśli ma inne urządzenie z uruchomioną aplikacją Delta Chat, powinien usunąć konto z nowego urządzenia i dodać je <a href="#multiclient">jako drugie urządzenie zgodnie z opisem tutaj</a>. Gdy tylko skontaktuje się z tobą później, ostrzeżenie zniknie, a na obu urządzeniach twojego kontaktu zostanie ustanowione gwarantowane szyfrowanie.</p>
<p><strong>Twój kontakt ponownie zainstalował Delta Chat, używając swojego starego loginu do konta</strong></p>
<p>Jeśli ma <a href="#backup">plik kopii zapasowej</a>, powinien usunąć konto z nowego urządzenia i zamiast tego zaimportować plik kopii zapasowej, aby ponownie utworzyć konto. Gdy tylko skontaktuje się z tobą później, ostrzeżenie zniknie, a dla tego kontaktu zostanie przywrócone gwarantowane szyfrowanie.</p>
<p>Jeśli nie ma pliku kopii zapasowej, najlepiej wykonać <a href="#howtoe2ee">skanowanie QR</a> ze swoim partnerem czatu, aby przywrócić gwarantowane szyfrowanie end-to-end.</p>
<p><strong>Twój kontakt wysłał wiadomość e-mail za pośrednictwem interfejsu poczty internetowej lub innej aplikacji e-mail i wkrótce ponownie zacznie korzystać z Delta Chat.</strong></p>
<p>Jeśli masz pewność, że kontakt czasami korzysta z poczty internetowej lub innej aplikacji pocztowej, która nie zapewnia szyfrowania end-to-end, możesz zaakceptować ostrzeżenie. Gdy tylko twój kontakt ponownie skorzysta z Delta Chat, gwarantowane szyfrowanie end-to-end zostanie automatycznie przywrócone.</p>
<p><strong>Twój kontakt całkowicie przestał korzystać z Delta Chat</strong></p>
<p>Czasami utrzymanie kontaktu jest ważniejsze niż szyfrowanie end-to-end. <a href="#tls">„Szyfrowanie warstwy transportowej” (TLS)</a> może w dalszym ciągu w znaczący sposób chronić poufność wiadomości przesyłanych między urządzeniem a serwerem poczty e-mail. Jednak bez kompleksowego szyfrowania Ty i Twój kontakt ufacie swojemu serwerowi poczty e-mail, że nie będzie czytać ani manipulować waszymi wiadomościami i nie będzie przekazywać ich osobom trzecim.</p>
<p>W każdym razie nie możesz zrobić nic innego, jak zaakceptować ostrzeżenie. Usuń także kontakt z aktywnej grupy oznaczonej zielonym znacznikiem, którą znajdziesz w sekcji „Współdzielone czaty” w profilu kontaktu. Dzięki temu twój kontakt nie otrzyma „nieczytelnych” wiadomości.</p>
<p>Jeśli kontakt usunął Delta Chat z powodu błędów lub niepożądanego zachowania, rozważ opublikowanie postu na naszym <a href="https://support.delta.chat">forum pomocy</a>, aby pomóc nam zidentyfikować i rozwiązać typowe problemy. Dzięki!</p>
<h3 id="czy-załączniki-zdjęcia-pliki-pliki-audio-itp-są-szyfrowane-metodą-end-to-end">
@@ -667,7 +714,7 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Tak, Delta Chat korzysta z bezpiecznego podzbioru OpenPGP i wyświetla wskaźnik bezpieczeństwa kłódki na wiadomości tylko wtedy, gdy cała wiadomość jest prawidłowo zaszyfrowana i podpisana. Na przykład „Odłączone podpisy” nie są traktowane jako bezpieczne.</p>
<p>Tak, Delta Chat korzysta z bezpiecznego podzbioru OpenPGP, który wymaga prawidłowego zaszyfrowania i podpisania całej wiadomości. Na przykład „Odłączone podpisy” nie są traktowane jako bezpieczne.</p>
<p>OpenPGP samo w sobie nie jest niebezpieczne. Większość publicznie omawianych problemów związanych z bezpieczeństwem OpenPGP tak naprawdę wynika ze złej użyteczności lub złej implementacji narzędzi, lub aplikacji (lub obu). Szczególnie ważne jest rozróżnienie pomiędzy OpenPGP, standardem szyfrowania IETF, a GnuPG (GPG), narzędziem wiersza poleceń implementującym OpenPGP. Wiele publicznych komentarzy krytycznych na temat OpenPGP tak naprawdę omawia GnuPG, którego Delta Chat nigdy nie używał. Delta Chat korzysta raczej z implementacji OpenPGP Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>, dostępnej jako <a href="https://crates.io/crates/pgp">niezależny pakiet „pgp”</a> i poddanej <a href="#security-audits">audytowi bezpieczeństwa w 2019 i 2024 roku</a>.</p>
@@ -700,16 +747,14 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<h3 id="tls">
Czy wiadomość jest udostępniana w postaci zwykłego tekstu, jeśli szyfrowanie end-to-end nie jest dostępne? <a href="#tls" class="anchor"></a>
Czy wiadomości oznaczone ikoną poczty są widoczne w internecie? <a href="#tls" class="anchor"></a>
</h3>
<p>Nawet jeśli nie ma gwarancji, że twoje wiadomości będą zaszyfrowane metodą end-to-end, nadal chronione przed dostawcami Internetu, takimi jak operatorzy komórkowi lub telewizji kablowej. Jednakże dostawcy poczty e-mail zarówno twoi, jak i twojego odbiorcy mogą czytać, analizować, a nawet modyfikować twoje wiadomości, w tym wszelkie załączniki, jeśli nie są one w pełni zaszyfrowane.</p>
<p>Jeśli wysyłasz lub odbierasz wiadomości e-mail bez szyfrowania end-to-end (korzystając z klasycznego serwera poczty), są one nadal chronione przed operatorami komórkowymi lub kablowymi, którzy nie mogą ich czytać ani modyfikować. Jednak zarówno twoi dostawcy poczty e-mail, jak i dostawcy poczty e-mail odbiorcy mogą czytać, analizować lub modyfikować twoje wiadomości, w tym wszelkie załączniki.</p>
<p>Delta Chat domyślnie korzysta ze ścisłego <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">szyfrowania TLS</a>, które zabezpiecza połączenia pomiędzy twoim urządzeniem a dostawcą poczty e-mail. Cała obsługa TLS Delta Chat została poddana niezależnemu <a href="#security-audits">audytowi bezpieczeństwa</a>. Co więcej, połączenie między tobą a dostawcą poczty e-mail odbiorcy będzie zazwyczaj również szyfrowane. Jeśli zaangażowane serwery poczty e-mail obsługują <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a>, pomiędzy dostawcami poczty e-mail będzie egzekwowane szyfrowanie transportu. W takim przypadku komunikacja Delta Chat nigdy nie będzie udostępniana w Internecie w postaci zwykłego tekstu, nawet jeśli wiadomość nie została zaszyfrowana metodą end-to-end.</p>
<p>Pamiętaj, że <a href="#howtoe2ee">utrzymywanie gwarantowanego szyfrowania typu end-to-end</a> oprócz szyfrowania TLS zapewnia wszechstronne bezpieczeństwo między urządzeniami twoimi i odbiorców. Nawet twój dostawca poczty e-mail lub Internetu nie będzie w stanie przeczytać ani zmodyfikować twoich wiadomości.</p>
<h3 id="message-metadata">
@@ -719,20 +764,23 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Delta Chat chroni większość metadanych wiadomości, umieszczając następujące informacje w całkowicie zaszyfrowanej części wiadomości:</p>
<p>W przeciwieństwie do większości innych komunikatorów, aplikacje Delta Chat nie przechowują żadnych metadanych dotyczących kontaktów ani grup na serwerach, również w formie zaszyfrowanej. Zamiast tego wszystkie metadane grup są szyfrowane metodą end-to-end i przechowywane wyłącznie na urządzeniach użytkowników końcowych.</p>
<p>Serwery poczty e-mail widzą zatem tylko:</p>
<ul>
<li>Wiersz tematu</li>
<li>Awatar i nazwa grupy</li>
<li>Żądania MDN (potwierdzenie odczytu) (<code class="language-plaintext highlighter-rouge">Chat-Disposition-Notification-To</code>)</li>
<li>Licznik czasu znikania wiadomości (<code class="language-plaintext highlighter-rouge">Ephemeral-Timer</code>)</li>
<li><code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code></li>
<li>Nagłówek <code class="language-plaintext highlighter-rouge">Secure-Join</code> zawierający polecenia bezpiecznego łączenia</li>
<li>Powiadomienie o włączeniu przesyłania strumieniowego lokalizacji</li>
<li>Adres URL pokoju WebRTC</li>
<li>
<p>datę wysłania wiadomości,</p>
</li>
<li>
<p>adresy nadawcy i odbiorcy,</p>
</li>
<li>
<p>oraz rozmiar wiadomości.</p>
</li>
</ul>
<p>Serwery poczty e-mail nie mają dostępu do chronionych metadanych, ale widzą datę wiadomości, jej rozmiar oraz, co ważniejsze, adresy nadawcy i odbiorcy. Serwery poczty e-mail potrzebują adresów odbiorców, aby kierować i dostarczać wiadomości do urządzeń odbiorców.</p>
<p>Wszystkie pozostałe metadane dotyczące wiadomości, kontaktów i grup znajdują się w zaszyfrowanej metodą end-to-end części wiadomości.</p>
<h3 id="device-seizure">
@@ -742,61 +790,21 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Zarówno w celu ochrony przed serwerami poczty e-mail gromadzącymi metadane, jak i przed zagrożeniem przejęcia urządzenia, zalecamy użycie zoptymalizowanej <a href="https://delta.chat/pl/serverguide">instancji serwera poczty e-mail</a> Delta Chat w celu tworzenia pseudonimowych kont tymczasowych poprzez skanowanie kodów QR. Pamiętaj, że aplikacje Delta Chat na wszystkich platformach obsługują wiele kont, dzięki czemu możesz z łatwością korzystać z kont „1-tygodniowych” lub „1-miesięcznych” związanych z konkretnymi działaniami obok konta „głównego”, wiedząc, że wszystkie tymczasowe dane konta wraz ze wszystkimi metadanymi zostaną usunięte. Co więcej, jeśli urządzenie zostanie przejęte, nie będzie można łatwo zidentyfikować kontaktów korzystających z tymczasowych kont e-mail, w porównaniu z komunikatorami, które ujawniają numery telefonów w grupach czatów, które z kolei często są powiązane z tożsamością prawną.</p>
<p>Zarówno w celu ochrony przed serwerami poczty e-mail gromadzącymi metadane, jak i przed zagrożeniem przejęcia urządzenia, zalecamy użycie <a href="https://chatmail.at/relays">przełącznika chatmail</a> do tworzenia profili czatu z losowymi adresami e-mail do przesyłania. Pamiętaj, że aplikacje Delta Chat na wszystkich platformach obsługują wiele kont, dzięki czemu możesz z łatwością korzystać z kont „1-tygodniowych” lub „1-miesięcznych” związanych z konkretnymi działaniami obok konta „głównego”, wiedząc, że wszystkie tymczasowe dane konta wraz ze wszystkimi metadanymi zostaną usunięte. Co więcej, jeśli urządzenie zostanie przejęte, kontakty czatu korzystające z profili krótkotrwałych nie będą mogły zostać łatwo zidentyfikowane.</p>
<h3 id="jak-mogę-sprawdzić-informacje-o-szyfrowaniu">
<h3 id="sealedsender">
Jak mogę sprawdzić informacje o szyfrowaniu? <a href="#jak-mogę-sprawdzić-informacje-o-szyfrowaniu" class="anchor"></a>
Czy Delta Chat obsługuje funkcję „Sealed Sender”? <a href="#sealedsender" class="anchor"></a>
</h3>
<p>Możesz sprawdzić stan szyfrowania end-to-end ręcznie w oknie dialogowym „Szyfrowanie” (profil użytkownika w systemie Android/iOS lub kliknij prawym przyciskiem myszy element listy czatu użytkownika na komputerze). Delta Chat pokazuje tam dwa odciski palców. Jeśli te same odciski palców pojawią się u ciebie i urządzeniu twojego kontaktu, połączenie jest bezpieczne.</p>
<h3 id="jak-mogę-sprawdzić-stan-szyfrowania-wiadomości">
Jak mogę sprawdzić stan szyfrowania wiadomości? <a href="#jak-mogę-sprawdzić-stan-szyfrowania-wiadomości" class="anchor"></a>
</h3>
<p>Nie, jeszcze nie.</p>
<p>Mała <strong>kłódka</strong> w dymku wiadomości oznacza, że wiadomość od danego nadawcy została prawidłowo zaszyfrowana. Jeśli <strong>nie ma kłódki</strong>, wiadomość nie została prawidłowo zaszyfrowana metodą end-to-end, najprawdopodobniej dlatego, że nadawca korzysta z aplikacji lub interfejsu poczty internetowej bez obsługi szyfrowania typu end-to-end.</p>
<h3 id="dlaczego-widzę-niezaszyfrowane-wiadomości">
Dlaczego widzę niezaszyfrowane wiadomości? <a href="#dlaczego-widzę-niezaszyfrowane-wiadomości" class="anchor"></a>
</h3>
<p>Komunikator Signal wprowadził funkcję <a href="https://signal.org/blog/sealed-sender/">„Sealed Sender”</a> w 2018 roku, aby infrastruktura serwerowa nie wiedziała, kto wysyła wiadomość do grupy odbiorców. Jest to szczególnie ważne, ponieważ serwer Signal zna numer telefonu komórkowego każdego konta, który zazwyczaj jest powiązany z identyfikatorem paszportu.</p>
<p>Jeśli kontakt korzysta z aplikacji e-mail bez Autocrypt, wszystkie wiadomości od tego kontaktu (w czacie grupowym lub 1:1) nie będą w pełni szyfrowane, w związku z czym nie będą wyświetlane z „kłódką” przy wiadomościach. Pamiętaj, że nawet jeśli twoje kontakty korzystają z Delta Chat na swoim koncie, mogą również używać na tym koncie aplikacji e-mail bez Autocrypt, co może powodować sporadyczne wysyłanie niezaszyfrowanych wiadomości. Odpowiadanie niezaszyfrowanych wiadomości na niezaszyfrowane wiadomości jest wymagane przez funkcję Autocrypt, aby zapobiec nieczytelnym wiadomościom po stronie twoich kontaktów i ich aplikacji e-mail bez Autocrypt.</p>
<h3 id="jak-mogę-uzyskać-zaszyfrowany-ened-to-end-czat-z-kontaktem-delta-chat-który-czasami-korzysta-z-poczty-internetowej-lub-innej-aplikacji-e-mail-bez-autocrypt">
Jak mogę uzyskać zaszyfrowany ened-to-end czat z kontaktem Delta Chat, który czasami korzysta z poczty internetowej lub innej aplikacji e-mail bez Autocrypt? <a href="#jak-mogę-uzyskać-zaszyfrowany-ened-to-end-czat-z-kontaktem-delta-chat-który-czasami-korzysta-z-poczty-internetowej-lub-innej-aplikacji-e-mail-bez-autocrypt" class="anchor"></a>
</h3>
<p>Jeśli potrzebujesz bezpiecznie, kompleksowo zaszyfrowanego czatu z kontaktem, który korzysta ze swojego konta zarówno w Delta Chat, jak i w aplikacjach bez Autocrypt (np. poczta internetowa), najlepiej skonfigurować z nim gwarantowane szyfrowanie typu end-to-end, a następnie utworzyć <a href="#howtoe2ee">gwarantowany zaszyfrowany end-to-end</a> czat grupowy z wami dwoma jako członkami. W tym czacie grupowym wszystkie wiadomości będą w pełni szyfrowane, nawet jeśli bezpośredni czat między wami zawiera ostrzeżenie <a href="#nocryptanymore">„…wysłano wiadomość z innego urządzenia”</a>.</p>
<h3 id="jak-mogę-zapewnić-kompleksowe-szyfrowanie-i-usuwanie-wiadomości">
Jak mogę zapewnić kompleksowe szyfrowanie i usuwanie wiadomości? <a href="#jak-mogę-zapewnić-kompleksowe-szyfrowanie-i-usuwanie-wiadomości" class="anchor"></a>
</h3>
<p>Najlepszym sposobem, aby mieć pewność, że każda wiadomość jest kompleksowo zaszyfrowana, a metadane usunięte tak szybko, jak to możliwe, jest <a href="#howtoe2ee">korzystanie z czatów z gwarantowanym szyfrowaniem end-to-end</a> i włączonymi <a href="#ephemeralmsgs">znikającymi wiadomościami</a>.</p>
<p>Gwarantowane szyfrowane metodą end-to-end czaty chronią przed atakami <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">MITM attacks</a>, a włączenie znikających wiadomości powoduje usunięcie wiadomości z serwera po upływie czasu skonfigurowanego przez użytkownika.</p>
<p>Jeśli nie potrzebujesz dłuższej kopii wiadomości na serwerze, możesz także włączyć opcję <a href="#delold">„automatycznie usuń wiadomości z serwera”</a>.</p>
<p>Nawet jeśli <a href="https://chatmail.at/relays">przekaźniki chatmail</a> nie proszą o żadne prywatne dane (w tym numery telefonów), warto chronić metadane relacji między adresami. Nie przewidujemy poważniejszych problemów w korzystaniu z losowych, jednorazowych adresów e-mail do wysyłania wiadomości w tajemnicy, ale wdrożenie tej funkcji nie zostało jeszcze uznane za priorytetowe.</p>
<h3 id="pfs">
@@ -806,23 +814,33 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Nie, Delta Chat nie obsługuje funkcji Perfect Forward Secrecy (PFS). Oznacza to, że jeśli twój prywatny klucz deszyfrujący Delta Chat wycieknie i ktoś zdobędzie twoje wcześniejsze wiadomości w trakcie przesyłania, będzie mógł je odszyfrować i odczytać przy użyciu ujawnionego klucza deszyfrowania.</p>
<p>Nie, jeszcze nie.</p>
<p>Należy jednak pamiętać, że jeśli ktoś zdobędzie twoje klucze deszyfrujące, zazwyczaj będzie mógł również uzyskać twoje wiadomości, niezależnie od tego, czy obowiązuje zasada Perfect Forward Secrecy, czy nie. Typową sytuacją w świecie rzeczywistym w przypadku wycieku kluczy deszyfrujących jest przejęcie urządzenia, które omawiamy w naszej odpowiedzi na temat <a href="#device-seizure">przejęcia metadanych i urządzenia</a>.</p>
<p>Delta Chat obecnie nie obsługuje mechanizmu Perfect Forward Secrecy (PFS). Oznacza to, że jeśli twój prywatny klucz deszyfrujący zostanie ujawniony, a ktoś zdobędzie twoje wcześniejsze wiadomości w trakcie transmisji, będzie mógł je odszyfrować i odczytać za pomocą ujawnionego klucza deszyfrującego. Należy pamiętać, że mechanizm Forward Secrecy zwiększa bezpieczeństwo tylko w przypadku usuwania wiadomości. W przeciwnym razie osoba, która uzyska twoje klucze deszyfrujące, zazwyczaj będzie mogła uzyskać dostęp do wszystkich nieusuniętych wiadomości i nie będzie musiała odszyfrowywać żadnych wcześniej zebranych wiadomości.</p>
<p>Możliwe, że Delta Chat ewoluuje, aby wspierać Perfect Forward Secrecy, ponieważ OpenPGP to tylko kontener na zaszyfrowane wiadomości, ale zarządzanie kluczami szyfrowania (a tym samym rotacja kluczy lub „zapadanie kluczy”) mogłoby być zorganizowane w elastyczny sposób. Zobacz <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">prototyp PFS firmy Seqouia</a>, aby zapoznać się z istniejącymi eksperymentami w społeczności implementatorów OpenPGP.</p>
<p>Opracowaliśmy metodę Forward Secrecy, która przeszła wstępną analizę niektórych kryptografów i ekspertów ds. wdrożeń, ale oczekuje na bardziej formalne opracowanie, które potwierdzi jej niezawodne działanie w federacyjnym przesyłaniu wiadomości i w przypadku korzystania z wielu urządzeń, zanim zostanie zaimplementowana w <a href="https://github.com/chatmail/core">rdzeniu chatmail</a>, co uczyniłoby ją dostępną we wszystkich <a href="https://chatmail.at/clients">klientach chatmail</a>.</p>
<h3 id="czy-szyfrowanie-end-to-end-delta-chat-jest-tak-samo-bezpieczne-jak-signal">
<h3 id="pqc">
Czy szyfrowanie end-to-end Delta Chat jest tak samo bezpieczne jak Signal? <a href="#czy-szyfrowanie-end-to-end-delta-chat-jest-tak-samo-bezpieczne-jak-signal" class="anchor"></a>
Czy Delta Chat obsługuje kryptografię postkwantową? <a href="#pqc" class="anchor"></a>
</h3>
<p>To zależy od tego, co jest dla ciebie ważne. Delta Chat <a href="#pfs">nie obsługuje PFS</a> tak jak Signal, ale zapewnia <a href="#e2eeguarantee">gwarantowane szyfrowane end-to-end czatów</a>, które jest zabezpieczeniem przed zaatakowanymi serwerami lub uszkodzonymi sieciami. Signal i większość innych komunikatorów obsługujących PFS nie zapewniają praktycznego schematu ochrony czatów grupowych przed atakami sieciowymi, które są prawdopodobnie bardziej niepokojące niż potencjalny atakujący, który przejmuje twój telefon i prywatne ustawienia szyfrowania i w ten sposób nie twoje wiadomości i mimo to ma pełny zapis wszystkich poprzednio zaszyfrowanych wiadomości.</p>
<p>Nie, jeszcze nie.</p>
<p>W każdym razie szyfrowanie end-to-end Delta Chat wykorzystuje <a href="#openpgp-secure">bezpieczny podzbiór OpenPGP</a>, który został poddany <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">niezależnemu audytowi bezpieczeństwa</a>.</p>
<p>Delta Chat korzysta z biblioteki Rust OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a>, która obsługuje najnowszy <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">projekt OpenPGP IETF Post-Quantum-Cryptography</a>. Planujemy dodać obsługę PQC do <a href="https://github.com/chatmail/core">rdzenia chatmail</a> po sfinalizowaniu projektu w IETF we współpracy z innymi implementatorami OpenPGP.</p>
<h3 id="jak-mogę-ręcznie-sprawdzić-informacje-o-szyfrowaniu">
Jak mogę ręcznie sprawdzić informacje o szyfrowaniu? <a href="#jak-mogę-ręcznie-sprawdzić-informacje-o-szyfrowaniu" class="anchor"></a>
</h3>
<p>Możesz sprawdzić stan szyfrowania end-to-end ręcznie w oknie dialogowym „Szyfrowanie” (profil użytkownika w systemie Android/iOS lub kliknij prawym przyciskiem myszy element listy czatu użytkownika na komputerze). Delta Chat pokazuje tam dwa odciski palców. Jeśli te same odciski palców pojawią się u ciebie i urządzeniu twojego kontaktu, połączenie jest bezpieczne.</p>
<h3 id="importkey">
@@ -832,33 +850,11 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Tak.
The best way is to send an Autocrypt Setup Message from the other e-mail client.
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
<p>Nie.</p>
<p>Alternatywnie możesz zaimportować klucz ręcznie w „Ustawienia » Zaawansowane » Importuj tajne klucze”. Uwaga: Upewnij się, że klucz nie jest chroniony hasłem lub wcześniej usuń hasło.</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>Jeśli nie masz klucza lub nawet nie wiesz, że go potrzebujesz nie przejmuj się: Delta Chat generuje go w razie potrzeby, nie trzeba naciskać przycisku, aby to zrobić.</p>
<h3 id="nie-mogę-zaimportować-istniejącego-klucza-pgp-do-delta-chat">
Nie mogę zaimportować istniejącego klucza PGP do Delta Chat. <a href="#nie-mogę-zaimportować-istniejącego-klucza-pgp-do-delta-chat" class="anchor"></a>
</h3>
<p>Jest wielce prawdopodobne, że problemem jest klucz, który jest zaszyfrowany i/lub używa hasła. Takie klucze nie są obsługiwane przez Delta Chat. Usuń szyfrowanie i hasło i spróbować ponownie zaimportować klucz.</p>
<p>Innym częstym błędem jest nieprawidłowe zakończenie pliku.
Użyj opancerzonego formatu ASCII i końcówki pliku <code class="language-plaintext highlighter-rouge">.asc</code>.</p>
<p>Rozsądny format, Delta Chat obsługuje popularne formaty kluczy prywatnych OpenPGP, jednak jest mało prawdopodobne, że będziemy obsługiwać 100% wszystkich kluczy prywatnych z dowolnych źródeł. To również nie jest głównym celem Delta Chat (w rzeczywistości, znaczna większość użytkowników Delta Chat nie będzie miała żadnego klucza przed rozpoczęciem korzystania z Delta). Jednak staramy się wspierać klucze prywatne z innych źródeł tak dobrze jak to tylko możliwe.</p>
<p>Usunięcie hasła z klucza prywatnego będzie się różnić w zależności od
oprogramowania używanego do zarządzania kluczami PGP. Za pomocą programu Enigmail można ustawić
hasło na pustą wartość w oknie zarządzania kluczami. Z GnuPG możesz ustawić je <a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">z linii poleceń</a>.
W przypadku innych programów można znaleźć rozwiązanie online.</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>
<h3 id="security-audits">
@@ -915,7 +911,7 @@ od najnowszych do najstarszych:</p>
</h3>
<p>Tak. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
<p>Tak. You can use the same profile on different devices:</p>
<ul>
<li>
@@ -965,6 +961,9 @@ od najnowszych do najstarszych:</p>
<li>
<p><strong>Sieci dla gości</strong> mogą nie pozwalać urządzeniom na komunikację między sobą. Jeśli to możliwe, korzystaj z sieci innej niż gość.</p>
</li>
<li>
<p>Jeśli nadal masz problemy z korzystaniem z tej samej sieci, spróbuj otworzyć <strong>Hotspot</strong> na jednym urządzeniu i połączyć się z tą siecią Wi-Fi z drugiego urządzenia</p>
</li>
<li>
<p>Upewnij się, że na urządzeniu docelowym jest <strong>wystarczająca ilość miejsca</strong></p>
</li>
@@ -999,6 +998,20 @@ od najnowszych do najstarszych:</p>
<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>
<h3 id="czy-usuwanie-przypinanie-archiwizowanie-zapisywanie-wyciszanie-itp-jest-synchronizowane-ze-wszystkimi-urządzeniami">
Czy usuwanie, przypinanie, archiwizowanie, zapisywanie, wyciszanie itp. jest synchronizowane ze wszystkimi urządzeniami? <a href="#czy-usuwanie-przypinanie-archiwizowanie-zapisywanie-wyciszanie-itp-jest-synchronizowane-ze-wszystkimi-urządzeniami" class="anchor"></a>
</h3>
<p>Tak.</p>
<p>Jeśli np. usuniesz czat lub wiadomość z telefonu, zostaną one usunięte z aplikacji na komputer, gdy tylko ponownie będą online.</p>
<p>Wyjątkiem jest <a href="#delold">usuwanie starych wiadomości z urządzenia</a>, ponieważ różne urządzenia mogą mieć różne pojemności pamięci i ustawienia specyficzne dla systemu, takie jak dźwięki powiadomień.</p>
<h3 id="czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">
@@ -1035,7 +1048,7 @@ od najnowszych do najstarszych:</p>
<li>Aplikacje webxdc nie mogą wysyłać danych do Internetu ani niczego pobierać.</li>
<li>Aplikacja webxdc może wymieniać dane wyłącznie w ramach czatu Delta Chat, a ich kopie znajdują się na urządzeniach twoich partnerów czatu. Poza tym jest całkowicie odizolowana od Internetu.</li>
<li>Prywatność, jaką oferuje aplikacja webxdc, to prywatność twojego czatu jeśli ufasz osobom, z którymi rozmawiasz, możesz ufać także aplikacji webxdc.</li>
<li>Oznacza to również: otwieranie aplikacji webxdc na czatach, w przypadku których nie ufa się członkom, może stanowić ryzyko dla prywatności tak jak załączniki do wiadomości e-mail, gdzie otwiera się tylko załączniki od nadawców, którym ufasz, a nie od spamerów.</li>
<li>Oznacza to również: otwieranie aplikacji w czatach z niezaufanymi członkami, co może stanowić ryzyko dla prywatności. Podobnie jak w przypadku załączników do wiadomości e-mail, połączeń wideo lub zwykłych linków: otwieraj je tylko od nadawców, którym ufasz, a nie od spamerów. Spamerzy mogą poznać wszelkie dane, które im wysyłasz, a także twój adres IP.</li>
</ul>
<h3 id="gdzie-mogę-zdobyć-aplikacje-webxdc">
@@ -1102,13 +1115,8 @@ od najnowszych do najstarszych:</p>
</h3>
<ul>
<li>Dzięki liście rozgłoszeniowej możesz wysłać wiadomość do wielu odbiorców jednocześnie; kiedy ci odpowiedzą, otrzymasz odpowiedź w bezpośrednim czacie 1: 1 z nimi. Odbiorcy nie widzą siebie nawzajem.</li>
<li>Technicznie, jest to e-mail z wieloma odbiorcami w „ukrytej kopii”.</li>
<li>Możesz włączyć tę funkcję w sekcji „Funkcje eksperymentalne” w ustawieniach zaawansowanych. Następnie możesz utworzyć listę rozgłoszeniową z okna dialogowego „Nowy czat”.</li>
<li>Jeśli używasz więcej niż jednego urządzenia, listy rozgłoszeniowe nie są obecnie synchronizowane między nimi.</li>
<li>Wiadomości wysyłane do list rozgłoszeniowych nie są szyfrowane. Szyfrowanie złamałoby anonimowość, ponieważ wtedy wszyscy odbiorcy wiedzieliby, kto jeszcze je otrzymał (wysyłanie indywidualnych wiadomości do wszystkich byłoby gorsze z powodu limitu prędkości i zużycia sieci).</li>
</ul>
<p>Za pomocą listy rozgłoszeniowej możesz wysłać wiadomość do wielu odbiorców naraz; odbiorcy nie mogą odpowiedzieć na tej liście.
Listy rozgłoszeniowe są nadal wysoce eksperymentalne i bardzo prawdopodobne, że zostaną zastąpione czymś innym, bądźcie czujni :)</p>
<h3 id="jak-mogę-udostępnić-swoją-lokalizację-moim-rozmówcom">
@@ -1154,6 +1162,10 @@ od najnowszych do najstarszych:</p>
</h3>
<p>Uwaga: Zmiana adresów e-mail jest tymczasowo wyłączona
z powodu trwających zmian w rdzeniu DeltaChat.
Powinna być ponownie dostępna za kilka miesięcy.</p>
<ol>
<li>
<p>Zmień swój adres w „Ustawienia → Zaawansowane → Hasło i konto” i wprowadź hasło do swojego nowego konta (i jeśli to konieczne, ustawienia serwera). Otrzymasz informację o przeniesieniu na nowy adres. Dodatkowe powiadomienie pojawi się również na czacie „Komunikaty urządzenia”.</p>
@@ -1227,17 +1239,40 @@ Oto, co robi Delta Chat z tymi uprawnieniami:</p>
Jednak niektórzy dostawcy potrzebują specjalnych opcji, aby działać poprawnie, zobacz <a href="https://providers.delta.chat">Przegląd dostawców</a></li>
</ul>
<h3 id="chcę-zarządzać-własnym-serwerem-e-mail-dla-delta-chat-co-polecacie">
<h3 id="can-i-use-delta-chat-in-parallel-with-other-e-mail-apps">
Chcę zarządzać własnym serwerem e-mail dla Delta Chat. Co polecacie? <a href="#chcę-zarządzać-własnym-serwerem-e-mail-dla-delta-chat-co-polecacie" class="anchor"></a>
Can I use Delta Chat in parallel with other E-Mail apps? <a href="#can-i-use-delta-chat-in-parallel-with-other-e-mail-apps" class="anchor"></a>
</h3>
<p>Yes, but it is not recommended.</p>
<p>Parallel usage with the same E-Mail address might lead to the following inconveniences:</p>
<ul>
<li>Next to your Delta Chat notifications,
you might also get notifications for (encrypted, so unreadable) chat mail messages
in your other email app</li>
<li>If Delta Chat is not running
or “Advanced &gt; Move automatically to the DeltaChat Folder” is disabled,
encrypted Delta Chat messages might clutter the Inbox in your other E-Mail apps.</li>
</ul>
<p><a href="https://support.delta.chat/t/sieve-rule-to-move-deltachat-mails-to-deltachat-folder/288/10">Sieve rules</a> can solve these problems.</p>
<h3 id="chcę-zarządzać-własnym-serwerem-dla-delta-chat-co-polecacie">
Chcę zarządzać własnym serwerem dla Delta Chat. Co polecacie? <a href="#chcę-zarządzać-własnym-serwerem-dla-delta-chat-co-polecacie" class="anchor"></a>
</h3>
<ul>
<li>Większość serwerów pocztowych będzie działać dobrze. Ale to, co osobiście polecamy, to połączenie mailcow i mailadm, jak opisano <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">w tym poście na blogu</a>.</li>
<li>Instrukcję instalacji można znaleźć <a href="https://delta.chat/pl/serverguide">na naszej stronie internetowej</a>.</li>
<li>Większość serwerów pocztowych będzie działać dobrze. Ale my osobiście polecamy serwer przekaźnikowy chatmail, jak opisano <a href="https://delta.chat/en/2023-12-13-chatmail">w tym wpisie na blogu</a>.</li>
<li>Możesz znaleźć <a href="https://github.com/chatmail/relay">przewodnik instalacji na GitHub</a>.</li>
</ul>
<h3 id="dlaczego-muszę-wpisać-moje-hasło-e-mail-do-delta-chat-czy-to-jest-bezpieczne">
@@ -1250,7 +1285,7 @@ Jednak niektórzy dostawcy potrzebują specjalnych opcji, aby działać poprawni
<p>Podobnie jak w przypadku innych programów pocztowych, takich jak Thunderbird, K9-Mail lub Outlook, program potrzebuje hasła, aby można było go używać do wysyłania i odbierania e-maili. Oczywiście hasło jest przechowywane tylko na Twoim urządzeniu. Hasło jest przesyłane tylko do Twojego dostawcy poczty e-mail (po zalogowaniu), który i tak ma dostęp do Twojej poczty</p>
<p>Ponieważ Delta Chat jest Open Source, możesz sprawdzić <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">Kod źródłowy</a>
<p>Ponieważ Delta Chat jest Open Source, możesz sprawdzić <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">Kod źródłowy</a>
jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny sposób. Cieszymy się z opinii, które sprawiają, że aplikacja jest bezpieczniejsza dla wszystkich naszych użytkowników.</p>
<h3 id="jakie-wiadomości-pojawiają-się-w-delta-chat">
@@ -1329,17 +1364,17 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
<p>Niektórzy używają Delta Chat jako zwykłego klienta poczty e-mail i chcą używać folderu Skrzynka odbiorcza dla swojej poczty zamiast folderu DeltaChat. Jeśli wyłączysz opcję „Oglądaj folder DeltaChat”, powinieneś również wyłączyć opcję „Automatyczne przenoszenie do folderu DeltaChat”. W przeciwnym razie usuwanie wiadomości lub konfiguracja wielu urządzeń może nie działać poprawnie.</p>
<h3 id="czy-delta-chat-jest-kompatybilny-z-protonmail--tutanota--criptext">
<h3 id="czy-delta-chat-jest-kompatybilny-z-proton-mail--tutanota--criptext">
Czy Delta Chat jest kompatybilny z Protonmail / Tutanota / Criptext? <a href="#czy-delta-chat-jest-kompatybilny-z-protonmail--tutanota--criptext" class="anchor"></a>
Czy Delta Chat jest kompatybilny z Proton Mail / Tutanota / Criptext? <a href="#czy-delta-chat-jest-kompatybilny-z-proton-mail--tutanota--criptext" class="anchor"></a>
</h3>
<ul>
<li>I tak i nie.</li>
<li>Nie, nie możesz używać swojego konta Protonmail, Tutanota lub Criptext z Delta Chat; nie oferują one odbierania poczty przez IMAP.</li>
<li>Nie, nie możesz używać swojego konta Proton Mail, Tutanota lub Criptext z Delta Chat; nie oferują one odbierania poczty przez IMAP.</li>
<li>W każdym przypadku możesz użyć Delta Chat do wysyłania wiadomości do osób, które używają Protonmail, Tutanota lub Criptext. Te wiadomości nie będą jednak szyfrowane metodą end-to-end. Szyfrowanie typu end-to-end, które oferują ci dostawcy, nie jest kompatybilne z <a href="https://autocrypt.org/">Autocrypt</a> stosowanym standardowo w Delta Chat.</li>
<li>Delta Chat może zaszyfrować metodą end-to-end za pośrednictwem dowolnego dostawcy poczty e-mail z dowolną <a href="https://autocrypt.org/dev-status.html">aplikacją e-mail z włączoną funkcją Autocrypt</a>.</li>
</ul>
@@ -1371,7 +1406,7 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
</h3>
<ul>
<li>Zobacz <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">Standardy używane w Delta Chat</a>.</li>
<li>Zobacz <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standardy używane w Delta Chat</a>.</li>
</ul>
<h3 id="gdzie-moi-znajomi-mogą-znaleźć-delta-chat">
@@ -1456,4 +1491,4 @@ Fundusze te wspierają nasze długofalowe cele, aby uczynić Delta Chat bardziej
</body></html>
</body></html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+256 -218
View File
@@ -10,7 +10,9 @@
<li><a href="#хто-бачить-моє-зображення-профілю">Хто бачить моє зображення профілю?</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>
<li><a href="#edit">Виправлення помилок та видалення повідомлень після надсилання</a></li>
<li><a href="#ephemeralmsgs">Як працюють повідомлення, що зникають?</a></li>
</ul>
</li>
@@ -34,29 +36,25 @@
<li><a href="#чому-delta-chat-інтегрується-з-централізованими-пропрієтарними-push-сервісами-applegoogle">Чому Delta Chat інтегрується з централізованими пропрієтарними push-сервісами Apple/Google?</a></li>
</ul>
</li>
<li><a href="#шифрування-та-безпека">Шифрування та безпека</a>
<li><a href="#e2ee">Шифрування та безпека</a>
<ul>
<li><a href="#які-стандарти-використовуються-для-наскрізного-шифрування">Які стандарти використовуються для наскрізного шифрування?</a></li>
<li><a href="#whene2e">Як дізнатися, чи повідомлення зашифровано наскрізним шифруванням?</a></li>
<li><a href="#howtoe2ee">Як отримати гарантоване наскрізне шифрування та зелені галочки?</a></li>
<li><a href="#e2eeguarantee">Що означає зелена галочка і “гарантоване наскрізне шифрування”?</a></li>
<li><a href="#nocryptanymore">Контакт “надіслав повідомлення з іншого пристрою”, що робити?</a></li>
<li><a href="#чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування">Чи можу я отримувати та надсилати пошту без наскрізного шифрування?</a></li>
<li><a href="#howtoe2ee">Як створити чат з новим контактом?</a></li>
<li><a href="#e2eeguarantee">Що означає зелена галочка в профілі контакту?</a></li>
<li><a href="#чи-зашифровані-наскрізно-вкладення-зображення-файли-аудіо-тощо">Чи зашифровані наскрізно вкладення (зображення, файли, аудіо тощо)?</a></li>
<li><a href="#openpgp-secure">Чи безпечний OpenPGP?</a></li>
<li><a href="#openpgp-alternatives">Чи розглядали ви можливість використання альтернатив OpenPGP для наскрізного шифрування?</a></li>
<li><a href="#чи-вразливий-delta-chat-до-efail">Чи вразливий Delta Chat до EFAIL?</a></li>
<li><a href="#tls">Чи буде показано повідомлення відкритим текстом, якщо наскрізне шифрування недоступне?</a></li>
<li><a href="#чи-повідомлення-позначені-значком-пошти-доступні-в-інтернетіtls">Чи повідомлення, позначені значком пошти, доступні в Інтернеті?{#tls}</a></li>
<li><a href="#message-metadata">Як Delta Chat захищає метадані у повідомленнях?</a></li>
<li><a href="#device-seizure">Як захистити метадані та контакти якщо пристрій вилучено?</a></li>
<li><a href="#як-перевірити-інформацію-про-шифрування">Як перевірити інформацію про шифрування?</a></li>
<li><a href="#як-перевірити-стан-шифрування-повідомлень">Як перевірити стан шифрування повідомлень?</a></li>
<li><a href="#чому-я-бачу-незашифровані-повідомлення">Чому я бачу незашифровані повідомлення?</a></li>
<li><a href="#як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt">Як я можу отримати наскрізно зашифрований чат з контактом Delta Chat, який іноді користується веб-поштою або іншим додатком електронної пошти, що не підтримує Autocrypt?</a></li>
<li><a href="#як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень">Як забезпечити наскрізне шифрування та видалення повідомлень?</a></li>
<li><a href="#sealedsender">Чи підтримує Delta Chat функцію “Запечатаний відправник”?</a></li>
<li><a href="#pfs">Чи підтримує Delta Chat цілковиту пряму секретність (Perfect Forward Secrecy)?</a></li>
<li><a href="#чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal">Чи є наскрізне шифрування Delta Chat таким же безпечним, як Signal?</a></li>
<li><a href="#pqc">Чи підтримує Delta Chat пост-квантову криптографію?</a></li>
<li><a href="#як-я-можу-вручну-перевірити-інформацію-про-шифрування">Як я можу вручну перевірити інформацію про шифрування?</a></li>
<li><a href="#importkey">Чи можна повторно використовувати існуючий закритий ключ?</a></li>
<li><a href="#я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat">Я не можу імпортувати свій існуючий PGP ключ у Delta Chat.</a></li>
<li><a href="#security-audits">Чи проходив Delta Chat незалежний аудит на наявність вразливостей у безпеці?</a></li>
</ul>
</li>
@@ -65,6 +63,7 @@
<li><a href="#чи-можна-використовувати-delta-chat-на-декількох-пристроях-одночасно">Чи можна використовувати Delta Chat на декількох пристроях одночасно?</a></li>
<li><a href="#вирішення-проблем">Вирішення проблем</a></li>
<li><a href="#backup">Ручне перенесення</a></li>
<li><a href="#чи-синхронізовані-видалення-закріплення-архівування-збереження-вимкнення-сповіщень-тощо-з-усіма-пристроями">Чи синхронізовані видалення, закріплення, архівування, збереження, вимкнення сповіщень тощо з усіма пристроями?</a></li>
<li><a href="#чи-планується-впровадження-веб-клієнта-delta-chat">Чи планується впровадження веб-клієнта Delta Chat?</a></li>
</ul>
</li>
@@ -81,14 +80,15 @@
<li><a href="#що-таке-списки-широкомовлення-та-як-ними-користуватися">Що таке списки широкомовлення та як ними користуватися?</a></li>
<li><a href="#як-я-можу-поділитися-своїм-місцезнаходженням-зі-своїми-співрозмовниками-в-чаті">Як я можу поділитися своїм місцезнаходженням зі своїми співрозмовниками в чаті?</a></li>
<li><a href="#чому-я-можу-вибрати-лише-стеження-за-папкою-deltachat">Чому я можу вибрати лише стеження за папкою DeltaChat?</a></li>
<li><a href="#як-я-можу-змінити-мій-обліковий-запис-на-іншу-адресу-електронної-пошти">Як я можу змінити мій обліковий запис на іншу адресу електронної пошти?</a></li>
<li><a href="#як-я-можу-використовувати-іншу-адресу-електронної-пошти-у-своєму-профілі">Як я можу використовувати іншу адресу електронної пошти у своєму профілі?</a></li>
</ul>
</li>
<li><a href="#інше">Інше</a>
<ul>
<li><a href="#яких-дозволів-потребує-delta-chat">Яких дозволів потребує Delta Chat?</a></li>
<li><a href="#чи-підтримує-delta-chat-роботу-з-моїм-провайдером-електронної-пошти">Чи підтримує Delta Chat роботу з <em>моїм</em> провайдером електронної пошти?</a></li>
<li><a href="#я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите">Я хочу керувати власним сервером електронної пошти для Delta Chat. Що ви порадите?</a></li>
<li><a href="#can-i-use-delta-chat-in-parallel-with-other-e-mail-apps">Can I use Delta Chat in parallel with other E-Mail apps?</a></li>
<li><a href="#я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте">Я хочу керувати власним сервером для Delta Chat. Що ви порекомендуєте?</a></li>
<li><a href="#чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-delta-chat-чи-це-безпечно">Чому я маю вводити пароль до моєї електронної пошти у Delta Chat? Чи це безпечно?</a></li>
<li><a href="#які-повідомлення-відображаються-у-delta-chat">Які повідомлення відображаються у Delta Chat?</a></li>
<li><a href="#чи-підтримує-delta-chat-html-листи">Чи підтримує Delta Chat HTML-листи?</a></li>
@@ -96,7 +96,7 @@
<li><a href="#для-чого-потрібне-налаштування-відправити-копію-собі">Для чого потрібне налаштування “Відправити копію собі”?</a></li>
<li><a href="#чому-я-можу-обрати-стеження-за--папкою-надіслані">Чому я можу обрати стеження за папкою “Надіслані”?</a></li>
<li><a href="#чому-я-можу-відмовитись-від-стеження-за--папкою-deltachat">Чому я можу відмовитись від стеження за папкою DeltaChat?</a></li>
<li><a href="#чи-сумісний-delta-chat-із-protonmail--tutanota--criptext">Чи сумісний Delta Chat із Protonmail / Tutanota / Criptext?</a></li>
<li><a href="#чи-сумісний-delta-chat-із-proton-mail--tutanota--criptext">Чи сумісний Delta Chat із Proton Mail / Tutanota / Criptext?</a></li>
<li><a href="#remove-account">Як мені видалити свій обліковий запис?</a></li>
<li><a href="#мене-цікавлять-технічні-деталі-можете-розповісти-більше">Мене цікавлять технічні деталі. Можете розповісти більше?</a></li>
<li><a href="#де-мої-друзі-можуть-знайти-delta-chat">Де мої друзі можуть знайти Delta Chat?</a></li>
@@ -117,7 +117,7 @@
<p>Delta Chat - це надійний, децентралізований та безпечний додаток для обміну повідомленнями, доступний для мобільних і десктопних платформ.</p>
<p>Delta Chat схожий на Whatsapp або Telegram, але ви також можете використовувати його як додаток електронної пошти. Ви можете анонімно зареєструватися на різних <a href="https://delta.chat/chatmail">сумісних chatmail-серверах</a> які є мінімальними поштовими серверами, оптимізованими для швидкої та безпечної роботи. Або ви можете використовувати класичні поштові сервери та існуючий обліковий запис електронної пошти в цьому випадку Delta Chat буде працювати як поштовий додаток.</p>
<p>Delta Chat схожий на Whatsapp або Telegram, але ви також можете використовувати його як додаток електронної пошти. Ви можете анонімно зареєструватися на різних <a href="https://delta.chat/chatmail">сумісних chatmail-серверах</a> які є мінімальними поштовими серверами, оптимізованими для швидкої та безпечної роботи. Або ви можете використовувати класичні поштові сервери та існуючий профіль електронної пошти в цьому випадку Delta Chat буде працювати як поштовий додаток.</p>
<p><img style="float:right; width:50%; max-width:360%; margin:1em;" src="../delta-what-optim.png" /></p>
@@ -155,7 +155,7 @@
<p><a href="#security-audits">Аудитоване наскрізне шифрування</a> захищене від мережевих та серверних атак.</p>
</li>
<li>
<p>Вільне програмне забезпечення з відкритим вихідним кодом, як для додатків, так і для сервера. Побудовано на основі <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md">Стандартів електронної пошти та інтернету</a>, <a href="https://xkcd.com/927/">щоб уникнути “синдрому ще одного стандарту (xkcd 927)”</a></p>
<p>Вільне програмне забезпечення з відкритим вихідним кодом, як для додатків, так і для сервера. Побудовано на основі <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандартів електронної пошти та інтернету</a>, <a href="https://xkcd.com/927/">щоб уникнути “синдрому ще одного стандарту (xkcd 927)”</a></p>
</li>
</ul>
@@ -167,10 +167,18 @@
</h3>
<p>Якщо повідомлення приходить від невідомого контакту, воно відображається як <strong>запит</strong>.</p>
<ul>
<li>Якщо повідомлення приходить від невідомого контакту, воно відображається як <strong>запит</strong>. ви потрібно прийняти запит, перш ніж ви зможете відповісти.</li>
<li>Ви також можете “видалити” його, якщо ви не хочете зараз спілкуватися з ними. Це <em>не</em> видаляє повідомлення на сервері, лише на вашому пристрої. Отже, ви можете як і раніше обробляти повідомлення в іншій поштовій програмі.</li>
<li>Якщо ви видалите запит, майбутні повідомлення від цього контакту все одно відображатимуться як запит на повідомлення, щоб ви могли змінити свою думку. Якщо дуже не хочеться отримувати повідомлення від цієї особи, подумайте про її <em>блокування</em>.</li>
<li>
<p>ви потрібно прийняти запит, перш ніж ви зможете відповісти.</p>
</li>
<li>
<p>Ви також можете “видалити” його, якщо ви не хочете зараз спілкуватися з ними.</p>
</li>
<li>
<p>Якщо ви видалите запит, майбутні повідомлення від цього контакту все одно відображатимуться як запит на повідомлення, щоб ви могли змінити свою думку. Якщо дуже не хочеться отримувати повідомлення від цієї особи, подумайте про її <em>блокування</em>.</p>
</li>
</ul>
<h3 id="чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">
@@ -270,6 +278,36 @@
<p>Щоб скористатися функціями, утримуйте натиснутою клавішу або клацніть правою кнопкою миші на чаті у списку чатів.</p>
<h3 id="save">
Як працюють “Збережені повідомлення”? <a href="#save" class="anchor"></a>
</h3>
<p><strong>Збережені повідомлення</strong> - це чат, за допомогою якого ви можете легко запам’ятовувати та знаходити повідомлення.</p>
<ul>
<li>
<p>У будь-якому чаті натисніть і утримуйте повідомлення або клацніть правою кнопкою миші та виберіть <strong>Зберегти</strong>.</p>
</li>
<li>
<p>Збережені повідомлення позначені символом <img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" /> поруч з міткою часу</p>
</li>
<li>
<p>Пізніше відкрийте чат “Збережені повідомлення” - і ви побачите там збережені повідомлення. Натиснувши <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />, ви можете повернутися до початкового повідомлення в оригінальному чаті</p>
</li>
<li>
<p>Нарешті, ви також можете використовувати “Зберегти повідомлення”, щоб робити <strong>особисті нотатки</strong> - відкрити чат, набрати щось, додати фотографію або голосове повідомлення тощо.</p>
</li>
<li>
<p>Оскільки “Збережені повідомлення” синхронізуються, вони можуть стати дуже зручними для передачі даних між пристроями</p>
</li>
</ul>
<p>Повідомлення залишаються збереженими, навіть якщо вони були відредаговані або видалені - чи то через <a href="#edit">відправника</a>, чи то через <a href="#delold">очищення пристрою</a>, чи то через <a href="#ephemeralmsgs">зникнення повідомлень інших чатів</a>.</p>
<h3 id="що-означає-зелена-точка">
@@ -278,16 +316,40 @@
</h3>
<p>Іноді ви можете бачити <strong>зелену крапку</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" /> поруч з аватаркою контакту. Це означає, що його <strong>недавно бачили</strong> протягом останніх 10 хвилин:</p>
<ul>
<li>Починаючи з Delta Chat 1.34, ви іноді можете бачити “зелену крапку” поруч із аватаром контакту. Це означає, що контакт «нещодавно бачили».</li>
<li>Детально: це означає, що за останні 10 хвилин Delta Chat бачив їх:</li>
<li>або тому, що вони надіслали вам повідомлення безпосередньо,</li>
<li>тому що вони написали щось групі, учасником якої є ви обоє,</li>
<li>тому що вони надіслали вам сповіщення про прочитання повідомлення, яке ви написали,</li>
<li>або тому, що вони надіслали дані до вашої програми Delta Chat за допомогою a <a href="#webxdc">приватна програма</a>.
– Отже, це не онлайн-статус у реальному часі – і якщо хтось не відповідає відразу, навіть якщо вони, здаються, онлайн, не хвилюйтесь і дайте їм трохи простору ;-)
– З іншого боку, інші не завжди «побачать, що ви онлайн». Якщо ви вимкнули сповіщення про прочитання, вони не побачать зелену крапку, доки ви не надішлете їм повідомлення або напишете у групу, до якої вони входять.</li>
<li>або тому, що вони написали вам безпосередньо,</li>
<li>тому що вони написали щось у групі, в якій ви обидва є учасниками,</li>
<li>тому що вони надіслали вам квитанцію про прочитання повідомлення, яке ви написали,</li>
<li>тому що вони відредагували або видалили повідомлення у спільному з вами чаті,</li>
<li>або тому, що вони використовують <a href="#webxdc">app</a> у спільному з вами чаті.</li>
</ul>
<p>Отже, це не онлайн статус в реальному часі - і якщо хтось не відповідає одразу, хоча здається, що вони онлайн, не хвилюйтеся і дайте їм трохи часу :)</p>
<p>З іншого боку, інші не завжди “бачать, що ви онлайн”. Якщо ви вимкнули звіти про прочитання, вони не побачать зелену крапку доки не буде виконано одну з вищезазначених умов.</p>
<h3 id="edit">
Виправлення помилок та видалення повідомлень після надсилання <a href="#edit" class="anchor"></a>
</h3>
<ul>
<li>
<p>Ви можете редагувати текст ваших повідомлень після відправлення. Для цього натисніть на повідомлення довгим натисканням або правою кнопкою миші і виберіть <strong>Редагувати</strong> або <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" />.</p>
</li>
<li>
<p>Якщо ви випадково надіслали повідомлення, в тому ж меню виберіть <strong>Видалити</strong>, а потім <strong>Видалити для всіх</strong>.</p>
</li>
</ul>
<p>Відредаговані повідомлення матимуть позначку “Відредаговано” поруч з міткою часу, видалені повідомлення будуть видалені без позначки в чаті. Сповіщення не надсилаються і відсутнє часове обмеження.</p>
<p>Зауважте, що початкове повідомлення все ще може бути отримане учасниками чату які могли вже відповісти, переслати, зберегти, зробити знімок екрану або іншим чином скопіювати повідомлення.</p>
<h3 id="ephemeralmsgs">
@@ -297,7 +359,11 @@
</h3>
<p>Увімкнути “повідомлення, що зникають” можна в налаштуваннях чату, у верхньому правому куті вікна чату, вибравши проміжок часу від 1 хвилини до 5 тижнів.</p>
<p>You can turn on “disappearing messages”
in the settings of a chat,
at the top right of the chat window,
by selecting a time span
between 5 minutes and 1 year.</p>
<p>Доки налаштування не буде знову вимкнено, додаток Delta Chat кожного учасника чату піклується про видалення повідомлень через вибраний проміжок часу. Проміжок часу починається коли одержувач вперше побачив повідомлення в Delta Chat. Повідомлення видаляються як з кожної поштової скриньки на сервері, так і в самому додатку.</p>
@@ -400,7 +466,7 @@
<p>Щоб увімкнути його, перейдіть до <strong>Видалити старі повідомлення → Видалити повідомлення з сервера</strong> в налаштуваннях «Чати та медіа». Ви можете встановити часові рамки між «Одразу» та «Через 1 рік». Усі електронні листи, отримані Delta Chat, будуть видалені з сервера після закінчення цього терміну.</p>
</li>
<li>
<p>Зауважте, що якщо ви використовуєте Delta Chat на кількох пристроях, вам слід залишити повідомлення на сервері, доки інший пристрій не зможе завантажити їх. У цьому випадку вам слід встановити для автоматичного видалення значення «через день» або щось подібне, залежно від того, як часто ви вмикаєте інший пристрій.</p>
<p>Зверніть увагу, що якщо ви використовуєте Delta Chat на декількох пристроях, вам потрібно залишити повідомлення на сервері з достатнім проміжком часу щоб інші пристрої також могли їх завантажити.</p>
</li>
</ul>
@@ -525,14 +591,14 @@ Push-сповіщення автоматично активуються для
</h3>
<p>Delta Chat - це безкоштовний децентралізований месенджер з відкритим вихідним кодом і вільним вибором сервера, але ми хочемо, щоб користувачі отримували надійну “миттєву доставку” повідомлень, як у додатках Whatsapp, Signal або Telegram, без попередніх запитань, які більше підходять для досвідчених користувачів або розробників.</p>
<p>Delta Chat - це безкоштовний децентралізований месенджер з відкритим вихідним кодом і вільним вибором сервера, але ми хочемо, щоб користувачі отримували надійну “миттєву доставку” повідомлень, як у додатках WhatsApp, Signal або Telegram, без попередніх запитань, які більше підходять для досвідчених користувачів або розробників.</p>
<p>Зверніть увагу, що Delta Chat має <a href="#privacy-notifications">невелику систему push-повідомлень, що зберігає конфіденційність</a> яка забезпечує “миттєву доставку” повідомлень на всі chatmail-сервери включаючи потенційний <a href="https://delta.chat/chatmail#selfhosted">який ви можете налаштувати самостійно без нашого дозволу</a>. Ласкаво просимо до потужності сумісної та масової системи чат-пошти та електронної пошти :)</p>
<h2 id="шифрування-та-безпека">
<h2 id="e2ee">
Шифрування та безпека <a href="#шифрування-та-безпека" class="anchor"></a>
Шифрування та безпека <a href="#e2ee" class="anchor"></a>
</h2>
@@ -545,10 +611,21 @@ Push-сповіщення автоматично активуються для
</h3>
<p><a href="https://autocrypt.org">Autocrypt</a> використовується для автоматичного встановлення наскрізного шифрування з контактами та груповими чатами.
Autocrypt використовує обмежену і <a href="#openpgp-secure">безпечну підмножину стандарту OpenPGP</a>. Зашифровані наскрізним шифруванням повідомлення позначаються замком <img style="vertical-align:middle; width:1.2em; margin:1px" src="../lock-icon.png" alt="padlock" />.</p>
<p>Delta Chat використовує <a href="#openpgp-secure">безпечну підмножину стандарту OpenPGP</a> для забезпечення автоматичного наскрізного шифрування за допомогою цих протоколів:</p>
<p><a href="https://securejoin.delta.chat/en/latest/new.html">Протоколи Secure-Join</a> використовуються для створення чатів з гарантованим наскрізним шифруванням що захищає від мережевих атак і скомпрометованих серверів. Чати, відмічені зеленою галочкою <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> гарантують наскрізне шифрування повідомлень.</p>
<ul>
<li>
<p>Використовуйте <a href="https://securejoin.delta.chat/en/latest/new.html">Secure-Join</a> щоб обмінюватися інформацією про налаштування шифрування, через сканування QR-коду або “посилання-запрошення”.</p>
</li>
<li>
<p><a href="https://autocrypt.org">Autocrypt</a> використовується для автоматичного встановлення наскрізного шифрування між контактами і всіма учасниками групового чату.</p>
</li>
<li>
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Поширення контакту в чаті</a> дозволяє отримувачам використовувати наскрізне шифрування з контактом.</p>
</li>
</ul>
<p>Delta Chat не запитує, не публікує і не взаємодіє з будь-якими серверами ключів OpenPGP.</p>
<h3 id="whene2e">
@@ -558,102 +635,70 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
</h3>
<p>Всі наскрізні зашифровані повідомлення мають навісний замок:</p>
<p><img style="width:160px; margin:1px" src="../lock-screenshot.png" alt="padlock in bubble" /></p>
<p>Наскрізне шифрування гарантується, якщо поруч із заголовком чату стоїть зелена галочка:</p>
<p><img style="width:211px; margin:1px" src="../green-checkmark-screenshot.png" alt="green checkmark in title" /></p>
<p>Всі повідомлення в Delta Chat за замовчуванням <strong>наскрізно зашифровані</strong>. Починаючи з версії 2 Delta Chat (липень 2025 року) на наскрізних зашифрованих повідомленнях більше немає замків або інших подібних маркерів.</p>
<h3 id="howtoe2ee">
<h3 id="чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування">
Як отримати гарантоване наскрізне шифрування та зелені галочки? <a href="#howtoe2ee" class="anchor"></a>
Чи можу я отримувати та надсилати пошту без наскрізного шифрування? <a href="#чи-можу-я-отримувати-та-надсилати-пошту-без-наскрізного-шифрування" class="anchor"></a>
</h3>
<p>Якщо у вас є другий канал зв’язку з вашим партнером по чату, наприклад, відеочат або інший месенджер, ви можете згенерувати посилання-запрошення.</p>
<p>Якщо ви використовуєте стандартні <a href="https://chatmail.at/relays">ретранслятори чату</a>, неможливо отримувати або надсилати повідомлення без наскрізного шифрування.</p>
<p>Якщо ви разом особисто, ви можете показати QR-код своєму співрозмовнику.</p>
<p>If you instead create a profile using a classic e-mail server,
you can send and receive messages with or without end-to-end encryption.
Messages lacking end-to-end encryption are marked with an e-mail icon
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
<h3 id="howtoe2ee">
Як створити чат з новим контактом? <a href="#howtoe2ee" class="anchor"></a>
</h3>
<p>Ви можете надіслати посилання-запрошення через інший приватний чат, показати QR-код запрошення, коли ви знаходитесь поруч один з одним або під час відеодзвінка, або натиснути на “контакт”, яким ви поділилися в чаті.</p>
<ul>
<li>
<p>Для <strong>Запрошення до групи</strong>, торкніться назви групи чату, щоб побачити список її учасників, і виберіть “QR-код запрошення”.</p>
</li>
<li>
<p>Для <strong>прямих запрошень у чат 1:1</strong>, торкніться іконки QR-коду <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> на головному екрані програми Delta Chat.</p>
<p>Для <strong>прямих запрошень у чат один-на-один</strong>, торкніться іконки QR-коду <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> на головному екрані програми Delta Chat.</p>
</li>
</ul>
<p>Дозвольте вашому партнеру по чату відсканувати QR-зображення
у своєму додатку Delta Chat, або натисніть “Копіювати” чи “Поділитися”, щоб створити посилання-запрошення і поділитися ним з вашим співрозмовником.</p>
<p>Попросіть вашого партнера по чату відсканувати QR-зображення у своєму додатку Delta Chat, або натисніть “Копіювати” чи “Поділитися”, щоб створити посилання-запрошення і поділитися ним з вашим партнером по чату.</p>
<p>Тепер зачекайте, поки між обома пристроями <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">відбудеться обмін мережевими повідомленнями Secure-Join</a>.</p>
<p>Тепер зачекайте, поки встановиться <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">наскрізне шифрування</a>.</p>
<ul>
<li>
<p>Якщо обидва пристрої онлайн, обидві сторони зрештою побачать (груповий або прямий) чат із зеленою галочкою <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> поруч із заголовком.</p>
<p>Якщо обидві сторони онлайн, вони незабаром побачать (груповий або прямий) чат і можуть почати безпечно обмінюватися повідомленнями.</p>
</li>
<li>
<p>Якщо один з пристроїв не в мережі, зелені галочки з’являться пізніше, коли пристрій знову буде підключено до Інтернету а мережевий протокол Secure-Join буде завершено.</p>
<p>Якщо одна зі сторін перебуває в офлайні або в поганій мережі, можливість спілкуватися в чаті затримується до відновлення з’єднання.</p>
</li>
</ul>
<p>Вітаємо! Тепер ви автоматично використовуватимете гарантоване наскрізне шифрування з цим контактом, і ви обидва можете додавати один одного в групи, позначені зеленою галочкою <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" />, таким чином автоматично поширюючи гарантоване наскрізне шифрування серед її членів.</p>
<p>Вітаємо!
Тепер ви автоматично використовуватимете наскрізне шифрування з цим контактом. Якщо ви додасте один одного в групи чату, наскрізне шифрування буде встановлено між усіма учасниками.</p>
<h3 id="e2eeguarantee">
Що означає зелена галочка і “гарантоване наскрізне шифрування”? <a href="#e2eeguarantee" class="anchor"></a>
Що означає зелена галочка в профілі контакту? <a href="#e2eeguarantee" class="anchor"></a>
</h3>
<p>Назви чатів із зеленими галочками <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> означають, що всі повідомлення в чаті будуть наскрізно зашифровані і не можуть бути прочитані або змінені скомпрометованими поштовими серверами або інтернет-провайдерами.
Приєднання до групових чатів із зеленими галочками безпечно поширює інформацію про шифрування (і зелені галочки) всіх учасників таким чином, що гарантує наскрізне шифрування в групі та між її учасниками.</p>
<p>Профілі контактів із зеленими галочками <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> означають, що повідомлення контакту наразі гарантовано зашифровані наскрізним шифруванням. Кожен контакт із зеленою галочкою або зробив пряме <a href="#howtoe2ee">QR-сканування</a> з вами або був представлений іншим контактом, позначеним зеленою галочкою. Знайомство відбувається автоматично під час додавання учасників до груп. Той, хто додає контакт до групи, позначеної зеленою галочкою, стає представником для тих учасників, які ще не знали про доданий контакт. У профілі контакту ви можете кілька разів натиснути на текст “Представлений …” поки не потрапите до того, з ким ви безпосередньо зробили <a href="#howtoe2ee">QR-сканування</a>.</p>
<p>Зверніть увагу, що в профілі контакту ви можете бачити і натискати рекомендувачів але в заголовку профілю немає зеленої галочки. Зазвичай це означає, що контакт <a href="#nocryptanymore">“надіслав повідомлення з іншого пристрою”</a>.</p>
<p>У профілі контакту може відображатися зелена галочка <img style="vertical-align:middle; width:1.5em; margin:1px" src="../green-checkmark.png" alt="green checkmark" /> і рядок “Представлений”. Кожен контакт із зеленою галочкою або зробив пряме <a href="#howtoe2ee">QR-сканування</a> з вами або був представлений іншим контактом, позначеним зеленою галочкою. Знайомство відбувається автоматично під час додавання учасників до груп. Той, хто додає контакт із зеленою галочкою до групи, в якій є лише учасники із зеленою галочкою стає представником. У профілі контакту ви можете кілька разів натиснути на текст “Представлений …” поки не потрапите до того, з ким ви безпосередньо зробили <a href="#howtoe2ee">QR-сканування</a>.</p>
<p>Для більш детального обговорення “гарантованого наскрізного шифрування” будь ласка, перегляньте <a href="https://securejoin.delta.chat/en/latest/new.html">Протоколи безпечного приєднання</a> і, зокрема, прочитайте про “Перевірені групи”, технічний термін того, що тут називається чатами з “зеленою галочкою” або “гарантованим наскрізним шифруванням”.</p>
<h3 id="nocryptanymore">
Контакт “надіслав повідомлення з іншого пристрою”, що робити? <a href="#nocryptanymore" class="anchor"></a>
</h3>
<p>Ваш чат з контактом втратив гарантоване наскрізне шифрування. Зелену галочку було знято для цього чату та контакту, коли ви побачили це попередження. **Якщо ви вважаєте раптове зникнення гарантованого наскрізного шифрування несподіваним для цього контакту, не приймайте попередження! Замість цього зв’яжіться з контактом через другий канал наприклад, відеодзвінок, інший месенджер або телефонний дзвінок, щоб з’ясувати, що сталося.</p>
<p>Якщо ваш контакт дійсно спричинив втрату гарантованого наскрізного шифрування будь ласка, зверніться до наступних параграфів, щоб дізнатися про типові причини та способи їх усунення. Незважаючи на це, всі інші чати, позначені зеленою галочкою, залишаються гарантовано зашифрованими з кінця в кінець навіть якщо контакт є їхнім учасником.</p>
<p><strong>Ваш контакт використовує Delta Chat на другому пристрої (телефоні або ноутбуці)</strong>.</p>
<p>Якщо у них є інший пристрій із запущеним додатком Delta Chat, вони повинні видалити обліковий запис з нового пристрою і додати його <a href="#multiclient">як другий пристрій, як описано тут</a>. Як тільки вони напишуть вам повідомлення, попередження зникне і гарантоване шифрування буде встановлено на обох пристроях вашого контакту.</p>
<p><strong>Ваш контакт перевстановив Delta Chat, використовуючи свій старий логін</strong></p>
<p>Якщо у них є <a href="#backup">файл резервної копії</a>, вони повинні видалити обліковий запис з нового пристрою і, замість цього, імпортувати файл резервної копії для відновлення свого облікового запису. Як тільки вони напишуть вам повідомлення, попередження зникне і гарантоване шифрування буде відновлено для цього контакту.</p>
<p>Якщо у них немає резервної копії файлу, найкраще виконати <a href="#howtoe2ee">QR-сканування</a> з вашим співрозмовником, щоб відновити гарантоване кінцеве шифрування.</p>
<p><strong>Ваш контакт надіслав листа через веб-інтерфейс або іншу поштову програму і незабаром повернеться до використання Delta Chat.</strong></p>
<p>Якщо ви впевнені, що контакт іноді користується веб-поштою, або іншу поштову програму без наскрізного шифрування, ви можете прийняти попередження. Як тільки ваш контакт знову скористається Delta Chat, гарантоване наскрізне шифрування буде автоматично відновлено.</p>
<p><strong>Ваш контакт повністю припинив користуватися Delta Chat</strong>.</p>
<p>Іноді залишатися на зв’язку важливіше, ніж наскрізне шифрування. <a href="#tls">“Шифрування на транспортному рівні” (TLS)</a> все ще може ефективно захищати конфіденційність ваших повідомлень між вашим пристроєм і сервером електронної пошти. Але без наскрізного шифрування ви та ваш контакт довіряєте серверу електронної пошти не читати і не маніпулювати вашими повідомленнями, а також не передавати їх третім особам.</p>
<p>У будь-якому випадку, ви не можете зробити нічого іншого, окрім як прийняти попередження. Будь ласка, також видаліть контакт з будь-якої активної групи, позначеної зеленою галочкою які ви можете знайти в розділі “Загальні чати” в профілі контакту. Це позбавить ваш контакт від отримання “нечитабельних” повідомлень.</p>
<p>Якщо контакт видалив Delta Chat через помилки або небажану поведінку, будь ласка, розгляньте можливість написати повідомлення на нашому <a href="https://support.delta.chat">форумі підтримки</a> щоб допомогти нам виявити та вирішити загальні проблеми. Дякуємо!</p>
<h3 id="чи-зашифровані-наскрізно-вкладення-зображення-файли-аудіо-тощо">
@@ -674,7 +719,7 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
</h3>
<p>Так, Delta Chat використовує безпечну підмножину OpenPGP і відображає індикатор безпеки у вигляді замка в повідомленні лише тоді, коли все повідомлення належним чином зашифровано і підписано. Наприклад, “Відокремлені підписи” не вважаються безпечними.</p>
<p>Так, Delta Chat використовує безпечну підмножину OpenPGP яка вимагає, щоб все повідомлення було належним чином зашифровано і підписано. Наприклад, “відокремлені підписи” не вважаються безпечними.</p>
<p>OpenPGP сам по собі не є небезпечним. Більшість публічно обговорюваних проблем безпеки OpenPGP насправді виникають через недостатню зручність використання або погану реалізацію інструментів чи програм (або обох).
Особливо важливо розрізняти OpenPGP, стандарт шифрування IETF, і GnuPG (GPG), інструмент командного рядка, що реалізує OpenPGP.
@@ -707,19 +752,17 @@ Delta Chat скоріше використовує реалізацію OpenPGP
<p>Delta Chat також ніколи не був вразливим до EFAIL-атаки “Пряма ексфільтрація” тому що він розшифровує лише “багатокомпонентні/зашифровані” повідомлення, які містять рівно одну зашифровану і підписану частину, як визначено специфікацією Autocrypt Level 1.</p>
<h3 id="tls">
<h3 id="чи-повідомлення-позначені-значком-пошти-доступні-в-інтернетіtls">
Чи буде показано повідомлення відкритим текстом, якщо наскрізне шифрування недоступне? <a href="#tls" class="anchor"></a>
Чи повідомлення, позначені значком пошти, доступні в Інтернеті?{#tls} <a href="#чи-повідомлення-позначені-значком-пошти-доступні-в-інтернетіtls" class="anchor"></a>
</h3>
<p>Навіть якщо ваші повідомлення не гарантовано зашифровані наскрізним шифруванням, вони все одно захищені від інтернет-провайдерів, таких як мобільні або кабельні компанії. Однак, ваші провайдери та провайдери електронної пошти одержувача можуть читати, аналізувати або навіть змінювати ваші повідомлення, включаючи будь-які вкладення, якщо вони не зашифровані наскрізним шифруванням.</p>
<p>Якщо ви надсилаєте або отримуєте електронні листи без наскрізного шифрування (використовуючи класичний сервер електронної пошти), вони все одно захищені від мобільних або кабельних компаній, які не можуть читати чи змінювати ваші повідомлення. Однак як ваш, так і поштовий провайдер одержувача можуть читати, аналізувати або змінювати ваші листи, включаючи будь-які вкладення.</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>
<p>Зверніть увагу, що <a href="#howtoe2ee">підтримка гарантованого наскрізного шифрування</a>, на додаток до шифрування TLS, забезпечує повну безпеку між вашим пристроєм і пристроєм одержувача. Навіть ваш провайдер електронної пошти або інтернет-провайдер не зможуть прочитати або змінити ваші повідомлення.</p>
<h3 id="message-metadata">
@@ -729,20 +772,23 @@ Delta Chat скоріше використовує реалізацію OpenPGP
</h3>
<p>Delta Chat захищає більшість метаданих повідомлень, поміщаючи наступну інформацію в наскрізно зашифровану частину повідомлень:</p>
<p>На відміну від більшості інших месенджерів, додатки Delta Chat не зберігають жодних метаданих про контакти чи групи на серверах, навіть у зашифрованому вигляді. Натомість усі метадані груп наскрізно зашифровані та зберігаються виключно на пристроях користувачів.</p>
<p>Тому поштові сервери можуть бачити лише</p>
<ul>
<li>Тема повідомлення</li>
<li>Аватар та назва групи</li>
<li>Запити MDN (підтвердження прочитання) (<code class="language-plaintext highlighter-rouge">Chat-Disposition-Notification-To</code>)</li>
<li>Таймер зникнення повідомлень (<code class="language-plaintext highlighter-rouge">Ephemeral-Timer</code>)</li>
<li><code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Added</code>, <code class="language-plaintext highlighter-rouge">Chat-Group-Member-Removed-Member-Added</code>.</li>
<li>Заголовок <code class="language-plaintext highlighter-rouge">Secure-Join</code>, що містить команди безпечного приєднання</li>
<li>Сповіщення про увімкнення потокового передавання місцезнаходження</li>
<li>URL-адреса кімнати WebRTC</li>
<li>
<p>дату повідомлення,</p>
</li>
<li>
<p>адреси відправника та одержувача</p>
</li>
<li>
<p>і розмір повідомлення.</p>
</li>
</ul>
<p>Поштові сервери не мають доступу до цих захищених метаданих але вони бачать дату і розмір повідомлення, і, що важливіше, адреси відправника та отримувача. Поштовим серверам потрібні адреси одержувачів, щоб маршрутизувати і доставляти повідомлення на пристрої одержувача.</p>
<p>Усі інші метадані повідомлень, контактів і груп містяться в наскрізно зашифрованій частині повідомлень.</p>
<h3 id="device-seizure">
@@ -752,62 +798,21 @@ Delta Chat скоріше використовує реалізацію OpenPGP
</h3>
<p>Як для захисту від поштових серверів, що збирають метадані, так і для захисту від загрози вилучення пристрою ми рекомендуємо використовувати оптимізований для Delta Chat <a href="https://delta.chat/serverguide">екземпляр поштового сервера</a> для створення псевдонімних тимчасових акаунтів за допомогою сканування QR-коду. Зверніть увагу, що додатки Delta Chat на всіх платформах підтримують кілька облікових записів тому ви можете легко використовувати “1-тижневі” або “1-місячні” акаунти поруч з вашим основним” акаунтом знаючи, що всі дані тимчасових акаунтів разом з усіма метаданими будуть видалені. Більше того, якщо пристрій вилучається, то контакти, які використовують тимчасові електронні скриньки, не можуть бути легко ідентифіковані, на відміну від месенджерів, які розкривають телефонні номери в групах чату, які, в свою чергу, часто пов’язані з юридичними особами.</p>
<p>Для захисту як від серверів електронної пошти, що збирають метадані, так і від загрози вилучення пристрою, ми рекомендуємо використовувати <a href="https://chatmail.at/relays">чатмейл-релей</a> для створення чат-профілів із випадковими адресами електронної пошти для передавання повідомлень. Зверніть увагу, що додатки Delta Chat на всіх платформах підтримують кілька профілів, тому ви можете легко користуватися профілями, створеними для конкретних ситуацій, поруч із вашим «основним» профілем, з упевненістю, що всі їхні дані, включно з усіма метаданими, буде видалено. Більше того, у разі вилучення пристрою ідентифікувати чат-контакти, які використовують короткочасні профілі, буде вкрай складно.</p>
<h3 id="як-перевірити-інформацію-про-шифрування">
<h3 id="sealedsender">
Як перевірити інформацію про шифрування? <a href="#як-перевірити-інформацію-про-шифрування" class="anchor"></a>
Чи підтримує Delta Chat функцію “Запечатаний відправник”? <a href="#sealedsender" class="anchor"></a>
</h3>
<p>Ви можете перевірити стан наскрізного шифрування вручну в діалоговому вікні “Шифрування” (профіль користувача на Android/iOS або клацніть правою кнопкою миші на елементі списку чату користувача на робочому столі). Delta Chat показує там два відбитки. Якщо на вашому пристрої та пристрої вашого співрозмовника з’являються однакові відбитки, з’єднання безпечне.</p>
<h3 id="як-перевірити-стан-шифрування-повідомлень">
Як перевірити стан шифрування повідомлень? <a href="#як-перевірити-стан-шифрування-повідомлень" class="anchor"></a>
</h3>
<p>Ні, поки ще ні.</p>
<p>Маленький <strong>замок</strong> в бульбашці повідомлення позначає, що повідомлення було належним чином наскрізно зашифроване від відправника. Якщо <strong>немає замка</strong>, повідомлення не було належним чином наскрізно зашифровано, найімовірніше, тому що відправник використовує додаток або інтерфейс веб-пошти без підтримки кінцевого шифрування.</p>
<h3 id="чому-я-бачу-незашифровані-повідомлення">
Чому я бачу незашифровані повідомлення? <a href="#чому-я-бачу-незашифровані-повідомлення" class="anchor"></a>
</h3>
<p>Месенджер Signal запровадив <a href="https://signal.org/blog/sealed-sender/">“Запечатаного відправника” у 2018 році</a> щоб їхня серверна інфраструктура не знала, хто надсилає повідомлення певній групі одержувачів. Це особливо важливо, оскільки сервер Signal знає номер мобільного телефону кожного акаунта, який зазвичай асоціюється з паспортними даними.</p>
<p>Якщо контакт використовує поштову програму, яка не підтримує Autocrypt всі повідомлення за участю цього контакту (в групі або чаті 1:1) не будуть наскрізно зашифровані, а отже, не показуватимуть “висячого замка” з повідомленнями. Зверніть увагу, що навіть якщо ваші контакти використовують Delta Chat у своєму акаунті, вони також можуть використовувати програму електронної пошти без функції шифрування, що може спричинити періодичні незашифровані повідомлення. Відповідати незашифрованими на незашифровані повідомлення вимагає Autocrypt щоб запобігти отриманню нечитабельних повідомлень на стороні ваших контактів та їхніх поштових програм, які не підтримують Autocrypt.</p>
<h3 id="як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt">
Як я можу отримати наскрізно зашифрований чат з контактом Delta Chat, який іноді користується веб-поштою або іншим додатком електронної пошти, що не підтримує Autocrypt? <a href="#як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt" class="anchor"></a>
</h3>
<p>Якщо вам потрібен безпечний наскрізно зашифрований чат з контактом який використовує свій акаунт як у Delta Chat, так і в інших додатках (наприклад, веб-пошті), що не підтримують автошифрування, найкраще налаштувати <a href="#howtoe2ee">гарантоване наскрізне шифрування з ними</a>, а потім створити груповий чат з гарантованим наскрізним шифруванням, учасниками якого будете ви двоє. У цьому груповому чаті всі повідомлення будуть наскрізно зашифровані навіть якщо в прямому чаті між вами буде <a href="#nocryptanymore">“… надіслано повідомлення з іншого пристрою”</a>.</p>
<h3 id="як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень">
Як забезпечити наскрізне шифрування та видалення повідомлень? <a href="#як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень" class="anchor"></a>
</h3>
<p>Найкращий спосіб забезпечити наскрізне шифрування кожного повідомлення, а метадані видалялися якнайшвидше, це <a href="#howtoe2ee">використання чатів з гарантованим наскрізним шифруванням</a>
та увімкнення <a href="#ephemeralmsgs">зникаючих повідомлень</a>.</p>
<p>Гарантований наскрізно шифрований чат захищає від <a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">MITM-атак</a>, а увімкнення функції зникнення повідомлень видаляє повідомлення на сервері через певний час, налаштований користувачем.</p>
<p>Якщо вам не потрібне більш довготривале зберігання копій ваших повідомлень на сервері, ви також можете увімкнути <a href="#delold">“автоматично видаляти повідомлення з сервера”</a>.</p>
<p>Навіть якщо <a href="https://chatmail.at/relays">чат-мейл релей</a> не запитує ніяких приватних даних (в тому числі номерів телефонів), все одно може мати сенс захистити реляційні метадані між адресами. Ми не передбачаємо великих проблем у використанні випадкових одноразових адрес електронної пошти для запечатаних відправлень але реалізація такої можливості ще не є пріоритетною.</p>
<h3 id="pfs">
@@ -817,23 +822,33 @@ Delta Chat скоріше використовує реалізацію OpenPGP
</h3>
<p>Ні, Delta Chat не підтримує ідеальну пряму секретність (PFS). Це означає, що якщо ваш приватний ключ дешифрування Delta Chat витік, і хтось зібрав ваші попередні транзитні повідомлення, він зможе розшифрувати і прочитати їх за допомогою витоку ключа розшифрування.</p>
<p>Ні, поки ще ні.</p>
<p>Зауважте, однак, що якщо хтось отримає ваші ключі розшифрування, вони, як правило, також зможуть отримати ваші повідомлення, незалежно від того, чи працює Perfect Forward Secrecy чи ні. Типовою реальною ситуацією для витоку ключів дешифрування є вилучення пристрою яку ми обговорюємо в нашій відповіді <a href="#device-seizure">про метадані та вилучення пристрою</a>.</p>
<p>Delta Chat наразі не підтримує ідеальну пряму секретність (Perfect Forward Secrecy, PFS). Це означає, що якщо ваш приватний ключ для розшифрування буде скомпрометовано, а хтось заздалегідь зібрав ваші повідомлення під час передачі, він зможе розшифрувати та прочитати їх, використовуючи зламаний ключ. Зверніть увагу, що пряма секретність підвищує рівень безпеки лише в тому разі, якщо ви видаляєте повідомлення. Інакше, якщо хтось отримує доступ до ваших ключів розшифрування, він зазвичай також має доступ до всіх ваших невидалених повідомлень і навіть не потребує розшифровувати заздалегідь перехоплені дані.</p>
<p>Можливо, що Delta Chat розвивається для підтримки Perfect Forward Secrecy, тому що OpenPGP - це лише контейнер для зашифрованих повідомлень, але керування ключами шифрування (і, відповідно, ротація ключів або “храповик” ключів) може бути організоване у гнучкий спосіб. Дивіться <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">Прототип PFS від Seqouia</a> щодо існуючих експериментів у спільноті реалізаторів OpenPGP.</p>
<p>Ми розробили підхід Forward Secrecy, який витримав початкову експертизу від деяких криптографів та експертів з реалізації але чекає на більш офіційний звіт щоб переконатися, що він надійно працює в об’єднаних системах обміну повідомленнями та при використанні декількох пристроїв, перш ніж його можна буде реалізувати в <a href="https://github.com/chatmail/core">ядрі чату</a>, що зробить його доступним у всіх <a href="https://chatmail.at/clients">клієнтах чату</a>.</p>
<h3 id="чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal">
<h3 id="pqc">
Чи є наскрізне шифрування Delta Chat таким же безпечним, як Signal? <a href="#чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal" class="anchor"></a>
Чи підтримує Delta Chat пост-квантову криптографію? <a href="#pqc" class="anchor"></a>
</h3>
<p>Це залежить від того, що для вас важливо. Delta Chat <a href="#pfs">не підтримує PFS</a>, як Signal але він забезпечує <a href="#e2eeguarantee">гарантовано наскрізні зашифровані чати</a> які захищені від скомпрометованих серверів або пошкоджених мереж. Signal та більшість інших месенджерів, що підтримують PFS, не надають практичної схеми захисту чат-груп від мережевих атак які, можливо, викликають більше занепокоєння ніж потенційний зловмисник, який заволодіє вашим телефоном і приватними налаштуваннями шифрування, але чомусь не ваші повідомлення, але має повний запис усіх минулих зашифрованих повідомлень.</p>
<p>Ні, поки ще ні.</p>
<p>У будь-якому випадку, наскрізне шифрування Delta Chat використовує <a href="#openpgp-secure">безпечну підмножину OpenPGP</a> який пройшов <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">незалежний аудит безпеки</a>.</p>
<p>Delta Chat використовує бібліотеку Rust OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a> яка підтримує останню версію <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>. Ми плануємо додати підтримку PQC у <a href="https://github.com/chatmail/core">chatmail core</a> після того, як проект буде завершено у IETF у співпраці з іншими розробниками OpenPGP.</p>
<h3 id="як-я-можу-вручну-перевірити-інформацію-про-шифрування">
Як я можу вручну перевірити інформацію про шифрування? <a href="#як-я-можу-вручну-перевірити-інформацію-про-шифрування" class="anchor"></a>
</h3>
<p>Ви можете перевірити стан наскрізного шифрування вручну в діалоговому вікні “Шифрування” (профіль користувача на Android/iOS або клацніть правою кнопкою миші на елементі списку чату користувача на робочому столі). Delta Chat показує там два відбитки. Якщо на вашому пристрої та пристрої вашого співрозмовника з’являються однакові відбитки, з’єднання безпечне.</p>
<h3 id="importkey">
@@ -843,29 +858,11 @@ Delta Chat скоріше використовує реалізацію OpenPGP
</h3>
<p>Так.
The best way is to send an Autocrypt Setup Message from the other e-mail client.
Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the settings of the other client and follow the instructions shown there.</p>
<p>Ні.</p>
<p>Крім того, ви можете імпортувати ключ вручну в “Налаштування -&gt; Додаткові налаштування -&gt; Імпорт секретних ключів”. Застереження: Переконайтеся, що ключ не захищено паролем, або видаліть його заздалегідь.</p>
<p>Delta Chat генерує безпечні ключі OpenPGP відповідно до специфікації Autocrypt 1.1. Ви можете експортувати свій приватний ключ, але не можете імпортувати додаткові приватні ключі.</p>
<p>Якщо у вас немає ключа або ви навіть не знаєте, що він вам знадобиться – не хвилюйтеся: Delta Chat генерує ключі в міру необхідності, вам не потрібно натискати кнопку для цього.</p>
<h3 id="я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat">
Я не можу імпортувати свій існуючий PGP ключ у Delta Chat. <a href="#я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat" class="anchor"></a>
</h3>
<p>Найімовірнішою причиною є те, що ваш ключ зашифрований та/або використовується пароль. Такі ключі не підтримуються Delta Chat. Ви можете видалити шифрування парольної фрази та пароль і спробувати імпорт знову.</p>
<p>Ще одна поширена помилка – неправильне закінчення файлу. Використовуйте захищений формат ASCII і закінчення файлу <code class="language-plaintext highlighter-rouge">.asc</code>.</p>
<p>Delta Chat підтримує поширені формати приватних ключів OpenPGP, однак навряд чи приватні ключі з усіх джерел будуть повністю підтримуватися. Це не головна мета Delta Chat. Фактично, більшість нових користувачів не матимуть жодного ключа до використання Delta Chat. Однак ми намагаємось підтримувати приватні ключі з якомога більшої кількості джерел.</p>
<p>Видалення пароля з приватного ключа буде залежати від програмного забезпечення, яке використовується для управління ключами PGP. За допомогою Enigmail ви можете встановити для порожній пароль у вікні Керування ключами. За допомогою GnuPG ви можете встановити його <a href="https://github.com/deltachat/deltachat-android/issues/98#issuecomment-378383429">через командний рядок</a>. Для інших програм ви зможете знайти рішення в інтернеті.</p>
<p>Загалом, ми не рекомендуємо і не пропонуємо користувачам керувати ключами вручну. Ми хочемо гарантувати, що аудит безпеки може зосередитися на декількох перевірених криптографічних алгоритмах а не на всій широті можливих алгоритмів, дозволених у OpenPGP.</p>
<h3 id="security-audits">
@@ -921,7 +918,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h3>
<p>Так. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
<p>Так. You can use the same profile on different devices:</p>
<ul>
<li>
@@ -970,6 +967,9 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<li>
<p><strong>Гостьові мережі</strong> можуть не дозволяти пристроям зв’язуватися один з одним. Якщо можливо, використовуйте негостьову мережу.</p>
</li>
<li>
<p>Якщо у вас все ще виникають проблеми з використанням однієї мережі, спробуйте відкрити <strong>Мобільну точку доступу</strong> на одному пристрої та приєднатися до цього Wi-Fi з іншого</p>
</li>
<li>
<p>Переконайтеся, що на цільовому пристрої <strong>достатньо пам’яті</strong></p>
</li>
@@ -977,7 +977,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>Якщо передача почалася, переконайтеся, що пристрої <strong>залишаються активними</strong> і не засинають. Не виходьте з Delta Chat. (ми докладаємо всіх зусиль, щоб програма працювала у фоновому режимі, але <a href="https://dontkillmyapp.com">системи, як правило, вбивають програми</a>, на жаль)</p>
</li>
<li>
<p>Delta Chat <strong>уже ввійшов</strong> на цільовому пристрої? Ви можете використовувати кілька облікових записів на одному пристрої, просто <a href="#multiple-accounts">додайте інший обліковий запис</a></p>
<p>Delta Chat <strong>вже зареєстрований</strong> на цільовому пристрої? Ви можете використовувати кілька профілів на одному пристрої, просто <a href="#multiple-accounts">додайте ще один профіль</a></p>
</li>
<li>
<p>Якщо у вас усе ще виникають проблеми або якщо ви <strong>не можете відсканувати QR-код</strong> спробуйте <strong>перенесення вручну</strong>, описане нижче</p>
@@ -995,15 +995,26 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>Цей спосіб рекомендований, лише якщо «Додати другий пристрій», як описано вище, не працює.</p>
<ul>
<li>На старому пристрої перейдіть до “Налаштування -&gt; Чати та медіа -&gt; Експортувати резервну копію”. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати Резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</li>
<li>На новому пристрої на екрані входу замість того, щоб увійти до свого облікового запису електронної пошти, виберіть “Імпортувати резервну копію” виберіть “Імпортувати резервну копію”. Після імпорту ваші листування, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.
<ul>
<li>Якщо ви користуєтеся iOS:** і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
</ul>
</li>
<li>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізно зашифрованих повідомлень зі своїми партнерами по спілкуванню.</li>
<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>
</ul>
<h3 id="чи-синхронізовані-видалення-закріплення-архівування-збереження-вимкнення-сповіщень-тощо-з-усіма-пристроями">
Чи синхронізовані видалення, закріплення, архівування, збереження, вимкнення сповіщень тощо з усіма пристроями? <a href="#чи-синхронізовані-видалення-закріплення-архівування-збереження-вимкнення-сповіщень-тощо-з-усіма-пристроями" class="anchor"></a>
</h3>
<p>Так.</p>
<p>Якщо ви, наприклад, видалите чат або повідомлення з телефону, воно буде видалено на вашому робочому столі, щойно ви знову з’явитесь в мережі.</p>
<p>Винятком є <a href="#delold">Видалення старих повідомлень з пристрою</a>, оскільки різні пристрої можуть мати різний обсяг пам’яті, а також системні налаштування звуків сповіщень.</p>
<h3 id="чи-планується-впровадження-веб-клієнта-delta-chat">
@@ -1038,9 +1049,12 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<ul>
<li>Додатки webxdc не можуть надсилати дані в Інтернет або завантажувати щось.</li>
<li>Програма webxdc може обмінюватися даними лише в межах чату Delta Chat з її копіями на пристроях ваших партнерів по чату. В іншому, вони повністю ізольовані від Інтернету.</li>
<li>Програма webxdc може обмінюватися даними лише в межах чату Delta Chat з її копіями на пристроях ваших партнерів по чату. В іншому, вона повністю ізольована від Інтернету.</li>
<li>Конфіденційність, яку пропонує додаток webxdc, є конфіденційністю вашого чату - доки ви довіряєте людям, з якими ви спілкуєтеся, ви можете довіряти і додатку webxdc.</li>
<li>Це також означає, що відкриття додатків webxdc в чатах, де ви не довіряєте учасникам, як ви знаєте з вкладень в електронній пошті, де ви відкриваєте вкладення тільки від відправників, яким довіряєте, а не від спамерів.</li>
<li>Це також означає, що відкриття додатків у чатах з користувачами, яким ви не довіряєте, може становити ризик для конфіденційності.
Так само, як і з вкладеннями електронної пошти, відеодзвінками або звичайними посиланнями:
відкривайте їх лише від відправників, яким ви довіряєте, а не від спамерів.
Спамери можуть дізнатися будь-які дані, які ви їм надсилаєте, а також вашу IP-адресу.</li>
</ul>
<h3 id="де-я-можу-отримати-webxdc-додатки">
@@ -1108,13 +1122,9 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h3>
<ul>
<li>За допомогою списку розсилки ви можете надіслати повідомлення багатьом одержувачам одночасно; коли вони відповідають вам, ви отримуєте відповідь у своєму прямому чаті 1:1 з ними. Одержувачі не бачать один одного.</li>
<li>Технічно це електронний лист із багатьма одержувачами в BCC.</li>
<li>Ви можете ввімкнути функцію в розділі «експериментальні функції» в розширених налаштуваннях. Потім ви можете створити список трансляцій у діалоговому вікні «Новий чат».</li>
<li>Якщо ви використовуєте більше ніж один пристрій, списки трансляцій наразі не синхронізуються між ними.</li>
<li>Повідомлення, надіслані до списків розсилки, не шифруються. Шифрування порушило б анонімність, оскільки тоді всі одержувачі знали б, хто ще його отримав (надсилання окремих листів усім було б гіршим через обмеження швидкості та споживання мережі).</li>
</ul>
<p>За допомогою списку розсилки ви можете надіслати повідомлення одразу багатьом одержувачам;
одержувачі не можуть відповідати у цьому списку.
Списки розсилки все ще дуже експериментальні і, ймовірно, будуть замінені чимось іншим, слідкуйте за новинами :)</p>
<h3 id="як-я-можу-поділитися-своїм-місцезнаходженням-зі-своїми-співрозмовниками-в-чаті">
@@ -1152,17 +1162,22 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>У цьому випадку Delta Chat не потрібно стежити за папкою «Вхідні», а достатньо лише стежити за папкою DeltaChat.</p>
<h3 id="як-я-можу-змінити-мій-обліковий-запис-на-іншу-адресу-електронної-пошти">
<h3 id="як-я-можу-використовувати-іншу-адресу-електронної-пошти-у-своєму-профілі">
Як я можу змінити мій обліковий запис на іншу адресу електронної пошти? <a href="#як-я-можу-змінити-мій-обліковий-запис-на-іншу-адресу-електронної-пошти" class="anchor"></a>
Як я можу використовувати іншу адресу електронної пошти у своєму профілі? <a href="#як-я-можу-використовувати-іншу-адресу-електронної-пошти-у-своєму-профілі" class="anchor"></a>
</h3>
<p>Примітка:
Зміна адреси електронної пошти тимчасово відключена
через постійні зміни в ядрі DeltaChat.
Ця функція буде знову доступна через кілька місяців.</p>
<ol>
<li>
<p>Змініть свою адресу в розділі “Налаштування → Додатково → Пароль та обліковий запис” та введіть пароль вашого нового облікового запису (і, за необхідності, налаштування сервера). Ви отримаєте інформаційне повідомлення про те, що ви переїжджаєте на нову адресу. Додаткове повідомлення також з’явиться у вашому чаті “Повідомлення пристрою”.</p>
<p>Змініть свою адресу в розділі “Налаштування → Додатково → Пароль та обліковий запис” та введіть пароль вашого нового поштового акаунта (і, за необхідності, налаштування сервера). Ви отримаєте інформаційне повідомлення про те, що ви переїжджаєте на нову адресу. Додаткове повідомлення також з’явиться у вашому чаті “Повідомлення пристрою”.</p>
</li>
<li>
<p>Якщо можливо, нехай ваш старий провайдер електронної пошти пересилає всі повідомлення на вашу нову адресу.</p>
@@ -1249,17 +1264,40 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
Проте для коректної роботи деяких провайдерів потрібні специфічні налаштування. Дивіться наш <a href="https://providers.delta.chat">огляд провайдерів</a></li>
</ul>
<h3 id="я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите">
<h3 id="can-i-use-delta-chat-in-parallel-with-other-e-mail-apps">
Я хочу керувати власним сервером електронної пошти для Delta Chat. Що ви порадите? <a href="#я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите" class="anchor"></a>
Can I use Delta Chat in parallel with other E-Mail apps? <a href="#can-i-use-delta-chat-in-parallel-with-other-e-mail-apps" class="anchor"></a>
</h3>
<p>Yes, but it is not recommended.</p>
<p>Parallel usage with the same E-Mail address might lead to the following inconveniences:</p>
<ul>
<li>Next to your Delta Chat notifications,
you might also get notifications for (encrypted, so unreadable) chat mail messages
in your other email app</li>
<li>If Delta Chat is not running
or “Advanced &gt; Move automatically to the DeltaChat Folder” is disabled,
encrypted Delta Chat messages might clutter the Inbox in your other E-Mail apps.</li>
</ul>
<p><a href="https://support.delta.chat/t/sieve-rule-to-move-deltachat-mails-to-deltachat-folder/288/10">Sieve rules</a> can solve these problems.</p>
<h3 id="я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте">
Я хочу керувати власним сервером для Delta Chat. Що ви порекомендуєте? <a href="#я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте" class="anchor"></a>
</h3>
<ul>
<li>Більшість поштових серверів працюватимуть добре. Але ми особисто рекомендуємо поєднання mailcow і mailadm, як описано <a href="https://delta.chat/en/2023-01-27-upcoming-mail-server-workshops">у цьому пості</a>.</li>
<li>Ви можете знайти <a href="https://delta.chat/uk/serverguide">посібник із встановлення на нашому веб-сайті</a>.</li>
<li>Більшість поштових серверів будуть працювати добре. Але ми особисто рекомендуємо використовувати сервер ретрансляції чатової пошти, як описано <a href="https://delta.chat/en/2023-12-13-chatmail">в цій статті</a>.</li>
<li>Ви можете знайти <a href="https://github.com/chatmail/relay">посібник зі встановлення на GitHub</a>.</li>
</ul>
<h3 id="чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-delta-chat-чи-це-безпечно">
@@ -1272,7 +1310,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>Як і інші поштові програми, такі як Thunderbird, K9-Mail або Outlook, програма програма потребує пароля, щоб ви могли використовувати її для надсилання листів. Звичайно, пароль пароль зберігається лише на вашому пристрої. Пароль передається лише вашому поштовому провайдеру (коли ви входите в систему), який і так має доступ до вашої пошти.</p>
<p>Оскільки Delta Chat має відкритий код, ви можете ознайомитись із <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">початковим кодом</a> якщо бажаєте перевірити що ваші дані для авторизації надійно зберігаються. Ми будемо раді вашим пропозиціям, які зроблять додаток більш безпечним для всіх користувачів.</p>
<p>Оскільки Delta Chat має відкритий код, ви можете ознайомитись із <a href="https://github.com/chatmail/core/blob/main/src/login_param.rs">початковим кодом</a> якщо бажаєте перевірити що ваші дані для авторизації надійно зберігаються. Ми будемо раді вашим пропозиціям, які зроблять додаток більш безпечним для всіх користувачів.</p>
<h3 id="які-повідомлення-відображаються-у-delta-chat">
@@ -1351,17 +1389,17 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>Деякі люди використовують Delta Chat як звичайний поштовий клієнт і хочуть використовувати папку Вхідні для своєї пошти замість папки DeltaChat. Якщо ви вимкнете “Перегляд папки DeltaChat”, вам слід також вимкнути “переміщення повідомлень чату до DeltaChat”.
В іншому випадку видалення повідомлень або налаштування декількох пристроїв може не працювати належним чином.</p>
<h3 id="чи-сумісний-delta-chat-із-protonmail--tutanota--criptext">
<h3 id="чи-сумісний-delta-chat-із-proton-mail--tutanota--criptext">
Чи сумісний Delta Chat із Protonmail / Tutanota / Criptext? <a href="#чи-сумісний-delta-chat-із-protonmail--tutanota--criptext" class="anchor"></a>
Чи сумісний Delta Chat із Proton Mail / Tutanota / Criptext? <a href="#чи-сумісний-delta-chat-із-proton-mail--tutanota--criptext" class="anchor"></a>
</h3>
<ul>
<li>Так і ні.</li>
<li>Ні, ви не можете використовувати свій обліковий запис Protonmail, Tutanota або Criptext у Delta Chat; вони не пропонують отримання листів через IMAP.</li>
<li>Ні, ви не можете використовувати свій обліковий запис Proton Mail, Tutanota або Criptext у Delta Chat; вони не пропонують отримання листів через IMAP.</li>
<li>У будь-якому випадку, ви можете використовувати Delta Chat для надсилання повідомлень людям, які користуються Protonmail, Tutanota або Criptext. Ці повідомлення не будуть наскрізно зашифрованими. Наскрізне шифрування, яке пропонують ці провайдери, не є сумісним з <a href="https://autocrypt.org/">Autocrypt</a>, стандартним шифруванням, яке використовує Delta Chat.</li>
<li>Delta Chat може наскрізно шифрувати через будь-якого провайдера електронної пошти з будь-якою <a href="https://autocrypt.org/dev-status.html">поштовою програмою з підтримкою автошифрування</a>.</li>
</ul>
@@ -1393,7 +1431,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h3>
<ul>
<li>Дивіться <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</li>
<li>Дивіться <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</li>
</ul>
<h3 id="де-мої-друзі-можуть-знайти-delta-chat">
@@ -1455,7 +1493,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
завершення прив’язок Rust/Python та запуск екосистеми чат-ботів.</p>
</li>
<li>
<p>У 2021 році ми отримали подальше фінансування ЄС для двох Інтернет-технологій наступного покоління пропозиції, а саме для <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - каталог перенесення електронної пошти</a> (~97 тис. євро) та <a href="https://nlnet.nl/project/EmailPorting/">AEAP - перенесення електронної адреси</a> (~90 тис. євро), що призвело до кращої підтримки кількох облікових записів, покращеного QR-коду контактів і налаштувань груп, а також багатьох покращень роботи мережі на всіх платформах.</p>
<p>У 2021 році ми отримали подальше фінансування від ЄС на дві пропозиції щодо Інтернету наступного покоління а саме на <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - каталог перенесення провайдерів електронної пошти</a> (~97 тис. євро) та <a href="https://nlnet.nl/project/EmailPorting/">AEAP - перенесення адрес електронної пошти</a> (~90 тис. євро), що дозволило нам покращити багатопрофільну підтримку, вдосконалити налаштування контактів та груп за допомогою QR-коду та багато інших мережевих покращень на всіх платформах.</p>
</li>
<li>
<p>З кінця 2021 до березня 2023 року ми отримували фінансування <em>Internet Freedom</em> (500 тис. дол. США) від Бюро США з питань демократії, прав людини та праці (DRL). Це фінансування підтримало наші довгострокові цілі зробити Delta Chat більш зручним для використання і сумісним з широким спектром серверів електронної пошти по всьому світу, більш стійким і безпечним в місцях, які постраждали від інтернет-цензури та відключення інтернету.</p>
@@ -1483,4 +1521,4 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</body></html>
</body></html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,124 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc;
import chat.delta.util.SettableFuture;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
/* Basic RPC Transport implementation */
public abstract class BaseTransport implements Rpc.Transport {
private final Map<Integer, SettableFuture<JsonNode>> requestFutures = new ConcurrentHashMap<>();
private int requestId = 0;
private final ObjectMapper mapper = new ObjectMapper();
private Thread worker;
/* Send a Request as raw JSON String to the RPC server */
protected abstract void sendRequest(String jsonRequest);
/* Get next Response as raw JSON String from the RPC server */
protected abstract String getResponse();
public ObjectMapper getObjectMapper() {
return mapper;
}
public void call(String method, JsonNode... params) throws RpcException {
innerCall(method, params);
}
public <T> T callForResult(TypeReference<T> resultType, String method, JsonNode... params) throws RpcException {
try {
JsonNode node = innerCall(method, params);
if (node.isNull()) return null;
return mapper.readValue(node.traverse(), resultType);
} catch (IOException e) {
throw new RpcException(e.getMessage());
}
}
private JsonNode innerCall(String method, JsonNode... params) throws RpcException {
int id;
synchronized (this) {
id = ++requestId;
ensureWorkerThread();
}
try {
String jsonRequest = mapper.writeValueAsString(new Request(method, params, id));
SettableFuture<JsonNode> future = new SettableFuture<>();
requestFutures.put(id, future);
sendRequest(jsonRequest);
return future.get();
} catch (ExecutionException e) {
throw (RpcException)e.getCause();
} catch (InterruptedException e) {
throw new RpcException(e.getMessage());
} catch (JsonProcessingException e) {
throw new RpcException(e.getMessage());
}
}
private void ensureWorkerThread() {
if (worker != null) return;
worker = new Thread(() -> {
while (true) {
try {
processResponse();
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}, "jsonrpcThread");
worker.start();
}
private void processResponse() throws JsonProcessingException {
String jsonResponse = getResponse();
Response response = mapper.readValue(jsonResponse, Response.class);
if (response.id == 0) { // Got JSON-RPC notification/event, ignore
return;
}
SettableFuture<JsonNode> future = requestFutures.remove(response.id);
if (future == null) { // Got a response with unknown ID, ignore
return;
}
if (response.error != null) {
future.setException(new RpcException(response.error.toString()));
} else if (response.result != null) {
future.set(response.result);
} else {
future.setException(new RpcException("Got JSON-RPC response without result or error: " + jsonResponse));
}
}
private static class Request {
private final String jsonrpc = "2.0";
public final String method;
public final JsonNode[] params;
public final int id;
public Request(String method, JsonNode[] params, int id) {
this.method = method;
this.params = params;
this.id = id;
}
}
private static class Response {
public String jsonrpc;
public int id;
public JsonNode result;
public JsonNode error;
}
}
+245
View File
@@ -0,0 +1,245 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import chat.delta.rpc.types.*;
public class Rpc {
public interface Transport {
void call(String method, JsonNode... params) throws RpcException;
<T> T callForResult(TypeReference<T> resultType, String method, JsonNode... params) throws RpcException;
ObjectMapper getObjectMapper();
}
public final Transport transport;
private final ObjectMapper mapper;
public Rpc(Transport transport) {
this.transport = transport;
this.mapper = transport.getObjectMapper();
}
public Integer addAccount() throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "add_account");
}
/**
* Set the order of accounts.
* The provided list should contain all account IDs in the desired order.
* If an account ID is missing from the list, it will be appended at the end.
* If the list contains non-existent account IDs, they will be ignored.
*/
public void setAccountsOrder(java.util.List<Integer> order) throws RpcException {
transport.call("set_accounts_order", mapper.valueToTree(order));
}
/* 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));
}
/**
* If there was an error while the account was opened
* and migrated to the current version,
* then this function returns it.
* <p>
* This function is useful because the key-contacts migration could fail due to bugs
* and then the account will not work properly.
* <p>
* After opening an account, the UI should call this function
* and show the error string if one is returned.
*/
public String getMigrationError(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "get_migration_error", mapper.valueToTree(accountId));
}
/* 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));
}
/**
* Configures a new email account using the provided parameters
* and adds it as a transport.
* <p>
* If the email address is the same as an existing transport,
* then this existing account will be reconfigured instead of a new one being added.
* <p>
* This function stops and starts IO as needed.
* <p>
* Usually it will be enough to only set `addr` and `password`,
* and all the other settings will be autoconfigured.
* <p>
* During configuration, ConfigureProgress events are emitted;
* they indicate a successful configuration as well as errors
* and may be used to create a progress bar.
* This function will return after configuration is finished.
* <p>
* If configuration is successful,
* the working server parameters will be saved
* and used for connecting to the server.
* The parameters entered by the user will be saved separately
* so that they can be prefilled when the user opens the server-configuration screen again.
* <p>
* See also:
* - [Self::is_configured()] to check whether there is
* at least one working transport.
* - [Self::add_transport_from_qr()] to add a transport
* from a server encoded in a QR code.
* - [Self::list_transports()] to get a list of all configured transports.
* - [Self::delete_transport()] to remove a transport.
*/
public void addOrUpdateTransport(Integer accountId, EnteredLoginParam param) throws RpcException {
transport.call("add_or_update_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
}
/**
* Adds a new email account as a transport
* using the server encoded in the QR code.
* See [Self::add_or_update_transport].
*/
public void addTransportFromQr(Integer accountId, String qr) throws RpcException {
transport.call("add_transport_from_qr", mapper.valueToTree(accountId), mapper.valueToTree(qr));
}
/**
* Create a new unencrypted group chat.
* <p>
* Same as [`Self::create_group_chat`], but the chat is unencrypted and can only have
* address-contacts.
*/
public Integer createGroupChatUnencrypted(Integer accountId, String name) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "create_group_chat_unencrypted", mapper.valueToTree(accountId), mapper.valueToTree(name));
}
/**
* Create a new **broadcast channel**
* (called "Channel" in the UI).
* <p>
* Broadcast channels are similar to groups on the sending device,
* however, recipients get the messages in a read-only chat
* and will not see who the other members are.
* <p>
* Called `broadcast` here rather than `channel`,
* because the word "channel" already appears a lot in the code,
* which would make it hard to grep for it.
* <p>
* After creation, the chat contains no recipients and is in _unpromoted_ state;
* see [`CommandApi::create_group_chat`] for more information on the unpromoted state.
* <p>
* Returns the created chat's id.
*/
public Integer createBroadcast(Integer accountId, String chatName) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "create_broadcast", mapper.valueToTree(accountId), mapper.valueToTree(chatName));
}
/* 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));
}
/* 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));
}
/* 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));
}
/**
* Imports contacts from a vCard file located at the given path.
* <p>
* Returns the ids of created/modified contacts in the order they appear in the vCard.
*/
public java.util.List<Integer> importVcard(Integer accountId, String path) throws RpcException {
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "import_vcard", mapper.valueToTree(accountId), mapper.valueToTree(path));
}
/* 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));
}
public void sendWebxdcRealtimeData(Integer accountId, Integer instanceMsgId, java.util.List<Integer> data) throws RpcException {
transport.call("send_webxdc_realtime_data", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(data));
}
public void sendWebxdcRealtimeAdvertisement(Integer accountId, Integer instanceMsgId) throws RpcException {
transport.call("send_webxdc_realtime_advertisement", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId));
}
/**
* Leaves the gossip of the webxdc with the given message id.
* <p>
* NB: When this is called before closing a webxdc app in UIs, it must be guaranteed that
* `send_webxdc_realtime_*()` functions aren't called for the given `instance_message_id`
* anymore until the app is open again.
*/
public void leaveWebxdcRealtime(Integer accountId, Integer instanceMessageId) throws RpcException {
transport.call("leave_webxdc_realtime", mapper.valueToTree(accountId), mapper.valueToTree(instanceMessageId));
}
/* 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. */
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. */
public void endCall(Integer accountId, Integer msgId) throws RpcException {
transport.call("end_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
}
/* 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. */
public String iceServers(Integer accountId) throws RpcException {
return transport.callForResult(new TypeReference<String>(){}, "ice_servers", mapper.valueToTree(accountId));
}
/**
* Makes an HTTP GET request and returns a response.
* <p>
* `url` is the HTTP or HTTPS URL.
*/
public HttpResponse getHttpResponse(Integer accountId, String url) throws RpcException {
return transport.callForResult(new TypeReference<HttpResponse>(){}, "get_http_response", mapper.valueToTree(accountId), mapper.valueToTree(url));
}
/**
* Send a reaction to message.
* <p>
* Reaction is a string of emojis separated by spaces. Reaction to a
* single message can be sent multiple times. The last reaction
* received overrides all previously received reactions. It is
* possible to remove all reactions by sending an empty string.
*/
public Integer sendReaction(Integer accountId, Integer messageId, java.util.List<String> reaction) throws RpcException {
return transport.callForResult(new TypeReference<Integer>(){}, "send_reaction", mapper.valueToTree(accountId), mapper.valueToTree(messageId), mapper.valueToTree(reaction));
}
/* 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));
}
/* 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));
}
}
@@ -0,0 +1,8 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc;
public class RpcException extends Exception {
public RpcException(String message) { super(message); }
}
@@ -0,0 +1,19 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class CallInfo {
/* True if SDP offer has a video. */
public Boolean hasVideo;
/**
* SDP offer.
* <p>
* Can be used to manually answer the call even if incoming call event was missed.
*/
public String sdpOffer;
/**
* Call state.
* <p>
* For example, if the call is accepted, active, canceled, declined etc.
*/
public CallState state;
}
@@ -0,0 +1,48 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
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 = CallState.Alerting.class, name="Alerting"), @Type(value = CallState.Active.class, name="Active"), @Type(value = CallState.Completed.class, name="Completed"), @Type(value = CallState.Missed.class, name="Missed"), @Type(value = CallState.Declined.class, name="Declined"), @Type(value = CallState.Canceled.class, name="Canceled")})
public abstract class CallState {
/**
* Fresh incoming or outgoing call that is still ringing.
* <p>
* There is no separate state for outgoing call that has been dialled but not ringing on the other side yet as we don't know whether the other side received our call.
*/
public static class Alerting extends CallState {
}
/* Active call. */
public static class Active extends CallState {
}
/* Completed call that was once active and then was terminated for any reason. */
public static class Completed extends CallState {
/* 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. */
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. */
public static class Declined extends CallState {
}
/**
* Outgoing call that has been canceled on our side before receiving a response.
* <p>
* Incoming calls cannot be canceled, on the receiver side canceled calls usually result in missed calls.
*/
public static class Canceled extends CallState {
}
}
@@ -0,0 +1,13 @@
/* Autogenerated file, do not edit manually */
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,
/* 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. */
acceptInvalidCertificates,
}
@@ -0,0 +1,51 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/**
* Login parameters entered by the user.
* <p>
* Usually it will be enough to only set `addr` and `password`, and all the other settings will be autoconfigured.
*/
public class EnteredLoginParam {
/* Email address. */
public String addr;
/* 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. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer imapPort;
/* Imap socket security. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Socket imapSecurity;
/* Imap server hostname or IP address. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imapServer;
/* 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 */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Boolean oauth2;
/* Password. */
public String password;
/**
* SMTP Password.
* <p>
* Only needs to be specified if different than IMAP password.
*/
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpPassword;
/* SMTP server port. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer smtpPort;
/* SMTP socket security. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Socket smtpSecurity;
/* SMTP server hostname or IP address. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpServer;
/* SMTP username. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpUser;
}
@@ -0,0 +1,13 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class HttpResponse {
/* base64-encoded response body. */
public String blob;
/* 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". */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String mimetype;
}
@@ -0,0 +1,12 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/* A single reaction emoji. */
public class Reaction {
/* Emoji frequency. */
public Integer count;
/* Emoji. */
public String emoji;
/* True if we reacted with this emoji. */
public Boolean isFromSelf;
}
@@ -0,0 +1,10 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/* Structure representing all reactions to a particular message. */
public class Reactions {
/* 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. */
public java.util.Map<String, java.util.List<String>> reactionsByContact;
}
@@ -0,0 +1,16 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum Socket {
/* Unspecified socket security, select automatically. */
automatic,
/* TLS connection. */
ssl,
/* STARTTLS connection. */
starttls,
/* No TLS, plaintext connection. */
plain,
}
@@ -0,0 +1,20 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class VcardContact {
/* Email address. */
public String addr;
/* Contact color as hex string. */
public String color;
/* The contact's name, or the email address if no name was given. */
public String displayName;
/* Public PGP key in Base64. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String key;
/* Profile image in Base64. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
/* Last update timestamp. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer timestamp;
}
@@ -1,4 +1,5 @@
package com.b44t.messenger.util.concurrent;
/* Autogenerated file, do not edit manually */
package chat.delta.util;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@@ -10,4 +11,4 @@ public interface ListenableFuture<T> extends Future<T> {
public void onSuccess(T result);
public void onFailure(ExecutionException e);
}
}
}
@@ -1,4 +1,5 @@
package com.b44t.messenger.util.concurrent;
/* Autogenerated file, do not edit manually */
package chat.delta.util;
import java.util.LinkedList;
import java.util.List;
@@ -133,4 +134,4 @@ public class SettableFuture<T> implements ListenableFuture<T> {
if (exception != null) listener.onFailure(new ExecutionException(exception));
else listener.onSuccess(result);
}
}
}
@@ -50,4 +50,14 @@ public class DcAccounts {
private native long getJsonrpcInstanceCPtr ();
private native long getAccountCPtr (int accountId);
private native long getSelectedAccountCPtr ();
public boolean isAllChatmail() {
for (int accountId : getAll()) {
DcContext dcContext = getAccount(accountId);
if (!dcContext.isChatmail()) {
return false;
}
}
return true;
}
}
+8 -9
View File
@@ -6,7 +6,8 @@ public class DcChat {
public static final int DC_CHAT_TYPE_SINGLE = 100;
public static final int DC_CHAT_TYPE_GROUP = 120;
public static final int DC_CHAT_TYPE_MAILINGLIST = 140;
public static final int DC_CHAT_TYPE_BROADCAST = 160;
public static final int DC_CHAT_TYPE_OUT_BROADCAST = 160;
public static final int DC_CHAT_TYPE_IN_BROADCAST = 165;
public static final int DC_CHAT_NO_CHAT = 0;
public final static int DC_CHAT_ID_ARCHIVED_LINK = 6;
@@ -38,12 +39,11 @@ public class DcChat {
public native String getMailinglistAddr();
public native String getProfileImage ();
public native int getColor ();
public native boolean isEncrypted ();
public native boolean isUnpromoted ();
public native boolean isSelfTalk ();
public native boolean isDeviceTalk ();
public native boolean canSend ();
public native boolean isProtected ();
public native boolean isProtectionBroken();
public native boolean isSendingLocations();
public native boolean isMuted ();
public native boolean isContactRequest ();
@@ -53,19 +53,18 @@ public class DcChat {
public boolean isMultiUser() {
int type = getType();
return type == DC_CHAT_TYPE_GROUP || type == DC_CHAT_TYPE_MAILINGLIST || type == DC_CHAT_TYPE_BROADCAST;
return type != DC_CHAT_TYPE_SINGLE;
}
public boolean isMailingList() {
return getType() == DC_CHAT_TYPE_MAILINGLIST;
}
public boolean isBroadcast() {
return getType() == DC_CHAT_TYPE_BROADCAST;
public boolean isInBroadcast() {
return getType() == DC_CHAT_TYPE_IN_BROADCAST;
}
public boolean isHalfBlocked() {
return isProtectionBroken() || isContactRequest();
public boolean isOutBroadcast() {
return getType() == DC_CHAT_TYPE_OUT_BROADCAST;
}
// working with raw c-data
@@ -10,8 +10,9 @@ public class DcContact {
public final static int DC_CONTACT_ID_NEW_GROUP = -2; // - " -
public final static int DC_CONTACT_ID_ADD_MEMBER = -3; // - " -
public final static int DC_CONTACT_ID_QR_INVITE = -4; // - " -
public final static int DC_CONTACT_ID_NEW_BROADCAST_LIST = -5; // - " -
public final static int DC_CONTACT_ID_NEW_BROADCAST = -5; // - " -
public final static int DC_CONTACT_ID_ADD_ACCOUNT = -6; // - " -
public final static int DC_CONTACT_ID_NEW_UNENCRYPTED_GROUP = -7; // - " -
public DcContact(long contactCPtr) {
this.contactCPtr = contactCPtr;
@@ -50,7 +51,6 @@ public class DcContact {
public native String getAuthName ();
public native String getDisplayName ();
public native String getAddr ();
public native String getNameNAddr ();
public native String getProfileImage();
public native int getColor ();
public native String getStatus ();
@@ -58,6 +58,7 @@ public class DcContact {
public native boolean wasSeenRecently();
public native boolean isBlocked ();
public native boolean isVerified ();
public native boolean isKeyContact ();
public native int getVerifierId ();
public native boolean isBot ();
@@ -17,6 +17,7 @@ public class DcContext {
public final static int DC_EVENT_MSG_READ = 2015;
public final static int DC_EVENT_CHAT_MODIFIED = 2020;
public final static int DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED = 2021;
public final static int DC_EVENT_CHAT_DELETED = 2023;
public final static int DC_EVENT_CONTACTS_CHANGED = 2030;
public final static int DC_EVENT_LOCATION_CHANGED = 2035;
public final static int DC_EVENT_CONFIGURE_PROGRESS = 2041;
@@ -30,6 +31,10 @@ public class DcContext {
public final static int DC_EVENT_WEBXDC_INSTANCE_DELETED = 2121;
public final static int DC_EVENT_WEBXDC_REALTIME_DATA = 2150;
public final static int DC_EVENT_ACCOUNTS_BACKGROUND_FETCH_DONE = 2200;
public final static int DC_EVENT_INCOMING_CALL = 2550;
public final static int DC_EVENT_INCOMING_CALL_ACCEPTED = 2560;
public final static int DC_EVENT_OUTGOING_CALL_ACCEPTED = 2570;
public final static int DC_EVENT_CALL_ENDED = 2580;
public final static int DC_IMEX_EXPORT_SELF_KEYS = 1;
public final static int DC_IMEX_IMPORT_SELF_KEYS = 2;
@@ -38,6 +43,7 @@ public class DcContext {
public final static int DC_GCL_VERIFIED_ONLY = 1;
public final static int DC_GCL_ADD_SELF = 2;
public final static int DC_GCL_ADDRESS = 0x04;
public final static int DC_GCL_ARCHIVED_ONLY = 0x01;
public final static int DC_GCL_NO_SPECIALS = 0x02;
public final static int DC_GCL_ADD_ALLDONE_HINT = 0x04;
@@ -47,6 +53,7 @@ public class DcContext {
public final static int DC_QR_ASK_VERIFYCONTACT = 200;
public final static int DC_QR_ASK_VERIFYGROUP = 202;
public final static int DC_QR_ASK_JOIN_BROADCAST= 204;
public final static int DC_QR_FPR_OK = 210;
public final static int DC_QR_FPR_MISMATCH = 220;
public final static int DC_QR_FPR_WITHOUT_ADDR = 230;
@@ -65,9 +72,6 @@ public class DcContext {
public final static int DC_QR_REVIVE_VERIFYGROUP = 512;
public final static int DC_QR_LOGIN = 520;
public final static int DC_LP_AUTH_OAUTH2 = 0x2;
public final static int DC_LP_AUTH_NORMAL = 0x4;
public final static int DC_SOCKET_AUTO = 0;
public final static int DC_SOCKET_SSL = 1;
public final static int DC_SOCKET_STARTTLS = 2;
@@ -118,7 +122,6 @@ public class DcContext {
public native void setStockTranslation (int stockId, String translation);
public native String getBlobdir ();
public native String getLastError ();
public native void configure ();
public native void stopOngoingProcess ();
public native int isConfigured ();
public native boolean open (String passphrase);
@@ -142,9 +145,7 @@ public class DcContext {
public native String getInfo ();
public native int getConnectivity ();
public native String getConnectivityHtml ();
public native String getOauth2Url (String addr, String redirectUrl);
public native String initiateKeyTransfer ();
public native boolean continueKeyTransfer (int msg_id, String setup_code);
public native void imex (int what, String dir);
public native String imexHasBackup (String dir);
public DcBackupProvider newBackupProvider () { return new DcBackupProvider(newBackupProviderCPtr()); }
@@ -167,7 +168,7 @@ public class DcContext {
public native void setChatVisibility (int chat_id, int visibility);
public native int getChatIdByContactId (int contact_id);
public native int createChatByContactId(int contact_id);
public native int createGroupChat (boolean verified, String name);
public native int createGroupChat (String name);
public native int createBroadcastList ();
public native boolean isContactInChat (int chat_id, int contact_id);
public native int addContactToChat (int chat_id, int contact_id);
@@ -201,7 +202,6 @@ public class DcContext {
public native boolean resendMsgs (int msg_ids[]);
public native int sendMsg (int chat_id, DcMsg msg);
public native int sendTextMsg (int chat_id, String text);
public native int sendVideochatInvitation(int chat_id);
public native boolean sendWebxdcStatusUpdate(int msg_id, String payload);
public native String getWebxdcStatusUpdates(int msg_id, int last_known_serial);
public native void setWebxdcIntegration (String file);
@@ -246,23 +246,6 @@ public class DcContext {
return displayname;
}
public boolean isCommunity() {
return getConfigInt("is_community") == 1;
}
public void setCommunityMode(boolean enable) {
setConfig("is_community", enable? "1" : null);
}
public String getCommunityUser() {
String name = getConfig("ui.community.selfname");
return name == null? "" : name;
}
public void setCommunityUser(String name) {
setConfig("ui.community.selfname", name);
}
public boolean isChatmail() {
return getConfigInt("is_chatmail") == 1;
}
@@ -275,15 +258,6 @@ public class DcContext {
setConfigInt("is_muted", muted? 1 : 0);
}
public boolean isGmailOauth2Addr(String addr) {
final String oauth2url = getOauth2Url(addr, "chat.delta:/foo");
return isGmailOauth2Url(oauth2url);
}
public boolean isGmailOauth2Url(String oauth2url) {
return oauth2url.startsWith("https://accounts.google.com/");
}
public void restartIo() {
if (!isEnabled()) return;
stopIo();
+7 -9
View File
@@ -18,7 +18,7 @@ public class DcMsg {
public final static int DC_MSG_VOICE = 41;
public final static int DC_MSG_VIDEO = 50;
public final static int DC_MSG_FILE = 60;
public final static int DC_MSG_VIDEOCHAT_INVITATION = 70;
public final static int DC_MSG_CALL = 71;
public final static int DC_MSG_WEBXDC = 80;
public final static int DC_MSG_VCARD = 90;
@@ -33,9 +33,9 @@ public class DcMsg {
public final static int DC_INFO_LOCATION_ONLY = 9;
public final static int DC_INFO_EPHEMERAL_TIMER_CHANGED = 10;
public final static int DC_INFO_PROTECTION_ENABLED = 11;
public final static int DC_INFO_PROTECTION_DISABLED = 12;
public final static int DC_INFO_INVALID_UNENCRYPTED_MAIL = 13;
public final static int DC_INFO_WEBXDC_INFO_MESSAGE = 32;
public final static int DC_INFO_CHAT_E2EE = 50;
public final static int DC_STATE_UNDEFINED = 0;
public final static int DC_STATE_IN_FRESH = 10;
@@ -123,6 +123,7 @@ public class DcMsg {
private native int getViewType ();
public int getType () { return getDownloadState()==DC_DOWNLOAD_DONE? getViewType() : DC_MSG_TEXT; }
public native int getInfoType ();
public native int getInfoContactId ();
public native int getState ();
public native int getDownloadState ();
public native int getChatId ();
@@ -142,20 +143,18 @@ public class DcMsg {
public native byte[] getWebxdcBlob (String filename);
public JSONObject getWebxdcInfo () {
try {
return new JSONObject(getWebxdcInfoJson());
String json = getWebxdcInfoJson();
if (json != null && !json.isEmpty()) return new JSONObject(json);
} catch(Exception e) {
e.printStackTrace();
return new JSONObject();
}
return new JSONObject();
}
public native String getWebxdcHref ();
public native boolean isForwarded ();
public native boolean isInfo ();
public native boolean isSetupMessage ();
public native boolean hasHtml ();
public native String getSetupCodeBegin ();
public native String getVideochatUrl ();
public native int getVideochatType ();
public native void setText (String text);
public native void setSubject (String text);
public native void setHtml (String text);
@@ -169,7 +168,6 @@ public class DcMsg {
public native String getQuotedText ();
public native String getError ();
public native String getOverrideSenderName();
public native int getSenderColor();
public native boolean isEdited ();
public String getSenderName(DcContact dcContact) {
@@ -196,7 +194,7 @@ public class DcMsg {
public boolean canSave() {
// saving info-messages out of context results in confusion, see https://github.com/deltachat/deltachat-ios/issues/2567
return !isInfo() && getType() != DC_MSG_VIDEOCHAT_INVITATION;
return !isInfo();
}
public File getFileAsFile() {
@@ -0,0 +1,22 @@
package com.b44t.messenger;
import chat.delta.rpc.BaseTransport;
/* RPC transport over C FFI */
public class FFITransport extends BaseTransport {
private final DcJsonrpcInstance dcJsonrpcInstance;
public FFITransport(DcJsonrpcInstance dcJsonrpcInstance) {
this.dcJsonrpcInstance = dcJsonrpcInstance;
}
@Override
protected void sendRequest(String jsonRequest) {
dcJsonrpcInstance.request(jsonRequest);
}
@Override
protected String getResponse() {
return dcJsonrpcInstance.getNextResponse();
}
}
@@ -1,33 +0,0 @@
package com.b44t.messenger.rpc;
import android.util.Base64;
public class HttpResponse {
// base64-encoded response body.
private final String blob;
// MIME type, e.g. "text/plain" or "text/html".
private final String mimetype;
// Encoding, e.g. "utf-8".
private final String encoding;
public HttpResponse(String blob, String mimetype, String encoding) {
this.blob = blob;
this.mimetype = mimetype;
this.encoding = encoding;
}
public byte[] getBlob() {
if (blob == null) {
return null;
}
return Base64.decode(blob, Base64.NO_WRAP | Base64.NO_PADDING);
}
public String getMimetype() {
return mimetype;
}
public String getEncoding() {
return encoding;
}
}
@@ -1,39 +0,0 @@
package com.b44t.messenger.rpc;
import androidx.annotation.Nullable;
public class Reaction {
// The reaction emoji string.
private final String emoji;
// The count of users that have reacted with this reaction.
private final int count;
// true if self-account reacted with this reaction, false otherwise.
private final boolean isFromSelf;
public Reaction(String emoji, int count, boolean isFromSelf) {
this.emoji = emoji;
this.count = count;
this.isFromSelf = isFromSelf;
}
public String getEmoji() {
return emoji;
}
public int getCount() {
return count;
}
public boolean isFromSelf() {
return isFromSelf;
}
@Override
public boolean equals(@Nullable Object obj) {
if (obj instanceof Reaction) {
Reaction reaction = (Reaction) obj;
return emoji.equals(reaction.getEmoji()) && count == reaction.getCount() && isFromSelf == reaction.isFromSelf();
}
return false;
}
}
@@ -1,26 +0,0 @@
package com.b44t.messenger.rpc;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Reactions {
// Map from a contact to it's reaction to message.
private final HashMap<Integer, String[]> reactionsByContact;
// Unique reactions, sorted in descending order.
private final ArrayList<Reaction> reactions;
public Reactions(HashMap<Integer, String[]> reactionsByContact, ArrayList<Reaction> reactions) {
this.reactionsByContact = reactionsByContact;
this.reactions = reactions;
}
public Map<Integer, String[]> getReactionsByContact() {
return reactionsByContact;
}
public List<Reaction> getReactions() {
return reactions;
}
}
@@ -1,156 +0,0 @@
package com.b44t.messenger.rpc;
import com.b44t.messenger.DcJsonrpcInstance;
import com.b44t.messenger.util.concurrent.SettableFuture;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
public class Rpc {
private final Map<Integer, SettableFuture<JsonElement>> requestFutures = new ConcurrentHashMap<>();
private final DcJsonrpcInstance dcJsonrpcInstance;
private int requestId = 0;
private final Gson gson = new GsonBuilder().serializeNulls().create();
public Rpc(DcJsonrpcInstance dcJsonrpcInstance) {
this.dcJsonrpcInstance = dcJsonrpcInstance;
}
private void processResponse() throws JsonSyntaxException {
String jsonResponse = dcJsonrpcInstance.getNextResponse();
Response response = gson.fromJson(jsonResponse, Response.class);
if (response.id == 0) { // Got JSON-RPC notification/event, ignore
return;
}
SettableFuture<JsonElement> future = requestFutures.remove(response.id);
if (future == null) { // Got a response with unknown ID, ignore
return;
}
if (response.error != null) {
future.setException(new RpcException(response.error.toString()));
} else if (response.result != null) {
future.set(response.result);
} else {
future.setException(new RpcException("Got JSON-RPC response without result or error: " + jsonResponse));
}
}
public void start() {
new Thread(() -> {
while (true) {
try {
processResponse();
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
}
}, "jsonrpcThread").start();
}
public SettableFuture<JsonElement> call(String method, Object... params) {
int id;
synchronized (this) {
id = ++requestId;
}
String jsonRequest = gson.toJson(new Request(method, params, id));
SettableFuture<JsonElement> future = new SettableFuture<>();
requestFutures.put(id, future);
dcJsonrpcInstance.request(jsonRequest);
return future;
}
public JsonElement getResult(String method, Object... params) throws RpcException {
try {
return call(method, params).get();
} catch (ExecutionException e) {
throw (RpcException)e.getCause();
} catch (InterruptedException e) {
throw new RpcException(e.getMessage());
}
}
public List<VcardContact> parseVcard(String path) throws RpcException {
TypeToken<List<VcardContact>> listType = new TypeToken<List<VcardContact>>(){};
return gson.fromJson(getResult("parse_vcard", path), listType.getType());
}
public String makeVcard(int accountId, int... contacts) throws RpcException {
return gson.fromJson(getResult("make_vcard", accountId, contacts), String.class);
}
public List<Integer> importVcard(int accountId, String path) throws RpcException {
TypeToken<List<Integer>> listType = new TypeToken<List<Integer>>(){};
return gson.fromJson(getResult("import_vcard", accountId, path), listType.getType());
}
public HttpResponse getHttpResponse(int accountId, String url) throws RpcException {
return gson.fromJson(getResult("get_http_response", accountId, url), HttpResponse.class);
}
public Reactions getMsgReactions(int accountId, int msgId) throws RpcException {
return gson.fromJson(getResult("get_message_reactions", accountId, msgId), Reactions.class);
}
public int sendReaction(int accountId, int msgId, String... reaction) throws RpcException {
return getResult("send_reaction", accountId, msgId, reaction).getAsInt();
}
public int draftSelfReport(int accountId) throws RpcException {
return getResult("draft_self_report", accountId).getAsInt();
}
public void sendWebxdcRealtimeData(Integer accountId, Integer instanceMsgId, List<Integer> data) throws RpcException {
getResult("send_webxdc_realtime_data", accountId, instanceMsgId, data);
}
public void sendWebxdcRealtimeAdvertisement(Integer accountId, Integer instanceMsgId) throws RpcException {
getResult("send_webxdc_realtime_advertisement", accountId, instanceMsgId);
}
public void leaveWebxdcRealtime(Integer accountId, Integer instanceMessageId) throws RpcException {
getResult("leave_webxdc_realtime", accountId, instanceMessageId);
}
public int getAccountFileSize(int accountId) throws RpcException {
return getResult("get_account_file_size", accountId).getAsInt();
}
public int addAccount() throws RpcException {
return getResult("add_account").getAsInt();
}
private static class Request {
private final String jsonrpc = "2.0";
public final String method;
public final Object[] params;
public final int id;
public Request(String method, Object[] params, int id) {
this.method = method;
this.params = params;
this.id = id;
}
}
private static class Response {
public final int id;
public final JsonElement result;
public final JsonElement error;
public Response(int id, JsonElement result, JsonElement error) {
this.id = id;
this.result = result;
this.error = error;
}
}
}
@@ -1,11 +0,0 @@
package com.b44t.messenger.rpc;
/**
* An exception occurred while processing a request in ArcaneChat core.
**/
public class RpcException extends Exception {
public RpcException(String message) {
super(message);
}
}
@@ -1,60 +0,0 @@
package com.b44t.messenger.rpc;
import android.util.Base64;
public class VcardContact {
// Email address.
private final String addr;
// The contact's name, or the email address if no name was given.
private final String displayName;
// Public PGP key in Base64.
private final String key;
// Profile image in Base64.
private final String profileImage;
// Contact color in HTML color format.
private final String color;
// Last update timestamp.
private final int timestamp;
public VcardContact(String addr, String displayName, String key, String profileImage, String color, int timestamp) {
this.addr = addr;
this.displayName = displayName;
this.key = key;
this.profileImage = profileImage;
this.color = color;
this.timestamp = timestamp;
}
public String getAddr() {
return addr;
}
public String getDisplayName() {
return displayName;
}
public byte[] getKey() {
return key == null? null : Base64.decode(key, Base64.NO_WRAP | Base64.NO_PADDING);
}
public boolean hasProfileImage() {
return profileImage != null;
}
public byte[] getProfileImage() {
return profileImage == null? null : Base64.decode(profileImage, Base64.NO_WRAP | Base64.NO_PADDING);
}
public String getColor() {
return color;
}
public int getTimestamp() {
return timestamp;
}
}
@@ -0,0 +1,196 @@
package org.thoughtcrime.securesms;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent;
import com.b44t.messenger.DcMsg;
import com.google.android.material.tabs.TabLayout;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.ArrayList;
public class AllMediaActivity extends PassphraseRequiredActionBarActivity
implements DcEventCenter.DcEventDelegate
{
public static final String CHAT_ID_EXTRA = "chat_id";
public static final String CONTACT_ID_EXTRA = "contact_id";
public static final String FORCE_GALLERY = "force_gallery";
static class TabData {
final int title;
final int type1;
final int type2;
final int type3;
TabData(int title, int type1, int type2, int type3) {
this.title = title;
this.type1 = type1;
this.type2 = type2;
this.type3 = type3;
}
};
private DcContext dcContext;
private int chatId;
private int contactId;
private final ArrayList<TabData> tabs = new ArrayList<>();
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onPreCreate() {
dynamicTheme = new DynamicNoActionBarTheme();
super.onPreCreate();
dcContext = DcHelper.getContext(this);
}
@Override
protected void onCreate(Bundle bundle, boolean ready) {
tabs.add(new TabData(R.string.webxdc_apps, DcMsg.DC_MSG_WEBXDC, 0, 0));
tabs.add(new TabData(R.string.tab_gallery, DcMsg.DC_MSG_IMAGE, DcMsg.DC_MSG_GIF, DcMsg.DC_MSG_VIDEO));
tabs.add(new TabData(R.string.audio, DcMsg.DC_MSG_AUDIO, DcMsg.DC_MSG_VOICE, 0));
tabs.add(new TabData(R.string.files, DcMsg.DC_MSG_FILE, 0, 0));
setContentView(R.layout.all_media_activity);
initializeResources();
setSupportActionBar(this.toolbar);
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null) {
supportActionBar.setDisplayHomeAsUpEnabled(true);
supportActionBar.setTitle(isGlobalGallery() ? R.string.menu_all_media : R.string.apps_and_media);
}
this.tabLayout.setupWithViewPager(viewPager);
this.viewPager.setAdapter(new AllMediaPagerAdapter(getSupportFragmentManager()));
if (getIntent().getBooleanExtra(FORCE_GALLERY, false)) {
this.viewPager.setCurrentItem(1, false);
}
DcEventCenter eventCenter = DcHelper.getEventCenter(this);
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
}
@Override
public void onDestroy() {
DcHelper.getEventCenter(this).removeObservers(this);
super.onDestroy();
}
@Override
public void handleEvent(@NonNull DcEvent event) {
}
private void initializeResources() {
chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, 0);
contactId = getIntent().getIntExtra(CONTACT_ID_EXTRA, 0);
if (contactId!=0) {
chatId = dcContext.getChatIdByContactId(contactId);
}
if(chatId!=0) {
DcChat dcChat = dcContext.getChat(chatId);
if(!dcChat.isMultiUser()) {
final int[] members = dcContext.getChatContacts(chatId);
contactId = members.length>=1? members[0] : 0;
}
}
this.viewPager = ViewUtil.findById(this, R.id.pager);
this.toolbar = ViewUtil.findById(this, R.id.toolbar);
this.tabLayout = ViewUtil.findById(this, R.id.tab_layout);
}
private boolean isGlobalGallery() {
return contactId==0 && chatId==0;
}
private class AllMediaPagerAdapter extends FragmentStatePagerAdapter {
private Object currentFragment = null;
AllMediaPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.setPrimaryItem(container, position, object);
if (currentFragment != null && currentFragment != object) {
ActionMode action = null;
if (currentFragment instanceof MessageSelectorFragment) {
action = ((MessageSelectorFragment) currentFragment).getActionMode();
}
if (action != null) {
action.finish();
}
}
currentFragment = object;
}
@NonNull
@Override
public Fragment getItem(int position) {
TabData data = tabs.get(position);
Fragment fragment;
Bundle args = new Bundle();
if (data.type1 == DcMsg.DC_MSG_IMAGE) {
fragment = new AllMediaGalleryFragment();
args.putInt(AllMediaGalleryFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalGallery())? -1 : chatId);
} else {
fragment = new AllMediaDocumentsFragment();
args.putInt(AllMediaDocumentsFragment.CHAT_ID_EXTRA, (chatId==0&&!isGlobalGallery())? -1 : chatId);
args.putInt(AllMediaDocumentsFragment.VIEWTYPE1, data.type1);
args.putInt(AllMediaDocumentsFragment.VIEWTYPE2, data.type2);
}
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
return tabs.size();
}
@Override
public CharSequence getPageTitle(int position) {
return getString(tabs.get(position).title);
}
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
super.onOptionsItemSelected(item);
int itemId = item.getItemId();
if (itemId == android.R.id.home) {
finish();
return true;
}
return false;
}
}
@@ -25,7 +25,7 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
class ProfileDocumentsAdapter extends StickyHeaderGridAdapter {
class AllMediaDocumentsAdapter extends StickyHeaderGridAdapter {
private final Context context;
private final ItemClickListener itemClickListener;
@@ -57,9 +57,9 @@ class ProfileDocumentsAdapter extends StickyHeaderGridAdapter {
}
}
ProfileDocumentsAdapter(@NonNull Context context,
BucketedThreadMedia media,
ItemClickListener clickListener)
AllMediaDocumentsAdapter(@NonNull Context context,
BucketedThreadMedia media,
ItemClickListener clickListener)
{
this.context = context;
this.media = media;
@@ -102,16 +102,18 @@ class ProfileDocumentsAdapter extends StickyHeaderGridAdapter {
viewHolder.audioView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; });
viewHolder.audioView.disablePlayer(!selected.isEmpty());
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
viewHolder.date.setVisibility(View.VISIBLE);
}
else if (slide != null && slide.isWebxdcDocument()) {
viewHolder.audioView.setVisibility(View.GONE);
viewHolder.documentView.setVisibility(View.GONE);
viewHolder.webxdcView.setVisibility(View.VISIBLE);
viewHolder.webxdcView.setWebxdc(dcMsg, context.getString(R.string.webxdc_app));
viewHolder.webxdcView.setWebxdc(dcMsg, "");
viewHolder.webxdcView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
viewHolder.webxdcView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; });
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
viewHolder.date.setVisibility(View.GONE);
}
else if (slide != null && slide.hasDocument()) {
viewHolder.audioView.setVisibility(View.GONE);
@@ -122,11 +124,13 @@ class ProfileDocumentsAdapter extends StickyHeaderGridAdapter {
viewHolder.documentView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
viewHolder.documentView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; });
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg));
viewHolder.date.setVisibility(View.VISIBLE);
}
else {
viewHolder.documentView.setVisibility(View.GONE);
viewHolder.audioView.setVisibility(View.GONE);
viewHolder.webxdcView.setVisibility(View.GONE);
viewHolder.date.setVisibility(View.GONE);
}
viewHolder.itemView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; });
@@ -11,7 +11,6 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -33,21 +32,21 @@ import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Set;
public class ProfileDocumentsFragment
public class AllMediaDocumentsFragment
extends MessageSelectorFragment
implements LoaderManager.LoaderCallbacks<BucketedThreadMediaLoader.BucketedThreadMedia>,
ProfileDocumentsAdapter.ItemClickListener
AllMediaDocumentsAdapter.ItemClickListener
{
public static final String CHAT_ID_EXTRA = "chat_id";
public static final String SHOW_AUDIO_EXTRA = "show_audio";
public static final String SHOW_WEBXDC_EXTRA = "show_webxdc";
public static final String VIEWTYPE1 = "viewtype1";
public static final String VIEWTYPE2 = "viewtype2";
protected TextView noMedia;
protected RecyclerView recyclerView;
private StickyHeaderGridLayoutManager gridManager;
private final ActionModeCallback actionModeCallback = new ActionModeCallback();
private boolean showAudio;
private boolean showWebxdc;
private int viewtype1;
private int viewtype2;
protected int chatId;
@@ -57,8 +56,8 @@ public class ProfileDocumentsFragment
dcContext = DcHelper.getContext(getContext());
chatId = getArguments().getInt(CHAT_ID_EXTRA, -1);
showAudio = getArguments().getBoolean(SHOW_AUDIO_EXTRA, false);
showWebxdc = getArguments().getBoolean(SHOW_WEBXDC_EXTRA, false);
viewtype1 = getArguments().getInt(VIEWTYPE1, 0);
viewtype2 = getArguments().getInt(VIEWTYPE2, 0);
getLoaderManager().initLoader(0, null, this);
}
@@ -71,7 +70,7 @@ public class ProfileDocumentsFragment
this.noMedia = ViewUtil.findById(view, R.id.no_documents);
this.gridManager = new StickyHeaderGridLayoutManager(1);
this.recyclerView.setAdapter(new ProfileDocumentsAdapter(getContext(),
this.recyclerView.setAdapter(new AllMediaDocumentsAdapter(getContext(),
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
this));
this.recyclerView.setLayoutManager(gridManager);
@@ -105,32 +104,26 @@ public class ProfileDocumentsFragment
@Override
public Loader<BucketedThreadMediaLoader.BucketedThreadMedia> onCreateLoader(int i, Bundle bundle) {
if (showAudio) {
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_AUDIO, DcMsg.DC_MSG_VOICE, 0);
} else if (showWebxdc) {
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_WEBXDC, 0, 0);
} else {
return new BucketedThreadMediaLoader(getContext(), chatId, DcMsg.DC_MSG_FILE, 0, 0);
}
return new BucketedThreadMediaLoader(getContext(), chatId, viewtype1, viewtype2, 0);
}
@Override
public void onLoadFinished(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> loader, BucketedThreadMediaLoader.BucketedThreadMedia bucketedThreadMedia) {
((ProfileDocumentsAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
((ProfileDocumentsAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
((AllMediaDocumentsAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
((AllMediaDocumentsAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
noMedia.setVisibility(recyclerView.getAdapter().getItemCount() > 0 ? View.GONE : View.VISIBLE);
if (chatId == DC_CHAT_NO_CHAT) {
if (showWebxdc) {
if (viewtype1 == DcMsg.DC_MSG_WEBXDC) {
noMedia.setText(R.string.all_apps_empty_hint);
} else if (!showAudio){
} else if (viewtype1 == DcMsg.DC_MSG_FILE){
noMedia.setText(R.string.all_files_empty_hint);
} else {
noMedia.setText(R.string.tab_all_media_empty_hint);
}
} else if (showAudio) {
} else if (viewtype1 == DcMsg.DC_MSG_AUDIO) {
noMedia.setText(R.string.tab_audio_empty_hint);
} else if (showWebxdc) {
} else if (viewtype1 == DcMsg.DC_MSG_WEBXDC) {
noMedia.setText(R.string.tab_webxdc_empty_hint);
}
getActivity().invalidateOptionsMenu();
@@ -138,7 +131,7 @@ public class ProfileDocumentsFragment
@Override
public void onLoaderReset(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> cursorLoader) {
((ProfileDocumentsAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
((AllMediaDocumentsAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
}
@Override
@@ -156,7 +149,7 @@ public class ProfileDocumentsFragment
}
private void handleMediaMultiSelectClick(@NonNull DcMsg mediaRecord) {
ProfileDocumentsAdapter adapter = getListAdapter();
AllMediaDocumentsAdapter adapter = getListAdapter();
adapter.toggleSelection(mediaRecord);
if (adapter.getSelectedMediaCount() == 0) {
@@ -179,7 +172,7 @@ public class ProfileDocumentsFragment
}
if (dcMsg.getType() == DcMsg.DC_MSG_WEBXDC) {
DcHelper.openWebxdc(context, dcMsg);
WebxdcActivity.openWebxdcActivity(context, dcMsg);
} else {
DcHelper.openForViewOrShare(getActivity(), dcMsg.getId(), Intent.ACTION_VIEW);
}
@@ -188,7 +181,7 @@ public class ProfileDocumentsFragment
@Override
public void onMediaLongClicked(DcMsg mediaRecord) {
if (actionMode == null) {
((ProfileDocumentsAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
((AllMediaDocumentsAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(actionModeCallback);
}
@@ -221,22 +214,17 @@ public class ProfileDocumentsFragment
menu.findItem(R.id.menu_add_to_home_screen).setVisible(webxdcApp);
}
private ProfileDocumentsAdapter getListAdapter() {
return (ProfileDocumentsAdapter) recyclerView.getAdapter();
private AllMediaDocumentsAdapter getListAdapter() {
return (AllMediaDocumentsAdapter) recyclerView.getAdapter();
}
private class ActionModeCallback implements ActionMode.Callback {
private int originalStatusBarColor;
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.profile_context, menu);
mode.setTitle("1");
Window window = getActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
setCorrectMenuVisibility(menu);
return true;
}
@@ -285,8 +273,6 @@ public class ProfileDocumentsFragment
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
getListAdapter().clearSelection();
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
}
}
}
@@ -21,7 +21,7 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
class ProfileGalleryAdapter extends StickyHeaderGridAdapter {
class AllMediaGalleryAdapter extends StickyHeaderGridAdapter {
private final Context context;
private final GlideRequests glideRequests;
@@ -50,10 +50,10 @@ class ProfileGalleryAdapter extends StickyHeaderGridAdapter {
}
}
ProfileGalleryAdapter(@NonNull Context context,
@NonNull GlideRequests glideRequests,
BucketedThreadMedia media,
ItemClickListener clickListener)
AllMediaGalleryAdapter(@NonNull Context context,
@NonNull GlideRequests glideRequests,
BucketedThreadMedia media,
ItemClickListener clickListener)
{
this.context = context;
this.glideRequests = glideRequests;
@@ -11,7 +11,6 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -35,10 +34,10 @@ import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Set;
public class ProfileGalleryFragment
public class AllMediaGalleryFragment
extends MessageSelectorFragment
implements LoaderManager.LoaderCallbacks<BucketedThreadMediaLoader.BucketedThreadMedia>,
ProfileGalleryAdapter.ItemClickListener
AllMediaGalleryAdapter.ItemClickListener
{
public static final String CHAT_ID_EXTRA = "chat_id";
@@ -67,7 +66,7 @@ public class ProfileGalleryFragment
this.noMedia = ViewUtil.findById(view, R.id.no_images);
this.gridManager = new StickyHeaderGridLayoutManager(getCols());
this.recyclerView.setAdapter(new ProfileGalleryAdapter(getContext(),
this.recyclerView.setAdapter(new AllMediaGalleryAdapter(getContext(),
GlideApp.with(this),
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
this));
@@ -112,8 +111,8 @@ public class ProfileGalleryFragment
@Override
public void onLoadFinished(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> loader, BucketedThreadMediaLoader.BucketedThreadMedia bucketedThreadMedia) {
((ProfileGalleryAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
((ProfileGalleryAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
((AllMediaGalleryAdapter) recyclerView.getAdapter()).setMedia(bucketedThreadMedia);
((AllMediaGalleryAdapter) recyclerView.getAdapter()).notifyAllSectionsDataSetChanged();
noMedia.setVisibility(recyclerView.getAdapter().getItemCount() > 0 ? View.GONE : View.VISIBLE);
if (chatId == DC_CHAT_NO_CHAT) {
@@ -124,7 +123,7 @@ public class ProfileGalleryFragment
@Override
public void onLoaderReset(Loader<BucketedThreadMediaLoader.BucketedThreadMedia> cursorLoader) {
((ProfileGalleryAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
((AllMediaGalleryAdapter) recyclerView.getAdapter()).setMedia(new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()));
}
@Override
@@ -142,7 +141,7 @@ public class ProfileGalleryFragment
}
private void handleMediaMultiSelectClick(@NonNull DcMsg mediaRecord) {
ProfileGalleryAdapter adapter = getListAdapter();
AllMediaGalleryAdapter adapter = getListAdapter();
adapter.toggleSelection(mediaRecord);
if (adapter.getSelectedMediaCount() == 0) {
@@ -175,7 +174,7 @@ public class ProfileGalleryFragment
@Override
public void onMediaLongClicked(DcMsg mediaRecord) {
if (actionMode == null) {
((ProfileGalleryAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
((AllMediaGalleryAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord);
recyclerView.getAdapter().notifyDataSetChanged();
actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(actionModeCallback);
@@ -206,22 +205,17 @@ public class ProfileGalleryFragment
menu.findItem(R.id.menu_resend).setVisible(canResend);
}
private ProfileGalleryAdapter getListAdapter() {
return (ProfileGalleryAdapter) recyclerView.getAdapter();
private AllMediaGalleryAdapter getListAdapter() {
return (AllMediaGalleryAdapter) recyclerView.getAdapter();
}
private class ActionModeCallback implements ActionMode.Callback {
private int originalStatusBarColor;
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.profile_context, menu);
mode.setTitle("1");
Window window = getActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
setCorrectMenuVisibility(menu);
return true;
}
@@ -266,8 +260,6 @@ public class ProfileGalleryFragment
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
getListAdapter().clearSelection();
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
}
}
}
@@ -1,7 +1,5 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_VERIFIED_ONE_ON_ONE_CHATS;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -14,6 +12,7 @@ import android.util.Log;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.app.NotificationManagerCompat;
import androidx.multidex.MultiDexApplication;
import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
@@ -25,8 +24,7 @@ import com.b44t.messenger.DcAccounts;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent;
import com.b44t.messenger.DcEventEmitter;
import com.b44t.messenger.rpc.Rpc;
import com.b44t.messenger.rpc.RpcException;
import com.b44t.messenger.FFITransport;
import org.thoughtcrime.securesms.connect.AccountManager;
import org.thoughtcrime.securesms.connect.DcEventCenter;
@@ -53,6 +51,9 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.concurrent.TimeUnit;
import chat.delta.rpc.Rpc;
import chat.delta.rpc.RpcException;
public class ApplicationContext extends MultiDexApplication {
private static final String TAG = ApplicationContext.class.getSimpleName();
@@ -109,8 +110,14 @@ public class ApplicationContext extends MultiDexApplication {
System.loadLibrary("native-utils");
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
rpc = new Rpc(dcAccounts.getJsonrpcInstance());
rpc = new Rpc(new FFITransport(dcAccounts.getJsonrpcInstance()));
AccountManager.getInstance().migrateToDcAccounts(this);
// 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);
@@ -148,23 +155,6 @@ public class ApplicationContext extends MultiDexApplication {
Log.i("DeltaChat", "shutting down event handler");
}, "eventThread").start();
rpc.start();
// migrating global notifications pref. to per-account config, added 10/July/24
final String NOTIFICATION_PREF = "pref_key_enable_notifications";
boolean isMuted = !Prefs.getBooleanPreference(this, NOTIFICATION_PREF, true);
if (isMuted) {
for (int accId : dcAccounts.getAll()) {
dcAccounts.getAccount(accId).setMuted(true);
}
Prefs.removePreference(this, NOTIFICATION_PREF);
}
// /migrating global notifications
for (int accountId : allAccounts) {
dcAccounts.getAccount(accountId).setConfig(CONFIG_VERIFIED_ONE_ON_ONE_CHATS, "1");
}
// set translations before starting I/O to avoid sending untranslated MDNs (issue #2288)
DcHelper.setStockTranslations(this);
@@ -220,30 +210,30 @@ public class ApplicationContext extends MultiDexApplication {
}
}, filter);
// MAYBE TODO: i think the ApplicationContext is also created
// when the app is stated by FetchWorker timeouts.
// in this case, the normal threads shall not be started.
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest fetchWorkRequest = new PeriodicWorkRequest.Builder(
FetchWorker.class,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, // usually 15 minutes
TimeUnit.MILLISECONDS,
PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS, // the start may be preferred by up to 5 minutes, so we run every 10-15 minutes
TimeUnit.MILLISECONDS)
.setConstraints(constraints)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"FetchWorker",
ExistingPeriodicWorkPolicy.KEEP,
fetchWorkRequest);
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
if (Prefs.isPushEnabled(this)) {
FcmReceiveService.register(this);
} else {
Log.i(TAG, "FCM disabled at build time");
// MAYBE TODO: i think the ApplicationContext is also created
// when the app is stated by FetchWorker timeouts.
// in this case, the normal threads shall not be started.
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest fetchWorkRequest = new PeriodicWorkRequest.Builder(
FetchWorker.class,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, // usually 15 minutes
TimeUnit.MILLISECONDS,
PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS, // the start may be preferred by up to 5 minutes, so we run every 10-15 minutes
TimeUnit.MILLISECONDS)
.setConstraints(constraints)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"FetchWorker",
ExistingPeriodicWorkPolicy.KEEP,
fetchWorkRequest);
}
}
@@ -75,11 +75,14 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
@Override
protected void onCreate(Bundle icicle, boolean ready) {
setContentView(R.layout.activity_application_preferences);
//noinspection ConstantConditions
this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
if (icicle == null) {
initFragment(android.R.id.content, new ApplicationPreferenceFragment());
initFragment(R.id.fragment, new ApplicationPreferenceFragment());
}
}
@@ -91,7 +94,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
showBackupProvider();
return;
}
Fragment fragment = getSupportFragmentManager().findFragmentById(android.R.id.content);
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment);
fragment.onActivityResult(requestCode, resultCode, data);
}
@@ -271,7 +274,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(android.R.id.content, fragment);
fragmentTransaction.replace(R.id.fragment, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
@@ -9,9 +9,8 @@ public class AttachContactActivity extends ContactSelectionActivity {
public static final String CONTACT_ID_EXTRA = "contact_id_extra";
@Override
public void onContactSelected(int specialId, String addr) {
public void onContactSelected(int contactId) {
Intent intent = new Intent();
int contactId = DcHelper.getContext(this).lookupContactIdByAddr(addr);
intent.putExtra(CONTACT_ID_EXTRA, contactId);
setResult(RESULT_OK, intent);
finish();
@@ -7,10 +7,12 @@ import android.view.MenuItem;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import androidx.activity.EdgeToEdge;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.WindowCompat;
import androidx.fragment.app.Fragment;
import org.thoughtcrime.securesms.util.DynamicTheme;
@@ -31,7 +33,9 @@ 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
}
@Override
@@ -14,7 +14,6 @@ import androidx.appcompat.app.AlertDialog;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcMsg;
import com.b44t.messenger.rpc.Rpc;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.recipients.Recipient;
@@ -24,6 +23,8 @@ import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.HashSet;
import java.util.Set;
import chat.delta.rpc.Rpc;
public abstract class BaseConversationItem extends LinearLayout
implements BindableConversationItem
{
@@ -92,7 +93,7 @@ public abstract class BaseConversationItem extends LinearLayout
protected boolean shouldInterceptClicks(DcMsg messageRecord) {
return batchSelected.isEmpty()
&& (messageRecord.isFailed()
|| messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_DISABLED
|| messageRecord.getInfoType() == DcMsg.DC_INFO_CHAT_E2EE
|| messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_ENABLED
|| messageRecord.getInfoType() == DcMsg.DC_INFO_INVALID_UNENCRYPTED_MAIL);
}
@@ -140,9 +141,7 @@ public abstract class BaseConversationItem extends LinearLayout
.setPositiveButton(R.string.ok, null)
.create();
d.show();
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_DISABLED) {
DcHelper.showVerificationBrokenDialog(context, conversationRecipient.getName());
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_ENABLED) {
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_CHAT_E2EE || messageRecord.getInfoType() == DcMsg.DC_INFO_PROTECTION_ENABLED) {
DcHelper.showProtectionEnabledDialog(context);
} else if (messageRecord.getInfoType() == DcMsg.DC_INFO_INVALID_UNENCRYPTED_MAIL) {
DcHelper.showInvalidUnencryptedDialog(context);
@@ -10,9 +10,7 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.view.Menu;
@@ -333,18 +331,22 @@ public abstract class BaseConversationListFragment extends Fragment implements A
intent.putExtra(ShareActivity.EXTRA_CHAT_ID, chat.getId());
Recipient recipient = new Recipient(activity, chat);
Bitmap avatar = DirectShareUtil.getIconForShortcut(activity, recipient);
ShortcutInfoCompat shortcutInfoCompat = new ShortcutInfoCompat.Builder(activity, "chat-" + dcContext.getAccountId() + "-" + chat.getId())
Util.runOnAnyBackgroundThread(() -> {
Bitmap avatar = DirectShareUtil.getIconForShortcut(activity, recipient);
ShortcutInfoCompat shortcutInfoCompat = new ShortcutInfoCompat.Builder(activity, "chat-" + dcContext.getAccountId() + "-" + chat.getId())
.setShortLabel(chat.getName())
.setIcon(IconCompat.createWithAdaptiveBitmap(avatar))
.setIntent(intent)
.build();
if (!ShortcutManagerCompat.requestPinShortcut(activity, shortcutInfoCompat, null)) {
Toast.makeText(activity, "ErrAddToHomescreen: requestPinShortcut() failed", Toast.LENGTH_LONG).show();
} else if (actionMode != null) {
actionMode.finish();
actionMode = null;
}
Util.runOnMain(() -> {
if (!ShortcutManagerCompat.requestPinShortcut(activity, shortcutInfoCompat, null)) {
Toast.makeText(activity, "ErrAddToHomescreen: requestPinShortcut() failed", Toast.LENGTH_LONG).show();
} else if (actionMode != null) {
actionMode.finish();
actionMode = null;
}
});
});
}
private void updateActionModeItems(Menu menu) {
@@ -397,8 +399,6 @@ public abstract class BaseConversationListFragment extends Fragment implements A
mode.setTitle("1");
requireActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
return true;
}
@@ -441,10 +441,6 @@ public abstract class BaseConversationListFragment extends Fragment implements A
actionMode = null;
getListAdapter().initializeBatchMode(false);
TypedArray color = requireActivity().getTheme().obtainStyledAttributes(new int[]{android.R.attr.statusBarColor});
requireActivity().getWindow().setStatusBarColor(color.getColor(0, Color.BLACK));
color.recycle();
Context context = getContext();
if (context != null) {
fab.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_add_white_24dp));
@@ -30,9 +30,11 @@ public class BlockedContactsActivity extends PassphraseRequiredActionBarActivity
@Override
public void onCreate(Bundle bundle, boolean ready) {
setContentView(R.layout.activity_blocked_contacts);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(R.string.pref_blocked_contacts);
initFragment(android.R.id.content, new BlockedAndShareContactsFragment(), getIntent().getExtras());
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
initFragment(R.id.fragment, new BlockedAndShareContactsFragment(), getIntent().getExtras());
}
@Override
@@ -33,6 +33,8 @@ import java.util.List;
*/
public class ContactMultiSelectionActivity extends ContactSelectionActivity {
public static final String CONTACTS_EXTRA = "contacts_extra";
@Override
protected void onCreate(Bundle icicle, boolean ready) {
getIntent().putExtra(ContactSelectionListFragment.MULTI_SELECT, true);
@@ -68,12 +70,8 @@ public class ContactMultiSelectionActivity extends ContactSelectionActivity {
private void saveSelection() {
Intent resultIntent = getIntent();
List<String> selectedContacts = contactsFragment.getSelectedContacts();
if (selectedContacts != null) {
resultIntent.putStringArrayListExtra("contacts", new ArrayList<>(selectedContacts));
}
List<Integer> selectedContacts = contactsFragment.getSelectedContacts();
resultIntent.putIntegerArrayListExtra(CONTACTS_EXTRA, new ArrayList<>(selectedContacts));
setResult(RESULT_OK, resultIntent);
}
}
@@ -89,8 +89,8 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB
}
@Override
public void onContactSelected(int specialId, String number) {}
public void onContactSelected(int contactId) {}
@Override
public void onContactDeselected(int specialId, String number) {}
public void onContactDeselected(int contactId) {}
}
@@ -23,8 +23,6 @@ import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
@@ -35,7 +33,6 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
@@ -82,14 +79,14 @@ public class ContactSelectionListFragment extends Fragment
private static final String TAG = ContactSelectionListFragment.class.getSimpleName();
public static final String MULTI_SELECT = "multi_select";
public static final String SELECT_VERIFIED_EXTRA = "select_verified";
public static final String SELECT_UNENCRYPTED_EXTRA = "select_unencrypted_extra";
public static final String ALLOW_CREATION = "allow_creation";
public static final String PRESELECTED_CONTACTS = "preselected_contacts";
public static final int CONTACT_ADDR_RESULT_CODE = 61123;
private DcContext dcContext;
private Set<String> selectedContacts;
private Set<Integer> selectedContacts;
private OnContactSelectedListener onContactSelectedListener;
private String cursorFilter;
private RecyclerView recyclerView;
@@ -135,7 +132,6 @@ public class ContactSelectionListFragment extends Fragment
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.contact_list, menu);
getActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
setCorrectMenuVisibility(menu);
actionMode.setTitle("1");
return true;
@@ -166,10 +162,6 @@ public class ContactSelectionListFragment extends Fragment
public void onDestroyActionMode(ActionMode actionMode) {
ContactSelectionListFragment.this.actionMode = null;
getContactSelectionListAdapter().resetActionModeSelection();
TypedArray color = getActivity().getTheme().obtainStyledAttributes(new int[]{android.R.attr.statusBarColor});
getActivity().getWindow().setStatusBarColor(color.getColor(0, Color.BLACK));
color.recycle();
}
};
@@ -234,8 +226,8 @@ public class ContactSelectionListFragment extends Fragment
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
public @NonNull List<String> getSelectedContacts() {
List<String> selected = new LinkedList<>();
public @NonNull List<Integer> getSelectedContacts() {
List<Integer> selected = new LinkedList<>();
if (selectedContacts != null) {
selected.addAll(selectedContacts);
}
@@ -247,8 +239,8 @@ public class ContactSelectionListFragment extends Fragment
return getActivity().getIntent().getBooleanExtra(MULTI_SELECT, false);
}
private boolean isSelectVerfied() {
return getActivity().getIntent().getBooleanExtra(SELECT_VERIFIED_EXTRA, false);
private boolean isUnencrypted() {
return getActivity().getIntent().getBooleanExtra(SELECT_UNENCRYPTED_EXTRA, false);
}
private void initializeCursor() {
@@ -258,7 +250,7 @@ public class ContactSelectionListFragment extends Fragment
isMulti(),
true);
selectedContacts = adapter.getSelectedContacts();
ArrayList<String> preselectedContacts = getActivity().getIntent().getStringArrayListExtra(PRESELECTED_CONTACTS);
ArrayList<Integer> preselectedContacts = getActivity().getIntent().getIntegerArrayListExtra(PRESELECTED_CONTACTS);
if(preselectedContacts!=null) {
selectedContacts.addAll(preselectedContacts);
}
@@ -273,11 +265,11 @@ public class ContactSelectionListFragment extends Fragment
@Override
public Loader<DcContactsLoader.Ret> onCreateLoader(int id, Bundle args) {
final boolean allowCreation = getActivity().getIntent().getBooleanExtra(ALLOW_CREATION, true);
final boolean addCreateContactLink = allowCreation && !isSelectVerfied();
final boolean addCreateContactLink = allowCreation && isUnencrypted();
final boolean addCreateGroupLinks = allowCreation && !isRelayingMessageContent(getActivity()) && !isMulti();
final boolean addScanQRLink = allowCreation && !isMulti();
final int listflags = DcContext.DC_GCL_ADD_SELF;
final int listflags = DcContext.DC_GCL_ADD_SELF | (isUnencrypted()? DcContext.DC_GCL_ADDRESS : 0);
return new DcContactsLoader(getActivity(), listflags, cursorFilter, addCreateGroupLinks, addCreateContactLink, addScanQRLink, false);
}
@@ -336,10 +328,9 @@ public class ContactSelectionListFragment extends Fragment
}
return;
}
int specialId = contact.getSpecialId();
String addr = contact.getNumber();
if (!isMulti() || !selectedContacts.contains(addr)) {
if (specialId == DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT) {
int contactId = contact.getSpecialId();
if (!isMulti() || !selectedContacts.contains(contactId)) {
if (contactId == DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT) {
Intent intent = new Intent(getContext(), NewContactActivity.class);
if (dcContext.mayBeValidAddr(cursorFilter)) {
intent.putExtra(NewContactActivity.ADDR_EXTRA, cursorFilter);
@@ -352,27 +343,16 @@ public class ContactSelectionListFragment extends Fragment
return;
}
if (isSelectVerfied() && !contact.getDcContact().isVerified()) {
new AlertDialog.Builder(getActivity())
.setMessage(R.string.verified_contact_required_explain)
.setNeutralButton(R.string.learn_more, (d, w) -> DcHelper.openHelp(getActivity(), "#howtoe2ee"))
.setNegativeButton(R.string.qrscan_title, (d, w) -> getActivity().startActivity(new Intent(getActivity(), QrActivity.class)))
.setPositiveButton(R.string.ok, null)
.setCancelable(true)
.show();
return;
}
selectedContacts.add(addr);
selectedContacts.add(contactId);
contact.setChecked(true);
if (onContactSelectedListener != null) {
onContactSelectedListener.onContactSelected(specialId, addr);
onContactSelectedListener.onContactSelected(contactId);
}
} else {
selectedContacts.remove(addr);
selectedContacts.remove(contactId);
contact.setChecked(false);
if (onContactSelectedListener != null) {
onContactSelectedListener.onContactDeselected(specialId, addr);
onContactSelectedListener.onContactDeselected(contactId);
}
}
}
@@ -398,8 +378,8 @@ public class ContactSelectionListFragment extends Fragment
}
public interface OnContactSelectedListener {
void onContactSelected(int specialId, String number);
void onContactDeselected(int specialId, String number);
void onContactSelected(int contactId);
void onContactDeselected(int contactId);
}
@Override
@@ -413,7 +393,10 @@ public class ContactSelectionListFragment extends Fragment
public void onActivityResult(int reqCode, int resultCode, final Intent data) {
super.onActivityResult(reqCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && reqCode == CONTACT_ADDR_RESULT_CODE) {
selectedContacts.add(data.getStringExtra(NewContactActivity.ADDR_EXTRA));
int contactId = data.getIntExtra(NewContactActivity.CONTACT_ID_EXTRA, 0);
if (contactId != 0) {
selectedContacts.add(contactId);
}
getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this);
}
}
@@ -62,6 +62,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.SearchView;
@@ -73,10 +74,6 @@ import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent;
import com.b44t.messenger.DcMsg;
import com.b44t.messenger.rpc.Rpc;
import com.b44t.messenger.rpc.RpcException;
import com.b44t.messenger.util.concurrent.ListenableFuture;
import com.b44t.messenger.util.concurrent.SettableFuture;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.UriAttachment;
@@ -121,13 +118,19 @@ import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener;
import org.thoughtcrime.securesms.util.guava.Optional;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
import org.thoughtcrime.securesms.video.recode.VideoRecoder;
import org.thoughtcrime.securesms.videochat.VideochatUtil;
import org.thoughtcrime.securesms.calls.CallUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
import chat.delta.rpc.Rpc;
import chat.delta.rpc.RpcException;
import chat.delta.util.ListenableFuture;
import chat.delta.util.SettableFuture;
/**
* Activity for displaying a message thread, as well as
* composing/sending a new message into that thread.
@@ -437,7 +440,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
getMenuInflater().inflate(R.menu.conversation, menu);
if (dcChat.isSelfTalk() || dcChat.isBroadcast()) {
if (dcChat.isSelfTalk() || dcChat.isOutBroadcast()) {
menu.findItem(R.id.menu_mute_notifications).setVisible(false);
} else if(dcChat.isMuted()) {
menu.findItem(R.id.menu_mute_notifications).setTitle(R.string.menu_unmute);
@@ -447,12 +450,25 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
menu.findItem(R.id.menu_show_map).setVisible(false);
}
if (!dcChat.canSend() || dcChat.isBroadcast() || dcChat.isMailingList()) {
menu.findItem(R.id.menu_start_call).setVisible(
Prefs.isCallsEnabled(this)
&& dcChat.canSend()
&& dcChat.isEncrypted()
&& !dcChat.isSelfTalk()
&& !dcChat.isMultiUser()
);
if (!dcChat.isEncrypted() || !dcChat.canSend() || dcChat.isMailingList() ) {
menu.findItem(R.id.menu_ephemeral_messages).setVisible(false);
}
if (isMultiUser()) {
if (dcChat.canSend() && !dcChat.isBroadcast() && !dcChat.isMailingList()) {
if (dcChat.isInBroadcast() && !dcChat.isContactRequest()) {
menu.findItem(R.id.menu_leave).setTitle(R.string.menu_leave_channel).setVisible(true);
} else if (dcChat.isEncrypted()
&& dcChat.canSend()
&& !dcChat.isOutBroadcast()
&& !dcChat.isMailingList()) {
menu.findItem(R.id.menu_leave).setVisible(true);
}
}
@@ -496,6 +512,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
Log.e(TAG, "cannot set up in-chat-search: ", e);
}
if (!dcChat.canSend() || isEditing) {
MenuItem attachItem = menu.findItem(R.id.menu_add_attachment);
if (attachItem!=null) {
attachItem.setVisible(false);
}
}
super.onPrepareOptionsMenu(menu);
return true;
}
@@ -504,7 +527,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
int itemId = item.getItemId();
if (itemId == R.id.menu_leave) {
if (itemId == R.id.menu_add_attachment) {
handleAddAttachment();
return true;
} else if (itemId == R.id.menu_leave) {
handleLeaveGroup();
return true;
} else if (itemId == R.id.menu_archive_chat) {
@@ -522,6 +548,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
} else if (itemId == R.id.menu_show_map) {
WebxdcActivity.openMaps(this, chatId);
return true;
} else if (itemId == R.id.menu_start_call) {
CallUtil.startCall(this, chatId);
return true;
} else if (itemId == R.id.menu_all_media) {
handleAllMedia();
return true;
} else if (itemId == R.id.menu_search_up) {
handleMenuSearchNext(false);
return true;
@@ -605,15 +637,26 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private void handleProfile() {
Intent intent = new Intent(this, ProfileActivity.class);
intent.putExtra(ProfileActivity.CHAT_ID_EXTRA, chatId);
intent.putExtra(ProfileActivity.FROM_CHAT, true);
startActivity(intent);
overridePendingTransition(0, 0);
}
private void handleAllMedia() {
Intent intent = new Intent(this, AllMediaActivity.class);
intent.putExtra(AllMediaActivity.CHAT_ID_EXTRA, chatId);
startActivity(intent);
}
private void handleLeaveGroup() {
@StringRes int leaveLabel;
if (dcChat.isInBroadcast()) {
leaveLabel = R.string.menu_leave_channel;
} else {
leaveLabel = R.string.menu_leave_group;
}
AlertDialog dialog = new AlertDialog.Builder(this)
.setMessage(getString(R.string.ask_leave_group))
.setPositiveButton(R.string.menu_leave_group, (d, which) -> {
.setPositiveButton(leaveLabel, (d, which) -> {
dcContext.removeContactFromChat(chatId, DcContact.DC_CONTACT_ID_SELF);
Toast.makeText(this, getString(R.string.done), Toast.LENGTH_SHORT).show();
})
@@ -676,7 +719,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
if (!dcChat.isMultiUser()) {
int[] contactIds = dcContext.getChatContacts(chatId);
if (contactIds.length == 1 || contactIds.length == 2) {
name = dcContext.getContact(contactIds[0]).getNameNAddr();
name = dcContext.getContact(contactIds[0]).getDisplayName();
}
}
new AlertDialog.Builder(this)
@@ -897,6 +940,7 @@ 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);
@@ -941,8 +985,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
AttachmentManager.selectGallery(this, PICK_GALLERY); break;
case AttachmentTypeSelector.ADD_DOCUMENT:
AttachmentManager.selectDocument(this, PICK_DOCUMENT); break;
case AttachmentTypeSelector.INVITE_VIDEO_CHAT:
new VideochatUtil().invite(this, chatId); break;
case AttachmentTypeSelector.ADD_CONTACT_INFO:
startContactChooserActivity(); break;
case AttachmentTypeSelector.ADD_LOCATION:
@@ -981,7 +1023,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
try {
byte[] vcard = rpc.makeVcard(dcContext.getAccountId(), contactId).getBytes();
byte[] vcard = rpc.makeVcard(dcContext.getAccountId(), Collections.singletonList(contactId)).getBytes();
String mimeType = "application/octet-stream";
setMedia(PersistentBlobProvider.getInstance().create(this, vcard, mimeType, "vcard.vcf"), MediaType.DOCUMENT);
} catch (RpcException e) {
@@ -1012,9 +1054,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
final SettableFuture<Integer> future = new SettableFuture<>();
DcMsg msg = null;
Optional<QuoteModel> quote = inputPanel.getQuote();
Integer recompress = 0;
boolean editing = isEditing;
// for a quick ui feedback, we clear the related controls immediately on sending messages.
@@ -1024,122 +1064,117 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
inputPanel.clearQuote();
}
if (editing) {
int msgId = quote.get().getQuotedMsg().getId();
Util.runOnAnyBackgroundThread(() -> {
Util.runOnAnyBackgroundThread(() -> {
DcMsg msg = null;
int recompress = 0;
if (editing) {
int msgId = quote.get().getQuotedMsg().getId();
if (action == ACTION_SEND_OUT) {
dcContext.sendEditRequest(msgId, body);
} else {
dcContext.setDraft(chatId, null);
}
});
return future;
}
if(slideDeck!=null) {
if (action==ACTION_SEND_OUT) {
attachmentManager.clear(glideRequests, false);
future.set(chatId);
return;
}
try {
if (slideDeck.getWebxdctDraftId() != 0) {
msg = dcContext.getDraft(chatId);
} else {
List<Attachment> attachments = slideDeck.asAttachments();
for (Attachment attachment : attachments) {
String contentType = attachment.getContentType();
if (MediaUtil.isImageType(contentType) && slideDeck.getDocumentSlide() == null) {
msg = new DcMsg(dcContext,
MediaUtil.isGif(contentType) ? DcMsg.DC_MSG_GIF : DcMsg.DC_MSG_IMAGE);
msg.setDimension(attachment.getWidth(), attachment.getHeight());
} else if (MediaUtil.isAudioType(contentType)) {
msg = new DcMsg(dcContext,
attachment.isVoiceNote() ? DcMsg.DC_MSG_VOICE : DcMsg.DC_MSG_AUDIO);
} else if (MediaUtil.isVideoType(contentType) && slideDeck.getDocumentSlide() == null) {
msg = new DcMsg(dcContext, DcMsg.DC_MSG_VIDEO);
recompress = DcMsg.DC_MSG_VIDEO;
} else {
msg = new DcMsg(dcContext, DcMsg.DC_MSG_FILE);
if(slideDeck!=null) {
if (action==ACTION_SEND_OUT) {
Util.runOnMain(() -> attachmentManager.clear(glideRequests, false));
}
try {
if (slideDeck.getWebxdctDraftId() != 0) {
msg = dcContext.getDraft(chatId);
} else {
List<Attachment> attachments = slideDeck.asAttachments();
for (Attachment attachment : attachments) {
String contentType = attachment.getContentType();
if (MediaUtil.isImageType(contentType) && slideDeck.getDocumentSlide() == null) {
msg = new DcMsg(dcContext,
MediaUtil.isGif(contentType) ? DcMsg.DC_MSG_GIF : DcMsg.DC_MSG_IMAGE);
msg.setDimension(attachment.getWidth(), attachment.getHeight());
} else if (MediaUtil.isAudioType(contentType)) {
msg = new DcMsg(dcContext,
attachment.isVoiceNote() ? DcMsg.DC_MSG_VOICE : DcMsg.DC_MSG_AUDIO);
} else if (MediaUtil.isVideoType(contentType) && slideDeck.getDocumentSlide() == null) {
msg = new DcMsg(dcContext, DcMsg.DC_MSG_VIDEO);
recompress = DcMsg.DC_MSG_VIDEO;
} else {
msg = new DcMsg(dcContext, DcMsg.DC_MSG_FILE);
}
String path = attachment.getRealPath(this);
msg.setFileAndDeduplicate(path, attachment.getFileName(), null);
}
String path = attachment.getRealPath(this);
msg.setFileAndDeduplicate(path, attachment.getFileName(), null);
}
if (msg != null) {
msg.setText(body);
}
}
catch(Exception e) {
e.printStackTrace();
}
}
else if (!body.isEmpty()){
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText(body);
}
catch(Exception e) {
e.printStackTrace();
if (quote.isPresent()) {
if (msg == null) msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setQuote(quote.get().getQuotedMsg());
}
}
else if (!body.isEmpty()){
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText(body);
}
if (quote.isPresent()) {
if (msg == null) msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setQuote(quote.get().getQuotedMsg());
}
if (action==ACTION_SEND_OUT) {
// msg may still be null to clear drafts
new AsyncTask<Object, Void, Void>() {
@Override
protected Void doInBackground(Object... param) {
DcMsg msg = (DcMsg)param[0];
Integer recompress = (Integer)param[1];
if (action==ACTION_SEND_OUT) {
// for WEBXDC, drafts are just sent out as is.
// for preparations and other cases, cleanup draft soon.
if (msg == null || msg.getType() != DcMsg.DC_MSG_WEBXDC) {
dcContext.setDraft(dcChat.getId(), null);
}
// for WEBXDC, drafts are just sent out as is.
// for preparations and other cases, cleanup draft soon.
if (msg == null || msg.getType() != DcMsg.DC_MSG_WEBXDC) {
dcContext.setDraft(dcChat.getId(), null);
}
if(msg!=null)
{
boolean doSend = true;
if (recompress==DcMsg.DC_MSG_VIDEO) {
Util.runOnMain(() -> {
progressDialog = ProgressDialog.show(
ConversationActivity.this,
"",
getString(R.string.one_moment),
true,
false
);
});
doSend = VideoRecoder.prepareVideo(ConversationActivity.this, dcChat.getId(), msg);
Util.runOnMain(() -> {
try {
progressDialog.dismiss();
} catch (final IllegalArgumentException e) {
// The activity is finishing/destroyed, do nothing.
}
});
}
if (doSend) {
if (dcContext.sendMsg(dcChat.getId(), msg) == 0) {
Util.runOnMain(()-> Toast.makeText(ConversationActivity.this, dcContext.getLastError(), Toast.LENGTH_LONG).show());
return null;
if(msg!=null) {
boolean doSend = true;
if (recompress==DcMsg.DC_MSG_VIDEO) {
Util.runOnMain(() -> {
if (isFinishing()) return;
progressDialog = ProgressDialog.show(
ConversationActivity.this,
"",
getString(R.string.one_moment),
true,
false
);
});
doSend = VideoRecoder.prepareVideo(ConversationActivity.this, dcChat.getId(), msg);
Util.runOnMain(() -> {
try {
if (progressDialog != null) progressDialog.dismiss();
} catch (final IllegalArgumentException e) {
// The activity is finishing/destroyed, do nothing.
}
}
Util.runOnMain(()-> sendComplete(dcChat.getId()));
});
}
}
else {
dcContext.setDraft(dcChat.getId(), msg);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
future.set(chatId);
if (doSend) {
if (dcContext.sendMsg(dcChat.getId(), msg) == 0) {
String lastError = dcContext.getLastError();
if (!"".equals(lastError)) {
Util.runOnMain(() -> Toast.makeText(ConversationActivity.this, lastError, Toast.LENGTH_LONG).show());
}
future.set(chatId);
return;
}
}
Util.runOnMain(() -> sendComplete(dcChat.getId()));
}
} else {
dcContext.setDraft(dcChat.getId(), msg);
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, msg, recompress);
future.set(chatId);
});
return future;
}
@@ -1359,8 +1394,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
Toast.LENGTH_SHORT).show();
}
else {
processComposeControls(ACTION_SEND_OUT);
DcHelper.getNotificationCenter(ConversationActivity.this).maybePlaySendSound(dcChat);
processComposeControls(ACTION_SEND_OUT).addListener(new AssertedSuccessListener<Integer>() {
@Override
public void onSuccess(Integer chatId) {
DcHelper.getNotificationCenter(ConversationActivity.this).maybePlaySendSound(dcChat);
}
});
}
}
@@ -1439,7 +1478,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId()));
SlideDeck slideDeck = new SlideDeck();
if (msg.getType() != DcMsg.DC_MSG_TEXT) {
if (msg.hasFile()) {
slideDeck.addSlide(MediaUtil.getSlideForMsg(this, msg));
}
@@ -1594,7 +1633,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
public void initializeContactRequest() {
if (!dcChat.isHalfBlocked()) {
if (!dcChat.isContactRequest()) {
messageRequestBottomView.setVisibility(View.GONE);
return;
}
@@ -1607,15 +1646,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
});
if (dcChat.isProtectionBroken()) {
messageRequestBottomView.setBlockText(R.string.more_info_desktop);
String name = dcContext.getContact(recipient.getDcContact().getId()).getDisplayName();
messageRequestBottomView.setBlockOnClickListener(v -> DcHelper.showVerificationBrokenDialog(this, name));
messageRequestBottomView.setQuestion(getString(R.string.chat_protection_broken, name));
messageRequestBottomView.setAcceptText(R.string.ok);
} else if (dcChat.getType() == DcChat.DC_CHAT_TYPE_GROUP) {
if (dcChat.getType() == DcChat.DC_CHAT_TYPE_GROUP) {
// We don't support blocking groups yet, so offer to delete it instead
messageRequestBottomView.setBlockText(R.string.delete);
messageRequestBottomView.setBlockOnClickListener(v -> handleDeleteChat());
@@ -77,9 +77,8 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
private static final int MESSAGE_TYPE_THUMBNAIL_INCOMING = 6;
private static final int MESSAGE_TYPE_DOCUMENT_OUTGOING = 7;
private static final int MESSAGE_TYPE_DOCUMENT_INCOMING = 8;
private static final int MESSAGE_TYPE_VIDEOCHAT_INVITE = 9;
private static final int MESSAGE_TYPE_STICKER_INCOMING = 10;
private static final int MESSAGE_TYPE_STICKER_OUTGOING = 11;
private static final int MESSAGE_TYPE_STICKER_INCOMING = 9;
private static final int MESSAGE_TYPE_STICKER_OUTGOING = 10;
private final Set<DcMsg> batchSelected = Collections.synchronizedSet(new HashSet<DcMsg>());
@@ -279,7 +278,6 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
case MESSAGE_TYPE_STICKER_INCOMING:
case MESSAGE_TYPE_INCOMING: return R.layout.conversation_item_received;
case MESSAGE_TYPE_INFO: return R.layout.conversation_item_update;
case MESSAGE_TYPE_VIDEOCHAT_INVITE:return R.layout.conversation_item_videochat;
default: throw new IllegalArgumentException("unsupported item view type given to ConversationAdapter");
}
}
@@ -294,7 +292,7 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
else if (type==DcMsg.DC_MSG_AUDIO || type==DcMsg.DC_MSG_VOICE) {
return dcMsg.isOutgoing()? MESSAGE_TYPE_AUDIO_OUTGOING : MESSAGE_TYPE_AUDIO_INCOMING;
}
else if (type==DcMsg.DC_MSG_FILE && !dcMsg.isSetupMessage()) {
else if (type==DcMsg.DC_MSG_FILE) {
return dcMsg.isOutgoing()? MESSAGE_TYPE_DOCUMENT_OUTGOING : MESSAGE_TYPE_DOCUMENT_INCOMING;
}
else if (type==DcMsg.DC_MSG_IMAGE || type==DcMsg.DC_MSG_GIF || type==DcMsg.DC_MSG_VIDEO) {
@@ -303,9 +301,6 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
else if (type == DcMsg.DC_MSG_STICKER) {
return dcMsg.isOutgoing()? MESSAGE_TYPE_STICKER_OUTGOING : MESSAGE_TYPE_STICKER_INCOMING;
}
else if (type == DcMsg.DC_MSG_VIDEOCHAT_INVITATION) {
return MESSAGE_TYPE_VIDEOCHAT_INVITE;
}
else {
return dcMsg.isOutgoing()? MESSAGE_TYPE_OUTGOING : MESSAGE_TYPE_INCOMING;
}
@@ -25,9 +25,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -35,15 +33,12 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ActionMode;
import androidx.recyclerview.widget.LinearLayoutManager;
@@ -71,7 +66,7 @@ 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.videochat.VideochatUtil;
import org.thoughtcrime.securesms.calls.CallUtil;
import java.util.Collections;
import java.util.LinkedList;
@@ -173,8 +168,8 @@ public class ConversationFragment extends MessageSelectorFragment
private void setNoMessageText() {
DcChat dcChat = getListAdapter().getChat();
if(dcChat.isMultiUser()){
if (dcChat.isBroadcast()) {
noMessageTextView.setText(R.string.chat_new_broadcast_hint);
if (dcChat.isInBroadcast() || dcChat.isOutBroadcast()) {
noMessageTextView.setText(R.string.chat_new_channel_hint);
} else if (dcChat.isUnpromoted()) {
noMessageTextView.setText(R.string.chat_new_group_hint);
}
@@ -188,6 +183,9 @@ public class ConversationFragment extends MessageSelectorFragment
else if(dcChat.isDeviceTalk()) {
noMessageTextView.setText(R.string.device_talk_explain);
}
else if(!dcChat.isEncrypted()) {
noMessageTextView.setText(R.string.chat_unencrypted_explanation);
}
else {
String message = getString(R.string.chat_new_one_to_one_hint, dcChat.getName());
noMessageTextView.setText(message);
@@ -321,25 +319,35 @@ public class ConversationFragment extends MessageSelectorFragment
return;
}
menu.findItem(R.id.menu_toggle_save).setVisible(false);
if (messageRecords.size() > 1) {
menu.findItem(R.id.menu_context_details).setVisible(false);
menu.findItem(R.id.menu_context_share).setVisible(false);
//menu.findItem(R.id.menu_context_reply).setVisible(false);
menu.findItem(R.id.menu_context_reply).setVisible(false);
menu.findItem(R.id.menu_context_edit).setVisible(false);
menu.findItem(R.id.menu_context_reply_privately).setVisible(false);
menu.findItem(R.id.menu_add_to_home_screen).setVisible(false);
//menu.findItem(R.id.menu_toggle_save).setVisible(false);
} else {
DcMsg messageRecord = messageRecords.iterator().next();
DcChat chat = getListAdapter().getChat();
menu.findItem(R.id.menu_context_details).setVisible(true);
menu.findItem(R.id.menu_context_share).setVisible(messageRecord.hasFile());
boolean canReply = canReplyToMsg(messageRecord);
//menu.findItem(R.id.menu_context_reply).setVisible(chat.canSend() && canReply);
boolean canEdit = canEditMsg(messageRecord);
menu.findItem(R.id.menu_context_edit).setVisible(chat.canSend() && canEdit);
boolean showReplyPrivately = !dcContext.isCommunity() && chat.isMultiUser() && !messageRecord.isOutgoing() && canReply;
menu.findItem(R.id.menu_context_reply).setVisible(chat.canSend() && canReply);
menu.findItem(R.id.menu_context_edit).setVisible(chat.isEncrypted() && chat.canSend() && canEditMsg(messageRecord));
boolean showReplyPrivately = chat.isMultiUser() && !messageRecord.isOutgoing() && canReply;
menu.findItem(R.id.menu_context_reply_privately).setVisible(showReplyPrivately);
menu.findItem(R.id.menu_add_to_home_screen).setVisible(messageRecord.getType() == DcMsg.DC_MSG_WEBXDC);
/*
boolean saved = messageRecord.getSavedMsgId() != 0;
MenuItem toggleSave = menu.findItem(R.id.menu_toggle_save);
toggleSave.setVisible(messageRecord.canSave() && !chat.isSelfTalk());
toggleSave.setIcon(saved? R.drawable.baseline_bookmark_remove_24 : R.drawable.baseline_bookmark_border_24);
toggleSave.setTitle(saved? R.string.unsave : R.string.save);
*/
}
// if one of the selected items cannot be saved, disable saving.
@@ -362,8 +370,7 @@ public class ConversationFragment extends MessageSelectorFragment
}
static boolean canReplyToMsg(DcMsg dcMsg) {
boolean canReply = dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION;
if (canReply && dcMsg.isInfo()) {
if (dcMsg.isInfo()) {
switch (dcMsg.getInfoType()) {
case DcMsg.DC_INFO_GROUP_NAME_CHANGED:
case DcMsg.DC_INFO_GROUP_IMAGE_CHANGED:
@@ -372,16 +379,16 @@ public class ConversationFragment extends MessageSelectorFragment
case DcMsg.DC_INFO_LOCATIONSTREAMING_ENABLED:
case DcMsg.DC_INFO_EPHEMERAL_TIMER_CHANGED:
case DcMsg.DC_INFO_WEBXDC_INFO_MESSAGE:
break;
return true;
default:
canReply = false;
return false;
}
}
return canReply;
return true;
}
static boolean canEditMsg(DcMsg dcMsg) {
return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION && !dcMsg.hasHtml() && !dcMsg.getText().isEmpty();
return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_CALL && !dcMsg.hasHtml() && !dcMsg.getText().isEmpty();
}
public void handleClearChat() {
@@ -511,6 +518,15 @@ public class ConversationFragment extends MessageSelectorFragment
}
}
private void handleToggleSave(final Set<DcMsg> messageRecords) {
DcMsg msg = getSelectedMessageRecord(messageRecords);
if (msg.getSavedMsgId() != 0) {
dcContext.deleteMsgs(new int[]{msg.getSavedMsgId()});
} else {
dcContext.saveMsgs(new int[]{msg.getId()});
}
}
private void reloadList() {
reloadList(false);
}
@@ -725,80 +741,6 @@ public class ConversationFragment extends MessageSelectorFragment
Util.runOnAnyBackgroundThread(() -> dcContext.markseenMsgs(ids));
}
void querySetupCode(final DcMsg dcMsg, String[] preload)
{
if( !dcMsg.isSetupMessage()) {
return;
}
View gl = View.inflate(getActivity(), R.layout.setup_code_grid, null);
final EditText[] editTexts = {
gl.findViewById(R.id.setupCode0), gl.findViewById(R.id.setupCode1), gl.findViewById(R.id.setupCode2),
gl.findViewById(R.id.setupCode3), gl.findViewById(R.id.setupCode4), gl.findViewById(R.id.setupCode5),
gl.findViewById(R.id.setupCode6), gl.findViewById(R.id.setupCode7), gl.findViewById(R.id.setupCode8)
};
AlertDialog.Builder builder1 = new AlertDialog.Builder(getActivity());
builder1.setView(gl);
editTexts[0].setText(dcMsg.getSetupCodeBegin());
editTexts[0].setSelection(editTexts[0].getText().length());
for( int i = 0; i < 9; i++ ) {
if( preload != null && i < preload.length ) {
editTexts[i].setText(preload[i]);
editTexts[i].setSelection(editTexts[i].getText().length());
}
editTexts[i].addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if( s.length()==4 ) {
for ( int i = 0; i < 8; i++ ) {
if( editTexts[i].hasFocus() && editTexts[i+1].getText().length()<4 ) {
editTexts[i+1].requestFocus();
break;
}
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
builder1.setTitle(getActivity().getString(R.string.autocrypt_continue_transfer_title));
builder1.setMessage(getActivity().getString(R.string.autocrypt_continue_transfer_please_enter_code));
builder1.setNegativeButton(android.R.string.cancel, null);
builder1.setCancelable(false); // prevent the dialog from being dismissed accidentally (when the dialog is closed, the setup code is gone forever and the user has to create a new setup message)
builder1.setPositiveButton(android.R.string.ok, (dialog, which) -> {
String setup_code = "";
final String[] preload1 = new String[9];
for ( int i = 0; i < 9; i++ ) {
preload1[i] = editTexts[i].getText().toString();
setup_code += preload1[i];
}
boolean success = dcContext.continueKeyTransfer(dcMsg.getId(), setup_code);
AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity());
builder2.setTitle(getActivity().getString(R.string.autocrypt_continue_transfer_title));
builder2.setMessage(getActivity().getString(success? R.string.autocrypt_continue_transfer_succeeded : R.string.autocrypt_bad_setup_code));
if( success ) {
builder2.setPositiveButton(android.R.string.ok, null);
}
else {
builder2.setNegativeButton(android.R.string.cancel, null);
builder2.setPositiveButton(R.string.autocrypt_continue_transfer_retry, (dialog1, which1) -> querySetupCode(dcMsg, preload1));
}
builder2.show();
});
builder1.show();
}
private class ConversationFragmentItemClickListener implements ItemClickListener {
@Override
@@ -818,28 +760,33 @@ public class ConversationFragment extends MessageSelectorFragment
actionMode.setTitleOptionalHint(false); // the title represents important information, also indicating implicitly, more items can be selected
}
}
else if(messageRecord.isSetupMessage()) {
querySetupCode(messageRecord,null);
}
else if (messageRecord.getType()==DcMsg.DC_MSG_VIDEOCHAT_INVITATION) {
new VideochatUtil().join(getActivity(), messageRecord.getId());
}
else if(DozeReminder.isDozeReminderMsg(getContext(), messageRecord)) {
DozeReminder.dozeReminderTapped(getContext());
}
else if(messageRecord.getInfoType() == DcMsg.DC_INFO_WEBXDC_INFO_MESSAGE) {
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord.getParent(), messageRecord.getWebxdcHref());
if (messageRecord.getParent() != null) {
// if the parent webxdc message still exists
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord.getParent(), messageRecord.getWebxdcHref());
}
}
else if (!TextUtils.isEmpty(messageRecord.getPOILocation()) && messageRecord.getType() == DcMsg.DC_MSG_TEXT && !messageRecord.hasHtml()) {
WebxdcActivity.openMaps(getContext(), getListAdapter().getChat().getId(), "index.html#"+messageRecord.getPOILocation());
}
else {
String self_mail = dcContext.getConfig("configured_mail_user");
if (self_mail != null && !self_mail.isEmpty()
&& 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(), RegistrationActivity.class));
int infoContactId = messageRecord.getInfoContactId();
if (infoContactId != 0 && infoContactId != DC_CONTACT_ID_SELF) {
Intent intent = new Intent(getContext(), ProfileActivity.class);
intent.putExtra(ProfileActivity.CONTACT_ID_EXTRA, infoContactId);
startActivity(intent);
}
else {
String self_mail = dcContext.getConfig("configured_mail_user");
if (self_mail != null && !self_mail.isEmpty()
&& 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(), RegistrationActivity.class));
}
}
}
}
@@ -851,9 +798,6 @@ public class ConversationFragment extends MessageSelectorFragment
list.getAdapter().notifyDataSetChanged();
actionMode = ((AppCompatActivity)getActivity()).startSupportActionMode(actionModeCallback);
if (dcContext.isCommunity()) return;
addReactionView.show(messageRecord, view, () -> {
if (actionMode != null) {
actionMode.finish();
@@ -901,7 +845,7 @@ public class ConversationFragment extends MessageSelectorFragment
public void onShowFullClicked(DcMsg messageRecord) {
Intent intent = new Intent(getActivity(), FullMsgActivity.class);
intent.putExtra(FullMsgActivity.MSG_ID_EXTRA, messageRecord.getId());
intent.putExtra(FullMsgActivity.BLOCK_LOADING_REMOTE, getListAdapter().getChat().isHalfBlocked());
intent.putExtra(FullMsgActivity.BLOCK_LOADING_REMOTE, getListAdapter().getChat().isContactRequest());
startActivity(intent);
getActivity().overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out);
}
@@ -931,8 +875,6 @@ public class ConversationFragment extends MessageSelectorFragment
private class ActionModeCallback implements ActionMode.Callback {
private int statusBarColor;
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
@@ -940,10 +882,6 @@ public class ConversationFragment extends MessageSelectorFragment
mode.setTitle("1");
Window window = getActivity().getWindow();
statusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
Util.redMenuItem(menu, R.id.menu_context_delete_message);
setCorrectMenuVisibility(menu);
ConversationAdaptiveActionsToolbar.adjustMenuActions(menu, 10, requireActivity().getWindow().getDecorView().getMeasuredWidth());
@@ -960,8 +898,6 @@ public class ConversationFragment extends MessageSelectorFragment
((ConversationAdapter)list.getAdapter()).clearSelection();
list.getAdapter().notifyDataSetChanged();
getActivity().getWindow().setStatusBarColor(statusBarColor);
actionMode = null;
hideAddReactionView();
}
@@ -995,10 +931,10 @@ public class ConversationFragment extends MessageSelectorFragment
} else if (itemId == R.id.menu_context_save_attachment) {
handleSaveAttachment(getListAdapter().getSelectedItems());
return true;
// } else if (itemId == R.id.menu_context_reply) {
// handleReplyMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
// actionMode.finish();
// return true;
} else if (itemId == R.id.menu_context_reply) {
handleReplyMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
actionMode.finish();
return true;
} else if (itemId == R.id.menu_context_edit) {
handleEditMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
actionMode.finish();
@@ -1009,9 +945,12 @@ public class ConversationFragment extends MessageSelectorFragment
} else if (itemId == R.id.menu_resend) {
handleResendMessage(getListAdapter().getSelectedItems());
return true;
} else if (itemId == R.id.menu_toggle_save) {
handleToggleSave(getListAdapter().getSelectedItems());
actionMode.finish();
return true;
}
return false;
return false;
}
}
@@ -40,14 +40,12 @@ import androidx.appcompat.app.AlertDialog;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcMsg;
import com.b44t.messenger.rpc.Reactions;
import com.b44t.messenger.rpc.RpcException;
import com.b44t.messenger.rpc.VcardContact;
import org.thoughtcrime.securesms.audio.AudioSlidePlayer;
import org.thoughtcrime.securesms.components.AudioView;
import org.thoughtcrime.securesms.components.AvatarImageView;
import org.thoughtcrime.securesms.components.BorderlessImageView;
import org.thoughtcrime.securesms.components.CallItemView;
import org.thoughtcrime.securesms.components.ConversationItemFooter;
import org.thoughtcrime.securesms.components.ConversationItemThumbnail;
import org.thoughtcrime.securesms.components.DocumentView;
@@ -73,10 +71,17 @@ import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.Stub;
import org.thoughtcrime.securesms.calls.CallUtil;
import java.util.List;
import java.util.Set;
import chat.delta.rpc.RpcException;
import chat.delta.rpc.types.CallInfo;
import chat.delta.rpc.types.CallState;
import chat.delta.rpc.types.Reactions;
import chat.delta.rpc.types.VcardContact;
/**
* A view that displays an individual conversation item within a conversation
* thread. Used by ComposeMessageActivity's ListActivity via a ConversationAdapter.
@@ -118,6 +123,7 @@ public class ConversationItem extends BaseConversationItem
private @NonNull Stub<WebxdcView> webxdcViewStub;
private Stub<BorderlessImageView> stickerStub;
private Stub<VcardView> vcardViewStub;
private Stub<CallItemView> callViewStub;
private @Nullable EventListener eventListener;
private int measureCalls;
@@ -152,6 +158,7 @@ public class ConversationItem extends BaseConversationItem
this.webxdcViewStub = new Stub<>(findViewById(R.id.webxdc_view_stub));
this.stickerStub = new Stub<>(findViewById(R.id.sticker_view_stub));
this.vcardViewStub = new Stub<>(findViewById(R.id.vcard_view_stub));
this.callViewStub = new Stub<>(findViewById(R.id.call_view_stub));
this.groupSenderHolder = findViewById(R.id.group_sender_holder);
this.quoteView = findViewById(R.id.quote_view);
this.container = findViewById(R.id.container);
@@ -178,7 +185,7 @@ public class ConversationItem extends BaseConversationItem
{
bind(messageRecord, dcChat, batchSelected, pulseHighlight, recipients);
this.glideRequests = glideRequests;
this.showSender = dcContext.isCommunity() || ((dcChat.isMultiUser() || dcChat.isSelfTalk()) && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null;
this.showSender = ((dcChat.isMultiUser() || dcChat.isSelfTalk()) && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null;
if (showSender) {
this.dcContact = dcContext.getContact(messageRecord.getFromId());
@@ -270,11 +277,10 @@ public class ConversationItem extends BaseConversationItem
R.attr.conversation_item_incoming_bubble_color,
R.attr.conversation_item_outgoing_bubble_color,
};
final TypedArray attrs = context.obtainStyledAttributes(attributes);
incomingBubbleColor = attrs.getColor(0, Color.WHITE);
outgoingBubbleColor = attrs.getColor(1, Color.WHITE);
attrs.recycle();
try (TypedArray attrs = context.obtainStyledAttributes(attributes)) {
incomingBubbleColor = attrs.getColor(0, Color.WHITE);
outgoingBubbleColor = attrs.getColor(1, Color.WHITE);
}
}
@Override
@@ -323,6 +329,11 @@ public class ConversationItem extends BaseConversationItem
vcardViewStub.get().setFocusable(!shouldInterceptClicks(messageRecord) && batchSelected.isEmpty());
vcardViewStub.get().setClickable(batchSelected.isEmpty());
}
if (callViewStub.resolved()) {
callViewStub.get().setFocusable(!shouldInterceptClicks(messageRecord) && batchSelected.isEmpty());
callViewStub.get().setClickable(batchSelected.isEmpty());
}
}
private void setContentDescription() {
@@ -339,6 +350,8 @@ public class ConversationItem extends BaseConversationItem
desc += webxdcViewStub.get().getDescription() + "\n";
} else if (vcardViewStub.resolved() && vcardViewStub.get().getVisibility() == View.VISIBLE) {
desc += vcardViewStub.get().getDescription() + "\n";
} else if (callViewStub.resolved() && callViewStub.get().getVisibility() == View.VISIBLE) {
desc += callViewStub.get().getDescription() + "\n";
} else if (mediaThumbnailStub.resolved() && mediaThumbnailStub.get().getVisibility() == View.VISIBLE) {
desc += mediaThumbnailStub.get().getDescription() + "\n";
} else if (stickerStub.resolved() && stickerStub.get().getVisibility() == View.VISIBLE) {
@@ -391,7 +404,7 @@ public class ConversationItem extends BaseConversationItem
}
private boolean hasDocument(DcMsg dcMsg) {
return dcMsg.getType()==DcMsg.DC_MSG_FILE && !dcMsg.isSetupMessage();
return dcMsg.getType()==DcMsg.DC_MSG_FILE;
}
private void setBodyText(DcMsg messageRecord) {
@@ -400,11 +413,7 @@ public class ConversationItem extends BaseConversationItem
String text = messageRecord.getText();
if (messageRecord.isSetupMessage()) {
bodyText.setText(context.getString(R.string.autocrypt_asm_click_body));
bodyText.setVisibility(View.VISIBLE);
}
else if (text.isEmpty()) {
if (messageRecord.getType() == DcMsg.DC_MSG_CALL || text.isEmpty()) {
bodyText.setVisibility(View.GONE);
}
else {
@@ -442,10 +451,10 @@ public class ConversationItem extends BaseConversationItem
showFullButton.setVisibility(View.GONE);
msgActionButton.setVisibility(View.VISIBLE);
msgActionButton.setEnabled(true);
msgActionButton.setText(webxdcViewStub.get().isCommunity()? R.string.join: R.string.start_app);
msgActionButton.setText(R.string.start_app);
msgActionButton.setOnClickListener(view -> {
if (batchSelected.isEmpty()) {
DcHelper.openWebxdc(getContext(), messageRecord);
WebxdcActivity.openWebxdcActivity(getContext(), messageRecord);
} else {
passthroughClickListener.onClick(view);
}
@@ -495,6 +504,7 @@ public class ConversationItem extends BaseConversationItem
if (webxdcViewStub.resolved()) webxdcViewStub.get().setVisibility(View.GONE);
if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE);
if (vcardViewStub.resolved()) vcardViewStub.get().setVisibility(View.GONE);
if (callViewStub.resolved()) callViewStub.get().setVisibility(View.GONE);
//noinspection ConstantConditions
int duration = messageRecord.getDuration();
@@ -520,6 +530,7 @@ public class ConversationItem extends BaseConversationItem
if (webxdcViewStub.resolved()) webxdcViewStub.get().setVisibility(View.GONE);
if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE);
if (vcardViewStub.resolved()) vcardViewStub.get().setVisibility(View.GONE);
if (callViewStub.resolved()) callViewStub.get().setVisibility(View.GONE);
//noinspection ConstantConditions
documentViewStub.get().setDocument(new DocumentSlide(context, messageRecord));
@@ -538,6 +549,7 @@ public class ConversationItem extends BaseConversationItem
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE);
if (vcardViewStub.resolved()) vcardViewStub.get().setVisibility(View.GONE);
if (callViewStub.resolved()) callViewStub.get().setVisibility(View.GONE);
webxdcViewStub.get().setWebxdc(messageRecord, context.getString(R.string.webxdc_app));
webxdcViewStub.get().setWebxdcClickListener(new ThumbnailClickListener());
@@ -555,6 +567,7 @@ public class ConversationItem extends BaseConversationItem
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (webxdcViewStub.resolved()) webxdcViewStub.get().setVisibility(View.GONE);
if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE);
if (callViewStub.resolved()) callViewStub.get().setVisibility(View.GONE);
vcardViewStub.get().setVcard(glideRequests, new VcardSlide(context, messageRecord), rpc);
vcardViewStub.get().setVcardClickListener(new ThumbnailClickListener());
@@ -566,6 +579,27 @@ public class ConversationItem extends BaseConversationItem
ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
footer.setVisibility(VISIBLE);
}
else if (messageRecord.getType() == DcMsg.DC_MSG_CALL) {
callViewStub.get().setVisibility(View.VISIBLE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (webxdcViewStub.resolved()) webxdcViewStub.get().setVisibility(View.GONE);
if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE);
if (vcardViewStub.resolved()) vcardViewStub.get().setVisibility(View.GONE);
try {
callViewStub.get().setCallItem(messageRecord.isOutgoing(), rpc.callInfo(dcContext.getAccountId(), messageRecord.getId()));
} catch (RpcException e) {
Log.e(TAG, "Error in Rpc.callInfo", e);
}
callViewStub.get().setCallClickListener(new CallClickListener());
callViewStub.get().setOnLongClickListener(passthroughClickListener);
callViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
else if (hasThumbnail(messageRecord)) {
mediaThumbnailStub.get().setVisibility(View.VISIBLE);
if (audioViewStub.resolved()) audioViewStub.get().setVisibility(View.GONE);
@@ -573,6 +607,7 @@ public class ConversationItem extends BaseConversationItem
if (webxdcViewStub.resolved()) webxdcViewStub.get().setVisibility(View.GONE);
if (stickerStub.resolved()) stickerStub.get().setVisibility(View.GONE);
if (vcardViewStub.resolved()) vcardViewStub.get().setVisibility(View.GONE);
if (callViewStub.resolved()) callViewStub.get().setVisibility(View.GONE);
Slide slide = MediaUtil.getSlideForMsg(context, messageRecord);
@@ -612,6 +647,7 @@ public class ConversationItem extends BaseConversationItem
if (webxdcViewStub.resolved()) webxdcViewStub.get().setVisibility(View.GONE);
if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().setVisibility(View.GONE);
if (vcardViewStub.resolved()) vcardViewStub.get().setVisibility(View.GONE);
if (callViewStub.resolved()) callViewStub.get().setVisibility(View.GONE);
bodyBubble.setBackgroundColor(Color.TRANSPARENT);
@@ -632,6 +668,7 @@ public class ConversationItem extends BaseConversationItem
if (documentViewStub.resolved()) documentViewStub.get().setVisibility(View.GONE);
if (webxdcViewStub.resolved()) webxdcViewStub.get().setVisibility(View.GONE);
if (vcardViewStub.resolved()) vcardViewStub.get().setVisibility(View.GONE);
if (callViewStub.resolved()) callViewStub.get().setVisibility(View.GONE);
ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -679,9 +716,7 @@ public class ConversationItem extends BaseConversationItem
if (!showSender || dcContact ==null) {
contactPhoto.setVisibility(View.GONE);
} else {
int color = messageRecord.getSenderColor();
Recipient recipient = new Recipient(context, dcContact, messageRecord.getSenderName(dcContact), color);
contactPhoto.setAvatar(glideRequests, recipient, true);
contactPhoto.setAvatar(glideRequests, new Recipient(context, dcContact), true);
contactPhoto.setVisibility(View.VISIBLE);
}
}
@@ -706,7 +741,7 @@ public class ConversationItem extends BaseConversationItem
Recipient author = null;
SlideDeck slideDeck = new SlideDeck();
if (msg != null) {
author = new Recipient(context, dcContext.getContact(msg.getFromId()), msg.getSenderColor());
author = new Recipient(context, dcContext.getContact(msg.getFromId()));
if (msg.getType() != DcMsg.DC_MSG_TEXT) {
Slide slide = MediaUtil.getSlideForMsg(context, msg);
if (slide != null) {
@@ -764,11 +799,11 @@ public class ConversationItem extends BaseConversationItem
private void setReactions(@NonNull DcMsg current) {
try {
Reactions reactions = rpc.getMsgReactions(dcContext.getAccountId(), current.getId());
Reactions reactions = rpc.getMessageReactions(dcContext.getAccountId(), current.getId());
if (reactions == null) {
reactionsView.clear();
} else {
reactionsView.setReactions(reactions.getReactions());
reactionsView.setReactions(reactions.reactions);
reactionsView.setOnClickListener(view -> {
if (eventListener != null && batchSelected.isEmpty()) {
eventListener.onReactionClicked(current);
@@ -787,6 +822,8 @@ public class ConversationItem extends BaseConversationItem
return stickerStub.get().getFooter();
} else if (hasOnlyThumbnail(messageRecord) && TextUtils.isEmpty(messageRecord.getText())) {
return mediaThumbnailStub.get().getFooter();
} else if (messageRecord.getType() == DcMsg.DC_MSG_CALL) {
return callViewStub.get().getFooter();
} else {
return footer;
}
@@ -814,8 +851,7 @@ public class ConversationItem extends BaseConversationItem
}
else if (showSender && dcContact !=null) {
this.groupSender.setText(messageRecord.getSenderName(dcContact));
int color = messageRecord.getSenderColor();
this.groupSender.setTextColor(Util.rgbToArgbColor(color!=0? color : dcContact.getColor()));
this.groupSender.setTextColor(Util.rgbToArgbColor(dcContact.getColor()));
}
}
@@ -889,6 +925,7 @@ public class ConversationItem extends BaseConversationItem
else if (documentViewStub.resolved()) documentViewStub.get().performClick();
else if (webxdcViewStub.resolved()) webxdcViewStub.get().performClick();
else if (vcardViewStub.resolved()) vcardViewStub.get().performClick();
else if (callViewStub.resolved()) callViewStub.get().performClick();
}
/// Event handlers
@@ -898,17 +935,17 @@ public class ConversationItem extends BaseConversationItem
if (shouldInterceptClicks(messageRecord) || !batchSelected.isEmpty()) {
performClick();
} else if (slide.isWebxdcDocument()) {
msgActionButton.performClick();
WebxdcActivity.openWebxdcActivity(context, messageRecord);
} else if (slide.isVcard()) {
try {
String path = slide.asAttachment().getRealPath(context);
VcardContact vcardContact = rpc.parseVcard(path).get(0);
new AlertDialog.Builder(context)
.setMessage(context.getString(R.string.ask_start_chat_with, vcardContact.getDisplayName()))
.setMessage(context.getString(R.string.ask_start_chat_with, vcardContact.displayName))
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
try {
List<Integer> contactIds = rpc.importVcard(dcContext.getAccountId(), path);
if (contactIds.size() > 0) {
if (!contactIds.isEmpty()) {
int chatId = dcContext.createChatByContactId(contactIds.get(0));
if (chatId != 0) {
Intent intent = new Intent(context, ConversationActivity.class);
@@ -950,4 +987,21 @@ public class ConversationItem extends BaseConversationItem
}
}
}
private class CallClickListener implements CallItemView.CallClickListener {
public void onClick(final View v, final CallInfo callInfo) {
if (shouldInterceptClicks(messageRecord) || !batchSelected.isEmpty()) {
performClick();
} else {
int accId = dcContext.getAccountId();
int chatId = messageRecord.getChatId();
if (!messageRecord.isOutgoing() && callInfo.state instanceof CallState.Alerting) {
int callId = messageRecord.getId();
CallUtil.openCall(getContext(), accId, chatId, callId, callInfo.sdpOffer);
} else {
CallUtil.startCall(getContext(), accId, chatId);
}
}
}
}
}
@@ -18,10 +18,8 @@ package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_ADDRESS;
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.connect.DcHelper.CONFIG_SERVER_FLAGS;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.getDirectSharingChatId;
import static org.thoughtcrime.securesms.util.RelayUtil.getSharedTitle;
@@ -30,11 +28,12 @@ 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 android.Manifest;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
@@ -68,6 +67,7 @@ import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.connect.DirectShareUtil;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.providers.PersistentBlobProvider;
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
import org.thoughtcrime.securesms.qr.QrActivity;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
@@ -76,10 +76,16 @@ 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.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 java.util.ArrayList;
import java.util.Date;
public class ConversationListActivity extends PassphraseRequiredActionBarActivity
implements ConversationListFragment.ConversationSelectedListener
{
@@ -112,7 +118,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_1_50_0_android";
final String deviceMsgLabel = "update_2_25_0_android-b";
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
DcMsg msg = null;
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
@@ -123,7 +129,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
// Util.copy(inputStream, new FileOutputStream(outputFile));
// msg.setFile(outputFile, "image/jpeg");
msg.setText(getString(R.string.update_1_50_android, "https://lemmy.ml/c/ArcaneChat"));
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"));
}
dcContext.addDeviceMsg(deviceMsgLabel, msg);
@@ -136,32 +142,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
Prefs.setStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, deviceMsgLabel);
}
// add info about moved "switch profile" option; added 2024-08, can be removed after ~3 months
if (!Prefs.getBooleanPreference(this, "info_about_switch_profile_added", false)) {
final DcAccounts dcAccounts = DcHelper.getAccounts(this);
if (dcAccounts.getAll().length >= 2) {
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText(getString(R.string.update_switch_profile_placement));
dcContext.addDeviceMsg("info_about_switch_profile", msg);
}
Prefs.setBooleanPreference(this, "info_about_switch_profile_added", true);
}
// /add info
// remove gmail oauth2
final int serverFlags = dcContext.getConfigInt(CONFIG_SERVER_FLAGS);
if ((serverFlags & DcContext.DC_LP_AUTH_OAUTH2)!=0) {
Util.runOnAnyBackgroundThread(() -> {
if (dcContext.isGmailOauth2Addr(dcContext.getConfig(CONFIG_ADDRESS))) {
final DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText("⚠️ GMail Users: If you have problems using GMail, go to \"Settings / Advanced / Password and Account\".\n\nThere, login again using an \"App Password\".");
dcContext.addDeviceMsg("info_about_gmail_oauth2_removal8", msg);
}
});
}
// /remove gmail oauth2
} catch(Exception e) {
e.printStackTrace();
}
@@ -197,6 +177,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
refresh();
if (BuildConfig.DEBUG) checkNdkArchitecture();
DcHelper.maybeShowMigrationError(this);
}
/**
@@ -215,7 +197,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
String archProperty = System.getProperty("os.arch");
String arch;
if (archProperty.startsWith("armv7")) arch = "armeabi-v7a";
// armv8l is 32 bit mode in 64 bit CPU:
if (archProperty.startsWith("armv7") || archProperty.startsWith("armv8l")) arch = "armeabi-v7a";
else if (archProperty.equals("aarch64")) arch = "arm64-v8a";
else if (archProperty.equals("i686")) arch = "x86";
else if (archProperty.equals("x86_64")) arch = "x86_64";
@@ -301,6 +284,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
title.setText(DcHelper.getContext(this).getName());
// refreshTitle is called by ConversationListFragment when connectivity changes so update connectivity dot here
selfAvatar.setConnectivity(DcHelper.getContext(this).getConnectivity());
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
@@ -373,7 +357,12 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
MenuInflater inflater = this.getMenuInflater();
menu.clear();
if (!isRelayingMessageContent(this)) {
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
);
} else {
inflater.inflate(R.menu.text_secure_normal, menu);
menu.findItem(R.id.menu_global_map).setVisible(Prefs.isLocationStreamingEnabled(this));
MenuItem proxyItem = menu.findItem(R.id.menu_proxy_settings);
@@ -454,8 +443,10 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
onBackPressed();
return true;
} else if (itemId == R.id.menu_all_media) {
startActivity(new Intent(this, ProfileActivity.class));
startActivity(new Intent(this, AllMediaActivity.class));
return true;
} else if (itemId == R.id.menu_export_attachment) {
handleSaveAttachment();
} else if (itemId == R.id.menu_public_bots) {
handleShowBot("botsindex@arcanechat.me", "https://i.delta.chat/#67889B0362BEDBFEE05ACD92C1D737FA632A9582&a=botsindex%40arcanechat.me&n=Public%20Bots&i=336MTEz38EH-RJxM9OKWygYK&s=TpVVGK6C4KrJmRG0bwHLalXt");
return true;
@@ -464,6 +455,36 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
return false;
}
private void handleSaveAttachment() {
SaveAttachmentTask.showWarningDialog(this, (dialogInterface, i) -> {
if (StorageUtil.canWriteToMediaStore(this)) {
performSave();
return;
}
Permissions.with(this)
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.alwaysGrantOnSdk30()
.ifNecessary()
.withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied))
.onAllGranted(this::performSave)
.execute();
});
}
private void performSave() {
ArrayList<Uri> uriList = RelayUtil.getSharedUris(this);
Uri uri = uriList.get(0);
String mimeType = PersistentBlobProvider.getMimeType(this, uri);
String fileName = PersistentBlobProvider.getFileName(this, uri);
SaveAttachmentTask.Attachment[] attachments = new SaveAttachmentTask.Attachment[]{
new SaveAttachmentTask.Attachment(uri, mimeType, new Date().getTime(), fileName)
};
SaveAttachmentTask saveTask = new SaveAttachmentTask(this);
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, attachments);
onBackPressed();
}
private void handleOpenpgp4fpr() {
if (getIntent() != null &&
Intent.ACTION_VIEW.equals(getIntent().getAction())) {
@@ -494,7 +515,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
if (contactId!=0 && dcContext.getChatIdByContactId(contactId)!=0) {
chatId = dcContext.createChatByContactId(contactId);
}
if (chatId != 0 && dcContext.getChat(chatId).isProtected()) {
if (chatId != 0 && dcContext.getChat(chatId).isEncrypted()) {
openConversation(chatId, -1);
} else {
QrCodeHandler qrCodeHandler = new QrCodeHandler(this);
@@ -21,7 +21,9 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
{
@Override
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);
@@ -31,7 +33,7 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
Bundle bundle = new Bundle();
bundle.putBoolean(ConversationListFragment.ARCHIVE, true);
initFragment(android.R.id.content, new ConversationListFragment(), bundle);
initFragment(R.id.fragment, new ConversationListFragment(), bundle);
}
@Override
@@ -80,6 +80,7 @@ public class ConversationListFragment extends BaseConversationListFragment
DcEventCenter eventCenter = DcHelper.getEventCenter(requireActivity());
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_MSGS_NOTICED, this);
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CHAT_DELETED, this);
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
eventCenter.addObserver(DcContext.DC_EVENT_MSGS_CHANGED, this);
@@ -321,7 +322,10 @@ public class ConversationListFragment extends BaseConversationListFragment
@Override
public void handleEvent(@NonNull DcEvent event) {
if (event.getAccountId() != DcHelper.getContext(requireActivity()).getAccountId()) {
final int accId = event.getAccountId();
if (event.getId() == DcContext.DC_EVENT_CHAT_DELETED) {
DcHelper.getNotificationCenter(requireActivity()).removeNotifications(accId, event.getData1Int());
} else if (accId != DcHelper.getContext(requireActivity()).getAccountId()) {
Activity activity = getActivity();
if (activity instanceof ConversationListActivity) {
((ConversationListActivity) activity).refreshUnreadIndicator();
@@ -35,7 +35,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.amulyakhare.textdrawable.TextDrawable;
import com.annimon.stream.Stream;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
@@ -55,7 +54,6 @@ import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Collections;
import java.util.List;
import java.util.Set;
public class ConversationListItem extends RelativeLayout
@@ -64,11 +62,9 @@ public class ConversationListItem extends RelativeLayout
private final static Typeface BOLD_TYPEFACE = Typeface.create("sans-serif-medium", Typeface.NORMAL);
private final static Typeface LIGHT_TYPEFACE = Typeface.create("sans-serif", Typeface.NORMAL);
private DcLot dcSummary;
private Set<Long> selectedThreads;
private long chatId;
private int msgId;
private GlideRequests glideRequests;
private TextView subjectView;
private FromTextView fromView;
private TextView dateView;
@@ -122,12 +118,10 @@ public class ConversationListItem extends RelativeLayout
boolean batchMode,
@Nullable String highlightSubstring)
{
this.dcSummary = dcSummary;
this.selectedThreads = selectedThreads;
Recipient recipient = thread.getRecipient();
this.chatId = thread.getThreadId();
this.msgId = msgId;
this.glideRequests = glideRequests;
int state = dcSummary.getState();
int unreadCount = thread.getUnreadCount();
@@ -138,6 +132,7 @@ public class ConversationListItem extends RelativeLayout
this.fromView.setText(recipient, state!=DcMsg.DC_STATE_IN_FRESH);
}
subjectView.setVisibility(chatId == DcChat.DC_CHAT_ID_ARCHIVED_LINK? GONE : VISIBLE);
this.subjectView.setText(thread.getDisplayBody());
this.subjectView.setTypeface(state==DcMsg.DC_STATE_IN_FRESH ? BOLD_TYPEFACE : LIGHT_TYPEFACE);
this.subjectView.setTextColor(state==DcMsg.DC_STATE_IN_FRESH ? ThemeUtil.getThemedColor(getContext(), R.attr.conversation_list_item_unread_color)
@@ -163,9 +158,10 @@ public class ConversationListItem extends RelativeLayout
this.avatar.setAvatar(glideRequests, recipient, false);
DcContact contact = recipient.getDcContact();
avatar.setSeenRecently(contact!=null? contact.wasSeenRecently() : false);
avatar.setSeenRecently(contact != null && contact.wasSeenRecently());
boolean isProtected = thread.isProtected() || DcHelper.getContext(getContext()).getChat((int)chatId).isDeviceTalk();
DcChat dcChat = DcHelper.getContext(getContext()).getChat((int)chatId);
boolean isProtected = dcChat.isDeviceTalk() || dcChat.isSelfTalk();
fromView.setCompoundDrawablesWithIntrinsicBounds(
thread.isMuted()? R.drawable.ic_volume_off_grey600_18dp : 0,
@@ -180,11 +176,10 @@ public class ConversationListItem extends RelativeLayout
{
this.selectedThreads = Collections.emptySet();
Recipient recipient = new Recipient(getContext(), contact);
this.glideRequests = glideRequests;
fromView.setText(getHighlightedSpan(contact.getDisplayName(), highlightSubstring));
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, contact.isVerified()? R.drawable.ic_verified : 0, 0);
subjectView.setText(getHighlightedSpan(contact.getAddr(), highlightSubstring));
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
subjectView.setVisibility(GONE);
dateView.setText("");
dateView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
archivedBadgeView.setVisibility(GONE);
@@ -205,10 +200,10 @@ public class ConversationListItem extends RelativeLayout
DcContact sender = dcContext.getContact(messageResult.getFromId());
this.selectedThreads = Collections.emptySet();
Recipient recipient = new Recipient(getContext(), sender);
this.glideRequests = glideRequests;
fromView.setText(recipient, true);
fromView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
subjectView.setVisibility(VISIBLE);
subjectView.setText(getHighlightedSpan(messageResult.getSummarytext(512), highlightSubstring));
long timestamp = messageResult.getTimestamp();
@@ -312,9 +307,9 @@ public class ConversationListItem extends RelativeLayout
if (thread!=null && thread.getVisibility()==DcChat.DC_CHAT_VISIBILITY_PINNED) {
bg = R.attr.pinned_list_item_background;
}
TypedArray ta = getContext().obtainStyledAttributes(new int[] { bg });
ViewUtil.setBackground(this, ta.getDrawable(0));
ta.recycle();
try (TypedArray ta = getContext().obtainStyledAttributes(new int[]{bg})) {
ViewUtil.setBackground(this, ta.getDrawable(0));
}
}
private Spanned getHighlightedSpan(@Nullable String value,
@@ -332,12 +327,12 @@ public class ConversationListItem extends RelativeLayout
String normalizedValue = value.toLowerCase(Util.getLocale());
String normalizedTest = highlight.toLowerCase(Util.getLocale());
List<String> testTokens = Stream.of(normalizedTest.split(" ")).filter(s -> s.trim().length() > 0).toList();
Spannable spanned = new SpannableString(value);
int searchStartIndex = 0;
for (String token : testTokens) {
for (String token : normalizedTest.split(" ")) {
if (token.trim().isEmpty()) continue;
if (searchStartIndex >= spanned.length()) {
break;
}
@@ -71,17 +71,6 @@ public class ConversationTitleView extends RelativeLayout {
title.setText(dcChat.getName());
String subtitleStr = null;
// set icons etc.
int imgLeft = 0;
int imgRight = 0;
if (dcChat.isMuted()) {
imgLeft = R.drawable.ic_volume_off_white_18dp;
}
if (dcChat.isProtected() || dcChat.isDeviceTalk()) {
imgRight = R.drawable.ic_verified;
}
boolean isOnline = false;
int[] chatContacts = dcContext.getChatContacts(chatId);
if (dcChat.isMailingList()) {
@@ -93,16 +82,15 @@ public class ConversationTitleView extends RelativeLayout {
subtitleStr = context.getString(R.string.super_group);
}
}
} else if (dcChat.isBroadcast()) {
} else if (dcChat.isInBroadcast()) {
subtitleStr = context.getString(R.string.channel);
} else if (dcChat.isOutBroadcast()) {
if (!profileView) {
subtitleStr = context.getResources().getQuantityString(R.plurals.n_recipients, chatContacts.length, chatContacts.length);
}
} else if( dcChat.isMultiUser() ) {
if (!profileView) {
if (dcContext.isCommunity() && chatContacts.length == 1)
subtitleStr = context.getString(R.string.super_group);
else
subtitleStr = context.getResources().getQuantityString(R.plurals.n_members, chatContacts.length, chatContacts.length);
subtitleStr = context.getResources().getQuantityString(R.plurals.n_members, chatContacts.length, chatContacts.length);
}
} else if( chatContacts.length>=1 ) {
if( dcChat.isSelfTalk() ) {
@@ -114,7 +102,7 @@ public class ConversationTitleView extends RelativeLayout {
else {
DcContact dcContact = dcContext.getContact(chatContacts[0]);
isOnline = dcContact.wasSeenRecently();
if (profileView) {
if (profileView || !dcChat.isEncrypted()) {
subtitleStr = dcContact.getAddr();
} else if (dcContact.isBot()) {
subtitleStr = context.getString(R.string.bot);
@@ -122,9 +110,7 @@ public class ConversationTitleView extends RelativeLayout {
subtitleStr = context.getString(R.string.online);
} else {
long timestamp = dcContact.getLastSeen();
if (timestamp == 0) {
subtitleStr = dcContact.getAddr();
} else {
if (timestamp >= 0) {
subtitleStr = context.getString(R.string.last_seen_at, DateUtils.getExtendedTimeSpanString(context, timestamp));
}
}
@@ -133,6 +119,8 @@ public class ConversationTitleView extends RelativeLayout {
avatar.setAvatar(glideRequests, new Recipient(getContext(), dcChat), false);
avatar.setSeenRecently(isOnline);
int imgLeft = dcChat.isMuted()? R.drawable.ic_volume_off_white_18dp : 0;
int imgRight = dcChat.isSelfTalk() || dcChat.isDeviceTalk()? R.drawable.ic_verified : 0;
title.setCompoundDrawablesWithIntrinsicBounds(imgLeft, 0, imgRight, 0);
if (!TextUtils.isEmpty(subtitleStr)) {
subtitle.setText(subtitleStr);
@@ -151,13 +139,7 @@ public class ConversationTitleView extends RelativeLayout {
avatar.setAvatar(glideRequests, new Recipient(getContext(), contact), false);
avatar.setSeenRecently(contact.wasSeenRecently());
int imgRight = 0;
if (contact.isVerified()) {
imgRight = R.drawable.ic_verified;
}
title.setText(contact.getDisplayName());
title.setCompoundDrawablesWithIntrinsicBounds(0, 0, imgRight, 0);
subtitle.setText(contact.getAddr());
subtitle.setVisibility(View.VISIBLE);
}
@@ -175,8 +157,4 @@ public class ConversationTitleView extends RelativeLayout {
public void setOnBackClickedListener(@Nullable OnClickListener listener) {
this.back.setOnClickListener(listener);
}
public void registerForContextMenu(Activity activity) {
activity.registerForContextMenu(content);
}
}
@@ -26,7 +26,6 @@ public class ConversationUpdateItem extends BaseConversationItem
{
private DeliveryStatusView deliveryStatusView;
private AppCompatImageView appIcon;
private AppCompatImageView verifiedIcon;
private int textColor;
public ConversationUpdateItem(Context context) {
@@ -46,7 +45,6 @@ public class ConversationUpdateItem extends BaseConversationItem
bodyText = findViewById(R.id.conversation_update_body);
deliveryStatusView = new DeliveryStatusView(findViewById(R.id.delivery_indicator));
appIcon = findViewById(R.id.app_icon);
verifiedIcon = findViewById(R.id.verified_icon);
bodyText.setOnLongClickListener(passthroughClickListener);
@@ -113,16 +111,6 @@ public class ConversationUpdateItem extends BaseConversationItem
appIcon.setVisibility(GONE);
}
if (infoType == DcMsg.DC_INFO_PROTECTION_ENABLED) {
verifiedIcon.setVisibility(VISIBLE);
verifiedIcon.setImageResource(R.drawable.ic_verified);
} else if (infoType == DcMsg.DC_INFO_PROTECTION_DISABLED) {
verifiedIcon.setVisibility(VISIBLE);
verifiedIcon.setImageResource(R.drawable.ic_verified_broken);
} else {
verifiedIcon.setVisibility(GONE);
}
bodyText.setText(messageRecord.getDisplayBody());
bodyText.setVisibility(VISIBLE);
@@ -1,99 +0,0 @@
package org.thoughtcrime.securesms;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcMsg;
import org.thoughtcrime.securesms.components.AvatarImageView;
import org.thoughtcrime.securesms.components.ConversationItemFooter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Set;
public class ConversationVideochatItem extends LinearLayout
implements BindableConversationItem
{
private TextView body;
private ConversationItemFooter footer;
private AvatarImageView contactPhoto;
private ViewGroup contactPhotoHolder;
private DcMsg dcMsg;
public ConversationVideochatItem(Context context) {
super(context);
}
public ConversationVideochatItem(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onFinishInflate() {
super.onFinishInflate();
this.body = findViewById(R.id.conversation_update_body);
this.footer = findViewById(R.id.conversation_item_footer);
this.contactPhoto = findViewById(R.id.contact_photo);
this.contactPhotoHolder = findViewById(R.id.contact_photo_container);
}
@Override
public void bind(@NonNull DcMsg dcMsg,
@NonNull DcChat dcChat,
@NonNull GlideRequests glideRequests,
@NonNull Set<DcMsg> batchSelected,
@NonNull Recipient conversationRecipient,
boolean pulseUpdate)
{
this.dcMsg = dcMsg;
DcContext dcContext = DcHelper.getContext(getContext());
DcContact dcContact = dcContext.getContact(dcMsg.getFromId());
CharSequence line1 = dcMsg.isOutgoing()? getContext().getString(R.string.videochat_you_invited_hint) :
getContext().getString(R.string.videochat_contact_invited_hint, dcContact.getDisplayName());
CharSequence line2 = Util.getBoldedString(dcMsg.isOutgoing()? getContext().getString(R.string.videochat_tap_to_open) :
getContext().getString(R.string.videochat_tap_to_join));
body.setText(TextUtils.concat(line1, "\n", line2));
contactPhoto.setAvatar(glideRequests, new Recipient(getContext(), dcContact), true);
setSelected(batchSelected.contains(dcMsg));
setFooter(dcMsg);
}
private void setFooter(@NonNull DcMsg dcMsg) {
ViewUtil.updateLayoutParams(footer, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
footer.setVisibility(VISIBLE);
footer.setMessageRecord(dcMsg);
}
@Override
public void setEventListener(@Nullable EventListener listener) {
// No events to report yet
}
@Override
public DcMsg getMessageRecord() {
return dcMsg;
}
@Override
public void unbind() {
}
}

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