Compare commits

...

1027 Commits

Author SHA1 Message Date
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
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
adbenitez f0fb8e62f8 show trash/delete icon when selecting a message 2025-03-02 02:09:32 +01:00
adbenitez 823e6b6e1f update build.gradle 2025-03-02 01:58:59 +01:00
adbenitez 49a59fbebe allow to access map 2025-03-02 01:58:13 +01:00
adbenitez 3424d60ea4 Merge remote-tracking branch 'upstream/main' 2025-03-02 01:49:54 +01:00
adbenitez 1ead71c87a update core 2025-03-02 01:49:27 +01:00
Hosted Weblate 7a44182c3f Merge remote-tracking branch 'origin/main' 2025-02-28 20:25:07 +01:00
adb 75c111cb0b Merge pull request #3641 from deltachat/adb/tweak-release-instructions
update amazon instructions
2025-02-28 20:25:04 +01:00
adbenitez 1c9b51f5dc update amazon instructions 2025-02-28 20:01:45 +01:00
Hosted Weblate 5e88059283 Merge remote-tracking branch 'origin/main' 2025-02-28 16:43:31 +01:00
B. Petersen 76307706f1 update translations 2025-02-28 16:43:22 +01:00
adbenitez 4db770b1f8 Merge remote-tracking branch 'upstream/main' 2025-02-28 15:38:30 +01:00
Hosted Weblate 96e635f0bd Merge remote-tracking branch 'origin/main' 2025-02-28 14:37:01 +00:00
adb 7dd3176a06 Merge pull request #3637 from deltachat/prep-1.54.2
prepare 1.54.2
2025-02-28 15:36:55 +01:00
adbenitez 16037e7693 update version number and changelog 2025-02-28 14:35:59 +01:00
adbenitez 6f5756c331 Merge remote-tracking branch 'upstream/main' 2025-02-28 14:12:59 +01:00
Hosted Weblate 8aa7dfabe6 Merge remote-tracking branch 'origin/main' 2025-02-28 14:00:55 +01:00
adb 13c45f37e7 Merge pull request #3636 from deltachat/update-core-28/2/25
update core to  1.156.1
2025-02-28 14:00:49 +01:00
adbenitez c45b5fe9e4 update deltachat-core-rust to 'chore(release): prepare for 1.156.1' of 'v1.156.1' 2025-02-28 13:54:03 +01:00
adbenitez 0a9d042747 fix colors 2025-02-28 02:32:10 +01:00
adbenitez 6cbbb9608e Merge remote-tracking branch 'upstream/adb/allow-to-edit-and-delete-for-all' 2025-02-28 00:10:20 +01:00
adbenitez f8766820db Merge remote-tracking branch 'upstream/main' 2025-02-27 23:46:10 +01:00
adbenitez a2847ea45e allow to edit messages 2025-02-27 23:10:16 +01:00
adbenitez 841e5ee30a show "delete for everyone" in MediaPreviewActivity 2025-02-27 22:55:44 +01:00
adbenitez 624f797888 allow to "delete for everyone" outgoing messages 2025-02-27 22:30:31 +01:00
adbenitez a640c81c73 add bindings for new "delete for everyone" API 2025-02-27 22:29:58 +01:00
Hosted Weblate cd344daf5a Merge remote-tracking branch 'origin/main' 2025-02-27 22:29:28 +01:00
adb 247ddfcf1a Merge pull request #3635 from deltachat/adb/update-some-strings-usage
avoid using some deprecated strings
2025-02-27 22:29:25 +01:00
adbenitez d09ad5748d deprecate cannot_delete_contacts_in_use 2025-02-27 22:28:48 +01:00
Hosted Weblate 4658adc2cd Merge remote-tracking branch 'origin/main' 2025-02-27 22:24:57 +01:00
B. Petersen 30ddf2b03e clarify deletion impact 2025-02-27 22:24:54 +01:00
adbenitez edb2c963c6 avoid using some deprecated strings 2025-02-27 22:24:23 +01:00
adbenitez cf2f6bd2ec Merge remote-tracking branch 'upstream/main' 2025-02-27 20:51:22 +01:00
Hosted Weblate 62ad0e942f Merge remote-tracking branch 'origin/main' 2025-02-27 19:31:25 +00:00
adb 8cc8ee404d Merge pull request #3632 from deltachat/prep-1.54.1
prepare 1.54.1
2025-02-27 20:31:20 +01:00
adbenitez 180b278a95 bump version 2025-02-27 19:29:26 +01:00
adbenitez e91671b958 update changelog 2025-02-27 19:28:32 +01:00
Hosted Weblate 7e0fc59687 Merge remote-tracking branch 'origin/main' 2025-02-27 17:54:48 +00:00
adb 255a96d393 Merge pull request #3631 from deltachat/adb/issue-3627
don't allow editing for now
2025-02-27 18:54:43 +01:00
adbenitez dfed8aec00 Merge remote-tracking branch 'upstream/main' 2025-02-27 18:53:58 +01:00
adbenitez a498d58c2a don't allow editing for now 2025-02-27 18:48:09 +01:00
Hosted Weblate 4ec02a59de Merge remote-tracking branch 'origin/main' 2025-02-27 17:38:52 +00:00
B. Petersen 276c0785fa update local help 2025-02-27 18:38:45 +01:00
B. Petersen 6a4efb3358 update translations 2025-02-27 18:38:45 +01:00
Hosted Weblate bcad4a7302 Merge remote-tracking branch 'origin/main' 2025-02-27 18:30:11 +01:00
B. Petersen 120007d87a add a warning when scanning a backup QR code from a too new delta chat version 2025-02-27 18:30:05 +01:00
Hosted Weblate 55eab9dd0b Merge remote-tracking branch 'origin/main' 2025-02-27 18:26:49 +01:00
adb ea99f0cd48 Merge pull request #3621 from deltachat/adb/cleanup-ContactSelectionListAdapter
cleanup ContactSelectionListAdapter
2025-02-27 18:26:43 +01:00
Hosted Weblate 6f6cd80516 Merge remote-tracking branch 'origin/main' 2025-02-27 18:25:30 +01:00
adb 2bb63878b1 Merge pull request #3601 from deltachat/adb/allow-to-edit-msg
allow to edit message
2025-02-27 18:25:27 +01:00
adbenitez c5d7ec0946 don't allow to edit html messages 2025-02-27 17:41:53 +01:00
adbenitez da7a3fc50a tweak menu 2025-02-27 17:41:53 +01:00
adbenitez 9c36749619 remove unnecessary icon for reply menu item 2025-02-27 17:41:53 +01:00
adbenitez cb3fd74af9 move delete-messages to the end and make it red 2025-02-27 17:41:53 +01:00
adbenitez 7b11c5dd79 re-organize menu and add pencil icon 2025-02-27 17:41:53 +01:00
adbenitez e3c108c773 use new strings 2025-02-27 17:41:53 +01:00
adbenitez 6621046d6d cancel editing when user swipe-to-reply a message 2025-02-27 17:41:53 +01:00
adbenitez ed23c93526 fix: don't discard draft if not in editing mode 2025-02-27 17:41:53 +01:00
adbenitez 19cd640dc8 tweak code style 2025-02-27 17:41:53 +01:00
adbenitez f1fe3e0807 allow to edit any normal message with text, not only "text viewtype" 2025-02-27 17:41:53 +01:00
adbenitez fce62453d1 show "Edit Message" instead of "Me" in edition mode 2025-02-27 17:41:53 +01:00
adbenitez 441f943190 add "edited" label 2025-02-27 17:41:53 +01:00
adbenitez fb759e12f0 fix bindings 2025-02-27 17:41:53 +01:00
adbenitez d1737cb69f allow to edit outgoing text messages 2025-02-27 17:41:51 +01:00
adbenitez c94f9371fe add C bindings 2025-02-27 17:32:56 +01:00
Hosted Weblate c88a1b53b0 Merge remote-tracking branch 'origin/main' 2025-02-27 16:25:35 +00:00
B. Petersen 2e2aeed127 update deltachat-core-rust to 'chore(release): prepare for 1.156.0' of 'v1.156.0' 2025-02-27 17:25:10 +01:00
adbenitez 6e764a6f2f Merge remote-tracking branch 'upstream/main' 2025-02-27 00:10:57 +01:00
Hosted Weblate 669d8f4cba Merge remote-tracking branch 'origin/main' 2025-02-27 00:04:13 +01:00
adb d8cdc21880 Merge pull request #3624 from deltachat/adb/cleanup-AdvancedPreferenceFragment
cleanup AdvancedPreferenceFragment
2025-02-27 00:04:07 +01:00
Hosted Weblate c083195acf Merge remote-tracking branch 'origin/main' 2025-02-27 00:03:02 +01:00
adb 139dafab7a Merge pull request #3625 from deltachat/adb/cleanup-ChatsPreferenceFragment
cleanup ChatsPreferenceFragment
2025-02-27 00:02:56 +01:00
adbenitez ef8ac7ae04 Merge remote-tracking branch 'upstream/main' 2025-02-27 00:02:20 +01:00
Hosted Weblate 7c6d47bfae Merge remote-tracking branch 'origin/main' 2025-02-26 23:14:09 +01:00
adb 185fd5d730 Merge pull request #3623 from deltachat/adb/code-cleanup3
fix some more linter warnings
2025-02-26 23:14:04 +01:00
Hosted Weblate ef4f79b4a3 Merge remote-tracking branch 'origin/main' 2025-02-26 23:13:22 +01:00
adb c09be6c35b Merge pull request #3626 from deltachat/adb/cleanup-NotificationsPreferenceFragment
cleanup NotificationsPreferenceFragment
2025-02-26 23:13:13 +01:00
adbenitez 2a385c6768 cleanup NotificationsPreferenceFragment 2025-02-26 22:27:25 +01:00
adbenitez 93a114cff4 cleanup ChatsPreferenceFragment 2025-02-26 22:26:02 +01:00
adbenitez 49dab181aa cleanup AdvancedPreferenceFragment 2025-02-26 22:24:14 +01:00
adbenitez 3ad9ffd94f fix some linter warnings 2025-02-26 22:21:27 +01:00
adbenitez 53f1c73e52 cleanup ContactSelectionListAdapter 2025-02-26 20:17:10 +01:00
adbenitez 641c3da629 Merge remote-tracking branch 'upstream/main' 2025-02-26 19:57:23 +01:00
Hosted Weblate 491bbfade0 Merge remote-tracking branch 'origin/main' 2025-02-26 18:55:00 +00:00
adb f8dc6bb3db Merge pull request #3618 from deltachat/adb/code-cleanup-26/2/25
fix some linter warnings
2025-02-26 19:54:55 +01:00
adbenitez b0d842b3c4 Merge remote-tracking branch 'upstream/main' 2025-02-26 19:54:43 +01:00
adbenitez 9cc4422f9e Merge remote-tracking branch 'upstream/main' 2025-02-26 19:54:22 +01:00
Hosted Weblate dce7d56fb2 Merge remote-tracking branch 'origin/main' 2025-02-26 19:37:48 +01:00
adb 9b9a546e69 Merge pull request #3619 from deltachat/adb/remove-RepeatableImageKey
remove unused class RepeatableImageKey
2025-02-26 19:37:43 +01:00
Hosted Weblate 1787d8665c Merge remote-tracking branch 'origin/main' 2025-02-26 18:37:27 +00:00
adb f29f8bf5f9 Merge pull request #3617 from deltachat/adb/cleanup-ImageDivet
cleanup ImageDivet
2025-02-26 19:37:21 +01:00
adbenitez 3b7fd24fcb delete ImageDivet 2025-02-26 17:12:57 +01:00
adbenitez acdbba6351 cleanup ImageDivet 2025-02-26 17:12:57 +01:00
Hosted Weblate 2134f97956 Merge remote-tracking branch 'origin/main' 2025-02-26 16:57:08 +01:00
B. Petersen f45fd60ccd update translations 2025-02-26 16:57:01 +01:00
adbenitez dabe68fbf8 remove unused class RepeatableImageKey 2025-02-26 16:54:19 +01:00
adbenitez 7193b4d64e fix some linter warnings 2025-02-26 16:53:46 +01:00
Hosted Weblate bf138aa2e7 Merge remote-tracking branch 'origin/main' 2025-02-26 16:49:08 +01:00
B. Petersen b5000e2fb9 add second device: warn about 3rd parties
this PR adds a hint about making sure no 3rd party
can see the "Add Second Device" QR code.

the dialog and the hint are already used on all OS,
so that is a low hanging fruit -
(compared to other ideas of changing flow direction etc,
which we might go for at some point;
however, that would be lots of effort on all UI,
is tricky UX wise, will come with new bugs and other cornercases,
and are also not bullet save against careless users,
"hey, scan my QR code ... no, from 'Add Second Device, Next, Next ...'" :)
2025-02-26 16:49:04 +01:00
Hosted Weblate cbd4e2b520 Merge remote-tracking branch 'origin/main' 2025-02-26 12:00:18 +00:00
B. Petersen bf4087792d add strings 'delete for me/everyone' 2025-02-26 13:00:12 +01:00
B. Petersen 25164af440 tweak wording 2025-02-26 13:00:12 +01:00
B. Petersen 9579bd5bc8 reword message deletion string 2025-02-26 13:00:12 +01:00
Hosted Weblate 713623c11d Merge remote-tracking branch 'origin/main' 2025-02-25 23:48:31 +01:00
adb f2ee08a7f1 Merge pull request #3616 from deltachat/adb/cleanup-AvatarImageView
cleanup AvatarImageView
2025-02-25 23:48:25 +01:00
Hosted Weblate 66339d77bf Merge remote-tracking branch 'origin/main' 2025-02-25 22:48:14 +00:00
adb 1da80e9264 Merge pull request #3615 from deltachat/adb/fix-warnings-AccountSelectionListFragment
fix linter warnings in AccountSelectionListFragment
2025-02-25 23:48:07 +01:00
adbenitez f501c41d16 cleanup AvatarImageView 2025-02-25 23:18:17 +01:00
adbenitez ec7e3fc91a remove unused import 2025-02-25 22:22:04 +01:00
adbenitez 5e91902a26 fix linter warnings in AccountSelectionListFragment 2025-02-25 22:19:20 +01:00
Hosted Weblate 8b5b2d2f95 Merge remote-tracking branch 'origin/main' 2025-02-25 21:01:43 +01:00
adb 523b62cfeb Merge pull request #3614 from deltachat/adb/update-gson
update gson lib that was pinned for android4 compat
2025-02-25 21:01:37 +01:00
Hosted Weblate 19c158d1c4 Merge remote-tracking branch 'origin/main' 2025-02-25 20:54:49 +01:00
adb af1cbd09ce Merge pull request #3613 from deltachat/adb/optimize-imports
optimize imports
2025-02-25 20:54:45 +01:00
adbenitez 9b3dc7d434 update gson lib that was pinned for android4 compat 2025-02-25 18:57:48 +01:00
adbenitez 4547f771f5 optimize imports 2025-02-25 18:43:23 +01:00
Hosted Weblate be6f30da24 Merge remote-tracking branch 'origin/main' 2025-02-25 17:22:15 +00:00
adb bb0ae0772e Merge pull request #3612 from deltachat/adb/non-final-resource-ids
fix warning about non-final resource IDs
2025-02-25 18:22:09 +01:00
Hosted Weblate c38c5a5d36 Merge remote-tracking branch 'origin/main' 2025-02-25 16:55:01 +00:00
adb bd3ab20981 Merge pull request #3611 from deltachat/adb/cleanup-AccountSelectionListAdapter
cleanup AccountSelectionListAdapter
2025-02-25 17:54:53 +01:00
adbenitez 3dc216ca7f fix warning about non-final resource IDs 2025-02-25 17:46:09 +01:00
Hosted Weblate 9d9630041e Merge remote-tracking branch 'origin/main' 2025-02-25 17:40:14 +01:00
adb 5095892847 Merge pull request #3610 from deltachat/adb/remove-android4-deps
remove some android4 depenedencies
2025-02-25 17:40:05 +01:00
adbenitez 25d0f4d017 cleanup AccountSelectionListAdapter 2025-02-25 17:10:08 +01:00
adbenitez 3306c3e8d1 remove some android4 depenedencies 2025-02-25 16:53:49 +01:00
adbenitez fa0c59d01c add force encryption toggle 2025-02-24 23:07:50 +01:00
adbenitez 94291bd0ab Merge remote-tracking branch 'upstream/main' 2025-02-24 17:24:36 +01:00
Hosted Weblate ff0e004e20 Merge remote-tracking branch 'origin/main' 2025-02-22 20:07:55 +01:00
B. Petersen 415785b59d update translations 2025-02-22 20:07:52 +01:00
Hosted Weblate a8f17d618b Merge remote-tracking branch 'origin/main' 2025-02-22 20:00:56 +01:00
B. Petersen c0e45abd3d remove 'server' part from asking about message deletion 2025-02-22 20:00:52 +01:00
Hosted Weblate ca8767e0b0 Merge remote-tracking branch 'origin/main' 2025-02-20 23:47:10 +01:00
adb de96a4dc6e Merge pull request #3603 from deltachat/adb/update-forward-icon
update forward icon
2025-02-20 23:47:06 +01:00
Hosted Weblate 04d8437b89 Merge remote-tracking branch 'origin/main' 2025-02-20 23:28:49 +01:00
B. Petersen 38ed95003f removed unused setFile()
the corresponding cffi function will be removed soon,
see https://github.com/deltachat/deltachat-core-rust/pull/6558
2025-02-20 23:28:43 +01:00
adbenitez ca174e82a2 update forward icon 2025-02-20 22:05:32 +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
B. Petersen 7b833b43d7 remove deprecated strings 2025-02-20 12:05:42 +01:00
B. Petersen f8cee59e28 use new 'edit message' strings 2025-02-20 12:05:42 +01:00
B. Petersen 2f85654567 update translations 2025-02-20 12:05:42 +01:00
Hosted Weblate 205a7fd10e Merge remote-tracking branch 'origin/main' 2025-02-19 16:50:19 +00:00
adb b0ab464ef8 Merge pull request #3600 from deltachat/adb/use-rpc-for-add-account
use JSON-RPC for addAccount
2025-02-19 17:50:11 +01:00
adbenitez c1a49332d0 use JSON-RPC for addAccount 2025-02-19 16:33:31 +01:00
adbenitez a69ff20ac4 point to Lemmy community for changelogs 2025-02-17 15:49:37 +01:00
Hosted Weblate ddd4cacd1d Merge remote-tracking branch 'origin/main' 2025-02-17 05:30:42 +01:00
adbenitez 836e11ca27 update build.gradle 2025-02-17 00:04:35 +01:00
adbenitez 4fc53a4632 Merge remote-tracking branch 'upstream/adb/issue-3591' 2025-02-16 22:42:13 +01:00
adbenitez 1391a902b0 update core 2025-02-16 22:36:45 +01:00
adbenitez 876bdcacf1 remove apklis store 2025-02-16 22:26:22 +01:00
adbenitez 37e6bbc53c Merge remote-tracking branch 'upstream/main' 2025-02-16 22:22:59 +01:00
adb ab05222c32 Merge pull request #3596 from deltachat/adb/cleanup-ApplicationPreferencesActivity
cleanup ApplicationPreferencesActivity
2025-02-16 22:19:04 +01:00
adbenitez e87a3de296 add "Donate" to settings 2025-02-16 22:18:36 +01:00
adbenitez 9d96d7311c revert removal of comments 2025-02-16 21:47:25 +01:00
adbenitez 52b7f10c1b cleanup ApplicationPreferencesActivity 2025-02-16 21:25:19 +01:00
adbenitez 3ae4bf238e Merge remote-tracking branch 'upstream/main' 2025-02-16 21:03:25 +01:00
adbenitez a630fad9b0 disable broadcast lists for chatmail 2025-02-14 01:50:23 +01:00
adbenitez 6543ad0893 update metadata 2025-02-13 23:54:11 +01:00
Hosted Weblate 4ca4d81345 Merge remote-tracking branch 'origin/main' 2025-02-12 20:32:50 +01:00
adb 3b8a3e10ad Merge pull request #3595 from deltachat/adb/allow-to-add-chat-to-home-screen
allow to add any chat to the home screen
2025-02-12 20:32:44 +01:00
adbenitez 814f892e98 allow to add any chat to the home screen 2025-02-12 18:05:22 +01:00
adbenitez 8a2149b67d hide the Encryption category completed for chatmail accounts 2025-02-11 21:54:50 +01:00
adbenitez ebfd9ca122 Merge remote-tracking branch 'upstream/main' 2025-02-11 15:33:30 +01:00
Hosted Weblate ba34971d2b Merge remote-tracking branch 'origin/main' 2025-02-11 13:08:53 +00:00
adb 91f8e88db3 Merge pull request #3592 from deltachat/prep-1.54.0
Prep 1.54.0
2025-02-11 14:08:47 +01:00
adb a93b12909d Update CHANGELOG.md
Co-authored-by: bjoern <r10s@b44t.com>
2025-02-11 14:07:59 +01:00
adbenitez 8403abc5b9 update version number 2025-02-11 11:49:17 +01:00
adbenitez c49599f9c8 update changelog 2025-02-11 11:48:55 +01:00
Hosted Weblate deed7a569c Merge remote-tracking branch 'origin/main' 2025-02-11 10:31:37 +00:00
adb ec590613d0 Merge pull request #3590 from deltachat/update-core-and-stuff-10/2/25
Update core and stuff 10/2/25
2025-02-11 11:31:31 +01:00
Hosted Weblate 24d1ca9015 Merge remote-tracking branch 'origin/main' 2025-02-11 11:31:01 +01:00
adb 0c914b3771 Merge pull request #3589 from deltachat/adb/fix-2957
direcly use awebp lib instead of broad glide plugin
2025-02-11 11:30:56 +01:00
adbenitez 24e363e130 update internal help and translations 2025-02-11 00:27:10 +01:00
adbenitez 85b9444f86 update deltachat-core-rust to 'chore(release): prepare for 1.155.4' of 'v1.155.4' 2025-02-10 23:43:01 +01:00
adbenitez 19f6bd3b5c use WebPDecoderResource instead of SimpleResource 2025-02-10 17:23:04 +01:00
adbenitez 1999bab9a0 direcly use awebp lib instead of broad glide plugin 2025-02-10 17:13:06 +01:00
Hosted Weblate e6325578ca Merge remote-tracking branch 'origin/main' 2025-02-08 20:25:30 +01:00
B. Petersen 44eb9b32fd fix: hide 'clone chat' if there is no chat
before, 'clone chat' was hidden for contacts having a one-to-one-chats,
but not for contacts _without_ a one-to-one-chat
2025-02-08 20:25:25 +01:00
adbenitez c5cf11d36a update core 2025-02-07 19:08:49 +01:00
adbenitez fc36c6793e Merge remote-tracking branch 'upstream/main' 2025-02-07 19:08:10 +01:00
Hosted Weblate 669a1a769d Merge remote-tracking branch 'origin/main' 2025-02-07 18:43:47 +01:00
adb 257e200c9c Merge pull request #3073 from deltachat/r10s/improve-saved-messages
improve saved messages
2025-02-07 18:43:41 +01:00
adb 2c2bd2bf48 Merge branch 'main' into r10s/improve-saved-messages 2025-02-07 18:15:37 +01:00
adbenitez 95fbe25b0a rename variables to "bookmark" instead "stared" 2025-02-07 18:14:21 +01:00
Hosted Weblate ab7b2f4b1b Merge remote-tracking branch 'origin/main' 2025-02-07 15:51:32 +01:00
link2xt 97552bc751 Add "Past Members" string 2025-02-07 15:51:26 +01:00
adb a81cdb79ad Merge pull request #3586 from deltachat/adb/improve-saved-messages
improve improved saved messages
2025-02-07 15:22:55 +01:00
adbenitez 1b8de09c41 replace star with bookmark icon 2025-02-07 13:58:31 +01:00
adbenitez db427a036e use drawable for the stared footer mark 2025-02-07 13:02:53 +01:00
adbenitez ab2151b974 fix indentation 2025-02-07 12:40:55 +01:00
adbenitez 0fa59fa22d remove save/unsave action 2025-02-07 12:39:55 +01:00
adbenitez ec7807e662 use save API for msgs forwarded to "saved messages" 2025-02-07 12:26:16 +01:00
adbenitez d47196d899 add "jump to original" button to stared messages 2025-02-06 23:43:43 +01:00
adbenitez b692abc235 don't allow to star video-call messages 2025-02-06 20:44:09 +01:00
Hosted Weblate 07b55b739e Merge remote-tracking branch 'origin/main' 2025-02-06 12:46:26 +00:00
Hocuri e3809cf1f8 fix: Opening files in external apps always works now (#3585)
The problem was that we returned `null` from `getType()`.

fix #3517
2025-02-06 13:46:19 +01:00
adbenitez 564c0fe27d don't show staring option in saved messages chat 2025-02-05 22:38:16 +01:00
adbenitez 705e283cf5 Merge remote-tracking branch 'upstream/main' 2025-02-05 21:56:21 +01:00
adbenitez 40b5e10999 remove unused code 2025-02-05 21:54:18 +01:00
B. Petersen d1f77d9de5 add 'save' option to chat's action bar 2025-02-05 16:34:43 +01:00
B. Petersen 0704f7f1e7 render saved messages accordingly 2025-02-05 16:34:43 +01:00
Hosted Weblate 084707eb67 Merge remote-tracking branch 'origin/main' 2025-02-05 15:55:23 +01:00
adb 0eb02b59a3 Merge pull request #3582 from deltachat/adb/remove-deprecated-half-camera-dep
remove deprecated half-camera dependency
2025-02-05 15:55:19 +01:00
Hosted Weblate 00d411dd5a Merge remote-tracking branch 'origin/main' 2025-02-05 12:36:19 +01:00
bjoern 770861d6db update translations (#3584)
* remove deprecated strings, usage was checked with ./scripts/grep-string.sh

* add new 'Chat with...', needed currently only for iOS

* update translations
2025-02-05 12:36:14 +01:00
adb 17986e9d86 Merge branch 'main' into adb/remove-deprecated-half-camera-dep 2025-02-04 18:45:49 +01:00
adbenitez 5ce1f415ce remove deprecated half-camera dependency 2025-02-04 18:40:02 +01:00
adbenitez e1c92712a0 Merge remote-tracking branch 'upstream/main' 2025-02-04 16:18:00 +01:00
Hosted Weblate 1816a50dee Merge remote-tracking branch 'origin/main' 2025-02-03 23:41:19 +01:00
adb 6ec0f1bfce Merge pull request #3580 from deltachat/adb/issue-3566
align avatar to message bubble instead of parent bottom
2025-02-03 23:41:12 +01:00
adbenitez db410d8b44 align avatar to message bubble instead of parent bottom 2025-02-03 23:08:32 +01:00
Hosted Weblate 6c6c04ba53 Merge remote-tracking branch 'origin/main' 2025-02-03 10:58:11 +00:00
B. Petersen cd07f3de96 update translations 2025-02-03 11:58:06 +01:00
Hosted Weblate 145432a57d Merge remote-tracking branch 'origin/main' 2025-02-03 11:52:01 +01:00
B. Petersen 12072a0342 'exiting' may be misleading as others can create new groups with blocked contacts. try to clarify that aspect 2025-02-03 11:51:58 +01:00
B. Petersen c6f3761bb9 simplify unblock wording, it is somehow clear it is the opposite, other apps do not even clarify one way 2025-02-03 11:51:58 +01:00
B. Petersen 673f0e78b1 be more clear about the impact of blocked contacts 2025-02-03 11:51:58 +01:00
Hosted Weblate 20acd38ab4 Merge remote-tracking branch 'origin/main' 2025-02-03 11:45:23 +01:00
B. Petersen 65c8960ec8 update translations 2025-02-03 11:45:19 +01:00
Hosted Weblate bf7095d0ee Merge remote-tracking branch 'origin/main' 2025-02-03 00:49:08 +01:00
adb 089ecc67d1 Merge pull request #3576 from deltachat/r10s/empty-apps-wording
tweak wording in empty "all apps" and "all files" views
2025-02-03 00:49:01 +01:00
B. Petersen 0f84af5b32 adapt empty-hint also for 'files' 2025-02-02 18:52:31 +01:00
B. Petersen 710ed6dd56 in 'All Apps' tap, do not say 'Media will be shared here', but 'Apps will be shown here' 2025-02-02 18:37:49 +01:00
Hosted Weblate a6b168f4eb Merge remote-tracking branch 'origin/main' 2025-02-01 00:24:51 +01:00
adb 335aabd4ff Merge pull request #3570 from deltachat/adb/update-changelog-31/1/25
update changelog header for v1.52.1
2025-02-01 00:24:47 +01:00
adbenitez 98c97a8aed update changelog header for v1.52.1 2025-01-31 22:24:44 +01:00
adbenitez 23d18d2ac5 Merge remote-tracking branch 'upstream/main' 2025-01-31 21:28:47 +01:00
adbenitez a136b8b1e5 update version 2025-01-31 21:28:08 +01:00
adbenitez 7f8b71cf28 tweak attachment selector layout temporarily 2025-01-31 21:27:19 +01:00
adbenitez 9e5f2b18b9 update .github/FUNDING.yml 2025-01-31 19:50:37 +01:00
adbenitez bdfeddecd5 add "get it on google play" 2025-01-31 14:19:32 +01:00
Hosted Weblate 883536a3a5 Merge remote-tracking branch 'origin/main' 2025-01-31 12:38:01 +01:00
B. Petersen 23cbe63cd4 update translations 2025-01-31 12:37:57 +01:00
Hosted Weblate 3013af2a7a Merge remote-tracking branch 'origin/main' 2025-01-31 11:26:16 +00:00
B. Petersen f0f53455a5 do not deprecate string for smoother adaption of other OS 2025-01-31 12:26:09 +01:00
B. Petersen d8b49f57a9 always colorize 'Reset' as destructive-red 2025-01-31 12:26:09 +01:00
B. Petersen 7eaaf3bbb4 refine QR reset wording 2025-01-31 12:26:09 +01:00
adbenitez d4f83cd38b Merge remote-tracking branch 'upstream/main' 2025-01-30 02:03:47 +01:00
adbenitez 9eca5f518e disable location streaming for now 2025-01-30 02:02:42 +01:00
Hosted Weblate 7b52bb6c85 Merge remote-tracking branch 'origin/main' 2025-01-29 13:47:12 +00:00
B. Petersen d17bed02e6 update translations 2025-01-29 14:47:03 +01:00
B. Petersen b4b194a59b add app-picker-strings needed for iOS 2025-01-29 14:47:03 +01:00
Hosted Weblate 1439bc0a86 Merge remote-tracking branch 'origin/main' 2025-01-28 17:24:30 +01:00
adb c6f62a2b81 Merge pull request #3565 from deltachat/prep-1.52.1
Prep 1.52.1
2025-01-28 17:24:22 +01:00
adbenitez e3a9f42a56 update changelog 2025-01-28 17:23:56 +01:00
adb 323bcef1fe Update CHANGELOG.md
Co-authored-by: Hocuri <hocuri@gmx.de>
2025-01-28 17:13:54 +01:00
adbenitez 095b92b498 bump version number 2025-01-28 16:50:46 +01:00
adbenitez 18c2ccd66c update changelog 2025-01-28 16:36:39 +01:00
Hosted Weblate 9a5415eb66 Merge remote-tracking branch 'origin/main' 2025-01-28 15:31:22 +00:00
adb 28fdeac01c Merge pull request #3564 from deltachat/update-core-and-stuff-28/1/25
Update translations and core to 1.155.1
2025-01-28 16:31:11 +01:00
adbenitez a7e4267b9b update translations 2025-01-28 16:28:24 +01:00
adbenitez d6837aa121 update deltachat-core-rust to 'chore(release): prepare for 1.155.1' of 'v1.155.1' 2025-01-28 16:25:23 +01:00
adbenitez 5a2913b36f delete unused file 2025-01-28 02:37:25 +01:00
adbenitez 20180fa89c Merge remote-tracking branch 'upstream/main' 2025-01-27 22:06:04 +01:00
Hosted Weblate 5da3748a6a Merge remote-tracking branch 'origin/main' 2025-01-27 17:40:51 +00:00
Hocuri c6b89055d8 File deduplication, Android part (#3513) 2025-01-27 18:40:44 +01:00
Hosted Weblate 2308feea8c Merge remote-tracking branch 'origin/main' 2025-01-27 18:13:08 +01:00
adb bfda7ab2c3 Merge pull request #3562 from deltachat/adb/remove-android-crop-dep
remove unused com.soundcloud.android:android-crop dependency
2025-01-27 18:13:04 +01:00
adb 953ce32bea Merge branch 'main' into adb/remove-android-crop-dep 2025-01-27 17:40:34 +01:00
adbenitez 961fa5ffe6 remove unused com.soundcloud.android:android-crop dependency 2025-01-27 17:37:14 +01:00
adbenitez b1b2959bcb add .github/FUNDING.yml 2025-01-26 05:23:27 +01:00
Hosted Weblate a3b0ee1ef9 Merge remote-tracking branch 'origin/main' 2025-01-25 13:48:46 +00:00
link2xt 70ef715dc6 build(nix): update build tools from 33.0.1 to 34.0.0 2025-01-25 13:48:41 +00:00
adbenitez ffa58aae34 update bots index 2025-01-24 22:09:54 +01:00
adbenitez 24f5209c03 always create protected groups 2025-01-24 20:34:49 +01:00
adbenitez 7fd96732d6 Merge remote-tracking branch 'upstream/main' 2025-01-24 20:27:40 +01:00
Hosted Weblate 4fa5f1f5c6 Merge remote-tracking branch 'origin/main' 2025-01-23 23:37:05 +01:00
adb 6e0759f719 Merge pull request #3560 from deltachat/prep-1.52.0
prepare 1.52.0
2025-01-23 23:37:01 +01:00
adbenitez 63434e1e2f prepare 1.52.0 2025-01-23 20:03:59 +01:00
Hosted Weblate f4701b92e2 Merge remote-tracking branch 'origin/main' 2025-01-23 19:28:06 +01:00
adb 9c17bc412a Merge pull request #3559 from deltachat/update-core-and-stuff-23/1/25
Update core and stuff 23/1/25
2025-01-23 19:21:15 +01:00
adb d40144d50c Merge branch 'main' into update-core-and-stuff-23/1/25 2025-01-23 19:19:43 +01:00
adbenitez 131c0f5a37 update strings 2025-01-23 19:17:18 +01:00
adbenitez 7086314d8b update deltachat-core-rust to 'chore(release): prepare for 1.155.0' of 'v1.155.0' 2025-01-23 19:11:11 +01:00
Hosted Weblate 6649165b56 Merge remote-tracking branch 'origin/main' 2025-01-23 13:23:08 +01:00
adb d75b2c2bb7 Merge pull request #3558 from deltachat/adb/issue-3557
pass account ID in chat shortcuts and properly switch to account
2025-01-23 13:23:00 +01:00
adbenitez c46d174869 update strings 2025-01-23 05:37:55 +01:00
adbenitez 17e03f2903 update buid.gradle 2025-01-23 04:38:58 +01:00
adbenitez 2c12a34051 improve instant onboarding 2025-01-23 04:33:23 +01:00
adbenitez 2d3dde2101 pass account ID in chat shortcuts and properly switch to account 2025-01-23 03:45:57 +01:00
adbenitez d539f5ecf2 Merge remote-tracking branch 'upstream/main' 2025-01-23 02:45:56 +01:00
adbenitez b17d6be4fc update build.gradle 2025-01-23 00:52:48 +01:00
Hosted Weblate 1c9b5977a8 Merge remote-tracking branch 'origin/main' 2025-01-23 00:51:15 +01:00
B. Petersen 3c737f2360 streamline help menu
- use clear "Delta Chat Homepage" for opening our homepage
  (instead of unclear "Learn more about Delta Chat",
  which is esp. weird, when used from inside the help)

- do not "promote" GitHub in our menu entry,
  instead of "Contribute on GitHub", just say "Contribute".
  destination URL is our contribute page then -
  that is also more useful for ppl doing eg. translations
2025-01-23 00:51:06 +01:00
Hosted Weblate 49471999b9 Merge remote-tracking branch 'origin/main' 2025-01-22 13:40:13 +01:00
adb 9ac5e714b8 Merge pull request #3555 from deltachat/adb/update-deps-22/1/25
update some dependencies
2025-01-22 13:40:08 +01:00
adbenitez 94defa3091 update some dependencies 2025-01-22 01:43:21 +01:00
adbenitez 052ada221e update some deps 2025-01-22 01:42:21 +01:00
adbenitez 1d5e4cf2a9 update README 2025-01-22 00:54:00 +01:00
adbenitez c46aef3ea0 Merge remote-tracking branch 'upstream/main' 2025-01-22 00:52:57 +01:00
Hosted Weblate 86a8fbf463 Merge remote-tracking branch 'origin/main' 2025-01-21 20:09:55 +01:00
adb d30e141693 Merge pull request #3554 from deltachat/adb/issue-3542
avoid crash in MediaPreviewActivity.onPageUnselected
2025-01-21 20:09:51 +01:00
adb 305940396e Merge branch 'main' into adb/issue-3542 2025-01-21 19:39:33 +01:00
adbenitez 2ab567a9d3 use Log instead of stack trace 2025-01-21 19:38:43 +01:00
Hosted Weblate 238ec5b299 Merge remote-tracking branch 'origin/main' 2025-01-21 19:01:25 +01:00
adb a9c488ff03 Merge pull request #3365 from deltachat/adb/issue-3361
revert #3177
2025-01-21 19:01:18 +01:00
adbenitez 8817b50c95 avoid crash in MediaPreviewActivity.onPageUnselected 2025-01-21 18:56:59 +01:00
Hosted Weblate 4c810c2b50 Merge remote-tracking branch 'origin/main' 2025-01-21 18:51:22 +01:00
adb 84c3710a35 Merge pull request #3553 from deltachat/adb/issue-3550
avoid ANR in ConversationFragment.manageMessageSeenState()
2025-01-21 18:51:00 +01:00
adbenitez be7be9bba4 avoid ANR in ConversationFragment.manageMessageSeenState() 2025-01-21 18:13:54 +01:00
Hosted Weblate f4d5547da7 Merge remote-tracking branch 'origin/main' 2025-01-21 16:47:35 +00:00
adb b50ae284fb Merge pull request #3551 from deltachat/adb/issue-3549
fix: make animated webp animated again
2025-01-21 17:38:52 +01:00
adbenitez 97716d5c26 fix: make animated webp animated again 2025-01-21 16:57:03 +01:00
Hosted Weblate 52850c25b0 Merge remote-tracking branch 'origin/main' 2025-01-20 15:15:02 +01:00
bjoern e77253c843 update translations (#3548)
* add string 'Unsave'

* pull translations
2025-01-20 15:14:54 +01:00
adbenitez 6aed8d003f deprecate string 2025-01-18 20:53:56 +01:00
adbenitez 0083e60c49 revert #3177 2025-01-18 20:53:56 +01:00
adbenitez 0fc79fd845 Merge remote-tracking branch 'upstream/main' 2025-01-18 20:39:03 +01:00
Hosted Weblate 5117e103bb Merge remote-tracking branch 'origin/main' 2025-01-17 16:40:42 +00:00
B. Petersen a7c3bc7ac5 add missing desktop strings 2025-01-17 17:40:35 +01:00
Hosted Weblate 056f9bd4fb Merge remote-tracking branch 'origin/main' 2025-01-17 09:39:28 +00:00
B. Petersen 83b16e5f4b do not force ppl to create blank issues
see https://github.com/deltachat/deltachat-ios/pull/2525
for screenshots and reasoning
2025-01-17 10:39:10 +01:00
adbenitez ee17c6d75e Merge remote-tracking branch 'upstream/main' 2025-01-16 21:10:25 +01:00
Hosted Weblate 877989b5c1 Merge remote-tracking branch 'origin/main' 2025-01-16 20:42:46 +01:00
adb c0525ac69c Merge pull request #3544 from deltachat/adb/issue-3543
avoid null in attachment filename
2025-01-16 20:42:41 +01:00
adbenitez e9d2a39098 avoid null in attachment filename 2025-01-16 20:03:43 +01:00
Hosted Weblate eef8609a66 Merge remote-tracking branch 'origin/main' 2025-01-16 14:55:13 +01:00
adb 4d6fd16767 Merge pull request #3541 from deltachat/adb/issue-3540
avoid race condition in onPlayerStateChanged inside AudioSlidePlayer.requestDuration
2025-01-16 14:55:07 +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
adb b398870823 Merge pull request #3535 from deltachat/adb/issue-3534
fix IntentUtils.showBrowserIntent() and use it everywhere
2025-01-15 21:02:01 +01:00
adbenitez e68c50d614 avoid race condition in onPlayerStateChanged inside AudioSlidePlayer.requestDuration 2025-01-15 20:56:32 +01:00
adbenitez f6a27718a2 rename showBrowserIntent to showInBrowser 2025-01-15 20:33:16 +01:00
Hosted Weblate 876721fae5 Merge remote-tracking branch 'origin/main' 2025-01-15 16:18:50 +00:00
Hocuri f136fa3e3a Update the core submodule so that we can have nightlies again (#3539)
* Remove jsonrpc feature

* Update submodule to latest main
2025-01-15 16:18:43 +00:00
Hosted Weblate 0fdac57c68 Merge remote-tracking branch 'origin/main' 2025-01-15 16:40:55 +01:00
Hocuri 8e55a3dbf3 fix: Use getFilename() instead of the actual filename on disk (#3521)
* fix: Use msg.getFilename() instead of the file's name in some cases

* fix: Use msg.getFilename() instead of the file's name in initializeDraft()

* fix: Use msg.getFilename() instead of the file's name in MediaItem

* fix: Use the correct file name in MediaView

* refactor: `msg` param of `getManuallyCalculatedSlideInfo()` was always null

* Improve comment

* Revert "refactor: `msg` param of `getManuallyCalculatedSlideInfo()` was always null"

We will unfortunately need getManuallyCalculatedSlideInfo() with `msg`
param

This reverts commit 60e8248db32dc22812d3f23da194bab644802045.

* fix: Fix drafting images

This fixes a bug introduced in 14f69f87e8b11a7d0568e58593946a1f1c01e75e:
When you drafted an image, pressed Back, and opened the chat again, then
the height of the drafted image was wrong and tapping the image opened a
preview for the wrong image.

I do think that theoretically it would be nicer to use getSlideForMsg
here, because we already have a DcMsg, but this didn't work because a)
the width and height wasn't gotten from the msg and instead 0 was passed
and b) the code tries to save a msgId instead of the message instead,
and loading the message from the database fails later since it's just a
draft.

I didn't want to try and fix these things, because they might be bigger
refactorings and I don't know the code.

* fix: Use the original message's filemime if there is one

...instead of trying to guess the mimetype from the uri
2025-01-15 16:40:23 +01:00
Hosted Weblate b3375f4f19 Merge remote-tracking branch 'origin/main' 2025-01-14 11:49:13 +01:00
B. Petersen 923227a0e8 update translations 2025-01-14 11:49:07 +01:00
adbenitez 14ecafe0e2 fix IntentUtils.showBrowserIntent() and use it everywhere 2025-01-11 19:45:37 +01:00
Hosted Weblate b607ca21ff Merge remote-tracking branch 'origin/main' 2025-01-10 18:37:43 +00:00
adb b93f8323ab Merge pull request #3532 from deltachat/prep-1.50.5
prepare 1.50.5 release
2025-01-10 19:37:38 +01:00
adbenitez 77f43cde9a prepare 1.50.5 release 2025-01-10 18:48:53 +01:00
Hosted Weblate d6efa3c7e5 Merge remote-tracking branch 'origin/main' 2025-01-10 18:45:16 +01:00
adb e4d018393d Merge pull request #3531 from deltachat/adb/update-translations-10/01/25
update translations
2025-01-10 18:44:58 +01:00
adbenitez 9a816090de Merge remote-tracking branch 'upstream/main' 2025-01-10 18:44:47 +01:00
adbenitez 4b04aa65be update translations 2025-01-10 18:42:31 +01:00
Hosted Weblate e461e2f7f1 Merge remote-tracking branch 'origin/main' 2025-01-10 17:26:19 +01:00
B. Petersen 489bb55788 detach Android and iOS releases 2025-01-10 17:26:16 +01:00
Hosted Weblate 684f8834fa Merge remote-tracking branch 'origin/main' 2025-01-10 15:06:19 +00:00
adb 9d244611bc Merge pull request #3526 from deltachat/adb/issue-3525
use synchronized block to avoid IllegalMonitorStateException
2025-01-10 16:06:13 +01:00
Hocuri 3533916149 Put the synchronized around the whole while loop 2025-01-10 11:05:44 +01:00
adbenitez 46bc3e7f72 Merge remote-tracking branch 'upstream/main' 2025-01-10 01:36:50 +01:00
adbenitez ed0f0107e3 update to new gplay app id and key 2025-01-10 01:31:42 +01:00
adbenitez a855d7043a fix FetchForegroundService 2025-01-10 00:49:30 +01:00
adbenitez 66fd795763 try to fix CI 2025-01-09 19:06:15 +01:00
Hosted Weblate b440a31820 Merge remote-tracking branch 'origin/main' 2025-01-09 19:03:24 +01:00
B. Petersen 05da43484f remove deprecated strings 2025-01-09 19:03:21 +01:00
adbenitez a58de2278b use synchronized block to avoid IllegalMonitorStateException 2025-01-09 18:36:12 +01:00
adbenitez 6743df23e9 update google-services.json 2025-01-09 18:01:16 +01:00
Hosted Weblate 568a3f383f Merge remote-tracking branch 'origin/main' 2025-01-09 15:08:25 +00:00
bjoern 35ec0d05e2 update translations (#3524)
* add new iOS notification strings

* update translations
2025-01-09 16:08:18 +01:00
Hosted Weblate 6c212a5d3d Merge remote-tracking branch 'origin/main' 2025-01-09 15:26:46 +01:00
bjoern 6ead7207ec update translations (#3522)
* update translations

* add new iOS widget strings

* add hints for terms 'Shortcut' and 'Widget'

* update translations
2025-01-09 15:26:42 +01:00
adbenitez 0d5223036d Merge remote-tracking branch 'upstream/main' 2025-01-07 16:36:45 +01:00
adbenitez 640fc433b8 add gdpr.md 2025-01-07 16:29:03 +01:00
adbenitez 35d814c3f6 update build.gradle 2025-01-06 21:26:22 +01:00
adbenitez f8b9d2b0d9 update core 2025-01-06 20:50:30 +01:00
Hosted Weblate b6e43a6994 Merge remote-tracking branch 'origin/main' 2025-01-06 14:40:59 +00:00
adb 3390b865e0 Merge pull request #3519 from deltachat/prep-1.50.4
Prep 1.50.4
2025-01-06 15:40:55 +01:00
adbenitez 883486da9c tweak changelog 2025-01-06 15:26:49 +01:00
adbenitez d048203f45 update version number 2025-01-06 15:19:17 +01:00
adbenitez f9d70d1196 update changelog 2025-01-06 15:18:54 +01:00
Hosted Weblate d1f85e6dc4 Merge remote-tracking branch 'origin/main' 2025-01-06 14:58:18 +01:00
adb 4413b7b4fb Merge pull request #3518 from deltachat/update-core-and-stuff-6/1/25
Update translations and core to v1.153.0
2025-01-06 14:58:14 +01:00
adbenitez 7a4f263a62 update translations 2025-01-06 14:55:55 +01:00
adbenitez 1a360d5282 update deltachat-core-rust to 'chore(release): prepare for 1.153.0' of 'v1.153.0' 2025-01-06 14:16:09 +01:00
Hosted Weblate 74ef8dc1c6 Merge remote-tracking branch 'origin/main' 2025-01-04 18:13:50 +00:00
Hocuri dc785fc116 fix: Remove long stacktrace that flooded the logcat (#3512)
Everytime I attached an image, I got a super long stacktrace in the
logcat. I found it to be [this problem](https://stackoverflow.com/questions/71746801/getting-failed-to-inflate-colorstatelist-leaving-it-to-the-framework-when-usi)
and applied the fix described there.
2025-01-04 19:13:45 +01:00
adbenitez 009593f7cc remove dead code 2025-01-04 16:06:40 +01:00
Hosted Weblate 1da2d35af4 Merge remote-tracking branch 'origin/main' 2025-01-04 16:02:53 +01:00
adb 884be3a93e Merge pull request #3516 from deltachat/adb/avoid-npe-in-reactions
avoid NullPointerException when using result of Rpc.getMsgReactions
2025-01-04 16:02:49 +01:00
adbenitez 9a25328787 avoid NullPointerException when using result of Rpc.getMsgReactions 2025-01-04 12:50:25 +01:00
adbenitez 2d8ec490b1 Merge remote-tracking branch 'upstream/main' 2025-01-04 12:21:28 +01:00
Hosted Weblate bb3f4a2e06 Merge remote-tracking branch 'origin/main' 2025-01-03 19:58:58 +01:00
B. Petersen 3b19ca99e1 simpler copyright, it is anyways questionable by law, it is just a hint, that there is 'sth', this will do also without year 2025-01-03 19:58:55 +01:00
Hosted Weblate 8e4c5d6b63 Merge remote-tracking branch 'origin/main' 2025-01-03 16:48:55 +01:00
B. Petersen f751a48568 update local help 2025-01-03 16:48:52 +01:00
B. Petersen 4549989a63 update translations 2025-01-03 16:48:52 +01:00
Hosted Weblate 1b46edaddf Merge remote-tracking branch 'origin/main' 2025-01-03 14:04:14 +00:00
B. Petersen 19e2c4e051 add info string that is shown by iOS system when asking for accessing Face ID 2025-01-03 15:03:54 +01: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
adbenitez 6f5e90be53 update build.gradle 2024-12-21 03:11:47 +01:00
adbenitez 34fa0620ab update full_description 2024-12-21 03:04:53 +01:00
adbenitez fe37af1a3f allow to jump to POI 2024-12-21 02:54:54 +01:00
adbenitez 3459802d67 update core 2024-12-20 19:52:40 +01:00
adbenitez b8bf847941 fix contact selection list 2024-12-20 19:51:59 +01:00
adbenitez 5b6024584a force sending sticker 2024-12-20 17:47:45 +01:00
Hosted Weblate ee8fd429f4 Merge remote-tracking branch 'origin/main' 2024-12-20 11:41:04 +00:00
adb 4833a44542 Merge pull request #3509 from deltachat/adb/issue-3488
try to avoid FILL500 getting stuck in some devices
2024-12-20 12:40:59 +01:00
adbenitez eb93e2bb7e add comment 2024-12-19 16:39:52 +01:00
adbenitez 291700dfc7 update lastOpenTime in onDestroy() 2024-12-19 16:30:58 +01:00
adbenitez 7a4913b394 tweak code 2024-12-19 15:52:16 +01:00
adbenitez 0dae71f4b7 try to avoid FILL500 getting stuck in some devices 2024-12-19 15:48:57 +01:00
Hosted Weblate bc022f5196 Merge remote-tracking branch 'origin/main' 2024-12-19 13:30:30 +01:00
Hocuri 08e4229533 Make the attachment background the same as the input bar background (#3477)
* Make the attachment background the same as the input bar background

Two different users recently complained that they find drafting images confusing. One of them thought that they had already sent it, the other one didn't know how to send it (both of them figured it out after ~10s, but still, it's nicer to avoid such confusion). In both cases, the problem was that the background of the attached file is the same as the chat background, not the same as the input bar, even though the attached file belongs to the input bar and not to the chat.

* Add a stroke around the to-be attachment
2024-12-19 13:30:24 +01:00
adbenitez 101a31628d lowercase Bot string for English and Spanish 2024-12-18 19:34:29 +01:00
adbenitez 2a2ce883b4 Merge remote-tracking branch 'upstream/main' 2024-12-18 19:33:04 +01:00
adbenitez 5a0e26bdb5 show last-seen status in contact list 2024-12-18 19:20:34 +01:00
Hosted Weblate d4dcdcf3bd Merge remote-tracking branch 'origin/main' 2024-12-18 17:31:48 +00:00
B. Petersen 0c9277dfd0 remove email-address unconditionally from title
the email-address was removed for guaranteed-e2ee chats quite a while ago
(https://github.com/deltachat/deltachat-android/pull/2916) reason was, among others,
that these addresses are often chatmail and therefore random.
(despite expecting otherwise, that was fine for most users).

this PR removes the email-adress unconditionally:

- having the email-address sometimes shown and sometimes not is confusing,
  and easily looks like a bug.
  this has become worse with the added vcard-support
  (before, there were rare non-guaranteed chats in chatmail) -
  resulting in more random addresses being shown

- _always_ protect against over-the-shoulder attacks

- better privacy in screenshots sent around without thinking much before
  (cmp. https://github.com/deltachat/deltachat-ios/pull/2329)

- wrt impersonation attacks:
  the pure email address in the subtitle did never protect against impersonation,
  one could always get sth. trustworthy looking there,
  it is better to check the profile with additional information (eg. other chats) if in doubt

- general cleaner, uncluttered layout

- pave the way of the upcoming multi-addresses

drawback is that sometimes one more tap is needed to access the email-address -
however, as it is _always_ one tap away now,
this can also go easily to the finger memory.
2024-12-18 18:31:43 +01:00
Hosted Weblate 74b2369ca9 Merge remote-tracking branch 'origin/main' 2024-12-18 17:19:37 +01:00
adb 37886cf296 Merge pull request #3506 from deltachat/adb/issue-3502
run SendRelayedMessageUtil.sendMultipleMsgs() in background
2024-12-18 17:19:34 +01:00
adbenitez df5ba2eced call SendRelayedMessageUtil.sendMultipleMsgs() in background 2024-12-18 17:17:46 +01:00
adbenitez 3c2ddb96b3 update full_description 2024-12-18 16:04:30 +01:00
Hosted Weblate 9eafdbd817 Merge remote-tracking branch 'origin/main' 2024-12-18 15:41:48 +01:00
Hocuri e2a825dfb2 fix(ANR): Mark messages as seen asynchronously (#3505)
Mark messages as seen in a background thread instead of on the UI
thread in order to fix #3504.
2024-12-18 15:41:44 +01:00
Hosted Weblate 0a21d1d1b4 Merge remote-tracking branch 'origin/main' 2024-12-18 13:19:55 +01:00
Hocuri 8d49c7e595 fix: Fetch synchronously in the background if no foreground service is allowed (#3501)
Fix #3500.
2024-12-18 13:19:47 +01:00
Hosted Weblate b0cb6c73ba Merge remote-tracking branch 'origin/main' 2024-12-17 17:43:26 +01:00
B. Petersen 966d5dac24 do not lowercase string 'Bot'
it is regarded as a bug
and esp. weird in translations.

it was regarded to be a bit 'nerdy' that time to write it lowercase,
but it seems we have to get more serious now.
2024-12-17 17:43:21 +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
adb 7f684f4d2e Merge pull request #3499 from deltachat/adb/issue-3498
avoid IllegalArgumentException dismissing dialog
2024-12-17 17:07:03 +01:00
Hosted Weblate d5cf919bcb Merge remote-tracking branch 'origin/main' 2024-12-17 16:32:48 +01:00
adb 1510f7f3a8 Merge pull request #3497 from deltachat/adb/issue-3496
avoid NPE in ConversationListActivity.onNewIntent()
2024-12-17 16:32:45 +01:00
adbenitez 6916becf7f avoid IllegalArgumentException dismissing dialog 2024-12-17 16:13:37 +01:00
adbenitez ad5b496f5c avoid NPE in ConversationListActivity.onNewIntent() 2024-12-17 15:00:25 +01:00
Hosted Weblate 490f1efe36 Merge remote-tracking branch 'origin/main' 2024-12-17 14:47:49 +01:00
adb e647401db4 Merge pull request #3491 from deltachat/adb/issue-3490
improve emoji pickers
2024-12-17 14:47:43 +01:00
adbenitez 3113f9c3ab optimize onConfigurationChanged() 2024-12-16 17:19:34 +01:00
adbenitez a1e47865c5 improve emoji pickers 2024-12-16 15:27:13 +01:00
adbenitez 3a5f9b3fed update app name to avoid confusion in f-droid 2024-12-13 22:48:31 +01:00
adbenitez 5ffbc19d03 Merge remote-tracking branch 'upstream/main' 2024-12-13 22:42:20 +01:00
Hosted Weblate c125d4fa24 Merge remote-tracking branch 'origin/main' 2024-12-13 20:12:12 +01:00
adb d9db4b818a Merge pull request #3487 from deltachat/prep-1.50.3
Prepare 1.50.3
2024-12-13 20:12:04 +01:00
adbenitez 693efdbd0f add back device message 2024-12-13 20:10:45 +01:00
adbenitez 399b783437 update changelog 2024-12-13 19:30:34 +01:00
adbenitez 4bc574dfbe change version name 2024-12-13 19:29:47 +01:00
adbenitez 294af0981d disable previous version's device message 2024-12-13 18:28:25 +01:00
adbenitez e8c7014993 update changelog 2024-12-13 18:27:25 +01:00
adbenitez 0edc8303c1 update version number 2024-12-13 14:21:20 +01:00
Hosted Weblate 389098699a Merge remote-tracking branch 'origin/main' 2024-12-13 13:12:47 +00:00
adb 8c89c3e225 Merge pull request #3484 from deltachat/adb/issue-3479
download .xdc files in background
2024-12-13 14:12:42 +01:00
Hosted Weblate df696e5fab Merge remote-tracking branch 'origin/main' 2024-12-13 14:00:16 +01:00
adb a93c8ab055 Merge pull request #3485 from deltachat/adb/issue-3481
add missing webxdc api
2024-12-13 14:00:12 +01:00
adbenitez c5cb79d116 add missing webxdc api 2024-12-13 13:42:39 +01:00
adbenitez b3c50b9571 download .xdc files in background 2024-12-13 13:18:40 +01:00
Hosted Weblate e8801d1b64 Merge remote-tracking branch 'origin/main' 2024-12-13 12:51:00 +01:00
adb 41579de502 Merge pull request #3483 from deltachat/update-core-and-stuff-13/12/24
Update core to 1.152.0
2024-12-13 12:50:54 +01:00
adbenitez e6f735b8bc update scripts/update-core.sh 2024-12-13 12:50:24 +01:00
adbenitez 70b6f2cdfa update strings 2024-12-13 12:36:09 +01:00
adbenitez c1e716d6a3 update deltachat-core-rust to 'chore(release): prepare for 1.152.0' of 'v1.152.0' 2024-12-13 12:36:09 +01:00
Hosted Weblate 8bfc44c8ca Merge remote-tracking branch 'origin/main' 2024-12-13 11:33:57 +00:00
adb dde59b4673 Merge pull request #3482 from deltachat/link2xt/update-rust-1.83
Update Rust to 1.83.0
2024-12-13 12:33:51 +01: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
link2xt 9d77920adf build: update Rust to 1.83.0 2024-12-12 13:28:33 +00:00
link2xt 6f50ee0cfb build(nix): remove ndk-bundle 2024-12-12 13:28:33 +00:00
link2xt 4c86d6d49e chore: nix flake update 2024-12-12 12:47:08 +00: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
Hocuri 963327dd64 Remove prepareMsg (and OUT_PREPARING message state) (#3468)
This PR removes prepareMsg, which put messages into the OUT_PREPARING state and was used while videos were recoded. It also removes the now-unused method isIncreation().
- It was buggy because when you forwarded a message while it was InPreparation, or when the app was killed while a message is InPreparation, the message would stay InPreparation forever.
- Android is the only UI using this InPreparation (according to @r10s, I didn't check this myself), so we can simplify some things in core, which will also make it easier to deduplicate blob files.
2024-12-11 13:53:36 +01:00
adbenitez 5cba1ccd98 remove duplicate realtime preference 2024-12-09 11:57:51 +01:00
adbenitez de8e6b6852 remove store from main menu 2024-12-07 17:37:01 +01:00
adbenitez 811089f3b3 Merge remote-tracking branch 'upstream/main' 2024-12-07 17:11:55 +01:00
adbenitez e045a09d36 Merge remote-tracking branch 'upstream/main' 2024-12-07 17:10:18 +01:00
Hosted Weblate a470366f03 Merge remote-tracking branch 'origin/main' 2024-12-07 16:59:38 +01:00
B. Petersen a3a6919b08 center attachment icons
this PR centers the icons in the attachment selector,
the right-aligned ones looks esp. odd when no experiments are enabled.

the default now looks good,
and when all experiments are enabled, things are perfect as well.
but even if only one experiment is enabled, things are better imo
(but we anyway should optimize for default and not for experimental options)
2024-12-07 16:59:33 +01:00
adbenitez cbee839a43 Merge remote-tracking branch 'upstream/main' 2024-12-07 14:29:12 +01:00
Hosted Weblate 1434ce6f57 Merge remote-tracking branch 'origin/main' 2024-12-07 14:19:34 +01:00
adb efdd92b6a1 Merge pull request #3463 from deltachat/adb/webxdc-picker
add webxdc picker
2024-12-07 14:19:27 +01:00
Hosted Weblate 654ba5b460 Merge remote-tracking branch 'origin/main' 2024-12-06 15:33:58 +01:00
adb 75296e189a Merge pull request #3456 from deltachat/adb/improve-notifications
notify webxdc events, replies and reactions to own messages even if chat is muted
2024-12-06 15:33:51 +01:00
Hosted Weblate e3835f70f7 Merge remote-tracking branch 'origin/main' 2024-12-06 09:57:59 +00:00
adb 708a68119e Merge pull request #3476 from deltachat/adb/fix-upload-relese-script
fix scripts/upload-release.sh
2024-12-06 10:57:55 +01:00
adbenitez 1d5ab98892 fix scripts/upload-release.sh 2024-12-06 07:59:49 +01:00
Hosted Weblate bbb803f91c Merge remote-tracking branch 'origin/main' 2024-12-06 07:47:14 +01:00
adb 07753e211d Merge pull request #3475 from deltachat/prep-1.50.2
prepare 1.50.2
2024-12-06 07:47:10 +01:00
adbenitez 8135d96300 update build.gradle 2024-12-06 07:44:00 +01:00
adbenitez d151e825da update changelog 2024-12-06 07:42:34 +01:00
Hosted Weblate 6a4c73c821 Merge remote-tracking branch 'origin/main' 2024-12-06 06:40:34 +00:00
adb d5289cc3df Merge pull request #3474 from deltachat/adb/update-translations-6/12/24
update translations
2024-12-06 07:40:29 +01:00
adbenitez af40a8b57e update translations 2024-12-06 07:39:00 +01:00
Hosted Weblate 853ce3c7a3 Merge remote-tracking branch 'origin/main' 2024-12-06 00:19:50 +00:00
B. Petersen 529139099e fix starting of webxdc
the issue is that unset `EXTRA_HREF` is passed around as an empty string,
however `Bundle.getString(href, "index.html")` returns `index.html` only when `href` is `NULL`,
which is mostly never the case.

this results in webxdc never started with index.html,
and then not started at all
2024-12-06 01:19:44 +01:00
Hosted Weblate d2ab4817b1 Merge remote-tracking branch 'origin/main' 2024-12-05 20:40:44 +00:00
B. Petersen b4aa18abae amend 1.50 changelog 2024-12-05 21:40:28 +01:00
Hosted Weblate 9ff1cafd5e Merge remote-tracking branch 'origin/main' 2024-12-05 17:47:38 +01:00
adb a7cee63d1c Merge pull request #3469 from deltachat/update-core-and-stuff-5.12.25
Update core to 1.151.5
2024-12-05 17:47:34 +01:00
adbenitez eda735925a update local help and translations 2024-12-05 17:46:03 +01:00
adbenitez 46650c8cc3 update deltachat-core-rust to 'chore(release): prepare for 1.151.5' of 'v1.151.5' 2024-12-05 16:34:26 +01:00
adbenitez fbab156d22 tweak apps icon 2024-12-05 15:50:14 +01:00
Hosted Weblate bf6b678e2b Merge remote-tracking branch 'origin/main' 2024-12-04 15:54:42 +00:00
adb 539cb670f1 Merge pull request #3465 from deltachat/adb/force-base-url-in-webxdc-href
always prefix href with baseURL
2024-12-04 16:54:32 +01:00
adb 2a6aba110b Update src/main/java/org/thoughtcrime/securesms/WebxdcStoreActivity.java
Co-authored-by: Hocuri <hocuri@gmx.de>
2024-12-04 16:40:02 +01:00
adb 0351a1e974 Update src/main/res/values/strings.xml
Co-authored-by: bjoern <r10s@b44t.com>
2024-12-04 16:06:32 +01:00
adbenitez d48ab128a0 open clicked non-xdc URLs in external browsers instead of internally 2024-12-04 16:01:49 +01:00
adbenitez ef67585529 remove label 2024-12-04 14:59:10 +01:00
adbenitez 953e7c6da0 don't export WebxdcStoreActivity 2024-12-04 14:57:12 +01:00
adbenitez ab5a9c9d60 rename config name and meaning 2024-12-04 13:55:02 +01:00
adb af91cf7413 Update src/main/res/values/strings.xml
Co-authored-by: bjoern <r10s@b44t.com>
2024-12-04 12:59:18 +01:00
adbenitez 6a618986d0 rename to ui.notify_mentions_if_muted and improve code 2024-12-04 12:59:18 +01:00
adbenitez 9eefcacbc1 add option to disable notifying "mentions" in muted chats 2024-12-04 12:59:18 +01:00
adbenitez e245e29058 notify webxdc events, replies and reactions to own messages even if chat is muted 2024-12-04 12:59:18 +01:00
adbenitez 7d879f8d1f always prefix href with baseURL 2024-12-04 11:24:13 +01:00
adbenitez f7963a56e9 add App Picker URL setting 2024-12-03 19:32:36 +01:00
adbenitez 0a73877c25 add app picker to attachments menu 2024-12-03 18:52:15 +01:00
Hosted Weblate 6c1f787a38 Merge remote-tracking branch 'origin/main' 2024-12-03 14:08:04 +01:00
adb 1b57880be3 Merge pull request #3464 from deltachat/adb/fix-strings
fix strings.xml
2024-12-03 14:07:59 +01:00
adbenitez f54144e7e8 fix strings.xml 2024-12-03 13:41:09 +01:00
Hosted Weblate b059741161 Merge remote-tracking branch 'origin/main' 2024-12-03 13:22:33 +01:00
adb b735759bd0 Merge pull request #3462 from deltachat/prep-1.50.0
prepare 1.50.0
2024-12-03 13:22:29 +01:00
adb a7199ecedf Update src/main/res/values/strings.xml
Co-authored-by: bjoern <r10s@b44t.com>
2024-12-03 13:22:10 +01:00
adbenitez 2cb529be32 update ndk-make.sh 2024-12-03 12:05:30 +01:00
adbenitez 235038027b Merge remote-tracking branch 'upstream/main' 2024-12-03 11:54:39 +01:00
adbenitez e8eb036594 prepare 1.50.0 2024-12-03 11:36:26 +01:00
Hosted Weblate fdd5cc5d4b Merge remote-tracking branch 'origin/main' 2024-12-03 11:02:52 +01:00
adb d531eb8b47 Merge pull request #3461 from deltachat/update-core-and-stuff-3.12.24
update core to 1.151.3
2024-12-03 11:02:46 +01:00
adbenitez a88a619099 update deltachat-core-rust to 'chore(release): prepare for 1.151.3' of 'v1.151.3' 2024-12-03 10:56:47 +01:00
Hosted Weblate 77465b5802 Merge remote-tracking branch 'origin/main' 2024-12-02 18:40:35 +01:00
adb 00bc429f20 Merge pull request #3460 from deltachat/adb/dont-notify-open-webxdc
do not notify if the webxdc is open
2024-12-02 18:40:31 +01:00
adbenitez 3f25d002e4 do not notify if the webxdc is open 2024-12-02 18:01:50 +01:00
Hosted Weblate d17567029d Merge remote-tracking branch 'origin/main' 2024-12-02 14:41:08 +01:00
adb 74c6f20c3e Merge pull request #3457 from deltachat/adb/fix-callJavascriptFunction
fix WebxdcActivity.callJavaScriptFunction()
2024-12-02 14:41:05 +01:00
Hosted Weblate 4610a64732 Merge remote-tracking branch 'origin/main' 2024-12-02 13:30:44 +01:00
B. Petersen 8728a0a39b remove dead code
these RPC calls are probably a relict of first tries,
they are not exhaustive in their area are nor were ever used,
maybe not even working.
if we decide to go that way at some point anyways much more is needed :)
2024-12-02 13:30:38 +01:00
adbenitez dcf5cf7f54 translate mention pref to Spanish 2024-11-30 18:21:35 +01:00
adbenitez 7f89ecea5c Merge remote-tracking branch 'upstream/adb/improve-notifications' 2024-11-30 13:17:01 +01:00
adbenitez 30a63dd13b allow to toggle direct mentions notifications in muted chats 2024-11-30 13:16:05 +01:00
adbenitez a5d2642c37 do not notify mentions in muted 1:1 chats 2024-11-30 13:13:50 +01:00
adbenitez 79e5eedab0 Merge remote-tracking branch 'upstream/adb/improve-notifications' 2024-11-30 12:21:20 +01:00
adbenitez 27da217eb7 Merge remote-tracking branch 'upstream/adb/fix-callJavascriptFunction' 2024-11-30 12:20:07 +01:00
adbenitez a0c71a5387 fix WebxdcActivity.callJavaScriptFunction()
now even if internet access is enabled, the index.html is wrapped in
an iframe
2024-11-30 12:03:44 +01:00
adbenitez 4d19a59cb6 improve notifications handling 2024-11-29 20:10:49 +01:00
adbenitez 819a9f415a Merge remote-tracking branch 'upstream/main' 2024-11-29 19:38:43 +01:00
adbenitez dff1ef3778 update CI 2024-11-29 16:49:15 +01:00
Hosted Weblate 0358e8ffcb Merge remote-tracking branch 'origin/main' 2024-11-27 20:36:50 +01:00
B. Petersen 7131f5774e adapt to changed deltachat-pages output folder 2024-11-27 20:36:46 +01:00
Hosted Weblate 406c263d82 Merge remote-tracking branch 'origin/main' 2024-11-27 20:36:33 +01:00
adb aa572508dc prepare 1.49.0 (#3453)
* update changelog

* update build.gradle

* update changelog

* update scripts/upload-beta.sh
2024-11-27 20:36:30 +01:00
Hosted Weblate 6ed070e437 Merge remote-tracking branch 'origin/main' 2024-11-27 18:15:46 +00:00
adb 1f880efb3f Merge pull request #3454 from deltachat/adb/update-link-generation
remove Util.QrDataToInviteURL()
2024-11-27 19:15:41 +01:00
adbenitez 72ace5c156 remove Util.QrDataToInviteURL() 2024-11-27 19:01:49 +01:00
Hosted Weblate 1e4cfa124e Merge remote-tracking branch 'origin/main' 2024-11-27 18:02:12 +01:00
B. Petersen 2f34a6ffa4 do not quote a dedicated message; current android shows them grouped and you do not really know what the message refers to 2024-11-27 18:02:07 +01:00
Hosted Weblate c42ba0f599 Merge remote-tracking branch 'origin/main' 2024-11-27 14:37:32 +01:00
adbenitez afdfe7bbaa update strings 2024-11-27 14:37:29 +01:00
adbenitez 14f43f2a79 update deltachat-core-rust to 'chore(release): prepare for 1.151.2 (#6267)' of 'v1.151.2' 2024-11-27 14:37:29 +01:00
Hosted Weblate 8798275170 Merge remote-tracking branch 'origin/main' 2024-11-27 14:36:54 +01:00
B. Petersen f3353cf6e9 update local help 2024-11-27 14:36:33 +01:00
Hosted Weblate ac6495ff20 Merge remote-tracking branch 'origin/main' 2024-11-26 15:23:14 +00:00
adb 722f2cad1e Merge pull request #3449 from deltachat/adb/update-deeplink-api-impl
update to new deep-link API specs
2024-11-26 16:23:09 +01:00
adbenitez b135093628 update to new deep-link API specs 2024-11-26 13:24:35 +01:00
Hosted Weblate 8ae47e97cf Merge remote-tracking branch 'origin/main' 2024-11-26 11:35:27 +00:00
adb be44789b01 Merge pull request #3447 from deltachat/adb/issue-3444
add "show in chat" to webxdc menu
2024-11-26 12:35:22 +01:00
Hosted Weblate 6a1ff0bace Merge remote-tracking branch 'origin/main' 2024-11-25 20:42:51 +01:00
B. Petersen 233197095b remove dead code 2024-11-25 20:42:46 +01:00
adb 494cb728c3 Update src/main/res/menu/webxdc.xml
Co-authored-by: bjoern <r10s@b44t.com>
2024-11-25 19:59:51 +01:00
Hosted Weblate 047cd9a121 Merge remote-tracking branch 'origin/main' 2024-11-25 14:44:35 +01:00
Hocuri 60e9a9101a Don't always show the sender in notifications (#3441), Always show "~" before overridden sender names (#3442)
* Don't always show the sender in notifications

In 1:1 chats, don't prepend the sender name to every line. The exception is when the display name is not equal to the chat name (i.e. there is an OverwriteSenderDisplayname), in this case we still prepend it.

* Always show the "~" before the sender name if it's overridden

When we introduced this, I assume that we weren't sure whether we should
do it and only showed it in some places. But I think it's nicer to
show the same sender name everywhere, i.e. always add the "~".
2024-11-25 14:44:31 +01:00
adbenitez c23dac6f99 add "show in chat" to webxdc menu 2024-11-25 00:57:45 +01:00
Hosted Weblate 555547b6cc Merge remote-tracking branch 'origin/main' 2024-11-25 00:56:20 +01:00
adb 3965319ef4 Merge pull request #3446 from deltachat/adb/deprecate-desc-param-of-sendUpdate
remove 'description' parameter from webxdc's sendUpdate()
2024-11-25 00:56:16 +01:00
Hosted Weblate 5fe355fe90 Merge remote-tracking branch 'origin/main' 2024-11-24 20:37:20 +00:00
adb c4db7c515f Merge pull request #3443 from deltachat/adb/issue-3439
notify DC_EVENT_INCOMING_WEBXDC_NOTIFY
2024-11-24 21:37:15 +01:00
adbenitez fbf88e102b remove 'description' parameter from webxdc's sendUpdate()
the 'description' parameter is about to be deprecated,
see https://github.com/deltachat/deltachat-core-rust/issues/6245
2024-11-24 21:34:22 +01:00
Hosted Weblate 6af3b0d985 Merge remote-tracking branch 'origin/main' 2024-11-24 21:20:39 +01:00
adb d5ea043893 Merge pull request #3440 from deltachat/hoc/reverse-notification-inbox
Reverse order of the tiny inbox in notifications
2024-11-24 21:20:34 +01:00
adbenitez f70c79ba4a fix notifyWebxdc 2024-11-24 03:46:50 +01:00
Hosted Weblate 92d6147644 Merge remote-tracking branch 'origin/main' 2024-11-23 23:34:05 +00:00
adb 0b2a26e2f1 Merge pull request #3438 from deltachat/adb/webxdc-deeplink
allow to open deep-link to webxdc
2024-11-24 00:33:59 +01:00
adbenitez b968ba67b3 avoid NullPointerException 2024-11-24 00:33:22 +01:00
adbenitez e234cc864b don't play in-chat sound 2024-11-23 23:11:34 +01:00
adbenitez b47e75eed6 use new selfAddr 2024-11-23 23:11:34 +01:00
adbenitez 6b684bf030 notify DC_EVENT_INCOMING_WEBXDC_NOTIFY 2024-11-23 23:11:34 +01:00
adbenitez ea89d37461 open webxdc when clicking info-message, pass deeplink/href 2024-11-23 23:09:01 +01:00
adbenitez 814af177d1 fix: make getWebxdcHref public 2024-11-23 23:09:01 +01:00
adbenitez 1ccbb7177f add DcMsg.getWebxdcHref() 2024-11-23 23:09:01 +01:00
adbenitez 3118dbd32b allow to open deep-link to webxdc 2024-11-23 23:09:01 +01:00
Hosted Weblate 72fb9992a1 Merge remote-tracking branch 'origin/main' 2024-11-23 23:05:09 +01:00
adb 1a5e062dac Merge pull request #3445 from deltachat/update-core-to-1.151.0
update core to 1.151.0
2024-11-23 23:04:44 +01:00
B. Petersen 0bcaea6f01 update deltachat-core-rust to 'chore(release): prepare for 1.151.0' of 'v1.151.0' 2024-11-23 23:01:56 +01:00
Hocuri 8283a6c4ad Reverse order of the tiny inbox in notifications 2024-11-23 20:01:46 +01:00
Hosted Weblate e8413019ff Merge remote-tracking branch 'origin/main' 2024-11-23 18:22:54 +01:00
adb cd159bac6c Merge pull request #3377 from deltachat/r10s/notify-reactions
notify reactions added
2024-11-23 18:22:49 +01:00
Hosted Weblate 289118e671 Merge remote-tracking branch 'origin/main' 2024-11-22 22:07:18 +00:00
adb 21f917004f Merge pull request #3436 from deltachat/adb/remove-android-4-code
remove android 4 dead code (SDK<21)
2024-11-22 23:07:12 +01:00
Hosted Weblate 286a84b1d4 Merge remote-tracking branch 'origin/main' 2024-11-21 00:31:16 +00:00
adb 0abf2ff00c Merge pull request #3435 from deltachat/adb/allow-to-open-http-link
allow to open in browser http links that look like proxies
2024-11-21 01:31:11 +01:00
adbenitez 0ca92ec6b5 remove android 4 compatibility code 2024-11-21 01:16:20 +01:00
adbenitez e66fa53537 allow to open in browser http links that look like proxies 2024-11-20 19:36:18 +01:00
Hosted Weblate 8c8c003f2b Merge remote-tracking branch 'origin/main' 2024-11-20 12:59:55 +00:00
Hocuri a51013cc00 fix: Show composite emojis enlarged, too (#3427)
fix: Show composite emojis enlarged, too

There are a lot of composite emojis like the flags and the family emojis.
Here, the grapheme starts with an emoji, but then come some other
characters that modify the first emoji (e.g. all flags start with the
flag emoji).

This PR shows those as big, too, by checking whether a grapheme _starts_
with an emoji to determine whether it's an emoji.


---------

Co-authored-by: adb <adb@merlinux.eu>
2024-11-20 13:59:50 +01:00
Hosted Weblate a06e36993d Merge remote-tracking branch 'origin/main' 2024-11-19 13:24:13 +01:00
Hocuri 171500a97d fix: Don't change display name when starting to create a new account and going back (#3434) 2024-11-19 13:24:10 +01:00
Hosted Weblate ce054d93a8 Merge remote-tracking branch 'origin/main' 2024-11-19 10:38:14 +00:00
link2xt 9a4851961e fix: check draft.isOk() instead of comparing to null
dcContext.getDraft() never returns null.
2024-11-19 10:38:08 +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
adbenitez e5ddbacb2e update build.gradle 2024-11-15 22:45:17 +01:00
adbenitez 03c7d78e2b Merge remote-tracking branch 'upstream/main' 2024-11-15 22:45:10 +01:00
Hosted Weblate c78cbbe145 Merge remote-tracking branch 'origin/main' 2024-11-15 22:01:58 +01:00
adb 00498b02b3 Merge pull request #3424 from deltachat/adb/issue-3423
remove internal font scaling preference
2024-11-15 22:01:51 +01:00
adbenitez ad6e2d1a9f fix typo 2024-11-15 21:20:40 +01:00
adbenitez 5cfa71cd72 add some protection against theoretical 0 value from ViewUtil.pxToSp() 2024-11-15 20:57:33 +01:00
adbenitez 0551044ef9 remove internal font size setting 2024-11-15 18:02:42 +01:00
Hosted Weblate a297c71a90 Merge remote-tracking branch 'origin/main' 2024-11-15 04:27:38 +01:00
adb 5126b3eeb2 Merge pull request #3422 from deltachat/adb/issue-3421
change proxy protocol label position
2024-11-15 04:27:31 +01:00
B. Petersen 8d7078f96f fix playing inChatSounds 2024-11-14 14:10:17 +01:00
B. Petersen c446440537 save one database call 2024-11-14 14:10:17 +01:00
B. Petersen 333e4c9eca notify reactions 2024-11-14 14:10:17 +01:00
B. Petersen fb1f5df234 fix ticker line 2024-11-14 14:10:17 +01:00
Hosted Weblate 247de63362 Merge remote-tracking branch 'origin/main' 2024-11-13 20:08:39 +01:00
Hocuri cc419a9f62 perf: Return early in getTextScale() if text is empty or starts with letter (#3426)
Not sure why, but `setText()` seems to be called with an empty string
very often - for this case it's nice if getTextScale() returns early.

If the text starts with a letter, we can also return early.
2024-11-13 20:08:31 +01:00
adbenitez 2469b6efef update originalFontSize on setTextSize() 2024-11-13 17:20:14 +01:00
adbenitez b7446c9a93 update build.gradle 2024-11-13 04:29:58 +01:00
adbenitez 0c9b5bbaf4 Merge remote-tracking branch 'upstream/main' 2024-11-13 04:29:08 +01:00
adbenitez 3126544f00 fix "show full message" button 2024-11-13 04:28:13 +01:00
adbenitez ccdad0469d Merge remote-tracking branch 'upstream/main' 2024-11-13 01:45:40 +01:00
Hosted Weblate 20f7c7c616 Merge remote-tracking branch 'origin/main' 2024-11-13 00:16:57 +01:00
B. Petersen 9f3eeb3d0d calculate account size in background
calculation may take a moment,
do this in background.

it is totally fine to just display nothing before,
that avoids flickering (WHAT was this? i cannot look so fast!) -
and in most cases, it is close to instant.
2024-11-13 00:16:52 +01:00
adbenitez 92bc53b672 change proxy protocol label position 2024-11-12 23:12:37 +01:00
Hosted Weblate 6364903a28 Merge remote-tracking branch 'origin/main' 2024-11-12 20:35:03 +01:00
adb 1355303360 Merge pull request #3411 from deltachat/adb/issue-3399
remove old emojis
2024-11-12 20:34:59 +01:00
adbenitez 7227f513a5 don't use unnecessary "" in build.gradle 2024-11-12 20:33:41 +01:00
adb 4933d66000 Update src/main/res/layout/reactions_pill.xml
Co-authored-by: bjoern <r10s@b44t.com>
2024-11-12 20:23:55 +01:00
adbenitez 977b21618c increase accepted lenght for scalling to 21
also avoid unnecessary iteration over graphemes if limit is exceeded already
2024-11-12 19:45:33 +01:00
adb 5cecd5bec3 Update src/main/java/org/thoughtcrime/securesms/components/InputPanel.java
Co-authored-by: Hocuri <hocuri@gmx.de>
2024-11-12 19:29:38 +01:00
adbenitez d8db39f9c7 add comment on regex 2024-11-12 19:28:25 +01:00
adbenitez 736fc44870 fix onEmojiPicked() 2024-11-12 19:23:49 +01:00
Hosted Weblate 48bb77cfae Merge remote-tracking branch 'origin/main' 2024-11-12 15:29:21 +01:00
adb 537127ec4e Merge pull request #3419 from deltachat/adb/issue-3291
don't increase reaction selector's font size according to system
2024-11-12 15:29:17 +01:00
Hosted Weblate 53bfe52797 Merge remote-tracking branch 'origin/main' 2024-11-12 09:02:21 +00:00
B. Petersen a5167f3739 log a warning if index gets out of bounds 2024-11-12 10:02:15 +01:00
B. Petersen d481541ad8 crash precaution by checking Spinner bounds
Spinner is very picky about bad selections,
this is an accident waiting to happen -
eg. if new values are introduces
or someone thinks, the "deprecated" case can be removed.

better do not trust incoming data.
2024-11-12 10:02:15 +01:00
adbenitez 7ab19fb8af scale emojis 2024-11-12 05:41:54 +01:00
adbenitez 715a2c0653 don't increase reaction selector's font size according to system 2024-11-12 03:33:36 +01:00
Hosted Weblate a8bc01e6c1 Merge remote-tracking branch 'origin/main' 2024-11-11 17:23:02 +01:00
link2xt 350cd0539c build: update NDK to r27
If we are dropping Android 4 support anyway,
can as well upgrade to the current LTS NDK
which requires API level 21 (Android 5.0).
2024-11-11 16:22:55 +00:00
Hosted Weblate 3fbccf3408 Merge remote-tracking branch 'origin/main' 2024-11-11 16:11:47 +01:00
adb 9f8fe08c75 Merge pull request #3400 from deltachat/adb/issue-3395
improve msg_action_button
2024-11-11 16:11:44 +01:00
Hosted Weblate 86656f1155 Merge remote-tracking branch 'origin/main' 2024-11-11 15:09:03 +00:00
Hocuri 5048239563 Rename "Back up Chats to External Storage" to "Export Backup" (#3416) 2024-11-11 16:08:59 +01:00
Hosted Weblate 89473b8067 Merge remote-tracking branch 'origin/main' 2024-11-11 15:05:12 +00:00
link2xt 6e135e06a9 Opt out of webview metrics collection 2024-11-11 15:05:06 +00:00
Hosted Weblate 887f5881f0 Merge remote-tracking branch 'origin/main' 2024-11-09 17:33:23 +01:00
B. Petersen d52647b288 tweak phased rollout instructions 2024-11-09 17:32:46 +01:00
Hosted Weblate aee757e71c Merge remote-tracking branch 'origin/main' 2024-11-08 11:54:31 +00:00
B. Petersen c0a729978c update huawei instructions 2024-11-08 12:54:26 +01:00
adbenitez 041c95c6d2 remove jemoji, it adds +13MB 2024-11-06 16:39:17 +01:00
adbenitez 8de0fed18e update build.gradle 2024-11-05 23:33:09 +01:00
adbenitez dd75a8e858 enlarge font size when text is only a few emojis 2024-11-05 23:04:25 +01:00
adbenitez 2e77db23d5 remove more unused code 2024-11-05 22:24:29 +01:00
adbenitez 04a4a02235 remove transparency from emoji in pills and reactions details 2024-11-05 19:36:42 +01:00
adbenitez 2910730bc1 remove unused emoji attrs and layouts 2024-11-05 19:18:32 +01:00
Hosted Weblate 30d5eeeb45 Merge remote-tracking branch 'origin/main' 2024-11-05 15:32:37 +01:00
Hocuri 23458a6c64 Don't show "0%" at the beginning when being added as second device (#3409) 2024-11-05 15:32:34 +01:00
Hosted Weblate d2c2f2cf07 Merge remote-tracking branch 'origin/main' 2024-11-05 15:28:53 +01:00
Hocuri 9679b22072 fix: Accept the deprecated 3 as an alias for 2 (#3410) 2024-11-05 15:28:50 +01:00
adbenitez 3fae301ec2 remove old emojis components 2024-11-05 02:00:42 +01:00
adbenitez d08069f7b0 remove old emojis 2024-11-04 23:29:28 +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
B. Petersen 56a0607a5e update RELEASE.md to changed store ui 2024-11-01 14:43:56 +01:00
B. Petersen 9c08617f7d bump version to 1.48.3 2024-10-31 21:35:26 +01:00
B. Petersen 812dc8d738 update CHANGELOG for 1.48.3 2024-10-31 21:35:26 +01:00
B. Petersen d8b278a1f5 update translations 2024-10-31 21:06:00 +01:00
bjoern 4368a4f63e update translations (#3402) 2024-10-31 18:07:55 +01:00
adb 72ae90ae93 change realtime preference position (#3398)
* change realtime preference position

* tweak realtime explaination

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

Co-authored-by: bjoern <r10s@b44t.com>

* tweak realtime strings

* show warning if realtime is disabled and apps need it

* update realtime warning message

* 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 strings.xml

* update strings.xml

* revert dialog

---------

Co-authored-by: bjoern <r10s@b44t.com>
Co-authored-by: Hocuri <hocuri@gmx.de>
2024-10-31 18:00:20 +01:00
B. Petersen c36ce7a8ab update deltachat-core-rust to 'chore(release): prepare for 1.148.6' of 'v1.148.6' 2024-10-31 17:53:33 +01:00
adbenitez 404097fe30 keep old style for "show full message" 2024-10-30 18:22:21 +01:00
adbenitez 07d5c719d4 improve mst_action_button 2024-10-29 20:47:33 +01:00
adb 13a43473cc improve logging: always log events for accId=0 (#3391)
improve logging: always log events for all accounts including previously ignored accId=0
2024-10-29 17:45:33 +01:00
B. Petersen 5a84198829 bump version to 1.48.2 2024-10-29 00:43:48 +01:00
B. Petersen 1f443cd87c update CHANGELOG for 1.48.2 2024-10-29 00:43:48 +01:00
B. Petersen 4901b92ee2 update local help 2024-10-28 23:41:18 +01:00
B. Petersen cd48e15071 update translations 2024-10-28 23:41:18 +01:00
B. Petersen 2d4b570f48 update deltachat-core-rust to 'chore(release): prepare for 1.148.5' of 'v1.148.5' 2024-10-28 23:41:18 +01:00
B. Petersen 3f0b36bd4b 'message info' just shows the file name
from the view of the user, this is just the 'file name'.
calling it 'original file name' there is maybe correct internally,
as we add a random number for $reasons.
however, some users were alarmed about what the heck is transferred here.
2024-10-27 15:28:11 +01:00
B. Petersen b342fb9c30 update translations 2024-10-27 11:51:00 +01:00
adbenitez 0974655366 update build.gradle 2024-10-27 06:58:30 +01:00
adbenitez 9675c419ac add some margin at the bottom of the new "show full message" buttons 2024-10-27 06:57:25 +01:00
adbenitez de4e95d495 Merge remote-tracking branch 'upstream/main' 2024-10-27 03:45:37 +01:00
adbenitez 7a738abba8 Merge remote-tracking branch 'upstream/main' 2024-10-27 02:49:16 +01:00
B. Petersen 512f8104e2 fix typos 2024-10-25 13:18:10 +02:00
B. Petersen 0cd445f4e7 refine CHANGLOG HOWTO 2024-10-25 12:28:29 +02:00
B. Petersen dbfbb9060b bump version to 1.48.1 2024-10-24 23:53:26 +02:00
B. Petersen f2f910fe23 update changelog for 1.48.1 2024-10-24 23:53:26 +02:00
B. Petersen 7dde6ad61a update deltachat-core-rust to 'chore(release): prepare for 1.148.4' of 'v1.148.4' 2024-10-24 23:12:47 +02:00
adb ca947aeef2 Use tag or display name for notifications instead address (#3380)
Use tag or display name for notifications instead address
2024-10-24 20:42:39 +02:00
bjoern 1680d14835 prepare 1.48.0 (#3354)
* update CHANGELOG for 1.48.0, android part

* update CHANGELOG for 1.48.0, core part

* bump version to 1.48.0

* update CHANGELOG for 1.147.1

* update CHANGELOG

* update CHANGELOG for core 1.148.2

* update CHANGELOG, recent android changes
2024-10-24 20:16:02 +02:00
adb b5a2280776 fix typo in changelog (#3386)
* fix typo

* Update CHANGELOG.md

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

---------

Co-authored-by: Hocuri <hocuri@gmx.de>
2024-10-24 19:57:50 +02:00
B. Petersen ab61246240 do not start foreground service in foreground
the foreground service was introduced unconditionally in #3312,
however turns out to be annoying and flickering
if the app is actually in foreground.

the service _might_ be needed in this case only
if the app is about going to background during fetch,
but in this case, we assume,
that we have some 10 seconds time still.

in any case,
this is still an improvement to the released apps,
that _never_ show a foreground service.
2024-10-24 18:53:44 +02:00
B. Petersen 957a5f75dc update translations 2024-10-24 15:19:09 +02:00
B. Petersen dad490074b the 'def' parameter is long gone. any comment will lie over time :) 2024-10-24 12:29:45 +02:00
B. Petersen 09640c88ac update deltachat-core-rust to 'chore(release): prepare for 1.148.2' of 'v1.148.2' 2024-10-23 21:10:09 +02:00
adb 021a98c135 allow to set tags on profiles (#3373)
allow to set tags on profiles

---------

Co-authored-by: bjoern <r10s@b44t.com>
2024-10-23 18:05:14 +02:00
B. Petersen deacf8efef update local help 2024-10-23 16:53:56 +02:00
adb 6c482af28a Merge pull request #3374 from deltachat/adb/use-createQrSvg
Allow to share proxy via QR
2024-10-23 15:44:31 +02:00
adbenitez cfd9371739 tweak proxy_invalid string 2024-10-23 15:04:13 +02:00
adbenitez c58a77dc26 tweak padding in dialog_share_proxy 2024-10-23 15:04:13 +02:00
adbenitez e45d722ba1 tweak dialog_share_proxy 2024-10-23 15:04:13 +02:00
adbenitez 83213d14ad remove tabs 2024-10-23 15:04:13 +02:00
adbenitez 931476a196 remove scrollView in dialog_share_proxy 2024-10-23 15:04:13 +02:00
adbenitez 4ce3869744 tweak dc_wrapper.c 2024-10-23 15:04:13 +02:00
adbenitez 5dee44605d allow to share proxy as QR 2024-10-23 15:04:13 +02:00
adbenitez 249d57897e fix dc_wrapper.c 2024-10-23 15:04:13 +02:00
adbenitez 3c9cecbc39 add DcContext.createQrSvg() 2024-10-23 15:04:12 +02:00
B. Petersen 5a2c28b91d update translations 2024-10-23 13:24:40 +02:00
B. Petersen 7758f6d991 update deltachat-core-rust to 'chore(release): prepare for 1.148.1' of 'v1.148.1' 2024-10-23 13:24:40 +02:00
adb 285f59e46a Merge pull request #3367 from deltachat/adb/issue-3385
improve "show QR" screen
2024-10-22 14:40:05 +02:00
adbenitez 91f8ce7cda Merge remote-tracking branch 'upstream/main' 2024-10-22 02:16:26 +02:00
adbenitez 12ad3daa28 Merge remote-tracking branch 'upstream/main' 2024-10-22 02:13:13 +02:00
adb eaa6981523 Merge pull request #3372 from deltachat/adb/issues-3369
allow to paste from clipboard in RegistrationQrActivity
2024-10-22 00:20:15 +02:00
adb cd8f799f14 Update src/main/res/values/strings.xml
Co-authored-by: bjoern <r10s@b44t.com>
2024-10-22 00:07:53 +02:00
adb 69fb68a873 Update src/main/res/values/strings.xml
Co-authored-by: bjoern <r10s@b44t.com>
2024-10-22 00:07:28 +02:00
adbenitez 5954b13440 allow to paste from clipboard in RegistrationQrActivity 2024-10-21 21:31:06 +02:00
B. Petersen a7647e18e2 update translations 2024-10-21 02:16:14 +02:00
B. Petersen e025da4e91 add string 'N reactions', need for iOS notifications at least to differ from 'N messages' 2024-10-21 02:16:14 +02:00
B. Petersen 8ba93f8b82 support DC_QR_BACKUP2 in chatlist-qr-code scanner
this was forgotten by the move to BACKUP2 in #3173
2024-10-20 16:44:33 +02:00
adb 849c6798c0 Merge pull request #3368 from deltachat/adb/issue-3364
reflect status of the proxy (enable/disabled) in the proxy icon
2024-10-17 23:41:52 +02:00
adbenitez 7a85cf9db5 tweak message 2024-10-17 23:03:53 +02:00
adbenitez aa45476028 remove duplicated options from menu 2024-10-17 23:03:21 +02:00
adbenitez c12ed8060c add "invite link dialog" 2024-10-17 22:48:44 +02:00
Hocuri 90c8650aaf Visual feedback when tapping the action button on messages, attempt 2 (#3366) 2024-10-17 15:37:27 +02:00
adbenitez 6f530215af update full_description.txt 2024-10-17 01:21:13 +02:00
adbenitez e8c4d0e606 reflect status of the proxy (enable/disabled) in the proxy icon 2024-10-17 00:59:05 +02:00
adbenitez 7feb4bc93f implement "scan" button 2024-10-15 23:30:49 +02:00
adbenitez e4b1d52d1a improve "show QR" screen 2024-10-15 23:04:02 +02:00
adb efc09f142a Merge pull request #3363 from deltachat/adb/issue-3357
Do not remember "New Contact" screen's tab state
2024-10-14 19:40:03 +02:00
adb e5b8e488a4 Merge pull request #3362 from deltachat/adb/issue-3355
auto-focus group name field
2024-10-14 18:11:14 +02:00
adbenitez d397ccaf7e Do not remember "New Contact" screen's tab state 2024-10-14 17:46:25 +02:00
adbenitez f7bd609f91 auto-focus group name field 2024-10-14 17:11:09 +02:00
B. Petersen a118c33f89 update translations 2024-10-14 16:04:35 +02:00
B. Petersen 86a9da5062 better confirmation message 2024-10-14 15:58:23 +02:00
B. Petersen d3328df6f2 rename the function to what it does: sending multiple messages 2024-10-14 15:58:23 +02:00
B. Petersen 169a706e36 comment about fallback name 2024-10-14 15:58:23 +02:00
B. Petersen bf2fd62154 get filename of URI that are not PersistenBlobProvider 2024-10-14 15:58:23 +02:00
B. Petersen e74795851a use constant to access URI filename 2024-10-14 15:58:23 +02:00
B. Petersen 139b7f84f4 basic handling of multiple selected files 2024-10-14 15:58:23 +02:00
B. Petersen 3d55ea931c move asking-for-sending to a separate function 2024-10-14 15:58:23 +02:00
B. Petersen 73ada05e99 start intent allowing selecting multiple images/videos 2024-10-14 15:58:23 +02:00
B. Petersen 7ecba725a0 update translations and local help 2024-10-14 11:46:31 +02:00
B. Petersen 6cad73a00b update deltachat-core-rust to 'chore(release): prepare for 1.147.1' of 'v1.147.1' 2024-10-14 11:46:31 +02:00
B. Petersen c5e675a72e update local help 2024-10-11 16:08:08 +02:00
B. Petersen 75f779e47b update translations 2024-10-11 16:08:08 +02:00
holger krekel 2b1bb6e434 Merge pull request #3352 from deltachat/hpk42-patch-1
refine credits wrt signal messenger
2024-10-11 11:40:53 +02:00
holger krekel ca8dcfc599 refine credits wrt signal messenger 2024-10-11 09:11:31 +02:00
B. Petersen a26764355e move 'add profile' to end of list
having 'add profile' at the end of the list is more natural,
and more consisten with desktop/iOS -
as well as internally, eg. proxy also has 'add' at its end.

also, this paves the way to have a consistent layout when it comes
to profile-switching from forward/share dialogs,
where one probably does not want to have a 'add' button
(so, the first lines are not different :)

the profile list is usually not super-large,
and even if - when ppl have managed to add 10+ profiles,
they'll know how to do this, even with scrolling :)
also, adding is a rare function, in contrast to switching,
so even then it makes sense as there is room for one more item without scrolling.

in contrast,
for 'create chat' we show 'add' at the beginning,
as these lists can contain several hundrets of entries _and_
add is often used.
2024-10-10 23:14:57 +02:00
adbenitez d92265cd63 Merge remote-tracking branch 'upstream/main' 2024-10-10 21:09:08 +02:00
adbenitez 1787dc4c8b Merge remote-tracking branch 'upstream/main' 2024-10-10 20:40:06 +02:00
B. Petersen 1293d419f5 update translations 2024-10-10 17:16:18 +02:00
B. Petersen 421db5b403 fix typo 2024-10-10 17:16:18 +02:00
B. Petersen 5f77f791d0 fix the warning when attaching multiple files: images are recoded, only videos are not 2024-10-10 16:47:02 +02:00
B. Petersen aa78c607ce update deltachat-core-rust to 'chore(release): prepare for 1.147.0' of 'v1.147.0' 2024-10-10 14:50:22 +02:00
B. Petersen 7bb855e32a update local help 2024-10-10 14:30:10 +02:00
B. Petersen eaa24e89f8 update translations 2024-10-10 14:30:10 +02:00
B. Petersen fc5a3e5c75 cleanup account switcher
do not show 'Add Profile' in bold.

this looks less cluttered
and makes the "bold" of the selected account more outstanding:

before, there were two types of "boldness",
the add profile button (using bold only)
and the selected profile (using bold and a background),
this results in a bit cluttered, unsteady look,
esp. when there are few accounts and more bold than normal is shown.

also, this makes "bold" more outstanding,
as this attribute is given to one line only.
there is no need for the "add profile" to be that outstanding
(in contrast to eg. the "add chat" dialog)

it is a minor, sure :)
2024-10-09 21:09:23 +02:00
B. Petersen 6fe5ed32cb update chatlist title on profile deletion; this is needed to show 'Delta Chat' in case only one profile is left 2024-10-09 21:08:52 +02:00
B. Petersen 304942e98b update translations 2024-10-09 13:09:34 +02:00
B. Petersen 44df03ad52 mark deprecated strings as such 2024-10-09 13:09:34 +02:00
B. Petersen c485aa9f6a explain the 'Unread' string 2024-10-08 20:08:45 +02:00
B. Petersen cb416e6959 search: add menu allowing toggling is:unread 2024-10-08 20:08:45 +02:00
adb ee6c464a5b Merge pull request #3338 from deltachat/adb/issue-3335
register app for opening ss:// and socks5:// proxy URLs
2024-10-08 17:20:12 +02:00
adbenitez 8790b26123 show "done" toast 2024-10-08 17:02:41 +02:00
adb 04d2eb99aa Merge pull request #3340 from deltachat/adb/improve-proxy-ui
improve proxy settings UI
2024-10-08 16:27:55 +02:00
adbenitez 5627f5f123 update build.gradle 2024-10-06 23:25:23 +02:00
adbenitez 7a66085107 Merge remote-tracking branch 'upstream/adb/improve-proxy-ui' 2024-10-06 22:40:06 +02:00
adbenitez aa45a9082e Merge remote-tracking branch 'upstream/adb/issue-3335' 2024-10-06 22:39:43 +02:00
adbenitez 3955f4d505 fix secondary button color 2024-10-06 22:35:47 +02:00
adbenitez 74dd4c0d9a update permanent notification icon 2024-10-06 20:41:33 +02:00
adbenitez 23eb418591 update core 2024-10-06 19:37:13 +02:00
adbenitez edcfa80d92 don't enable IO with proxy settings if account is disabled 2024-10-06 19:36:32 +02:00
adbenitez 5ff1f3d915 Merge remote-tracking branch 'upstream/main' 2024-10-06 19:34:24 +02:00
adbenitez b0ae2da439 improve proxy settings UI 2024-10-06 13:29:46 +02:00
adbenitez 8487c286e6 register app for opening ss:// and socks5:// proxy URLs
also linkify proxy URLs in text messages
2024-10-05 20:15:40 +02:00
Hocuri ffa9177094 Don't show "0%" when exporting backups (#3337)
With https://github.com/deltachat/deltachat-core-rust/pull/6027, when
exporting a backup, the counter stays at 0% while running housekeeping
and vacuuming the database, which takes 10 seconds on my device.

Showing "One moment... 0%" for 10 seconds (or longer on slower devices /
with bigger accounts) might make users think that it's not working and
abort the process. So, instead, simply show "One moment..." until the
progress reaches 1%.
2024-10-05 20:00:03 +02:00
adb 6f3d8a4414 Merge pull request #3334 from deltachat/adb/issue-3316
allow to set proxies from QRs
2024-10-05 18:38:42 +02:00
adb 9bbee2db10 Update src/main/res/values/strings.xml
Co-authored-by: bjoern <r10s@b44t.com>
2024-10-05 18:12:13 +02:00
adbenitez 30580366fd add restartIo() to DcContext 2024-10-05 18:11:26 +02:00
adb ec4bffdabe Merge pull request #3336 from deltachat/adb/issue-3282
don't change delete_server_after, let core handle it
2024-10-05 17:12:07 +02:00
adbenitez ca2d8f4b6e don't change delete_server_after, let core handle it 2024-10-05 16:32:23 +02:00
adbenitez a7f0f753fd allow to set proxies from QRs 2024-10-05 16:16:32 +02:00
link2xt 4025fd5e0b fix: do not expect special value for backup transfer progress
Values 100, 350, 400, 450, 950 are not used in the core,
so this resulted in showing incorrect progress
such as "Preparing account" when actually
database transfer was already in progress.

Desktop already does not expect any special values
and simply shows the progress bar.
2024-10-05 11:40:11 +00:00
Asiel Díaz Benítez 577959a51a Merge pull request #3329 from deltachat/adb/issue-3307
show display name in title bar when user has multiple profiles
2024-10-04 17:18:18 +02:00
adbenitez 776dc05755 remove unnecessary getConnectivitySummary(context, int) 2024-10-04 16:44:38 +02:00
Hocuri 28141bf942 Remove getNextMedia() to make compilation succeed again (#3330) 2024-10-04 16:16:21 +02:00
adbenitez 3431163c24 show display name in title bar when user has multiple profiles 2024-10-04 15:20:45 +02:00
adbenitez 45cb3a953c update version number 2024-10-04 14:49:06 +02:00
adbenitez 3080313568 Merge remote-tracking branch 'upstream/main' 2024-10-04 14:48:37 +02:00
B. Petersen f13251bc07 add 'learn more' button for managing keys 2024-10-04 12:08:55 +02:00
B. Petersen 6a7c498481 update translations 2024-10-02 19:06:35 +01:00
B. Petersen b72a1ec7d8 update local help 2024-10-02 19:06:35 +01:00
B. Petersen 5fd06f2b9d update changelog for 1.46.15 2024-09-28 21:38:30 +01:00
B. Petersen 899b075349 update changelog for 1.46.15 2024-09-28 21:38:30 +01:00
B. Petersen 1c0dc91f03 update translations 2024-09-26 23:09:00 +01:00
B. Petersen a76762f321 update deltachat-core-rust to 'chore(release): prepare for 1.145.0' of 'v1.145.0' 2024-09-26 23:00:10 +01:00
B. Petersen 86ebb6e1a8 update translations 2024-09-26 20:29:48 +01:00
bjoern ecf87c58e1 tweak proxy UI (#3322)
* use string 'Saved Proxies' as header for proxy settings

'Connections' is a bit broad,
also there is only one connection.
'Saved Proxies' is also what Telegram is using.

* move proxy settings in 'Advanced' down

logically, this seems to be a better fit.
Account/Password is still the most important bit,
even if not directly needed in chatmail and Proxy is used more often.

* add proxy settings icon to main screen

* use 'cable' instead of 'shield'. things are rewired, but not more protected or secured.
2024-09-26 16:09:39 +00:00
B. Petersen 0bef0b3501 update deltachat-core-rust to 'chore(release): prepare for 1.144.0' of 'v1.144.0' 2024-09-26 15:24:46 +01:00
Asiel Díaz Benítez bc6d676fcd use new proxy_url list API (#3292) 2024-09-26 12:30:54 +00:00
Hocuri 8aa615157a Also start the FetchForegroundService in onDeletedMessages() (#3317)
See https://firebase.google.com/docs/cloud-messaging/android/receive#override-ondeletedmessages

Shouldn't happen very often, but if it does, it's good to connect, too.
2024-09-23 14:57:12 +02:00
B. Petersen 9ffa76c0f4 as we called startForeground(), longer timeouts should be fine 2024-09-23 13:30:09 +02:00
B. Petersen 9fc4bfb970 move backgroundFetch() to FetchForegroundService 2024-09-23 13:30:09 +02:00
B. Petersen 1bc40837fe add reference for the 20 seconds time span 2024-09-23 13:30:09 +02:00
B. Petersen ba3ea172e5 use explicit FetchForegroundService
this avoids potential issues with GenericForegroundService
which eg. may block app start.
2024-09-23 13:30:09 +02:00
B. Petersen 3a4c02c8cd Revert "add pinActivity parameter to GenericForegroundService"
This reverts commit b7e5bee655bb839153a9229e0035eb6c711fb723.
2024-09-23 13:30:09 +02:00
B. Petersen 4b9d521c13 add pinActivity parameter to GenericForegroundService 2024-09-23 13:30:09 +02:00
B. Petersen df9e3007b2 show a foreground service notification 2024-09-23 13:30:09 +02:00
B. Petersen 117f144858 call backgroundFetch() from FCM 2024-09-23 13:30:09 +02:00
B. Petersen e17d37ebb7 add backgroundFetch() api 2024-09-23 13:30:09 +02:00
B. Petersen 08200d8443 refine post-notifications-granted logging
saying post-notifications-granted=false on API that do not need this grant
is misleading as it looks as some error or if the user has rejected sth.

just stumbled upon that and was irritated when trying out things wrt
https://github.com/deltachat/deltachat-android/issues/3281 on android7
2024-09-20 21:09:21 +02:00
adbenitez 9809e3edd6 update "get-it-on-github.png" 2024-09-20 18:12:49 +02:00
adbenitez 2255c267ef Merge remote-tracking branch 'upstream/main' 2024-09-20 17:59:15 +02:00
adbenitez 4a83f4005a update "get-it-on-github.png" 2024-09-20 17:56:10 +02:00
B. Petersen 8ea78b1930 update translations 2024-09-20 13:57:25 +02:00
adbenitez 9d4b5e8fed Merge remote-tracking branch 'upstream/main' 2024-09-19 23:26:46 +02:00
Asiel Díaz Benítez ca74afb229 Merge pull request #3306 from deltachat/adb/issue-3305
log notifications permission status
2024-09-19 22:15:00 +02:00
Asiel Díaz Benítez 1757c417fa Update src/main/java/org/thoughtcrime/securesms/LogViewFragment.java
Co-authored-by: bjoern <r10s@b44t.com>
2024-09-19 16:14:49 -04:00
adbenitez 4e6119b85d log notifications permission status 2024-09-19 21:08:39 +02:00
B. Petersen 91467e5c65 add reference to original message when replying from a notification; otherwise a simple 'yes' is easily misleading if message arrive in between or out of order 2024-09-19 17:48:41 +02:00
B. Petersen 2870ad988f mark messages as read also when replying from notification 2024-09-19 17:48:41 +02:00
B. Petersen a35da9ac7c really mark messages as read from notification 2024-09-19 17:48:41 +02:00
B. Petersen e4543be71c 'Mark Read' instead 'Dismiss' notifications
'Dismiss' is a bit unclear - even though introduced at #2083 to make things clearer,
i do not think this has happened :) -
i also needed to dive into the source code to see what exactly 'Dismiss' is doing.

meanwhile, we're anyway using 'Mark Read' to remove unread counter from chats,
and this is basically the same. good to be consistent.
finally, this is also the term WhatsApp/Telegram are using.

closes https://support.delta.chat/t/what-does-dismiss-button-on-notifications-do/3261/3

nb: we also change the english 'short' term from 'Read' to 'Mark Read' -
this is sill shorter than many translations
and removes the ambiguousness 'Mark Read' vs 'Open for Reading" -
esp. in the notification without much context, this is better,
but also on iOS, where the term was introduced for, it is good to be explict.
2024-09-19 17:48:41 +02:00
Asiel Díaz Benítez b1e4d4dbe5 Merge pull request #28 from ArcaneChat/adb/add-fdroid-badge
add "Get in on F-Droid" badge
2024-09-18 17:34:10 +02:00
B. Petersen e6f9eda787 update translations 2024-09-17 23:08:44 +02:00
Asiel Díaz Benítez 12b5f0767c Merge pull request #3271 from deltachat/adb/issue-3270
fix wrong translations of videochat_instance_example add doc comment
2024-09-17 22:58:51 +02:00
Asiel Díaz Benítez 0bd2c2f825 Merge pull request #3299 from deltachat/adb/issue-3289
avoid android.view.WindowManager$BadTokenException in maybeShowConfigurationError
2024-09-17 22:58:28 +02:00
Asiel Díaz Benítez 5c9afb910d Merge pull request #3301 from deltachat/adb/issue-3300
revert hack introduced in #2835
2024-09-17 22:57:47 +02:00
B. Petersen e41e3374e8 update translations 2024-09-17 22:14:17 +02:00
B. Petersen 0be6457cd1 simplify 'Proxy Settings' to just 'Proxy'
- shorter, less cluttering
- we usually do not say 'Settings' inside 'Settings',
  also having several 'Settings' menu entries in the main menu us not so nice
- same as telegram is doing
2024-09-17 22:10:26 +02:00
adbenitez f3fa1d5e7c revert hack introduced in #2835 2024-09-17 19:16:39 +02:00
B. Petersen 5f2b4590c0 marked chat replied to as being noticed
when replying from within a notification,
the corresponding chat should be marked as being noticed as well.

otherwise, it looks wrong that one has replied to a chat,
but still the chat is shown as being "unread".

the 'reply' from a notification should leave the chat
in the same state as 'dismiss' resp. 'mark read' - plus the added message.
2024-09-17 18:19:50 +02:00
adbenitez be4bc8259e avoid android.view.WindowManager$BadTokenException in maybeShowConfigurationError 2024-09-17 17:54:38 +02:00
Asiel Díaz Benítez 529842ad60 Merge pull request #3273 from deltachat/adb/improve-delete-dialog
improve profile deletion dialog
2024-09-17 17:05:58 +02:00
B. Petersen 78bd221fdf update translations 2024-09-17 15:34:54 +02:00
Asiel Díaz Benítez 054902eb67 Merge pull request #3294 from deltachat/adb/issue-3288
check that getSlideUri() is not null before passing it to ScribbleActivity
2024-09-16 22:18:11 +02:00
Asiel Díaz Benítez ef578da78d Merge pull request #3293 from deltachat/adb/issue-3287
avoid NullPointerException in ConversationListActivity.refreshAvatar
2024-09-16 22:17:51 +02:00
adbenitez 884cce3e1a check that getSlideUri() is not null before passing it to ScribbleActivity 2024-09-16 21:09:52 +02:00
adbenitez fc6bdc2fea avoid NullPointerException in ConversationListActivity.refreshAvatar 2024-09-16 20:44:55 +02:00
Hocuri e441a582dd Merge pull request #3285 from deltachat/hoc/test
Fix weblate problem
2024-09-12 17:10:04 +02:00
Hocuri 3e3a01dd62 Remove changelogs 2024-09-12 17:09:21 +02:00
Hocuri 1cda594e02 Merge remote-tracking branch 'weblate/main' into hoc/test 2024-09-11 23:30:46 +02:00
Weblate (bot) 357e6de031 Translations update from Hosted Weblate (#3145)
* Translated using Weblate (Portuguese)

Currently translated at 16.6% (3 of 18 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/pt/

* Translated using Weblate (Italian)

Currently translated at 100.0% (18 of 18 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (19 of 19 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/it/

* Translated using Weblate (Portuguese (Portugal))

Currently translated at 10.5% (2 of 19 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/pt_PT/

* Translated using Weblate (German)

Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/de/

* 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/

* 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/

---------

Co-authored-by: Leonardo Colman <leonardo.dev@colman.com.br>
Co-authored-by: Andrea Enzo Lattmann <andrea@testrun.org>
Co-authored-by: alex0valk <alex0valk@gmail.com>
Co-authored-by: sushidave <github316@haerrimedia.ch>
Co-authored-by: Hocuri <hocuri@gmx.de>
2024-09-11 22:54:49 +02:00
Asiel Díaz Benítez 30ac01a57e Merge pull request #3277 from deltachat/adb/issue-3276
Add separate view for proxy settings
2024-09-10 20:40:54 +02:00
Asiel Díaz Benítez de5d45d04d Merge pull request #3283 from deltachat/adb/fix-typo-in-notificationcenter
fix typo in NotificationCenter
2024-09-10 19:35:15 +02:00
adbenitez c599fc8e79 fix typo in NotificationCenter 2024-09-10 15:46:40 +02:00
adbenitez 295e1b50d2 restart IO on proxy changes 2024-09-10 13:48:08 +02:00
adbenitez ef8838cbe3 add proxy settings to main menu if it is enabled 2024-09-10 13:48:08 +02:00
adbenitez eed124a0f2 add proxy settings outside in advanced settings 2024-09-10 13:48:08 +02:00
adbenitez 18974ff023 use new proxy screen in RegistrationActivity 2024-09-10 13:48:08 +02:00
adbenitez e666bbf610 allow to set proxy in InstantOnboardingActivity 2024-09-10 13:48:08 +02:00
adbenitez 0330485123 tweak buttons in welcome and instant onboarding screens 2024-09-08 16:33:33 +02:00
Asiel Díaz Benítez 56717d3f44 Merge pull request #3279 from deltachat/prep-1.46.14
prepare 1.46.14
2024-09-06 23:46:58 +02:00
adbenitez 958bdddacf bump app version number and update changelog 2024-09-06 22:50:10 +02:00
Asiel Díaz Benítez 6375b85ef9 Merge pull request #3280 from deltachat/adb/fix-on-click-in-account-switcher-button
fix on-click in profile switcher button
2024-09-06 22:38:08 +02:00
adbenitez e076691f2a fix on-click in profile switcher button 2024-09-06 22:36:43 +02:00
Asiel Díaz Benítez 4635cbbe4f Merge pull request #3278 from deltachat/adb/update-core-and-stuff-6-9-2024
update deltachat-core-rust to 'chore(release): prepare for 1.142.12' of 'v1.142.12'
2024-09-06 21:12:22 +02:00
adbenitez 71311d43e8 update deltachat-core-rust to 'chore(release): prepare for 1.142.12' of 'v1.142.12' 2024-09-06 20:38:04 +02:00
adbenitez 6efe540310 update core 2024-09-06 18:26:53 +02:00
adbenitez 1843c29b7c update version number 2024-09-06 18:24:40 +02:00
adbenitez 653d940242 fix: add back click listener to selfAvatar in ConversationListActivity 2024-09-06 18:24:05 +02:00
adbenitez 2f3a730be7 update core 2024-09-06 06:04:23 +02:00
adbenitez 7a2401a3d5 Merge remote-tracking branch 'upstream/main' 2024-09-06 06:03:00 +02:00
adbenitez 6690add48f update bots in menu 2024-09-06 05:31:40 +02:00
Asiel Díaz Benítez ace1c99daa Merge pull request #3262 from deltachat/hoc/increase-account-switcher-hitbox
Increase account switcher hitbox
2024-09-03 15:42:24 +02:00
Asiel Díaz Benítez 125ac5e7b3 Merge pull request #3275 from deltachat/adb/issue-3274
fix: rename fastline to fastlane
2024-09-03 04:17:33 +02:00
adbenitez b3248c9f6d fix: rename fastline to fastlane 2024-09-02 23:40:23 +02:00
adbenitez 00d1803631 tweak avatar size 2024-09-02 19:36:36 +02:00
adbenitez 0482889dfa improve delete-account-dialog layout 2024-09-02 19:27:07 +02:00
adbenitez 6113195977 update src/main/res/drawable/intro1.png 2024-08-31 16:02:35 +02:00
adbenitez 4a02d6c73d remove hack to send single emoji as reaction 2024-08-31 01:41:44 +02:00
adbenitez a252eec698 add "Get in on F-Droid" badge 2024-08-31 01:24:09 +02:00
adbenitez b89e094f9f improve account deletion dialog 2024-08-31 00:12:58 +02:00
adbenitez 6fa725e8ff update version number 2024-08-30 16:27:33 +02:00
adbenitez efb38db3ef Merge remote-tracking branch 'upstream/main' 2024-08-30 16:24:33 +02:00
Asiel Díaz Benítez 8ef136d6b2 Merge pull request #3272 from deltachat/adb/issue-3266
allow to delete selected account
2024-08-30 16:18:06 +02:00
adbenitez 3412dc8a0f Merge remote-tracking branch 'upstream/main' 2024-08-30 16:17:44 +02:00
adbenitez 6cb1c0fad4 update release.yml 2024-08-30 15:58:55 +02:00
adbenitez bfb1fc0281 allow to delete selected account 2024-08-29 21:09:56 +02:00
adbenitez bc511d6100 fix wrong translations of videochat_instance_example add doc comment 2024-08-29 20:12:50 +02:00
adbenitez 1ae69feb80 tweak code 2024-08-29 17:00:49 +02:00
adbenitez 19fac45062 update scripts/ndk-make.sh, remove ROOT_DIR 2024-08-29 15:40:59 +02:00
adbenitez 8c7d1da9d9 update scripts/ndk-make.sh 2024-08-29 15:27:06 +02:00
adbenitez 2376777bba improve reproducible build 2024-08-29 14:04:55 +02:00
adbenitez 21d6c3c3b8 fix bug in scripts/ndk-make-fdroid.sh, also rename all vars to uppercase 2024-08-29 02:07:28 +02:00
adbenitez a3976846f6 fix: create symbolic link for sdk in ndk-make.sh 2024-08-28 21:07:15 +02:00
adbenitez f9d21b75ee use symbolic link for ANDROID_NDK_ROOT 2024-08-28 20:52:31 +02:00
Asiel Díaz Benítez fd8311cfc9 Merge pull request #3269 from deltachat/adb/issue-3199
tweak account selection style
2024-08-28 20:43:47 +02:00
adbenitez 54f487b33d use bash instead of sh in scripts/ndk-make-fdroid.sh 2024-08-28 19:49:05 +02:00
Asiel Díaz Benítez 973e278d71 Merge pull request #3267 from deltachat/adb/issue-3144
add monochrome launcher icon
2024-08-28 19:15:06 +02:00
adbenitez ed7f3db2a4 add scripts/ndk-make-fdroid.sh 2024-08-28 18:54:09 +02:00
adbenitez 2ce614dc55 try to make core build reproducible 2024-08-28 15:31:32 +02:00
adbenitez 8a044221b1 tweak ndk-make.sh and Android.mk 2024-08-27 18:43:01 +02:00
adbenitez e9317ab641 tweak RUSTFLAGS 2024-08-27 16:51:52 +02:00
adbenitez a278121498 keep trying reproducible core build 2024-08-27 16:31:47 +02:00
adbenitez c060810a82 try to make core building reproducible 2024-08-27 15:03:24 +02:00
adbenitez 95f09a67f5 select item normally instead of using checkbox 2024-08-27 13:12:52 +02:00
adbenitez 78ad04bd7b simplify AccountSelectionListItem.bind() 2024-08-27 12:40:40 +02:00
Asiel Díaz Benítez b4c15ad45f Merge pull request #27 from ArcaneChat/use-same-app-id-for-foss
use same app id for FOSS flavor
2024-08-27 11:16:00 +02:00
adbenitez 744414baeb do not strip libs 2024-08-27 11:15:21 +02:00
adbenitez cda7bcb247 use same app id for FOSS flavor 2024-08-27 10:56:08 +02:00
adbenitez 24e8fc7d25 update .github/workflows/release.yml 2024-08-27 00:01:40 +02:00
Hocuri 59435e8975 Don't count taps that are too far to the right 2024-08-26 22:37:02 +02:00
link2xt bc94eba1da update deltachat-core-rust to 'chore(release): prepare for 1.142.10' of 'v1.142.10' 2024-08-26 20:34:46 +00:00
adbenitez 088494ea86 update version number 2024-08-26 21:34:33 +02:00
adbenitez 4c4c2e248c update core 2024-08-26 21:34:01 +02:00
adbenitez 60588ab8e4 allow to build single ABI via ABI_FILTER property 2024-08-26 21:07:57 +02:00
Asiel Díaz Benítez 228a5cf4f7 Merge pull request #26 from ArcaneChat/split-apk-for-fdroid
split apks again
2024-08-26 17:07:36 +02:00
adbenitez 7075fb39e1 fix apk preview workflow 2024-08-26 17:04:51 +02:00
adbenitez da15be4739 split apks again 2024-08-26 16:38:15 +02:00
adbenitez 6427e62ed9 prepare for f-droid submission 2024-08-26 15:41:22 +02:00
adbenitez 1eb733e80f update version number 2024-08-25 23:32:19 +02:00
adbenitez 130cdfe838 update core 2024-08-25 22:46:24 +02:00
adbenitez fadcb51d7c update links and apk name 2024-08-25 22:39:12 +02:00
Asiel Díaz Benítez cea5b6ec84 Merge pull request #25 from ArcaneChat/rename-app
rename app
2024-08-25 22:25:36 +02:00
adbenitez 6c9d1592f8 add monochrome launcher icon 2024-08-25 17:34:57 +02:00
Hocuri 56b925f600 Increase account switcher hitbox
The hitbox for the account switcher was only the own avatar in and the
title, so when you tapped a bit too low or too high, nothing happened.

This PR changes it to be the whole title bar.
2024-08-24 21:47:11 +02:00
Hosted Weblate 5a5ea83fa0 Merge remote-tracking branch 'origin/main' 2024-08-16 10:36:47 +02: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
Hosted Weblate 3033000e4e Merge remote-tracking branch 'origin/main' 2024-08-15 22:06:59 +02:00
Hosted Weblate 9f8da69b25 Merge remote-tracking branch 'origin/main' 2024-08-15 16:37:05 +02:00
Hosted Weblate aa52f8172d Merge remote-tracking branch 'origin/main' 2024-08-15 13:16:11 +00:00
Hosted Weblate 82ddcd0839 Merge remote-tracking branch 'origin/main' 2024-08-14 17:16:07 +00:00
Hosted Weblate 8d99b36347 Merge remote-tracking branch 'origin/main' 2024-08-14 18:47:56 +02:00
Hosted Weblate 589fa8e3dd Merge remote-tracking branch 'origin/main' 2024-08-14 11:26:01 +00:00
Hosted Weblate 434b40e51e Merge remote-tracking branch 'origin/main' 2024-08-14 13:13:21 +02:00
Hosted Weblate 755c346d82 Merge remote-tracking branch 'origin/main' 2024-08-14 12:24:49 +02:00
Hosted Weblate b13defdf9c Merge remote-tracking branch 'origin/main' 2024-08-13 10:30:02 +02:00
Hosted Weblate fbe533c701 Merge remote-tracking branch 'origin/main' 2024-08-13 01:21:09 +02:00
Hosted Weblate 13ebad4942 Merge remote-tracking branch 'origin/main' 2024-08-12 13:41:56 +02:00
Andrea Enzo Lattmann f9539c160e 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/
2024-08-11 20:09:18 +00:00
Hosted Weblate 0195f2f78f Merge remote-tracking branch 'origin/main' 2024-08-10 22:49:54 +02:00
Hosted Weblate 64553b5655 Merge remote-tracking branch 'origin/main' 2024-08-10 22:40:20 +02:00
Hosted Weblate ce38181502 Merge remote-tracking branch 'origin/main' 2024-08-10 21:15:51 +02:00
Andrea Enzo Lattmann 4c58f31dc6 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/
2024-08-10 19:09:22 +02:00
Hosted Weblate e5a2bde5c4 Merge remote-tracking branch 'origin/main' 2024-08-10 16:35:44 +00:00
Hosted Weblate d984bf15a0 Merge remote-tracking branch 'origin/main' 2024-08-09 16:40:42 +00:00
Hosted Weblate ab2904e274 Merge remote-tracking branch 'origin/main' 2024-08-09 18:37:39 +02:00
Hosted Weblate c751d7015c Merge remote-tracking branch 'origin/main' 2024-08-09 18:24:28 +02:00
Hosted Weblate eef3be840b Merge remote-tracking branch 'origin/main' 2024-08-09 18:11:01 +02:00
sushidave fed96377f5 Translated using Weblate (German)
Currently translated at 100.0% (3 of 3 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/de/
2024-08-06 14:10:00 +02:00
Hosted Weblate 774bee1e28 Merge remote-tracking branch 'origin/main' 2024-08-06 14:00:18 +02:00
Hosted Weblate c0b3d87ff9 Merge remote-tracking branch 'origin/main' 2024-08-05 20:04:30 +00:00
Hosted Weblate e72eed807f Merge remote-tracking branch 'origin/main' 2024-08-05 21:12:12 +02:00
Hosted Weblate cd1821f6a7 Merge remote-tracking branch 'origin/main' 2024-08-05 18:56:10 +00:00
Hosted Weblate e79f4ef84e Merge remote-tracking branch 'origin/main' 2024-08-05 14:31:53 +00:00
Hosted Weblate 8071f64669 Merge remote-tracking branch 'origin/main' 2024-08-05 13:11:06 +00:00
Hosted Weblate fd2d3a5b5a Merge remote-tracking branch 'origin/main' 2024-08-05 14:57:16 +02:00
Hosted Weblate 2e500ce97b Merge remote-tracking branch 'origin/main' 2024-08-04 16:12:01 +00:00
Hosted Weblate 997d03829e Merge remote-tracking branch 'origin/main' 2024-08-03 00:47:35 +02:00
Hosted Weblate 67d6a2aed3 Merge remote-tracking branch 'origin/main' 2024-08-02 21:31:19 +00:00
Hosted Weblate 884481fa9e Merge remote-tracking branch 'origin/main' 2024-08-02 22:09:30 +02:00
Hosted Weblate 4c90890643 Merge remote-tracking branch 'origin/main' 2024-08-02 21:39:15 +02:00
Hosted Weblate 1209ec02f9 Merge remote-tracking branch 'origin/main' 2024-08-02 14:43:36 +00:00
Hosted Weblate 63e4b25cbf Merge remote-tracking branch 'origin/main' 2024-08-02 13:44:42 +00:00
Hosted Weblate acdde4c0a0 Merge remote-tracking branch 'origin/main' 2024-08-02 15:08:05 +02:00
Hosted Weblate a9fba59386 Merge remote-tracking branch 'origin/main' 2024-08-02 10:42:14 +02:00
Hosted Weblate 4ef7fc0401 Merge remote-tracking branch 'origin/main' 2024-08-02 08:01:09 +00:00
Hosted Weblate 148f07729c Merge remote-tracking branch 'origin/main' 2024-07-30 15:18:21 +02:00
Hosted Weblate 529f46f226 Merge remote-tracking branch 'origin/main' 2024-07-30 15:08:49 +02:00
Hosted Weblate 7ad8a48255 Merge remote-tracking branch 'origin/main' 2024-07-30 11:08:03 +00:00
Hosted Weblate 3d7d3157fc Merge remote-tracking branch 'origin/main' 2024-07-27 17:56:35 +02:00
Hosted Weblate 6b34438958 Merge remote-tracking branch 'origin/main' 2024-07-27 12:23:04 +02:00
Hosted Weblate 31bc04d190 Merge remote-tracking branch 'origin/main' 2024-07-27 12:22:19 +02:00
Hosted Weblate c1c2aa4930 Merge remote-tracking branch 'origin/main' 2024-07-26 16:13:52 +00:00
Hosted Weblate 78a9bd98b0 Merge remote-tracking branch 'origin/main' 2024-07-26 12:36:31 +00:00
alex0valk c058eb2927 Translated using Weblate (Portuguese (Portugal))
Currently translated at 10.5% (2 of 19 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/pt_PT/
2024-07-25 19:09:13 +02:00
Hosted Weblate 6180397f8f Merge remote-tracking branch 'origin/main' 2024-07-23 15:59:58 +00:00
Andrea Enzo Lattmann b4bb2e2b5d Translated using Weblate (Italian)
Currently translated at 100.0% (19 of 19 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/it/
2024-07-18 22:09:11 +02:00
Hosted Weblate e717837e6c Merge remote-tracking branch 'origin/main' 2024-07-17 19:44:54 +02:00
Hosted Weblate b7ae41b249 Merge remote-tracking branch 'origin/main' 2024-07-17 14:58:51 +02:00
Hosted Weblate 270e31fc58 Merge remote-tracking branch 'origin/main' 2024-07-17 14:45:31 +02:00
Hosted Weblate 5900b340e4 Merge remote-tracking branch 'origin/main' 2024-07-17 14:39:43 +02:00
Hosted Weblate 066d794360 Merge remote-tracking branch 'origin/main' 2024-07-17 14:36:41 +02:00
Hosted Weblate c9d9d915a1 Merge remote-tracking branch 'origin/main' 2024-07-17 14:35:38 +02:00
Andrea Enzo Lattmann d397f7f16e Translated using Weblate (Italian)
Currently translated at 100.0% (18 of 18 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/it/
2024-07-15 08:09:17 +02:00
Hosted Weblate d1d379b9b1 Merge remote-tracking branch 'origin/main' 2024-07-13 17:26:16 +02:00
Hosted Weblate a4abc0181b Merge remote-tracking branch 'origin/main' 2024-07-13 13:54:42 +00:00
Hosted Weblate 7c762bbb6c Merge remote-tracking branch 'origin/main' 2024-07-13 13:31:42 +00:00
Hosted Weblate 0d3e009500 Merge remote-tracking branch 'origin/main' 2024-07-10 13:56:01 +02:00
Hosted Weblate d16d58b77a Merge remote-tracking branch 'origin/main' 2024-07-08 13:21:36 +00:00
Hosted Weblate f4bbb61313 Merge remote-tracking branch 'origin/main' 2024-07-08 12:02:47 +02:00
Hosted Weblate a38a29167e Merge remote-tracking branch 'origin/main' 2024-07-08 11:16:28 +02:00
Hosted Weblate cf954d0970 Merge remote-tracking branch 'origin/main' 2024-07-06 23:55:56 +02:00
Hosted Weblate 7ded91d8af Merge remote-tracking branch 'origin/main' 2024-07-06 21:53:52 +00:00
Hosted Weblate 27d7e3b27d Merge remote-tracking branch 'origin/main' 2024-07-06 10:49:37 +00:00
Hosted Weblate 669e21b6f1 Merge remote-tracking branch 'origin/main' 2024-07-05 14:20:20 +02:00
Leonardo Colman b7e4dda6f5 Translated using Weblate (Portuguese)
Currently translated at 16.6% (3 of 18 strings)

Translation: Delta Chat/Android metadata
Translate-URL: https://hosted.weblate.org/projects/deltachat/android-metadata/pt/
2024-07-05 03:09:19 +02:00
561 changed files with 16562 additions and 15801 deletions
+3
View File
@@ -0,0 +1,3 @@
ko_fi: adbenitez
liberapay: adbenitez
custom: "https://arcanechat.me/#contribute"
+1 -1
View File
@@ -1 +1 @@
blank_issues_enabled: true
blank_issues_enabled: false
+3 -3
View File
@@ -35,7 +35,7 @@ jobs:
- uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: r23c
ndk-version: r27
- name: Compile core
env:
@@ -48,10 +48,10 @@ jobs:
uses: gradle/wrapper-validation-action@v1
- name: Build APK
run: ./gradlew --no-daemon assembleFossDebug
run: ./gradlew --no-daemon -PABI_FILTER=armeabi-v7a assembleFossDebug
- name: Upload APK
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: app-preview.apk
path: 'build/outputs/apk/foss/debug/*.apk'
+12 -8
View File
@@ -37,7 +37,7 @@ jobs:
- uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: r23c
ndk-version: r27
- name: Compile core
env:
@@ -49,18 +49,22 @@ jobs:
- name: Build APK
run: |
mkdir -p ~/.gradle
echo -n ${{ secrets.SIGNING_KEY }} | base64 -d >> ~/app.keystore
echo "DC_RELEASE_STORE_FILE=$HOME/app.keystore" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_STORE_PASSWORD=${{ secrets.KEY_STORE_PASSWORD }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS=${{ secrets.ALIAS }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_PASSWORD=${{ secrets.KEY_PASSWORD }}" >> ~/.gradle/gradle.properties
./gradlew --no-daemon assembleFossRelease
echo -n ${{ secrets.KEYSTORE_FILE }} | base64 -d >> ~/keystore.jks
echo "DC_RELEASE_STORE_FILE=$HOME/keystore.jks" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_STORE_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS_FDROID=${{ secrets.ALIAS_FDROID }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_ALIAS_GPLAY=${{ secrets.ALIAS_GPLAY }}" >> ~/.gradle/gradle.properties
echo "DC_RELEASE_KEY_PASSWORD=${{ secrets.KEYSTORE_PASSWORD }}" >> ~/.gradle/gradle.properties
./gradlew assembleFossRelease
rm build/outputs/apk/foss/release/*universal*
./gradlew assembleGplayRelease
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
- name: Release
uses: softprops/action-gh-release@v1
with:
token: "${{ secrets.GITHUB_TOKEN }}"
body: "Auto-generated release"
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
+1 -1
View File
@@ -1,3 +1,3 @@
[submodule "jni/deltachat-core-rust"]
path = jni/deltachat-core-rust
url = https://github.com/deltalab-org/deltalab-core
url = https://github.com/ArcaneChat/core
+225 -1
View File
@@ -1,5 +1,229 @@
# Delta Chat Android Changelog
## 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
* detect incompatible profiles from newer app version when importing them
* prepare the app for receiving edited messages
* prepare the app for receiving message deletion requests
* do some small bug fixes
* update translations
* update to core 1.156.2
## v1.54.0
2025-02
* enhanced "Saved Messages" feature, now when forwarding a message to "Saved Messages" chat, it retains the sender information and a button to jump to the original message
* Saved messages are marked by a bookmark sign
* improve explanation when blocking a contact
* improve wording in empty "apps" and "files" tabs in chat media screen
* remove deprecated/legacy built-in "half-camera"
* UI improvement: keep avatars aligned to message bubble when message has reactions
* fix problems when opening attachments in external apps
* fix a bug with some big images appearing as blank/transparent
* some other small bug fixes
* update translations
* update to core 1.155.4
## v1.52.1
2025-01
* the app now requires less storage on your SD card by deduplicating newly received/sent files
* some small bug fixes
* update translations
* update to core 1.155.1
## v1.52.0
2025-01
* new group consistency algorithm
* fix: don't show animated .webp stickers as static stickers
* fix the chat shortcuts (created via long-press in launcher) to properly support multi-profile
* fix some small bugs in certain android versions and special situations
* avoid the app freezing in slow phones in some situations
* improve menu in the help screen
* update translations
* update to core 1.155.0
## v1.50.5
2025-01
* fix push-notifications handling for certain devices where it was not working correctly
* update translations
* using core 1.153.0
## v1.50.4
2025-01
* properly send as animated stickers GIF files selected from keyboard
* improve emoji picker in landscape mode and when changing from landscape to portrait
* avoid crash when receiving push notifications if the user restricted the app from working in background
* improve UI when attaching a file or image to easily recognize it is attached but not sent yet
* avoid slow loading of in-chat apps in some devices when quickly re-opening an app after closing it
* allow to select multiple images at once in the media picker via "Gallery" button
* mark holiday notice messages as bot-generated
* don't mark contacts as bot when receiving location-only and sync messages
* prefer to encrypt even if peers have their preference to "no preference"
* start ephemeral messages timers when the chat is archived or noticed
* several bug fixes and updated translations
* update to core 1.153.0
## v1.50.3
2024-12
* Add in-chat apps picker to attachments options
* Notify replies and reactions to your messages in muted chats (can be disabled in settings)
* Cache HTTP GET requests (ex. when loading images from HTML messages)
* update to core 1.152.0
## v1.50.2
2024-12
* Encrypt notification tokens
* update to core 1.151.5
## v1.50.0
2024-12
* New emoji picker with support for more emojis
* Webxdc apps can now trigger notifications
* Webxdc apps can now deep-link to internal sections when you click their info-messages in chat
* Add "Show in Chat" to the menu of opened Webxdc apps
* Reverse order of messages in the notification group
* Notify reactions to own messages
* Improve the button to start Webxdc apps
* Make account deletion confirmation dialog faster
* Rename "Back up Chats to External Storage" to "Export Backup"
* Improve compatibility with classic email clients in the outgoing messages
* Removed internal font scaling setting in favor of the better system settings
* Use privacy-preserving webxdc addresses
* Use Rustls for connections with strict TLS
* QR codes for adding contacts and joining groups provide help when opened in a normal browser
* Mark Saved Messages chat as protected
* Allow the user to replace maps integration
* fix: Trim whitespace from scanned QR codes
* fix quotes: Line-before-quote may be up to 120 character long instead of 80
* fix: Prevent accidental wrong-password-notifications
* fix: Remove footers from "Show Full Message..."
* fix: Only add "member added/removed" messages if they actually do that
* fix: Update state of message when fully downloading it
* fix: send message: Do not fail if the message does not exist anymore
* fix: Do not percent-encode dot when passing to autoconfig server (so, fix handling of some servers)
* fix displaynames not being updated when intially scanned by a QR code
* several bug fixes
* update to core 1.151.3
## v1.48.3
2024-10
* new Proxy settings screen available at "Advanced / Proxy"
* manage a list of HTTP(S), SOCKS5 or Shadowsocks Proxies
* Proxies icon shown on the chatlist if proxies are used
* share Proxies by showing a QR code
* scan Proxies' QR code and use them
* make Proxy URLs inside Delta Chat tappable
* open Delta Chat when tapping Proxy URLs in other apps
* support for realtime webxdc apps moved out of experimental and enabled by default
* realtime webxdc apps can be disabled at "Settings / Advanced"
* "New Contact / Link" button to view, share or copy the invite line
* "New Contact / Scan" button to easier access the scanner functionality
* open "New Contact" scan/show activities directly, do not try to be too smart and open the last active tab
* allow to attach multiple images in one step
* to easier differ between multiple profiles, set a "Private Tag" (long tap profile switcher)
* "Private Tag" is shown in notifications
* improve profile deletion dialog: show name, size and avatar of the profile being deleted
* show profile name in title bar when the user has multiple profiles
* improve profile switcher layout
* improve notification: allow to "Mark Read" from the notification
* search for unread chats in the search's three-dot-menu
* allow pasting QR codes from "Add As Second Device" screen
* save traffic by supporting "IMAP COMPRESS"
* automatic reconfiguration, e.g. switching to implicit TLS if STARTTLS port stops working
* parallelize IMAP and SMTP connection attempts
* improve DNS caching
* always use preloaded DNS results
* prioritize cached results if DNS resolver returns many results
* always move auto-generated messages to DeltaChat folder
* ignore invalid securejoin messages silently
* delete messages from a chatmail server immediately by default
* make resending pending messages possible
* don't SMTP-send messages to self-chat if BccSelf is disabled
* HTTP(S) tunneling
* don't put displayname into From/To/Sender if it equals to address
* hide sync messages from INBOX (use IMAP APPEND command to upload sync messages)
* more verbose SMTP connection establishment errors
* add "Learn More" button to "Manage keys"
* visual feedback when tapping the action button of a message
* log unexpected message state when resending fails
* smoother backup and "Add Second Device" progress bars
* assign messages to ad-hoc group with matching name and members
* use stricter TLS checks for HTTPS downloads (images in HTML mails, Autoconfig)
* improve logging for failed QR code scans, AEAP, Autocrypt, notification permissions and sending errors
* improve logging of multi account setup (log account ID)
* show more context for the "Cannot establish guaranteed..." info message
* show file name in "Message Info"
* show root SMTP connection failure in connectivity view
* fix: Sort received outgoing message down if it's fresher than all non fresh messages
* fix: avoid app being killed when processing a PUSH notification
* fix crash when refreshing avatar
* fix crash in gallery
* fix: shorten message text in locally sent messages too
* fix: Set http I/O timeout to 1 minute rather than whole request timeout
* fix: don't sync QR code token before populating the group
* fix: do not get stuck if the message to download does not exist anymore
* fix: do not attempt to reference info messages
* fix: do not get stuck if there is an error transferring backup
* fix: make it possible to cancel ongoing backup transfer
* fix: reset quota when entering a new address
* fix: better detection of file extensions
* fix: "database locked" errors
* fix: never initialize realtime channels if realtime is disabled
* fix reception of realtime channels
* fix: normalize proxy URLs
* fix connections getting stuck in "Updating..." sometimes
* fix scanning "add second device" QR code from scanner above chatlist
* fix warning about wrong password
* fix app getting stale when receiving a PUSH notifications takes longer
* fix app getting stale on network changes
* fix: skip IDLE if we got unsolicited FETCH
* update translations and local help
* update to core 1.148.6
## v1.46.14
2024-09
* add monochrome/themed launcher icon support
* allow to remove the selected profile in "Switch Profile" dialog
* improve display of selected profile in "Switch Profile" dialog
* improve the hit/tap area to open "Switch Profile" dialog in the main screen's toolbar
* add support for system per-app language and remove in-app language selector
* remove the experimental "encrypt database" checkbox in classic registration screen
* fix various bugs
* update to core 1.142.12
## v1.46.13
2024-08
@@ -689,7 +913,7 @@
* fix sending status updates of private apps
* show full messages: do not load remote content for requests automatically
* using to core107.1
* using core107.1
## v1.34.12
+3 -3
View File
@@ -34,10 +34,10 @@ ENV PATH ${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/bin
# Install NDK manually. Other SDK parts are installed automatically by gradle.
#
# If you change the NDK version here, also change it in `flake.nix`.
# NDK version r23c LTS aka 23.2.8568313
RUN sdkmanager --sdk_root=${ANDROID_SDK_ROOT} 'ndk;23.2.8568313'
# NDK version r27 LTS aka 27.0.11902837
RUN sdkmanager --sdk_root=${ANDROID_SDK_ROOT} 'ndk;27.0.11902837'
ENV ANDROID_NDK_ROOT ${ANDROID_SDK_ROOT}/ndk/23.2.8568313
ENV ANDROID_NDK_ROOT ${ANDROID_SDK_ROOT}/ndk/27.0.11902837
ENV PATH ${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none
+5 -11
View File
@@ -1,16 +1,10 @@
## ArcaneChat Android Client
A [Delta Chat](https://delta.chat/) client for Android.
A [Delta Chat](https://delta.chat/) client for Android. Learn more at: https://arcanechat.me
[<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-apklis.png"
alt="Disponible en Apklis"
height="48">](https://www.apklis.cu/application/chat.delta.lite)
[<img src="store/get-it-on-github.png"
alt="Get it on GitHub"
height="48">](https://github.com/deltalab-org/deltalab-android/releases/latest)
[<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)
<img alt="Screenshot" src="fastlane/metadata/android/en-US/images/phoneScreenshots/1.png" width="298" /> <img alt="Screenshot" src="fastlane/metadata/android/en-US/images/phoneScreenshots/2.png" width="298" />
@@ -37,4 +31,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/deltalab-org/deltalab-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 [Delta Chat Core Library](https://github.com/deltachat/deltachat-core-rust).
+24 -15
View File
@@ -24,14 +24,18 @@ the "update-core-and-stuff-DATE" PR can be merged without review
the following steps are done in a PR called `prep-VERSION` (no leading "v"):
3. 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>.
avoid technical terms, library versions etc. the changelog is for the end user.
do not forget to update/mention used core version and release month.
3. a) update `CHANGELOG.md`
from <https://github.com/chatmail/core/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`
in case previous entries of the changelog refer to betas or to not officially released versions,
the entries can be summarized.
this makes it easier for the end user to follow changes by showing major changes atop
this makes it easier for the end user to follow changes by showing major changes atop.
4. add a device message to `ConversationListActivity::onCreate()` or remove the old one.
do not repeat the CHANGELOG here: write what really is the ux outcome
@@ -44,7 +48,8 @@ the following steps are done in a PR called `prep-VERSION` (no leading "v"):
6. build APKs:
a) generate debug APK at "Build / Build Bundle(s)/APK / Build APK(s)"
b) generate release APK at "Build / Generate Signed Bundle or APK",
select "APK", add keys, flavor `gplayRelease`
select "APK", add keys, flavor `gplayRelease`.
this APK will go to the stores and is located at `gplay/release`
## Push Test Releases
@@ -75,16 +80,21 @@ only afterwards, push the APK to stores. **consider a blog post.**
on <https://play.google.com/apps/publish/>:
9. a) open "Delta Chat/Release/Production"
then "Create new release" and upload APK from above
9. a) open "Delta Chat / Test and release / Production"
then "Create new release" and upload APK from above
b) fill out "Release details/Release notes" (500 chars), add the line
"These features will roll out over the coming days. Thanks for using Delta Chat!";
release name should be default ("123 (1.2.3)")
c) click "Next", set "Rollout Percentage" to 1% (later 2%, 5%, 10%, 20%, 50%, 100%),
click "Save"
c) click "Next", set "Rollout Percentage" to 50%, click "Save"
d) Go to "Publishing Overview", "Managed publishing" is usually off;
click "Send change for review", confirm
2 days later, change "Rollout Percentage" to 99%. Two more days later to 100%.
Rollout is anyways slower in practise, however,
only as long as we do not enter 100%, we can retract the version
(Once we reach 100%, we have to submit a new version for approval.
During these up to 4 days, sometimes longer, we cannot do anything on existing rollout)
## Tag for F-Droid and create Github release
@@ -104,12 +114,11 @@ This may take some days.
on <https://developer.amazon.com/dashboard>:
12. a) for "Delta Chat", select "Add upcoming version" on the left
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" page: "Does your app collect or transfer user data to third parties?" -> No, then "Next"
e) on "Step 3" page: "Next"
f) on "Step 4" page: "Submit app"
d) on "Step 2" and "Step 3" pages, hit "Next"
e) on "Step 4" page: "Submit app"
## Release on Huawei AppGallery
+73 -31
View File
@@ -1,5 +1,5 @@
plugins {
id 'com.android.application' version '8.1.4'
id 'com.android.application' version '8.5.2'
id 'com.google.gms.google-services' version '4.4.1'
}
@@ -29,12 +29,12 @@ android {
// > Task :stripFatDebugDebugSymbols
// Unable to strip the following libraries, packaging them as they are: libanimation-decoder-gif.so, libnative-utils.so.
// See <https://issuetracker.google.com/issues/237187538> for details.
ndkVersion "23.2.8568313"
ndkVersion "27.0.12077973"
useLibrary 'org.apache.http.legacy'
defaultConfig {
versionCode 30000685
versionName "1.46.13"
versionCode 30000715
versionName "1.54.5"
applicationId "chat.delta.lite"
multiDexEnabled true
@@ -50,7 +50,11 @@ android {
buildConfigField "boolean", "DEV_BUILD", "false"
ndk {
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
if(project.hasProperty("ABI_FILTER")) {
abiFilters ABI_FILTER
} else {
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}
@@ -67,6 +71,7 @@ android {
}
packagingOptions {
jniLibs {
doNotStrip '**/*.so'
keepDebugSymbols += ['*/mips/*.so', '*/mips64/*.so']
}
resources {
@@ -82,15 +87,45 @@ android {
storeFile file(DC_DEBUG_STORE_FILE )
}
}
release {
releaseFdroid {
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
storeFile file(DC_RELEASE_STORE_FILE)
storePassword DC_RELEASE_STORE_PASSWORD
keyAlias DC_RELEASE_KEY_ALIAS
keyAlias DC_RELEASE_KEY_ALIAS_FDROID
keyPassword DC_RELEASE_KEY_PASSWORD
}
}
releaseApk {
// can be defined at `~/.gradle/gradle.properties` or at "Build/Generate signed APK"
if(project.hasProperty("DC_RELEASE_STORE_FILE")) {
storeFile file(DC_RELEASE_STORE_FILE)
storePassword DC_RELEASE_STORE_PASSWORD
keyAlias DC_RELEASE_KEY_ALIAS_GPLAY
keyPassword DC_RELEASE_KEY_PASSWORD
}
}
releaseBundle {
if(project.hasProperty("DC_BUNDLE_STORE_FILE")) {
storeFile file(DC_BUNDLE_STORE_FILE)
storePassword DC_BUNDLE_STORE_PASSWORD
keyAlias DC_BUNDLE_KEY_ALIAS
keyPassword DC_BUNDLE_STORE_PASSWORD
}
}
}
productFlavors {
foss {
dimension "none"
buildConfigField "boolean", "USE_PLAY_SERVICES", "false"
}
gplay {
dimension "none"
apply plugin: "com.google.gms.google-services"
buildConfigField "boolean", "USE_PLAY_SERVICES", "true"
applicationId "com.github.arcanechat"
}
}
buildTypes {
@@ -109,29 +144,38 @@ android {
// nb: it is highly recommended to use the same settings in debug+release -
// otherwise problems might be noticed delayed only
minifyEnabled true
signingConfig signingConfigs.release
productFlavors.foss.signingConfig signingConfigs.releaseFdroid
productFlavors.gplay.signingConfig signingConfigs.releaseApk
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
productFlavors {
foss {
dimension "none"
buildConfigField "boolean", "USE_PLAY_SERVICES", "false"
}
gplay {
dimension "none"
apply plugin: "com.google.gms.google-services"
buildConfigField "boolean", "USE_PLAY_SERVICES", "true"
if(!project.hasProperty("ABI_FILTER")) {
splits {
abi {
enable true
reset()
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
universalApk true
}
}
}
project.ext.versionCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, 'x86': 3, 'x86_64': 4]
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = outputFileName
.replace("deltalab-android", "deltalab")
variant.outputs.all { output ->
output.outputFileName = output.outputFileName
.replace("android", "ArcaneChat")
.replace("-release", "")
.replace(".apk", "-${variant.versionName}.apk")
if(project.hasProperty("ABI_FILTER")) {
output.versionCodeOverride =
variant.versionCode * 10 + project.ext.versionCodes.get(ABI_FILTER)
} else {
output.versionCodeOverride =
variant.versionCode * 10 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 4)
}
}
}
@@ -165,7 +209,7 @@ dependencies {
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
implementation 'androidx.sharetarget:sharetarget:1.2.0'
implementation 'androidx.webkit:webkit:1.11.0'
implementation 'androidx.webkit:webkit:1.12.1'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'com.google.android.material:material:1.12.0'
@@ -181,26 +225,25 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.2'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2'
implementation 'androidx.work:work-runtime:2.9.1'
implementation 'androidx.emoji2:emoji2-emojipicker:1.4.0'
implementation 'androidx.emoji2:emoji2-emojipicker:1.5.0'
implementation 'com.google.guava:guava:31.1-android'
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' // plays video and audio
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
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.9.1' // used as JSON library. Don't upgrade to 2.10.1: https://github.com/deltachat/deltachat-android/pull/2610
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:glide-plugin:2.25.0' // APNG & animated webp support.
implementation 'com.github.penfeizhou.android.animation:awebp:3.0.2' // animated webp support.
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'
annotationProcessor 'androidx.annotation:annotation:1.8.2'
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.soundcloud.android:android-crop:1.0.1@aar' // used for profile and group avatar selection in Android SDK<19
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
@@ -209,13 +252,12 @@ dependencies {
}
implementation 'com.annimon:stream:1.1.8' // brings future java streams api to SDK Version < 24
implementation 'com.getkeepsafe.relinker:relinker:1.4.4' // needed to avoid safe-content-resolver-v14 trying to fetch older non-existing version
// Replacement for ContentResolver
// that protects against the Surreptitious Sharing attack.
// <https://github.com/cketti/SafeContentResolver>
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v14:1.0.0'
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0'
gplayImplementation('com.google.firebase:firebase-messaging:24.0.0') { // for PUSH notifications
gplayImplementation('com.google.firebase:firebase-messaging:24.1.0') { // for PUSH notifications
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'
@@ -229,7 +271,7 @@ dependencies {
testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1'
testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1'
androidTestImplementation 'androidx.test:runner:1.6.1'
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'
@@ -1,30 +1,39 @@
<i>ArcaneChat</i> is a friendly fork of <i>Delta Chat</i> messenger, a chat app compatible with the existing e-mail infrastructure.
ArcaneChat is a decentralized and secure instant messenger that is easy to use for friends and family.
ArcaneChat was created with a focus on usability, good user experience, and saving data plan and comes with some different default settings than Delta Chat. Also the app usually experiments with new features and alternative paths of development that eventually might get added to the official Delta Chat client.
• Anonymous. Instant onboarding without a phone number, e-mail or other private data.
• Flexible. Supports multiple chat profiles and is easy to setup on multiple devices.
• Extensible. Use mini-apps in chats like shopping lists, calendars or games.
• Reliable. Works under bad and adverserial network conditions.
• Secure. 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.
<b>Main differences with official Delta Chat client:</b>
<ul>
<li>Basic markdown support (bold, italic, strike, etc.)</li>
<li>Support for some markdown styles in text messages (bold, italic, strike, etc.)</li>
<li>Support for displaying Telegram's animated stickers (.tgs files)</li>
<li>Support for SVG images previews</li>
<li>Multiple color themes/skins</li>
<li>It is possible to enable/disable accounts</li>
<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>Replies to your messages in muted groups trigger notifications</li>
<li>Quote-reply a message with a single emoji to set it as reaction</li>
<li>Location streaming feature enabled by default and have extra option to share location for 12 hours</li>
<li>Verified icon is shown in the chat list for the "Device Messages" chat</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>
<li>It is possible to click <b>OPENPGP4FPR:</b> and <b>mumble:</b> links in messages</li>
<li>Verified icon is shown in the chat list for the "Device Messages" chat</li>
<li>Voice messages have more aggressive compression in "worse quality" mode to save data plan</li>
<li>Default configuration changed: automatic download of messages limited to 640KB</li>
<li>Account's display name is shown in the app's title bar instead of the name of the app</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 application when clicking/opening links, this is useful to share the link with web grabber bots</li>
<li>Can be selected as app to open .xdc files</li>
<li>For mini-apps developers: there are some differences in the WebXDC API, check https://github.com/deltalab-org/deltalab-android/#webxdc</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>
<b>WARNING:</b> Be careful when running WebXDC apps in ArcaneChat, the sandboxed webview can't currently prevent WebRTC connections, so in theory information inside the WebXDC app could be leaked and also your IP, the risk is low, for most people this is not even important, but if you are a person at risk, only use trusted apps, or use official Delta Chat.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 137 KiB

@@ -1 +1 @@
Encrypted chat over e-mail (Delta Chat client)
⚡ Fast encrypted chats for the family 🎉
Generated
+26 -94
View File
@@ -3,15 +3,15 @@
"android": {
"inputs": {
"devshell": "devshell",
"flake-utils": "flake-utils_2",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1710633978,
"narHash": "sha256-yemnwSvW7cdWtXGpivFA5jDO35rGPs6fqxlQ4l6ODXs=",
"lastModified": 1733948466,
"narHash": "sha256-o/uq/tU458Ykudi8Zk3sRga5iazkuSczt9wDOCUDOSU=",
"owner": "tadfisher",
"repo": "android-nixpkgs",
"rev": "e91fb3d8517538e5ad9b422c9a4f604b56008a9e",
"rev": "0bf99ffaea6a7c0948ae10cf2e40c2905e4e4d6b",
"type": "github"
},
"original": {
@@ -22,18 +22,17 @@
},
"devshell": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [
"android",
"nixpkgs"
]
},
"locked": {
"lastModified": 1708939976,
"narHash": "sha256-O5+nFozxz2Vubpdl1YZtPrilcIXPcRAjqNdNE8oCRoA=",
"lastModified": 1728330715,
"narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=",
"owner": "numtide",
"repo": "devshell",
"rev": "5ddecd67edbd568ebe0a55905273e56cc82aabe3",
"rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef",
"type": "github"
},
"original": {
@@ -47,11 +46,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1701680307,
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
@@ -65,47 +64,11 @@
"systems": "systems_2"
},
"locked": {
"lastModified": 1709126324,
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_3": {
"inputs": {
"systems": "systems_3"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_4": {
"inputs": {
"systems": "systems_4"
},
"locked": {
"lastModified": 1705309234,
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
@@ -116,11 +79,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1709237383,
"narHash": "sha256-cy6ArO4k5qTx+l5o+0mL9f5fa86tYUX3ozE1S+Txlds=",
"lastModified": 1733759999,
"narHash": "sha256-463SNPWmz46iLzJKRzO3Q2b0Aurff3U1n0nYItxq7jU=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1536926ef5621b09bba54035ae2bb6d806d72ac8",
"rev": "a73246e2eef4c6ed172979932bc80e1404ba2d56",
"type": "github"
},
"original": {
@@ -132,11 +95,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1710889954,
"narHash": "sha256-Pr6F5Pmd7JnNEMHHmspZ0qVqIBVxyZ13ik1pJtm2QXk=",
"lastModified": 1733749988,
"narHash": "sha256-+5qdtgXceqhK5ZR1YbP1fAUsweBIrhL38726oIEAtDs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "7872526e9c5332274ea5932a0c3270d6e4724f3b",
"rev": "bc27f0fde01ce4e1bfec1ab122d72b7380278e68",
"type": "github"
},
"original": {
@@ -148,11 +111,11 @@
},
"nixpkgs_3": {
"locked": {
"lastModified": 1706487304,
"narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=",
"lastModified": 1728538411,
"narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "90f456026d284c22b3e3497be980b2e47d0b28ac",
"rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221",
"type": "github"
},
"original": {
@@ -165,22 +128,21 @@
"root": {
"inputs": {
"android": "android",
"flake-utils": "flake-utils_3",
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs_2",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"flake-utils": "flake-utils_4",
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1711073443,
"narHash": "sha256-PpNb4xq7U5Q/DdX40qe7CijUsqhVVM3VZrhN0+c6Lcw=",
"lastModified": 1733970833,
"narHash": "sha256-sPEKtSaZk2CtfF9cdhtbY93S6qGq+d2PKI1fcoDfDaI=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "eec55ba9fcde6be4c63942827247e42afef7fafe",
"rev": "f7f4c59ccdf1bec3f1547d27398e9589aa94e3e8",
"type": "github"
},
"original": {
@@ -218,36 +180,6 @@
"repo": "default",
"type": "github"
}
},
"systems_3": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_4": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
+3 -4
View File
@@ -15,12 +15,11 @@
pkgs = import nixpkgs { inherit system overlays; };
android-sdk = android.sdk.${system} (sdkPkgs:
with sdkPkgs; [
build-tools-33-0-1
build-tools-34-0-0
cmdline-tools-latest
ndk-bundle
platform-tools
platforms-android-34
ndk-23-2-8568313
ndk-27-0-11902837
]);
rust-version = pkgs.lib.removeSuffix "\n"
(builtins.readFile ./scripts/rust-toolchain);
@@ -28,7 +27,7 @@
devShells.default = pkgs.mkShell {
ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk";
ANDROID_NDK_ROOT =
"${android-sdk}/share/android-sdk/ndk/23.2.8568313";
"${android-sdk}/share/android-sdk/ndk/27.0.11902837";
buildInputs = [
android-sdk
pkgs.openjdk17
+4 -4
View File
@@ -28,7 +28,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:6f54e2c4e49405673e2bb9",
"android_client_info": {
"package_name": "chat.delta.lite.beta"
"package_name": "com.github.arcanechat.beta"
}
},
"oauth_client": [],
@@ -47,7 +47,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:aff82fbc40c8172e3e2bb9",
"android_client_info": {
"package_name": "chat.delta.lite"
"package_name": "com.github.arcanechat"
}
},
"oauth_client": [],
@@ -66,7 +66,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:92b4cf12669cc2083e2bb9",
"android_client_info": {
"package_name": "com.b44t.messenger"
"package_name": "chat.delta.lite"
}
},
"oauth_client": [],
@@ -85,7 +85,7 @@
"client_info": {
"mobilesdk_app_id": "1:922391085500:android:228a205b8aa2bacc3e2bb9",
"android_client_info": {
"package_name": "com.b44t.messenger.beta"
"package_name": "chat.delta.lite.beta"
}
},
"oauth_client": [],
-1
View File
@@ -1,6 +1,5 @@
android.defaults.buildfeatures.buildconfig=true
android.enableJetifier=true
android.nonFinalResIds=false
android.nonTransitiveRClass=false
android.useAndroidX=true
org.gradle.jvmargs=-Xmx4608m
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=ff7bf6a86f09b9b2c40bb8f48b25fc19cf2b2664fd1d220cd7ab833ec758d0d7
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+1
View File
@@ -31,5 +31,6 @@ LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT
LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math -D__STDC_CONSTANT_MACROS
LOCAL_SRC_FILES := dc_wrapper.c
LOCAL_LDFLAGS += -Wl,--build-id=none
include $(BUILD_SHARED_LIBRARY)
+80 -82
View File
@@ -7,57 +7,6 @@
#include "deltachat-core-rust/deltachat-ffi/deltachat.h"
#if __ANDROID_API__ == 16
unsigned long getauxval(unsigned long type) {
return 0;
}
#include <sys/socket.h>
#include <unistd.h>
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
int flags)
{
if (flags != 0) {
// Not supported by the fallback.
return -1;
}
if (vlen == 0) {
return 0;
}
ssize_t n = sendmsg(sockfd, &msgvec->msg_hdr, flags);
if (n == -1) {
return -1;
}
(*msgvec).msg_len = n;
return 1;
}
int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
int flags, struct timespec *timeout)
{
if (flags != 0) {
// Not supported by the fallback.
return -1;
}
if (vlen == 0) {
return 0;
}
int n = recvmsg(sockfd, &msgvec->msg_hdr, flags);
if (n == -1) {
return -1;
}
(*msgvec).msg_len = n;
return 1;
}
#endif
static dc_msg_t* get_dc_msg(JNIEnv *env, jobject obj);
@@ -276,9 +225,9 @@ JNIEXPORT void Java_com_b44t_messenger_DcAccounts_setPushDeviceToken(JNIEnv *env
}
JNIEXPORT jint Java_com_b44t_messenger_DcAccounts_addAccount(JNIEnv *env, jobject obj)
JNIEXPORT jboolean Java_com_b44t_messenger_DcAccounts_backgroundFetch(JNIEnv *env, jobject obj, jint timeout_seconds)
{
return dc_accounts_add_account(get_dc_accounts(env, obj));
return dc_accounts_background_fetch(get_dc_accounts(env, obj), timeout_seconds) != 0;
}
@@ -704,6 +653,14 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getMsgInfo(JNIEnv *env, jobj
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_sendEditRequest(JNIEnv *env, jobject obj, jint msg_id, jstring text)
{
CHAR_REF(text);
dc_send_edit_request(get_dc_context(env, obj), msg_id, textPtr);
CHAR_UNREF(text);
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getMsgHtml(JNIEnv *env, jobject obj, jint msg_id)
{
char* temp = dc_get_msg_html(get_dc_context(env, obj), msg_id);
@@ -728,6 +685,15 @@ JNIEXPORT void Java_com_b44t_messenger_DcContext_deleteMsgs(JNIEnv *env, jobject
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_sendDeleteRequest(JNIEnv *env, jobject obj, jintArray msg_ids)
{
int msg_ids_cnt = 0;
uint32_t* msg_ids_ptr = jintArray2uint32Pointer(env, msg_ids, &msg_ids_cnt);
dc_send_delete_request(get_dc_context(env, obj), msg_ids_ptr, msg_ids_cnt);
free(msg_ids_ptr);
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_forwardMsgs(JNIEnv *env, jobject obj, jintArray msg_ids, jint chat_id)
{
int msg_ids_cnt = 0;
@@ -736,6 +702,13 @@ JNIEXPORT void Java_com_b44t_messenger_DcContext_forwardMsgs(JNIEnv *env, jobjec
free(msg_ids_ptr);
}
JNIEXPORT void Java_com_b44t_messenger_DcContext_saveMsgs(JNIEnv *env, jobject obj, jintArray msg_ids)
{
int msg_ids_cnt = 0;
uint32_t* msg_ids_ptr = jintArray2uint32Pointer(env, msg_ids, &msg_ids_cnt);
dc_save_msgs(get_dc_context(env, obj), msg_ids_ptr, msg_ids_cnt);
free(msg_ids_ptr);
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_resendMsgs(JNIEnv *env, jobject obj, jintArray msg_ids)
{
@@ -747,12 +720,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_resendMsgs(JNIEnv *env, job
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_prepareMsg(JNIEnv *env, jobject obj, jint chat_id, jobject msg)
{
return dc_prepare_msg(get_dc_context(env, obj), chat_id, get_dc_msg(env, msg));
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendMsg(JNIEnv *env, jobject obj, jint chat_id, jobject msg)
{
return dc_send_msg(get_dc_context(env, obj), chat_id, get_dc_msg(env, msg));
@@ -774,12 +741,10 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendVideochatInvitation(JNIEnv
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_sendWebxdcStatusUpdate(JNIEnv *env, jobject obj, jint msg_id, jstring payload, jstring descr)
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_sendWebxdcStatusUpdate(JNIEnv *env, jobject obj, jint msg_id, jstring payload)
{
CHAR_REF(payload);
CHAR_REF(descr);
jboolean ret = dc_send_webxdc_status_update(get_dc_context(env, obj), msg_id, payloadPtr, descrPtr) != 0;
CHAR_UNREF(descr);
jboolean ret = dc_send_webxdc_status_update(get_dc_context(env, obj), msg_id, payloadPtr, NULL) != 0;
CHAR_UNREF(payload);
return ret;
}
@@ -848,7 +813,7 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getConfig(JNIEnv *env, jobje
}
dc_str_unref(temp);
CHAR_UNREF(key);
return ret; /* returns NULL only if key is unset and "def" is NULL */
return ret;
}
@@ -878,6 +843,16 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getSecurejoinQrSvg(JNIEnv *e
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_DcContext_createQrSvg(JNIEnv *env, jobject obj, jstring payload)
{
CHAR_REF(payload);
char* temp = dc_create_qr_svg(payloadPtr);
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
CHAR_UNREF(payload);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_joinSecurejoin(JNIEnv *env, jobject obj, jstring qr)
{
CHAR_REF(qr);
@@ -1325,12 +1300,6 @@ JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatMedia(JNIEnv *env,
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_getNextMedia(JNIEnv *env, jobject obj, jint msg_id, jint dir, jint type1, jint type2, jint type3)
{
return dc_get_next_media(get_dc_context(env, obj), msg_id, dir, type1, type2, type3);
}
JNIEXPORT jintArray Java_com_b44t_messenger_DcContext_getChatMsgs(JNIEnv *env, jobject obj, jint chat_id, jint flags, jint marker1before)
{
dc_array_t* ca = dc_get_chat_msgs(get_dc_context(env, obj), chat_id, flags, marker1before);
@@ -1413,12 +1382,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getId(JNIEnv *env, jobject obj)
return dc_msg_get_id(get_dc_msg(env, obj));
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isOutgoing(JNIEnv *env, jobject obj)
{
return (jboolean)(dc_msg_is_outgoing(get_dc_msg(env, obj))!=0);
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getSenderColor(JNIEnv *env, jobject obj)
{
return dc_msg_get_sender_color(get_dc_msg(env, obj));
@@ -1616,15 +1579,18 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getWebxdcInfoJson(JNIEnv *env, j
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isForwarded(JNIEnv *env, jobject obj)
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getWebxdcHref(JNIEnv *env, jobject obj)
{
return dc_msg_is_forwarded(get_dc_msg(env, obj))!=0;
char* temp = dc_msg_get_webxdc_href(get_dc_msg(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isIncreation(JNIEnv *env, jobject obj)
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isForwarded(JNIEnv *env, jobject obj)
{
return dc_msg_is_increation(get_dc_msg(env, obj))!=0;
return dc_msg_is_forwarded(get_dc_msg(env, obj))!=0;
}
@@ -1694,12 +1660,35 @@ JNIEXPORT void Java_com_b44t_messenger_DcMsg_setHtml(JNIEnv *env, jobject obj, j
}
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setFile(JNIEnv *env, jobject obj, jstring file, jstring filemime)
JNIEXPORT void Java_com_b44t_messenger_DcMsg_forceSticker(JNIEnv *env, jobject obj)
{
dc_msg_force_sticker(get_dc_msg(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getPOILocation(JNIEnv *env, jobject obj)
{
char* temp = dc_msg_get_poi_location(get_dc_msg(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isEdited(JNIEnv *env, jobject obj)
{
return dc_msg_is_edited(get_dc_msg(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setFileAndDeduplicate(JNIEnv *env, jobject obj, jstring file, jstring name, jstring filemime)
{
CHAR_REF(file);
CHAR_REF(name);
CHAR_REF(filemime);
dc_msg_set_file(get_dc_msg(env, obj), filePtr, filemimePtr);
dc_msg_set_file_and_deduplicate(get_dc_msg(env, obj), filePtr, namePtr, filemimePtr);
CHAR_UNREF(filemime);
CHAR_UNREF(name);
CHAR_UNREF(file);
}
@@ -1748,6 +1737,15 @@ JNIEXPORT jlong Java_com_b44t_messenger_DcMsg_getParentCPtr(JNIEnv *env, jobject
return (jlong)dc_msg_get_parent(get_dc_msg(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getOriginalMsgId(JNIEnv *env, jobject obj)
{
return (jint)dc_msg_get_original_msg_id(get_dc_msg(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getSavedMsgId(JNIEnv *env, jobject obj)
{
return (jint)dc_msg_get_saved_msg_id(get_dc_msg(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getError(JNIEnv *env, jobject obj)
{
+1
View File
@@ -0,0 +1 @@
Schreibe Nachrichten mit E-Mails. Retro, Offen. Privatsphäre im Design.
+12
View File
@@ -0,0 +1,12 @@
Delta Chat é um aplicativo de mensagens que é completamente compatível com a infraestrutura de email já existente.
Assim, com o Delta Chat você tem a facilidade de muitos aplicativos de mensagens com o alcance de email. Além disso, você é independente de outras companhias e sercviços -- já que suas informações e dados não estão relacionadas com o Delta Chat, você não vai nem adicionar novas permissões aqui.
Resumo de alguns recursos:
* Seguro com criptografia de ponta a ponta, com suporte ao novo padrão <a href="https://autocrypt.org">Autocrypt</a>
* Rápido usando Push-IMAP
* Maior base de usuários -- destinatários que não estiverem usando Delta Chat podem ser alcançados também
* Compatívle -- não apenas consigo mesmo
* Interface de usuário elegante e simples
* Sistema distribuído
* Sem spam -- apenas mensages de usuários conhecidos são mostradas por padrão
* Confiável -- pode até ser usado para mensagens comerciais
* Completamente OpenSource e baseado em padrões
+1 -1
View File
@@ -1 +1 @@
../deltachat-pages/tools/create-local-help.py ../deltachat-pages/_site src/main/assets/help
../deltachat-pages/tools/create-local-help.py ../deltachat-pages/result src/main/assets/help
+24 -16
View File
@@ -50,6 +50,15 @@ if test -z "$ANDROID_NDK_ROOT"; then
exit 1
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
ANDROID_NDK_ROOT=/tmp/android-ndk-root
echo Setting CARGO_TARGET environment variables.
if test -z "$NDK_HOST_TAG"; then
@@ -65,12 +74,10 @@ if test -z "$NDK_HOST_TAG"; then
NDK_HOST_TAG="$KERNEL-$ARCH"
fi
unset RUSTFLAGS
TOOLCHAIN="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$NDK_HOST_TAG"
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$TOOLCHAIN/bin/armv7a-linux-androideabi16-clang"
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"
export CARGO_TARGET_I686_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/i686-linux-android16-clang"
export CARGO_TARGET_I686_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/i686-linux-android21-clang"
export CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="$TOOLCHAIN/bin/x86_64-linux-android21-clang"
export RUSTUP_TOOLCHAIN=$(cat "$(dirname "$0")/rust-toolchain")
@@ -116,11 +123,11 @@ unset CPATH
if test -z $1 || test $1 = armeabi-v7a; then
echo "-- cross compiling to armv7-linux-androideabi (arm) --"
TARGET_CC="$TOOLCHAIN/bin/armv7a-linux-androideabi16-clang" \
TARGET_CC="$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi --features jsonrpc
cp target/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a
cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi
cp $CARGO_TARGET_DIR/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a
fi
if test -z $1 || test $1 = arm64-v8a; then
@@ -128,17 +135,17 @@ if test -z $1 || test $1 = arm64-v8a; then
TARGET_CC="$TOOLCHAIN/bin/aarch64-linux-android21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi --features jsonrpc
cp target/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a
cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi
cp $CARGO_TARGET_DIR/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a
fi
if test -z $1 || test $1 = x86; then
echo "-- cross compiling to i686-linux-android (x86) --"
TARGET_CC="$TOOLCHAIN/bin/i686-linux-android16-clang" \
TARGET_CC="$TOOLCHAIN/bin/i686-linux-android21-clang" \
TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \
TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \
cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi --features jsonrpc
cp target/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi
cp $CARGO_TARGET_DIR/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86
fi
if test -z $1 || test $1 = x86_64; then
@@ -146,12 +153,10 @@ fi
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 --features jsonrpc
cp target/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64
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
rm -fr "$TMPLIB"
echo -- ndk-build --
cd ../..
@@ -169,4 +174,7 @@ else
rm -f ndkArch # Remove ndkArch, ignore if it doesn't exist
fi
"$(dirname "$0")/rebrand.sh"
echo "ending time: `date`"
+7
View File
@@ -0,0 +1,7 @@
#!/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/ArcaneChat/g'
+1 -1
View File
@@ -1 +1 @@
1.77.0
1.83.0
+7
View File
@@ -0,0 +1,7 @@
#!/bin/sh
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/Delta Chat/g'
sed -i 's/>Delta Chat</>ArcaneChat</g' ./src/main/res/values/strings.xml
+2
View File
@@ -1,3 +1,5 @@
#!/usr/bin/env bash
set -e # stop on all errors
git submodule update --init --recursive
+1 -1
View File
@@ -1,3 +1,4 @@
#!/usr/bin/env bash
VERSION=$1
@@ -29,7 +30,6 @@ echo ""
echo "and now: here is Delta Chat $VERSION - choose your flavour and mind your backups:"
echo "- 🍋 https://download.delta.chat/android/beta/deltachat-gplay-release-$VERSION.apk (google play candidate, overwrites existing installs, should keep data)"
echo "- 🍉 https://download.delta.chat/android/beta/deltachat-foss-debug-$VERSION.apk (f-droid candidate, can be installed beside google play)"
echo "- 🍏 https://testflight.apple.com/join/uEMc1NxS (ios, update to $VERSION may take a day or so)"
echo ""
echo "what to test: PLEASE_FILL_OUT"
+1
View File
@@ -1,3 +1,4 @@
#!/usr/bin/env bash
VERSION=$1
@@ -1,5 +1,11 @@
package com.b44t.messenger;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
import static androidx.test.espresso.matcher.ViewMatchers.withHint;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
@@ -23,12 +29,6 @@ import org.thoughtcrime.securesms.util.AccessibilityUtil;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
import static androidx.test.espresso.matcher.ViewMatchers.withHint;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
public class TestUtils {
private static int createdAccountId = 0;
private static boolean resetEnterSends = false;
@@ -1,5 +1,14 @@
package com.b44t.messenger.uibenchmarks;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.Espresso.pressBack;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.replaceText;
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static androidx.test.espresso.matcher.ViewMatchers.withHint;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import android.util.Log;
import androidx.test.espresso.contrib.RecyclerViewActions;
@@ -17,15 +26,6 @@ import org.junit.runner.RunWith;
import org.thoughtcrime.securesms.ConversationListActivity;
import org.thoughtcrime.securesms.R;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.Espresso.pressBack;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.replaceText;
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static androidx.test.espresso.matcher.ViewMatchers.withHint;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
@Ignore("This is not a test, but a benchmark. Remove the @Ignore to run it.")
@RunWith(AndroidJUnit4.class)
@LargeTest
@@ -1,5 +1,16 @@
package com.b44t.messenger.uitests.offline;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.Espresso.pressBack;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
import static androidx.test.espresso.matcher.ViewMatchers.isClickable;
import static androidx.test.espresso.matcher.ViewMatchers.withHint;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
@@ -25,17 +36,6 @@ import org.thoughtcrime.securesms.connect.DcHelper;
import java.io.File;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.Espresso.pressBack;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
import static androidx.test.espresso.matcher.ViewMatchers.isClickable;
import static androidx.test.espresso.matcher.ViewMatchers.withHint;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
@RunWith(AndroidJUnit4.class)
@LargeTest
@@ -93,7 +93,7 @@ public class SharingTest {
}
}
Uri uri = Uri.parse("content://" + BuildConfig.APPLICATION_ID + ".attachments/" + Uri.encode(pngImage));
DcHelper.sharedFiles.put("/" + pngImage, 1);
DcHelper.sharedFiles.put(pngImage, "image/png");
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("image/png");
@@ -1,6 +1,15 @@
package com.b44t.messenger.uitests.online;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.replaceText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isClickable;
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static androidx.test.espresso.matcher.ViewMatchers.withHint;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import android.text.TextUtils;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
@@ -17,15 +26,6 @@ import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.WelcomeActivity;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.replaceText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isClickable;
import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
import static androidx.test.espresso.matcher.ViewMatchers.withHint;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class OnboardingTest {
@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.notifications;
import android.content.Context;
import androidx.annotation.Nullable;
/*
@@ -17,7 +17,7 @@ import com.google.firebase.messaging.RemoteMessage;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.service.FetchForegroundService;
import org.thoughtcrime.securesms.util.Util;
public class FcmReceiveService extends FirebaseMessagingService {
@@ -28,11 +28,6 @@ public class FcmReceiveService extends FirebaseMessagingService {
private static volatile String prefixedToken;
public static void register(Context context) {
if (Build.VERSION.SDK_INT < 19) {
Log.w(TAG, "FCM not available on SDK < 19");
triedRegistering = true;
return;
}
if (FcmReceiveService.prefixedToken != null) {
Log.i(TAG, "FCM already registered");
@@ -92,18 +87,17 @@ public class FcmReceiveService extends FirebaseMessagingService {
return prefixedToken;
}
@WorkerThread
@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
Log.i(TAG, "FCM push notification received");
// the app is running (again) now and fetching and notifications should be processed as usual.
// to support accounts that do not send PUSH notifications and for simplicity,
// we just let the app run as long as possible.
FetchForegroundService.start(this);
}
@Override
public void onDeletedMessages() {
Log.i(TAG, "FCM push notifications dropped");
// nothing special to do as we're running now and notifications should be processed as usual.
FetchForegroundService.start(this);
}
@Override
+33 -3
View File
@@ -20,7 +20,6 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
@@ -66,6 +65,10 @@
android:resource="@xml/automotive_app_desc" />
-->
<!-- Opt out of metrics collection: https://developer.android.com/develop/ui/views/layout/webapps/managing-webview#metrics -->
<meta-data android:name="android.webkit.WebView.MetricsOptOut"
android:value="true" />
<activity android:name=".ShareActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:excludeFromRecents="true"
@@ -262,6 +265,26 @@
</intent-filter>
</activity>
<activity android:name=".proxy.ProxySettingsActivity"
android:label="@string/proxy_settings"
android:windowSoftInputMode="stateHidden"
android:exported="true"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
<data android:scheme="ss" />
<data android:scheme="socks5" />
<data android:scheme="SOCKS5" tools:ignore="AppLinkUrlError" />
<data android:scheme="SS" tools:ignore="AppLinkUrlError" />
</intent-filter>
</activity>
<activity android:name=".LogViewActivity"
android:label="@string/pref_log_header"
android:windowSoftInputMode="stateHidden"
@@ -305,8 +328,6 @@
android:theme="@style/TextSecure.ScribbleTheme"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name="com.soundcloud.android.crop.CropImageActivity" />
<activity android:name=".InstantOnboardingActivity"
android:theme="@style/TextSecure.LightTheme"
android:windowSoftInputMode="stateHidden|adjustResize"
@@ -365,6 +386,11 @@
android:exported="true">
</activity>
<activity android:name=".WebxdcStoreActivity"
android:theme="@style/TextSecure.LightTheme"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode">
</activity>
<activity android:name=".FullMsgActivity"
android:theme="@style/TextSecure.LightTheme"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
@@ -388,6 +414,10 @@
android:name=".service.GenericForegroundService"
android:foregroundServiceType="dataSync" />
<service
android:name=".service.FetchForegroundService"
android:foregroundServiceType="dataSync" />
<service
android:name=".service.IPCAddAccountsService"
android:foregroundServiceType="dataSync"
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
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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+223 -170
View File
@@ -1,14 +1,14 @@
<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
<li><a href="#czym-jest-delta-chat">Czym jest ArcaneChat?</a>
<html lang="pl"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
<li><a href="#czym-jest-delta-chat">Czym jest Delta Chat?</a>
<ul>
<li><a href="#jak-mogę-znaleźć-ludzi-z-którymi-mogę-czatować">Jak mogę znaleźć ludzi, z którymi mogę czatować?</a></li>
<li><a href="#jakie-są-zalety-delta-chat-w-porównaniu-z-innymi-komunikatorami">Jakie są zalety ArcaneChat w porównaniu z innymi komunikatorami?</a></li>
<li><a href="#jakie-są-zalety-delta-chat-w-porównaniu-z-innymi-komunikatorami">Jakie są zalety Delta Chat w porównaniu z innymi komunikatorami?</a></li>
<li><a href="#co-zrobić-jeśli-oczekuję-wiadomości-od-osoby-do-której-nie-pisałem-w-przeszłości">Co zrobić, jeśli oczekuję wiadomości od osoby, do której nie pisałem w przeszłości?</a></li>
<li><a href="#czy-delta-chat-obsługuje-obrazy-filmy-i-inne-załączniki">Czy ArcaneChat obsługuje obrazy, filmy i inne załączniki?</a></li>
<li><a href="#czy-delta-chat-obsługuje-obrazy-filmy-i-inne-załączniki">Czy Delta Chat obsługuje obrazy, filmy i inne załączniki?</a></li>
<li><a href="#multiple-accounts">Czym są profile? Jak mogę przełączać się między nimi?</a></li>
<li><a href="#kto-widzi-moje-zdjęcie-profilowe">Kto widzi moje zdjęcie profilowe?</a></li>
<li><a href="#signature">Czy w ArcaneChat mogę ustawić Biografię/Podpis/Status/Motto?</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="#co-oznacza-zielona-kropka">Co oznacza zielona kropka?</a></li>
<li><a href="#ephemeralmsgs">Jak działają znikające wiadomości?</a></li>
@@ -30,8 +30,8 @@
<li><a href="#co-to-są-powiadomienia-push-jak-mogę-uzyskać-natychmiastowe-dostarczenie-wiadomości">Co to są powiadomienia push? Jak mogę uzyskać natychmiastowe dostarczenie wiadomości?</a></li>
<li><a href="#czy-powiadomienia-push-są-włączone-na-urządzeniach-z-ios-czy-istnieje-alternatywa">Czy powiadomienia push są włączone na urządzeniach z iOS? Czy istnieje alternatywa?</a></li>
<li><a href="#android-push">Czy powiadomienia Push są włączone/potrzebne na urządzeniach z Androidem?</a></li>
<li><a href="#privacy-notifications">Jak prywatne są powiadomienia push na ArcaneChat?</a></li>
<li><a href="#dlaczego-delta-chat-integruje-się-ze-scentralizowanymi-zastrzeżonymi-usługami-push-applegoogle">Dlaczego ArcaneChat integruje się ze scentralizowanymi, zastrzeżonymi usługami push Apple/Google?</a></li>
<li><a href="#privacy-notifications">Jak prywatne są powiadomienia push na Delta Chat?</a></li>
<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>
@@ -44,28 +44,28 @@
<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 ArcaneChat jest podatny na EFAIL?</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="#message-metadata">W jaki sposób ArcaneChat chroni metadane w wiadomościach?</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 ArcaneChat, który czasami korzysta z poczty internetowej lub innej aplikacji e-mail bez Autocrypt?</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="#pfs">Czy ArcaneChat 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 ArcaneChat jest tak samo bezpieczne jak Signal?</a></li>
<li><a href="#czy-mogę-ponownie-wykorzystać-mój-istniejący-klucz-prywatny">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 ArcaneChat.</a></li>
<li><a href="#security-audits">Czy ArcaneChat był niezależnie kontrolowany pod kątem luk w zabezpieczeniach?</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="#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>
<li><a href="#multiclient">Multi-klient</a>
<ul>
<li><a href="#czy-mogę-korzystać-z-delta-chat-na-wielu-urządzeniach-w-tym-samym-czasie">Czy mogę korzystać z ArcaneChat na wielu urządzeniach w tym samym czasie?</a></li>
<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-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">Czy są jakieś plany wprowadzenia klienta Web ArcaneChat?</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>
<li><a href="#webxdc">Aplikacje webxdc</a>
@@ -77,7 +77,7 @@
</li>
<li><a href="#funkcje-eksperymentalne">Funkcje eksperymentalne</a>
<ul>
<li><a href="#jak-mogę-korzystać-z-połączeń-audiowideo-z-delta-chat">Jak mogę korzystać z połączeń audio/wideo z ArcaneChat?</a></li>
<li><a href="#jak-mogę-korzystać-z-połączeń-audiowideo-z-delta-chat">Jak mogę korzystać z połączeń audio/wideo z Delta Chat?</a></li>
<li><a href="#co-to-są-listy-rozgłoszeniowe-i-jak-mogę-ich-używać">Co to są Listy rozgłoszeniowe i jak mogę ich używać?</a></li>
<li><a href="#jak-mogę-udostępnić-swoją-lokalizację-moim-rozmówcom">Jak mogę udostępnić swoją lokalizację moim rozmówcom?</a></li>
<li><a href="#dlaczego-mogę-wybrać-aby-widzieć-tylko-folder-deltachat">Dlaczego mogę wybrać, aby widzieć tylko folder DeltaChat?</a></li>
@@ -86,20 +86,21 @@
</li>
<li><a href="#różne">Różne</a>
<ul>
<li><a href="#jakich-uprawnień-potrzebuje-delta-chat">Jakich uprawnień potrzebuje ArcaneChat?</a></li>
<li><a href="#czy-delta-chat-działa-z-moim-dostawcą-poczty-e-mail">Czy ArcaneChat 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 ArcaneChat. 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 ArcaneChat? Czy to jest bezpieczne?</a></li>
<li><a href="#jakie-wiadomości-pojawiają-się-w-delta-chat">Jakie wiadomości pojawiają się w ArcaneChat?</a></li>
<li><a href="#czy-delta-chat-obsługuje-wiadomości-e-mail-w-formacie-html">Czy ArcaneChat obsługuje wiadomości e-mail w formacie HTML?</a></li>
<li><a href="#czy-w-delta-chat-mogę-ustawić-temat-wiadomości-e-mail">Czy w ArcaneChat mogę ustawić temat wiadomości e-mail?</a></li>
<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="#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>
<li><a href="#czy-w-delta-chat-mogę-ustawić-temat-wiadomości-e-mail">Czy w Delta Chat mogę ustawić temat wiadomości e-mail?</a></li>
<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 ArcaneChat jest kompatybilny z Protonmail / Tutanota / Criptext?</a></li>
<li><a href="#jak-mogę-usunąć-swoje-konto">Jak mogę usunąć swoje konto?</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="#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="#w-jaki-sposób-finansowany-jest-rozwój-delta-chat">W jaki sposób finansowany jest rozwój ArcaneChat?</a></li>
<li><a href="#gdzie-moi-znajomi-mogą-znaleźć-delta-chat">Gdzie moi znajomi mogą znaleźć Delta Chat?</a></li>
<li><a href="#w-jaki-sposób-finansowany-jest-rozwój-delta-chat">W jaki sposób finansowany jest rozwój Delta Chat?</a></li>
</ul>
</li>
</ul>
@@ -109,14 +110,14 @@
<h2 id="czym-jest-delta-chat">
Czym jest ArcaneChat? <a href="#czym-jest-delta-chat" class="anchor"></a>
Czym jest Delta Chat? <a href="#czym-jest-delta-chat" class="anchor"></a>
</h2>
<p>ArcaneChat to niezawodna, zdecentralizowana i bezpieczna aplikacja do przesyłania wiadomości, dostępna na platformy mobilne i stacjonarne.</p>
<p>Delta Chat to niezawodna, zdecentralizowana i bezpieczna aplikacja do przesyłania wiadomości, dostępna na platformy mobilne i stacjonarne.</p>
<p>ArcaneChat przypomina Whatsapp lub Telegram, ale możesz go również używać i traktować jako aplikację e-mail. Możesz zarejestrować się anonimowo na różnych <a href="https://delta.chat/chatmail">interoperacyjnych serwerach chatmail</a>, które są minimalnymi serwerami poczty e-mail zoptymalizowanymi pod kątem szybkich i bezpiecznych operacji. Możesz też skorzystać z klasycznych serwerów pocztowych i istniejącego konta e-mail, w którym to przypadku ArcaneChat będzie pełnić funkcję aplikacji pocztowej. </p>
<p>Delta Chat przypomina Whatsapp lub Telegram, ale możesz go również używać i traktować jako aplikację e-mail. Możesz zarejestrować się anonimowo na różnych <a href="https://delta.chat/chatmail">interoperacyjnych serwerach chatmail</a>, które są minimalnymi serwerami poczty e-mail zoptymalizowanymi pod kątem szybkich i bezpiecznych operacji. Możesz też skorzystać z klasycznych serwerów pocztowych i istniejącego konta e-mail, w którym to przypadku Delta Chat będzie pełnić funkcję aplikacji pocztowej. </p>
<p><img style="float:right; width:50%; max-width:360%; margin:1em;" src="../delta-what-optim.png" /></p>
@@ -130,12 +131,12 @@
<p>Aby bezpiecznie skonfigurować kontakt z innymi, <a href="#howtoe2ee">zeskanuj kod QR zaproszenia lub udostępnij link zaproszenia</a>. Jest to wymagane w przypadku korzystania z (domyślnego) profilu czatu opartego na poczcie chatmail, ponieważ serwery chatmail odrzucają niezaszyfrowane wiadomości wychodzące.</p>
<p>Jeśli utworzysz profil czatu z klasycznym adresem e-mail, możesz ręcznie utworzyć kontakt, jeśli znasz jego adres e-mail, a następnie napisać do niego wiadomość, nawet jeśli odbiorca nie korzysta z ArcaneChat.</p>
<p>Jeśli utworzysz profil czatu z klasycznym adresem e-mail, możesz ręcznie utworzyć kontakt, jeśli znasz jego adres e-mail, a następnie napisać do niego wiadomość, nawet jeśli odbiorca nie korzysta z Delta Chat.</p>
<h3 id="jakie-są-zalety-delta-chat-w-porównaniu-z-innymi-komunikatorami">
Jakie są zalety ArcaneChat w porównaniu z innymi komunikatorami? <a href="#jakie-są-zalety-delta-chat-w-porównaniu-z-innymi-komunikatorami" class="anchor"></a>
Jakie są zalety Delta Chat w porównaniu z innymi komunikatorami? <a href="#jakie-są-zalety-delta-chat-w-porównaniu-z-innymi-komunikatorami" class="anchor"></a>
</h3>
@@ -174,7 +175,7 @@
<h3 id="czy-delta-chat-obsługuje-obrazy-filmy-i-inne-załączniki">
Czy ArcaneChat obsługuje obrazy, filmy i inne załączniki? <a href="#czy-delta-chat-obsługuje-obrazy-filmy-i-inne-załączniki" class="anchor"></a>
Czy Delta Chat obsługuje obrazy, filmy i inne załączniki? <a href="#czy-delta-chat-obsługuje-obrazy-filmy-i-inne-załączniki" class="anchor"></a>
</h3>
@@ -198,7 +199,7 @@
<p>Profil to <strong>nazwa, zdjęcie</strong> i dodatkowe informacje umożliwiające szyfrowanie wiadomości. Profil znajduje się wyłącznie na twoim urządzeniu (urządzeniach) i do przesyłania wiadomości wykorzystuje chatmail lub klasyczny serwer e-mail.</p>
<p>Podczas pierwszej instalacji ArcaneChat tworzony jest pierwszy profil.</p>
<p>Podczas pierwszej instalacji Delta Chat tworzony jest pierwszy profil.</p>
<p>Później możesz dotknąć swojego zdjęcia profilowego w lewym górnym rogu, aby <strong>Dodać profile</strong> lub <strong>Przełączyć profile</strong>.</p>
@@ -219,7 +220,7 @@
<p>Możesz dodać zdjęcie profilowe w swoich ustawieniach. Jeśli napiszesz do swoich kontaktów lub dodasz je za pomocą kodu QR, automatycznie zobaczą je jako Twoje zdjęcie profilowe.</p>
</li>
<li>
<p>Kontakty, które nie korzystają z ArcaneChat nie widzą zdjęcia profilowego (jednak oczywiście mogą zainstalować ArcaneChat :)</p>
<p>Kontakty, które nie korzystają z Delta Chat nie widzą zdjęcia profilowego (jednak oczywiście mogą zainstalować Delta Chat :)</p>
</li>
<li>
<p>Ze względów prywatności nikt nie widzi Twojego zdjęcia profilowego, dopóki nie napiszesz do niego wiadomości.</p>
@@ -232,12 +233,12 @@
<h3 id="signature">
Czy w ArcaneChat mogę ustawić Biografię/Podpis/Status/Motto? <a href="#signature" class="anchor"></a>
Czy w Delta Chat mogę ustawić Biografię/Podpis/Status/Motto? <a href="#signature" class="anchor"></a>
</h3>
<p>Tak, możesz to zrobić w <strong>Ustawienia » Profil » Biografia</strong>. Twoje kontakty korzystające z ArcaneChat, zobaczą go, przeglądając twoje dane kontaktowe. Ponadto będzie on wyglądał jak klasyczny podpis w wiadomości e-mail.</p>
<p>Tak, możesz to zrobić w <strong>Ustawienia » Profil » Biografia</strong>. Twoje kontakty korzystające z Delta Chat, zobaczą go, przeglądając twoje dane kontaktowe. Ponadto będzie on wyglądał jak klasyczny podpis w wiadomości e-mail.</p>
<h3 id="co-oznacza-przypinanie-wyciszanie-i-archiwizowanie">
@@ -265,8 +266,7 @@
</li>
</ul>
<p>Aby zarchiwizować lub przypiąć czat, dotknij i przytrzymaj (Android), yj menu czatu (Android/Desktop) lub przesuń palcem w lewo (iOS);
aby wyciszyć czat, użyj menu czatu (Android/Desktop) lub profilu czatu (iOS).</p>
<p>Aby skorzystać z tych funkcji, przytrzymaj ej lub kliknij prawym przyciskiem myszy czat na liście czatów.</p>
<h3 id="co-oznacza-zielona-kropka">
@@ -277,12 +277,12 @@ aby wyciszyć czat, użyj menu czatu (Android/Desktop) lub profilu czatu (iOS).<
</h3>
<ul>
<li>Od wersji ArcaneChat 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 ArcaneChat widział go:</li>
<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 ArcaneChat za pomocą <a href="#webxdc">Webxdc aplikacji</a>.</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>
</ul>
@@ -297,11 +297,11 @@ aby wyciszyć czat, użyj menu czatu (Android/Desktop) lub profilu czatu (iOS).<
<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>Dopóki ustawienie nie zostanie ponownie wyłączone, aplikacja ArcaneChat 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 ArcaneChat. Wiadomości są usuwane zarówno na każdym koncie e-mail na serwerze, jak i w samej aplikacji.</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>
<p>Pamiętaj, że na znikających wiadomościach możesz polegać tylko wtedy, gdy ufasz swoim partnerom czatu; złośliwi partnerzy czatu mogą robić zdjęcia lub w inny sposób zapisywać, kopiować lub przesyłać dalej wiadomości przed usunięciem.</p>
<p>Poza tym, jeśli jeden z partnerów czatu odinstaluje ArcaneChat, wiadomości nie zostaną usunięte z jego konta e-mail. Najprawdopodobniej nie będzie już można ich odszyfrować (o ile zostały najpierw zaszyfrowane).</p>
<p>Poza tym, jeśli jeden z partnerów czatu odinstaluje Delta Chat, wiadomości nie zostaną usunięte z jego konta e-mail. Najprawdopodobniej nie będzie już można ich odszyfrować (o ile zostały najpierw zaszyfrowane).</p>
<h2 id="grupy">
@@ -395,13 +395,13 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<ul>
<li>
<p>Domyślnie ArcaneChat przechowuje wszystkie wiadomości lokalnie na Twoim urządzeniu. Jeśli np. chcesz zaoszczędzić miejsce u swojego dostawcy poczty, możesz wybrać automatyczne usuwanie starych wiadomości. Pozostają one nadal na Twoim urządzeniu, dopóki nie usuniesz ich również tam.</p>
<p>Domyślnie Delta Chat przechowuje wszystkie wiadomości lokalnie na Twoim urządzeniu. Jeśli np. chcesz zaoszczędzić miejsce u swojego dostawcy poczty, możesz wybrać automatyczne usuwanie starych wiadomości. Pozostają one nadal na Twoim urządzeniu, dopóki nie usuniesz ich również tam.</p>
</li>
<li>
<p>Aby ją włączyć, w ustawieniach „Czaty i media” przejdź do <strong>Usuwanie starych wiadomości → Usuń wiadomości z serwera</strong>. Możesz ustawić przedział czasowy pomiędzy „Od razu” a „Po 1 roku”. Wszystkie e-maile otrzymane przez ArcaneChat zostaną usunięte z serwera po tym czasie.</p>
<p>Aby ją włączyć, w ustawieniach „Czaty i media” przejdź do <strong>Usuwanie starych wiadomości → Usuń wiadomości z serwera</strong>. Możesz ustawić przedział czasowy pomiędzy „Od razu” a „Po 1 roku”. Wszystkie e-maile otrzymane przez Delta Chat zostaną usunięte z serwera po tym czasie.</p>
</li>
<li>
<p>Zauważ, że jeśli używasz ArcaneChat na więcej niż jednym urządzeniu, powinieneś pozostawić wiadomości na serwerze, do czasu, aż inne urządzenie/urządzenia będzie mogło je pobrać.</p>
<p>Zauważ, że jeśli używasz Delta Chat na więcej niż jednym urządzeniu, powinieneś pozostawić wiadomości na serwerze, do czasu, aż inne urządzenie/urządzenia będzie mogło je pobrać.</p>
</li>
</ul>
@@ -434,7 +434,7 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Powiadomienia push są wysyłane przez „usługi push” Apple i Google do urządzenia użytkownika, dzięki czemu nieaktywna aplikacja ArcaneChat może pobierać wiadomości w tle i w razie potrzeby wyświetlać powiadomienia na telefonie użytkownika.</p>
<p>Powiadomienia push są wysyłane przez „usługi push” Apple i Google do urządzenia użytkownika, dzięki czemu nieaktywna aplikacja Delta Chat może pobierać wiadomości w tle i w razie potrzeby wyświetlać powiadomienia na telefonie użytkownika.</p>
<p>Powiadomienia push działają na wszystkich włączonych serwerach <a href="https://delta.chat/chatmail">chatmail</a></p>
@@ -447,7 +447,7 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</li>
</ul>
<p>Od maja 2024 r. klasyczne serwery poczty e-mail nie obsługują powiadomień push dla użytkowników ArcaneChat.</p>
<p>Od maja 2024 r. klasyczne serwery poczty e-mail nie obsługują powiadomień push dla użytkowników Delta Chat.</p>
<h3 id="czy-powiadomienia-push-są-włączone-na-urządzeniach-z-ios-czy-istnieje-alternatywa">
@@ -457,8 +457,8 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Tak, ArcaneChat automatycznie korzysta z powiadomień push dla profili <a href="https://delta.chat/chatmail">chatmail</a>
. I nie, w telefonach Apple nie ma alternatywy umożliwiającej natychmiastowe dostarczanie wiadomości, ponieważ urządzenia Apple nie pozwalają ArcaneChat na pobieranie danych w tle. Powiadomienia push są automatycznie aktywowane dla użytkowników iOS, ponieważ <a href="#privacy-notifications">system prywatności powiadomień ArcaneChat</a> nie udostępnia Apple danych, których jeszcze nie posiada.</p>
<p>Tak, Delta Chat automatycznie korzysta z powiadomień push dla profili <a href="https://delta.chat/chatmail">chatmail</a>
. I nie, w telefonach Apple nie ma alternatywy umożliwiającej natychmiastowe dostarczanie wiadomości, ponieważ urządzenia Apple nie pozwalają Delta Chat na pobieranie danych w tle. Powiadomienia push są automatycznie aktywowane dla użytkowników iOS, ponieważ <a href="#privacy-notifications">system prywatności powiadomień Delta Chat</a> nie udostępnia Apple danych, których jeszcze nie posiada.</p>
<h3 id="android-push">
@@ -468,12 +468,12 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Jeśli dostępna jest „Usługa Push”, ArcaneChat włącza Powiadomienia Push w celu zapewnienia natychmiastowego dostarczania wiadomości dla wszystkich użytkowników chatmail. Jeśli zamiast serwerów <a href="https://delta.chat/chatmail">chatmail</a> korzystasz z klasycznego dostawcy poczty e-mail, powiadomienia push nie są dostępne.</p>
<p>Jeśli dostępna jest „Usługa Push”, Delta Chat włącza Powiadomienia Push w celu zapewnienia natychmiastowego dostarczania wiadomości dla wszystkich użytkowników chatmail. Jeśli zamiast serwerów <a href="https://delta.chat/chatmail">chatmail</a> korzystasz z klasycznego dostawcy poczty e-mail, powiadomienia push nie są dostępne.</p>
<p>W ustawieniach „Powiadomień” ArcaneChat dla „Natychmiastowej dostawy” możesz zmienić następujące ustawienia wpływające na wszystkie profile czatu:</p>
<p>W ustawieniach „Powiadomień” Delta Chat dla „Natychmiastowej dostawy” możesz zmienić następujące ustawienia wpływające na wszystkie profile czatu:</p>
<ul>
<li>Użyj połączenia w tle: Jeśli nie korzystasz z usługi Push, możesz wyłączyć „optymalizację baterii” dla ArcaneChat, umożliwiając mu pobieranie wiadomości w tle. Mogą jednak wystąpić opóźnienia od minut do godzin. Niektórzy dostawcy Androida nawet całkowicie ograniczają aplikacje (zobacz <a href="https://dontkillmyapp.com">dontkillmyapp.com</a>), a ArcaneChat może nie wyświetlać wiadomości przychodzących, dopóki ręcznie ponownie nie otworzysz aplikacji.</li>
<li>Użyj połączenia w tle: Jeśli nie korzystasz z usługi Push, możesz wyłączyć „optymalizację baterii” dla Delta Chat, umożliwiając mu pobieranie wiadomości w tle. Mogą jednak wystąpić opóźnienia od minut do godzin. Niektórzy dostawcy Androida nawet całkowicie ograniczają aplikacje (zobacz <a href="https://dontkillmyapp.com">dontkillmyapp.com</a>), a Delta Chat może nie wyświetlać wiadomości przychodzących, dopóki ręcznie ponownie nie otworzysz aplikacji.</li>
</ul>
<p>Wymuś połączenie w tle: Jest to opcja awaryjna, jeśli poprzednie opcje nie są dostępne lub nie zapewniają „natychmiastowej dostawy”. Włączenie tej opcji powoduje stałe powiadomienie na twoim telefonie, które czasami może zostać „minifikowane” w przypadku najnowszych telefonów z Androidem.</p>
@@ -483,47 +483,47 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<h3 id="privacy-notifications">
Jak prywatne są powiadomienia push na ArcaneChat? <a href="#privacy-notifications" class="anchor"></a>
Jak prywatne są powiadomienia push na Delta Chat? <a href="#privacy-notifications" class="anchor"></a>
</h3>
<p>Obsługa powiadomień push w ArcaneChat pozwala uniknąć wycieku prywatnych informacji. Nie powoduje wycieku wiadomości e-mail, adresu IP ani zawartości wiadomości (nawet niezaszyfrowanej) do żadnego systemu zaangażowanego w dostarczanie powiadomień push.</p>
<p>Obsługa powiadomień push w Delta Chat pozwala uniknąć wycieku prywatnych informacji. Nie powoduje wycieku wiadomości e-mail, adresu IP ani zawartości wiadomości (nawet niezaszyfrowanej) do żadnego systemu zaangażowanego w dostarczanie powiadomień push.</p>
<p>Oto jak aplikacje ArcaneChat realizują dostarczanie powiadomień push:</p>
<p>Oto jak aplikacje Delta Chat realizują dostarczanie powiadomień push:</p>
<ul>
<li>
<p>Aplikacja ArcaneChat uzyskuje lokalnie „token urządzenia” i przechowuje go na serwerze <a href="https://delta.chat/chatmail">chatmail</a>.</p>
<p>Aplikacja Delta Chat uzyskuje lokalnie „token urządzenia”, szyfruje i przechowuje go na serwerze <a href="https://delta.chat/chatmail">chatmail</a>.</p>
</li>
<li>
<p>Kiedy serwer <a href="https://delta.chat/chatmail">chatmail</a> odbierze wiadomość e-mail od użytkownika ArcaneChat, przekazuje token urządzenia do centralnego serwera proxy powiadomień ArcaneChat.</p>
<p>Kiedy serwer <a href="https://delta.chat/chatmail">chatmail</a> odbierze wiadomość e-mail od użytkownika Delta Chat, przekazuje zaszyfrowany token urządzenia do centralnego serwera proxy powiadomień Delta Chat.</p>
</li>
<li>
<p>Centralny serwer proxy powiadomień ArcaneChat przekazuje token urządzenia do odpowiedniej usługi Push (Apple, Google itp.), nie znając nawet adresu IP ani adresu e-mail użytkowników ArcaneChat.</p>
<p>Centralny serwer proxy powiadomień Delta Chat deszyfruje token urządzenia i przekazuje go do odpowiedniej usługi Push (Apple, Google itp.), nie znając nawet adresu IP ani adresu e-mail użytkowników Delta Chat.</p>
</li>
<li>
<p>Centralna usługa Push (Apple, Google itp.) budzi aplikację ArcaneChat na twoim urządzeniu, aby sprawdzić w tle nowe wiadomości. Nie zna chatmaila ani adresu e-mail urządzenia, na którym się budzi. Centralne usługi push Apple/Google nigdy nie widzą adresu e-mail (nadawcy ani odbiorcy), a także nigdy nie widzą treści wiadomości (również w formie zaszyfrowanej).</p>
<p>Centralna usługa Push (Apple, Google itp.) budzi aplikację Delta Chat na twoim urządzeniu, aby sprawdzić w tle nowe wiadomości. Nie zna chatmaila ani adresu e-mail urządzenia, na którym się budzi. Centralne usługi push Apple/Google nigdy nie widzą adresu e-mail (nadawcy ani odbiorcy), a także nigdy nie widzą treści wiadomości (również w formie zaszyfrowanej).</p>
</li>
</ul>
<p>Od maja 2024 r. serwery chatmail znają „tokeny urządzenia”, ale planujemy szyfrować te informacje na serwerze proxy powiadomień, tak aby serwer chatmail nigdy nie poznał tokena urządzenia.</p>
<p>Centralny serwer proxy powiadomień Delta Chat <a href="https://github.com/deltachat/notifiers">jest mały i w pełni zaimplementowany w Rust</a> i zapomina o tokenach urządzeń zaraz po ich przetworzeniu przez Apple/Google/itp, zwykle w ciągu kilku milisekund.</p>
<p>Centralny serwer proxy powiadomień ArcaneChat <a href="https://github.com/deltachat/notifiers">jest mały i w pełni zaimplementowany w Rust</a> i zapomina o tokenach urządzeń zaraz po ich przetworzeniu przez Apple/Google/itp, zwykle w ciągu kilku milisekund.</p>
<p>Pamiętaj, że token urządzenia jest szyfrowany między aplikacjami a serwerem proxy powiadomień, ale nie jest podpisany. Serwer proxy powiadomień nigdy nie widzi adresów e-mail, adresów IP ani żadnych kryptograficznych informacji identyfikujących powiązanych z urządzeniem użytkownika (tokenem).</p>
<p>W wyniku tego ogólnego projektu ochrony prywatności nawet przejęcie serwera chatmail lub pełne przejęcie centralnego serwera proxy powiadomień ArcaneChat nie spowodowałoby ujawnienia prywatnych informacji, których usługi Push jeszcze nie posiadają.</p>
<p>W wyniku tego ogólnego projektu ochrony prywatności nawet przejęcie serwera chatmail lub pełne przejęcie centralnego serwera proxy powiadomień Delta Chat nie spowodowałoby ujawnienia prywatnych informacji, których usługi Push jeszcze nie posiadają.</p>
<h3 id="dlaczego-delta-chat-integruje-się-ze-scentralizowanymi-zastrzeżonymi-usługami-push-applegoogle">
Dlaczego ArcaneChat integruje się ze scentralizowanymi, zastrzeżonymi usługami push Apple/Google? <a href="#dlaczego-delta-chat-integruje-się-ze-scentralizowanymi-zastrzeżonymi-usługami-push-applegoogle" class="anchor"></a>
Dlaczego Delta Chat integruje się ze scentralizowanymi, zastrzeżonymi usługami push Apple/Google? <a href="#dlaczego-delta-chat-integruje-się-ze-scentralizowanymi-zastrzeżonymi-usługami-push-applegoogle" class="anchor"></a>
</h3>
<p>ArcaneChat to darmowy i otwartoźródłowy zdecentralizowany komunikator z możliwością wyboru serwera, ale chcemy, aby użytkownicy mogli niezawodnie doświadczać „natychmiastowego dostarczania” wiadomości, tak jak w przypadku aplikacji Whatsapp, Signal lub Telegram, bez zadawania z góry pytań, które są bardziej odpowiednie dla doświadczonych użytkowników lub programistów.</p>
<p>Delta Chat to darmowy i otwartoźródłowy zdecentralizowany komunikator z możliwością wyboru serwera, ale chcemy, aby użytkownicy mogli niezawodnie doświadczać „natychmiastowego dostarczania” wiadomości, tak jak w przypadku aplikacji Whatsapp, Signal lub Telegram, bez zadawania z góry pytań, które są bardziej odpowiednie dla doświadczonych użytkowników lub programistów.</p>
<p>Pamiętaj, że ArcaneChat 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>
<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">
@@ -578,11 +578,11 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<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 ArcaneChat.</p>
<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>
</li>
</ul>
<p>Pozwól swojemu partnerowi czatu zeskanować obraz QR za pomocą aplikacji ArcaneChat lub dotknij „Kopiuj” lub „Udostępnij”, aby utworzyć link zaproszenia i udostępnić go swojemu partnerowi czatu.</p>
<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>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>
@@ -625,27 +625,27 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<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 ArcaneChat na drugim urządzeniu (telefonie lub laptopie)</strong></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ą ArcaneChat, 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>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ł ArcaneChat, używając swojego starego loginu do konta</strong></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 ArcaneChat.</strong></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 ArcaneChat, gwarantowane szyfrowanie end-to-end zostanie automatycznie przywrócone.</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 ArcaneChat</strong></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ął ArcaneChat 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>
<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,9 +667,9 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<p>Tak, ArcaneChat 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 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>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 ArcaneChat nigdy nie używał. ArcaneChat 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="https://delta.chat/assets/blog/2019-first-security-review.pdf">audytowi bezpieczeństwa w 2019 roku</a>.</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>
<p>Naszym celem, wraz z innymi wdrażającymi OpenPGP, jest dalsza poprawa parametrów bezpieczeństwa poprzez wdrożenie <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-crypto-refresh/">nowego IETF OpenPGP Crypto-Refresh</a>, który na szczęście został przyjęty latem 2023 roku.</p>
@@ -683,19 +683,19 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<p>Tak, podążamy za rozwiązaniami takimi jak <a href="https://en.wikipedia.org/wiki/Messaging_Layer_Security">MLS</a> lub <a href="https://saltpack.org/">Saltpack</a>, ale przyjęcie ich oznaczałoby zerwanie kompleksowej interoperacyjności szyfrowania ze wszystkimi innymi aplikacjami e-mail, które zazwyczaj obsługują szyfrowanie OpenPGP. Nie byłaby to więc łatwa decyzja i użytkownicy muszą wprowadzić wymierne ulepszenia.</p>
<p>ArcaneChat przyjmuje holistyczne podejście do „użytecznego bezpieczeństwa” i współpracuje z szeroką gamą grup aktywistów, a także renomowanymi badaczami, takimi jak <a href="https://teamusec.de">TeamUSEC</a>, aby poprawić rzeczywiste wyniki użytkowników przed zagrożeniami bezpieczeństwa. Protokół przewodowy i standard ustanawiania szyfrowania end-to-end to tylko jedna część „wyników użytkownika”. Zobacz także nasze odpowiedzi na pytania dotyczące <a href="#device-seizure">przejęcia urządzenia</a> i <a href="#message-metadata">metadanych wiadomości</a>.</p>
<p>Delta Chat przyjmuje holistyczne podejście do „użytecznego bezpieczeństwa” i współpracuje z szeroką gamą grup aktywistów, a także renomowanymi badaczami, takimi jak <a href="https://teamusec.de">TeamUSEC</a>, aby poprawić rzeczywiste wyniki użytkowników przed zagrożeniami bezpieczeństwa. Protokół przewodowy i standard ustanawiania szyfrowania end-to-end to tylko jedna część „wyników użytkownika”. Zobacz także nasze odpowiedzi na pytania dotyczące <a href="#device-seizure">przejęcia urządzenia</a> i <a href="#message-metadata">metadanych wiadomości</a>.</p>
<h3 id="czy-delta-chat-jest-podatny-na-efail">
Czy ArcaneChat jest podatny na EFAIL? <a href="#czy-delta-chat-jest-podatny-na-efail" class="anchor"></a>
Czy Delta Chat jest podatny na EFAIL? <a href="#czy-delta-chat-jest-podatny-na-efail" class="anchor"></a>
</h3>
<p>Nie, <a href="https://delta.chat/en/2018-05-15-delta-chat-not-vulnerable-to-efail">ArcaneChat nigdy nie był podatny na atak EFAIL</a>, ponieważ jego implementacja OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a> używa kodu wykrywania modyfikacji podczas szyfrowania wiadomości i zwraca <a href="https://docs.rs/pgp/latest/pgp/errors/enum.Error.html#variant.MdcError">błąd</a>, jeśli kod wykrywania modyfikacji jest nieprawidłowy.</p>
<p>Nie, <a href="https://delta.chat/en/2018-05-15-delta-chat-not-vulnerable-to-efail">Delta Chat nigdy nie był podatny na atak EFAIL</a>, ponieważ jego implementacja OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a> używa kodu wykrywania modyfikacji podczas szyfrowania wiadomości i zwraca <a href="https://docs.rs/pgp/latest/pgp/errors/enum.Error.html#variant.MdcError">błąd</a>, jeśli kod wykrywania modyfikacji jest nieprawidłowy.</p>
<p>ArcaneChat również nigdy nie był podatny na atak EFAIL „Direct Exfiltration”, ponieważ odszyfrowuje jedynie wiadomości <code class="language-plaintext highlighter-rouge">multipart/encrypted</code>, które zawierają dokładnie jedną zaszyfrowaną i podpisaną część, zgodnie ze specyfikacją Autocrypt Level 1.</p>
<p>Delta Chat również nigdy nie był podatny na atak EFAIL „Direct Exfiltration”, ponieważ odszyfrowuje jedynie wiadomości <code class="language-plaintext highlighter-rouge">multipart/encrypted</code>, które zawierają dokładnie jedną zaszyfrowaną i podpisaną część, zgodnie ze specyfikacją Autocrypt Level 1.</p>
<h3 id="tls">
@@ -707,19 +707,19 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<p>Nawet jeśli nie ma gwarancji, że twoje wiadomości będą zaszyfrowane metodą end-to-end, nadal są 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>ArcaneChat 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 ArcaneChat 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 ArcaneChat 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>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">
W jaki sposób ArcaneChat chroni metadane w wiadomościach? <a href="#message-metadata" class="anchor"></a>
W jaki sposób Delta Chat chroni metadane w wiadomościach? <a href="#message-metadata" class="anchor"></a>
</h3>
<p>ArcaneChat chroni większość metadanych wiadomości, umieszczając następujące informacje w całkowicie zaszyfrowanej części wiadomości:</p>
<p>Delta Chat chroni większość metadanych wiadomości, umieszczając następujące informacje w całkowicie zaszyfrowanej części wiadomości:</p>
<ul>
<li>Wiersz tematu</li>
@@ -742,7 +742,7 @@ 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> ArcaneChat w celu tworzenia pseudonimowych kont tymczasowych poprzez skanowanie kodów QR. Pamiętaj, że aplikacje ArcaneChat 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 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>
<h3 id="jak-mogę-sprawdzić-informacje-o-szyfrowaniu">
@@ -752,7 +752,7 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</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). ArcaneChat 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>
<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">
@@ -772,17 +772,17 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
</h3>
<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 ArcaneChat 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>
<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 ArcaneChat, 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>
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 ArcaneChat, 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>
<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">
@@ -801,33 +801,33 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
<h3 id="pfs">
Czy ArcaneChat obsługuje funkcję Perfect Forward Secrecy? <a href="#pfs" class="anchor"></a>
Czy Delta Chat obsługuje funkcję Perfect Forward Secrecy? <a href="#pfs" class="anchor"></a>
</h3>
<p>Nie, ArcaneChat nie obsługuje funkcji Perfect Forward Secrecy (PFS). Oznacza to, że jeśli twój prywatny klucz deszyfrujący ArcaneChat 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, 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>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>Możliwe, że ArcaneChat 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>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>
<h3 id="czy-szyfrowanie-end-to-end-delta-chat-jest-tak-samo-bezpieczne-jak-signal">
Czy szyfrowanie end-to-end ArcaneChat 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 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>
</h3>
<p>To zależy od tego, co jest dla ciebie ważne. ArcaneChat <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>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>W każdym razie szyfrowanie end-to-end ArcaneChat 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>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>
<h3 id="czy-mogę-ponownie-wykorzystać-mój-istniejący-klucz-prywatny">
<h3 id="importkey">
Czy mogę ponownie wykorzystać mój istniejący klucz prywatny? <a href="#czy-mogę-ponownie-wykorzystać-mój-istniejący-klucz-prywatny" class="anchor"></a>
Czy mogę ponownie wykorzystać mój istniejący klucz prywatny? <a href="#importkey" class="anchor"></a>
</h3>
@@ -838,22 +838,22 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<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>Jeśli nie masz klucza lub nawet nie wiesz, że go potrzebujesz nie przejmuj się: ArcaneChat generuje go w razie potrzeby, nie trzeba naciskać przycisku, aby to zrobić.</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 ArcaneChat. <a href="#nie-mogę-zaimportować-istniejącego-klucza-pgp-do-delta-chat" class="anchor"></a>
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 ArcaneChat. Usuń szyfrowanie i hasło i spróbować ponownie zaimportować klucz.</p>
<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, ArcaneChat 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 ArcaneChat (w rzeczywistości, znaczna większość użytkowników ArcaneChat 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>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ć
@@ -863,28 +863,39 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<h3 id="security-audits">
Czy ArcaneChat był niezależnie kontrolowany pod kątem luk w zabezpieczeniach? <a href="#security-audits" class="anchor"></a>
Czy Delta Chat był niezależnie kontrolowany pod kątem luk w zabezpieczeniach? <a href="#security-audits" class="anchor"></a>
</h3>
<p>Projekt ArcaneChat przeszedł cztery niezależne audyty bezpieczeństwa i jedną niezależną analizę bezpieczeństwa, od najnowszego do najstarszego:</p>
<p>Tak, wielokrotnie.
Projekt Delta Chat stale przechodzi niezależne audyty bezpieczeństwa i analizy,
od najnowszych do najstarszych:</p>
<p>W grudniu 2024 r. <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">NLNET</a> wykonała ocenę rPGP zleconą przez <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a>. rPGP służy jako kompleksowy silnik szyfrowania <a href="https://openpgp.org">OpenPGP</a> w Delta Chat. Wydano dwa ostrzeżenia związane z wynikami tego audytu:</p>
<ul>
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv">„Paniki przy nieprawidłowym wprowadzaniu niezaufanych danych wejściowych”</a> CVE-2024-53856</li>
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285">„Potencjalne wyczerpanie zasobów podczas obsługi niezaufanych wiadomości”</a> CVE-2024-53857</li>
</ul>
<p>Problemy opisane w tych ostrzeżeniach zostały naprawione i są częścią wydań Delta Chat we wszystkich sklepach z aplikacjami od grudnia 2024 r.</p>
<ul>
<li>
<p>W marcu 2024 r. otrzymaliśmy dogłębną analizę bezpieczeństwa od grupy badawczej ds. kryptografii stosowanej w ETH Zuerich i zajęliśmy się wszystkimi poruszonymi kwestiami. Więcej szczegółowych informacji można znaleźć na naszym blogu na temat <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">szyfrowania typu End-to-End z gwarancją Hardening</a> oraz opublikowanym później artykule badawczym <a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of ArcaneChat</a>.</p>
<p>W marcu 2024 r. otrzymaliśmy dogłębną analizę bezpieczeństwa od grupy badawczej ds. kryptografii stosowanej w ETH Zuerich i zajęliśmy się wszystkimi poruszonymi kwestiami. Więcej szczegółowych informacji można znaleźć na naszym blogu na temat <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">szyfrowania typu End-to-End z gwarancją Hardening</a> oraz opublikowanym później artykule badawczym <a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>.</p>
</li>
<li>
<p>W kwietniu 2023 r. naprawiliśmy problemy z bezpieczeństwem i prywatnością w funkcji „aplikacje internetowe udostępniane na czacie”, związane z awariami piaskownicy, szczególnie w przypadku Chromium. Następnie przeprowadziliśmy niezależny audyt bezpieczeństwa od Cure53 i wszystkie wykryte problemy zostały naprawione w aplikacji z serii 1.36 wydanej w kwietniu 2023 r. <a href="https://delta.chat/en/2023-05-22-webxdc-security">Pełną historię bezpieczeństwa end-to-end w sieci można znaleźć tutaj</a>.</p>
</li>
<li>
<p>W marcu 2023 r. firma <a href="https://cure53.de">Cure53</a> przeanalizowała zarówno szyfrowanie transportu połączeń sieciowych ArcaneChat, jak i powtarzalną konfigurację serwera pocztowego zgodnie z <a href="https://delta.chat/pl/serverguide">zaleceniami na tej stronie</a>. Możesz przeczytać więcej o audycie <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">na naszym blogu</a> lub przeczytać pełny raport <a href="https://delta.chat/assets/blog/MER-01-report.pdf">tutaj</a>.</p>
<p>W marcu 2023 r. firma <a href="https://cure53.de">Cure53</a> przeanalizowała zarówno szyfrowanie transportu połączeń sieciowych Delta Chat, jak i powtarzalną konfigurację serwera pocztowego zgodnie z <a href="https://delta.chat/pl/serverguide">zaleceniami na tej stronie</a>. Możesz przeczytać więcej o audycie <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">na naszym blogu</a> lub przeczytać pełny raport <a href="https://delta.chat/assets/blog/MER-01-report.pdf">tutaj</a>.</p>
</li>
<li>
<p>W 2020 r. firma <a href="https://includesecurity.com">Include Security</a> przeanalizowała biblioteki Rust <a href="https://github.com/deltachat/deltachat-core-rust/">core</a>, <a href="https://github.com/async-email/async-imap">IMAP</a>, <a href="https://github.com/async-email/async-smtp">SMTP</a> i <a href="https://github.com/async-email/async-native-tls">TLS</a> ArcaneChat. Nie znalazła żadnych problemów krytycznych ani poważnych. W raporcie zwrócono uwagę na kilka słabych punktów o średniej wadze same w sobie nie stanowią zagrożenia dla użytkowników ArcaneChat, ponieważ zależą od środowiska, w którym używany jest ArcaneChat. Ze względu na użyteczność i kompatybilność nie możemy złagodzić wszystkich z nich i zdecydowaliśmy się przedstawić zalecenia dotyczące bezpieczeństwa zagrożonym użytkownikom. Pełny raport można przeczytać <a href="https://delta.chat/assets/blog/2020-second-security-review.pdf">tutaj</a>.</p>
<p>W 2020 r. firma <a href="https://includesecurity.com">Include Security</a> przeanalizowała biblioteki Rust <a href="https://github.com/deltachat/deltachat-core-rust/">core</a>, <a href="https://github.com/async-email/async-imap">IMAP</a>, <a href="https://github.com/async-email/async-smtp">SMTP</a> i <a href="https://github.com/async-email/async-native-tls">TLS</a> Delta Chat. Nie znalazła żadnych problemów krytycznych ani poważnych. W raporcie zwrócono uwagę na kilka słabych punktów o średniej wadze same w sobie nie stanowią zagrożenia dla użytkowników Delta Chat, ponieważ zależą od środowiska, w którym używany jest Delta Chat. Ze względu na użyteczność i kompatybilność nie możemy złagodzić wszystkich z nich i zdecydowaliśmy się przedstawić zalecenia dotyczące bezpieczeństwa zagrożonym użytkownikom. Pełny raport można przeczytać <a href="https://delta.chat/assets/blog/2020-second-security-review.pdf">tutaj</a>.</p>
</li>
<li>
<p>W 2019 r. firma <a href="https://includesecurity.com">Include Security</a> przeanalizowała biblioteki <a href="https://github.com/rpgp/rpgp">PGP</a> i <a href="https://github.com/RustCrypto/RSA">RSA</a> ArcaneChat. Nie znaleziono żadnych krytycznych problemów, ale dwa poważne problemy, które później naprawiliśmy. Ujawniła również jeden problem o średniej wadze i kilka mniej poważnych, ale nie było możliwości wykorzystania tych luk w implementacji ArcaneChat. Niektóre z nich jednak naprawiliśmy od czasu zakończenia kontroli. Pełny raport można przeczytać <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">tutaj</a>.</p>
<p>W 2019 r. firma <a href="https://includesecurity.com">Include Security</a> przeanalizowała biblioteki <a href="https://github.com/rpgp/rpgp">PGP</a> i <a href="https://github.com/RustCrypto/RSA">RSA</a> Delta Chat. Nie znaleziono żadnych krytycznych problemów, ale dwa poważne problemy, które później naprawiliśmy. Ujawniła również jeden problem o średniej wadze i kilka mniej poważnych, ale nie było możliwości wykorzystania tych luk w implementacji Delta Chat. Niektóre z nich jednak naprawiliśmy od czasu zakończenia kontroli. Pełny raport można przeczytać <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">tutaj</a>.</p>
</li>
</ul>
@@ -899,12 +910,12 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<h3 id="czy-mogę-korzystać-z-delta-chat-na-wielu-urządzeniach-w-tym-samym-czasie">
Czy mogę korzystać z ArcaneChat na wielu urządzeniach w tym samym czasie? <a href="#czy-mogę-korzystać-z-delta-chat-na-wielu-urządzeniach-w-tym-samym-czasie" class="anchor"></a>
Czy mogę korzystać z Delta Chat na wielu urządzeniach w tym samym czasie? <a href="#czy-mogę-korzystać-z-delta-chat-na-wielu-urządzeniach-w-tym-samym-czasie" class="anchor"></a>
</h3>
<p>Tak. ArcaneChat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
<p>Tak. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
<ul>
<li>
@@ -914,10 +925,10 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<p>Na pierwszym urządzeniu przejdź do <strong>Ustawienia → Dodaj kolejne urządzenie</strong>, w razie potrzeby odblokuj ekran i poczekaj chwilę, aż pojawi się kod QR</p>
</li>
<li>
<p>Na drugim urządzeniu <a href="https://get.delta.chat">zainstaluj ArcaneChat</a></p>
<p>Na drugim urządzeniu <a href="https://get.delta.chat">zainstaluj Delta Chat</a></p>
</li>
<li>
<p>Na drugim urządzeniu uruchom ArcaneChat, wybierz <strong>Dodaj jako kolejne urządzenie</strong> i zeskanuj kod QR z pierwszego urządzenia</p>
<p>Na drugim urządzeniu uruchom Delta Chat, wybierz <strong>Dodaj jako kolejne urządzenie</strong> i zeskanuj kod QR z pierwszego urządzenia</p>
</li>
</ul>
@@ -941,9 +952,15 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<p>Na <strong>Windowsie</strong>, przejdź do <strong>Panel sterowania / Sieć i internet</strong> i upewnij się, że <strong>Sieć prywatna</strong> jest wybrana jako “Typ profilu sieci”
(po przeniesieniu możesz wrócić do pierwotnej wartości)</p>
</li>
<li>
<p>W systemie <strong>iOS</strong> upewnij się, że jest przydzielony dostęp do opcji „Ustawienia » Aplikacje » Delta Chat » <strong>Sieć lokalna</strong></p>
</li>
<li>
<p>W systemie <strong>macOS</strong> włącz „Preferencje systemowe » Ochrona i prywatność » <strong>Sieć lokalna</strong> » Delta Chat”</p>
</li>
<li>
<p>Twój system może mieć „zaporę ogniową”, o której wiadomo, że powoduje problemy (szczególnie w systemie Windows).
<strong>Wyłącz zaporę</strong> dla ArcaneChat po obu stronach i spróbuj ponownie</p>
<strong>Wyłącz zaporę</strong> dla Delta Chat po obu stronach i spróbuj ponownie</p>
</li>
<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>
@@ -952,10 +969,10 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<p>Upewnij się, że na urządzeniu docelowym jest <strong>wystarczająca ilość miejsca</strong></p>
</li>
<li>
<p>Jeśli przenoszenie się rozpoczęło, upewnij się, że urządzenia <strong>pozostają aktywne</strong> i nie zasypiają. Nie wychodź z ArcaneChat. (dokładamy wszelkich starań, aby aplikacja działała w tle, ale <a href="https://dontkillmyapp.com">systemy mają tendencję do ubijania aplikacji</a>, niestety)</p>
<p>Jeśli przenoszenie się rozpoczęło, upewnij się, że urządzenia <strong>pozostają aktywne</strong> i nie zasypiają. Nie wychodź z Delta Chat. (dokładamy wszelkich starań, aby aplikacja działała w tle, ale <a href="https://dontkillmyapp.com">systemy mają tendencję do ubijania aplikacji</a>, niestety)</p>
</li>
<li>
<p>ArcaneChat jest już zalogowany na urządzeniu docelowym? Możesz używać wielu kont na urządzeniu, po prostu <a href="#multiple-accounts">dodaj kolejne konto</a></p>
<p>Delta Chat jest już zalogowany na urządzeniu docelowym? Możesz używać wielu kont na urządzeniu, po prostu <a href="#multiple-accounts">dodaj kolejne konto</a></p>
</li>
<li>
<p>Jeśli nadal masz problemy lub <strong>nie możesz zeskanować kodu QR</strong>, wypróbuj <strong>ręczne przenoszenie</strong> opisane poniżej</p>
@@ -985,14 +1002,14 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<h3 id="czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat">
Czy są jakieś plany wprowadzenia klienta Web ArcaneChat? <a href="#czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat" class="anchor"></a>
Czy są jakieś plany wprowadzenia klienta Web Delta Chat? <a href="#czy-są-jakieś-plany-wprowadzenia-klienta-web-delta-chat" class="anchor"></a>
</h3>
<ul>
<li>Nie ma bezpośrednich planów, ale wstępne przemyślenia.</li>
<li>Istnieją 2-3 możliwości wprowadzenia klienta Web ArcaneChat, ale wszystkie wymagają znaczącej pracy. Na razie skupiamy się na udostępnianiu stabilnych wersji we wszystkich sklepach z aplikacjami (repozytoria Google Play/iOS/Windows/macOS/Linux) jako aplikacji natywnych.</li>
<li>Istnieją 2-3 możliwości wprowadzenia klienta Web Delta Chat, ale wszystkie wymagają znaczącej pracy. Na razie skupiamy się na udostępnianiu stabilnych wersji we wszystkich sklepach z aplikacjami (repozytoria Google Play/iOS/Windows/macOS/Linux) jako aplikacji natywnych.</li>
<li>Jeśli potrzebujesz klienta Web, ponieważ nie możesz instalować oprogramowania na komputerze, na którym pracujesz, możesz użyć przenośnego klienta Windows Desktop lub AppImage dla Linuxa. Możesz je znaleźć na <a href="https://get.delta.chat">get.delta.chat</a>.</li>
</ul>
@@ -1004,7 +1021,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
</h2>
<p>W ArcaneChat możesz udostępniać <a href="https://webxdc.org">aplikacje webxdc</a> i załączniki z rozszerzeniem pliku .xdc. Mogą robić bardzo różne rzeczy i uczynić ArcaneChat naprawdę rozszerzalnym komunikatorem.</p>
<p>W Delta Chat możesz udostępniać <a href="https://webxdc.org">aplikacje webxdc</a> i załączniki z rozszerzeniem pliku .xdc. Mogą robić bardzo różne rzeczy i uczynić Delta Chat naprawdę rozszerzalnym komunikatorem.</p>
<h3 id="jak-prywatne-są-aplikacje-webxdc">
@@ -1016,7 +1033,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<ul>
<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 ArcaneChat, a ich kopie znajdują się na urządzeniach twoich partnerów czatu. Poza tym jest całkowicie odizolowana od Internetu.</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>
</ul>
@@ -1031,8 +1048,9 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<ul>
<li>Ogólnie rzecz biorąc, każdy może udostępniać sobie aplikacje webxdc bez ograniczeń.</li>
<li>Od <a href="https://webxdc.org/apps/">webxdc.org/apps</a>.</li>
<li>Możesz <a href="https://delta.chat/en/2023-08-11-xstore">wysłać „hi” na adres xstore@testrun.org</a>, aby zobaczyć eksperymentalny sklep z aplikacjami webxdc. Wszystkie aplikacje są otwarto źródłowe i są bezpłatne.</li>
<li>Wiele osób pisze własne, aplikacje webxdc i publikuje je na <a href="https://support.delta.chat/c/webxdc/20">forum ArcaneChat</a>.</li>
<li>Wiele osób pisze własne, aplikacje webxdc i publikuje je na <a href="https://support.delta.chat/c/webxdc/20">forum Delta Chat</a>.</li>
</ul>
<h3 id="jak-mogę-tworzyć-własne-aplikacje-webxdc">
@@ -1047,7 +1065,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<li>Aplikacje webxdc to po prostu pliki ZIP zawierające kod html, css i javascript.</li>
<li>Aby rozpocząć, możesz rozszerzyć <a href="https://github.com/webxdc/hello">przykładową aplikację Hello World</a>.</li>
<li>Wszystko, co musisz wiedzieć, jest napisane w <a href="https://docs.webxdc.org/">dokumentacji</a>.</li>
<li>Jeśli masz pytania, możesz zadać je innym osobom z doświadczeniem na <a href="https://support.delta.chat/c/webxdc/20">forum ArcaneChat</a>.</li>
<li>Jeśli masz pytania, możesz zadać je innym osobom z doświadczeniem na <a href="https://support.delta.chat/c/webxdc/20">forum Delta Chat</a>.</li>
</ul>
<h2 id="funkcje-eksperymentalne">
@@ -1058,19 +1076,19 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
</h2>
<p>Jesteśmy bardzo wdzięczni za opinie na temat tych funkcji — chcesz podzielić się swoimi pomysłami? Dołącz do <a href="https://support.delta.chat">forum</a>, aby wnieść swój wkład. Możesz wygodnie zalogować się za pośrednictwem ArcaneChat i skanowaniu kodu QR, co jest kolejnym dość stabilnym eksperymentem, który przeprowadzamy na boku (sic!).</p>
<p>Jesteśmy bardzo wdzięczni za opinie na temat tych funkcji — chcesz podzielić się swoimi pomysłami? Dołącz do <a href="https://support.delta.chat">forum</a>, aby wnieść swój wkład. Możesz wygodnie zalogować się za pośrednictwem Delta Chat i skanowaniu kodu QR, co jest kolejnym dość stabilnym eksperymentem, który przeprowadzamy na boku (sic!).</p>
<h3 id="jak-mogę-korzystać-z-połączeń-audiowideo-z-delta-chat">
Jak mogę korzystać z połączeń audio/wideo z ArcaneChat? <a href="#jak-mogę-korzystać-z-połączeń-audiowideo-z-delta-chat" class="anchor"></a>
Jak mogę korzystać z połączeń audio/wideo z Delta Chat? <a href="#jak-mogę-korzystać-z-połączeń-audiowideo-z-delta-chat" class="anchor"></a>
</h3>
<ul>
<li>Aby włączyć połączenia audio/wideo, przejdź do sekcji „Funkcje eksperymentalne” w ustawieniach zaawansowanych i wybierz „Instancja czatu wideo”.</li>
<li>Kiedy zapraszasz innych do czatu wideo, jest on od razu otwierany w Twojej przeglądarce/aplikacji. Inne osoby otrzymują e-mail z linkiem do twojego czatu wideo. W ten sposób jest to kompatybilne również wtedy, gdy partnerzy czatu nie używają ArcaneChat.</li>
<li>Kiedy zapraszasz innych do czatu wideo, jest on od razu otwierany w Twojej przeglądarce/aplikacji. Inne osoby otrzymują e-mail z linkiem do twojego czatu wideo. W ten sposób jest to kompatybilne również wtedy, gdy partnerzy czatu nie używają Delta Chat.</li>
<li>Zwróć uwagę, że po drugiej stronie nie ma dzwonka, a Twoim rozmówcom nie zostanie przerwana praca przez zaproszenie do czatu wideo.</li>
<li>Możesz użyć dowolnej usługi czatu wideo, która pozwala na dołączenie przez link. Wystarczy dodać link w ustawieniach.</li>
<li>Na przykład, aby użyć flagowej instancji Jitsi Meet, możesz wpisać https://meet.jit.si/$ROOM. Zmienna $ROOM będzie wartością losową; w ten sposób będziesz miał nowy losowy pokój jitsi za każdym razem, gdy do kogoś zadzwonisz.</li>
@@ -1117,7 +1135,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
</h3>
<p>To jest ustawienie eksperymentalne dla niektórych osób, które eksperymentują z regułami po stronie serwera. Nie wszyscy dostawcy to obsługują, ale w przypadku niektórych możesz przenieść wszystkie wiadomości z nagłówkiem „Chat-Version” do folderu DeltaChat. Zwykle byłoby to zrobione przez aplikację ArcaneChat.</p>
<p>To jest ustawienie eksperymentalne dla niektórych osób, które eksperymentują z regułami po stronie serwera. Nie wszyscy dostawcy to obsługują, ale w przypadku niektórych możesz przenieść wszystkie wiadomości z nagłówkiem „Chat-Version” do folderu DeltaChat. Zwykle byłoby to zrobione przez aplikację Delta Chat.</p>
<p>Włączenie „Pobieraj tylko z folderu DeltaChat” ma sens, jeśli masz:</p>
@@ -1126,7 +1144,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<li>ustawioną opcję „Pokaż klasyczne e-maile” na „Nie, tylko czaty”.</li>
</ul>
<p>W tym przypadku ArcaneChat nie musi obserwować skrzynki odbiorczej, a wystarczy, że będzie obserwować tylko folder DeltaChat.</p>
<p>W tym przypadku Delta Chat nie musi obserwować skrzynki odbiorczej, a wystarczy, że będzie obserwować tylko folder DeltaChat.</p>
<h3 id="jak-mogę-zmienić-moje-konto-na-inny-adres-e-mail">
@@ -1148,7 +1166,7 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
</li>
</ol>
<p>Pamiętaj, że ArcaneChat nie będzie już pobierać wiadomości od twojego starego dostawcy poczty e-mail. Jeśli nie skonfigurowałeś swojego dostawcy poczty e-mail do przekazywania wiadomości (krok 2.), tylko te kontakty, do których wysłałeś wiadomość w gwarantowanym szyfrowaniem end-to-end czacie, wyślą wiadomości na twój nowy adres.</p>
<p>Pamiętaj, że Delta Chat nie będzie już pobierać wiadomości od twojego starego dostawcy poczty e-mail. Jeśli nie skonfigurowałeś swojego dostawcy poczty e-mail do przekazywania wiadomości (krok 2.), tylko te kontakty, do których wysłałeś wiadomość w gwarantowanym szyfrowaniem end-to-end czacie, wyślą wiadomości na twój nowy adres.</p>
<p>Aby dowiedzieć się więcej na ten temat, <a href="https://delta.chat/en/2022-09-14-aeap">przeczytaj nasz wpis na blogu na ten temat</a>.</p>
@@ -1163,14 +1181,14 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
<h3 id="jakich-uprawnień-potrzebuje-delta-chat">
Jakich uprawnień potrzebuje ArcaneChat? <a href="#jakich-uprawnień-potrzebuje-delta-chat" class="anchor"></a>
Jakich uprawnień potrzebuje Delta Chat? <a href="#jakich-uprawnień-potrzebuje-delta-chat" class="anchor"></a>
</h3>
<p>W zależności od używanego systemu operacyjnego możesz
zostać poproszony o przyznanie uprawnień aplikacji.
Oto, co robi ArcaneChat z tymi uprawnieniami:</p>
Oto, co robi Delta Chat z tymi uprawnieniami:</p>
<ul>
<li>Aparat <em>(można zablokować)</em></li>
@@ -1187,7 +1205,7 @@ Oto, co robi ArcaneChat z tymi uprawnieniami:</p>
<li>czytanie zawartość twojej karty SD: aby udostępniać pliki swoim kontaktom</li>
<li>Inne możliwości aplikacji</li>
<li>zmiana ustawienia dźwięku: możesz wybrać dzwonki i głośność dla powiadomień i wiadomości audio</li>
<li>uruchamianie przy starcie: więc nie musisz ręcznie uruchamiać ArcaneChat</li>
<li>uruchamianie przy starcie: więc nie musisz ręcznie uruchamiać Delta Chat</li>
<li>kontrola wibracji: do powiadomień</li>
<li>przeglądanie połączenia sieciowych: aby połączyć się z dostawcą poczty e-mail</li>
<li>zapobieganie uśpieniu telefonu: dzięki czemu możesz łatwiej skopiować kod zabezpieczający podczas komunikatu konfiguracyjnego Autocrypt</li>
@@ -1199,7 +1217,7 @@ Oto, co robi ArcaneChat z tymi uprawnieniami:</p>
<h3 id="czy-delta-chat-działa-z-moim-dostawcą-poczty-e-mail">
Czy ArcaneChat działa z <em>moim</em> dostawcą poczty e-mail? <a href="#czy-delta-chat-działa-z-moim-dostawcą-poczty-e-mail" class="anchor"></a>
Czy Delta Chat działa z <em>moim</em> dostawcą poczty e-mail? <a href="#czy-delta-chat-działa-z-moim-dostawcą-poczty-e-mail" class="anchor"></a>
</h3>
@@ -1212,7 +1230,7 @@ Jednak niektórzy dostawcy potrzebują specjalnych opcji, aby działać poprawni
<h3 id="chcę-zarządzać-własnym-serwerem-e-mail-dla-delta-chat-co-polecacie">
Chcę zarządzać własnym serwerem e-mail dla ArcaneChat. Co polecacie? <a href="#chcę-zarządzać-własnym-serwerem-e-mail-dla-delta-chat-co-polecacie" class="anchor"></a>
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>
</h3>
@@ -1225,38 +1243,38 @@ Jednak niektórzy dostawcy potrzebują specjalnych opcji, aby działać poprawni
<h3 id="dlaczego-muszę-wpisać-moje-hasło-e-mail-do-delta-chat-czy-to-jest-bezpieczne">
Dlaczego muszę wpisać moje hasło e-mail do ArcaneChat? Czy to jest bezpieczne? <a href="#dlaczego-muszę-wpisać-moje-hasło-e-mail-do-delta-chat-czy-to-jest-bezpieczne" class="anchor"></a>
Dlaczego muszę wpisać moje hasło e-mail do Delta Chat? Czy to jest bezpieczne? <a href="#dlaczego-muszę-wpisać-moje-hasło-e-mail-do-delta-chat-czy-to-jest-bezpieczne" class="anchor"></a>
</h3>
<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ż ArcaneChat 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/deltachat/deltachat-core-rust/blob/master/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">
Jakie wiadomości pojawiają się w ArcaneChat? <a href="#jakie-wiadomości-pojawiają-się-w-delta-chat" class="anchor"></a>
Jakie wiadomości pojawiają się w Delta Chat? <a href="#jakie-wiadomości-pojawiają-się-w-delta-chat" class="anchor"></a>
</h3>
<p>Domyślnie ArcaneChat pokazuje wszystkie e-maile.</p>
<p>Domyślnie Delta Chat pokazuje wszystkie e-maile.</p>
<p>Możesz to zmienić w „Ustawienia → Zaawansowane → Pokaż klasyczne e-maile”. Masz następujące opcje:</p>
<ul>
<li>„Nie, tylko czaty”: Wyświetlane są tylko wiadomości wysłane przez innych użytkowników ArcaneChat i odpowiedzi na Twoje wiadomości ArcaneChat. Ma to największy sens, jeśli używasz tego samego konta e-mail również do wysyłania zwykłych wiadomości e-mail. To jest ustawienie domyślne.</li>
<li>„Wszystkie”: ArcaneChat pokazuje wszystkie e-maile, które są wysyłane na Twój adres e-mail. Ma to sens, jeśli chcesz używać ArcaneChat do wszystkich swoich e-maili, więc żadna wiadomość nie zostanie utracona. To jest ustawienie domyślne.</li>
<li>„Dla zaakceptowanych kontaktów”: ArcaneChat pokazuje wszystkie e-maile od kontaktów, z którymi już prowadzisz czat, ale nowe czaty pojawiają się tylko dla wiadomości ArcaneChat. Pomaga to zdecydować indywidualnie dla każdego przypadku, czy chcesz prowadzić rozmowę w ArcaneChat, czy w „normalnej” aplikacji e-mail.</li>
<li>„Nie, tylko czaty”: Wyświetlane są tylko wiadomości wysłane przez innych użytkowników Delta Chat i odpowiedzi na Twoje wiadomości Delta Chat. Ma to największy sens, jeśli używasz tego samego konta e-mail również do wysyłania zwykłych wiadomości e-mail. To jest ustawienie domyślne.</li>
<li>„Wszystkie”: Delta Chat pokazuje wszystkie e-maile, które są wysyłane na Twój adres e-mail. Ma to sens, jeśli chcesz używać Delta Chat do wszystkich swoich e-maili, więc żadna wiadomość nie zostanie utracona. To jest ustawienie domyślne.</li>
<li>„Dla zaakceptowanych kontaktów”: Delta Chat pokazuje wszystkie e-maile od kontaktów, z którymi już prowadzisz czat, ale nowe czaty pojawiają się tylko dla wiadomości Delta Chat. Pomaga to zdecydować indywidualnie dla każdego przypadku, czy chcesz prowadzić rozmowę w Delta Chat, czy w „normalnej” aplikacji e-mail.</li>
</ul>
<h3 id="czy-delta-chat-obsługuje-wiadomości-e-mail-w-formacie-html">
Czy ArcaneChat obsługuje wiadomości e-mail w formacie HTML? <a href="#czy-delta-chat-obsługuje-wiadomości-e-mail-w-formacie-html" class="anchor"></a>
Czy Delta Chat obsługuje wiadomości e-mail w formacie HTML? <a href="#czy-delta-chat-obsługuje-wiadomości-e-mail-w-formacie-html" class="anchor"></a>
</h3>
@@ -1266,14 +1284,14 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
<h3 id="czy-w-delta-chat-mogę-ustawić-temat-wiadomości-e-mail">
Czy w ArcaneChat mogę ustawić temat wiadomości e-mail? <a href="#czy-w-delta-chat-mogę-ustawić-temat-wiadomości-e-mail" class="anchor"></a>
Czy w Delta Chat mogę ustawić temat wiadomości e-mail? <a href="#czy-w-delta-chat-mogę-ustawić-temat-wiadomości-e-mail" class="anchor"></a>
</h3>
<p>ArcaneChat automatycznie ustawia (i <a href="#message-metadata">szyfruje</a>!) klasyczny temat wiadomości e-mail na nazwę grupy lub nazwę nadawcy.</p>
<p>Delta Chat automatycznie ustawia (i <a href="#message-metadata">szyfruje</a>!) klasyczny temat wiadomości e-mail na nazwę grupy lub nazwę nadawcy.</p>
<p>Jeśli więc chcesz samodzielnie ustawić temat, na przykład w przypadku oficjalnego e-maila do kontaktu biznesowego, możesz utworzyć grupę składającą się tylko z ciebie i odbiorców. Ustaw tytuł czatu na żądany temat, a następnie wyślij swój e-mail jako pierwszą wiadomość. Jeśli odbiorcy nie korzystają z ArcaneChat, będzie to dla nich wyglądać jak zwykły, formalny e-mail. Jeśli ustawisz <a href="#signature">tekst podpisu</a>, otrzymasz dodatkowe punkty profesjonalizmu.</p>
<p>Jeśli więc chcesz samodzielnie ustawić temat, na przykład w przypadku oficjalnego e-maila do kontaktu biznesowego, możesz utworzyć grupę składającą się tylko z ciebie i odbiorców. Ustaw tytuł czatu na żądany temat, a następnie wyślij swój e-mail jako pierwszą wiadomość. Jeśli odbiorcy nie korzystają z Delta Chat, będzie to dla nich wyglądać jak zwykły, formalny e-mail. Jeśli ustawisz <a href="#signature">tekst podpisu</a>, otrzymasz dodatkowe punkty profesjonalizmu.</p>
<h3 id="do-czego-służy-ustawienie-wyślij-kopię-do-siebie">
@@ -1285,7 +1303,7 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
<p>Wysłanie kopii wiadomości do siebie zapewnia otrzymywanie własnych wiadomości na wszystkich urządzeniach. Jeśli masz wiele urządzeń i jej nie włączysz, zobaczysz tylko wiadomości od innych osób oraz wiadomości, które wysyłasz z bieżącego urządzenia.</p>
<p>Kopia jest wysyłana do skrzynki odbiorczej, a następnie przenoszona do folderu DeltaChat; nie jest umieszczana w folderze „Wysłane”. ArcaneChat nigdy nie przesyła niczego do folderu Wysłane, ponieważ oznaczałoby to dwukrotne przesłanie wiadomości (raz przez SMTP i raz przez IMAP do folderu Wysłane).</p>
<p>Kopia jest wysyłana do skrzynki odbiorczej, a następnie przenoszona do folderu DeltaChat; nie jest umieszczana w folderze „Wysłane”. Delta Chat nigdy nie przesyła niczego do folderu Wysłane, ponieważ oznaczałoby to dwukrotne przesłanie wiadomości (raz przez SMTP i raz przez IMAP do folderu Wysłane).</p>
<p>Domyślne ustawienie „Wyślij kopię do siebie” jest „włączone”.</p>
@@ -1297,9 +1315,9 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
</h3>
<p>Jedynym powodem, dla którego ktoś chce oglądać folder Wysłane, jest to, że używa innego programu pocztowego (takiego jak Thunderbird) razem z aplikacją ArcaneChat i chce, aby jego program pocztowy „uczestniczył” w rozmowach na czacie.</p>
<p>Jedynym powodem, dla którego ktoś chce oglądać folder Wysłane, jest to, że używa innego programu pocztowego (takiego jak Thunderbird) razem z aplikacją Delta Chat i chce, aby jego program pocztowy „uczestniczył” w rozmowach na czacie.</p>
<p>Jednak zalecamy używanie klienta ArcaneChat Desktop; możesz go pobrać z <a href="https://get.delta.chat">get.delta.chat</a>. Opcja oglądania folderu „Wysłane” może w przyszłości zniknąć. Została wprowadzona w czasie, gdy na żadnej platformie nie był dostępny klient ArcaneChat Desktop.</p>
<p>Jednak zalecamy używanie klienta Delta Chat Desktop; możesz go pobrać z <a href="https://get.delta.chat">get.delta.chat</a>. Opcja oglądania folderu „Wysłane” może w przyszłości zniknąć. Została wprowadzona w czasie, gdy na żadnej platformie nie był dostępny klient Delta Chat Desktop.</p>
<h3 id="dlaczego-mogę-nie-widzieć-folderu-deltachat">
@@ -1309,35 +1327,40 @@ jeśli chcesz sprawdzić, czy Twoje poświadczenia są przetwarzane w bezpieczny
</h3>
<p>Niektórzy używają ArcaneChat 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>
<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">
Czy ArcaneChat 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 Protonmail / Tutanota / Criptext? <a href="#czy-delta-chat-jest-kompatybilny-z-protonmail--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 ArcaneChat; nie oferują one odbierania poczty przez IMAP.</li>
<li>W każdym przypadku możesz użyć ArcaneChat 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 ArcaneChat.</li>
<li>ArcaneChat 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>
<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>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>
<h3 id="jak-mogę-usunąć-swoje-konto">
<h3 id="remove-account">
Jak mogę usunąć swoje konto? <a href="#jak-mogę-usunąć-swoje-konto" class="anchor"></a>
Jak mogę usunąć swoje konto? <a href="#remove-account" class="anchor"></a>
</h3>
<p>Gdy korzystasz z konta e-mail w ArcaneChat, sposób usunięcia konta zależy od dostawcy poczty e-mail.
Nie mamy żadnej kontroli nad twoim kontem e-mail, więc niestety nie możemy ci w tym pomóc.</p>
<p>Jeśli używasz domyślnego profilu czatu, możesz po prostu odinstalować aplikację. Spowoduje to automatyczne usunięcie wszystkich powiązanych danych konta na serwerze czatu. Aby uzyskać więcej informacji, zapoznaj się z <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org usuwanie kont</a> dla domyślnego serwera powitalnego lub odpowiednią stroną wybranego <a href="https://delta.chat/chatmail">serwera czatu innej firmy</a>.</p>
<p>Jeśli chcesz zachować konto, ale odinstalować ArcaneChat, zaleca się opuszczenie każdego czatu grupowego przed odinstalowaniem ArcaneChat.</p>
<p>Jeśli skonfigurowałeś swój profil czatu na wielu urządzeniach, musisz go usunąć ze wszystkich urządzeń.</p>
<p>Jeśli używasz więcej niż jednego konta, ale nie chcesz pozbywać się ich wszystkich, możesz je usunąć w menu przełączania kont (na Androidzie i iOS) lub w pasku bocznym, klikając prawym przyciskiem myszy (w kliencie komputerowym).</p>
<p>Konta u <a href="https://providers.delta.chat">klasycznych dostawców poczty e-mail</a> nie zostaną usunięte automatycznie; sposób usunięcia konta zależy od dostawcy poczty e-mail. Nie mamy żadnej kontroli nad kontami e-mail u tych dostawców, więc niestety nie możemy ci w tym pomóc.</p>
<p>Jeśli chcesz nadal używać klasycznego konta e-mail z innymi aplikacjami, ale odinstalować Delta Chat, zaleca się opuszczenie każdego czatu grupowego przed odinstalowaniem Delta Chat. W przeciwnym razie możesz otrzymywać nieodszyfrowywane wiadomości z tych czatów grupowych.</p>
<h3 id="interesują-mnie-szczegóły-techniczne-możesz-powiedzieć-mi-coś-więcej">
@@ -1348,21 +1371,49 @@ Nie mamy żadnej kontroli nad twoim kontem e-mail, więc niestety nie możemy ci
</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 ArcaneChat</a>.</li>
<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>
</ul>
<h3 id="gdzie-moi-znajomi-mogą-znaleźć-delta-chat">
Gdzie moi znajomi mogą znaleźć Delta Chat? <a href="#gdzie-moi-znajomi-mogą-znaleźć-delta-chat" class="anchor"></a>
</h3>
<p>Delta Chat jest dostępny na wszystkich głównych i niektórych mniejszych platformach:</p>
<ul>
<li>
<p>Oficjalna <strong>strona internetowa</strong> <a href="https://delta.chat/download">https://delta.chat/download</a> pokazuje wszystkie opcje szczegółowo</p>
</li>
<li>
<p>Jeśli nie jest dostępna, użyj <strong>kopii strony</strong> pod adresem <a href="https://deltachat.github.io/deltachat-pages">https://deltachat.github.io/deltachat-pages</a></p>
</li>
<li>
<p>Otwórz jeden z następujących <strong>sklepów z aplikacjami i wyszukaj „Delta Chat”</strong>: Google Play Store, F-Droid, Huawei App Gallery, Amazon App Store, iOS i macOS App Store, Microsoft Store</p>
</li>
<li>
<p>Sprawdź <strong>menedżera pakietów</strong> swoich dystrybucji Linuksa</p>
</li>
<li>
<p><strong>Aplikacje na Androida</strong> są również dostępne na <a href="https://github.com/deltachat/deltachat-android/releases">https://github.com/deltachat/deltachat-android/releases</a></p>
</li>
</ul>
<h3 id="w-jaki-sposób-finansowany-jest-rozwój-delta-chat">
W jaki sposób finansowany jest rozwój ArcaneChat? <a href="#w-jaki-sposób-finansowany-jest-rozwój-delta-chat" class="anchor"></a>
W jaki sposób finansowany jest rozwój Delta Chat? <a href="#w-jaki-sposób-finansowany-jest-rozwój-delta-chat" class="anchor"></a>
</h3>
<p>ArcaneChat nie otrzymuje żadnego kapitału wysokiego ryzyka, nie jest zadłużony i nie jest pod presją generowania ogromnych zysków lub sprzedawania reklamodawcom użytkowników i ich przyjaciół oraz rodziny (lub gorzej).
<p>Delta Chat nie otrzymuje żadnego kapitału wysokiego ryzyka, nie jest zadłużony i nie jest pod presją generowania ogromnych zysków lub sprzedawania reklamodawcom użytkowników i ich przyjaciół oraz rodziny (lub gorzej).
Raczej korzystamy z publicznych źródeł finansowania, jak dotąd pochodzących z UE i USA, aby wspomóc nasze wysiłki w inicjowaniu zdecentralizowanego i zróżnicowanego ekosystemu komunikatora, opartego na rozwoju społeczności Free i Open-Source.</p>
<p>Konkretnie, rozwój ArcaneChat był dotychczas finansowany z tych źródeł:</p>
<p>Konkretnie, rozwój Delta Chat był dotychczas finansowany z tych źródeł, uporządkowanych chronologicznie:</p>
<ul>
<li>
@@ -1380,25 +1431,27 @@ Druga dotacja w 2019/2020 (~300 000 4) pomogła nam wydać wersje Delta/iOS, prz
</li>
<li>
<p>Od końca 2021 do marca 2023 otrzymaliśmy dofinansowanie <em>Wolność Internetu</em> (~500 tys. $) z amerykańskiego Biura Demokracji, Praw Człowieka i Pracy (DRL).
Fundusze te wspierają nasze długofalowe cele, aby uczynić ArcaneChat bardziej użytecznym i kompatybilnym z szeroką gamą serwerów e-mail na całym świecie, a także bardziej odpornym i bezpiecznym w miejscach często dotkniętych cenzurą i wyłączeniami Internetu.</p>
Fundusze te wspierają nasze długofalowe cele, aby uczynić Delta Chat bardziej użytecznym i kompatybilnym z szeroką gamą serwerów e-mail na całym świecie, a także bardziej odpornym i bezpiecznym w miejscach często dotkniętych cenzurą i wyłączeniami Internetu.</p>
</li>
<li>
<p>Od 2023 roku zostaliśmy zaakceptowani w programie Next Generation Internet (NGI) Entrust dla naszych propozycji „Prywatnych zdecentralizowanych aplikacji”. Dokładna kwota do ustalenia (około 100 tys. EUR). Finansowanie to wspiera dalszy rozwój <a href="https://webxdc.org">„aplikacji udostępnianych na czacie” webxdc</a>.</p>
<p>W latach 2023-2024 pomyślnie ukończyliśmy finansowany przez OTF <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">projekt Secure Chatmail</a>, co pozwoliło nam wprowadzić gwarantowane szyfrowanie, stworzyć <a href="https://delta.chat/chatmail">sieć serwerów chatmail</a> i zapewnić „natychmiastowe wdrażanie” we wszystkich aplikacjach wydanych od kwietnia 2024 r.</p>
</li>
<li>
<p>W latach 2023 i 2024 zostaliśmy przyjęci do programu Next Generation Internet (NGI) za naszą pracę w <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>, wraz z partnerami współpracującymi pracującymi nad <a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>, <a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>, <a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> i <a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>. Wszystkie te projekty są częściowo ukończone lub zostaną ukończone na początku 2025 r.</p>
</li>
<li>
<p>Czasami otrzymujemy jednorazowe darowizny od osób prywatnych. Na przykład w 2021 roku pewna hojna osoba przekazała nam 4K EUR w formie przelewu bankowego tytułem “kontynuujcie dobry rozwój!”. 💜 Takie pieniądze przeznaczamy na finansowanie spotkań rozwojowych lub na doraźne wydatki, których nie da się łatwo przewidzieć lub zrefundować z publicznych dotacji. Otrzymywanie większej ilości darowizn pomaga nam również stać się bardziej niezależnymi i długoterminowo rentownymi jako społeczność współpracowników.</p>
</li>
<li>
<p>Wreszcie, ale zdecydowanie nie najmniej ważne, kilku ekspertów i entuzjastów pro-bono wniosło wkład i przyczyniło się do rozwoju Delta Chat bez otrzymywania pieniędzy lub tylko niewielkich kwot. Bez nich Delta Chat nie byłby tam, gdzie jest dzisiaj, nawet w pobliżu.</p>
</li>
</ul>
<ul>
<li>Wreszcie, ale zdecydowanie nie najmniej ważne, kilku ekspertów i entuzjastów pro-bono wniosło wkład i przyczyniło się do rozwoju ArcaneChat bez otrzymywania pieniędzy lub tylko niewielkich kwot. Bez nich ArcaneChat nie byłby tam, gdzie jest dzisiaj, nawet w pobliżu.</li>
</ul>
<p>Wspomniane powyżej finansowanie pieniężne jest w większości organizowane przez merlinux GmbH we Freiburgu (Niemcy) i jest dystrybuowane do kilkunastu podmiotów na całym świecie.</p>
<p>Zapoznaj się z <a href="https://delta.chat/pl/contribute">kanałami wpłat dla ArcaneChat</a>, aby uzyskać informacje o możliwościach wpłat zarówno pieniężnych, jak i innych.</p>
<p>Zapoznaj się z <a href="https://delta.chat/pl/contribute">kanałami wpłat dla Delta Chat</a>, aby uzyskać informacje o możliwościach wpłat zarówno pieniężnych, jak i innych.</p>
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
File diff suppressed because it is too large Load Diff
+233 -177
View File
@@ -1,14 +1,14 @@
<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
<li><a href="#що-таке-delta-chat">Що таке ArcaneChat?</a>
<html lang="uk"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
<li><a href="#що-таке-delta-chat">Що таке Delta Chat?</a>
<ul>
<li><a href="#як-мені-знайти-людей-для-спілкування">Як мені знайти людей для спілкування?</a></li>
<li><a href="#які-переваги-delta-chat-у-порівнянні-з-іншими-месенджерами">Які переваги ArcaneChat у порівнянні з іншими месенджерами?</a></li>
<li><a href="#які-переваги-delta-chat-у-порівнянні-з-іншими-месенджерами">Які переваги Delta Chat у порівнянні з іншими месенджерами?</a></li>
<li><a href="#що-робити-якщо-я-очікую-повідомлення-від-когось-кому-раніше-не-писав">Що робити, якщо я очікую повідомлення від когось, кому раніше не писав?</a></li>
<li><a href="#чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">Чи підтримує ArcaneChat вкладення у вигляді фото, відео тощо?</a></li>
<li><a href="#чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">Чи підтримує Delta Chat вкладення у вигляді фото, відео тощо?</a></li>
<li><a href="#multiple-accounts">Що таке профілі? Як я можу перемикатися між ними?</a></li>
<li><a href="#хто-бачить-моє-зображення-профілю">Хто бачить моє зображення профілю?</a></li>
<li><a href="#signature">Чи можу я встановити текст підпису/статусу/девізу у ArcaneChat?</a></li>
<li><a href="#signature">Чи можу я встановити текст підпису/статусу/девізу у Delta Chat?</a></li>
<li><a href="#що-значить-закріплення-приглушення-архівування">Що значить Закріплення, Приглушення, Архівування?</a></li>
<li><a href="#що-означає-зелена-точка">Що означає зелена точка?</a></li>
<li><a href="#ephemeralmsgs">Як працюють повідомлення, що зникають?</a></li>
@@ -30,8 +30,8 @@
<li><a href="#що-таке-push-сповіщення-як-отримати-миттєву-доставку-повідомлень">Що таке push-сповіщення? Як отримати миттєву доставку повідомлень?</a></li>
<li><a href="#чи-ввімкнено-push-сповіщення-на-пристроях-ios-чи-є-альтернатива">Чи ввімкнено Push-сповіщення на пристроях iOS? Чи є альтернатива?</a></li>
<li><a href="#android-push">Чи ввімкнені/потрібні Push-сповіщення на пристроях Android?</a></li>
<li><a href="#privacy-notifications">Наскільки приватними є push-сповіщення ArcaneChat?</a></li>
<li><a href="#чому-delta-chat-інтегрується-з-централізованими-пропрієтарними-push-сервісами-applegoogle">Чому ArcaneChat інтегрується з централізованими пропрієтарними push-сервісами Apple/Google?</a></li>
<li><a href="#privacy-notifications">Наскільки приватними є push-сповіщення Delta Chat?</a></li>
<li><a href="#чому-delta-chat-інтегрується-з-централізованими-пропрієтарними-push-сервісами-applegoogle">Чому Delta Chat інтегрується з централізованими пропрієтарними push-сервісами Apple/Google?</a></li>
</ul>
</li>
<li><a href="#шифрування-та-безпека">Шифрування та безпека</a>
@@ -44,28 +44,28 @@
<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">Чи вразливий ArcaneChat до EFAIL?</a></li>
<li><a href="#чи-вразливий-delta-chat-до-efail">Чи вразливий Delta Chat до EFAIL?</a></li>
<li><a href="#tls">Чи буде показано повідомлення відкритим текстом, якщо наскрізне шифрування недоступне?</a></li>
<li><a href="#message-metadata">Як ArcaneChat захищає метадані у повідомленнях?</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">Як я можу отримати наскрізно зашифрований чат з контактом ArcaneChat, який іноді користується веб-поштою або іншим додатком електронної пошти, що не підтримує Autocrypt?</a></li>
<li><a href="#як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt">Як я можу отримати наскрізно зашифрований чат з контактом Delta Chat, який іноді користується веб-поштою або іншим додатком електронної пошти, що не підтримує Autocrypt?</a></li>
<li><a href="#як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень">Як забезпечити наскрізне шифрування та видалення повідомлень?</a></li>
<li><a href="#pfs">Чи підтримує ArcaneChat цілковиту пряму секретність (Perfect Forward Secrecy)?</a></li>
<li><a href="#чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal">Чи є наскрізне шифрування ArcaneChat таким же безпечним, як Signal?</a></li>
<li><a href="#чи-можна-повторно-використовувати-існуючий-закритий-ключ">Чи можна повторно використовувати існуючий закритий ключ?</a></li>
<li><a href="#я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat">Я не можу імпортувати свій існуючий PGP ключ у ArcaneChat.</a></li>
<li><a href="#security-audits">Чи проходив ArcaneChat незалежний аудит на наявність вразливостей у безпеці?</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="#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>
<li><a href="#multiclient">Мульти-клієнт</a>
<ul>
<li><a href="#чи-можна-використовувати-delta-chat-на-декількох-пристроях-одночасно">Чи можна використовувати ArcaneChat на декількох пристроях одночасно?</a></li>
<li><a href="#чи-можна-використовувати-delta-chat-на-декількох-пристроях-одночасно">Чи можна використовувати Delta Chat на декількох пристроях одночасно?</a></li>
<li><a href="#вирішення-проблем">Вирішення проблем</a></li>
<li><a href="#backup">Ручне перенесення</a></li>
<li><a href="#чи-планується-впровадження-веб-клієнта-delta-chat">Чи планується впровадження веб-клієнта ArcaneChat?</a></li>
<li><a href="#чи-планується-впровадження-веб-клієнта-delta-chat">Чи планується впровадження веб-клієнта Delta Chat?</a></li>
</ul>
</li>
<li><a href="#webxdc">webxdc-додатки</a>
@@ -77,7 +77,7 @@
</li>
<li><a href="#експериментальні-функції">Експериментальні функції</a>
<ul>
<li><a href="#як-я-можу-робити-аудіовідеодзвінки-з-delta-chat">Як я можу робити аудіо/відеодзвінки з ArcaneChat?</a></li>
<li><a href="#як-я-можу-робити-аудіовідеодзвінки-з-delta-chat">Як я можу робити аудіо/відеодзвінки з Delta Chat?</a></li>
<li><a href="#що-таке-списки-широкомовлення-та-як-ними-користуватися">Що таке списки широкомовлення та як ними користуватися?</a></li>
<li><a href="#як-я-можу-поділитися-своїм-місцезнаходженням-зі-своїми-співрозмовниками-в-чаті">Як я можу поділитися своїм місцезнаходженням зі своїми співрозмовниками в чаті?</a></li>
<li><a href="#чому-я-можу-вибрати-лише-стеження-за-папкою-deltachat">Чому я можу вибрати лише стеження за папкою DeltaChat?</a></li>
@@ -86,20 +86,21 @@
</li>
<li><a href="#інше">Інше</a>
<ul>
<li><a href="#яких-дозволів-потребує-delta-chat">Яких дозволів потребує ArcaneChat?</a></li>
<li><a href="#чи-підтримує-delta-chat-роботу-з-моїм-провайдером-електронної-пошти">Чи підтримує ArcaneChat роботу з <em>моїм</em> провайдером електронної пошти?</a></li>
<li><a href="#я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите">Я хочу керувати власним сервером електронної пошти для ArcaneChat. Що ви порадите?</a></li>
<li><a href="#чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-delta-chat-чи-це-безпечно">Чому я маю вводити пароль до моєї електронної пошти у ArcaneChat? Чи це безпечно?</a></li>
<li><a href="#які-повідомлення-відображаються-у-delta-chat">Які повідомлення відображаються у ArcaneChat?</a></li>
<li><a href="#чи-підтримує-delta-chat-html-листи">Чи підтримує ArcaneChat HTML-листи?</a></li>
<li><a href="#чи-можу-я-встановити-тему-листа-в-delta-chat">Чи можу я встановити тему листа в ArcaneChat?</a></li>
<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="#чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-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>
<li><a href="#чи-можу-я-встановити-тему-листа-в-delta-chat">Чи можу я встановити тему листа в Delta Chat?</a></li>
<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">Чи сумісний ArcaneChat із Protonmail / Tutanota / Criptext?</a></li>
<li><a href="#як-мені-видалити-свій-обліковий-запис">Як мені видалити свій обліковий запис?</a></li>
<li><a href="#чи-сумісний-delta-chat-із-protonmail--tutanota--criptext">Чи сумісний Delta Chat із Protonmail / Tutanota / Criptext?</a></li>
<li><a href="#remove-account">Як мені видалити свій обліковий запис?</a></li>
<li><a href="#мене-цікавлять-технічні-деталі-можете-розповісти-більше">Мене цікавлять технічні деталі. Можете розповісти більше?</a></li>
<li><a href="#як-фінансується-розробка-delta-chat">Як фінансується розробка ArcaneChat?</a></li>
<li><a href="#де-мої-друзі-можуть-знайти-delta-chat">Де мої друзі можуть знайти Delta Chat?</a></li>
<li><a href="#як-фінансується-розробка-delta-chat">Як фінансується розробка Delta Chat?</a></li>
</ul>
</li>
</ul>
@@ -109,14 +110,14 @@
<h2 id="що-таке-delta-chat">
Що таке ArcaneChat? <a href="#що-таке-delta-chat" class="anchor"></a>
Що таке Delta Chat? <a href="#що-таке-delta-chat" class="anchor"></a>
</h2>
<p>ArcaneChat - це надійний, децентралізований та безпечний додаток для обміну повідомленнями, доступний для мобільних і десктопних платформ.</p>
<p>Delta Chat - це надійний, децентралізований та безпечний додаток для обміну повідомленнями, доступний для мобільних і десктопних платформ.</p>
<p>ArcaneChat схожий на Whatsapp або Telegram, але ви також можете використовувати його як додаток електронної пошти. Ви можете анонімно зареєструватися на різних <a href="https://delta.chat/chatmail">сумісних chatmail-серверах</a> які є мінімальними поштовими серверами, оптимізованими для швидкої та безпечної роботи. Або ви можете використовувати класичні поштові сервери та існуючий обліковий запис електронної пошти в цьому випадку ArcaneChat буде працювати як поштовий додаток.</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>
@@ -130,12 +131,12 @@
<p>Щоб безпечно встановити контакт з іншими <a href="#howtoe2ee">відскануйте QR-код запрошення або поділіться посиланням на запрошення</a>. Це потрібно, якщо ви використовуєте (за замовчуванням) профіль чату на основі chatmail оскільки chatmail-сервери відхиляють незашифровані вихідні повідомлення.</p>
<p>Якщо ви створюєте профіль чату з класичною адресою електронної пошти ви можете створити контакт вручну, якщо знаєте його електронну адресу а потім написати йому повідомлення навіть якщо одержувач не використовує ArcaneChat.</p>
<p>Якщо ви створюєте профіль чату з класичною адресою електронної пошти ви можете створити контакт вручну, якщо знаєте його електронну адресу а потім написати йому повідомлення навіть якщо одержувач не використовує Delta Chat.</p>
<h3 id="які-переваги-delta-chat-у-порівнянні-з-іншими-месенджерами">
Які переваги ArcaneChat у порівнянні з іншими месенджерами? <a href="#які-переваги-delta-chat-у-порівнянні-з-іншими-месенджерами" class="anchor"></a>
Які переваги Delta Chat у порівнянні з іншими месенджерами? <a href="#які-переваги-delta-chat-у-порівнянні-з-іншими-месенджерами" class="anchor"></a>
</h3>
@@ -175,7 +176,7 @@
<h3 id="чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">
Чи підтримує ArcaneChat вкладення у вигляді фото, відео тощо? <a href="#чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо" class="anchor"></a>
Чи підтримує Delta Chat вкладення у вигляді фото, відео тощо? <a href="#чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо" class="anchor"></a>
</h3>
@@ -199,7 +200,7 @@
<p>Профіль - це <strong>ім’я, зображення</strong> і деяка додаткова інформація для шифрування повідомлень. Профіль існує лише на вашому пристрої (пристроях) і використовує чат або класичний поштовий сервер для передачі повідомлень.</p>
<p>Під час першого встановлення ArcaneChat створюється перший профіль.</p>
<p>Під час першого встановлення Delta Chat створюється перший профіль.</p>
<p>Пізніше ви можете натиснути на зображення вашого профілю у верхньому лівому кутку, щоб вибрати <strong>Додати профілі</strong> або <strong>Переключити профілі</strong>.</p>
@@ -220,7 +221,7 @@
<p>Ви можете додати зображення профілю в ваших налаштуваннях. Якщо ви пишете комусь із ваших контактів чи додаєте їх через QR код, вони автоматично побачать ваше зображення профілю.</p>
</li>
<li>
<p>Контакти, які не використовують ArcaneChat, не бачать зображення профілю (однак, звичайно, вони можуть встановити ArcaneChat :)</p>
<p>Контакти, які не використовують Delta Chat, не бачать зображення профілю (однак, звичайно, вони можуть встановити Delta Chat :)</p>
</li>
<li>
<p>Із міркувань приватності, ніхто не бачить ваше зображення профілю доки ви їм не напишете.</p>
@@ -233,12 +234,12 @@
<h3 id="signature">
Чи можу я встановити текст підпису/статусу/девізу у ArcaneChat? <a href="#signature" class="anchor"></a>
Чи можу я встановити текст підпису/статусу/девізу у Delta Chat? <a href="#signature" class="anchor"></a>
</h3>
<p>Так, ви можете зробити це в розділі “Налаштування &gt; Профіль &gt; Текст підпису”. Ваші контакти, які використовують ArcaneChat, побачать його коли переглядатимуть ваші контактні дані. Для всіх інших, він з’явиться як підпис в електронному листі під текстом усіх ваших повідомлень.</p>
<p>Так, ви можете зробити це в розділі “Налаштування &gt; Профіль &gt; Текст підпису”. Ваші контакти, які використовують Delta Chat, побачать його коли переглядатимуть ваші контактні дані. Для всіх інших, він з’явиться як підпис в електронному листі під текстом усіх ваших повідомлень.</p>
<h3 id="що-значить-закріплення-приглушення-архівування">
@@ -267,7 +268,7 @@
</li>
</ul>
<p>Щоб заархівувати або закріпити чат, довго торкніться (Android), скористайтеся меню чату (Android/комп’ютер) або проведіть пальцем ліворуч (iOS); щоб вимкнути звук чату, скористайтеся меню чату (Android/комп’ютер) або профілем чату (iOS).</p>
<p>Щоб скористатися функціями, утримуйте натиснутою клавішу або клацніть правою кнопкою миші на чаті у списку чатів.</p>
<h3 id="що-означає-зелена-точка">
@@ -278,12 +279,12 @@
</h3>
<ul>
<li>Починаючи з ArcaneChat 1.34, ви іноді можете бачити “зелену крапку” поруч із аватаром контакту. Це означає, що контакт «нещодавно бачили».</li>
<li>Детально: це означає, що за останні 10 хвилин ArcaneChat бачив їх:</li>
<li>Починаючи з Delta Chat 1.34, ви іноді можете бачити “зелену крапку” поруч із аватаром контакту. Це означає, що контакт «нещодавно бачили».</li>
<li>Детально: це означає, що за останні 10 хвилин Delta Chat бачив їх:</li>
<li>або тому, що вони надіслали вам повідомлення безпосередньо,</li>
<li>тому що вони написали щось групі, учасником якої є ви обоє,</li>
<li>тому що вони надіслали вам сповіщення про прочитання повідомлення, яке ви написали,</li>
<li>або тому, що вони надіслали дані до вашої програми ArcaneChat за допомогою a <a href="#webxdc">приватна програма</a>.
<li>або тому, що вони надіслали дані до вашої програми Delta Chat за допомогою a <a href="#webxdc">приватна програма</a>.
– Отже, це не онлайн-статус у реальному часі – і якщо хтось не відповідає відразу, навіть якщо вони, здаються, онлайн, не хвилюйтесь і дайте їм трохи простору ;-)
– З іншого боку, інші не завжди «побачать, що ви онлайн». Якщо ви вимкнули сповіщення про прочитання, вони не побачать зелену крапку, доки ви не надішлете їм повідомлення або напишете у групу, до якої вони входять.</li>
</ul>
@@ -298,11 +299,11 @@
<p>Увімкнути “повідомлення, що зникають” можна в налаштуваннях чату, у верхньому правому куті вікна чату, вибравши проміжок часу від 1 хвилини до 5 тижнів.</p>
<p>Доки налаштування не буде знову вимкнено, додаток ArcaneChat кожного учасника чату піклується про видалення повідомлень через вибраний проміжок часу. Проміжок часу починається коли одержувач вперше побачив повідомлення в ArcaneChat. Повідомлення видаляються як з кожної поштової скриньки на сервері, так і в самому додатку.</p>
<p>Доки налаштування не буде знову вимкнено, додаток Delta Chat кожного учасника чату піклується про видалення повідомлень через вибраний проміжок часу. Проміжок часу починається коли одержувач вперше побачив повідомлення в Delta Chat. Повідомлення видаляються як з кожної поштової скриньки на сервері, так і в самому додатку.</p>
<p>Зверніть увагу, що ви можете покладатися на зникнення повідомлень лише доти, доки ви довіряєте своїм співрозмовникам; зловмисники можуть робити фотографії, або іншим чином зберігати, копіювати або пересилати повідомлення перед видаленням.</p>
<p>Крім того, якщо один із співрозмовників видаляє ArcaneChat, повідомлення не будуть видалені з його поштової скриньки. Швидше за все, їх також більше не можна буде розшифрувати (якщо вони були зашифровані).</p>
<p>Крім того, якщо один із співрозмовників видаляє Delta Chat, повідомлення не будуть видалені з його поштової скриньки. Швидше за все, їх також більше не можна буде розшифрувати (якщо вони були зашифровані).</p>
<h2 id="групи">
@@ -393,13 +394,13 @@
<ul>
<li>
<p>За умовчанням ArcaneChat зберігає всі повідомлення локально на вашому пристрої. Якщо ви, наприклад, бажаєте заощадити місце для зберігання у свого провайдера електронної пошти, ви можете вибрати автоматичне видалення старих повідомлень. Вони все ще залишаються на вашому пристрої, поки ви видалите їх і там.</p>
<p>За умовчанням Delta Chat зберігає всі повідомлення локально на вашому пристрої. Якщо ви, наприклад, бажаєте заощадити місце для зберігання у свого провайдера електронної пошти, ви можете вибрати автоматичне видалення старих повідомлень. Вони все ще залишаються на вашому пристрої, поки ви видалите їх і там.</p>
</li>
<li>
<p>Щоб увімкнути його, перейдіть до <strong>Видалити старі повідомлення → Видалити повідомлення з сервера</strong> в налаштуваннях «Чати та медіа». Ви можете встановити часові рамки між «Одразу» та «Через 1 рік». Усі електронні листи, отримані ArcaneChat, будуть видалені з сервера після закінчення цього терміну.</p>
<p>Щоб увімкнути його, перейдіть до <strong>Видалити старі повідомлення → Видалити повідомлення з сервера</strong> в налаштуваннях «Чати та медіа». Ви можете встановити часові рамки між «Одразу» та «Через 1 рік». Усі електронні листи, отримані Delta Chat, будуть видалені з сервера після закінчення цього терміну.</p>
</li>
<li>
<p>Зауважте, що якщо ви використовуєте ArcaneChat на кількох пристроях, вам слід залишити повідомлення на сервері, доки інший пристрій не зможе завантажити їх. У цьому випадку вам слід встановити для автоматичного видалення значення «через день» або щось подібне, залежно від того, як часто ви вмикаєте інший пристрій.</p>
<p>Зауважте, що якщо ви використовуєте Delta Chat на кількох пристроях, вам слід залишити повідомлення на сервері, доки інший пристрій не зможе завантажити їх. У цьому випадку вам слід встановити для автоматичного видалення значення «через день» або щось подібне, залежно від того, як часто ви вмикаєте інший пристрій.</p>
</li>
</ul>
@@ -433,7 +434,7 @@
</h3>
<p>Push-повідомлення надсилаються “Push-сервісами” Apple та Google на пристрій користувача щоб неактивний додаток ArcaneChat міг отримувати повідомлення у фоновому режимі і показувати сповіщення на телефоні користувача, якщо це необхідно.</p>
<p>Push-повідомлення надсилаються “Push-сервісами” Apple та Google на пристрій користувача щоб неактивний додаток Delta Chat міг отримувати повідомлення у фоновому режимі і показувати сповіщення на телефоні користувача, якщо це необхідно.</p>
<p>Push-сповіщення працюють з усіма <a href="https://delta.chat/chatmail">chatmail</a>-серверами на</p>
@@ -446,7 +447,7 @@
</li>
</ul>
<p>Станом на травень 2024 року класичні сервери електронної пошти не підтримують Push-повідомлення для користувачів ArcaneChat.</p>
<p>Станом на травень 2024 року класичні сервери електронної пошти не підтримують Push-повідомлення для користувачів Delta Chat.</p>
<h3 id="чи-ввімкнено-push-сповіщення-на-пристроях-ios-чи-є-альтернатива">
@@ -456,9 +457,9 @@
</h3>
<p>Так, ArcaneChat автоматично використовує push-повідомлення для профілів <a href="https://delta.chat/chatmail">chatmail</a>.
І ні, на телефонах Apple немає альтернативи миттєвій доставці повідомлень тому, що пристрої Apple не дозволяють ArcaneChat отримувати дані у фоновому режимі.
Push-сповіщення автоматично активуються для користувачів iOS, тому що <a href="#privacy-notifications">система push-сповіщень ArcaneChat, що зберігає конфіденційність</a> не передає Apple дані, якими вона ще не володіє.</p>
<p>Так, Delta Chat автоматично використовує push-повідомлення для профілів <a href="https://delta.chat/chatmail">chatmail</a>.
І ні, на телефонах Apple немає альтернативи миттєвій доставці повідомлень тому, що пристрої Apple не дозволяють Delta Chat отримувати дані у фоновому режимі.
Push-сповіщення автоматично активуються для користувачів iOS, тому що <a href="#privacy-notifications">система push-сповіщень Delta Chat, що зберігає конфіденційність</a> не передає Apple дані, якими вона ще не володіє.</p>
<h3 id="android-push">
@@ -468,13 +469,13 @@ Push-сповіщення автоматично активуються для
</h3>
<p>Якщо доступний “Push-сервіс”, ArcaneChat вмикає Push-сповіщення щоб забезпечити миттєву доставку повідомлень для всіх користувачів чату. Якщо ви використовуєте класичний провайдер електронної пошти замість серверів <a href="https://delta.chat/chatmail">chatmail</a>, Push-сповіщення недоступні.</p>
<p>Якщо доступний “Push-сервіс”, Delta Chat вмикає Push-сповіщення щоб забезпечити миттєву доставку повідомлень для всіх користувачів чату. Якщо ви використовуєте класичний провайдер електронної пошти замість серверів <a href="https://delta.chat/chatmail">chatmail</a>, Push-сповіщення недоступні.</p>
<p>У налаштуваннях “Сповіщення” ArcaneChat для “Миттєва доставка” ви можете змінити наступні налаштування, які впливають на всі профілі чату:</p>
<p>У налаштуваннях “Сповіщення” Delta Chat для “Миттєва доставка” ви можете змінити наступні налаштування, які впливають на всі профілі чату:</p>
<ul>
<li>
<p>Використовувати фонове підключення: Якщо ви не використовуєте Push-сервіс, ви можете вимкнути “оптимізацію батареї” для ArcaneChat, що дозволить йому отримувати повідомлення у фоновому режимі. Однак це може призвести до затримок від декількох хвилин до декількох годин. Деякі постачальники Android навіть повністю обмежують додатки (див. <a href="https://dontkillmyapp.com">dontkillmyapp.com</a>) і ArcaneChat може не показувати вхідні повідомлення доки ви не відкриєте програму вручну.</p>
<p>Використовувати фонове підключення: Якщо ви не використовуєте Push-сервіс, ви можете вимкнути “оптимізацію батареї” для Delta Chat, що дозволить йому отримувати повідомлення у фоновому режимі. Однак це може призвести до затримок від декількох хвилин до декількох годин. Деякі постачальники Android навіть повністю обмежують додатки (див. <a href="https://dontkillmyapp.com">dontkillmyapp.com</a>) і Delta Chat може не показувати вхідні повідомлення доки ви не відкриєте програму вручну.</p>
</li>
<li>
<p>Примусове фонове підключення: Це запасний варіант якщо попередні опції недоступні або не досягають “миттєвої доставки”. Увімкнення цієї опції спричиняє постійне сповіщення на вашому телефоні яке іноді може бути “мінімізоване” на останніх версіях телефонів Android.</p>
@@ -486,47 +487,47 @@ Push-сповіщення автоматично активуються для
<h3 id="privacy-notifications">
Наскільки приватними є push-сповіщення ArcaneChat? <a href="#privacy-notifications" class="anchor"></a>
Наскільки приватними є push-сповіщення Delta Chat? <a href="#privacy-notifications" class="anchor"></a>
</h3>
<p>Підтримка push-сповіщень ArcaneChat дозволяє уникнути витоку приватної інформації. Вона не передає електронну пошту, IP-адресу або вміст повідомлень (навіть зашифрованих) до будь-якої системи, яка бере участь у доставці push-сповіщень.</p>
<p>Підтримка push-сповіщень Delta Chat дозволяє уникнути витоку приватної інформації. Вона не передає електронну пошту, IP-адресу або вміст повідомлень (навіть зашифрованих) до будь-якої системи, яка бере участь у доставці push-сповіщень.</p>
<p>Ось як програми ArcaneChat здійснюють доставку push-сповіщень:</p>
<p>Ось як програми Delta Chat здійснюють доставку push-сповіщень:</p>
<ul>
<li>
<p>Додаток ArcaneChat отримує “токен пристрою” локально і зберігає його на сервері <a href="https://delta.chat/chatmail">chatmail</a>.</p>
<p>Додаток Delta Chat отримує “токен пристрою” локально, шифрує його і зберігає на сервері <a href="https://delta.chat/chatmail">chatmail</a>.</p>
</li>
<li>
<p>Коли <a href="https://delta.chat/chatmail">chatmail</a>-сервер отримує електронний лист від користувача ArcaneChat він пересилає токен пристрою до центрального проксі-сповіщення ArcaneChat.</p>
<p>Коли сервер <a href="https://delta.chat/chatmail">chatmail</a> отримує електронний лист від користувача Delta Chat він пересилає зашифрований токен пристрою до центрального проксі-сервера сповіщень Delta Chat.</p>
</li>
<li>
<p>Центральний проксі-сервер сповіщень ArcaneChat пересилає токен пристрою до відповідного Push-сервісу (Apple, Google тощо), навіть не знаючи IP-адреси чи електронної пошти користувачів ArcaneChat.</p>
<p>Центральний проксі-сервер сповіщень Delta Chat розшифровує токен пристрою і пересилає його до відповідного Push-сервісу (Apple, Google тощо), навіть не знаючи IP-адреси або електронної пошти користувачів Delta Chat.</p>
</li>
<li>
<p>Центральний Push-сервіс (Apple, Google тощо) запускає додаток ArcaneChat на вашому пристрої щоб перевірити наявність нових повідомлень у фоновому режимі. Він не знає про пошту чату або адресу електронної пошти пристрою, який він пробуджує. Центральні служби Apple/Google Push ніколи не бачать адресу електронної пошти (відправника або одержувача) а також ніколи не бачать жодного вмісту повідомлення (навіть в зашифрованому вигляді).</p>
<p>Центральний Push-сервіс (Apple, Google тощо) запускає додаток Delta Chat на вашому пристрої щоб перевірити наявність нових повідомлень у фоновому режимі. Він не знає про пошту чату або адресу електронної пошти пристрою, який він пробуджує. Центральні служби Apple/Google Push ніколи не бачать адресу електронної пошти (відправника або одержувача) а також ніколи не бачать жодного вмісту повідомлення (навіть в зашифрованому вигляді).</p>
</li>
</ul>
<p>Станом на травень 2024 року chatmail-сервери знають про токени пристроїв” але ми плануємо зашифрувати цю інформацію для проксі-сповіщень таким чином, щоб сервер чату ніколи не дізнався токен пристрою.</p>
<p>Центральний проксі для сповіщень Delta Chat <a href="https://github.com/deltachat/notifiers">невеликий і повністю реалізований на Rust</a> забуває про токени пристроїв, як тільки Apple/Google/etc обробили їх, зазвичай за лічені мілісекунди.</p>
<p>Центральний проксі для сповіщень ArcaneChat <a href="https://github.com/deltachat/notifiers">невеликий і повністю реалізований на Rust</a> забуває про токени пристроїв, як тільки Apple/Google/etc обробили їх, зазвичай за лічені мілісекунди.</p>
<p>Зверніть увагу, що токен пристрою шифрується між програмами та проксі-сповіщеннями але не підписується. Таким чином, проксі-служба сповіщень ніколи не бачить адреси електронної пошти, IP-адреси або будь-яку криптографічну ідентифікаційну інформацію, пов’язану з пристроєм користувача (токеном).</p>
<p>В результаті цього загального дизайну конфіденційності, навіть захоплення chatmail-сервера, або повне вилучення центрального проксі-сервера повідомлень ArcaneChat не призведе до розкриття приватної інформації, якої ще не мають Push-сервіси.</p>
<p>В результаті цього загального дизайну конфіденційності, навіть захоплення chatmail-сервера, або повне вилучення центрального проксі-сервера повідомлень Delta Chat не призведе до розкриття приватної інформації, якої ще не мають Push-сервіси.</p>
<h3 id="чому-delta-chat-інтегрується-з-централізованими-пропрієтарними-push-сервісами-applegoogle">
Чому ArcaneChat інтегрується з централізованими пропрієтарними push-сервісами Apple/Google? <a href="#чому-delta-chat-інтегрується-з-централізованими-пропрієтарними-push-сервісами-applegoogle" class="anchor"></a>
Чому Delta Chat інтегрується з централізованими пропрієтарними push-сервісами Apple/Google? <a href="#чому-delta-chat-інтегрується-з-централізованими-пропрієтарними-push-сервісами-applegoogle" class="anchor"></a>
</h3>
<p>ArcaneChat - це безкоштовний децентралізований месенджер з відкритим вихідним кодом і вільним вибором сервера, але ми хочемо, щоб користувачі отримували надійну “миттєву доставку” повідомлень, як у додатках Whatsapp, Signal або Telegram, без попередніх запитань, які більше підходять для досвідчених користувачів або розробників.</p>
<p>Delta Chat - це безкоштовний децентралізований месенджер з відкритим вихідним кодом і вільним вибором сервера, але ми хочемо, щоб користувачі отримували надійну “миттєву доставку” повідомлень, як у додатках Whatsapp, Signal або Telegram, без попередніх запитань, які більше підходять для досвідчених користувачів або розробників.</p>
<p>Зверніть увагу, що ArcaneChat має <a href="#privacy-notifications">невелику систему push-повідомлень, що зберігає конфіденційність</a> яка забезпечує “миттєву доставку” повідомлень на всі chatmail-сервери включаючи потенційний <a href="https://delta.chat/chatmail#selfhosted">який ви можете налаштувати самостійно без нашого дозволу</a>. Ласкаво просимо до потужності сумісної та масової системи чат-пошти та електронної пошти :)</p>
<p>Зверніть увагу, що Delta Chat має <a href="#privacy-notifications">невелику систему push-повідомлень, що зберігає конфіденційність</a> яка забезпечує “миттєву доставку” повідомлень на всі chatmail-сервери включаючи потенційний <a href="https://delta.chat/chatmail#selfhosted">який ви можете налаштувати самостійно без нашого дозволу</a>. Ласкаво просимо до потужності сумісної та масової системи чат-пошти та електронної пошти :)</p>
<h2 id="шифрування-та-безпека">
@@ -582,12 +583,12 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
<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" /> на головному екрані програми ArcaneChat.</p>
<p>Для <strong>прямих запрошень у чат 1:1</strong>, торкніться іконки QR-коду <img style="vertical-align:middle; width:1.8em; margin:1px" src="../qr-icon.png" /> на головному екрані програми Delta Chat.</p>
</li>
</ul>
<p>Дозвольте вашому партнеру по чату відсканувати QR-зображення
у своєму додатку ArcaneChat, або натисніть “Копіювати” чи “Поділитися”, щоб створити посилання-запрошення і поділитися ним з вашим співрозмовником.</p>
у своєму додатку Delta Chat, або натисніть “Копіювати” чи “Поділитися”, щоб створити посилання-запрошення і поділитися ним з вашим співрозмовником.</p>
<p>Тепер зачекайте, поки між обома пристроями <a href="https://securejoin.delta.chat/en/latest/new.html#setup-contact-protocol">відбудеться обмін мережевими повідомленнями Secure-Join</a>.</p>
@@ -631,27 +632,27 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
<p>Якщо ваш контакт дійсно спричинив втрату гарантованого наскрізного шифрування будь ласка, зверніться до наступних параграфів, щоб дізнатися про типові причини та способи їх усунення. Незважаючи на це, всі інші чати, позначені зеленою галочкою, залишаються гарантовано зашифрованими з кінця в кінець навіть якщо контакт є їхнім учасником.</p>
<p><strong>Ваш контакт використовує ArcaneChat на другому пристрої (телефоні або ноутбуці)</strong>.</p>
<p><strong>Ваш контакт використовує Delta Chat на другому пристрої (телефоні або ноутбуці)</strong>.</p>
<p>Якщо у них є інший пристрій із запущеним додатком ArcaneChat, вони повинні видалити обліковий запис з нового пристрою і додати його <a href="#multiclient">як другий пристрій, як описано тут</a>. Як тільки вони напишуть вам повідомлення, попередження зникне і гарантоване шифрування буде встановлено на обох пристроях вашого контакту.</p>
<p>Якщо у них є інший пристрій із запущеним додатком Delta Chat, вони повинні видалити обліковий запис з нового пристрою і додати його <a href="#multiclient">як другий пристрій, як описано тут</a>. Як тільки вони напишуть вам повідомлення, попередження зникне і гарантоване шифрування буде встановлено на обох пристроях вашого контакту.</p>
<p><strong>Ваш контакт перевстановив ArcaneChat, використовуючи свій старий логін</strong></p>
<p><strong>Ваш контакт перевстановив Delta Chat, використовуючи свій старий логін</strong></p>
<p>Якщо у них є <a href="#backup">файл резервної копії</a>, вони повинні видалити обліковий запис з нового пристрою і, замість цього, імпортувати файл резервної копії для відновлення свого облікового запису. Як тільки вони напишуть вам повідомлення, попередження зникне і гарантоване шифрування буде відновлено для цього контакту.</p>
<p>Якщо у них немає резервної копії файлу, найкраще виконати <a href="#howtoe2ee">QR-сканування</a> з вашим співрозмовником, щоб відновити гарантоване кінцеве шифрування.</p>
<p><strong>Ваш контакт надіслав листа через веб-інтерфейс або іншу поштову програму і незабаром повернеться до використання ArcaneChat.</strong></p>
<p><strong>Ваш контакт надіслав листа через веб-інтерфейс або іншу поштову програму і незабаром повернеться до використання Delta Chat.</strong></p>
<p>Якщо ви впевнені, що контакт іноді користується веб-поштою, або іншу поштову програму без наскрізного шифрування, ви можете прийняти попередження. Як тільки ваш контакт знову скористається ArcaneChat, гарантоване наскрізне шифрування буде автоматично відновлено.</p>
<p>Якщо ви впевнені, що контакт іноді користується веб-поштою, або іншу поштову програму без наскрізного шифрування, ви можете прийняти попередження. Як тільки ваш контакт знову скористається Delta Chat, гарантоване наскрізне шифрування буде автоматично відновлено.</p>
<p><strong>Ваш контакт повністю припинив користуватися ArcaneChat</strong>.</p>
<p><strong>Ваш контакт повністю припинив користуватися Delta Chat</strong>.</p>
<p>Іноді залишатися на зв’язку важливіше, ніж наскрізне шифрування. <a href="#tls">“Шифрування на транспортному рівні” (TLS)</a> все ще може ефективно захищати конфіденційність ваших повідомлень між вашим пристроєм і сервером електронної пошти. Але без наскрізного шифрування ви та ваш контакт довіряєте серверу електронної пошти не читати і не маніпулювати вашими повідомленнями, а також не передавати їх третім особам.</p>
<p>У будь-якому випадку, ви не можете зробити нічого іншого, окрім як прийняти попередження. Будь ласка, також видаліть контакт з будь-якої активної групи, позначеної зеленою галочкою які ви можете знайти в розділі “Загальні чати” в профілі контакту. Це позбавить ваш контакт від отримання “нечитабельних” повідомлень.</p>
<p>Якщо контакт видалив ArcaneChat через помилки або небажану поведінку, будь ласка, розгляньте можливість написати повідомлення на нашому <a href="https://support.delta.chat">форумі підтримки</a> щоб допомогти нам виявити та вирішити загальні проблеми. Дякуємо!</p>
<p>Якщо контакт видалив Delta Chat через помилки або небажану поведінку, будь ласка, розгляньте можливість написати повідомлення на нашому <a href="https://support.delta.chat">форумі підтримки</a> щоб допомогти нам виявити та вирішити загальні проблеми. Дякуємо!</p>
<h3 id="чи-зашифровані-наскрізно-вкладення-зображення-файли-аудіо-тощо">
@@ -673,9 +674,12 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
</h3>
<p>Так, ArcaneChat використовує безпечну підмножину OpenPGP і відображає індикатор безпеки у вигляді замка в повідомленні лише тоді, коли все повідомлення належним чином зашифровано і підписано. Наприклад, “Відокремлені підписи” не вважаються безпечними.</p>
<p>Так, Delta Chat використовує безпечну підмножину OpenPGP і відображає індикатор безпеки у вигляді замка в повідомленні лише тоді, коли все повідомлення належним чином зашифровано і підписано. Наприклад, “Відокремлені підписи” не вважаються безпечними.</p>
<p>OpenPGP не є небезпечним сам по собі. Більшість публічно обговорюваних проблем безпеки OpenPGP насправді виникають через погане використання або погану реалізацію інструментів або програм (або і те, і інше). Особливо важливо розрізняти OpenPGP, стандарт шифрування IETF, і GnuPG (GPG), інструментом командного рядка, що реалізує OpenPGP. Багато публічних критиків OpenPGP насправді обговорюють GnuPG, який ArcaneChat ніколи не використовував. Натомість ArcaneChat використовує реалізацію OpenPGP на Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>, доступну як <a href="https://crates.io/crates/pgp">незалежний пакет “pgp”</a>, і <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">пройшов аудит безпеки у 2019 році</a>.</p>
<p>OpenPGP сам по собі не є небезпечним. Більшість публічно обговорюваних проблем безпеки OpenPGP насправді виникають через недостатню зручність використання або погану реалізацію інструментів чи програм (або обох).
Особливо важливо розрізняти OpenPGP, стандарт шифрування IETF, і GnuPG (GPG), інструмент командного рядка, що реалізує OpenPGP.
Багато публічних критиків OpenPGP насправді обговорюють GnuPG, який Delta Chat ніколи не використовував.
Delta Chat скоріше використовує реалізацію OpenPGP Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>, доступну як <a href="https://crates.io/crates/pgp">незалежний пакет «pgp»</a> і <a href="#security-audits">перевірку безпеки в 2019 і 2024 роках</a>.</p>
<p>Ми прагнемо, разом з іншими розробниками OpenPGP, подальше покращення характеристик безпеки шляхом впровадження <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-crypto-refresh/">нового IETF OpenPGP Crypto-Refresh</a> який, на щастя, був прийнятий влітку 2023 року.</p>
@@ -689,19 +693,19 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
<p>Так, ми стежимо за такими ініціативами, як <a href="https://en.wikipedia.org/wiki/Messaging_Layer_Security">MLS</a> або <a href="https://saltpack.org/">Saltpack</a> але їх прийняття означатиме порушення наскрізної сумісності шифрування з усіма іншими поштовими програмами, які зазвичай підтримують шифрування OpenPGP. Отже, це не буде легким рішенням і воно повинно принести користувачам відчутні покращення.</p>
<p>ArcaneChat застосовує цілісний підхід “корисної безпеки” і працює з широким спектром активістських груп, а також відомими дослідниками, такими як <a href="https://teamusec.de">TeamUSEC</a> щоб покращити реальний захист користувачів від загроз безпеці. Протокол і стандарт для створення наскрізного шифрування - це лише одна частина “результатів для користувача”, див. також наші відповіді на <a href="#device-seizure">вилучення пристрою</a> та <a href="#message-metadata">метадані повідомлення</a>.</p>
<p>Delta Chat застосовує цілісний підхід “корисної безпеки” і працює з широким спектром активістських груп, а також відомими дослідниками, такими як <a href="https://teamusec.de">TeamUSEC</a> щоб покращити реальний захист користувачів від загроз безпеці. Протокол і стандарт для створення наскрізного шифрування - це лише одна частина “результатів для користувача”, див. також наші відповіді на <a href="#device-seizure">вилучення пристрою</a> та <a href="#message-metadata">метадані повідомлення</a>.</p>
<h3 id="чи-вразливий-delta-chat-до-efail">
Чи вразливий ArcaneChat до EFAIL? <a href="#чи-вразливий-delta-chat-до-efail" class="anchor"></a>
Чи вразливий Delta Chat до EFAIL? <a href="#чи-вразливий-delta-chat-до-efail" class="anchor"></a>
</h3>
<p>Ні, <a href="https://delta.chat/en/2018-05-15-delta-chat-not-vulnerable-to-efail">ArcaneChat ніколи не був вразливим до EFAIL</a> тому що його реалізація OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a> використовує код виявлення модифікацій при шифруванні повідомлень і повертає <a href="https://docs.rs/pgp/latest/pgp/errors/enum.Error.html#variant.MdcError">помилку</a> якщо код виявлення модифікацій невірний.</p>
<p>Ні, <a href="https://delta.chat/en/2018-05-15-delta-chat-not-vulnerable-to-efail">Delta Chat ніколи не був вразливим до EFAIL</a> тому що його реалізація OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a> використовує код виявлення модифікацій при шифруванні повідомлень і повертає <a href="https://docs.rs/pgp/latest/pgp/errors/enum.Error.html#variant.MdcError">помилку</a> якщо код виявлення модифікацій невірний.</p>
<p>ArcaneChat також ніколи не був вразливим до EFAIL-атаки “Пряма ексфільтрація” тому що він розшифровує лише “багатокомпонентні/зашифровані” повідомлення, які містять рівно одну зашифровану і підписану частину, як визначено специфікацією Autocrypt Level 1.</p>
<p>Delta Chat також ніколи не був вразливим до EFAIL-атаки “Пряма ексфільтрація” тому що він розшифровує лише “багатокомпонентні/зашифровані” повідомлення, які містять рівно одну зашифровану і підписану частину, як визначено специфікацією Autocrypt Level 1.</p>
<h3 id="tls">
@@ -713,19 +717,19 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
<p>Навіть якщо ваші повідомлення не гарантовано зашифровані наскрізним шифруванням, вони все одно захищені від інтернет-провайдерів, таких як мобільні або кабельні компанії. Однак, ваші провайдери та провайдери електронної пошти одержувача можуть читати, аналізувати або навіть змінювати ваші повідомлення, включаючи будь-які вкладення, якщо вони не зашифровані наскрізним шифруванням.</p>
<p>За замовчуванням ArcaneChat використовує суворе <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS-шифрування</a> яке захищає з’єднання між вашим пристроєм і провайдером електронної пошти. Вся робота з TLS-шифруванням ArcaneChat пройшла незалежний <a href="#security-audits">аудит безпеки</a>. Крім того, з’єднання між вашим провайдером та провайдером електронної пошти одержувача зазвичай також шифрується при передачі даних. Якщо задіяні поштові сервери підтримують <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a> то між провайдерами електронної пошти буде застосовуватися транспортне шифрування в цьому випадку повідомлення ArcaneChat ніколи не будуть доступні в Інтернеті у вигляді відкритого тексту навіть якщо повідомлення не було наскрізь зашифровано.</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">
Як ArcaneChat захищає метадані у повідомленнях? <a href="#message-metadata" class="anchor"></a>
Як Delta Chat захищає метадані у повідомленнях? <a href="#message-metadata" class="anchor"></a>
</h3>
<p>ArcaneChat захищає більшість метаданих повідомлень, поміщаючи наступну інформацію в наскрізно зашифровану частину повідомлень:</p>
<p>Delta Chat захищає більшість метаданих повідомлень, поміщаючи наступну інформацію в наскрізно зашифровану частину повідомлень:</p>
<ul>
<li>Тема повідомлення</li>
@@ -748,7 +752,7 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
</h3>
<p>Як для захисту від поштових серверів, що збирають метадані, так і для захисту від загрози вилучення пристрою ми рекомендуємо використовувати оптимізований для ArcaneChat <a href="https://delta.chat/serverguide">екземпляр поштового сервера</a> для створення псевдонімних тимчасових акаунтів за допомогою сканування QR-коду. Зверніть увагу, що додатки ArcaneChat на всіх платформах підтримують кілька облікових записів тому ви можете легко використовувати “1-тижневі” або “1-місячні” акаунти поруч з вашим “основним” акаунтом знаючи, що всі дані тимчасових акаунтів разом з усіма метаданими будуть видалені. Більше того, якщо пристрій вилучається, то контакти, які використовують тимчасові електронні скриньки, не можуть бути легко ідентифіковані, на відміну від месенджерів, які розкривають телефонні номери в групах чату, які, в свою чергу, часто пов’язані з юридичними особами.</p>
<p>Як для захисту від поштових серверів, що збирають метадані, так і для захисту від загрози вилучення пристрою ми рекомендуємо використовувати оптимізований для Delta Chat <a href="https://delta.chat/serverguide">екземпляр поштового сервера</a> для створення псевдонімних тимчасових акаунтів за допомогою сканування QR-коду. Зверніть увагу, що додатки Delta Chat на всіх платформах підтримують кілька облікових записів тому ви можете легко використовувати “1-тижневі” або “1-місячні” акаунти поруч з вашим “основним” акаунтом знаючи, що всі дані тимчасових акаунтів разом з усіма метаданими будуть видалені. Більше того, якщо пристрій вилучається, то контакти, які використовують тимчасові електронні скриньки, не можуть бути легко ідентифіковані, на відміну від месенджерів, які розкривають телефонні номери в групах чату, які, в свою чергу, часто пов’язані з юридичними особами.</p>
<h3 id="як-перевірити-інформацію-про-шифрування">
@@ -758,7 +762,7 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
</h3>
<p>Ви можете перевірити стан наскрізного шифрування вручну в діалоговому вікні “Шифрування” (профіль користувача на Android/iOS або клацніть правою кнопкою миші на елементі списку чату користувача на робочому столі). ArcaneChat показує там два відбитки. Якщо на вашому пристрої та пристрої вашого співрозмовника з’являються однакові відбитки, з’єднання безпечне.</p>
<p>Ви можете перевірити стан наскрізного шифрування вручну в діалоговому вікні “Шифрування” (профіль користувача на Android/iOS або клацніть правою кнопкою миші на елементі списку чату користувача на робочому столі). Delta Chat показує там два відбитки. Якщо на вашому пристрої та пристрої вашого співрозмовника з’являються однакові відбитки, з’єднання безпечне.</p>
<h3 id="як-перевірити-стан-шифрування-повідомлень">
@@ -778,17 +782,17 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
</h3>
<p>Якщо контакт використовує поштову програму, яка не підтримує Autocrypt всі повідомлення за участю цього контакту (в групі або чаті 1:1) не будуть наскрізно зашифровані, а отже, не показуватимуть “висячого замка” з повідомленнями. Зверніть увагу, що навіть якщо ваші контакти використовують ArcaneChat у своєму акаунті, вони також можуть використовувати програму електронної пошти без функції шифрування, що може спричинити періодичні незашифровані повідомлення. Відповідати незашифрованими на незашифровані повідомлення вимагає Autocrypt щоб запобігти отриманню нечитабельних повідомлень на стороні ваших контактів та їхніх поштових програм, які не підтримують Autocrypt.</p>
<p>Якщо контакт використовує поштову програму, яка не підтримує Autocrypt всі повідомлення за участю цього контакту (в групі або чаті 1:1) не будуть наскрізно зашифровані, а отже, не показуватимуть “висячого замка” з повідомленнями. Зверніть увагу, що навіть якщо ваші контакти використовують Delta Chat у своєму акаунті, вони також можуть використовувати програму електронної пошти без функції шифрування, що може спричинити періодичні незашифровані повідомлення. Відповідати незашифрованими на незашифровані повідомлення вимагає Autocrypt щоб запобігти отриманню нечитабельних повідомлень на стороні ваших контактів та їхніх поштових програм, які не підтримують Autocrypt.</p>
<h3 id="як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt">
Як я можу отримати наскрізно зашифрований чат з контактом ArcaneChat, який іноді користується веб-поштою або іншим додатком електронної пошти, що не підтримує Autocrypt? <a href="#як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt" class="anchor"></a>
Як я можу отримати наскрізно зашифрований чат з контактом Delta Chat, який іноді користується веб-поштою або іншим додатком електронної пошти, що не підтримує Autocrypt? <a href="#як-я-можу-отримати-наскрізно-зашифрований-чат-з-контактом-delta-chat-який-іноді-користується-веб-поштою-або-іншим-додатком-електронної-пошти-що-не-підтримує-autocrypt" class="anchor"></a>
</h3>
<p>Якщо вам потрібен безпечний наскрізно зашифрований чат з контактом який використовує свій акаунт як у ArcaneChat, так і в інших додатках (наприклад, веб-пошті), що не підтримують автошифрування, найкраще налаштувати <a href="#howtoe2ee">гарантоване наскрізне шифрування з ними</a>, а потім створити груповий чат з гарантованим наскрізним шифруванням, учасниками якого будете ви двоє. У цьому груповому чаті всі повідомлення будуть наскрізно зашифровані навіть якщо в прямому чаті між вами буде <a href="#nocryptanymore">“… надіслано повідомлення з іншого пристрою”</a>.</p>
<p>Якщо вам потрібен безпечний наскрізно зашифрований чат з контактом який використовує свій акаунт як у Delta Chat, так і в інших додатках (наприклад, веб-пошті), що не підтримують автошифрування, найкраще налаштувати <a href="#howtoe2ee">гарантоване наскрізне шифрування з ними</a>, а потім створити груповий чат з гарантованим наскрізним шифруванням, учасниками якого будете ви двоє. У цьому груповому чаті всі повідомлення будуть наскрізно зашифровані навіть якщо в прямому чаті між вами буде <a href="#nocryptanymore">“… надіслано повідомлення з іншого пристрою”</a>.</p>
<h3 id="як-забезпечити-наскрізне-шифрування-та-видалення-повідомлень">
@@ -808,33 +812,33 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
<h3 id="pfs">
Чи підтримує ArcaneChat цілковиту пряму секретність (Perfect Forward Secrecy)? <a href="#pfs" class="anchor"></a>
Чи підтримує Delta Chat цілковиту пряму секретність (Perfect Forward Secrecy)? <a href="#pfs" class="anchor"></a>
</h3>
<p>Ні, ArcaneChat не підтримує ідеальну пряму секретність (PFS). Це означає, що якщо ваш приватний ключ дешифрування ArcaneChat витік, і хтось зібрав ваші попередні транзитні повідомлення, він зможе розшифрувати і прочитати їх за допомогою витоку ключа розшифрування.</p>
<p>Ні, Delta Chat не підтримує ідеальну пряму секретність (PFS). Це означає, що якщо ваш приватний ключ дешифрування Delta Chat витік, і хтось зібрав ваші попередні транзитні повідомлення, він зможе розшифрувати і прочитати їх за допомогою витоку ключа розшифрування.</p>
<p>Зауважте, однак, що якщо хтось отримає ваші ключі розшифрування, вони, як правило, також зможуть отримати ваші повідомлення, незалежно від того, чи працює Perfect Forward Secrecy чи ні. Типовою реальною ситуацією для витоку ключів дешифрування є вилучення пристрою яку ми обговорюємо в нашій відповіді <a href="#device-seizure">про метадані та вилучення пристрою</a>.</p>
<p>Можливо, що ArcaneChat розвивається для підтримки Perfect Forward Secrecy, тому що OpenPGP - це лише контейнер для зашифрованих повідомлень, але керування ключами шифрування (і, відповідно, ротація ключів або “храповик” ключів) може бути організоване у гнучкий спосіб. Дивіться <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">Прототип PFS від Seqouia</a> щодо існуючих експериментів у спільноті реалізаторів OpenPGP.</p>
<p>Можливо, що Delta Chat розвивається для підтримки Perfect Forward Secrecy, тому що OpenPGP - це лише контейнер для зашифрованих повідомлень, але керування ключами шифрування (і, відповідно, ротація ключів або “храповик” ключів) може бути організоване у гнучкий спосіб. Дивіться <a href="https://gitlab.com/sequoia-pgp/openpgp-dr">Прототип PFS від Seqouia</a> щодо існуючих експериментів у спільноті реалізаторів OpenPGP.</p>
<h3 id="чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal">
Чи є наскрізне шифрування ArcaneChat таким же безпечним, як Signal? <a href="#чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal" class="anchor"></a>
Чи є наскрізне шифрування Delta Chat таким же безпечним, як Signal? <a href="#чи-є-наскрізне-шифрування-delta-chat-таким-же-безпечним-як-signal" class="anchor"></a>
</h3>
<p>Це залежить від того, що для вас важливо. ArcaneChat <a href="#pfs">не підтримує PFS</a>, як Signal але він забезпечує <a href="#e2eeguarantee">гарантовано наскрізні зашифровані чати</a> які захищені від скомпрометованих серверів або пошкоджених мереж. Signal та більшість інших месенджерів, що підтримують PFS, не надають практичної схеми захисту чат-груп від мережевих атак які, можливо, викликають більше занепокоєння ніж потенційний зловмисник, який заволодіє вашим телефоном і приватними налаштуваннями шифрування, але чомусь не ваші повідомлення, але має повний запис усіх минулих зашифрованих повідомлень.</p>
<p>Це залежить від того, що для вас важливо. Delta Chat <a href="#pfs">не підтримує PFS</a>, як Signal але він забезпечує <a href="#e2eeguarantee">гарантовано наскрізні зашифровані чати</a> які захищені від скомпрометованих серверів або пошкоджених мереж. Signal та більшість інших месенджерів, що підтримують PFS, не надають практичної схеми захисту чат-груп від мережевих атак які, можливо, викликають більше занепокоєння ніж потенційний зловмисник, який заволодіє вашим телефоном і приватними налаштуваннями шифрування, але чомусь не ваші повідомлення, але має повний запис усіх минулих зашифрованих повідомлень.</p>
<p>У будь-якому випадку, наскрізне шифрування ArcaneChat використовує <a href="#openpgp-secure">безпечну підмножину OpenPGP</a> який пройшов <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">незалежний аудит безпеки</a>.</p>
<p>У будь-якому випадку, наскрізне шифрування Delta Chat використовує <a href="#openpgp-secure">безпечну підмножину OpenPGP</a> який пройшов <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">незалежний аудит безпеки</a>.</p>
<h3 id="чи-можна-повторно-використовувати-існуючий-закритий-ключ">
<h3 id="importkey">
Чи можна повторно використовувати існуючий закритий ключ? <a href="#чи-можна-повторно-використовувати-існуючий-закритий-ключ" class="anchor"></a>
Чи можна повторно використовувати існуючий закритий ключ? <a href="#importkey" class="anchor"></a>
</h3>
@@ -845,49 +849,59 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>Крім того, ви можете імпортувати ключ вручну в “Налаштування -&gt; Додаткові налаштування -&gt; Імпорт секретних ключів”. Застереження: Переконайтеся, що ключ не захищено паролем, або видаліть його заздалегідь.</p>
<p>Якщо у вас немає ключа або ви навіть не знаєте, що він вам знадобиться – не хвилюйтеся: ArcaneChat генерує ключі в міру необхідності, вам не потрібно натискати кнопку для цього.</p>
<p>Якщо у вас немає ключа або ви навіть не знаєте, що він вам знадобиться – не хвилюйтеся: Delta Chat генерує ключі в міру необхідності, вам не потрібно натискати кнопку для цього.</p>
<h3 id="я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat">
Я не можу імпортувати свій існуючий PGP ключ у ArcaneChat. <a href="#я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat" class="anchor"></a>
Я не можу імпортувати свій існуючий PGP ключ у Delta Chat. <a href="#я-не-можу-імпортувати-свій-існуючий-pgp-ключ-у-delta-chat" class="anchor"></a>
</h3>
<p>Найімовірнішою причиною є те, що ваш ключ зашифрований та/або використовується пароль. Такі ключі не підтримуються ArcaneChat. Ви можете видалити шифрування парольної фрази та пароль і спробувати імпорт знову.</p>
<p>Найімовірнішою причиною є те, що ваш ключ зашифрований та/або використовується пароль. Такі ключі не підтримуються Delta Chat. Ви можете видалити шифрування парольної фрази та пароль і спробувати імпорт знову.</p>
<p>Ще одна поширена помилка – неправильне закінчення файлу. Використовуйте захищений формат ASCII і закінчення файлу <code class="language-plaintext highlighter-rouge">.asc</code>.</p>
<p>ArcaneChat підтримує поширені формати приватних ключів OpenPGP, однак навряд чи приватні ключі з усіх джерел будуть повністю підтримуватися. Це не головна мета ArcaneChat. Фактично, більшість нових користувачів не матимуть жодного ключа до використання ArcaneChat. Однак ми намагаємось підтримувати приватні ключі з якомога більшої кількості джерел.</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>
<h3 id="security-audits">
Чи проходив ArcaneChat незалежний аудит на наявність вразливостей у безпеці? <a href="#security-audits" class="anchor"></a>
Чи проходив Delta Chat незалежний аудит на наявність вразливостей у безпеці? <a href="#security-audits" class="anchor"></a>
</h3>
<p>Проект ArcaneChat пройшов чотири незалежні аудити безпеки та один незалежний аналіз безпеки, від найновіших до найстаріших:</p>
<p>Так, багаторазово. Проект Delta Chat постійно проходить незалежні перевірки та аналіз безпеки, а саме, від останніх і закінчуючи старішими:</p>
<ul>
<li>
<p>2024 березня ми отримали глибокий аналіз безпеки від дослідницької групи Applied Cryptography дослідницької групи з прикладної криптографії в ETH Zuerich і вирішили всі порушені питання. Більш детальну інформацію можна знайти в нашому блозі в статті <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-end encryption</a>, а також в дослідженні <a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of ArcaneChat</a>, опублікованому пізніше.</p>
<p>2024 грудня відбулася <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">оцінка rPGP на замовлення NLNET</a> від <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a>. rPGP слугує рушієм наскрізного шифрування <a href="https://openpgp.org">OpenPGP</a> для Delta Chat. За результатами цього аудиту було випущено дві рекомендації:</p>
</li>
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv">“Паніка через неправильне ненадійне введення”</a> CVE-2024-53856</li>
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285">“Потенційне виснаження ресурсів під час обробки ненадійних повідомлень”</a> CVE-2024-53857</li>
</ul>
<p>Проблеми, описані в цих рекомендаціях, виправлено, і вони є частиною випусків Delta Chat у всіх магазинах додатків з грудня 2024 року.</p>
<ul>
<li>
<p>2024 березня ми отримали глибокий аналіз безпеки від дослідницької групи Applied Cryptography дослідницької групи з прикладної криптографії в ETH Zuerich і вирішили всі порушені питання. Більш детальну інформацію можна знайти в нашому блозі в статті <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-end encryption</a>, а також в дослідженні <a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>, опублікованому пізніше.</p>
</li>
<li>
<p>Починаючи з 2023 року, ми виправили проблеми з безпекою та конфіденційністю у функції “веб застосунків, що поширені у чаті”, пов’язані зі збоями в роботі пісочниці особливо в Chromium. Згодом ми отримали незалежний аудит безпеки аудит безпеки від Cure53, і всі знайдені проблеми були виправлені в серії додатків 1.36, випущених у квітні 2023 року. Повну історію про наскрізну безпеку в Інтернеті дивіться <a href="https://delta.chat/en/2023-05-22-webxdc-security">тут</a>.</p>
</li>
<li>
<p>Починаючи з 2023 року <a href="https://cure53.de">Cure53</a> проаналізував транспортне шифрування мережевих з’єднань ArcaneChat і відтворюване налаштування поштового сервера як <a href="https://delta.chat/uk/serverguide">рекомендовано на цьому сайті</a>. Ви можете прочитати більше про аудит <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">у нашому блозі</a> або прочитайте <a href="https://delta.chat/assets/blog/MER-01-report.pdf">повний звіт тут</a>.</p>
<p>Починаючи з 2023 року <a href="https://cure53.de">Cure53</a> проаналізував транспортне шифрування мережевих з’єднань Delta Chat і відтворюване налаштування поштового сервера як <a href="https://delta.chat/uk/serverguide">рекомендовано на цьому сайті</a>. Ви можете прочитати більше про аудит <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">у нашому блозі</a> або прочитайте <a href="https://delta.chat/assets/blog/MER-01-report.pdf">повний звіт тут</a>.</p>
</li>
<li>
<p>У 2020 році <a href="https://includesecurity.com">Include Security</a> проаналізувала Rust-<a href="https://github.com/deltachat/deltachat-core-rust/">ядро</a> ArcaneChat і бібліотеки <a href="https://github.com/async-email/async-imap">IMAP</a>, <a href="https://github.com/async-email/async-smtp">SMTP</a> та <a href="https://github.com/async-email/async-native-tls">TLS</a>. Він не виявив критичних або серйозних проблем. У звіті виявлено кілька слабких місць середнього ступеня тяжкості – вони самі по собі не становлять загрози для користувачів ArcaneChat оскільки вони залежать від середовища, у якому використовується ArcaneChat. З міркувань зручності використання та сумісності ми не можемо пом’якшити їх усі тому вирішили надати рекомендації щодо безпеки користувачам, яким загрожує небезпека. Ви можете прочитати <a href="https://delta.chat/assets/blog/2020-second-security-review.pdf">повний звіт тут</a>.</p>
<p>У 2020 році <a href="https://includesecurity.com">Include Security</a> проаналізувала Rust-<a href="https://github.com/deltachat/deltachat-core-rust/">ядро</a> Delta Chat і бібліотеки <a href="https://github.com/async-email/async-imap">IMAP</a>, <a href="https://github.com/async-email/async-smtp">SMTP</a> та <a href="https://github.com/async-email/async-native-tls">TLS</a>. Він не виявив критичних або серйозних проблем. У звіті виявлено кілька слабких місць середнього ступеня тяжкості – вони самі по собі не становлять загрози для користувачів Delta Chat оскільки вони залежать від середовища, у якому використовується Delta Chat. З міркувань зручності використання та сумісності ми не можемо пом’якшити їх усі тому вирішили надати рекомендації щодо безпеки користувачам, яким загрожує небезпека. Ви можете прочитати <a href="https://delta.chat/assets/blog/2020-second-security-review.pdf">повний звіт тут</a>.</p>
</li>
<li>
<p>У 2019 році <a href="https://includesecurity.com">Include Security</a> проаналізувала бібліотеки <a href="https://github.com/rpgp/rpgp">PGP</a> і <a href="https://github.com/RustCrypto/RSA">RSA</a> із ArcaneChat. Він не виявив критичних проблем, лише дві серйозні проблеми, які ми згодом виправили. Він також виявив одну проблему середньої тяжкості та кілька менш серйозних, але не було можливості використати ці вразливості в реалізації ArcaneChat. Деякі з них ми все ж усунули після завершення аудиту. Ви можете прочитати <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">повний звіт тут</a>.</p>
<p>У 2019 році <a href="https://includesecurity.com">Include Security</a> проаналізувала бібліотеки <a href="https://github.com/rpgp/rpgp">PGP</a> і <a href="https://github.com/RustCrypto/RSA">RSA</a> із Delta Chat. Він не виявив критичних проблем, лише дві серйозні проблеми, які ми згодом виправили. Він також виявив одну проблему середньої тяжкості та кілька менш серйозних, але не було можливості використати ці вразливості в реалізації Delta Chat. Деякі з них ми все ж усунули після завершення аудиту. Ви можете прочитати <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">повний звіт тут</a>.</p>
</li>
</ul>
@@ -902,12 +916,12 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<h3 id="чи-можна-використовувати-delta-chat-на-декількох-пристроях-одночасно">
Чи можна використовувати ArcaneChat на декількох пристроях одночасно? <a href="#чи-можна-використовувати-delta-chat-на-декількох-пристроях-одночасно" class="anchor"></a>
Чи можна використовувати Delta Chat на декількох пристроях одночасно? <a href="#чи-можна-використовувати-delta-chat-на-декількох-пристроях-одночасно" class="anchor"></a>
</h3>
<p>Так. ArcaneChat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
<p>Так. Delta Chat 1.36 comes with a new, experimental function for using the same profile on different devices:</p>
<ul>
<li>
@@ -917,10 +931,10 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>На першому пристрої перейдіть до <strong>Налаштування → Додати другий пристрій</strong>, розблокуйте екран, якщо потрібно і трохи зачекайте, поки не з’явиться QR-код</p>
</li>
<li>
<p>На другому пристрої <a href="https://get.delta.chat">встановіть ArcaneChat</a></p>
<p>На другому пристрої <a href="https://get.delta.chat">встановіть Delta Chat</a></p>
</li>
<li>
<p>На другому пристрої запустіть ArcaneChat, виберіть <strong>Додати як другий пристрій</strong> і відскануйте QR-код зі старого пристрою</p>
<p>На другому пристрої запустіть Delta Chat, виберіть <strong>Додати як другий пристрій</strong> і відскануйте QR-код зі старого пристрою</p>
</li>
<li>
<p>Передача має розпочатися через кілька секунд, і під час передачі обидва пристрої відображатимуть <strong>прогрес</strong>. Дочекайтеся завершення на обох пристроях.</p>
@@ -945,7 +959,13 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>У <strong>Windows</strong> перейдіть до <strong>Панель керування / Мережа та Інтернет</strong> і переконайтеся, що <strong>Приватна мережа</strong> вибрано як “Тип мережевого профілю” (після перенесення ви можете повернути початкове значення)</p>
</li>
<li>
<p>Ваша система може мати “персональний брандмауер”, який, як відомо, викликає проблеми (особливо у Windows). <strong>Вимкніть персональний брандмауер</strong> для ArcaneChat на обох кінцях і повторіть спробу</p>
<p>На <strong>iOS</strong> переконайтеся, що доступ до “Системні налаштування / Програми / Delta Chat / <strong>Локальна мережа</strong> дозволено</p>
</li>
<li>
<p>У <strong>macOS</strong> увімкніть “Системні налаштування / Конфіденційність і безпека / <strong>Локальна мережа</strong> / Delta Chat”</p>
</li>
<li>
<p>Ваша система може мати “персональний брандмауер”, який, як відомо, викликає проблеми (особливо у Windows). <strong>Вимкніть персональний брандмауер</strong> для Delta Chat на обох кінцях і повторіть спробу</p>
</li>
<li>
<p><strong>Гостьові мережі</strong> можуть не дозволяти пристроям зв’язуватися один з одним. Якщо можливо, використовуйте негостьову мережу.</p>
@@ -954,10 +974,10 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>Переконайтеся, що на цільовому пристрої <strong>достатньо пам’яті</strong></p>
</li>
<li>
<p>Якщо передача почалася, переконайтеся, що пристрої <strong>залишаються активними</strong> і не засинають. Не виходьте з ArcaneChat. (ми докладаємо всіх зусиль, щоб програма працювала у фоновому режимі, але <a href="https://dontkillmyapp.com">системи, як правило, вбивають програми</a>, на жаль)</p>
<p>Якщо передача почалася, переконайтеся, що пристрої <strong>залишаються активними</strong> і не засинають. Не виходьте з Delta Chat. (ми докладаємо всіх зусиль, щоб програма працювала у фоновому режимі, але <a href="https://dontkillmyapp.com">системи, як правило, вбивають програми</a>, на жаль)</p>
</li>
<li>
<p>ArcaneChat <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>
@@ -987,14 +1007,14 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<h3 id="чи-планується-впровадження-веб-клієнта-delta-chat">
Чи планується впровадження веб-клієнта ArcaneChat? <a href="#чи-планується-впровадження-веб-клієнта-delta-chat" class="anchor"></a>
Чи планується впровадження веб-клієнта Delta Chat? <a href="#чи-планується-впровадження-веб-клієнта-delta-chat" class="anchor"></a>
</h3>
<ul>
<li>Немає найближчих планів, крім попередніх думок.</li>
<li>Є 2-3 способи створити веб-клієнт ArcaneChat, але всі вони вимагають значної роботи. На даний момент ми зосереджені на отриманні стабільних релізів в усіх магазини додатків (Google Play / IOS / Windows / MacOS / репозитаріїв Linux), як нативних додатків.</li>
<li>Є 2-3 способи створити веб-клієнт Delta Chat, але всі вони вимагають значної роботи. На даний момент ми зосереджені на отриманні стабільних релізів в усіх магазини додатків (Google Play / IOS / Windows / MacOS / репозитаріїв Linux), як нативних додатків.</li>
<li>Якщо вам потрібен веб-клієнт, через заборону встановлювати програмне забезпечення на комп’ютері, з яким ви працюєте, ви можете використовувати портативний клієнт Windows Desktop або AppImage для Linux. Ви можете знайти їх на <a href="https://get.delta.chat">get.delta.chat</a>.</li>
</ul>
@@ -1006,7 +1026,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h2>
<p>У ArcaneChat ви можете ділитися <a href="https://webxdc.org">webxdc-додатками</a>, вкладеннями з розширенням <code class="language-plaintext highlighter-rouge">.xdc</code>. Вони можуть робити дуже різні речі, і роблять ArcaneChat справді розширюваним месенджером.</p>
<p>У Delta Chat ви можете ділитися <a href="https://webxdc.org">webxdc-додатками</a>, вкладеннями з розширенням <code class="language-plaintext highlighter-rouge">.xdc</code>. Вони можуть робити дуже різні речі, і роблять Delta Chat справді розширюваним месенджером.</p>
<h3 id="наскільки-приватними-є-додатки-webxdc">
@@ -1018,7 +1038,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<ul>
<li>Додатки webxdc не можуть надсилати дані в Інтернет або завантажувати щось.</li>
<li>Програма webxdc може обмінюватися даними лише в межах чату ArcaneChat з її копіями на пристроях ваших партнерів по чату. В іншому, вони повністю ізольовані від Інтернету.</li>
<li>Програма webxdc може обмінюватися даними лише в межах чату Delta Chat з її копіями на пристроях ваших партнерів по чату. В іншому, вони повністю ізольовані від Інтернету.</li>
<li>Конфіденційність, яку пропонує додаток webxdc, є конфіденційністю вашого чату - доки ви довіряєте людям, з якими ви спілкуєтеся, ви можете довіряти і додатку webxdc.</li>
<li>Це також означає, що відкриття додатків webxdc в чатах, де ви не довіряєте учасникам, як ви знаєте з вкладень в електронній пошті, де ви відкриваєте вкладення тільки від відправників, яким довіряєте, а не від спамерів.</li>
</ul>
@@ -1032,9 +1052,11 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h3>
<ul>
<li>Загалом, будь-хто може ділитися додатками webxdc один з одним один з одним без обмежень.</li>
<li>Ви можете <a href="https://delta.chat/en/2023-08-11-xstore">надіслати “hi” на xstore@testrun.org</a> щоб побачити експериментальний магазин додатків webxdc. Всі програми мають відкритий вихідний код і є безкоштовними.</li>
<li>Багато людей пишуть власні програми для webxdc і публікують їх на <a href="https://support.delta.chat/c/webxdc/20">форумі ArcaneChat</a>.</li>
<li>Загалом, будь-хто може ділитися додатками webxdc один з одним без обмежень.</li>
<li>З <a href="https://webxdc.org/apps/">webxdc.org/apps</a>.</li>
<li>Ви можете <a href="https://delta.chat/en/2023-08-11-xstore">надіслати “привіт” на xstore@testrun.org</a> щоб побачити експериментальний магазин додатків webxdc.
Всі програми мають відкритий вихідний код і є безкоштовними.</li>
<li>Багато людей пишуть власні програми webxdc і публікують їх на <a href="https://support.delta.chat/c/webxdc/20">форумі Delta Chat</a>.</li>
</ul>
<h3 id="як-я-можу-створювати-власні-програми-webxdc">
@@ -1049,7 +1071,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<li>Програми webxdc - це просто zip-файли, що містять код html, css і javascript.</li>
<li>Ви можете розширити <a href="https://github.com/webxdc/hello">Приклад програми Hello World</a> щоб розпочати роботу.</li>
<li>Все інше, що вам потрібно знати, описано у <a href="https://docs.webxdc.org/">документації</a>.</li>
<li>Якщо у вас є запитання, ви можете задати їх іншим користувачам на <a href="https://support.delta.chat/c/webxdc/20">форумі ArcaneChat</a>.</li>
<li>Якщо у вас є запитання, ви можете задати їх іншим користувачам на <a href="https://support.delta.chat/c/webxdc/20">форумі Delta Chat</a>.</li>
</ul>
<h2 id="експериментальні-функції">
@@ -1060,19 +1082,19 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h2>
<p>Ми дуже вдячні за відгуки про ці функції – ви хочете поділитися своїми ідеями? Приєднуйтесь до <a href="https://support.delta.chat">Форуму</a>, щоб зробити свій внесок. Ви можете зручно увійти за допомогою ArcaneChat та сканування QR-коду, ще один досить стабільний експеримент, який ми проводимо на стороні (sic!).</p>
<p>Ми дуже вдячні за відгуки про ці функції – ви хочете поділитися своїми ідеями? Приєднуйтесь до <a href="https://support.delta.chat">Форуму</a>, щоб зробити свій внесок. Ви можете зручно увійти за допомогою Delta Chat та сканування QR-коду, ще один досить стабільний експеримент, який ми проводимо на стороні (sic!).</p>
<h3 id="як-я-можу-робити-аудіовідеодзвінки-з-delta-chat">
Як я можу робити аудіо/відеодзвінки з ArcaneChat? <a href="#як-я-можу-робити-аудіовідеодзвінки-з-delta-chat" class="anchor"></a>
Як я можу робити аудіо/відеодзвінки з Delta Chat? <a href="#як-я-можу-робити-аудіовідеодзвінки-з-delta-chat" class="anchor"></a>
</h3>
<ul>
<li>Щоб увімкнути аудіо/відеодзвінки, перейдіть до розділу “Експериментальні функції” в додаткових налаштуваннях і виберіть “Екземпляр відеочату”.</li>
<li>Коли ви запрошуєте інших до відеочату, він відкривається у вашому браузері/додатку одразу. Інші користувачі отримують електронний лист із посиланням на відеочат. Таким чином, він також сумісний, якщо ваші партнери по чату не використовують ArcaneChat.</li>
<li>Коли ви запрошуєте інших до відеочату, він відкривається у вашому браузері/додатку одразу. Інші користувачі отримують електронний лист із посиланням на відеочат. Таким чином, він також сумісний, якщо ваші партнери по чату не використовують Delta Chat.</li>
<li>Зверніть увагу, що на іншій стороні немає мелодії дзвінка, і ваші партнери по чату не будуть перервані запрошенням до відеочату.</li>
<li>Ви можете використовувати будь-який сервіс відеочату, який дозволяє приєднуватися за посиланням. Просто додайте посилання в налаштуваннях.</li>
<li>Наприклад, щоб використовувати флагманський екземпляр Jitsi Meet, ви можете ввести <code class="language-plaintext highlighter-rouge">https://meet.jit.si/$ROOM</code>. Змінна <code class="language-plaintext highlighter-rouge">$ROOM</code> буде випадковою величиною; таким чином, ви матимете нову випадкову кімнату jitsi щоразу, коли телефонуватимете комусь.</li>
@@ -1119,7 +1141,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h3>
<p>Це експериментальне налаштування для деяких людей, які експериментують з правилами на стороні сервера. Не всі провайдери підтримують це, але деякі дозволятимуть перемістити всі листи із заголовком “Chat-Version” до папки DeltaChat. Зазвичай це робиться додатком ArcaneChat.</p>
<p>Це експериментальне налаштування для деяких людей, які експериментують з правилами на стороні сервера. Не всі провайдери підтримують це, але деякі дозволятимуть перемістити всі листи із заголовком “Chat-Version” до папки DeltaChat. Зазвичай це робиться додатком Delta Chat.</p>
<p>Увімкнення «Отримувати лише з папки DeltaChat» має сенс, якщо у вас є <strong>обидва</strong>:</p>
@@ -1128,7 +1150,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<li>встановлено параметр “Показувати класичні електронні листи” у значення “ні, лише чати”.</li>
</ul>
<p>У цьому випадку ArcaneChat не потрібно стежити за папкою «Вхідні», а достатньо лише стежити за папкою DeltaChat.</p>
<p>У цьому випадку Delta Chat не потрібно стежити за папкою «Вхідні», а достатньо лише стежити за папкою DeltaChat.</p>
<h3 id="як-я-можу-змінити-мій-обліковий-запис-на-іншу-адресу-електронної-пошти">
@@ -1150,7 +1172,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</li>
</ol>
<p>Зверніть увагу, що ArcaneChat більше не буде отримувати повідомлення від вашого старого провайдера електронної пошти. Якщо ви не налаштували пересилання повідомлень (крок 2) тільки ті контакти, яким ви надіслали повідомлення в гарантованому наскрізному зашифрованому чаті отримуватимуть повідомлення на вашу нову адресу.</p>
<p>Зверніть увагу, що Delta Chat більше не буде отримувати повідомлення від вашого старого провайдера електронної пошти. Якщо ви не налаштували пересилання повідомлень (крок 2) тільки ті контакти, яким ви надіслали повідомлення в гарантованому наскрізному зашифрованому чаті отримуватимуть повідомлення на вашу нову адресу.</p>
<p>Щоб дізнатися більше про деталі, які стоять за цим, <a href="https://delta.chat/en/2022-09-14-aeap">прочитайте нашу публікацію в блозі</a>.</p>
@@ -1165,7 +1187,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<h3 id="яких-дозволів-потребує-delta-chat">
Яких дозволів потребує ArcaneChat? <a href="#яких-дозволів-потребує-delta-chat" class="anchor"></a>
Яких дозволів потребує Delta Chat? <a href="#яких-дозволів-потребує-delta-chat" class="anchor"></a>
</h3>
@@ -1203,7 +1225,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<li>Інші можливості програми
<ul>
<li>зміна налаштувань звуку: вибір мелодії дзвінка та гучності для сповіщень і звукових повідомлень</li>
<li>запуск при запуску: щоб вам не потрібно було запускати ArcaneChat вручну</li>
<li>запуск при запуску: щоб вам не потрібно було запускати Delta Chat вручну</li>
<li>керувати вібрацією: для сповіщень</li>
<li>переглядати мережеві з’єднання: для підключення до вашого поштового провайдера</li>
<li>не виводити телефон зі сплячого режиму: щоб вам було легше скопіювати код безпеки під час повідомлення про встановлення автошифрування</li>
@@ -1217,7 +1239,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<h3 id="чи-підтримує-delta-chat-роботу-з-моїм-провайдером-електронної-пошти">
Чи підтримує ArcaneChat роботу з <em>моїм</em> провайдером електронної пошти? <a href="#чи-підтримує-delta-chat-роботу-з-моїм-провайдером-електронної-пошти" class="anchor"></a>
Чи підтримує Delta Chat роботу з <em>моїм</em> провайдером електронної пошти? <a href="#чи-підтримує-delta-chat-роботу-з-моїм-провайдером-електронної-пошти" class="anchor"></a>
</h3>
@@ -1230,7 +1252,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<h3 id="я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите">
Я хочу керувати власним сервером електронної пошти для ArcaneChat. Що ви порадите? <a href="#я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите" class="anchor"></a>
Я хочу керувати власним сервером електронної пошти для Delta Chat. Що ви порадите? <a href="#я-хочу-керувати-власним-сервером-електронної-пошти-для-delta-chat-що-ви-порадите" class="anchor"></a>
</h3>
@@ -1243,37 +1265,37 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<h3 id="чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-delta-chat-чи-це-безпечно">
Чому я маю вводити пароль до моєї електронної пошти у ArcaneChat? Чи це безпечно? <a href="#чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-delta-chat-чи-це-безпечно" class="anchor"></a>
Чому я маю вводити пароль до моєї електронної пошти у Delta Chat? Чи це безпечно? <a href="#чому-я-маю-вводити-пароль-до-моєї-електронної-пошти-у-delta-chat-чи-це-безпечно" class="anchor"></a>
</h3>
<p>Як і інші поштові програми, такі як Thunderbird, K9-Mail або Outlook, програма програма потребує пароля, щоб ви могли використовувати її для надсилання листів. Звичайно, пароль пароль зберігається лише на вашому пристрої. Пароль передається лише вашому поштовому провайдеру (коли ви входите в систему), який і так має доступ до вашої пошти.</p>
<p>Оскільки ArcaneChat має відкритий код, ви можете ознайомитись із <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/deltachat/deltachat-core-rust/blob/master/src/login_param.rs">початковим кодом</a> якщо бажаєте перевірити що ваші дані для авторизації надійно зберігаються. Ми будемо раді вашим пропозиціям, які зроблять додаток більш безпечним для всіх користувачів.</p>
<h3 id="які-повідомлення-відображаються-у-delta-chat">
Які повідомлення відображаються у ArcaneChat? <a href="#які-повідомлення-відображаються-у-delta-chat" class="anchor"></a>
Які повідомлення відображаються у Delta Chat? <a href="#які-повідомлення-відображаються-у-delta-chat" class="anchor"></a>
</h3>
<p>За замовчуванням ArcaneChat відображає всі електронні листи.</p>
<p>За замовчуванням Delta Chat відображає всі електронні листи.</p>
<p>У “Налаштування → Додатково → Показувати класичні електронні листи”, ви можете змінити цей параметр. У вас є такі варіанти:</p>
<ul>
<li>«Ні, лише чати»: лише повідомлення, надіслані іншими користувачами ArcaneChat, і відповіді на них відображаються ваші повідомлення ArcaneChat. Це має найбільший сенс, якщо ви використовуєте той самий обліковий запис електронної пошти також для звичайної електронної пошти.</li>
<li>«Усі»: ArcaneChat показує всі електронні листи, надіслані на вашу електронну адресу. Це має сенс, якщо ви хочете використовувати ArcaneChat для всіх ваших електронних листів, тому жодних повідомлень не губиться. Це налаштування за замовчуванням.</li>
<li>«Для прийнятих контактів»: ArcaneChat показує всі електронні листи від контактів, з ким у вас уже є чат, але нові чати з’являються лише для повідомлень ArcaneChat. Це допоможе вирішити в кожному конкретному випадку, чи бажаєте ви мати a розмова в ArcaneChat або в «звичайній» програмі електронної пошти.</li>
<li>«Ні, лише чати»: лише повідомлення, надіслані іншими користувачами Delta Chat, і відповіді на них відображаються ваші повідомлення Delta Chat. Це має найбільший сенс, якщо ви використовуєте той самий обліковий запис електронної пошти також для звичайної електронної пошти.</li>
<li>«Усі»: Delta Chat показує всі електронні листи, надіслані на вашу електронну адресу. Це має сенс, якщо ви хочете використовувати Delta Chat для всіх ваших електронних листів, тому жодних повідомлень не губиться. Це налаштування за замовчуванням.</li>
<li>«Для прийнятих контактів»: Delta Chat показує всі електронні листи від контактів, з ким у вас уже є чат, але нові чати з’являються лише для повідомлень Delta Chat. Це допоможе вирішити в кожному конкретному випадку, чи бажаєте ви мати a розмова в Delta Chat або в «звичайній» програмі електронної пошти.</li>
</ul>
<h3 id="чи-підтримує-delta-chat-html-листи">
Чи підтримує ArcaneChat HTML-листи? <a href="#чи-підтримує-delta-chat-html-листи" class="anchor"></a>
Чи підтримує Delta Chat HTML-листи? <a href="#чи-підтримує-delta-chat-html-листи" class="anchor"></a>
</h3>
@@ -1283,14 +1305,14 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<h3 id="чи-можу-я-встановити-тему-листа-в-delta-chat">
Чи можу я встановити тему листа в ArcaneChat? <a href="#чи-можу-я-встановити-тему-листа-в-delta-chat" class="anchor"></a>
Чи можу я встановити тему листа в Delta Chat? <a href="#чи-можу-я-встановити-тему-листа-в-delta-chat" class="anchor"></a>
</h3>
<p>ArcaneChat встановлює (і <a href="#message-metadata">шифрує</a>!) класичну тему електронного листа автоматично на назву групи або на ім’я відправника.</p>
<p>Delta Chat встановлює (і <a href="#message-metadata">шифрує</a>!) класичну тему електронного листа автоматично на назву групи або на ім’я відправника.</p>
<p>Тож якщо ви хочете встановити тему самостійно, наприклад, для офіційного електронного листа діловому контакту, ви можете створити групу в якій будете лише ви та одержувач(і). Встановіть у заголовку чату потрібну тему, а потім надішліть свій електронний лист як перше повідомлення. Якщо одержувачі не використовують ArcaneChat, він буде виглядати як звичайний формальний електронний лист. Ви отримаєте бонусні бали за професіоналізм якщо ви встановите <a href="#signature">текст підпису</a>.</p>
<p>Тож якщо ви хочете встановити тему самостійно, наприклад, для офіційного електронного листа діловому контакту, ви можете створити групу в якій будете лише ви та одержувач(і). Встановіть у заголовку чату потрібну тему, а потім надішліть свій електронний лист як перше повідомлення. Якщо одержувачі не використовують Delta Chat, він буде виглядати як звичайний формальний електронний лист. Ви отримаєте бонусні бали за професіоналізм якщо ви встановите <a href="#signature">текст підпису</a>.</p>
<h3 id="для-чого-потрібне-налаштування-відправити-копію-собі">
@@ -1302,7 +1324,7 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>Надсилаючи собі копію своїх повідомлень, ви отримуєте власні повідомлення на всіх пристроях. Якщо у вас кілька пристроїв, і ви не вмикаєте це налаштування, ви бачите лише повідомлення інших людей та повідомлення, які ви надсилаєте з поточного пристрою.</p>
<p>Копія надсилається у папку Вхідні, а потім переміщується до папки DeltaChat; вона не поміщається в папку «Відправлені». ArcaneChat <em>ніколи</em> не завантажує нічого в папку Надіслане, оскільки це означало б завантаження повідомлень двічі (один раз через SMTP і один раз через IMAP до папки Надіслані).</p>
<p>Копія надсилається у папку Вхідні, а потім переміщується до папки DeltaChat; вона не поміщається в папку «Відправлені». Delta Chat <em>ніколи</em> не завантажує нічого в папку Надіслане, оскільки це означало б завантаження повідомлень двічі (один раз через SMTP і один раз через IMAP до папки Надіслані).</p>
<p>За замовчуванням для параметра “Надіслати копію собі” встановлено значення “увімкнено”.</p>
@@ -1314,9 +1336,9 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h3>
<p>Єдина причина, через яку захочеться стежити за папкою Надіслане, полягає в тому, що якщо ви використовуєте іншу поштову програму (наприклад, Thunderbird) разом із вашим додатком ArcaneChat і хочете, щоб ваш поштовий клієнт брав участь у розмовах.</p>
<p>Єдина причина, через яку захочеться стежити за папкою Надіслане, полягає в тому, що якщо ви використовуєте іншу поштову програму (наприклад, Thunderbird) разом із вашим додатком Delta Chat і хочете, щоб ваш поштовий клієнт брав участь у розмовах.</p>
<p>Однак ми рекомендуємо використовувати клієнт ArcaneChat Desktop; Ви можете завантажити його на <a href="https://get.delta.chat">get.delta.chat</a>. Можливість стеження папки “Надіслане” може зникнути в майбутньому. Вона був представлена у той час, коли на всіх платформах ще не було клієнта ArcaneChat Desktop.</p>
<p>Однак ми рекомендуємо використовувати клієнт Delta Chat Desktop; Ви можете завантажити його на <a href="https://get.delta.chat">get.delta.chat</a>. Можливість стеження папки “Надіслане” може зникнути в майбутньому. Вона був представлена у той час, коли на всіх платформах ще не було клієнта Delta Chat Desktop.</p>
<h3 id="чому-я-можу-відмовитись-від-стеження-за--папкою-deltachat">
@@ -1326,35 +1348,41 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
</h3>
<p>Деякі люди використовують ArcaneChat як звичайний поштовий клієнт і хочуть використовувати папку Вхідні для своєї пошти замість папки DeltaChat. Якщо ви вимкнете “Перегляд папки DeltaChat”, вам слід також вимкнути “переміщення повідомлень чату до DeltaChat”.
<p>Деякі люди використовують Delta Chat як звичайний поштовий клієнт і хочуть використовувати папку Вхідні для своєї пошти замість папки DeltaChat. Якщо ви вимкнете “Перегляд папки DeltaChat”, вам слід також вимкнути “переміщення повідомлень чату до DeltaChat”.
В іншому випадку видалення повідомлень або налаштування декількох пристроїв може не працювати належним чином.</p>
<h3 id="чи-сумісний-delta-chat-із-protonmail--tutanota--criptext">
Чи сумісний ArcaneChat із Protonmail / Tutanota / Criptext? <a href="#чи-сумісний-delta-chat-із-protonmail--tutanota--criptext" class="anchor"></a>
Чи сумісний Delta Chat із Protonmail / Tutanota / Criptext? <a href="#чи-сумісний-delta-chat-із-protonmail--tutanota--criptext" class="anchor"></a>
</h3>
<ul>
<li>Так і ні.</li>
<li>Ні, ви не можете використовувати свій обліковий запис Protonmail, Tutanota або Criptext у ArcaneChat; вони не пропонують отримання листів через IMAP.</li>
<li>У будь-якому випадку, ви можете використовувати ArcaneChat для надсилання повідомлень людям, які користуються Protonmail, Tutanota або Criptext. Ці повідомлення не будуть наскрізно зашифрованими. Наскрізне шифрування, яке пропонують ці провайдери, не є сумісним з <a href="https://autocrypt.org/">Autocrypt</a>, стандартним шифруванням, яке використовує ArcaneChat.</li>
<li>ArcaneChat може наскрізно шифрувати через будь-якого провайдера електронної пошти з будь-якою <a href="https://autocrypt.org/dev-status.html">поштовою програмою з підтримкою автошифрування</a>.</li>
<li>Ні, ви не можете використовувати свій обліковий запис Protonmail, 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>
<h3 id="як-мені-видалити-свій-обліковий-запис">
<h3 id="remove-account">
Як мені видалити свій обліковий запис? <a href="#як-мені-видалити-свій-обліковий-запис" class="anchor"></a>
Як мені видалити свій обліковий запис? <a href="#remove-account" class="anchor"></a>
</h3>
<p>Оскільки ви використовуєте обліковий запис електронної пошти для ArcaneChat, спосіб видалення облікового запису залежить від вашого постачальника послуг електронної пошти. Ми не маємо жодного контролю над вашим обліковим записом електронної пошти, тому, на жаль, ми не можемо вам у цьому допомогти.</p>
<p>Якщо ви використовуєте стандартний профіль чату, ви можете просто видалити застосунок. Це автоматично запустить видалення всіх пов’язаних даних облікового запису на сервері chatmail. Для отримання додаткової інформації, будь ласка, зверніться до сторінки <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org account-deletion</a> для стандартного сервера реєстрації або до відповідної сторінки вашого <a href="https://delta.chat/chatmail">стороннього сервера chatmail</a>.</p>
<p>Якщо ви хочете зберегти обліковий запис, але видалити ArcaneChat, перед видаленням ArcaneChat рекомендується покинути будь-які групові чати.</p>
<p>Якщо ви налаштували свій профіль чату на декількох пристроях вам потрібно видалити його з усіх пристроїв.</p>
<p>Якщо ви використовуєте більше одного облікового запису, але не хочете видаляти всі, ви можете видалити окремий запис у меню перемикання акаунтів (на Android та iOS) або в боковій панелі за допомогою правого кліку (в настільному клієнті).</p>
<p>Облікові записи на <a href="https://providers.delta.chat">класичних e-mail провайдерах</a> не будуть видалені автоматично; спосіб видалення облікового запису залежить від вашого e-mail провайдера. Ми не маємо контролю над обліковими записами у таких провайдерів, тому, на жаль, не можемо допомогти вам у цьому питанні.</p>
<p>Якщо ви хочете продовжувати використовувати класичний e-mail обліковий запис з іншими застосунками, але плануєте видалити Delta Chat, рекомендується вийти з усіх групових чатів перед видаленням Delta Chat. В іншому випадку ви можете отримувати повідомлення з цих групових чатів, які не зможете розшифрувати.</p>
<h3 id="мене-цікавлять-технічні-деталі-можете-розповісти-більше">
@@ -1365,20 +1393,48 @@ 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">Стандарти, що використовуються у ArcaneChat</a>.</li>
<li>Дивіться <a href="https://github.com/deltachat/deltachat-core-rust/blob/master/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</li>
</ul>
<h3 id="де-мої-друзі-можуть-знайти-delta-chat">
Де мої друзі можуть знайти Delta Chat? <a href="#де-мої-друзі-можуть-знайти-delta-chat" class="anchor"></a>
</h3>
<p>Delta Chat доступний для всіх основних і деяких другорядних платформ:</p>
<ul>
<li>
<p>На <strong>офіційному сайті</strong>, <a href="https://delta.chat/download">https://delta.chat/download</a> детально описані всі варіанти</p>
</li>
<li>
<p>Якщо вона недоступна, скористайтеся <strong>дзеркалом</strong> за адресою <a href="https://deltachat.github.io/deltachat-pages">https://deltachat.github.io/deltachat-pages</a></p>
</li>
<li>
<p>Відкрийте один з наступних <strong>магазинів додатків і введіть у пошук “Delta Chat”:</strong> Google Play Store, F-Droid, Huawei App Gallery, Amazon App Store, iOS та macOS App Store, Microsoft Store</p>
</li>
<li>
<p>Перевірте <strong>менеджер пакунків</strong> вашого дистрибутива Linux</p>
</li>
<li>
<p><strong>APK для Android</strong> також доступні на <a href="https://github.com/deltachat/deltachat-android/releases">https://github.com/deltachat/deltachat-android/releases</a></p>
</li>
</ul>
<h3 id="як-фінансується-розробка-delta-chat">
Як фінансується розробка ArcaneChat? <a href="#як-фінансується-розробка-delta-chat" class="anchor"></a>
Як фінансується розробка Delta Chat? <a href="#як-фінансується-розробка-delta-chat" class="anchor"></a>
</h3>
<p>ArcaneChat не отримує жодного Венчурного Капіталу і не є в боргу, не знаходиться під тиском отримання значних прибутків, або продажу користувачів і їхніх друзів з родиною рекламодавцям (або гірше). Ми скоріше використовуємо джерела державного фінансування поки що від ЄС та США, щоб допомогти нашим зусиллям у створенні децентралізованої та різноманітної екосистеми обміну повідомленнями на основі вільного та відкритого коду спільноти розробників</p>
<p>Delta Chat не отримує жодного Венчурного Капіталу і не є в боргу, не знаходиться під тиском отримання значних прибутків, або продажу користувачів і їхніх друзів з родиною рекламодавцям (або гірше). Ми скоріше використовуємо джерела державного фінансування поки що від ЄС та США, щоб допомогти нашим зусиллям у створенні децентралізованої та різноманітної екосистеми обміну повідомленнями на основі вільного та відкритого коду спільноти розробників</p>
<p>Конкретно, розробки ArcaneChat поки що фінансуються з цих джерел:</p>
<p>Конкретно, розробка Delta Chat на сьогодні фінансувалися з наступних джерел, в хронологічному порядку:</p>
<ul>
<li>
@@ -1398,31 +1454,31 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
<p>Фонд <a href="https://nlnet.nl/">NLnet</a> виділив у 2019/2020 роках 46 тисяч євро на
завершення прив’язок Rust/Python та запуск екосистеми чат-ботів.</p>
</li>
</ul>
<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>
<ul>
<li>
<p>З кінця 2021 до березня 2023 року ми отримували фінансування <em>Internet Freedom</em> (500 тис. дол. США) від Бюро США з питань демократії, прав людини та праці (DRL). Це фінансування підтримало наші довгострокові цілі зробити ArcaneChat більш зручним для використання і сумісним з широким спектром серверів електронної пошти по всьому світу, більш стійким і безпечним в місцях, які постраждали від інтернет-цензури та відключення інтернету.</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>На початку 2023 року нас прийняли в Next Generation Internet (NGI)
Entrust program для наших пропозицій щодо «Приватних децентралізованих додатків». Точна сума буде визначена (близько 100 тис. євро). Це фінансування підтримує подальший розвиток <a href="https://webxdc.org">webxdc “додатків, якими діляться в чаті”</a>.</p>
<p>З кінця 2021 до березня 2023 року ми отримували фінансування <em>Internet Freedom</em> (500 тис. дол. США) від Бюро США з питань демократії, прав людини та праці (DRL). Це фінансування підтримало наші довгострокові цілі зробити Delta Chat більш зручним для використання і сумісним з широким спектром серверів електронної пошти по всьому світу, більш стійким і безпечним в місцях, які постраждали від інтернет-цензури та відключення інтернету.</p>
</li>
</ul>
<li>
<p>У 2023-2024 роках ми успішно завершили проєкт <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail</a>, що фінансувався OTF, що дозволило нам запровадити гарантоване шифрування, створити <a href="https://delta.chat/chatmail">мережу серверів chatmail</a> та забезпечити “миттєву реєстрацію” у всіх застосунках, випущених з квітня 2024 року.</p>
</li>
<li>
<p>У 2023 та 2024 роках нас прийняли до програми Next Generation Internet (NGI) за нашу роботу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>, а також у співпраці з партнерами, які працюють над <a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>, <a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>, <a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> та <a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>. Усі ці проєкти частково завершені або будуть завершені на початку 2025 року.</p>
</li>
<li>
<p>Іноді ми отримуємо одноразові пожертви від приватних осіб. Наприклад, у 2021 році щедра приватна особа перерахував нам 4 тис. євро з повідомленням «так тримати!». 💜 Ми використовуємо такі пожертви для фінансування зборів на розвиток або для тимчасових витрат, які важко передбачити або відшкодувати за рахунок грантів державного фінансування. Отримання більшої кількості пожертв також допомагає нам стати більш незалежними та довгостроково життєздатними як спільнота контриб’юторів.</p>
<p>– Іноді ми отримуємо одноразові пожертви від приватних осіб. Наприклад, у 2021 році щедра приватна особа перерахував нам 4 тис. євро з повідомленням «так тримати!». 💜 Ми використовуємо такі пожертви для фінансування зборів на розвиток або для тимчасових витрат, які важко передбачити або відшкодувати за рахунок грантів державного фінансування. Отримання більшої кількості пожертв також допомагає нам стати більш незалежними та довгостроково життєздатними як спільнота контриб’юторів.</p>
<ul>
<li>Кілька експертів та ентузіастів, які працюють на громадських засадах, сприяли розробці програми ArcaneChat, не отримуючи грошей або лише невеликі суми. Без них ArcaneChat не був би там, де є сьогодні, навіть близько.</li>
</li>
<li>
<p>Кілька експертів та ентузіастів, які працюють на громадських засадах, сприяли розробці програми Delta Chat, не отримуючи грошей або лише невеликі суми. Без них Delta Chat не був би там, де є сьогодні, навіть близько.</p>
</li>
</ul>
<p>Зазначене вище грошове фінансування в основному організовано компанією merlinux GmbH у Фрайбурзі (Німеччина) і розподілено між більше ніж дюжиною розробників по всьому світу.</p>
<p>Перегляньте <a href="https://delta.chat/uk/contribute">канали контрибуції ArcaneChat</a> як для грошових, так і для інших можливостей допомоги.</p>
<p>Перегляньте <a href="https://delta.chat/uk/contribute">канали контрибуції Delta Chat</a> як для грошових, так і для інших можливостей допомоги.</p>
File diff suppressed because it is too large Load Diff
Binary file not shown.
@@ -33,8 +33,8 @@ public class DcAccounts {
public native void stopIo ();
public native void maybeNetwork ();
public native void setPushDeviceToken (String token);
public native boolean backgroundFetch (int timeoutSeconds);
public native int addAccount ();
public native int migrateAccount (String dbfile);
public native boolean removeAccount (int accountId);
public native int[] getAll ();
+33 -43
View File
@@ -2,16 +2,14 @@ package com.b44t.messenger;
public class DcContext {
public final static int DC_PREF_DEFAULT_MDNS_ENABLED = 1;
public final static int DC_PREF_DEFAULT_TRIM_ENABLED = 0;
public final static int DC_PREF_DEFAULT_TRIM_LENGTH = 500;
public final static int DC_EVENT_INFO = 100;
public final static int DC_EVENT_WARNING = 300;
public final static int DC_EVENT_ERROR = 400;
public final static int DC_EVENT_ERROR_SELF_NOT_IN_GROUP = 410;
public final static int DC_EVENT_MSGS_CHANGED = 2000;
public final static int DC_EVENT_REACTIONS_CHANGED = 2001;
public final static int DC_EVENT_INCOMING_REACTION = 2002;
public final static int DC_EVENT_INCOMING_WEBXDC_NOTIFY = 2003;
public final static int DC_EVENT_INCOMING_MSG = 2005;
public final static int DC_EVENT_MSGS_NOTICED = 2008;
public final static int DC_EVENT_MSG_DELIVERED = 2010;
@@ -19,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;
@@ -31,6 +30,7 @@ public class DcContext {
public final static int DC_EVENT_WEBXDC_STATUS_UPDATE = 2120;
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_IMEX_EXPORT_SELF_KEYS = 1;
public final static int DC_IMEX_IMPORT_SELF_KEYS = 2;
@@ -52,9 +52,10 @@ public class DcContext {
public final static int DC_QR_FPR_MISMATCH = 220;
public final static int DC_QR_FPR_WITHOUT_ADDR = 230;
public final static int DC_QR_ACCOUNT = 250;
public final static int DC_QR_BACKUP = 251;
public final static int DC_QR_BACKUP2 = 252;
public final static int DC_QR_BACKUP_TOO_NEW = 255;
public final static int DC_QR_WEBRTC = 260;
public final static int DC_QR_PROXY = 271;
public final static int DC_QR_ADDR = 320;
public final static int DC_QR_TEXT = 330;
public final static int DC_QR_URL = 332;
@@ -80,18 +81,15 @@ public class DcContext {
public final static int DC_MEDIA_QUALITY_BALANCED = 0;
public final static int DC_MEDIA_QUALITY_WORSE = 1;
public final static int DC_DECISION_START_CHAT = 0;
public final static int DC_DECISION_BLOCK = 1;
public final static int DC_DECISION_NOT_NOW = 2;
public final static int DC_CONNECTIVITY_NOT_CONNECTED = 1000;
public final static int DC_CONNECTIVITY_CONNECTING = 2000;
public final static int DC_CONNECTIVITY_WORKING = 3000;
public final static int DC_CONNECTIVITY_CONNECTED = 4000;
private static final String CONFIG_ACCOUNT_ENABLED = "ui.enabled";
private static final String CONFIG_MUTE_MENTIONS_IF_MUTED = "ui.mute_mentions_if_muted";
// when using DcAccounts, use DcAccounts.addAccount() instead
// when using DcAccounts, use Rpc.addAccount() instead
public DcContext(String osName, String dbfile) {
contextCPtr = createContextCPtr(osName, dbfile);
}
@@ -140,7 +138,8 @@ public class DcContext {
public void setConfigInt (String key, int value) { setConfig(key, Integer.toString(value)); }
public native boolean setConfigFromQr (String qr);
public native String getConfig (String key);
public int getConfigInt (String key) { try{return Integer.parseInt(getConfig(key));} catch(Exception e) {} return 0; }
public int getConfigInt (String key) { return getConfigInt(key, 0); }
public int getConfigInt (String key, int defValue) { try{return Integer.parseInt(getConfig(key));} catch(Exception e) {} return defValue; }
public native String getInfo ();
public native int getConnectivity ();
public native String getConnectivityHtml ();
@@ -182,7 +181,6 @@ public class DcContext {
public native int[] searchMsgs (int chat_id, String query);
public native int[] getFreshMsgs ();
public native int[] getChatMedia (int chat_id, int type1, int type2, int type3);
public native int getNextMedia (int msg_id, int dir, int type1, int type2, int type3);
public native int[] getChatContacts (int chat_id);
public native int getChatEphemeralTimer (int chat_id);
public native boolean setChatEphemeralTimer (int chat_id, int timer);
@@ -191,19 +189,21 @@ public class DcContext {
public native void blockChat (int chat_id);
public native void acceptChat (int chat_id);
public DcMsg getMsg (int msg_id) { return new DcMsg(getMsgCPtr(msg_id)); }
public native void sendEditRequest (int msg_id, String text);
public native String getMsgInfo (int id);
public native String getMsgHtml (int msg_id);
public native void downloadFullMsg (int msg_id);
public native int getFreshMsgCount (int chat_id);
public native int estimateDeletionCount(boolean from_server, long seconds);
public native void deleteMsgs (int msg_ids[]);
public native void sendDeleteRequest (int msg_ids[]);
public native void forwardMsgs (int msg_ids[], int chat_id);
public native void saveMsgs (int msg_ids[]);
public native boolean resendMsgs (int msg_ids[]);
public native int prepareMsg (int chat_id, DcMsg msg);
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, String descr);
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);
public native int initWebxdcIntegration(int chat_id);
@@ -212,6 +212,7 @@ public class DcContext {
public DcLot checkQr (String qr) { return new DcLot(checkQrCPtr(qr)); }
public native String getSecurejoinQr (int chat_id);
public native String getSecurejoinQrSvg (int chat_id);
public native String createQrSvg (String payload);
public native int joinSecurejoin (String qr);
public native void sendLocationsToChat (int chat_id, int seconds);
public native boolean isSendingLocationsToChat(int chat_id);
@@ -230,22 +231,20 @@ public class DcContext {
}
}
public String getNameNAddr() {
public boolean isMentionsEnabled() {
return getConfigInt(CONFIG_MUTE_MENTIONS_IF_MUTED) != 1;
}
public void setMentionsEnabled(boolean enabled) {
setConfigInt(CONFIG_MUTE_MENTIONS_IF_MUTED, enabled? 0 : 1);
}
public String getName() {
String displayname = getConfig("displayname");
String addr = getConfig("addr");
String ret = "";
if (!displayname.isEmpty() && !addr.isEmpty()) {
ret = String.format("%s (%s)", displayname, addr);
} else if (!addr.isEmpty()) {
ret = addr;
if (displayname.isEmpty()) {
displayname = getContact(DcContact.DC_CONTACT_ID_SELF).getAddr();
}
if (ret.isEmpty() || isConfigured() == 0) {
ret += " (not configured)";
}
return ret.trim();
return displayname;
}
public boolean isCommunity() {
@@ -277,21 +276,6 @@ public class DcContext {
setConfigInt("is_muted", muted? 1 : 0);
}
// Called for new profiles on chatmail servers that are "single device" initially;
// to save server disk space, we make use of that delete all messages immediately after download.
public void assumeSingleDevice() {
if (isChatmail()) {
setConfigInt("delete_server_after", 1 /*at once*/);
}
}
// Called when we get a hint that another device may be set up.
public void assumeMultiDevice() {
if (isChatmail() && getConfigInt("delete_server_after") == 1 /*at once*/) {
setConfigInt("delete_server_after", 0 /*never/automatic*/);
}
}
public boolean isGmailOauth2Addr(String addr) {
final String oauth2url = getOauth2Url(addr, "chat.delta:/foo");
return isGmailOauth2Url(oauth2url);
@@ -301,6 +285,12 @@ public class DcContext {
return oauth2url.startsWith("https://accounts.google.com/");
}
public void restartIo() {
if (!isEnabled()) return;
stopIo();
startIo();
}
/**
* @return true if at least one chat has location streaming enabled
*/
+19 -5
View File
@@ -148,6 +148,7 @@ public class DcMsg {
return new JSONObject();
}
}
public native String getWebxdcHref ();
public native boolean isForwarded ();
public native boolean isInfo ();
public native boolean isSetupMessage ();
@@ -155,25 +156,26 @@ public class DcMsg {
public native String getSetupCodeBegin ();
public native String getVideochatUrl ();
public native int getVideochatType ();
public native boolean isIncreation ();
public native void setText (String text);
public native void setSubject (String text);
public native void setHtml (String text);
public native void setFile (String file, String filemime);
public native void forceSticker ();
public native void setFileAndDeduplicate(String file, String name, String filemime);
public native void setDimension (int width, int height);
public native void setDuration (int duration);
public native void setLocation (float latitude, float longitude);
public native String getPOILocation ();
public void setQuote (DcMsg quote) { setQuoteCPtr(quote.msgCPtr); }
public native String getQuotedText ();
public native String getError ();
public native String getOverrideSenderName();
public native boolean isOutgoing();
public native int getSenderColor();
public native boolean isEdited ();
public String getSenderName(DcContact dcContact, boolean markOverride) {
public String getSenderName(DcContact dcContact) {
String overrideName = getOverrideSenderName();
if (overrideName != null) {
return (markOverride ? "~" : "") + overrideName;
return "~" + overrideName;
} else {
return dcContact.getDisplayName();
}
@@ -189,6 +191,14 @@ public class DcMsg {
return cPtr != 0 ? new DcMsg(cPtr) : null;
}
public native int getOriginalMsgId ();
public native int getSavedMsgId ();
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;
}
public File getFileAsFile() {
if(getFile()==null)
throw new AssertionError("expected a file to be present.");
@@ -208,6 +218,10 @@ public class DcMsg {
return ids;
}
public boolean isOutgoing() {
return getFromId() == DcContact.DC_CONTACT_ID_SELF;
}
public String getDisplayBody() {
return getText();
}
+13 -18
View File
@@ -17,6 +17,7 @@ public class Rpc {
private final Map<Integer, SettableFuture<JsonElement>> requestFutures = new ConcurrentHashMap<>();
private final DcJsonrpcInstance dcJsonrpcInstance;
private int requestId = 0;
private boolean started = false;
private final Gson gson = new GsonBuilder().serializeNulls().create();
public Rpc(DcJsonrpcInstance dcJsonrpcInstance) {
@@ -46,6 +47,7 @@ public class Rpc {
}
public void start() {
started = true;
new Thread(() -> {
while (true) {
try {
@@ -57,7 +59,9 @@ public class Rpc {
}, "jsonrpcThread").start();
}
public SettableFuture<JsonElement> call(String method, Object... params) {
public SettableFuture<JsonElement> call(String method, Object... params) throws RpcException {
if (!started) throw new RpcException("RPC not started yet.");
int id;
synchronized (this) {
id = ++requestId;
@@ -79,23 +83,6 @@ public class Rpc {
}
}
public int addAccount() throws RpcException {
return gson.fromJson(getResult("add_account"), int.class);
}
public void startIO() throws RpcException {
getResult("start_io_for_all_accounts");
}
public void stopIO() throws RpcException {
getResult("stop_io_for_all_accounts");
}
public Map<String, String> getSystemInfo() throws RpcException {
TypeToken<Map<String, String>> mapType = new TypeToken<Map<String, String>>(){};
return gson.fromJson(getResult("get_system_info"), mapType.getType());
}
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());
@@ -138,6 +125,14 @@ public class Rpc {
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;
@@ -26,8 +26,8 @@ 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 org.thoughtcrime.securesms.components.emoji.EmojiProvider;
import org.thoughtcrime.securesms.connect.AccountManager;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
@@ -37,7 +37,6 @@ import org.thoughtcrime.securesms.connect.KeepAliveService;
import org.thoughtcrime.securesms.connect.NetworkStateReceiver;
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider;
import org.thoughtcrime.securesms.crypto.PRNGFixes;
import org.thoughtcrime.securesms.geolocation.DcLocationManager;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.notifications.FcmReceiveService;
@@ -107,15 +106,11 @@ public class ApplicationContext extends MultiDexApplication {
Log.i("DeltaChat", "++++++++++++++++++ ApplicationContext.onCreate() ++++++++++++++++++");
// The first call to `getInstance` takes about 100ms-300ms, so, do it on a background thread
Thread t = new Thread(() -> EmojiProvider.getInstance(this), "InitEmojiProviderThread");
t.setPriority(Thread.MIN_PRIORITY);
t.start();
System.loadLibrary("native-utils");
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
rpc = new Rpc(dcAccounts.getJsonrpcInstance());
rpc.start();
AccountManager.getInstance().migrateToDcAccounts(this);
int[] allAccounts = dcAccounts.getAll();
for (int accountId : allAccounts) {
@@ -131,12 +126,13 @@ public class ApplicationContext extends MultiDexApplication {
e.printStackTrace();
}
}
if ("deltafans@nine.testrun.org".equals(ac.getConfig("configured_addr")) && !ac.isCommunity()) {
ac.setCommunityMode(true);
}
}
if (allAccounts.length == 0) {
dcAccounts.addAccount();
try {
rpc.addAccount();
} catch (RpcException e) {
e.printStackTrace();
}
}
dcContext = dcAccounts.getSelectedAccount();
notificationCenter = new NotificationCenter(this);
@@ -153,8 +149,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);
@@ -209,7 +203,6 @@ public class ApplicationContext extends MultiDexApplication {
KeepAliveService.maybeStartSelf(this);
initializeRandomNumberFix();
initializeLogging();
initializeJobManager();
InChatSounds.getInstance(this);
@@ -240,11 +233,10 @@ public class ApplicationContext extends MultiDexApplication {
TimeUnit.MILLISECONDS)
.setConstraints(constraints)
.build();
try {
// in Android 4 this throws exception due to R8/shrinking
WorkManager.getInstance(this)
.enqueueUniquePeriodicWork("FetchWorker", ExistingPeriodicWorkPolicy.KEEP, fetchWorkRequest);
} catch (Throwable e) {}
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"FetchWorker",
ExistingPeriodicWorkPolicy.KEEP,
fetchWorkRequest);
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
if (Prefs.isPushEnabled(this)) {
@@ -258,10 +250,6 @@ public class ApplicationContext extends MultiDexApplication {
return jobManager;
}
private void initializeRandomNumberFix() {
PRNGFixes.apply();
}
private void initializeLogging() {
SignalProtocolLoggerProvider.setProvider(new AndroidSignalProtocolLogger());
}
@@ -17,22 +17,15 @@
*/
package org.thoughtcrime.securesms;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
@@ -51,9 +44,10 @@ import org.thoughtcrime.securesms.preferences.PrivacyPreferenceFragment;
import org.thoughtcrime.securesms.preferences.CorrectedPreferenceFragment;
import org.thoughtcrime.securesms.preferences.NotificationsPreferenceFragment;
import org.thoughtcrime.securesms.preferences.widgets.ProfilePreference;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.qr.BackupTransferActivity;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.ScreenLockUtil;
/**
@@ -74,6 +68,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
private static final String PREFERENCE_CATEGORY_MULTIDEVICE = "preference_category_multidevice";
private static final String PREFERENCE_CATEGORY_ADVANCED = "preference_category_advanced";
private static final String PREFERENCE_CATEGORY_CONNECTIVITY = "preference_category_connectivity";
private static final String PREFERENCE_CATEGORY_DONATE = "preference_category_donate";
private static final String PREFERENCE_CATEGORY_HELP = "preference_category_help";
public static final int REQUEST_CODE_SET_BACKGROUND = 11;
@@ -153,13 +148,12 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
this.findPreference(PREFERENCE_CATEGORY_ADVANCED)
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_ADVANCED));
this.findPreference(PREFERENCE_CATEGORY_DONATE)
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_DONATE));
this.findPreference(PREFERENCE_CATEGORY_HELP)
.setOnPreferenceClickListener(new CategoryClickListener(PREFERENCE_CATEGORY_HELP));
if (VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
tintIcons(getActivity());
}
DcHelper.getEventCenter(getActivity()).addObserver(DcContext.DC_EVENT_CONNECTIVITY_CHANGED, this);
}
@@ -186,7 +180,7 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
public void handleEvent(@NonNull DcEvent event) {
if (event.getId() == DcContext.DC_EVENT_CONNECTIVITY_CHANGED) {
this.findPreference(PREFERENCE_CATEGORY_CONNECTIVITY)
.setSummary(DcHelper.getConnectivitySummary(getActivity(), R.string.connectivity_connected));
.setSummary(DcHelper.getConnectivitySummary(getActivity(), getString(R.string.connectivity_connected)));
}
}
@@ -202,43 +196,11 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
this.findPreference(PREFERENCE_CATEGORY_PRIVACY)
.setSummary(PrivacyPreferenceFragment.getSummary(getActivity()));
this.findPreference(PREFERENCE_CATEGORY_CONNECTIVITY)
.setSummary(DcHelper.getConnectivitySummary(getActivity(), R.string.connectivity_connected));
.setSummary(DcHelper.getConnectivitySummary(getActivity(), getString(R.string.connectivity_connected)));
this.findPreference(PREFERENCE_CATEGORY_HELP)
.setSummary(AdvancedPreferenceFragment.getVersion(getActivity()));
}
@TargetApi(11)
private void tintIcons(Context context) {
Drawable notifications = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_notifications_white_24dp));
Drawable swap = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_swap_vert_white_24dp));
Drawable appearance = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_brightness_6_white_24dp));
Drawable chats = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_forum_white_24dp));
Drawable privacy = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_lock_white_24dp));
Drawable advanced = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_advanced_white_24dp));
Drawable help = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.ic_help_white_24dp));
int[] tintAttr = new int[]{R.attr.pref_icon_tint};
TypedArray typedArray = context.obtainStyledAttributes(tintAttr);
int color = typedArray.getColor(0, 0x0);
typedArray.recycle();
DrawableCompat.setTint(notifications, color);
DrawableCompat.setTint(swap, color);
DrawableCompat.setTint(appearance, color);
DrawableCompat.setTint(chats, color);
DrawableCompat.setTint(privacy, color);
DrawableCompat.setTint(advanced, color);
DrawableCompat.setTint(help, color);
this.findPreference(PREFERENCE_CATEGORY_NOTIFICATIONS).setIcon(notifications);
this.findPreference(PREFERENCE_CATEGORY_CONNECTIVITY).setIcon(swap);
this.findPreference(PREFERENCE_CATEGORY_APPEARANCE).setIcon(appearance);
this.findPreference(PREFERENCE_CATEGORY_CHATS).setIcon(chats);
this.findPreference(PREFERENCE_CATEGORY_PRIVACY).setIcon(privacy);
this.findPreference(PREFERENCE_CATEGORY_ADVANCED).setIcon(advanced);
this.findPreference(PREFERENCE_CATEGORY_HELP).setIcon(help);
}
private class CategoryClickListener implements Preference.OnPreferenceClickListener {
private final String category;
@@ -293,6 +255,9 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
case PREFERENCE_CATEGORY_ADVANCED:
fragment = new AdvancedPreferenceFragment();
break;
case PREFERENCE_CATEGORY_DONATE:
IntentUtils.showInBrowser(requireActivity(), "https://arcanechat.me/#contribute");
break;
case PREFERENCE_CATEGORY_HELP:
startActivity(new Intent(getActivity(), LocalHelpActivity.class));
break;
@@ -1,9 +1,7 @@
package org.thoughtcrime.securesms;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewConfiguration;
@@ -33,9 +31,6 @@ public abstract class BaseActionBarActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
onPreCreate();
if (BaseActivity.isMenuWorkaroundRequired()) {
forceOverflowMenu();
}
super.onCreate(savedInstanceState);
}
@@ -46,20 +41,6 @@ public abstract class BaseActionBarActivity extends AppCompatActivity {
dynamicTheme.onResume(this);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return (keyCode == KeyEvent.KEYCODE_MENU && BaseActivity.isMenuWorkaroundRequired()) || super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU && BaseActivity.isMenuWorkaroundRequired()) {
openOptionsMenu();
return true;
}
return super.onKeyUp(keyCode, event);
}
private void initializeScreenshotSecurity() {
if (Prefs.isScreenSecurityEnabled(this)) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
@@ -1,28 +0,0 @@
package org.thoughtcrime.securesms;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import android.view.KeyEvent;
public abstract class BaseActivity extends FragmentActivity {
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return (keyCode == KeyEvent.KEYCODE_MENU && isMenuWorkaroundRequired()) || super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU && isMenuWorkaroundRequired()) {
openOptionsMenu();
return true;
}
return super.onKeyUp(keyCode, event);
}
public static boolean isMenuWorkaroundRequired() {
return VERSION.SDK_INT < VERSION_CODES.KITKAT && ("LGE".equalsIgnoreCase(Build.MANUFACTURER) || "E6710".equalsIgnoreCase(Build.DEVICE));
}
}
@@ -18,9 +18,8 @@ import com.b44t.messenger.rpc.Rpc;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.HashSet;
import java.util.Set;
@@ -11,19 +11,23 @@ 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.os.Build;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ActionMode;
import androidx.core.content.ContextCompat;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;
import androidx.fragment.app.Fragment;
import com.b44t.messenger.DcChat;
@@ -33,6 +37,7 @@ import com.google.android.material.snackbar.Snackbar;
import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionButton;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.connect.DirectShareUtil;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.SendRelayedMessageUtil;
import org.thoughtcrime.securesms.util.Util;
@@ -93,12 +98,16 @@ public abstract class BaseConversationListFragment extends Fragment implements A
if (isForwarding(getActivity())) {
message = String.format(Util.getLocale(), getString(R.string.ask_forward_multiple), selectedChats.size());
} else if (!uris.isEmpty()) {
message = String.format(Util.getLocale(), getString(R.string.share_multiple_attachments_multiple_chats), uris.size(), selectedChats.size());
message = String.format(Util.getLocale(), getString(R.string.ask_send_files_to_selected_chats), uris.size(), selectedChats.size());
} else {
message = String.format(Util.getLocale(), getString(R.string.share_text_multiple_chats), selectedChats.size(), getSharedText(getActivity()));
}
Context context = getContext();
if (context != null) {
if (SendRelayedMessageUtil.containsVideoType(context, uris)) {
message += "\n\n" + getString(R.string.videos_sent_without_recoding);
}
new AlertDialog.Builder(context)
.setMessage(message)
.setCancelable(false)
@@ -312,9 +321,41 @@ public abstract class BaseConversationListFragment extends Fragment implements A
updateActionModeItems(actionMode.getMenu());
}
private void handleAddToHomeScreen() {
final Activity activity = requireActivity();
final DcContext dcContext = DcHelper.getContext(activity);
final Set<Long> selectedChats = getListAdapter().getBatchSelections();
final DcChat chat = dcContext.getChat(selectedChats.iterator().next().intValue());
Intent intent = new Intent(activity, ShareActivity.class);
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(ShareActivity.EXTRA_ACC_ID, dcContext.getAccountId());
intent.putExtra(ShareActivity.EXTRA_CHAT_ID, chat.getId());
Recipient recipient = new Recipient(activity, chat);
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();
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) {
// We do not show action mode icons when relaying (= sharing or forwarding).
if (!isRelayingMessageContent(requireActivity())) {
final int selectedCount = getListAdapter().getBatchSelections().size();
menu.findItem(R.id.menu_add_to_home_screen).setVisible(selectedCount == 1);
MenuItem archiveItem = menu.findItem(R.id.menu_archive_selected);
if (offerToArchive()) {
archiveItem.setIcon(R.drawable.ic_archive_white_24dp);
@@ -360,9 +401,7 @@ public abstract class BaseConversationListFragment extends Fragment implements A
mode.setTitle("1");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
requireActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
}
requireActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
return true;
}
@@ -374,13 +413,28 @@ public abstract class BaseConversationListFragment extends Fragment implements A
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_select_all: handleSelectAllThreads(); return true;
case R.id.menu_delete_selected: handleDeleteAllSelected(); return true;
case R.id.menu_pin_selected: handlePinAllSelected(); return true;
case R.id.menu_archive_selected: handleArchiveAllSelected(); return true;
case R.id.menu_mute_selected: handleMuteAllSelected(); return true;
case R.id.menu_marknoticed_selected: handleMarknoticedSelected(); return true;
int itemId = item.getItemId();
if (itemId == R.id.menu_select_all) {
handleSelectAllThreads();
return true;
} else if (itemId == R.id.menu_delete_selected) {
handleDeleteAllSelected();
return true;
} else if (itemId == R.id.menu_pin_selected) {
handlePinAllSelected();
return true;
} else if (itemId == R.id.menu_archive_selected) {
handleArchiveAllSelected();
return true;
} else if (itemId == R.id.menu_mute_selected) {
handleMuteAllSelected();
return true;
} else if (itemId == R.id.menu_marknoticed_selected) {
handleMarknoticedSelected();
return true;
} else if (itemId == R.id.menu_add_to_home_screen) {
handleAddToHomeScreen();
return true;
}
return false;
@@ -391,11 +445,9 @@ public abstract class BaseConversationListFragment extends Fragment implements A
actionMode = null;
getListAdapter().initializeBatchMode(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
TypedArray color = requireActivity().getTheme().obtainStyledAttributes(new int[] {android.R.attr.statusBarColor});
requireActivity().getWindow().setStatusBarColor(color.getColor(0, Color.BLACK));
color.recycle();
}
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) {
@@ -25,6 +25,7 @@ public interface BindableConversationItem extends Unbindable {
interface EventListener {
void onQuoteClicked(DcMsg messageRecord);
void onJumpToOriginalClicked(DcMsg messageRecord);
void onShowFullClicked(DcMsg messageRecord);
void onDownloadClicked(DcMsg messageRecord);
void onReactionClicked(DcMsg messageRecord);
@@ -1,20 +1,20 @@
package org.thoughtcrime.securesms;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent;
@@ -57,11 +57,10 @@ public class ContactMultiSelectionActivity extends ContactSelectionActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.menu_add_members:
saveSelection();
finish();
return true;
if (item.getItemId() == R.id.menu_add_members) {
saveSelection();
finish();
return true;
}
return false;
@@ -26,7 +26,6 @@ import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseIntArray;
@@ -136,9 +135,7 @@ public class ContactSelectionListFragment extends Fragment
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.contact_list, menu);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
}
getActivity().getWindow().setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
setCorrectMenuVisibility(menu);
actionMode.setTitle("1");
return true;
@@ -151,16 +148,16 @@ public class ContactSelectionListFragment extends Fragment
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.menu_select_all:
handleSelectAll();
return true;
case R.id.menu_view_profile:
handleViewProfile();
return true;
case R.id.menu_delete_selected:
handleDeleteSelected();
return true;
int itemId = menuItem.getItemId();
if (itemId == R.id.menu_select_all) {
handleSelectAll();
return true;
} else if (itemId == R.id.menu_view_profile) {
handleViewProfile();
return true;
} else if (itemId == R.id.menu_delete_selected) {
handleDeleteSelected();
return true;
}
return false;
}
@@ -170,11 +167,9 @@ public class ContactSelectionListFragment extends Fragment
ContactSelectionListFragment.this.actionMode = null;
getContactSelectionListAdapter().resetActionModeSelection();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
TypedArray color = getActivity().getTheme().obtainStyledAttributes(new int[] {android.R.attr.statusBarColor});
getActivity().getWindow().setStatusBarColor(color.getColor(0, Color.BLACK));
color.recycle();
}
TypedArray color = getActivity().getTheme().obtainStyledAttributes(new int[]{android.R.attr.statusBarColor});
getActivity().getWindow().setStatusBarColor(color.getColor(0, Color.BLACK));
color.recycle();
}
};
@@ -217,16 +212,9 @@ public class ContactSelectionListFragment extends Fragment
ContactSelectionListAdapter adapter = getContactSelectionListAdapter();
final SparseIntArray actionModeSelection = adapter.getActionModeSelection().clone();
new Thread(() -> {
boolean failed = false;
for (int index = 0; index < actionModeSelection.size(); index++) {
int contactId = actionModeSelection.valueAt(index);
boolean currentFailed = !dcContext.deleteContact(contactId);
failed = currentFailed || failed;
}
if (failed) {
Util.runOnMain(()-> {
Toast.makeText(getActivity(), R.string.cannot_delete_contacts_in_use, Toast.LENGTH_LONG).show();
});
dcContext.deleteContact(contactId);
}
}).start();
adapter.resetActionModeSelection();
@@ -27,7 +27,7 @@ import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.ClipData;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
@@ -36,9 +36,7 @@ import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.Vibrator;
import android.provider.Browser;
import android.text.Editable;
@@ -47,6 +45,7 @@ import android.text.TextWatcher;
import android.util.Log;
import android.util.Pair;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -55,6 +54,7 @@ import android.view.View.OnFocusChangeListener;
import android.view.View.OnKeyListener;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
@@ -91,8 +91,6 @@ import org.thoughtcrime.securesms.components.InputPanel;
import org.thoughtcrime.securesms.components.KeyboardAwareLinearLayout.OnKeyboardShownListener;
import org.thoughtcrime.securesms.components.ScaleStableImageView;
import org.thoughtcrime.securesms.components.SendButton;
import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider;
import org.thoughtcrime.securesms.components.emoji.EmojiProvider;
import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
import org.thoughtcrime.securesms.connect.AccountManager;
import org.thoughtcrime.securesms.connect.DcEventCenter;
@@ -121,7 +119,7 @@ import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener;
import org.thoughtcrime.securesms.util.guava.Optional;
import org.thoughtcrime.securesms.util.views.Stub;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
import org.thoughtcrime.securesms.video.recode.VideoRecoder;
import org.thoughtcrime.securesms.videochat.VideochatUtil;
@@ -164,8 +162,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private static final int GROUP_EDIT = 6;
private static final int TAKE_PHOTO = 7;
private static final int RECORD_VIDEO = 8;
private static final int PICK_LOCATION = 9; // TODO: i think, this can be deleted
private static final int SMS_DEFAULT = 11; // TODO: i think, this can be deleted
private static final int PICK_WEBXDC = 9;
private GlideRequests glideRequests;
protected ComposeText composeText;
@@ -178,11 +175,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private View composePanel;
private ScaleStableImageView backgroundView;
private MessageRequestsBottomView messageRequestBottomView;
private ProgressDialog progressDialog;
private AttachmentTypeSelector attachmentTypeSelector;
private AttachmentManager attachmentManager;
private AudioRecorder audioRecorder;
private Stub<MediaKeyboard> emojiDrawerStub;
private FrameLayout emojiPickerContainer;
private MediaKeyboard emojiPicker;
protected HidingLinearLayout quickAttachmentToggle;
private InputPanel inputPanel;
@@ -196,6 +195,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private boolean isDefaultSms = true;
private boolean isSecurityInitialized = false;
private boolean successfulForwardingAttempt = false;
private boolean isEditing = false;
@Override
protected void onCreate(Bundle state, boolean ready) {
@@ -302,12 +302,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
DcHelper.getNotificationCenter(this).updateVisibleChat(dcContext.getAccountId(), chatId);
attachmentManager.onResume();
// action bar might be hidden by workaround in onStop()
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null && !supportActionBar.isShowing()) {
supportActionBar.show();
}
}
@Override
@@ -322,33 +316,17 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
AudioSlidePlayer.stopAll();
}
@Override
public void onStop() {
super.onStop();
// hack/workaround to fix https://github.com/deltachat/deltachat-android/issues/2798
// the real cause of the problem is still unknown but hiding the action bar here fixes it
if ( Build.VERSION.SDK_INT >= 34) {
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null && container.isKeyboardOpen()) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (!pm.isInteractive()) {
supportActionBar.hide();
}
}
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
Log.i(TAG, "onConfigurationChanged(" + newConfig.orientation + ")");
super.onConfigurationChanged(newConfig);
composeText.setTransport(sendButton.getSelectedTransport());
if (emojiDrawerStub.resolved() && container.getCurrentInput() == emojiDrawerStub.get()) {
if (emojiPicker != null && container.getCurrentInput() == emojiPicker) {
container.hideAttachedInput(true);
}
emojiPicker = null; // force reloading next time onEmojiToggle() is called
initializeBackground();
}
@@ -362,22 +340,38 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
public void onActivityResult(final int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
if ((data == null && reqCode != TAKE_PHOTO && reqCode != RECORD_VIDEO && reqCode != SMS_DEFAULT) ||
(resultCode != RESULT_OK && reqCode != SMS_DEFAULT))
if (resultCode != RESULT_OK || (data == null && reqCode != TAKE_PHOTO && reqCode != RECORD_VIDEO))
{
return;
}
switch (reqCode) {
case PICK_GALLERY:
MediaType mediaType;
String mimeType = MediaUtil.getMimeType(this, data.getData());
if (MediaUtil.isGif(mimeType)) mediaType = MediaType.GIF;
else if (MediaUtil.isVideo(mimeType)) mediaType = MediaType.VIDEO;
else mediaType = MediaType.IMAGE;
setMedia(data.getData(), mediaType);
final Uri singleUri = data.getData();
if (singleUri != null) {
MediaType mediaType;
String mimeType = MediaUtil.getMimeType(this, singleUri);
if (MediaUtil.isGif(mimeType)) mediaType = MediaType.GIF;
else if (MediaUtil.isVideo(mimeType)) mediaType = MediaType.VIDEO;
else mediaType = MediaType.IMAGE;
setMedia(singleUri, mediaType);
} else {
final ClipData multipleUris = data.getClipData();
if (multipleUris != null) {
final int uriCount = multipleUris.getItemCount();
if (uriCount > 0) {
ArrayList<Uri> uriList = new ArrayList<>(uriCount);
for (int i = 0; i < uriCount; i++) {
uriList.add(multipleUris.getItemAt(i).getUri());
}
askSendingFiles(uriList, () -> {
Util.runOnAnyBackgroundThread(() -> {
SendRelayedMessageUtil.sendMultipleMsgs(this, chatId, uriList, null);
});
});
}
}
}
break;
case PICK_DOCUMENT:
@@ -386,6 +380,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
setMedia(data.getData(), docMediaType);
break;
case PICK_WEBXDC:
setMedia(data.getData(), MediaType.DOCUMENT);
break;
case PICK_CONTACT:
addAttachmentContactInfo(data.getIntExtra(AttachContactActivity.CONTACT_ID_EXTRA, 0));
break;
@@ -413,16 +411,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
break;
case PICK_LOCATION:
break;
case ScribbleActivity.SCRIBBLE_REQUEST_CODE:
setMedia(data.getData(), MediaType.IMAGE);
break;
case SMS_DEFAULT:
initializeSecurity(isSecureText, isDefaultSms);
break;
}
}
@@ -505,6 +496,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;
}
@@ -512,17 +510,40 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.menu_leave: handleLeaveGroup(); return true;
case R.id.menu_archive_chat: handleArchiveChat(); return true;
case R.id.menu_clear_chat: fragment.handleClearChat(); return true;
case R.id.menu_delete_chat: handleDeleteChat(); return true;
case R.id.menu_mute_notifications: handleMuteNotifications(); return true;
case R.id.menu_show_map: WebxdcActivity.openMaps(this, chatId); return true;
case R.id.menu_search_up: handleMenuSearchNext(false); return true;
case R.id.menu_search_down: handleMenuSearchNext(true); return true;
case android.R.id.home: handleReturnToConversationList(); return true;
case R.id.menu_ephemeral_messages: handleEphemeralMessages(); return true;
int itemId = item.getItemId();
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) {
handleArchiveChat();
return true;
} else if (itemId == R.id.menu_clear_chat) {
fragment.handleClearChat();
return true;
} else if (itemId == R.id.menu_delete_chat) {
handleDeleteChat();
return true;
} else if (itemId == R.id.menu_mute_notifications) {
handleMuteNotifications();
return true;
} else if (itemId == R.id.menu_show_map) {
WebxdcActivity.openMaps(this, chatId);
return true;
} else if (itemId == R.id.menu_search_up) {
handleMenuSearchNext(false);
return true;
} else if (itemId == R.id.menu_search_down) {
handleMenuSearchNext(true);
return true;
} else if (itemId == android.R.id.home) {
handleReturnToConversationList();
return true;
} else if (itemId == R.id.menu_ephemeral_messages) {
handleEphemeralMessages();
return true;
}
return false;
@@ -680,17 +701,24 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
}
private void askSendingFiles(ArrayList<Uri> uriList, Runnable onConfirm) {
String message = String.format(getString(R.string.ask_send_files_to_chat), uriList.size(), dcChat.getName());
if (SendRelayedMessageUtil.containsVideoType(context, uriList)) {
message += "\n\n" + getString(R.string.videos_sent_without_recoding);
}
new AlertDialog.Builder(this)
.setMessage(message)
.setCancelable(false)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.menu_send, (dialog, which) -> onConfirm.run())
.show();
}
private void handleSharing() {
ArrayList<Uri> uriList = RelayUtil.getSharedUris(this);
int sharedContactId = RelayUtil.getSharedContactId(this);
if (uriList.size() > 1) {
String message = String.format(getString(R.string.share_multiple_attachments), uriList.size());
new AlertDialog.Builder(this)
.setMessage(message)
.setCancelable(false)
.setNegativeButton(android.R.string.cancel, ((dialog, which) -> finish()))
.setPositiveButton(R.string.menu_send, (dialog, which) -> SendRelayedMessageUtil.immediatelyRelay(this, chatId))
.show();
askSendingFiles(uriList, () -> SendRelayedMessageUtil.immediatelyRelay(this, chatId));
} else {
if (sharedContactId != 0) {
addAttachmentContactInfo(sharedContactId);
@@ -711,11 +739,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
* @return
*/
private ListenableFuture<Boolean> initializeDraft() {
isEditing = false;
final SettableFuture<Boolean> future = new SettableFuture<>();
DcMsg draft = dcContext.getDraft(chatId);
final String sharedText = RelayUtil.getSharedText(this);
if (draft == null) {
if (!draft.isOk()) {
if (TextUtils.isEmpty(sharedText)) {
composeText.setText("");
future.set(false);
@@ -742,8 +771,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
handleReplyMessage(quote);
}
String filename = draft.getFile();
if (filename.isEmpty() || !new File(filename).exists()) {
String file = draft.getFile();
if (file.isEmpty() || !new File(file).exists()) {
future.set(!text.isEmpty());
updateToggleButtonState();
return future;
@@ -763,26 +792,21 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
};
File file = new File(filename);
Uri uri = Uri.fromFile(file);
switch (draft.getType()) {
case DcMsg.DC_MSG_IMAGE:
setMedia(uri, MediaType.IMAGE).addListener(listener);
setMedia(draft, MediaType.IMAGE).addListener(listener);
break;
case DcMsg.DC_MSG_GIF:
setMedia(uri, MediaType.GIF).addListener(listener);
setMedia(draft, MediaType.GIF).addListener(listener);
break;
case DcMsg.DC_MSG_AUDIO:
setMedia(uri, MediaType.AUDIO).addListener(listener);
setMedia(draft, MediaType.AUDIO).addListener(listener);
break;
case DcMsg.DC_MSG_VIDEO:
setMedia(uri, MediaType.VIDEO).addListener(listener);
break;
case DcMsg.DC_MSG_WEBXDC:
setMedia(draft, MediaType.DOCUMENT).addListener(listener);
setMedia(draft, MediaType.VIDEO).addListener(listener);
break;
default:
setMedia(uri, MediaType.DOCUMENT).addListener(listener);
setMedia(draft, MediaType.DOCUMENT).addListener(listener);
break;
}
@@ -816,7 +840,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
sendButton = ViewUtil.findById(this, R.id.send_button);
attachButton = ViewUtil.findById(this, R.id.attach_button);
composeText = ViewUtil.findById(this, R.id.embedded_text_editor);
emojiDrawerStub = ViewUtil.findStubById(this, R.id.emoji_drawer_stub);
emojiPickerContainer = ViewUtil.findById(this, R.id.emoji_picker_container);
composePanel = ViewUtil.findById(this, R.id.bottom_panel);
container = ViewUtil.findById(this, R.id.layout_container);
quickAttachmentToggle = ViewUtil.findById(this, R.id.quick_attachment_toggle);
@@ -936,13 +960,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
case AttachmentTypeSelector.TAKE_PHOTO:
attachmentManager.capturePhoto(this, TAKE_PHOTO); break;
case AttachmentTypeSelector.RECORD_VIDEO:
if(VideoRecoder.canRecode()) {
attachmentManager.captureVideo(this, RECORD_VIDEO);
}
else {
Toast.makeText(this, "This device does not support video-compression (requires Android 4.4 KitKat)", Toast.LENGTH_LONG).show();
}
attachmentManager.captureVideo(this, RECORD_VIDEO);
break;
case AttachmentTypeSelector.ADD_WEBXDC:
AttachmentManager.selectWebxdc(this, PICK_WEBXDC); break;
}
}
@@ -991,14 +1012,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
protected static final int ACTION_SEND_OUT = 1;
protected static final int ACTION_SAVE_DRAFT = 2;
private String getSelfReaction(int msgId) {
try {
final String [] selfReactions = rpc.getMsgReactions(dcContext.getAccountId(), msgId).getReactionsByContact().get(DcContact.DC_CONTACT_ID_SELF);
if (selfReactions != null && selfReactions.length > 0) return selfReactions[0];
} catch(Exception e) { e.printStackTrace(); }
return null;
}
protected ListenableFuture<Integer> processComposeControls(int action) {
return processComposeControls(action, composeText.getTextTrimmed(),
attachmentManager.isAttachmentPresent() ?
@@ -1012,6 +1025,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
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.
// for drafts, however, we do not change the controls, the activity may be resumed.
@@ -1020,6 +1034,18 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
inputPanel.clearQuote();
}
if (editing) {
int msgId = quote.get().getQuotedMsg().getId();
Util.runOnAnyBackgroundThread(() -> {
if (action == ACTION_SEND_OUT) {
dcContext.sendEditRequest(msgId, body);
} else {
dcContext.setDraft(chatId, null);
}
});
return future;
}
if(slideDeck!=null) {
if (action==ACTION_SEND_OUT) {
@@ -1047,7 +1073,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
msg = new DcMsg(dcContext, DcMsg.DC_MSG_FILE);
}
String path = attachment.getRealPath(this);
msg.setFile(path, null);
msg.setFileAndDeduplicate(path, attachment.getFileName(), null);
}
}
msg.setText(body);
@@ -1056,18 +1082,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
e.printStackTrace();
}
}
else if (action == ACTION_SEND_OUT && quote.isPresent() && EmojiProvider.getInstance(this).maybeEmoji(body)){
int quotedMsg = quote.get().getQuotedMsg().getId();
try {
rpc.sendReaction(dcContext.getAccountId(), quotedMsg, body.equals(getSelfReaction(quotedMsg))? "" : body);
future.set(chatId);
return future;
} catch (RpcException e) {
e.printStackTrace();
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText(body);
}
}
else if (!body.isEmpty()){
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText(body);
@@ -1096,7 +1110,23 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
{
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) {
@@ -1154,7 +1184,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
return;
}
if (composeText.getText().length() == 0 && !attachmentManager.isAttachmentPresent()) {
if (!isEditing && composeText.getText().length() == 0 && !attachmentManager.isAttachmentPresent()) {
buttonToggle.display(attachButton);
quickAttachmentToggle.show();
} else {
@@ -1252,23 +1282,36 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
});
}
private void reloadEmojiPicker() {
emojiPickerContainer.removeAllViews();
emojiPicker = (MediaKeyboard) LayoutInflater.from(this).inflate(R.layout.conversation_activity_emojidrawer_stub, emojiPickerContainer, false);
emojiPickerContainer.addView(emojiPicker);
inputPanel.setMediaKeyboard(emojiPicker);
}
@Override
public void onEmojiToggle() {
if (!emojiDrawerStub.resolved()) {
initializeMediaKeyboardProviders(emojiDrawerStub.get(), false);
inputPanel.setMediaKeyboard(emojiDrawerStub.get());
if (emojiPicker == null) {
reloadEmojiPicker();
}
if (container.getCurrentInput() == emojiDrawerStub.get()) {
if (container.getCurrentInput() == emojiPicker) {
container.showSoftkey(composeText);
} else {
container.show(composeText, emojiDrawerStub.get());
container.show(composeText, emojiPicker);
}
}
@Override
public void onQuoteDismissed() {
if (isEditing) composeText.setText("");
isEditing = false;
}
// media selected by the system keyboard
@Override
public void onMediaSelected(@NonNull Uri uri, String contentType) {
if (isEditing) return;
if (MediaUtil.isImageType(contentType)) {
sendSticker(uri, contentType);
} else if (MediaUtil.isVideoType(contentType)) {
@@ -1290,17 +1333,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
if (quote.isPresent()) {
msg.setQuote(quote.get().getQuotedMsg());
}
msg.setFile(path, null);
msg.setFileAndDeduplicate(path, null, null);
msg.forceSticker();
dcContext.sendMsg(chatId, msg);
}
private void initializeMediaKeyboardProviders(@NonNull MediaKeyboard mediaKeyboard, boolean stickersAvailable) {
boolean isSystemEmojiPreferred = Prefs.isSystemEmojiPreferred(this);
if (!isSystemEmojiPreferred) {
mediaKeyboard.setProviders(0, new EmojiKeyboardProvider(this, inputPanel));
}
}
// Listeners
private class AttachmentTypeListener implements AttachmentTypeSelector.AttachmentClickedListener {
@@ -1406,6 +1443,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
@Override
public void handleReplyMessage(DcMsg msg) {
if (isEditing) composeText.setText("");
isEditing = false;
// If you modify these lines you may also want to modify ConversationItem.setQuote():
Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId()));
@@ -1421,11 +1460,32 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
msg.getTimestamp(),
author,
text,
slideDeck);
slideDeck,
false);
inputPanel.clickOnComposeInput();
}
@Override
public void handleEditMessage(DcMsg msg) {
isEditing = true;
Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId()));
SlideDeck slideDeck = new SlideDeck();
String text = msg.getSummarytext(500);
inputPanel.setQuote(GlideApp.with(this),
msg,
msg.getTimestamp(),
author,
text,
slideDeck,
true);
setDraftText(msg.getText());
inputPanel.clickOnComposeInput();
}
@Override
public void onAttachmentChanged() {
handleSecurityChange(isSecureText, isDefaultSms);
@@ -16,17 +16,19 @@
*/
package org.thoughtcrime.securesms;
import android.content.Context;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import static org.thoughtcrime.securesms.ConversationItem.PULSE_HIGHLIGHT_MILLIS;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcMsg;
@@ -49,8 +51,6 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static org.thoughtcrime.securesms.ConversationItem.PULSE_HIGHLIGHT_MILLIS;
/**
* A DC adapter for a conversation thread. Ultimately
* used by ConversationActivity to display a conversation
@@ -24,9 +24,9 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
@@ -63,8 +63,8 @@ import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.database.Address;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.reactions.AddReactionView;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.reactions.ReactionsDetailsFragment;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.AccessibilityUtil;
import org.thoughtcrime.securesms.util.Debouncer;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
@@ -211,7 +211,7 @@ public class ConversationFragment extends MessageSelectorFragment
public void onResume() {
super.onResume();
dcContext.marknoticedChat((int) chatId);
Util.runOnBackground(() -> dcContext.marknoticedChat((int) chatId));
if (list.getAdapter() != null) {
list.getAdapter().notifyDataSetChanged();
}
@@ -325,6 +325,7 @@ public class ConversationFragment extends MessageSelectorFragment
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_edit).setVisible(false);
menu.findItem(R.id.menu_context_reply_privately).setVisible(false);
menu.findItem(R.id.menu_add_to_home_screen).setVisible(false);
} else {
@@ -334,6 +335,8 @@ public class ConversationFragment extends MessageSelectorFragment
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_privately).setVisible(showReplyPrivately);
menu.findItem(R.id.menu_add_to_home_screen).setVisible(messageRecord.getType() == DcMsg.DC_MSG_WEBXDC);
@@ -377,6 +380,10 @@ public class ConversationFragment extends MessageSelectorFragment
return canReply;
}
static boolean canEditMsg(DcMsg dcMsg) {
return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION && !dcMsg.hasHtml() && !dcMsg.getText().isEmpty();
}
public void handleClearChat() {
handleDeleteMessages((int) chatId, getListAdapter().getMessageIds());
}
@@ -442,7 +449,7 @@ public class ConversationFragment extends MessageSelectorFragment
if (msg.getFromId() != prevMsg.getFromId() && !singleMsg) {
DcContact contact = dcContext.getContact(msg.getFromId());
result.append(msg.getSenderName(contact, false)).append(":\n");
result.append(msg.getSenderName(contact)).append(":\n");
}
if (msg.getType() == DcMsg.DC_MSG_TEXT || (singleMsg && !msg.getText().isEmpty())) {
result.append(msg.getText());
@@ -477,6 +484,16 @@ public class ConversationFragment extends MessageSelectorFragment
listener.handleReplyMessage(message);
}
@SuppressLint("RestrictedApi")
private void handleEditMessage(final DcMsg message) {
if (getActivity() != null) {
//noinspection ConstantConditions
((AppCompatActivity) getActivity()).getSupportActionBar().collapseActionView();
}
listener.handleEditMessage(message);
}
private void handleReplyMessagePrivately(final DcMsg msg) {
if (getActivity() != null) {
@@ -607,6 +624,7 @@ public class ConversationFragment extends MessageSelectorFragment
public interface ConversationFragmentListener {
void handleReplyMessage(DcMsg messageRecord);
void handleEditMessage(DcMsg messageRecord);
}
private class ConversationScrollListener extends OnScrollListener {
@@ -704,7 +722,7 @@ public class ConversationFragment extends MessageSelectorFragment
index++;
}
}
dcContext.markseenMsgs(ids);
Util.runOnAnyBackgroundThread(() -> dcContext.markseenMsgs(ids));
}
@@ -810,7 +828,10 @@ public class ConversationFragment extends MessageSelectorFragment
DozeReminder.dozeReminderTapped(getContext());
}
else if(messageRecord.getInfoType() == DcMsg.DC_INFO_WEBXDC_INFO_MESSAGE) {
scrollMaybeSmoothToMsgId(messageRecord.getParent().getId());
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");
@@ -841,20 +862,18 @@ public class ConversationFragment extends MessageSelectorFragment
}
}
@Override
public void onQuoteClicked(DcMsg messageRecord) {
DcMsg quoted = messageRecord.getQuotedMsg();
if (quoted == null) {
Log.i(TAG, "Clicked on a quote whose original message we never had.");
private void jumpToOriginal(DcMsg original) {
if (original == null) {
Log.i(TAG, "Clicked on a quote or jump-to-original whose original message was deleted/non-existing.");
Toast.makeText(getContext(), R.string.ConversationFragment_quoted_message_not_found, Toast.LENGTH_SHORT).show();
return;
}
int foreignChatId = quoted.getChatId();
int foreignChatId = original.getChatId();
if (foreignChatId != 0 && foreignChatId != chatId) {
Intent intent = new Intent(getActivity(), ConversationActivity.class);
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, foreignChatId);
int start = DcMsg.getMessagePosition(quoted, dcContext);
int start = DcMsg.getMessagePosition(original, dcContext);
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, start);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
((ConversationActivity) getActivity()).hideSoftKeyboard();
@@ -864,10 +883,20 @@ public class ConversationFragment extends MessageSelectorFragment
Log.e(TAG, "Activity was null");
}
} else {
scrollMaybeSmoothToMsgId(quoted.getId());
scrollMaybeSmoothToMsgId(original.getId());
}
}
@Override
public void onJumpToOriginalClicked(DcMsg messageRecord) {
jumpToOriginal(dcContext.getMsg(messageRecord.getOriginalMsgId()));
}
@Override
public void onQuoteClicked(DcMsg messageRecord) {
jumpToOriginal(messageRecord.getQuotedMsg());
}
@Override
public void onShowFullClicked(DcMsg messageRecord) {
Intent intent = new Intent(getActivity(), FullMsgActivity.class);
@@ -911,12 +940,11 @@ public class ConversationFragment extends MessageSelectorFragment
mode.setTitle("1");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getActivity().getWindow();
statusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
}
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());
return true;
@@ -932,9 +960,7 @@ public class ConversationFragment extends MessageSelectorFragment
((ConversationAdapter)list.getAdapter()).clearSelection();
list.getAdapter().notifyDataSetChanged();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getActivity().getWindow().setStatusBarColor(statusBarColor);
}
getActivity().getWindow().setStatusBarColor(statusBarColor);
actionMode = null;
hideAddReactionView();
@@ -943,43 +969,47 @@ public class ConversationFragment extends MessageSelectorFragment
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
hideAddReactionView();
switch(item.getItemId()) {
case R.id.menu_context_copy:
handleCopyMessage(getListAdapter().getSelectedItems());
actionMode.finish();
return true;
case R.id.menu_context_delete_message:
handleDeleteMessages((int) chatId, getListAdapter().getSelectedItems());
return true;
case R.id.menu_context_share:
DcHelper.openForViewOrShare(getContext(), getSelectedMessageRecord(getListAdapter().getSelectedItems()).getId(), Intent.ACTION_SEND);
return true;
case R.id.menu_context_details:
handleDisplayDetails(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
actionMode.finish();
return true;
case R.id.menu_context_forward:
handleForwardMessage(getListAdapter().getSelectedItems());
actionMode.finish();
return true;
case R.id.menu_add_to_home_screen:
WebxdcActivity.addToHomeScreen(getActivity(), getSelectedMessageRecord(getListAdapter().getSelectedItems()).getId());
actionMode.finish();
return true;
case R.id.menu_context_save_attachment:
handleSaveAttachment(getListAdapter().getSelectedItems());
return true;
case R.id.menu_context_reply:
handleReplyMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
actionMode.finish();
return true;
case R.id.menu_context_reply_privately:
handleReplyMessagePrivately(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
return true;
case R.id.menu_resend:
handleResendMessage(getListAdapter().getSelectedItems());
return true;
}
int itemId = item.getItemId();
if (itemId == R.id.menu_context_copy) {
handleCopyMessage(getListAdapter().getSelectedItems());
actionMode.finish();
return true;
} else if (itemId == R.id.menu_context_delete_message) {
handleDeleteMessages((int) chatId, getListAdapter().getSelectedItems());
return true;
} else if (itemId == R.id.menu_context_share) {
DcHelper.openForViewOrShare(getContext(), getSelectedMessageRecord(getListAdapter().getSelectedItems()).getId(), Intent.ACTION_SEND);
return true;
} else if (itemId == R.id.menu_context_details) {
handleDisplayDetails(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
actionMode.finish();
return true;
} else if (itemId == R.id.menu_context_forward) {
handleForwardMessage(getListAdapter().getSelectedItems());
actionMode.finish();
return true;
} else if (itemId == R.id.menu_add_to_home_screen) {
WebxdcActivity.addToHomeScreen(getActivity(), getSelectedMessageRecord(getListAdapter().getSelectedItems()).getId());
actionMode.finish();
return true;
} 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_edit) {
handleEditMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
actionMode.finish();
return true;
} else if (itemId == R.id.menu_context_reply_privately) {
handleReplyMessagePrivately(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
return true;
} else if (itemId == R.id.menu_resend) {
handleResendMessage(getListAdapter().getSelectedItems());
return true;
}
return false;
}
@@ -22,12 +22,10 @@ import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.os.Build;
import android.text.Spannable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
@@ -56,7 +54,6 @@ import org.thoughtcrime.securesms.components.DocumentView;
import org.thoughtcrime.securesms.components.QuoteView;
import org.thoughtcrime.securesms.components.VcardView;
import org.thoughtcrime.securesms.components.WebxdcView;
import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.mms.AudioSlide;
import org.thoughtcrime.securesms.mms.DocumentSlide;
@@ -69,10 +66,10 @@ import org.thoughtcrime.securesms.mms.StickerSlide;
import org.thoughtcrime.securesms.mms.VcardSlide;
import org.thoughtcrime.securesms.reactions.ReactionsConversationView;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.Linkifier;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
import org.thoughtcrime.securesms.util.MarkdownUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.Stub;
@@ -104,6 +101,7 @@ public class ConversationItem extends BaseConversationItem
protected ViewGroup bodyBubble;
protected ReactionsConversationView reactionsView;
protected View replyView;
protected View jumptoView;
@Nullable private QuoteView quoteView;
private ConversationItemFooter footer;
private TextView groupSender;
@@ -112,6 +110,7 @@ public class ConversationItem extends BaseConversationItem
protected ViewGroup contactPhotoHolder;
private ViewGroup container;
private Button msgActionButton;
private Button showFullButton;
private @NonNull Stub<ConversationItemThumbnail> mediaThumbnailStub;
private @NonNull Stub<AudioView> audioViewStub;
@@ -157,7 +156,9 @@ public class ConversationItem extends BaseConversationItem
this.quoteView = findViewById(R.id.quote_view);
this.container = findViewById(R.id.container);
this.replyView = findViewById(R.id.reply_icon);
this.jumptoView = findViewById(R.id.jumpto_icon);
this.msgActionButton = findViewById(R.id.msg_action_button);
this.showFullButton = findViewById(R.id.show_full_button);
setOnClickListener(new ClickListener(null));
@@ -177,12 +178,23 @@ public class ConversationItem extends BaseConversationItem
{
bind(messageRecord, dcChat, batchSelected, pulseHighlight, recipients);
this.glideRequests = glideRequests;
this.showSender = dcContext.isCommunity() || (dcChat.isMultiUser() && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null;
this.showSender = dcContext.isCommunity() || ((dcChat.isMultiUser() || dcChat.isSelfTalk()) && !messageRecord.isOutgoing()) || messageRecord.getOverrideSenderName() != null;
if (showSender) {
this.dcContact = dcContext.getContact(messageRecord.getFromId());
}
if (dcChat.isSelfTalk() && messageRecord.getOriginalMsgId() != 0) {
jumptoView.setVisibility(View.VISIBLE);
jumptoView.setOnClickListener(view -> {
if (eventListener != null) {
eventListener.onJumpToOriginalClicked(messageRecord);
}
});
} else {
jumptoView.setVisibility(View.GONE);
}
setGutterSizes(messageRecord, showSender);
setMessageShape(messageRecord);
setMediaAttributes(messageRecord, showSender);
@@ -385,7 +397,6 @@ public class ConversationItem extends BaseConversationItem
private void setBodyText(DcMsg messageRecord) {
bodyText.setClickable(false);
bodyText.setFocusable(false);
bodyText.setTextSize(TypedValue.COMPLEX_UNIT_SP, Prefs.getMessageBodyTextSize(context));
String text = messageRecord.getText();
@@ -399,7 +410,7 @@ public class ConversationItem extends BaseConversationItem
else {
Spannable spannable = (Spannable) MarkdownUtil.toMarkdown(context, text);
if (batchSelected.isEmpty()) {
spannable = EmojiTextView.linkify(spannable);
spannable = Linkifier.linkify(spannable);
}
bodyText.setText(spannable);
bodyText.setVisibility(View.VISIBLE);
@@ -407,6 +418,7 @@ public class ConversationItem extends BaseConversationItem
int downloadState = messageRecord.getDownloadState();
if (downloadState == DcMsg.DC_DOWNLOAD_AVAILABLE || downloadState == DcMsg.DC_DOWNLOAD_FAILURE || downloadState == DcMsg.DC_DOWNLOAD_IN_PROGRESS) {
showFullButton.setVisibility(View.GONE);
msgActionButton.setVisibility(View.VISIBLE);
if (downloadState==DcMsg.DC_DOWNLOAD_IN_PROGRESS) {
msgActionButton.setEnabled(false);
@@ -427,6 +439,7 @@ public class ConversationItem extends BaseConversationItem
}
});
} else if (messageRecord.getType() == DcMsg.DC_MSG_WEBXDC) {
showFullButton.setVisibility(View.GONE);
msgActionButton.setVisibility(View.VISIBLE);
msgActionButton.setEnabled(true);
msgActionButton.setText(webxdcViewStub.get().isCommunity()? R.string.join: R.string.start_app);
@@ -439,10 +452,11 @@ public class ConversationItem extends BaseConversationItem
});
}
else if (messageRecord.hasHtml()) {
msgActionButton.setVisibility(View.VISIBLE);
msgActionButton.setEnabled(true);
msgActionButton.setText(R.string.show_full_message);
msgActionButton.setOnClickListener(view -> {
msgActionButton.setVisibility(View.GONE);
showFullButton.setVisibility(View.VISIBLE);
showFullButton.setEnabled(true);
showFullButton.setText(R.string.show_full_message);
showFullButton.setOnClickListener(view -> {
if (eventListener != null && batchSelected.isEmpty()) {
eventListener.onShowFullClicked(messageRecord);
} else {
@@ -451,6 +465,7 @@ public class ConversationItem extends BaseConversationItem
});
} else {
msgActionButton.setVisibility(View.GONE);
showFullButton.setVisibility(View.GONE);
}
}
@@ -492,9 +507,7 @@ public class ConversationItem extends BaseConversationItem
audioViewStub.get().setAudio(new AudioSlide(context, messageRecord), duration);
audioViewStub.get().setOnClickListener(passthroughClickListener);
audioViewStub.get().setOnLongClickListener(passthroughClickListener);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
audioViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
audioViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -512,9 +525,7 @@ public class ConversationItem extends BaseConversationItem
documentViewStub.get().setDocument(new DocumentSlide(context, messageRecord));
documentViewStub.get().setDocumentClickListener(new ThumbnailClickListener());
documentViewStub.get().setOnLongClickListener(passthroughClickListener);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
documentViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
documentViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -531,9 +542,7 @@ public class ConversationItem extends BaseConversationItem
webxdcViewStub.get().setWebxdc(messageRecord, context.getString(R.string.webxdc_app));
webxdcViewStub.get().setWebxdcClickListener(new ThumbnailClickListener());
webxdcViewStub.get().setOnLongClickListener(passthroughClickListener);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webxdcViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
webxdcViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -551,9 +560,7 @@ public class ConversationItem extends BaseConversationItem
vcardViewStub.get().setVcardClickListener(new ThumbnailClickListener());
vcardViewStub.get().setOnLongClickListener(passthroughClickListener);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
vcardViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
vcardViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -589,9 +596,7 @@ public class ConversationItem extends BaseConversationItem
mediaThumbnailStub.get().setOnLongClickListener(passthroughClickListener);
mediaThumbnailStub.get().setOnClickListener(passthroughClickListener);
mediaThumbnailStub.get().showShade(TextUtils.isEmpty(messageRecord.getText()));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mediaThumbnailStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
mediaThumbnailStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
setThumbnailOutlineCorners(messageRecord, showSender);
@@ -614,9 +619,7 @@ public class ConversationItem extends BaseConversationItem
stickerStub.get().setThumbnailClickListener(new StickerClickListener());
stickerStub.get().setOnLongClickListener(passthroughClickListener);
stickerStub.get().setOnClickListener(passthroughClickListener);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
stickerStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
stickerStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ViewUtil.updateLayoutParams(groupSenderHolder, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -677,7 +680,7 @@ public class ConversationItem extends BaseConversationItem
contactPhoto.setVisibility(View.GONE);
} else {
int color = messageRecord.getSenderColor();
Recipient recipient = new Recipient(context, dcContact, messageRecord.getSenderName(dcContact, !dcContext.isCommunity()), color);
Recipient recipient = new Recipient(context, dcContact, messageRecord.getSenderName(dcContact), color);
contactPhoto.setAvatar(glideRequests, recipient, true);
contactPhoto.setVisibility(View.VISIBLE);
}
@@ -717,7 +720,8 @@ public class ConversationItem extends BaseConversationItem
author,
quoteTxt,
slideDeck,
current.getType() == DcMsg.DC_MSG_STICKER);
current.getType() == DcMsg.DC_MSG_STICKER,
false);
quoteView.setVisibility(View.VISIBLE);
quoteView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT;
@@ -802,14 +806,14 @@ public class ConversationItem extends BaseConversationItem
if (messageRecord.isForwarded()) {
if (showSender && dcContact !=null) {
this.groupSender.setText(context.getString(R.string.forwarded_by, messageRecord.getSenderName(dcContact, false)));
this.groupSender.setText(context.getString(R.string.forwarded_by, messageRecord.getSenderName(dcContact)));
} else {
this.groupSender.setText(context.getString(R.string.forwarded_message));
}
this.groupSender.setTextColor(context.getResources().getColor(R.color.unknown_sender));
}
else if (showSender && dcContact !=null) {
this.groupSender.setText(messageRecord.getSenderName(dcContact, true));
this.groupSender.setText(messageRecord.getSenderName(dcContact));
int color = messageRecord.getSenderColor();
this.groupSender.setTextColor(Util.rgbToArgbColor(color!=0? color : dcContact.getColor()));
}
@@ -3,7 +3,6 @@ package org.thoughtcrime.securesms;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Build;
import android.os.Vibrator;
import android.view.MotionEvent;
import android.view.View;
@@ -174,9 +173,7 @@ class ConversationItemSwipeCallback extends ItemTouchHelper.SimpleCallback {
vibrate(viewHolder.itemView.getContext());
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
recyclerView.cancelPendingInputEvents();
}
recyclerView.cancelPendingInputEvents();
}
private static void resetProgress(RecyclerView.ViewHolder viewHolder) {
@@ -199,11 +196,7 @@ class ConversationItemSwipeCallback extends ItemTouchHelper.SimpleCallback {
}
private static float getSignFromDirection(@NonNull View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? -1f : 1f;
} else {
return 1f;
}
return view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? -1f : 1f;
}
private static boolean sameSign(float dX, float sign) {
@@ -19,6 +19,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;
@@ -66,6 +68,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.proxy.ProxySettingsActivity;
import org.thoughtcrime.securesms.qr.QrActivity;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.recipients.Recipient;
@@ -86,7 +89,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
public static final String CLEAR_NOTIFICATIONS = "clear_notifications";
public static final String ACCOUNT_ID_EXTRA = "account_id";
public static final String FROM_WELCOME = "from_welcome";
public static final String WARN_CANNOT_ENCRYPT = "warn_cannot_encrypt";
private ConversationListFragment conversationListFragment;
public TextView title;
@@ -110,7 +112,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_46_0l_android";
final String deviceMsgLabel = "update_1_50_0_android";
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
DcMsg msg = null;
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
@@ -121,7 +123,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
// Util.copy(inputStream, new FileOutputStream(outputFile));
// msg.setFile(outputFile, "image/jpeg");
msg.setText(getString(R.string.update_1_46_android, "https://get.delta.chat/#changelogs"));
msg.setText(getString(R.string.update_1_50_android, "https://lemmy.ml/c/ArcaneChat"));
}
dcContext.addDeviceMsg(deviceMsgLabel, msg);
@@ -186,7 +188,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
TooltipCompat.setTooltipText(selfAvatar, getText(R.string.switch_account));
selfAvatar.setOnClickListener(v -> AccountManager.getInstance().showSwitchAccountMenu(this));
title.setOnClickListener(v -> {
findViewById(R.id.avatar_and_title).setOnClickListener(v -> {
if (!isRelayingMessageContent(this)) {
AccountManager.getInstance().showSwitchAccountMenu(this);
}
@@ -254,6 +256,10 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
@Override
protected void onNewIntent(Intent intent) {
if (isFinishing()) {
Log.w(TAG, "Activity is finishing, aborting onNewIntent()");
return;
}
super.onNewIntent(intent);
setIntent(intent);
refresh();
@@ -265,17 +271,12 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
DcContext dcContext = DcHelper.getContext(this);
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, dcContext.getAccountId());
if (getIntent().getBooleanExtra(CLEAR_NOTIFICATIONS, false)) {
DcHelper.getNotificationCenter(this).removeAllNotifiations(accountId);
DcHelper.getNotificationCenter(this).removeAllNotifications(accountId);
}
if (accountId != dcContext.getAccountId()) {
AccountManager.getInstance().switchAccountAndStartActivity(this, accountId);
}
String warnAddr = getIntent().getStringExtra(WARN_CANNOT_ENCRYPT);
if (!TextUtils.isEmpty(warnAddr)) {
DcHelper.showEncryptionRequiredDialog(this, warnAddr);
}
refreshAvatar();
refreshUnreadIndicator();
refreshTitle();
@@ -299,19 +300,15 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
}
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
DcContext dcContext = DcHelper.getContext(this);
DcContact self = dcContext.getContact(DcContact.DC_CONTACT_ID_SELF);
String name = dcContext.getConfig("displayname");
if (TextUtils.isEmpty(name)) {
name = self.getAddr();
}
title.setText(name);
title.setText(DcHelper.getContext(this).getName());
selfAvatar.setConnectivity(DcHelper.getContext(this).getConnectivity());
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
}
public void refreshAvatar() {
if (selfAvatarContainer == null) return;
if (isRelayingMessageContent(this)) {
selfAvatarContainer.setVisibility(View.GONE);
} else {
@@ -367,6 +364,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
public void onResume() {
super.onResume();
refreshTitle();
invalidateOptionsMenu();
DirectShareUtil.triggerRefreshDirectShare(this);
}
@@ -377,20 +375,16 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
if (!isRelayingMessageContent(this)) {
inflater.inflate(R.menu.text_secure_normal, menu);
MenuItem item = menu.findItem(R.id.menu_global_map);
if (Prefs.isLocationStreamingEnabled(this)) {
item.setVisible(true);
}
if (!Prefs.isLocationStreamingEnabled(this)) {
menu.findItem(R.id.menu_global_map).setVisible(false);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MenuCompat.setGroupDividerEnabled(menu, true);
} else{
menu.setGroupVisible(R.id.extra_services, false);
menu.findItem(R.id.menu_global_map).setVisible(Prefs.isLocationStreamingEnabled(this));
MenuItem proxyItem = menu.findItem(R.id.menu_proxy_settings);
if (TextUtils.isEmpty(DcHelper.get(this, CONFIG_PROXY_URL))) {
proxyItem.setVisible(false);
} else {
boolean proxyEnabled = DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1;
proxyItem.setIcon(proxyEnabled? R.drawable.ic_proxy_enabled_24 : R.drawable.ic_proxy_disabled_24);
proxyItem.setVisible(true);
}
MenuCompat.setGroupDividerEnabled(menu, true);
}
super.onPrepareOptionsMenu(menu);
@@ -440,31 +434,31 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.menu_invite_friends:
shareInvite();
return true;
case R.id.menu_settings:
startActivity(new Intent(this, ApplicationPreferencesActivity.class));
return true;
case R.id.menu_qr:
new IntentIntegrator(this).setCaptureActivity(QrActivity.class).initiateScan();
return true;
case R.id.menu_global_map:
WebxdcActivity.openMaps(this, 0);
return true;
case android.R.id.home:
onBackPressed();
return true;
case R.id.menu_all_media:
startActivity(new Intent(this, ProfileActivity.class));
return true;
case R.id.menu_webxdc_apps_store:
handleShowBot("xstore@testrun.org", "OPENPGP4FPR:37DC2B704A2AE2F6A96235CE0C3A0EBCA4F5801D#a=xstore%40testrun.org&n=&i=-1IGtynaivZ&s=JqHsvvcDmnW");
return true;
case R.id.menu_public_bots:
handleShowBot("publicbots@testrun.org", "OPENPGP4FPR:4DB8117591B27184A903FF7E9F469E00D40E13E7#a=publicbots%40testrun.org&n=Public%20Bots&i=zSuQpFtBa_Q&s=weLMu1-o1o1");
return true;
int itemId = item.getItemId();
if (itemId == R.id.menu_invite_friends) {
shareInvite();
return true;
} else if (itemId == R.id.menu_settings) {
startActivity(new Intent(this, ApplicationPreferencesActivity.class));
return true;
} else if (itemId == R.id.menu_qr) {
new IntentIntegrator(this).setCaptureActivity(QrActivity.class).initiateScan();
return true;
} else if (itemId == R.id.menu_global_map) {
WebxdcActivity.openMaps(this, 0);
return true;
} else if (itemId == R.id.menu_proxy_settings) {
startActivity(new Intent(this, ProxySettingsActivity.class));
return true;
} else if (itemId == android.R.id.home) {
onBackPressed();
return true;
} else if (itemId == R.id.menu_all_media) {
startActivity(new Intent(this, ProfileActivity.class));
return true;
} 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;
}
return false;
@@ -565,7 +559,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
private void shareInvite() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
String inviteURL = Util.QrDataToInviteURL(DcHelper.getContext(this).getSecurejoinQr(0));
String inviteURL = DcHelper.getContext(this).getSecurejoinQr(0);
intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.invite_friends_text, inviteURL));
startActivity(Intent.createChooser(intent, getString(R.string.chat_share_with_title)));
}
@@ -1,5 +1,11 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.FROM_ARCHIVED_CHATS_EXTRA;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
@@ -10,12 +16,6 @@ import com.b44t.messenger.DcChat;
import org.thoughtcrime.securesms.connect.DcHelper;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.FROM_ARCHIVED_CHATS_EXTRA;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isSharing;
public class ConversationListArchiveActivity extends PassphraseRequiredActionBarActivity
implements ConversationListFragment.ConversationSelectedListener
{
@@ -60,14 +60,13 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
case R.id.mark_as_read:
DcHelper.getContext(this).marknoticedChat(DcChat.DC_CHAT_ID_ARCHIVED_LINK);
return true;
int itemId = item.getItemId();
if (itemId == android.R.id.home) {
onBackPressed();
return true;
} else if (itemId == R.id.mark_as_read) {
DcHelper.getContext(this).marknoticedChat(DcChat.DC_CHAT_ID_ARCHIVED_LINK);
return true;
}
return false;
@@ -42,7 +42,6 @@ import com.b44t.messenger.DcMsg;
import org.thoughtcrime.securesms.ConversationListAdapter.ItemClickListener;
import org.thoughtcrime.securesms.components.recyclerview.DeleteItemAnimator;
import org.thoughtcrime.securesms.components.reminder.DozeReminder;
import org.thoughtcrime.securesms.connect.AccountManager;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.mms.GlideApp;
@@ -81,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);
@@ -322,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();
@@ -2,13 +2,12 @@ package org.thoughtcrime.securesms;
import android.content.Context;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.b44t.messenger.DcLot;
import org.thoughtcrime.securesms.database.model.ThreadRecord;
@@ -29,7 +28,6 @@ public class ConversationListItemInboxZero extends LinearLayout implements Binda
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public ConversationListItemInboxZero(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@@ -4,11 +4,11 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import android.util.AttributeSet;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcMsg;
@@ -1,16 +1,15 @@
package org.thoughtcrime.securesms;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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;
@@ -5,14 +5,12 @@ import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@@ -31,12 +29,9 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.google.android.material.textfield.TextInputLayout;
import com.soundcloud.android.crop.Crop;
import org.thoughtcrime.securesms.components.AvatarSelector;
import org.thoughtcrime.securesms.components.InputAwareLayout;
import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider;
import org.thoughtcrime.securesms.components.emoji.MediaKeyboard;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto;
import org.thoughtcrime.securesms.mms.AttachmentManager;
@@ -54,7 +49,7 @@ import java.security.SecureRandom;
@SuppressLint("StaticFieldLeak")
public class CreateProfileActivity extends BaseActionBarActivity implements EmojiKeyboardProvider.EmojiEventListener {
public class CreateProfileActivity extends BaseActionBarActivity {
private static final String TAG = CreateProfileActivity.class.getSimpleName();
@@ -66,7 +61,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
private ImageView avatar;
private EditText name;
private EditText overridenName;
private MediaKeyboard emojiDrawer;
private EditText statusView;
private boolean fromWelcome;
@@ -91,7 +85,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
attachmentManager = new AttachmentManager(this, () -> {});
avatarChanged = false;
initializeResources();
initializeEmojiInput();
initializeProfileName();
initializeProfileAvatar();
initializeStatusText();
@@ -107,13 +100,12 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
case R.id.menu_create_profile:
updateProfile();
break;
int itemId = item.getItemId();
if (itemId == android.R.id.home) {
onBackPressed();
return true;
} else if (itemId == R.id.menu_create_profile) {
updateProfile();
}
return false;
@@ -130,15 +122,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (container.getCurrentInput() == emojiDrawer) {
container.hideAttachedInput(true);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
@@ -161,10 +144,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
case ScribbleActivity.SCRIBBLE_REQUEST_CODE:
setAvatarView(data.getData());
break;
case Crop.REQUEST_CROP:
setAvatarView(Crop.getOutput(data));
break;
}
}
@@ -206,7 +185,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
this.avatar = ViewUtil.findById(this, R.id.avatar);
this.name = ViewUtil.findById(this, R.id.name_text);
this.overridenName = ViewUtil.findById(this, R.id.overriden_name);
this.emojiDrawer = ViewUtil.findById(this, R.id.emoji_drawer);
this.container = ViewUtil.findById(this, R.id.container);
this.statusView = ViewUtil.findById(this, R.id.status_text);
@@ -261,33 +239,6 @@ public class CreateProfileActivity extends BaseActionBarActivity implements Emoj
);
}
@Override
public void onEmojiSelected(String emoji) {
final int start = name.getSelectionStart();
final int end = name.getSelectionEnd();
name.getText().replace(Math.min(start, end), Math.max(start, end), emoji);
name.setSelection(start + emoji.length());
}
@Override
public void onKeyEvent(KeyEvent keyEvent) {
name.dispatchKeyEvent(keyEvent);
}
private void initializeMediaKeyboardProviders(@NonNull MediaKeyboard mediaKeyboard) {
boolean isSystemEmojiPreferred = Prefs.isSystemEmojiPreferred(this);
if (!isSystemEmojiPreferred) {
mediaKeyboard.setProviders(0, new EmojiKeyboardProvider(this, this));
}
}
private void initializeEmojiInput() {
initializeMediaKeyboardProviders(emojiDrawer);
this.name.setOnClickListener(v -> container.showSoftkey(name));
}
private void initializeStatusText() {
String status = DcHelper.get(this, DcHelper.CONFIG_SELF_STATUS);
statusView.setText(status);
@@ -105,17 +105,16 @@ public class FullMsgActivity extends WebViewActivity
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_export_image:
// TODO: extract image from "data:" link or download URL
return true;
case R.id.action_copy_link:
Util.writeTextToClipboard(this, imageUrl);
Toast.makeText(this, getString(R.string.copied_to_clipboard), Toast.LENGTH_SHORT).show();
return true;
default:
return super.onContextItemSelected(item);
int itemId = item.getItemId();
if (itemId == R.id.action_export_image) {
// TODO: extract image from "data:" link or download URL
return true;
} else if (itemId == R.id.action_copy_link) {
Util.writeTextToClipboard(this, imageUrl);
Toast.makeText(this, getString(R.string.copied_to_clipboard), Toast.LENGTH_SHORT).show();
return true;
}
return super.onContextItemSelected(item);
}
private static void loadHtmlAsync(final WeakReference<FullMsgActivity> activityReference) {
@@ -157,40 +156,39 @@ public class FullMsgActivity extends WebViewActivity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.load_remote_content:
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.load_remote_content)
.setMessage(R.string.load_remote_content_ask);
if (item.getItemId() == R.id.load_remote_content) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle(R.string.load_remote_content)
.setMessage(R.string.load_remote_content_ask);
// we are using the buttons "[Always] [Never][Once]" in that order.
// 1. Checkmarks before [Always] and [Never] show the current state.
// 2. [Once] is also shown in always-mode and disables always-mode if selected
// (there was the idea to hide [Once] in always mode, but that looks more like a bug in the end)
// (maybe a usual Always-Checkbox and "[Cancel][OK]" buttons are an alternative, however, a [Once]
// would be required as well - probably as the leftmost button which is not that usable in
// not-always-mode where the dialog is used more often. Or [Ok] would mean "Once" as well as "Change checkbox setting",
// which is also a bit weird. Anyway, let's give the three buttons a try :)
final String checkmark = DynamicTheme.getCheckmarkEmoji(this) + " ";
String alwaysCheckmark = "";
String onceCheckmark = "";
String neverCheckmark = "";
if (!blockLoadingRemote && Prefs.getAlwaysLoadRemoteContent(this)) {
alwaysCheckmark = checkmark;
} else if (loadRemoteContent) {
onceCheckmark = checkmark;
} else {
neverCheckmark = checkmark;
}
// we are using the buttons "[Always] [Never][Once]" in that order.
// 1. Checkmarks before [Always] and [Never] show the current state.
// 2. [Once] is also shown in always-mode and disables always-mode if selected
// (there was the idea to hide [Once] in always mode, but that looks more like a bug in the end)
// (maybe a usual Always-Checkbox and "[Cancel][OK]" buttons are an alternative, however, a [Once]
// would be required as well - probably as the leftmost button which is not that usable in
// not-always-mode where the dialog is used more often. Or [Ok] would mean "Once" as well as "Change checkbox setting",
// which is also a bit weird. Anyway, let's give the three buttons a try :)
final String checkmark = DynamicTheme.getCheckmarkEmoji(this) + " ";
String alwaysCheckmark = "";
String onceCheckmark = "";
String neverCheckmark = "";
if (!blockLoadingRemote && Prefs.getAlwaysLoadRemoteContent(this)) {
alwaysCheckmark = checkmark;
} else if (loadRemoteContent) {
onceCheckmark = checkmark;
} else {
neverCheckmark = checkmark;
}
if (!blockLoadingRemote) {
builder.setNeutralButton(alwaysCheckmark + getString(R.string.always), (dialog, which) -> onChangeLoadRemoteContent(LoadRemoteContent.ALWAYS));
}
builder.setNegativeButton(neverCheckmark + getString(blockLoadingRemote ? R.string.no : R.string.never), (dialog, which) -> onChangeLoadRemoteContent(LoadRemoteContent.NEVER));
builder.setPositiveButton(onceCheckmark + getString(R.string.once), (dialog, which) -> onChangeLoadRemoteContent(LoadRemoteContent.ONCE));
if (!blockLoadingRemote) {
builder.setNeutralButton(alwaysCheckmark + getString(R.string.always), (dialog, which) -> onChangeLoadRemoteContent(LoadRemoteContent.ALWAYS));
}
builder.setNegativeButton(neverCheckmark + getString(blockLoadingRemote ? R.string.no : R.string.never), (dialog, which) -> onChangeLoadRemoteContent(LoadRemoteContent.NEVER));
builder.setPositiveButton(onceCheckmark + getString(R.string.once), (dialog, which) -> onChangeLoadRemoteContent(LoadRemoteContent.ONCE));
builder.show();
return true;
builder.show();
return true;
}
return false;
}
@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
@@ -17,16 +18,14 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.loader.app.LoaderManager;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContact;
import com.b44t.messenger.DcContext;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.soundcloud.android.crop.Crop;
import org.thoughtcrime.securesms.components.AvatarSelector;
import org.thoughtcrime.securesms.connect.DcHelper;
@@ -76,7 +75,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
setContentView(R.layout.group_create_activity);
verified = false;
broadcast = getIntent().getBooleanExtra(CREATE_BROADCAST, false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
groupChatId = getIntent().getIntExtra(EDIT_GROUP_CHAT_ID, 0);
@@ -209,37 +208,22 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.menu_create_group:
String groupName = getGroupName();
if (showGroupNameEmptyToast(groupName)) return true;
int itemId = item.getItemId();
if (itemId == android.R.id.home) {
finish();
return true;
} else if (itemId == R.id.menu_create_group) {
String groupName = getGroupName();
if (showGroupNameEmptyToast(groupName)) return true;
if (groupChatId!=0) {
updateGroup(groupName);
} else {
verified = !broadcast && allMembersVerified();
if (verified && getAdapter().getContacts().size() == 1) {
new AlertDialog.Builder(this)
.setMessage(R.string.create_verified_group_ask)
.setNeutralButton(R.string.learn_more, (d, w) -> DcHelper.openHelp(this, "#e2eeguarantee"))
.setPositiveButton(R.string.yes, (d, w) -> {
createGroup(groupName);
})
.setNegativeButton(R.string.no, (d, w) -> {
verified = false;
createGroup(groupName);
})
.setCancelable(true)
.show();
} else {
createGroup(groupName);
}
}
if (groupChatId != 0) {
updateGroup(groupName);
} else {
verified = !broadcast && allMembersVerified();
createGroup(groupName);
}
return true;
return true;
}
return false;
@@ -360,10 +344,6 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
case ScribbleActivity.SCRIBBLE_REQUEST_CODE:
setAvatarView(data.getData());
break;
case Crop.REQUEST_CROP:
setAvatarView(Crop.getOutput(data));
break;
}
}
@@ -375,11 +355,14 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
.diskCacheStrategy(DiskCacheStrategy.NONE)
.centerCrop()
.override(AVATAR_SIZE, AVATAR_SIZE)
.into(new SimpleTarget<Bitmap>() {
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
setAvatar(output, resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {}
});
}
@@ -1,18 +1,22 @@
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.util.Linkify;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
@@ -35,7 +39,6 @@ import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.soundcloud.android.crop.Crop;
import org.thoughtcrime.securesms.components.AvatarSelector;
import org.thoughtcrime.securesms.connect.AccountManager;
@@ -47,8 +50,10 @@ import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.profiles.ProfileMediaConstraints;
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
@@ -64,7 +69,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
private static final String DCACCOUNT = "dcaccount";
private static final String DCLOGIN = "dclogin";
private static final String INSTANCES_URL = "https://delta.chat/chatmail";
private static final String DEFAULT_CHATMAIL_HOST = "nine.testrun.org";
private static final String DEFAULT_CHATMAIL_HOST = "arcanechat.me";
public static final String QR_ACCOUNT_EXTRA = "qr_account_extra";
public static final String FROM_WELCOME = "from_welcome";
@@ -132,13 +137,37 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
handleIntent();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
getMenuInflater().inflate(R.menu.instant_onboarding_menu, menu);
MenuItem proxyItem = menu.findItem(R.id.menu_proxy_settings);
if (TextUtils.isEmpty(DcHelper.get(this, CONFIG_PROXY_URL))) {
proxyItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
} else {
boolean proxyEnabled = DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1;
proxyItem.setIcon(proxyEnabled? R.drawable.ic_proxy_enabled_24 : R.drawable.ic_proxy_disabled_24);
proxyItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
super.onOptionsItemSelected(item);
if (item.getItemId() == android.R.id.home) {
int itemId = item.getItemId();
if (itemId == android.R.id.home) {
getOnBackPressedDispatcher().onBackPressed();
return true;
} else if (itemId == R.id.menu_proxy_settings) {
startActivity(new Intent(this, ProxySettingsActivity.class));
return true;
} else if (itemId == R.id.menu_view_log) {
startActivity(new Intent(this, LogViewActivity.class));
return true;
}
return false;
}
@@ -160,14 +189,16 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
setAvatarView(data.getData());
break;
case Crop.REQUEST_CROP:
setAvatarView(Crop.getOutput(data));
break;
case IntentIntegrator.REQUEST_CODE:
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanResult != null && scanResult.getFormatName() != null) {
setProviderFromQr(scanResult.getContents());
String qrRaw = data.getStringExtra(RegistrationQrActivity.QRDATA_EXTRA);
if (qrRaw == null) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanResult != null && scanResult.getFormatName() != null) {
qrRaw = scanResult.getContents();
}
}
if (qrRaw != null) {
setProviderFromQr(qrRaw);
}
break;
}
@@ -209,20 +240,32 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
protected void onPause() {
super.onPause();
final String displayName = name.getText().toString();
DcHelper.set(this, DcHelper.CONFIG_DISPLAY_NAME, TextUtils.isEmpty(displayName)? null : displayName);
// Save display name and avatar in the unconfigured profile.
// If the currently selected profile is configured, then this means that rollbackAccountCreation()
// was called (see handleOnBackPressed() above), i.e. the newly created profile was removed already
// and we can't save the display name & avatar.
if (DcHelper.getContext(this).isConfigured() == 0) {
final String displayName = name.getText().toString();
DcHelper.set(this, DcHelper.CONFIG_DISPLAY_NAME, TextUtils.isEmpty(displayName) ? null : displayName);
if (avatarChanged) {
try {
AvatarHelper.setSelfAvatar(InstantOnboardingActivity.this, avatarBmp);
Prefs.setProfileAvatarId(InstantOnboardingActivity.this, new SecureRandom().nextInt());
avatarChanged = false;
} catch (IOException e) {
Log.e(TAG, "Failed to save avatar", e);
if (avatarChanged) {
try {
AvatarHelper.setSelfAvatar(InstantOnboardingActivity.this, avatarBmp);
Prefs.setProfileAvatarId(InstantOnboardingActivity.this, new SecureRandom().nextInt());
avatarChanged = false;
} catch (IOException e) {
Log.e(TAG, "Failed to save avatar", e);
}
}
}
}
@Override
public void onResume() {
super.onResume();
invalidateOptionsMenu();
}
@Override
public void onDestroy() {
super.onDestroy();
@@ -284,38 +327,21 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
privacyPolicyBtn.setOnClickListener(view -> {
if (!isDcLogin) {
WebViewActivity.openUrlInBrowser(this, "https://" + providerHost + "/privacy.html");
IntentUtils.showInBrowser(this, "https://" + providerHost + "/privacy.html");
}
});
signUpBtn.setOnClickListener(view -> createProfile());
Button otherOptionsBtn = findViewById(R.id.other_options_button);
otherOptionsBtn.setOnClickListener(view -> showOtherOptionsDialog());
}
private void showOtherOptionsDialog() {
View view = View.inflate(this, R.layout.signup_options_view, null);
AlertDialog signUpDialog = new AlertDialog.Builder(this)
.setView(view)
.setTitle(R.string.instant_onboarding_show_more_instances)
.setNegativeButton(R.string.cancel, null)
.create();
view.findViewById(R.id.use_other_server).setOnClickListener((v) -> {
WebViewActivity.openUrlInBrowser(this, INSTANCES_URL);
signUpDialog.dismiss();
findViewById(R.id.use_other_server).setOnClickListener((v) -> {
IntentUtils.showInBrowser(this, INSTANCES_URL);
});
view.findViewById(R.id.login_button).setOnClickListener((v) -> {
findViewById(R.id.login_button).setOnClickListener((v) -> {
startRegistrationActivity();
signUpDialog.dismiss();
});
view.findViewById(R.id.scan_qr_button).setOnClickListener((v) -> {
findViewById(R.id.scan_qr_button).setOnClickListener((v) -> {
new IntentIntegrator(this).setCaptureActivity(RegistrationQrActivity.class).initiateScan();
signUpDialog.dismiss();
});
signUpDialog.show();
}
private void startRegistrationActivity() {
@@ -330,7 +356,11 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
privacyPolicyBtn.setText(getString(R.string.qrlogin_ask_login, providerHost));
} else {
signUpBtn.setText(R.string.instant_onboarding_create);
privacyPolicyBtn.setTextColor(getResources().getColor(R.color.def_accent));
try (TypedArray typedArray = obtainStyledAttributes(new int[]{R.attr.colorAccent})) {
privacyPolicyBtn.setTextColor(typedArray.getColor(0, Color.BLACK));
}
if (DEFAULT_CHATMAIL_HOST.equals(providerHost)) {
privacyPolicyBtn.setText(getString(R.string.instant_onboarding_agree_default2, providerHost));
} else {
@@ -373,7 +403,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
progressUpdate((int)progress);
} else if (progress==1000/*done*/) {
DcHelper.getAccounts(this).startIo();
dcContext.assumeSingleDevice();
progressSuccess();
}
}
@@ -386,7 +415,7 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
private void progressError(String data2) {
progressDialog.dismiss();
maybeShowConfigurationError(this, data2);
WelcomeActivity.maybeShowConfigurationError(this, data2);
}
private void progressSuccess() {
@@ -399,22 +428,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
finishAffinity();
}
public static void maybeShowConfigurationError(Activity activity, String data2) {
if (data2 != null && !data2.isEmpty()) {
AlertDialog d = new AlertDialog.Builder(activity)
.setMessage(data2)
.setPositiveButton(android.R.string.ok, null)
.create();
d.show();
try {
//noinspection ConstantConditions
Linkify.addLinks((TextView) d.findViewById(android.R.id.message), Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES);
} catch(NullPointerException e) {
Log.e(TAG, "Linkify failed", e);
}
}
}
@SuppressLint("StaticFieldLeak")
private void createProfile() {
if (TextUtils.isEmpty(this.name.getText())) {
@@ -57,22 +57,22 @@ public class LocalHelpActivity extends WebViewActivity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.log_scroll_up:
webView.scrollTo(0, 0);
return true;
case R.id.learn_more:
openOnlineUrl("https://delta.chat");
return true;
case R.id.privacy_policy:
openOnlineUrl("https://delta.chat/gdpr");
return true;
case R.id.contribute:
openOnlineUrl("https://github.com/deltachat/deltachat-android");
return true;
case R.id.report_issue:
openOnlineUrl("https://github.com/deltachat/deltachat-android/issues");
return true;
int itemId = item.getItemId();
if (itemId == R.id.log_scroll_up) {
webView.scrollTo(0, 0);
return true;
} else if (itemId == R.id.learn_more) {
openOnlineUrl("https://arcanechat.me");
return true;
} else if (itemId == R.id.privacy_policy) {
openOnlineUrl("https://arcanechat.me/privacy.html");
return true;
} else if (itemId == R.id.contribute) {
openOnlineUrl("https://arcanechat.me/#contribute");
return true;
} else if (itemId == R.id.report_issue) {
openOnlineUrl("https://github.com/ArcaneChat/android/issues");
return true;
}
return false;
}
@@ -54,42 +54,42 @@ public class LogViewActivity extends BaseActionBarActivity {
super.onOptionsItemSelected(item);
Float newSize;
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.save_log:
Permissions.with(this)
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.alwaysGrantOnSdk30()
.ifNecessary()
.onAllGranted(() -> {
File outputDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
boolean success = logViewFragment.saveLogFile(outputDir) != null;
new AlertDialog.Builder(this)
.setMessage(success? R.string.pref_saved_log : R.string.pref_save_log_failed)
.setPositiveButton(android.R.string.ok, null)
.show();
})
.execute();
return true;
case R.id.share_log:
shareLog();
return true;
case R.id.log_zoom_in:
newSize = logViewFragment.getLogTextSize() + 2.0f;
logViewFragment.setLogTextSize(newSize);
return false;
case R.id.log_zoom_out:
newSize = logViewFragment.getLogTextSize() - 2.0f;
logViewFragment.setLogTextSize(newSize);
return false;
case R.id.log_scroll_down:
logViewFragment.scrollDownLog();
return false;
case R.id.log_scroll_up:
logViewFragment.scrollUpLog();
return false;
int itemId = item.getItemId();
if (itemId == android.R.id.home) {
finish();
return true;
} else if (itemId == R.id.save_log) {
Permissions.with(this)
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.alwaysGrantOnSdk30()
.ifNecessary()
.onAllGranted(() -> {
File outputDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
boolean success = logViewFragment.saveLogFile(outputDir) != null;
new AlertDialog.Builder(this)
.setMessage(success ? R.string.pref_saved_log : R.string.pref_save_log_failed)
.setPositiveButton(android.R.string.ok, null)
.show();
})
.execute();
return true;
} else if (itemId == R.id.share_log) {
shareLog();
return true;
} else if (itemId == R.id.log_zoom_in) {
newSize = logViewFragment.getLogTextSize() + 2.0f;
logViewFragment.setLogTextSize(newSize);
return false;
} else if (itemId == R.id.log_zoom_out) {
newSize = logViewFragment.getLogTextSize() - 2.0f;
logViewFragment.setLogTextSize(newSize);
return false;
} else if (itemId == R.id.log_scroll_down) {
logViewFragment.scrollDownLog();
return false;
} else if (itemId == R.id.log_scroll_up) {
logViewFragment.scrollUpLog();
return false;
}
return false;
@@ -17,14 +17,13 @@
package org.thoughtcrime.securesms;
import android.annotation.TargetApi;
import android.Manifest;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.PowerManager;
import android.text.TextUtils;
@@ -35,6 +34,7 @@ import android.view.ViewGroup;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.core.content.PermissionChecker;
import androidx.fragment.app.Fragment;
import com.b44t.messenger.DcContext;
@@ -195,12 +195,11 @@ public class LogViewFragment extends Fragment {
asMegs(info.maxMemory()));
}
@TargetApi(VERSION_CODES.KITKAT)
public static String getMemoryClass(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String lowMem = "";
if (VERSION.SDK_INT >= VERSION_CODES.KITKAT && activityManager.isLowRamDevice()) {
if (activityManager.isLowRamDevice()) {
lowMem = ", low-mem device";
}
return activityManager.getMemoryClass() + lowMem;
@@ -250,9 +249,14 @@ public class LogViewFragment extends Fragment {
Locale locale = Util.getLocale();
builder.append("lang=").append(locale.toString()).append("\n");
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
boolean isRtl = Util.getLayoutDirection(context) == View.LAYOUT_DIRECTION_RTL;
builder.append("rtl=").append(isRtl).append("\n");
boolean isRtl = Util.getLayoutDirection(context) == View.LAYOUT_DIRECTION_RTL;
builder.append("rtl=").append(isRtl).append("\n");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
boolean notifPermGranted = PermissionChecker.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PermissionChecker.PERMISSION_GRANTED;
builder.append("post-notifications-granted=").append(notifPermGranted).append("\n");
} else {
builder.append("post-notifications-granted=<not needed>").append("\n");
}
final String token = FcmReceiveService.getToken();
@@ -16,9 +16,9 @@
*/
package org.thoughtcrime.securesms;
import android.app.Activity;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
@@ -207,7 +207,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
messageRecord = null;
long date = getIntent().getLongExtra(DATE_EXTRA, 0);
long size = getIntent().getLongExtra(SIZE_EXTRA, 0);
initialMedia = new MediaItem(null, getIntent().getData(), getIntent().getType(),
initialMedia = new MediaItem(null, getIntent().getData(), null, getIntent().getType(),
DcMsg.DC_MSG_NO_ID, date, size, false);
if (address != null) {
@@ -218,7 +218,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
} else {
messageRecord = dcContext.getMsg(msgId);
initialMedia = new MediaItem(Recipient.fromChat(context, msgId), Uri.fromFile(messageRecord.getFileAsFile()),
messageRecord.getFilemime(), messageRecord.getId(), messageRecord.getDateReceived(),
messageRecord.getFilename(), messageRecord.getFilemime(), messageRecord.getId(), messageRecord.getDateReceived(),
messageRecord.getFilebytes(), messageRecord.isOutgoing());
conversationRecipient = Recipient.fromChat(context, msgId);
}
@@ -232,12 +232,11 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
// if you search for the place where the media are loaded, go to 'onCreateLoader'.
Log.w(TAG, "Loading Part URI: " + initialMedia);
if (messageRecord != null) {
getSupportLoaderManager().restartLoader(0, null, this);
} else {
mediaPager.setAdapter(new SingleItemPagerAdapter(this, GlideApp.with(this),
getWindow(), initialMedia.uri, initialMedia.type, initialMedia.size));
getWindow(), initialMedia.uri, initialMedia.name, initialMedia.type, initialMedia.size));
}
}
@@ -313,7 +312,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
private void performSavetoDisk(@NonNull MediaItem mediaItem) {
SaveAttachmentTask saveTask = new SaveAttachmentTask(MediaPreviewActivity.this);
long saveDate = (mediaItem.date > 0) ? mediaItem.date : System.currentTimeMillis();
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Attachment(mediaItem.uri, mediaItem.type, saveDate, null));
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Attachment(mediaItem.uri, mediaItem.type, saveDate, mediaItem.name));
}
private void showInChat() {
@@ -345,28 +344,31 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
DcMsg dcMsg = dcContext.getMsg(mediaItem.msgId);
DcChat dcChat = dcContext.getChat(dcMsg.getChatId());
String text = getResources().getQuantityString(
dcChat.isDeviceTalk()? R.plurals.ask_delete_messages_simple : R.plurals.ask_delete_messages,
1, 1);
String text = getResources().getQuantityString(R.plurals.ask_delete_messages, 1, 1);
int positiveBtnLabel = dcChat.isSelfTalk() ? R.string.delete : R.string.delete_for_me;
final int[] messageIds = new int[]{mediaItem.msgId};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(text);
builder.setCancelable(true);
builder.setPositiveButton(R.string.delete, (dialogInterface, which) -> {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
dcContext.deleteMsgs(new int[]{mediaItem.msgId});
return null;
}
}.execute();
builder.setNeutralButton(android.R.string.cancel, null);
builder.setPositiveButton(positiveBtnLabel, (dialogInterface, which) -> {
Util.runOnAnyBackgroundThread(() -> dcContext.deleteMsgs(messageIds));
finish();
});
builder.setNegativeButton(android.R.string.cancel, null);
AlertDialog dialog = builder.show();
Util.redPositiveButton(dialog);
if(dcChat.canSend() && !dcChat.isSelfTalk() && dcMsg.isOutgoing()) {
builder.setNegativeButton(R.string.delete_for_everyone, (d, which) -> {
Util.runOnAnyBackgroundThread(() -> dcContext.sendDeleteRequest(messageIds));
finish();
});
AlertDialog dialog = builder.show();
Util.redButton(dialog, AlertDialog.BUTTON_NEGATIVE);
Util.redPositiveButton(dialog);
} else {
AlertDialog dialog = builder.show();
Util.redPositiveButton(dialog);
}
}
@Override
@@ -396,14 +398,28 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.media_preview__edit: editAvatar(); return true;
case R.id.media_preview__overview: showOverview(); return true;
case R.id.media_preview__share: share(); return true;
case R.id.save: saveToDisk(); return true;
case R.id.delete: deleteMedia(); return true;
case R.id.show_in_chat: showInChat(); return true;
case android.R.id.home: finish(); return true;
int itemId = item.getItemId();
if (itemId == R.id.media_preview__edit) {
editAvatar();
return true;
} else if (itemId == R.id.media_preview__overview) {
showOverview();
return true;
} else if (itemId == R.id.media_preview__share) {
share();
return true;
} else if (itemId == R.id.save) {
saveToDisk();
return true;
} else if (itemId == R.id.delete) {
deleteMedia();
return true;
} else if (itemId == R.id.show_in_chat) {
showInChat();
return true;
} else if (itemId == android.R.id.home) {
finish();
return true;
}
return false;
@@ -473,9 +489,12 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
MediaItemAdapter adapter = (MediaItemAdapter)mediaPager.getAdapter();
if (adapter != null) {
MediaItem item = adapter.getMediaItemFor(position);
if (item.recipient != null) item.recipient.removeListener(MediaPreviewActivity.this);
try {
MediaItem item = adapter.getMediaItemFor(position);
if (item.recipient != null) item.recipient.removeListener(MediaPreviewActivity.this);
} catch (IllegalArgumentException e) {
Log.w(TAG, "Ignoring invalid position index");
}
adapter.pause(position);
}
}
@@ -486,18 +505,20 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
private final GlideRequests glideRequests;
private final Window window;
private final Uri uri;
private final String name;
private final String mediaType;
private final long size;
private final LayoutInflater inflater;
SingleItemPagerAdapter(@NonNull Context context, @NonNull GlideRequests glideRequests,
@NonNull Window window, @NonNull Uri uri, @NonNull String mediaType,
@NonNull Window window, @NonNull Uri uri, @Nullable String name, @NonNull String mediaType,
long size)
{
this.glideRequests = glideRequests;
this.window = window;
this.uri = uri;
this.name = name;
this.mediaType = mediaType;
this.size = size;
this.inflater = LayoutInflater.from(context);
@@ -519,7 +540,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
MediaView mediaView = itemView.findViewById(R.id.media_view);
try {
mediaView.set(glideRequests, window, uri, mediaType, size, true);
mediaView.set(glideRequests, window, uri, name, mediaType, size, true);
} catch (IOException e) {
Log.w(TAG, e);
}
@@ -539,7 +560,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
@Override
public MediaItem getMediaItemFor(int position) {
return new MediaItem(null, uri, mediaType, DcMsg.DC_MSG_NO_ID, -1, -1, true);
return new MediaItem(null, uri, name, mediaType, DcMsg.DC_MSG_NO_ID, -1, -1, true);
}
@Override
@@ -604,7 +625,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
try {
//noinspection ConstantConditions
mediaView.set(glideRequests, window, Uri.fromFile(msg.getFileAsFile()),
mediaView.set(glideRequests, window, Uri.fromFile(msg.getFileAsFile()), msg.getFilename(),
msg.getFilemime(), msg.getFilebytes(), autoplay);
} catch (IOException e) {
Log.w(TAG, e);
@@ -633,6 +654,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
return new MediaItem(Recipient.fromChat(context, msg.getId()),
Uri.fromFile(msg.getFileAsFile()),
msg.getFilename(),
msg.getFilemime(),
msg.getId(),
msg.getDateReceived(),
@@ -655,6 +677,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
private static class MediaItem {
private final @Nullable Recipient recipient;
private final @NonNull Uri uri;
private final @Nullable String name;
private final @NonNull String type;
private final int msgId;
private final long date;
@@ -663,6 +686,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
private MediaItem(@Nullable Recipient recipient,
@NonNull Uri uri,
@Nullable String name,
@NonNull String type,
int msgId,
long date,
@@ -671,6 +695,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity
{
this.recipient = recipient;
this.uri = uri;
this.name = name;
this.type = type;
this.msgId = msgId;
this.date = date;
@@ -61,22 +61,44 @@ public abstract class MessageSelectorFragment
}
protected void handleDeleteMessages(int chatId, final int[] messageIds) {
DcChat dcChat = DcHelper.getContext(getActivity()).getChat(chatId);
DcChat dcChat = dcContext.getChat(chatId);
boolean canDeleteForAll = true;
if (dcChat.canSend() && !dcChat.isSelfTalk()) {
for(int msgId : messageIds) {
DcMsg msg = dcContext.getMsg(msgId);
if (!msg.isOutgoing()) {
canDeleteForAll = false;
break;
}
}
} else {
canDeleteForAll = false;
}
String text = getActivity().getResources().getQuantityString(
dcChat.isDeviceTalk()? R.plurals.ask_delete_messages_simple : R.plurals.ask_delete_messages,
messageIds.length, messageIds.length);
String text = requireActivity().getResources().getQuantityString(R.plurals.ask_delete_messages, messageIds.length, messageIds.length);
int positiveBtnLabel = dcChat.isSelfTalk() ? R.string.delete : R.string.delete_for_me;
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setMessage(text)
.setCancelable(true)
.setPositiveButton(R.string.delete, (d, which) -> {
dcContext.deleteMsgs(messageIds);
if (actionMode != null) actionMode.finish();
})
.setNegativeButton(android.R.string.cancel, null)
.show();
Util.redPositiveButton(dialog);
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity())
.setMessage(text)
.setCancelable(true)
.setNeutralButton(android.R.string.cancel, null)
.setPositiveButton(positiveBtnLabel, (d, which) -> {
dcContext.deleteMsgs(messageIds);
if (actionMode != null) actionMode.finish();
});
if(canDeleteForAll) {
builder.setNegativeButton(R.string.delete_for_everyone, (d, which) -> {
dcContext.sendDeleteRequest(messageIds);
if (actionMode != null) actionMode.finish();
});
AlertDialog dialog = builder.show();
Util.redButton(dialog, AlertDialog.BUTTON_NEGATIVE);
Util.redPositiveButton(dialog);
} else {
AlertDialog dialog = builder.show();
Util.redPositiveButton(dialog);
}
}
protected void handleSaveAttachment(final Set<DcMsg> messageRecords) {
@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
@@ -16,12 +16,15 @@
*/
package org.thoughtcrime.securesms;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.TEXT_EXTRA;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
@@ -36,11 +39,6 @@ import org.thoughtcrime.securesms.qr.QrActivity;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.util.MailtoUtil;
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
import static org.thoughtcrime.securesms.ConversationActivity.TEXT_EXTRA;
import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent;
import static org.thoughtcrime.securesms.util.RelayUtil.isRelayingMessageContent;
/**
* Activity container for starting a new conversation.
*
@@ -111,8 +109,6 @@ public class NewConversationActivity extends ContactSelectionActivity {
int contactId = dcContext.lookupContactIdByAddr(addr);
if (contactId!=0 && dcContext.getChatIdByContactId(contactId)!=0) {
openConversation(dcContext.getChatIdByContactId(contactId));
} else if (contactId == 0 && dcContext.isChatmail()) {
DcHelper.showEncryptionRequiredDialog(this, addr);
} else {
String nameNAddr = contactId == 0 ? addr : dcContext.getContact(contactId).getNameNAddr();
new AlertDialog.Builder(this)
@@ -153,6 +153,7 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
menu.findItem(R.id.share).setVisible(false);
}
} else {
menu.findItem(R.id.menu_clone).setVisible(false);
canReceive = false;
}
@@ -415,35 +416,27 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case android.R.id.home:
backPressed = true;
finish();
return true;
case R.id.menu_mute_notifications:
onNotifyOnOff();
break;
case R.id.menu_sound:
onSoundSettings();
break;
case R.id.menu_vibrate:
onVibrateSettings();
break;
case R.id.edit_name:
onEditName();
break;
case R.id.share:
onShare();
break;
case R.id.show_encr_info:
onEncrInfo();
break;
case R.id.block_contact:
onBlockContact();
break;
case R.id.menu_clone:
onClone();
break;
int itemId = item.getItemId();
if (itemId == android.R.id.home) {
backPressed = true;
finish();
return true;
} else if (itemId == R.id.menu_mute_notifications) {
onNotifyOnOff();
} else if (itemId == R.id.menu_sound) {
onSoundSettings();
} else if (itemId == R.id.menu_vibrate) {
onVibrateSettings();
} else if (itemId == R.id.edit_name) {
onEditName();
} else if (itemId == R.id.share) {
onShare();
} else if (itemId == R.id.show_encr_info) {
onEncrInfo();
} else if (itemId == R.id.block_contact) {
onBlockContact();
} else if (itemId == R.id.menu_clone) {
onClone();
}
return false;
@@ -452,10 +445,8 @@ public class ProfileActivity extends PassphraseRequiredActionBarActivity
@Override
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item);
switch (item.getItemId()) {
case R.id.copy_addr_to_clipboard:
onCopyAddrToClipboard();
break;
if (item.getItemId() == R.id.copy_addr_to_clipboard) {
onCopyAddrToClipboard();
}
return false;
}
@@ -1,12 +1,13 @@
package org.thoughtcrime.securesms;
import android.content.Context;
import androidx.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.b44t.messenger.DcMsg;
import com.codewaves.stickyheadergrid.StickyHeaderGridAdapter;
@@ -5,7 +5,6 @@ import static com.b44t.messenger.DcChat.DC_CHAT_NO_CHAT;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -122,7 +121,13 @@ public class ProfileDocumentsFragment
noMedia.setVisibility(recyclerView.getAdapter().getItemCount() > 0 ? View.GONE : View.VISIBLE);
if (chatId == DC_CHAT_NO_CHAT) {
noMedia.setText(R.string.tab_all_media_empty_hint);
if (showWebxdc) {
noMedia.setText(R.string.all_apps_empty_hint);
} else if (!showAudio){
noMedia.setText(R.string.all_files_empty_hint);
} else {
noMedia.setText(R.string.tab_all_media_empty_hint);
}
} else if (showAudio) {
noMedia.setText(R.string.tab_audio_empty_hint);
} else if (showWebxdc) {
@@ -229,11 +234,9 @@ public class ProfileDocumentsFragment
mode.getMenuInflater().inflate(R.menu.profile_context, menu);
mode.setTitle("1");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
}
Window window = getActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
setCorrectMenuVisibility(menu);
return true;
}
@@ -245,35 +248,35 @@ public class ProfileDocumentsFragment
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.details:
handleDisplayDetails(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
mode.finish();
return true;
case R.id.delete:
handleDeleteMessages(chatId, getListAdapter().getSelectedMedia());
mode.finish();
return true;
case R.id.share:
handleShare(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
return true;
case R.id.menu_add_to_home_screen:
WebxdcActivity.addToHomeScreen(getActivity(), getSelectedMessageRecord(getListAdapter().getSelectedMedia()).getId());
mode.finish();
return true;
case R.id.show_in_chat:
handleShowInChat(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
return true;
case R.id.save:
handleSaveAttachment(getListAdapter().getSelectedMedia());
return true;
case R.id.menu_resend:
handleResendMessage(getListAdapter().getSelectedMedia());
return true;
case R.id.menu_select_all:
getListAdapter().selectAll();
updateActionModeBar();
return true;
int itemId = menuItem.getItemId();
if (itemId == R.id.details) {
handleDisplayDetails(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
mode.finish();
return true;
} else if (itemId == R.id.delete) {
handleDeleteMessages(chatId, getListAdapter().getSelectedMedia());
mode.finish();
return true;
} else if (itemId == R.id.share) {
handleShare(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
return true;
} else if (itemId == R.id.menu_add_to_home_screen) {
WebxdcActivity.addToHomeScreen(getActivity(), getSelectedMessageRecord(getListAdapter().getSelectedMedia()).getId());
mode.finish();
return true;
} else if (itemId == R.id.show_in_chat) {
handleShowInChat(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
return true;
} else if (itemId == R.id.save) {
handleSaveAttachment(getListAdapter().getSelectedMedia());
return true;
} else if (itemId == R.id.menu_resend) {
handleResendMessage(getListAdapter().getSelectedMedia());
return true;
} else if (itemId == R.id.menu_select_all) {
getListAdapter().selectAll();
updateActionModeBar();
return true;
}
return false;
}
@@ -283,9 +286,7 @@ public class ProfileDocumentsFragment
actionMode = null;
getListAdapter().clearSelection();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
}
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
}
}
}
@@ -1,12 +1,13 @@
package org.thoughtcrime.securesms;
import android.content.Context;
import androidx.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.b44t.messenger.DcMsg;
import com.codewaves.stickyheadergrid.StickyHeaderGridAdapter;
@@ -5,14 +5,7 @@ import static com.b44t.messenger.DcChat.DC_CHAT_NO_CHAT;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ActionMode;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -21,6 +14,13 @@ import android.view.ViewGroup;
import android.view.Window;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ActionMode;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.RecyclerView;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent;
import com.b44t.messenger.DcMsg;
@@ -219,11 +219,9 @@ public class ProfileGalleryFragment
mode.getMenuInflater().inflate(R.menu.profile_context, menu);
mode.setTitle("1");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
}
Window window = getActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
setCorrectMenuVisibility(menu);
return true;
}
@@ -235,31 +233,31 @@ public class ProfileGalleryFragment
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.details:
handleDisplayDetails(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
mode.finish();
return true;
case R.id.delete:
handleDeleteMessages(chatId, getListAdapter().getSelectedMedia());
mode.finish();
return true;
case R.id.share:
handleShare(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
return true;
case R.id.show_in_chat:
handleShowInChat(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
return true;
case R.id.save:
handleSaveAttachment(getListAdapter().getSelectedMedia());
return true;
case R.id.menu_resend:
handleResendMessage(getListAdapter().getSelectedMedia());
return true;
case R.id.menu_select_all:
getListAdapter().selectAll();
updateActionModeBar();
return true;
int itemId = menuItem.getItemId();
if (itemId == R.id.details) {
handleDisplayDetails(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
mode.finish();
return true;
} else if (itemId == R.id.delete) {
handleDeleteMessages(chatId, getListAdapter().getSelectedMedia());
mode.finish();
return true;
} else if (itemId == R.id.share) {
handleShare(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
return true;
} else if (itemId == R.id.show_in_chat) {
handleShowInChat(getSelectedMessageRecord(getListAdapter().getSelectedMedia()));
return true;
} else if (itemId == R.id.save) {
handleSaveAttachment(getListAdapter().getSelectedMedia());
return true;
} else if (itemId == R.id.menu_resend) {
handleResendMessage(getListAdapter().getSelectedMedia());
return true;
} else if (itemId == R.id.menu_select_all) {
getListAdapter().selectAll();
updateActionModeBar();
return true;
}
return false;
}
@@ -269,9 +267,7 @@ public class ProfileGalleryFragment
actionMode = null;
getListAdapter().clearSelection();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
}
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
}
}
}
@@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.contacts.ContactSelectionListItem;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.ResUtil;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration.StickyHeaderAdapter;
import java.util.ArrayList;
@@ -330,7 +331,8 @@ public class ProfileSettingsAdapter extends RecyclerView.Adapter
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_LAST_SEEN, lastSeenTxt, 0, 0));
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_SEND_MESSAGE_BUTTON, context.getString(R.string.send_message), R.color.def_accent, 0));
int color = ResUtil.getColor(context, R.attr.colorAccent);
itemData.add(new ItemData(ItemData.CATEGORY_INFO, INFO_SEND_MESSAGE_BUTTON, context.getString(R.string.send_message), color, 0));
}
itemDataStatusText = dcContact.getStatus();
@@ -4,7 +4,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -268,11 +267,9 @@ public class ProfileSettingsFragment extends Fragment
menu.findItem(R.id.menu_select_all).setVisible(false);
mode.setTitle("1");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
}
Window window = getActivity().getWindow();
originalStatusBarColor = window.getStatusBarColor();
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
return true;
}
@@ -283,29 +280,28 @@ public class ProfileSettingsFragment extends Fragment
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.delete:
final Collection<Integer> toDelIds = adapter.getSelectedMembers();
StringBuilder readableToDelList = new StringBuilder();
for (Integer toDelId : toDelIds) {
if(readableToDelList.length()>0) {
readableToDelList.append(", ");
}
readableToDelList.append(dcContext.getContact(toDelId).getDisplayName());
if (menuItem.getItemId() == R.id.delete) {
final Collection<Integer> toDelIds = adapter.getSelectedMembers();
StringBuilder readableToDelList = new StringBuilder();
for (Integer toDelId : toDelIds) {
if (readableToDelList.length() > 0) {
readableToDelList.append(", ");
}
DcChat dcChat = dcContext.getChat(chatId);
AlertDialog dialog = new AlertDialog.Builder(getContext())
.setPositiveButton(R.string.remove_desktop, (d, which) -> {
for (Integer toDelId : toDelIds) {
dcContext.removeContactFromChat(chatId, toDelId);
}
mode.finish();
})
.setNegativeButton(android.R.string.cancel, null)
.setMessage(getString(dcChat.isBroadcast()? R.string.ask_remove_from_broadcast : R.string.ask_remove_members, readableToDelList))
.show();
Util.redPositiveButton(dialog);
return true;
readableToDelList.append(dcContext.getContact(toDelId).getDisplayName());
}
DcChat dcChat = dcContext.getChat(chatId);
AlertDialog dialog = new AlertDialog.Builder(getContext())
.setPositiveButton(R.string.remove_desktop, (d, which) -> {
for (Integer toDelId : toDelIds) {
dcContext.removeContactFromChat(chatId, toDelId);
}
mode.finish();
})
.setNegativeButton(android.R.string.cancel, null)
.setMessage(getString(dcChat.isBroadcast() ? R.string.ask_remove_from_broadcast : R.string.ask_remove_members, readableToDelList))
.show();
Util.redPositiveButton(dialog);
return true;
}
return false;
}
@@ -314,9 +310,7 @@ public class ProfileSettingsFragment extends Fragment
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
adapter.clearSelection();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
}
getActivity().getWindow().setStatusBarColor(originalStatusBarColor);
}
}
@@ -325,12 +319,15 @@ public class ProfileSettingsFragment extends Fragment
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_CODE_PICK_CONTACT && resultCode==Activity.RESULT_OK && data!=null) {
List<String> selected = data.getStringArrayListExtra("contacts");
for (String addr : selected) {
if (addr!=null) {
int toAddId = dcContext.createContact(null, addr);
dcContext.addContactToChat(chatId, toAddId);
if(selected == null) return;
Util.runOnAnyBackgroundThread(() -> {
for (String addr : selected) {
if (addr!=null) {
int toAddId = dcContext.createContact(null, addr);
dcContext.addContactToChat(chatId, toAddId);
}
}
}
});
}
}
}
@@ -31,9 +31,8 @@ public class ProfileSettingsItem extends LinearLayout {
labelView.setText(label==null? "" : label);
labelView.setCompoundDrawablesWithIntrinsicBounds(iconLeft, 0,0,0);
// we need different color getters as `labelColor` is `R.color.name` while default is `R.attr.name`
if (labelColor != 0) {
labelView.setTextColor(ContextCompat.getColor(getContext(), labelColor));
labelView.setTextColor(labelColor);
} else {
labelView.setTextColor(ResUtil.getColor(getContext(), R.attr.emoji_text_color));
}
@@ -6,12 +6,14 @@ import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
import androidx.appcompat.widget.AppCompatTextView;
import org.thoughtcrime.securesms.util.Linkifier;
import org.thoughtcrime.securesms.util.LongClickMovementMethod;
public class ProfileStatusItem extends LinearLayout {
private EmojiTextView statusTextView;
private AppCompatTextView statusTextView;
private final PassthroughClickListener passthroughClickListener = new PassthroughClickListener();
public ProfileStatusItem(Context context) {
@@ -32,7 +34,7 @@ public class ProfileStatusItem extends LinearLayout {
}
public void set(String status) {
statusTextView.setText(EmojiTextView.linkify(new SpannableString(status)));
statusTextView.setText(Linkifier.linkify(new SpannableString(status)));
}
private class PassthroughClickListener implements View.OnLongClickListener, View.OnClickListener {
@@ -6,21 +6,16 @@ import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_MAIL_PORT;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_MAIL_SECURITY;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_MAIL_SERVER;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_MAIL_USER;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_PASSWORD;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_PORT;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_SECURITY;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_SERVER;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_USER;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SERVER_FLAGS;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_ENABLED;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_HOST;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_PASSWORD;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_PORT;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_USER;
import static org.thoughtcrime.securesms.connect.DcHelper.getContext;
import static org.thoughtcrime.securesms.service.IPCAddAccountsService.ACCOUNT_DATA;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
@@ -35,7 +30,6 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
@@ -59,9 +53,11 @@ import com.google.android.material.textfield.TextInputEditText;
import org.thoughtcrime.securesms.connect.DcEventCenter;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.proxy.ProxySettingsActivity;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.views.ProgressDialog;
import java.lang.ref.WeakReference;
@@ -96,7 +92,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
Spinner certCheck;
private SwitchCompat proxySwitch;
private Group proxyGroup;
@Override
public void onCreate(Bundle bundle) {
@@ -127,15 +122,11 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
authMethod = findViewById(R.id.auth_method);
certCheck = findViewById(R.id.cert_check);
proxyGroup = findViewById(R.id.socks5_group);
proxySwitch = findViewById(R.id.socks5_switch);
proxySwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
proxyGroup.setVisibility(isChecked? advancedGroup.getVisibility() : View.GONE);
proxySwitch = findViewById(R.id.proxy_settings);
proxySwitch.setOnClickListener(l -> {
proxySwitch.setChecked(!proxySwitch.isChecked()); // revert toggle
startActivity(new Intent(this, ProxySettingsActivity.class));
});
TextInputEditText proxyHostInput = findViewById(R.id.socks5_host_text);
TextInputEditText proxyPortInput = findViewById(R.id.socks5_port_text);
proxyHostInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.SERVER));
proxyPortInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.PORT));
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
@@ -161,7 +152,16 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
advancedIcon.setOnClickListener(l -> onAdvancedSettings());
advancedIcon.setRotation(45);
viewLogText.setOnClickListener((view) -> showLog());
boolean isConfigured = DcHelper.isConfigured(getApplicationContext());
boolean expandAdvanced = false;
String strVal;
int intVal;
intVal = DcHelper.getInt(this, CONFIG_PROXY_ENABLED);
proxySwitch.setChecked(intVal == 1);
expandAdvanced = expandAdvanced || intVal == 1;
if (isConfigured) {
String email = DcHelper.get(this, CONFIG_ADDRESS);
emailInput.setText(email);
@@ -170,10 +170,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
}
passwordInput.setText(DcHelper.get(this, CONFIG_MAIL_PASSWORD));
boolean expandAdvanced = false;
String strVal;
int intVal;
TextInputEditText imapLoginInput = findViewById(R.id.imap_login_text);
strVal = DcHelper.get(this, CONFIG_MAIL_USER);
imapLoginInput.setText(strVal);
@@ -188,7 +184,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
expandAdvanced = expandAdvanced || !TextUtils.isEmpty(strVal);
intVal = DcHelper.getInt(this, CONFIG_MAIL_SECURITY);
imapSecurity.setSelection(intVal);
imapSecurity.setSelection(ViewUtil.checkBounds(intVal, imapSecurity));
expandAdvanced = expandAdvanced || intVal != 0;
TextInputEditText smtpLoginInput = findViewById(R.id.smtp_login_text);
@@ -210,20 +206,9 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
expandAdvanced = expandAdvanced || !TextUtils.isEmpty(strVal);
intVal = DcHelper.getInt(this, CONFIG_SEND_SECURITY);
smtpSecurity.setSelection(intVal);
smtpSecurity.setSelection(ViewUtil.checkBounds(intVal, smtpSecurity));
expandAdvanced = expandAdvanced || intVal != 0;
intVal = DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED);
proxySwitch.setChecked(intVal == 1);
expandAdvanced = expandAdvanced || intVal == 1;
proxyHostInput.setText(DcHelper.get(this, CONFIG_SOCKS5_HOST));
proxyPortInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PORT));
TextInputEditText proxyUserInput = findViewById(R.id.socks5_user_text);
TextInputEditText proxyPasswordInput = findViewById(R.id.socks5_password_text);
proxyUserInput.setText(DcHelper.get(this, CONFIG_SOCKS5_USER));
proxyPasswordInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PASSWORD));
int serverFlags = DcHelper.getInt(this, CONFIG_SERVER_FLAGS);
int sel = 0;
if((serverFlags&DcContext.DC_LP_AUTH_OAUTH2)!=0) {
@@ -236,14 +221,15 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
}
// /remove gmail oauth2
}
authMethod.setSelection(sel);
authMethod.setSelection(ViewUtil.checkBounds(sel, authMethod));
expandAdvanced = expandAdvanced || sel != 0;
int certCheckFlags = DcHelper.getInt(this, "imap_certificate_checks");
certCheck.setSelection(certCheckFlags);
expandAdvanced = expandAdvanced || certCheckFlags != 0;
if (expandAdvanced) { onAdvancedSettings(); }
int imapCertificateChecks = DcHelper.getInt(this, "imap_certificate_checks");
if (imapCertificateChecks == 3) {
imapCertificateChecks = 2; // 3 is a deprecated alias for 2
}
certCheck.setSelection(ViewUtil.checkBounds(imapCertificateChecks, certCheck));
expandAdvanced = expandAdvanced || imapCertificateChecks != 0;
} else if (getIntent() != null && getIntent().getBundleExtra(ACCOUNT_DATA) != null) {
// Companion app might have sent account data
Bundle b = getIntent().getBundleExtra(ACCOUNT_DATA);
@@ -261,6 +247,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
}
}
if (expandAdvanced) { onAdvancedSettings(); }
registerForEvents();
}
@@ -272,6 +259,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
public void onResume() {
super.onResume();
dynamicTheme.onResume(this);
proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_PROXY_ENABLED) == 1);
}
private void showLog() {
@@ -449,7 +437,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
.setPositiveButton(R.string.perm_continue, (dialog, which)-> {
// pass control to browser, we'll be back in business at (**)
activity.oauth2Requested = System.currentTimeMillis();
IntentUtils.showBrowserIntent(activity, oauth2url);
IntentUtils.showInBrowser(activity, oauth2url);
oauth2started.set(true);
})
.setCancelable(false)
@@ -504,11 +492,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
if (provider!=null) {
String url = provider.getOverviewPage();
if(!url.isEmpty()) {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
} catch (ActivityNotFoundException e) {
Toast.makeText(this, R.string.no_browser_installed, Toast.LENGTH_LONG).show();
}
IntentUtils.showInBrowser(this, url);
} else {
// this should normally not happen
Toast.makeText(this, "ErrProviderWithoutUrl", Toast.LENGTH_LONG).show();
@@ -574,12 +558,10 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
private void onAdvancedSettings() {
boolean advancedViewVisible = advancedGroup.getVisibility() == View.VISIBLE;
if (advancedViewVisible) {
proxyGroup.setVisibility(View.GONE);
advancedGroup.setVisibility(View.GONE);
advancedIcon.setRotation(45);
} else {
advancedGroup.setVisibility(View.VISIBLE);
if (proxySwitch.isChecked()) proxyGroup.setVisibility(View.VISIBLE);
advancedIcon.setRotation(0);
}
}
@@ -621,15 +603,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
setConfig(R.id.smtp_port_text, CONFIG_SEND_PORT, true);
setConfig(R.id.smtp_login_text, CONFIG_SEND_USER, false);
setConfig(R.id.smtp_password_text, CONFIG_SEND_PASSWORD, false);
if (proxySwitch.isChecked()) {
DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, 1);
setConfig(R.id.socks5_host_text, CONFIG_SOCKS5_HOST, true);
setConfig(R.id.socks5_port_text, CONFIG_SOCKS5_PORT, true);
setConfig(R.id.socks5_user_text, CONFIG_SOCKS5_USER, true);
setConfig(R.id.socks5_password_text, CONFIG_SOCKS5_PASSWORD, false);
} else {
DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, 0);
}
DcHelper.getContext(this).setConfigInt(CONFIG_MAIL_SECURITY, imapSecurity.getSelectedItemPosition());
DcHelper.getContext(this).setConfigInt(CONFIG_SEND_SECURITY, smtpSecurity.getSelectedItemPosition());

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