Compare commits

...

435 Commits

Author SHA1 Message Date
adbenitez fa7a3c9c32 Merge remote-tracking branch 'upstream/main' 2025-12-16 18:50:00 +01:00
adb a70c76f7f3 Merge pull request #4132 from deltachat/prep-2.34.0
prepare 2.34.0
2025-12-16 17:55:19 +01:00
adbenitez 87a6a12367 prepare 2.34.0 2025-12-16 17:50:29 +01:00
adb 9bcdcd918e Merge pull request #4130 from deltachat/update-core-and-stuff-2025.12.16
Update core to 2.34.0
2025-12-16 17:39:45 +01:00
adbenitez 7454454b63 update changelog 2025-12-16 17:35:11 +01:00
adbenitez 69a5e42640 update RPC bindings 2025-12-16 17:35:04 +01:00
adbenitez 1e86ed225d update translations 2025-12-16 17:34:28 +01:00
adbenitez 4cd7977ced update deltachat-core-rust to 'chore: prepare 2.34.0 release' of 'v2.34.0' 2025-12-16 17:29:44 +01:00
adb 0ce10cbb35 Merge pull request #4129 from deltachat/adb/issue-4116-p2
do accounts migration in background
2025-12-16 17:23:24 +01:00
Hocuri 114731f722 Make sending of statistics into a setting (#3794)
Counterpart of https://github.com/chatmail/core/pull/6851

* Make sending of statistics into a setting

* feat: Count securejoin sources and UI paths

* feat: Rename self_reporting to send_statistics

* Adapt core's API change

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

* Adapt to generated jsonrpc

* New strings and a new dialog

* Adapt to the API change

* Rewording: `...and support research`

* "More Info" button rather than link

* Small fixes

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

* Changelog

* Update help

* Fix compile error

* Fix compilation

* Revert submodule change

* Don't show a device message yet

* Move "Send Statistics" setting

* Fix compilation error

* Remove unused constant

---------

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

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

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

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

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

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

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

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

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

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

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

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

moved down 'app picker' for better layout and to match
order of other UI.
2025-12-03 20:28:33 +01:00
adbenitez 230fb79584 allow removing transports 2025-12-02 05:32:21 +01:00
adbenitez 9181a9c398 add uncommited/missing import in RelayListActivity 2025-12-02 05:21:02 +01:00
adbenitez 2f05b20b0f allow editing transports 2025-12-02 05:20:42 +01:00
adbenitez 115ffae588 create RelayListActivity with basic listing of relays/transports 2025-12-02 04:46:30 +01:00
adb 7455e56f11 Merge branch 'main' into adb/add-transport-list-activity 2025-12-01 23:34:05 +01:00
adb d4b8e4bafa Merge pull request #4081 from deltachat/adb/remove-superfluous-dynamic-theme-usage
remove superfluous DynamicTheme usage
2025-12-01 23:21:15 +01:00
adbenitez 67a2e3fcd9 Merge remote-tracking branch 'upstream/main' 2025-12-01 22:04:51 +01:00
adbenitez f12d6855e9 remove superfluous DynamicTheme usage 2025-12-01 21:46:09 +01:00
adbenitez 56459e7e7a add TransportListActivity 2025-12-01 21:26:37 +01:00
adb d5244f5f96 Merge pull request #4079 from deltachat/update-core-and-stuff-2025.12.01
update core to 2.29.0
2025-12-01 21:02:16 +01:00
adbenitez c8722ddcc6 update translations 2025-12-01 20:59:37 +01:00
adbenitez 5874001ec2 update changelog 2025-12-01 20:58:00 +01:00
adbenitez b94a4cbe8b update deltachat-core-rust to 'chore(release): prepare for 2.29.0' of 'v2.29.0' 2025-12-01 20:04:20 +01:00
B. Petersen 5d0b5f7947 remove InfoPlist_NSContactsUsageDescription, this should no longer go to InfoPlist files 2025-12-01 17:54:57 +01:00
adbenitez a193ee6cdf add publishing to ZapStore to CI 2025-11-30 03:00:58 +01:00
B. Petersen ff438731d8 mark strings as deprecated 2025-11-29 13:20:55 +01:00
B. Petersen 08913a5e76 adapt wording to 'delete contact' question; we no longer check the address book 2025-11-29 13:19:24 +01:00
adb e7d2656613 Merge pull request #4074 from deltachat/adb/remove-read-contacts-permission
remove need for READ_CONTACS permission
2025-11-29 02:42:58 +01:00
adbenitez f3210f2626 remove need for READ_CONTACS permission 2025-11-29 02:25:23 +01:00
adb 0b1fa7c7d1 Merge pull request #4073 from deltachat/adb/remove-dev-mode
remove mostly unused dev mode
2025-11-29 02:14:27 +01:00
adbenitez 6b6d48f5da remove mostly unused dev mode 2025-11-29 02:02:22 +01:00
adbenitez 3b9e989195 Merge remote-tracking branch 'upstream/main' 2025-11-29 01:56:03 +01:00
adbenitez 4af065aad9 Merge remote-tracking branch 'upstream/main' 2025-11-29 00:46:41 +01:00
B. Petersen b0e918caab remove explains partly refering to shared usage 2025-11-28 23:55:11 +01:00
B. Petersen a6384dc679 clearer category name 2025-11-28 23:55:11 +01:00
B. Petersen 838db45a74 hiding a categoty hides its options 2025-11-28 23:55:11 +01:00
B. Petersen 44328f1086 update advanced settings
- move 'server' up
- move other options down, after experimental
- introduce 'legacy' section
2025-11-28 23:55:11 +01:00
adb 2064a2f0ea Merge pull request #4071 from deltachat/adb/edge-to-edge3
use recommended way of enabling edge-to-edge
2025-11-28 22:01:58 +01:00
adbenitez 6b066d9428 update comment in BaseActionBarActivity 2025-11-28 21:56:25 +01:00
adb d68508c0cf Merge pull request #4070 from deltachat/adb/update-changelog-2025.11.28
update changelog
2025-11-28 18:15:50 +01:00
adbenitez 5f5f303a93 update changelog 2025-11-28 18:14:38 +01:00
adb 71bb0105ab Merge pull request #4066 from deltachat/adb/webview-links-tweaks
add URL schemes whitelist
2025-11-28 18:12:23 +01:00
adb 796c81af61 Merge pull request #4067 from deltachat/adb/target-sdk-36
Target SDK 36
2025-11-28 18:11:39 +01:00
adb 329c7a52a7 Merge pull request #4064 from deltachat/adb/edge-to-edge2
Make  edge-to-edge great again
2025-11-28 18:10:16 +01:00
B. Petersen b19d39b794 use updated texts in tests 2025-11-28 14:27:18 +01:00
B. Petersen b4d8f1e04f remove all png files before help creation 2025-11-28 14:25:03 +01:00
adbenitez febf2cb105 (temporarily) opt-out predictive back 2025-11-28 02:19:00 +01:00
adbenitez ef00e04638 update compileSdk and targetSdkVersion to 36 in build.gradle 2025-11-28 01:49:49 +01:00
adb 1042f4b4f8 Merge branch 'adb/edge-to-edge2' into adb/webview-links-tweaks 2025-11-28 01:38:39 +01:00
adb 0180d63821 Merge branch 'main' into adb/edge-to-edge2 2025-11-28 01:38:20 +01:00
adb 8b8c6b6bbb Merge pull request #4050 from deltachat/adb/issue-4049
garbage-collect storage of deleted webxdc apps
2025-11-28 01:37:31 +01:00
adbenitez fe8ad85f89 assume core will handle unexisting accounts 2025-11-28 01:35:03 +01:00
adbenitez c938c4dcd9 check for existing account IDs 2025-11-28 01:26:51 +01:00
adb 35f6a06406 Merge branch 'main' into adb/issue-4049 2025-11-27 19:28:49 +01:00
adbenitez db7365c3b3 restrict supported URL schemas 2025-11-27 19:10:18 +01:00
adbenitez 51d7e5df62 update changelog 2025-11-27 07:39:51 +01:00
adb 28f7fbf806 Merge branch 'main' into adb/edge-to-edge2 2025-11-27 07:39:00 +01:00
adbenitez d6d3dd8930 enable edge-to-edge only in SDK 30+ 2025-11-27 07:20:05 +01:00
adbenitez 83571ba0bf ConversationListActivity: fix display of searchToolbar 2025-11-26 23:55:51 +01:00
adbenitez 34fc888c5e WebViewActivity: improve integrated map's edge-to-edge 2025-11-26 23:40:23 +01:00
adbenitez 0a7be040c3 NewContactActivity: small tweaks 2025-11-26 23:11:27 +01:00
adbenitez 448334a8a2 ShareActivity: properly implement edge-to-edge 2025-11-26 23:01:28 +01:00
adbenitez 5141116f38 QrShowActivity: properly implement edge-to-edge 2025-11-26 22:54:20 +01:00
adbenitez 310500b8d7 ProfileActivity: properly implement edge-to-edge 2025-11-26 22:20:59 +01:00
adbenitez 7bc0ab858a ContactSelectionActivity: properly implement edge-to-edge 2025-11-26 22:13:49 +01:00
adbenitez ca438ca3a3 AllMediaActivity: properly implement edge-to-edge 2025-11-26 21:55:45 +01:00
adbenitez 2a2cb7c26e QrActivity: properly implement edge-to-edge 2025-11-26 21:24:58 +01:00
adbenitez 9e5a2d30ed WelcomeActivity: properly implement edge-to-edge 2025-11-26 20:57:50 +01:00
adbenitez 5b8c0db287 WebxdcStoreActivity: properly implement edge-to-edge 2025-11-26 20:32:06 +01:00
adbenitez 08864ae250 WebViewActivity: properly implement edge-to-edge 2025-11-26 20:26:48 +01:00
adbenitez ea6bd9283c EditTransportActivity: properly implement edge-to-edge 2025-11-26 20:11:49 +01:00
adbenitez 83dfca249d LogViewActivity: properly implement edge-to-edge 2025-11-26 19:59:23 +01:00
adbenitez c7d41d1b84 InstantOnboardingActivity: properly implement edge-to-edge 2025-11-26 19:38:55 +01:00
adbenitez b09838f033 ConversationListActivity: properly implement edge-to-edge 2025-11-26 07:55:35 +01:00
adbenitez 10164032f0 GroupCreateActivity: properly implement edge-to-edge 2025-11-26 06:28:25 +01:00
adbenitez 7829ff0a83 CreateProfileActivity: properly implement edge-to-edge 2025-11-26 06:01:49 +01:00
adbenitez aaa8a07511 ConversationListArchiveActivity: properly implement edge-to-edge 2025-11-26 05:43:12 +01:00
adbenitez cd2aedcc6b ConversationActivity: properly implement edge-to-edge 2025-11-26 04:05:09 +01:00
adbenitez 553610cfa4 BlockedContactsActivity: properly implement edge-to-edge 2025-11-26 03:14:43 +01:00
adbenitez ceea00e2cc ApplicationPreferencesActivity: properly implement edge-to-edge 2025-11-26 02:41:33 +01:00
adbenitez ef512b0f14 RegistrationQrActivity: properly implement edge-to-edge 2025-11-26 01:10:57 +01:00
adbenitez 83a7e4df3f BackupTransferActivity: properly implement edge-to-edge 2025-11-26 00:49:08 +01:00
adbenitez d4aa90cc0c ProxySettingsActivity: properly implement edge-to-edge 2025-11-26 00:31:12 +01:00
adbenitez 342d820095 ChatBackgroundActivity: properly implement edge-to-edge 2025-11-25 23:29:19 +01:00
adbenitez 18d9c00d13 NewContactActivity: properly implement edge-to-edge 2025-11-25 22:30:20 +01:00
B. Petersen 8df792a8e3 mark strings that are about to be no longer needed as deprecated 2025-11-25 20:25:06 +01:00
B. Petersen 0693f8ad60 mark strings that are about to be no longer needed as deprecated 2025-11-25 13:50:39 +01:00
adbenitez c6ff66ba51 add missing import 2025-11-24 21:36:59 +01:00
adb eaa6a68e4f Merge pull request #4060 from deltachat/adb/issue-4058
add output of `Rpc.getStorageUsageReportString()` to log
2025-11-24 21:16:23 +01:00
adbenitez 6cf044d7c9 Merge remote-tracking branch 'upstream/main' 2025-11-24 19:24:43 +01:00
adbenitez 174170ee4f update changelog 2025-11-24 00:54:09 +01:00
adbenitez 3ee2c3f0be add output of Rpc.getStorageUsageReportString() to log 2025-11-24 00:44:34 +01:00
adbenitez 339ab13f64 update changelog 2025-11-24 00:18:54 +01:00
adbenitez 777e6f40cb use getExistingMsgIds() 2025-11-23 23:39:47 +01:00
adb 577ec92c53 Merge branch 'main' into adb/issue-4049 2025-11-23 23:29:50 +01:00
adb d41679f2c0 Merge pull request #4057 from deltachat/update-core-and-stuff-2025.11.23
Update core to 2.28.0
2025-11-23 23:28:14 +01:00
adbenitez 2bfb2ae58f update translations 2025-11-23 23:25:42 +01:00
adbenitez ca56ca2dd1 update JSON-RPC bindings 2025-11-23 23:04:29 +01:00
adbenitez ca35a0635b update changelog 2025-11-23 23:01:03 +01:00
adbenitez 127f29a17e update deltachat-core-rust to 'chore(release): prepare for 2.28.0' of 'v2.28.0' 2025-11-23 22:55:20 +01:00
adb 9f40d84a51 Merge branch 'main' into adb/issue-4049 2025-11-23 22:50:04 +01:00
adb 21eab6dfe9 Merge pull request #4045 from deltachat/adb/improve-webxdc-link-handling
allow to open all links (asking before with dialog)
2025-11-23 22:48:33 +01:00
adbenitez d8ea2ad273 only ask to open link in webxdc 2025-11-23 22:18:55 +01:00
adbenitez a66b4d8923 allow to open link directly in local/offile help 2025-11-23 22:14:47 +01:00
adbenitez 3c9a289e2d convert URL to ASCII 2025-11-23 19:50:39 +01:00
adbenitez 29daa1ee89 tweak dialog, allow to copy to clipboard 2025-11-23 19:21:20 +01:00
adbenitez 769a07449f update changelog 2025-11-23 18:48:30 +01:00
adbenitez 0993745c33 allow to open all links (asking before with dialog) 2025-11-23 18:41:04 +01:00
adb f1d9ddeed6 Merge branch 'main' into adb/issue-4049 2025-11-23 16:20:05 +01:00
adb 2218ae91e0 Merge branch 'main' into adb/improve-webxdc-link-handling 2025-11-23 16:16:29 +01:00
adb 21a8ba9674 Merge pull request #4053 from deltachat/adb/improve-buinding-and-releasing-docs
improve building and releasing docs
2025-11-23 16:15:01 +01:00
adbenitez 153fe5f1e7 add trailing new line 2025-11-23 16:13:04 +01:00
adbenitez ec49ac8eb6 improve building and releasing docs 2025-11-22 22:43:21 +01:00
adb da1e71b2d2 Merge branch 'main' into adb/issue-4049 2025-11-22 22:28:03 +01:00
adbenitez 00027ad8f3 remove unused imports 2025-11-22 20:05:46 +01:00
adbenitez 81e7f37d61 move WebxdcGarbageCollectionWorker to webxdc package 2025-11-22 20:05:21 +01:00
adb 4e6c1e3eaf Merge pull request #4051 from deltachat/link2xt/webxdc-garbage-collector-worker
Add WebxdcGarbageCollectionWorker
2025-11-22 19:25:01 +01:00
link2xt 77eda90923 Add WebxdcGarbageCollectionWorker 2025-11-22 16:40:58 +00:00
adbenitez 0a7b9e7ea2 add support for gemini links 2025-11-22 15:35:51 +01:00
adb 718bf0d74b Merge pull request #4035 from deltachat/adb/issue-4020
customize phone number regex in Linkifier
2025-11-22 15:07:33 +01:00
adbenitez 82c963c38f update f-droid store description 2025-11-22 00:35:48 +01:00
adbenitez 999a33e77c remove public bot list from menu 2025-11-22 00:35:30 +01:00
adbenitez e96b4db126 Merge branch 'adb/issue-4049' of https://github.com/deltachat/deltachat-android into adb/issue-4049 2025-11-22 00:06:02 +01:00
adbenitez 118d4f864f add startup delay to avoid bottleneck on app start 2025-11-22 00:05:40 +01:00
adb d6259f112e Merge branch 'main' into adb/issue-4049 2025-11-22 00:03:16 +01:00
adbenitez f9eb55170d add zapstore.yaml 2025-11-21 23:42:11 +01:00
adbenitez 2bb104a234 add geo: support in message bubbles 2025-11-21 23:41:56 +01:00
adbenitez b75b29cf08 Merge remote-tracking branch 'upstream/main' 2025-11-21 23:13:00 +01:00
adbenitez 2a3934cbd7 garbage-collect storage of deleted webxdc apps 2025-11-21 22:47:25 +01:00
B. Petersen 9a6abed1e4 'which help' refers to 'statistics', so it should be plural 2025-11-21 19:49:39 +01:00
adb baf5f97e96 Merge branch 'main' into adb/improve-webxdc-link-handling 2025-11-21 19:46:21 +01:00
adb 3426d9cb37 Merge branch 'main' into adb/issue-4020 2025-11-21 19:45:05 +01:00
Hocuri 53f401caf5 feat: Add missing core stock strings (#4044) 2025-11-21 09:54:59 +01:00
adbenitez 4950d0be55 tweak variable name 2025-11-21 03:33:09 +01:00
adbenitez 57ac9d6b91 don't linkify numbers in the middle of text 2025-11-21 03:11:30 +01:00
adb 8723adbfcd Merge branch 'main' into adb/issue-4020 2025-11-21 02:12:56 +01:00
adb 8c5038c20f Merge pull request #4046 from deltachat/adb/rename-registrationactivity
rename RegistrationActivity to EditTransportActivity
2025-11-21 02:12:38 +01:00
adb 6518c22b79 Merge branch 'main' into adb/issue-4020 2025-11-21 02:11:28 +01:00
adbenitez 0027e2c93b rename RegistrationActivity to EditTransportActivity 2025-11-21 00:50:33 +01:00
adb 0b8eaad68a Merge pull request #4039 from deltachat/adb/use-list_transport
use listTransports
2025-11-20 23:27:33 +01:00
adbenitez 16738f053a tweak RegistrationActivity 2025-11-20 23:22:38 +01:00
adbenitez bed9a4d8d4 remove leftover 2025-11-20 23:21:08 +01:00
adbenitez 1ee3d40f37 tweak RegistrationActivity 2025-11-20 23:20:19 +01:00
adbenitez 1c6e9fc391 tweak RegistrationActivity 2025-11-20 23:17:50 +01:00
adb 31c8e8d46b Merge branch 'main' into adb/improve-webxdc-link-handling 2025-11-20 22:42:31 +01:00
adbenitez ff6e0d9fbf improve webxdc link handling
add geo: support and support for i.delta.chat links
2025-11-20 22:33:14 +01:00
adb a92ccd6d43 Merge branch 'main' into adb/use-list_transport 2025-11-20 18:25:36 +01:00
adb 32bdce147a Merge pull request #4037 from deltachat/adb/add-full-rpc-bindings
add full rpc bindings
2025-11-20 18:25:06 +01:00
B. Petersen 1e6d1ed917 shorten QR scan hints and make them work for channels as well 2025-11-20 18:22:57 +01:00
adb 0f9e378923 Merge branch 'main' into adb/use-list_transport 2025-11-20 18:21:32 +01:00
adb 5aaa11a445 Merge pull request #4038 from deltachat/adb/fix-ChatsPreferenceFragment
fix usage of R.string.pref_backup_export_this
2025-11-19 23:05:17 +01:00
adbenitez e77f266da5 fix usage of R.string.pref_backup_export_this 2025-11-19 18:37:38 +01:00
adbenitez dc1be8e07b use Rpc.listTransports() instead of old configs 2025-11-19 18:34:26 +01:00
adbenitez d9daae7f41 update building instructions 2025-11-19 00:08:22 +01:00
adbenitez b30ae06dde add generated JSON-RPC bindings 2025-11-19 00:08:16 +01:00
adbenitez 488ba08e05 use Linkify.sPhoneNumberMatchFilter 2025-11-18 22:02:34 +01:00
adb 7a1db99daa Merge pull request #4017 from deltachat/adb/fix-conversationtitleview
only show three-dots if self is not in chat
2025-11-18 15:17:21 +01:00
B. Petersen 8450349e19 remove deprecated strings and update some translator hints 2025-11-18 12:00:06 +01:00
adb 50a6389b75 Merge pull request #4034 from deltachat/adb/tweak-multidevice-str-keys
use pref_multidevice_* instead of pref_send_copy_to_self
2025-11-18 11:47:20 +01:00
adbenitez aa4b65dbb0 customize phone number regex in Linkifier 2025-11-18 05:30:09 +01:00
adb 96154422c1 Merge branch 'main' into adb/fix-conversationtitleview 2025-11-18 03:27:31 +01:00
adb bc82f56353 Merge branch 'main' into adb/tweak-multidevice-str-keys 2025-11-18 03:26:09 +01:00
adbenitez 1d9c9bb1b6 use pref_multidevice_* instead of pref_send_copy_to_self 2025-11-17 21:48:57 +01:00
B. Petersen 037a468332 update wording after discussion 2025-11-17 21:08:16 +01:00
B. Petersen df41fa7cba showing password is deprected 2025-11-17 21:08:16 +01:00
B. Petersen a48f595cf7 'send background messages' -> 'exchange data'
- 'backgound' term is used in many other contextes
- 'messages' may also be confused with what the user usually thinks of being a 'message',
  similar for 'send'
2025-11-17 21:08:16 +01:00
B. Petersen f221321e6c add missing comment 2025-11-17 21:08:16 +01:00
B. Petersen bf9842e414 we are saying Real-Time as well, so i think that should be upper cased as well, in general we upper case most key words 2025-11-17 21:08:16 +01:00
link2xt 0ee54460ba Update Rust from 1.86.0 to 1.91.1
Next core will require Rust 1.88.0
2025-11-17 16:54:57 +00:00
adbenitez 83a6fc531a tweak code 2025-11-17 17:12:10 +01:00
adb 8989737c71 Merge branch 'main' into adb/fix-conversationtitleview 2025-11-17 16:34:31 +01:00
adb 56f89af121 Merge pull request #4018 from deltachat/adb/issue-4016
implement Service.onTimeout() in FetchForegroundService
2025-11-17 16:34:11 +01:00
adb 97ee01eac1 Merge branch 'main' into adb/issue-4016 2025-11-17 16:02:42 +01:00
adbenitez 8c7e430d4d use stobBackgroundFetch 2025-11-17 15:29:39 +01:00
B. Petersen 2b36b69251 update translations 2025-11-17 15:11:13 +01:00
adb acf8f10f76 Merge branch 'main' into adb/issue-4016 2025-11-16 13:43:16 +01:00
adb e5b890a765 Merge pull request #4026 from deltachat/update-core-and-stuff-2025.11.16
Update core to 2.27.0
2025-11-16 13:42:35 +01:00
adbenitez 3da97acdfd update translations strings and offline help 2025-11-16 13:41:49 +01:00
adbenitez 75fc7c48e9 update changelog 2025-11-16 13:34:52 +01:00
adbenitez 7bdefeab37 update deltachat-core-rust to 'chore(release): prepare for 2.27.0' of 'v2.27.0' 2025-11-16 13:12:00 +01:00
adb f71097f2d2 Merge pull request #4019 from deltachat/adb/issue-3829
unify multi-device into a single setting
2025-11-16 13:09:35 +01:00
adb 90e2229543 Merge branch 'main' into adb/issue-3829 2025-11-16 13:08:55 +01:00
bjoern e8e9987eb3 use app-term instead of webxdc-term; add "About Apps" to three dot menu (#4025)
* deprecate 'what is webxdc?' string"

it is used when an in-app is on the screen (on desktop),
however, instead of helping, immediately raises another question,
as the user just did not know about webxdc at all at that point
(we are not using the term in the apps at all).

better just use the string 'Help' and open
offline help at #webxdc - the entry is also just improved :)

* add 'help' to app-menu

* just 'help' may be confused with 'help about that app', be little more specific

* update CHANGELOG
2025-11-16 12:56:23 +01:00
adbenitez 68b5383dc4 tweak date 2025-11-15 23:27:12 +01:00
adbenitez 5ab215489a tweak to suggestions 2025-11-15 23:24:57 +01:00
adb 8f401e2a09 Merge branch 'main' into adb/issue-3829 2025-11-15 23:12:52 +01:00
adbenitez 572932e92d show dialog before changing "multi-device mode" switch 2025-11-15 23:11:52 +01:00
Hocuri f924a407b3 feat: Add the possibility to withdraw channel invite links and QR codes (#4022) 2025-11-15 18:17:06 +00:00
B. Petersen adcbf118b6 make use of new string, deprecate the old one 2025-11-14 18:35:55 +01:00
B. Petersen 0e185eff4c add more transport strings 2025-11-14 18:35:55 +01:00
B. Petersen ad5df50eb9 tune down the now advanced button 2025-11-14 18:35:55 +01:00
B. Petersen 22921e72e9 reword 'classic email login' to 'use classic email as transport' 2025-11-14 18:35:55 +01:00
Hocuri 199881e3b2 feat: Rephrase "Establishing end-to-end encryption" -> "Establishing connection" 2025-11-14 17:24:35 +01:00
adbenitez 12ec74e835 update changelog 2025-11-12 19:09:02 +01:00
adbenitez 42d0a40f58 unify multi-device into a single setting 2025-11-12 17:47:52 +01:00
adbenitez 68e8b64b47 stop service in onTimeout 2025-11-12 17:00:36 +01:00
adbenitez a06f77b5f8 update changelog 2025-11-12 16:57:32 +01:00
adbenitez b809fc007b implement Service.onTimeout() in FetchForegroundService 2025-11-12 16:46:21 +01:00
adbenitez 334893071b use DcChat.isSelfInChat in ProfileAvatarItem 2025-11-12 00:15:36 +01:00
adbenitez 306064e260 only show three-dots if self is not in chat 2025-11-12 00:09:13 +01:00
adb 85f679c69f Merge pull request #4014 from deltachat/adb/improve-ConversationTitleView
improve ConversationTitleView
2025-11-10 19:16:45 +01:00
adb f23e3d4e22 Merge branch 'main' into adb/improve-ConversationTitleView 2025-11-10 19:16:35 +01:00
adb 59d4c8fbd8 Merge pull request #4015 from deltachat/adb/issue-3980
don't show weird dialog if recoding video fails
2025-11-10 19:16:00 +01:00
adbenitez 5f33c8a56d update changelog 2025-11-10 18:04:45 +01:00
adbenitez 45ba604820 don't show weird dialog if recoding video fails 2025-11-10 18:03:30 +01:00
adbenitez 780df4df46 update changelog 2025-11-10 17:35:14 +01:00
adbenitez 01ac637142 only show group member count if dcChat.canSend() is true 2025-11-10 17:30:32 +01:00
adbenitez 147de536f7 remove deprecated unused profileView parameter in setTitle 2025-11-10 17:22:33 +01:00
adbenitez 9f0596de0a don't linkify numbers 2025-11-10 16:24:25 +01:00
adbenitez 750fbaa6cc Merge remote-tracking branch 'upstream/main' 2025-11-10 15:42:21 +01:00
B. Petersen c623343b04 add dotdotdot to 'share with' 2025-11-10 15:29:40 +01:00
adb b216274b37 Merge pull request #4011 from deltachat/adb/change-link-colors
change link color
2025-11-10 15:27:59 +01:00
adbenitez 843e813593 update changelog 2025-11-10 15:27:29 +01:00
Copilot 9eb0608c89 Add GitHub Copilot instructions (#59)
* Add GitHub Copilot instructions for ArcaneChat Android

Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com>
2025-11-10 14:11:55 +00:00
adbenitez 560a993972 change link color 2025-11-10 14:53:13 +01:00
adb 8701c72d43 Merge pull request #4005 from deltachat/adb/issue-4004
tweak RegistrationActivity for chatmail profiles
2025-11-07 22:19:33 +01:00
adbenitez 454f8a4628 update changelog 2025-11-07 22:18:33 +01:00
adb 03cc658e7e Merge pull request #4007 from deltachat/adb/remove-deprecated-advanced-section
remove deprecated/broken `send_autocrypt_setup_message` advanced preference
2025-11-07 22:14:36 +01:00
B. Petersen e12081642d unify e-mail to email 2025-11-07 22:12:41 +01:00
adbenitez 9cbdd8d553 remove deprecated/broken send_autocrypt_setup_message advanced preference 2025-11-07 21:58:43 +01:00
adbenitez 65b1d93c70 tweak RegistrationActivity 2025-11-07 21:36:31 +01:00
adbenitez 085eace0cf tweak RegistrationActivity for chatmail profiles 2025-11-07 17:43:21 +01:00
adbenitez 552f6e2975 use subscribers instead of recipients 2025-11-07 16:59:48 +01:00
adbenitez fa75294472 add device message 2025-11-07 11:34:25 +01:00
adbenitez 75498e7fa7 Merge remote-tracking branch 'upstream/main' 2025-11-06 16:21:57 +01:00
adbenitez f57d44cea7 update full_description.txt 2025-11-06 15:34:33 +01:00
adb 242e3beb93 Merge pull request #3999 from deltachat/prep-2.25.0
prepare 2.25.0
2025-11-06 14:52:25 +01:00
B. Petersen 21d4a1604b the whole login is 'advanced', so an 'advanced -> advanced' is a bit weird' 2025-11-06 12:05:20 +01:00
B. Petersen f33805abb0 'For advanced users:' could be misunderstood as if the following points are valid for advanced users, but the login is fine for beginners. clarify this 2025-11-06 12:05:20 +01:00
B. Petersen 5fd4a60af4 in the help and elsewhere, we say 'mail icon' 2025-11-06 11:36:54 +01:00
B. Petersen a59eaea0e4 use term e2ee as elsewhere 2025-11-06 11:36:54 +01:00
adbenitez b11628346f update build.gradle 2025-11-05 22:08:51 +01:00
adbenitez a6f99bdb58 update changelog 2025-11-05 22:08:32 +01:00
adb e44bc65ca2 Merge pull request #3998 from deltachat/update-core-and-stuff-5/11/25
Update core to 2.25.0
2025-11-05 22:03:13 +01:00
adbenitez 77f4e9f116 update changelog 2025-11-05 21:36:54 +01:00
adbenitez b40f98a00e update deltachat-core-rust to 'chore(release): prepare for 2.25.0' of 'v2.25.0' 2025-11-05 21:17:37 +01:00
adb 596983d2c1 Merge pull request #3996 from deltachat/adb/issue-3926
tweak registraction screen and empty chat hints for classic email
2025-11-05 21:11:07 +01:00
adb 78f061bc9d Merge branch 'main' into adb/issue-3926 2025-11-05 20:33:49 +01:00
adbenitez 2f42d3bcd2 update changelog 2025-11-05 20:05:32 +01:00
adbenitez d67b71297d tweak registraction screen and empty chat hints for classic email 2025-11-05 20:01:51 +01:00
Hocuri 629ae0b16e fix: Don't crash when QR code can't be loaded (#3995)
Before this PR, when a QR code couldn't be loaded because of https://github.com/chatmail/core/pull/7399, Delta Chat crashed.

Now, the button does nothing.

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

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

---------

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

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

* more cleanup
2025-10-23 18:55:06 +02:00
adbenitez 091ecc0329 update full_description 2025-10-23 14:22:18 +02:00
adb 7ecc1d0381 Merge branch 'main' into adb/issue-3944 2025-10-17 14:58:43 +02:00
adbenitez 7cba6edca9 update changelog 2025-10-16 19:46:19 +02:00
adbenitez 8fb870c51c don't show badge-counter in app icon for permanent notification 2025-10-16 19:35:14 +02:00
266 changed files with 20381 additions and 21455 deletions
+175
View File
@@ -0,0 +1,175 @@
# GitHub Copilot Instructions for ArcaneChat Android
## Project Overview
ArcaneChat is a Delta Chat Android client built on top of the official Delta Chat client with several improvements. It is a messenger app that uses email infrastructure for secure communication.
**Technology Stack:**
- **Language:** Java (Java 8 compatibility)
- **Build System:** Gradle with Android Gradle Plugin 8.11.1
- **Min SDK:** 21 (Android 5.0)
- **Target SDK:** 35 (Android 15)
- **NDK Version:** 27.0.12077973
- **Native Components:** Rust (deltachat-core-rust submodule)
- **UI Framework:** Android SDK, Material Design Components
- **Testing:** JUnit 4, Espresso, Mockito, PowerMock, AssertJ
## Repository Structure
- `src/main/` - Main application source code
- `src/androidTest/` - Instrumented tests (UI tests, benchmarks)
- `src/gplay/` - Google Play flavor-specific code
- `src/foss/` - F-Droid/FOSS flavor-specific code
- `jni/deltachat-core-rust/` - Native Rust core library (submodule)
- `scripts/` - Build and helper scripts
- `docs/` - Documentation
- `fastlane/` - App store metadata and screenshots
## Build Instructions
### Prerequisites
1. **Initialize submodules:**
```bash
git submodule update --init --recursive
```
2. **Build native libraries:**
```bash
scripts/ndk-make.sh
```
Note: First run may take significant time as it builds for all architectures (armeabi-v7a, arm64-v8a, x86, x86_64)
3. **Build APK:**
```bash
./gradlew assembleDebug
```
### Build Flavors
- **gplay:** Google Play version with Firebase Cloud Messaging (applicationId: `com.github.arcanechat`)
- **foss:** F-Droid version without proprietary services (applicationId: `chat.delta.lite`)
### Build Outputs
- Debug APKs: `build/outputs/apk/gplay/debug/` and `build/outputs/apk/fat/debug/`
- Release APKs require signing configuration in `~/.gradle/gradle.properties`
## Testing
### Running Unit Tests
```bash
./gradlew test
```
### Running Instrumented Tests
1. **Disable animations** on your device/emulator:
- Developer Options → Set "Window animation scale", "Transition animation scale", and "Animator duration scale" to 0x
2. **Run tests:**
```bash
./gradlew connectedAndroidTest
```
### Online Tests
Some tests require real email credentials. Configure in `~/.gradle/gradle.properties`:
```properties
TEST_ADDR=youraccount@yourdomain.org
TEST_MAIL_PW=yourpassword
```
### UI Tests and Benchmarks
- Located in `src/androidTest/java/com/b44t/messenger/`
- Test categories: `uitests/online/`, `uitests/offline/`, `uibenchmarks/`
- Run via Android Studio: Run → Edit Configurations → Android Instrumented Test
## Coding Conventions
### General Guidelines
1. **Embrace existing style:** Match the coding style of the file you're editing
2. **Minimize changes:** Don't refactor or rename in the same PR as bug fixes/features
3. **Readable over paradigmatic:** Favor readability over strict Java patterns
4. **Avoid premature optimization:** Keep things simple and on point
5. **No excessive abstraction:** Avoid unnecessary factories, one-liner functions, or abstraction layers
6. **Comments:** Only add comments if they match existing style or explain complex logic
### Architecture
- **UI/Model Separation:** Delta Chat Core (Rust) handles the model layer
- **High-level interface:** Core provides data in UI-ready form; avoid additional transformations in UI layer
- **Direct approach:** Prefer direct implementation over excessive class hierarchies
### Key Principles
- Work hard to avoid options and up-front choices
- Avoid speaking about keys/encryption in primary UI
- App must work offline and with poor network
- Users don't read much text
- Consistency matters
- Primary UI should only show highly useful features
## Common Development Tasks
### Adding New Features
1. Consider the UX philosophy (minimal options, offline-first, simplicity)
2. Check if core library changes are needed before implementing in UI
3. Match existing code style in modified files
4. Add instrumented tests for UI changes when appropriate
5. Update relevant documentation
### Modifying Core Integration
- Core library is in `jni/deltachat-core-rust/` submodule
- Java bindings are in `src/main/java/com/b44t/messenger/Dc*.java`
- JSON-RPC bindings in `chat.delta.rpc.*` package (generated via dcrpcgen)
### Working with Translations
- Translations managed via Transifex (not in repository)
- English source strings: `res/values/strings.xml`
- Don't mix string changes with refactoring
### Debugging Native Code
Decode crash symbols:
```bash
$ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decoded.txt
```
## WebXDC Support
ArcaneChat has extended WebXDC support:
- `window.webxdc.arcanechat` - Version detection
- `sendToChat()` - Extra properties: `subject`, `html`, `type` (sticker/image/audio/video/file)
- External link support in apps
- `manifest.toml` - `orientation` field for landscape mode
## Important Files
- `build.gradle` - Main build configuration
- `CONTRIBUTING.md` - Contribution guidelines
- `BUILDING.md` - Detailed build setup
- `RELEASE.md` - Release process
- `proguard-rules.pro` - ProGuard configuration
- `google-services.json` - Firebase configuration (gplay flavor)
## Package Structure
- `org.thoughtcrime.securesms.*` - Main UI components (legacy namespace from Signal)
- `com.b44t.messenger.*` - Delta Chat core integration
- `chat.delta.rpc.*` - JSON-RPC bindings (generated)
## Notes for AI Assistants
- This is a fork of Delta Chat Android with ArcaneChat-specific improvements
- Maintain compatibility with Delta Chat core library
- Test on both gplay and foss flavors when making changes
- Native library must be rebuilt after core changes
- ProGuard is enabled in both debug and release builds
- Multi-dex is enabled due to app size
+12 -1
View File
@@ -60,7 +60,7 @@ jobs:
./gradlew assembleGplayRelease
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
- name: Release
- name: Release on GitHub
uses: softprops/action-gh-release@v1
with:
token: "${{ secrets.GITHUB_TOKEN }}"
@@ -68,3 +68,14 @@ jobs:
prerelease: ${{ contains(github.event.ref, '-beta') }}
fail_on_unmatched_files: true
files: build/outputs/apk/foss/release/*.apk
- name: Release on ZapStore
run: |
export CHECKSUM=6e2c7cf6da53c3f1a78b523a6aacd6316dce3d74ace6f859c2676729ee439990
curl -sL https://cdn.zapstore.dev/$CHECKSUM -o zapstore
if echo "$CHECKSUM zapstore" | sha256sum -c --status; then
chmod +x zapstore
SIGN_WITH=${{ secrets.NOSTR_KEY }} ./zapstore publish --indexer-mode
else
echo "ERROR: checksum doesn't match!"
fi
+4 -16
View File
@@ -22,24 +22,12 @@ subproject _deltachat-core-rust_:
## Generate JSON-RPC bindings
To generate the JSON-RPC bindings (ex. `chat.delta.rpc.*` package)
install the [dcrpcgen tool](https://github.com/chatmail/dcrpcgen)
then generate the `schema.json` file:
To generate/update the JSON-RPC bindings (ex. `chat.delta.rpc.*` package)
install Rust tooling (read sections below) and the [dcrpcgen tool](https://github.com/chatmail/dcrpcgen)
then generate the code running the script:
```
# install deltachat-rpc-server program:
cargo install --path ./jni/deltachat-core-rust/deltachat-rpc-server
# check the version of core matches:
deltachat-rpc-server --version
# generate the schema:
deltachat-rpc-server --openrpc > schema.json
```
then pass the schema file to the `dcrpcgen` tool to generate the
code:
```
dcrpcgen java --schema schema.json -o ./src/main/java/
./scripts/generate-rpc-bindings.sh
```
## Build Using Nix
+57
View File
@@ -1,5 +1,62 @@
# Delta Chat Android Changelog
## v2.34.0
2025-12
* Allow to add relay from clipboard or image if camera permission is not granted
* Avoid crash in the "View Log" screen
* Update to core 2.34.0
## v2.33.1
2025-12
* Target Android 16
* Change color of links in text messages
* Improve edge-to-edge support
* Add the option (opt-in) to send anonymous statistics to Delta Chat's developers
* Metadata protection: protect message recipients
* Allow to withdraw channel invite links and QR codes
* Allow to open externally links clicked inside in-chat apps
* Do not show "1 member" when the process of joining the group is not finished
* Make search case-insensitive for non-ASCII chat and contact names
* Improve handling of video recoding
* Send .webm videos as file, they are not supported by all platforms
* Tweak advanced section and wording of some advanced options
* Fix: avoid crash in push notifications handling
* Fix: avoid freezing in background
* Fix: clean up web storage of deleted in-chat apps
* Fix: avoid crash when exporting some files with wrong image MIME type
* Expose new "Multi-device mode" option instead of "Delete from server" for chatmail profiles
* Opened in-chat apps got a 'About Apps' menu item
* Avoid gray avatar on profile creation
* Avoid last item in chat list being covered by the floating button
* Add disk usage statistics to log
* New experimental feature: several addresses per profile
* Update to core 2.33.0
## v2.25.0
2025-11
* Make it possible to invite members into a channel via a QR code,
and make channels more secure
* metadata protection: protect Date header
* metadata protection: protect Autocrypt header
* better multi-device: synchronize group creation across devices
* data saving: do not send Autocrypt header in read receipts
* improve onboarding speed
* allow to save to storage files shared from inside in-chat apps
* reduce app size
* don't show badge counter in app icon for the permanent background notification
* fix sorting of old media in gallery
* fix text direction in "x members" subtitle for RTL languages
* fix group invite QR screen's layout
* tweak text hints in advanced classic e-mail configuration
* remove deprecated "companion app" code
* remove deprecated "Watch Sent Folder" preference
* remove deprecated "send self-report" preference
* don't show email address in shared vcard
* update to core 2.25.0
## v2.22.0
2025-10
+10 -12
View File
@@ -3,6 +3,8 @@
## Generate APKs
### Update core and translations
on the command-line, in a PR called "update-core-and-stuff-DATE":
1. update core:
@@ -21,12 +23,19 @@ a) Update `CHANGELOG.md`
as `update to core 1.2.3` or `using core 1.2.3`
2. update translations and local help:
2. update JSON-RPC bindings:
```
./scripts/update-rpc-bindings.sh
```
3. update translations and local help:
```
./scripts/tx-pull-translations.sh
./scripts/create-local-help.sh # requires deltachat-pages checked out at ../deltachat-pages
```
### Prepare release
the following steps are done in a PR called `prep-VERSION` (no leading "v"):
3. Update `CHANGELOG.md`:
@@ -109,17 +118,6 @@ This may take some days.
c) tap "Publish release"
## Release on Amazon Appstore
on <https://developer.amazon.com/dashboard>:
12. a) click "App List", for "Delta Chat", select "Add upcoming version" on the left
b) at "Step 1 / Existing file(s)" hit "Replace", upload the APK from above
c) on the "Step 1" page, add "Release notes" from CHANGELOG.md, hit "Next"
d) on "Step 2" and "Step 3" pages, hit "Next"
e) on "Step 4" page: "Submit app"
## Release on Huawei AppGallery
on <https://developer.huawei.com/consumer/en/appgallery>:
+10 -6
View File
@@ -21,7 +21,7 @@ android {
}
namespace "org.thoughtcrime.securesms"
flavorDimensions "none"
compileSdk 35
compileSdk 36
// Set NDK version to strip native libraries.
// Even though we compile our libraries outside Gradle with `scripts/ndk-make.sh`,
@@ -33,14 +33,14 @@ android {
useLibrary 'org.apache.http.legacy'
defaultConfig {
versionCode 30000730
versionName "2.22.0"
versionCode 30000735
versionName "2.34.0"
applicationId "chat.delta.lite"
multiDexEnabled true
minSdkVersion 21
targetSdkVersion 35
targetSdkVersion 36
vectorDrawables.useSupportLibrary = true
@@ -130,7 +130,9 @@ android {
buildTypes {
debug {
minifyEnabled false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
testProguardFiles 'test-proguard-rules.pro'
applicationIdSuffix ".beta"
}
release {
@@ -144,9 +146,10 @@ android {
// nb: it is highly recommended to use the same settings in debug+release -
// otherwise problems might be noticed delayed only
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
testProguardFiles 'test-proguard-rules.pro'
productFlavors.foss.signingConfig signingConfigs.releaseFdroid
productFlavors.gplay.signingConfig signingConfigs.releaseApk
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
@@ -208,6 +211,7 @@ dependencies {
implementation "io.noties.markwon:inline-parser:$markwon_version"
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
implementation 'androidx.concurrent:concurrent-futures:1.3.0'
implementation 'androidx.sharetarget:sharetarget:1.2.0'
implementation 'androidx.webkit:webkit:1.14.0'
implementation 'androidx.multidex:multidex:2.0.1'
@@ -23,17 +23,14 @@ ArcaneChat is a Delta Chat client and was created with a focus on usability, goo
<li>Multiple color themes/skins</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>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>Verified icon is shown in the chat list for the "Device Messages" chat</li>
<li>Verified icon is shown in the chat list for the "Device Messages" and "Saved Messages" chat to avoid fishing attempts by scammer pretending to be the official chats</li>
<li>Voice messages have more aggressive compression in "worse quality" mode to save data plan</li>
<li>Automatic download of messages limited to 640KB by default</li>
<li>Profile's display name is always shown in the app's title bar instead of the name of the app</li>
<li>Your avatar is visible to other users in Mailing Lists</li>
<li>Can be selected as app to open .xdc files</li>
<li>For mini-apps developers: there are some extra features in the WebXDC API, check https://github.com/ArcaneChat/android/#webxdc</li>
<li>Better settings organization with additional "Privacy" section</li>
</ul>
@@ -0,0 +1,36 @@
ArcaneChat — децентрализованный и защищённый мессенджер, удобный для друзей и семьи.
• Анонимность. Мгновенный вход без номера телефона, e-mail или других личных данных.
• Гибкость. Поддерживает несколько профилей чатов и легко настраивается на нескольких устройствах.
• Расширяемость. В чатах можно использовать мини-приложения: списки покупок, календари или игры.
• Надёжность. Работает даже при плохом соединении и в сложных сетевых условиях.
• Безопасность. Проверенное сквозное шифрование, защищённое от сетевых и серверных атак.
• Самостоятельность. Может работать с вашим собственным e-mail-адресом или сервером.
ArcaneChat — клиент Delta Chat, разработанный с акцентом на удобство, качественный UX и экономию трафика. Также приложение часто экспериментирует с новыми функциями, которые со временем могут быть добавлены в официальный клиент Delta Chat.
<b>Основные отличия от официального клиента Delta Chat:</b>
<ul>
<li>Поддержка некоторых стилей markdown в текстовых сообщениях (жирный, курсив, зачёркнутый и т.д.)</li>
<li>Поддержка отображения анимированных стикеров Telegram (.tgs-файлы)</li>
<li>Поддержка предпросмотра SVG-изображений</li>
<li>Несколько цветовых тем/скинов</li>
<li>Возможность отключать профили, полностью отключая им доступ в сеть для экономии трафика</li>
<li>На панели переключения профилей видно состояние подключения каждого профиля</li>
<li>Дополнительная опция для обмена местоположением на 12 часов</li>
<li>Нажатие на сообщение с POI открывает его на карте</li>
<li>Статус «был(а) в сети» отображается в списке контактов, как в WhatsApp, Telegram и т.д.</li>
<li>Видео воспроизводятся по кругу — удобно для коротких GIF-видео</li>
<li>У чата «Device Messages» в списке чатов отображается значок подтверждения</li>
<li>В режиме «низкое качество» голосовые сообщения сжимаются сильнее для экономии трафика</li>
<li>Автоматическая загрузка сообщений по умолчанию ограничена 640KB</li>
<li>Отображаемое имя профиля всегда видно в заголовке приложения вместо названия приложения</li>
<li>Для разработчиков мини-приложений: доступны дополнительные возможности WebXDC API, см. https://github.com/ArcaneChat/android/#webxdc</li>
<li>Более удобная организация настроек с дополнительным разделом «Privacy»</li>
</ul>
@@ -0,0 +1 @@
⚡ Быстрые зашифрованные чаты для семьи 🎉
@@ -0,0 +1 @@
ArcaneChat
Generated
+3 -3
View File
@@ -138,11 +138,11 @@
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1756197489,
"narHash": "sha256-S16rPaBH1TnMbDyL5NlGSJcYd7wPlOEWTStdBDL7BHw=",
"lastModified": 1763347184,
"narHash": "sha256-6QH8hpCYJxifvyHEYg+Da0BotUn03BwLIvYo3JAxuqQ=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "8ec04f46f1edeeed3f870da62191745b93975da7",
"rev": "08895cce80433978d5bfd668efa41c5e24578cbd",
"type": "github"
},
"original": {
+3 -2
View File
@@ -18,7 +18,7 @@
build-tools-35-0-0
cmdline-tools-latest
platform-tools
platforms-android-35
platforms-android-36
ndk-27-2-12479018
]);
rust-version = pkgs.lib.removeSuffix "\n"
@@ -27,10 +27,11 @@
{
formatter = pkgs.nixpkgs-fmt;
devShells.default = pkgs.mkShell {
devShells.default = pkgs.mkShell rec {
ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk";
ANDROID_NDK_ROOT =
"${android-sdk}/share/android-sdk/ndk/27.2.12479018";
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/35.0.0/aapt2";
buildInputs = [
android-sdk
pkgs.openjdk17
+8 -7
View File
@@ -231,6 +231,12 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcAccounts_backgroundFetch(JNIEnv *en
}
JNIEXPORT void Java_com_b44t_messenger_DcAccounts_stopBackgroundFetch(JNIEnv *env, jobject obj)
{
dc_accounts_stop_background_fetch(get_dc_accounts(env, obj));
}
JNIEXPORT jint Java_com_b44t_messenger_DcAccounts_migrateAccount(JNIEnv *env, jobject obj, jstring dbfile)
{
CHAR_REF(dbfile);
@@ -536,10 +542,10 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_createChatByContactId(JNIEnv *e
}
JNIEXPORT jint Java_com_b44t_messenger_DcContext_createGroupChat(JNIEnv *env, jobject obj, jboolean verified, jstring name)
JNIEXPORT jint Java_com_b44t_messenger_DcContext_createGroupChat(JNIEnv *env, jobject obj, jstring name)
{
CHAR_REF(name);
jint ret = (jint)dc_create_group_chat(get_dc_context(env, obj), verified, namePtr);
jint ret = (jint)dc_create_group_chat(get_dc_context(env, obj), 0, namePtr);
CHAR_UNREF(name);
return ret;
}
@@ -1261,11 +1267,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_canSend(JNIEnv *env, jobject o
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isProtected(JNIEnv *env, jobject obj)
{
return dc_chat_is_protected(get_dc_chat(env, obj))!=0;
}
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isSendingLocations(JNIEnv *env, jobject obj)
{
+83
View File
@@ -0,0 +1,83 @@
.PHONY: apk
apk:
./scripts/rebrand.sh
./gradlew --offline assembleGplayRelease
./scripts/undo_rebrand.sh
.PHONY: aab
aab:
./scripts/rebrand.sh
sed -i 's/signingConfigs.releaseApk/signingConfigs.releaseBundle/g' build.gradle
./gradlew --offline bundleGplayRelease
sed -i 's/signingConfigs.releaseBundle/signingConfigs.releaseApk/g' build.gradle
./scripts/undo_rebrand.sh
.PHONY: foss
foss:
./scripts/rebrand.sh
./gradlew --offline assembleFossRelease
./scripts/undo_rebrand.sh
.PHONY: install
install:
adb -d install -r build/outputs/apk/gplay/release/*universal*.apk
.PHONY: emulator-install
emulator-install:
adb install -r build/outputs/apk/gplay/release/*universal*.apk
.PHONY: fetch
fetch:
git fetch upstream
.PHONY: clean
clean:
./gradlew --offline clean
# CORE:
.PHONY: fetch-core
fetch-core:
cd ../core && git fetch upstream
.PHONY: core
core:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-fast
core-fast:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh arm64-v8a; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-v7
core-v7:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh armeabi-v7a; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: core-x86
core-x86:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
./scripts/ndk-make.sh x86; true
./scripts/undo_rebrand.sh
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
.PHONY: link
link:
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
.PHONY: unlink
unlink:
mv jni/deltachat-core-rust ../core
mkdir jni/deltachat-core-rust
-1
View File
@@ -5,7 +5,6 @@
-keep class chat.delta.rpc.** { * ; }
-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; }
#-dontwarn com.fasterxml.jackson.databind.**
# bug with video recoder
-keep class com.coremedia.iso.** { *; }
+1
View File
@@ -1 +1,2 @@
rm src/main/assets/help/*.png
../deltachat-pages/tools/create-local-help.py ../deltachat-pages/result src/main/assets/help
+1 -1
View File
@@ -1 +1 @@
1.86.0
1.91.1
+11
View File
@@ -0,0 +1,11 @@
#!/bin/sh
# you need to have dcrpcgen
# generate schema.json
ROOT_DIR=$PWD
cd ./jni/deltachat-core-rust/deltachat-rpc-server
cargo run -- --openrpc > "$ROOT_DIR/schema.json"
cd "$ROOT_DIR"
# generate code
dcrpcgen java --schema schema.json -o ./src/main/java/
@@ -54,7 +54,7 @@ public class ForwardingTest {
// The thing is, DC_STATE_OUT_PENDING show a rotating circle animation, and Espresso doesn't work
// with animations, and the tests would hang and never finish.
dcContext.setConfig("bcc_self", "0");
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat(false, "group"));
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat( "group"));
}
@After
@@ -52,7 +52,7 @@ public class SharingTest {
@Before
public void createGroup() {
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat(false, "group"));
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat( "group"));
}
@Before
@@ -41,7 +41,7 @@ public class OnboardingTest {
}
onView(withText(R.string.scan_invitation_code)).check(matches(isClickable()));
onView(withText(R.string.import_backup_title)).check(matches(isClickable()));
onView(withText(R.string.login_header)).perform(click());
onView(withText(R.string.manual_account_setup_option)).perform(click());
onView(withHint(R.string.email_address)).perform(replaceText(BuildConfig.TEST_ADDR));
onView(withHint(R.string.existing_password)).perform(replaceText(BuildConfig.TEST_MAIL_PW));
onView(withContentDescription(R.string.ok)).perform(click());
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<application>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="specialUse"
android:enabled="true" />
</application>
</manifest>
+5
View File
@@ -10,6 +10,11 @@
<meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" />
<application>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="dataSync"
android:enabled="true" />
<service
android:name=".notifications.FcmReceiveService"
android:foregroundServiceType="dataSync"
@@ -62,7 +62,7 @@ public class FcmReceiveService extends FirebaseMessagingService {
prefixedToken = addPrefix(rawToken);
Log.i(TAG, "FCM token: " + prefixedToken);
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
triedRegistering = true;
});
}
@@ -104,6 +104,6 @@ public class FcmReceiveService extends FirebaseMessagingService {
public void onNewToken(@NonNull String rawToken) {
prefixedToken = addPrefix(rawToken);
Log.i(TAG, "new FCM token: " + prefixedToken);
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
}
}
+6 -30
View File
@@ -13,7 +13,6 @@
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
<!-- dangerous permissions - we need to as the user with a PermissionsRequest -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
@@ -55,6 +54,7 @@
android:requestLegacyExternalStorage="true"
tools:targetApi="TIRAMISU"
android:hasFragileUserData="true"
android:enableOnBackInvokedCallback="false"
>
<!-- android car support, see https://developer.android.com/training/auto/start/,
@@ -233,25 +233,17 @@
android:theme="@style/TextSecure.LightNoActionBar"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name=".RegistrationActivity"
<activity android:name=".relay.EditRelayActivity"
android:launchMode="singleTask"
android:windowSoftInputMode="stateUnchanged"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- this scheme is used as the redirect_url for getOauth2Url()
and should be whitelisted by the supported oauth2 services -->
<data android:scheme="chat.delta" android:path="/${applicationId}/auth" tools:ignore="AppLinkUrlError"/>
<data android:scheme="chat.delta" android:path="/auth" tools:ignore="AppLinkUrlError"/>
</intent-filter>
</activity>
<activity android:name=".relay.RelayListActivity"
android:windowSoftInputMode="stateHidden"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
<activity android:name=".proxy.ProxySettingsActivity"
android:label="@string/proxy_settings"
android:windowSoftInputMode="stateHidden"
@@ -399,11 +391,6 @@
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
</activity>
<service
android:name=".connect.KeepAliveService"
android:foregroundServiceType="dataSync"
android:enabled="true" />
<service
android:name=".geolocation.LocationBackgroundService"
android:foregroundServiceType="location" />
@@ -416,17 +403,6 @@
android:name=".service.FetchForegroundService"
android:foregroundServiceType="dataSync" />
<service
android:name=".service.IPCAddAccountsService"
android:foregroundServiceType="dataSync"
android:enabled="true"
android:exported="true"
>
<intent-filter>
<action android:name="chat.delta.addaccount" />
</intent-filter>
</service>
<receiver android:name=".notifications.MarkReadReceiver"
android:enabled="true"
android:exported="false">
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

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

After

Width:  |  Height:  |  Size: 1.5 KiB

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

Before

Width:  |  Height:  |  Size: 137 B

After

Width:  |  Height:  |  Size: 138 B

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

Before

Width:  |  Height:  |  Size: 145 B

After

Width:  |  Height:  |  Size: 148 B

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

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -94,7 +94,7 @@ public abstract class BaseTransport implements Rpc.Transport {
}
if (response.error != null) {
future.setException(new RpcException(response.error.toString()));
future.setException(new RpcException(response.error.message));
} else if (response.result != null) {
future.set(response.result);
} else {
@@ -115,10 +115,15 @@ public abstract class BaseTransport implements Rpc.Transport {
}
}
private static class RpcError {
public int code;
public String message;
}
private static class Response {
public String jsonrpc;
public int id;
public JsonNode result;
public JsonNode error;
public RpcError error;
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,32 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = Account.Configured.class, name="Configured"), @Type(value = Account.Unconfigured.class, name="Unconfigured")})
public abstract class Account {
public static class Configured extends Account {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String addr;
public String color;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String displayName;
public Integer id;
/** Optional tag as "Work", "Family". Meant to help profile owner to differ between profiles with similar names. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String privateTag;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
}
public static class Unconfigured extends Account {
public Integer id;
}
}
@@ -0,0 +1,35 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/**
* cheaper version of fullchat, omits: - contacts - contact_ids - fresh_message_counter - ephemeral_timer - self_in_group - was_seen_recently - can_send
* <p>
* used when you only need the basic metadata of a chat like type, name, profile picture
*/
public class BasicChat {
public Boolean archived;
public ChatType chatType;
public String color;
public Integer id;
public Boolean isContactRequest;
public Boolean isDeviceChat;
/**
* True if the chat is encrypted. This means that all messages in the chat are encrypted, and all contacts in the chat are "key-contacts", i.e. identified by the PGP key fingerprint.
* <p>
* False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
* <p>
* Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
* <p>
* Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
* <p>
* See also `is_key_contact` on `Contact`.
*/
public Boolean isEncrypted;
public Boolean isMuted;
public Boolean isSelfTalk;
public Boolean isUnpromoted;
public String name;
public Boolean pinned;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
}
@@ -2,7 +2,7 @@
package chat.delta.rpc.types;
public class CallInfo {
/* True if SDP offer has a video. */
/** True if SDP offer has a video. */
public Boolean hasVideo;
/**
* SDP offer.
@@ -19,21 +19,21 @@ public abstract class CallState {
public static class Alerting extends CallState {
}
/* Active call. */
/** Active call. */
public static class Active extends CallState {
}
/* Completed call that was once active and then was terminated for any reason. */
/** Completed call that was once active and then was terminated for any reason. */
public static class Completed extends CallState {
/* Call duration in seconds. */
/** Call duration in seconds. */
public Integer duration;
}
/* Incoming call that was not picked up within a timeout or was explicitly ended by the caller before we picked up. */
/** Incoming call that was not picked up within a timeout or was explicitly ended by the caller before we picked up. */
public static class Missed extends CallState {
}
/* Incoming call that was explicitly ended on our side before picking up or outgoing call that was declined before the timeout. */
/** Incoming call that was explicitly ended on our side before picking up or outgoing call that was declined before the timeout. */
public static class Declined extends CallState {
}
@@ -0,0 +1,71 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = ChatListItemFetchResult.ChatListItem.class, name="ChatListItem"), @Type(value = ChatListItemFetchResult.ArchiveLink.class, name="ArchiveLink"), @Type(value = ChatListItemFetchResult.Error.class, name="Error")})
public abstract class ChatListItemFetchResult {
public static class ChatListItem extends ChatListItemFetchResult {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String avatarPath;
public ChatType chatType;
public String color;
/** contact id if this is a dm chat (for view profile entry in context menu) */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer dmChatContact;
public Integer freshMessageCounter;
public Integer id;
public Boolean isArchived;
public Boolean isContactRequest;
public Boolean isDeviceTalk;
/**
* True if the chat is encrypted. This means that all messages in the chat are encrypted, and all contacts in the chat are "key-contacts", i.e. identified by the PGP key fingerprint.
* <p>
* False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
* <p>
* Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
* <p>
* Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
* <p>
* See also `is_key_contact` on `Contact`.
*/
public Boolean isEncrypted;
/** deprecated 2025-07, use chat_type instead */
public Boolean isGroup;
public Boolean isMuted;
public Boolean isPinned;
public Boolean isSelfInGroup;
public Boolean isSelfTalk;
public Boolean isSendingLocation;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer lastMessageId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Viewtype lastMessageType;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer lastUpdated;
public String name;
/** showing preview if last chat message is image */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summaryPreviewImage;
public Integer summaryStatus;
public String summaryText1;
public String summaryText2;
public Boolean wasSeenRecently;
}
public static class ArchiveLink extends ChatListItemFetchResult {
public Integer freshMessageCounter;
}
public static class Error extends ChatListItemFetchResult {
public String error;
public Integer id;
}
}
@@ -0,0 +1,10 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum ChatType {
Single,
Group,
Mailinglist,
OutBroadcast,
InBroadcast,
}
@@ -0,0 +1,8 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum ChatVisibility {
Normal,
Archived,
Pinned,
}
@@ -0,0 +1,52 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class Contact {
public String address;
public String authName;
public String color;
public String displayName;
/**
* Is encryption available for this contact.
* <p>
* This can only be true for key-contacts. However, it is possible to have a key-contact for which encryption is not available because we don't have a key yet, e.g. if we just scanned the fingerprint from a QR code.
*/
public Boolean e2eeAvail;
public Integer id;
public Boolean isBlocked;
/** If the contact is a bot. */
public Boolean isBot;
/** Is the contact a key contact. */
public Boolean isKeyContact;
/**
* True if the contact can be added to protected chats because SELF and contact have verified their fingerprints in both directions.
* <p>
* See [`Self::verifier_id`]/`Contact.verifierId` for a guidance how to display these information.
*/
public Boolean isVerified;
/** the contact's last seen timestamp */
public Integer lastSeen;
public String name;
public String nameAndAddr;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
public String status;
/**
* The contact ID that verified a contact.
* <p>
* As verifier may be unknown, use [`Self::is_verified`]/`Contact.isVerified` to check if a contact can be added to a protected chat.
* <p>
* UI should display the information in the contact's profile as follows:
* <p>
* - If `verifierId` != 0, display text "Introduced by ..." with the name and address of the contact formatted by `name_and_addr`/`nameAndAddr`. Prefix the text by a green checkmark.
* <p>
* - If `verifierId` == 0 and `isVerified` != 0, display "Introduced" prefixed by a green checkmark.
* <p>
* - if `verifierId` == 0 and `isVerified` == 0, display nothing
* <p>
* This contains the contact ID of the verifier. If it is `DC_CONTACT_ID_SELF`, we verified the contact ourself. If it is None/Null, we don't have verifier information or the contact is not verified.
*/
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer verifierId;
public Boolean wasSeenRecently;
}
@@ -0,0 +1,10 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum DownloadState {
Done,
Available,
Failure,
Undecipherable,
InProgress,
}
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public enum EnteredCertificateChecks {
/* `Automatic` means that provider database setting should be taken. If there is no provider database setting for certificate checks, check certificates strictly. */
/** `Automatic` means that provider database setting should be taken. If there is no provider database setting for certificate checks, check certificates strictly. */
automatic,
/* Ensure that TLS certificate is valid for the server hostname. */
/** Ensure that TLS certificate is valid for the server hostname. */
strict,
/* Accept certificates that are expired, self-signed or otherwise not valid for the server hostname. */
/** Accept certificates that are expired, self-signed or otherwise not valid for the server hostname. */
acceptInvalidCertificates,
}
@@ -7,27 +7,27 @@ package chat.delta.rpc.types;
* Usually it will be enough to only set `addr` and `password`, and all the other settings will be autoconfigured.
*/
public class EnteredLoginParam {
/* Email address. */
/** Email address. */
public String addr;
/* TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
/** TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public EnteredCertificateChecks certificateChecks;
/* Imap server port. */
/** Imap server port. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer imapPort;
/* Imap socket security. */
/** Imap socket security. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Socket imapSecurity;
/* Imap server hostname or IP address. */
/** Imap server hostname or IP address. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imapServer;
/* Imap username. */
/** Imap username. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imapUser;
/* If true, login via OAUTH2 (not recommended anymore). Default: false */
/** If true, login via OAUTH2 (not recommended anymore). Default: false */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Boolean oauth2;
/* Password. */
/** Password. */
public String password;
/**
* SMTP Password.
@@ -36,16 +36,16 @@ public class EnteredLoginParam {
*/
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpPassword;
/* SMTP server port. */
/** SMTP server port. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer smtpPort;
/* SMTP socket security. */
/** SMTP socket security. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Socket smtpSecurity;
/* SMTP server hostname or IP address. */
/** SMTP server hostname or IP address. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpServer;
/* SMTP username. */
/** SMTP username. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String smtpUser;
}
@@ -0,0 +1,28 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = EphemeralTimer.Disabled.class, name="Disabled"), @Type(value = EphemeralTimer.Enabled.class, name="Enabled")})
public abstract class EphemeralTimer {
/** Timer is disabled. */
public static class Disabled extends EphemeralTimer {
}
/** Timer is enabled. */
public static class Enabled extends EphemeralTimer {
/**
* Timer duration in seconds.
* <p>
* The value cannot be 0.
*/
public Integer duration;
}
}
@@ -0,0 +1,9 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class Event {
/** Account ID. */
public Integer contextId;
/** Event payload. */
public EventType event;
}
@@ -0,0 +1,420 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = EventType.Info.class, name="Info"), @Type(value = EventType.SmtpConnected.class, name="SmtpConnected"), @Type(value = EventType.ImapConnected.class, name="ImapConnected"), @Type(value = EventType.SmtpMessageSent.class, name="SmtpMessageSent"), @Type(value = EventType.ImapMessageDeleted.class, name="ImapMessageDeleted"), @Type(value = EventType.ImapMessageMoved.class, name="ImapMessageMoved"), @Type(value = EventType.ImapInboxIdle.class, name="ImapInboxIdle"), @Type(value = EventType.NewBlobFile.class, name="NewBlobFile"), @Type(value = EventType.DeletedBlobFile.class, name="DeletedBlobFile"), @Type(value = EventType.Warning.class, name="Warning"), @Type(value = EventType.Error.class, name="Error"), @Type(value = EventType.ErrorSelfNotInGroup.class, name="ErrorSelfNotInGroup"), @Type(value = EventType.MsgsChanged.class, name="MsgsChanged"), @Type(value = EventType.ReactionsChanged.class, name="ReactionsChanged"), @Type(value = EventType.IncomingReaction.class, name="IncomingReaction"), @Type(value = EventType.IncomingWebxdcNotify.class, name="IncomingWebxdcNotify"), @Type(value = EventType.IncomingMsg.class, name="IncomingMsg"), @Type(value = EventType.IncomingMsgBunch.class, name="IncomingMsgBunch"), @Type(value = EventType.MsgsNoticed.class, name="MsgsNoticed"), @Type(value = EventType.MsgDelivered.class, name="MsgDelivered"), @Type(value = EventType.MsgFailed.class, name="MsgFailed"), @Type(value = EventType.MsgRead.class, name="MsgRead"), @Type(value = EventType.MsgDeleted.class, name="MsgDeleted"), @Type(value = EventType.ChatModified.class, name="ChatModified"), @Type(value = EventType.ChatEphemeralTimerModified.class, name="ChatEphemeralTimerModified"), @Type(value = EventType.ChatDeleted.class, name="ChatDeleted"), @Type(value = EventType.ContactsChanged.class, name="ContactsChanged"), @Type(value = EventType.LocationChanged.class, name="LocationChanged"), @Type(value = EventType.ConfigureProgress.class, name="ConfigureProgress"), @Type(value = EventType.ImexProgress.class, name="ImexProgress"), @Type(value = EventType.ImexFileWritten.class, name="ImexFileWritten"), @Type(value = EventType.SecurejoinInviterProgress.class, name="SecurejoinInviterProgress"), @Type(value = EventType.SecurejoinJoinerProgress.class, name="SecurejoinJoinerProgress"), @Type(value = EventType.ConnectivityChanged.class, name="ConnectivityChanged"), @Type(value = EventType.SelfavatarChanged.class, name="SelfavatarChanged"), @Type(value = EventType.ConfigSynced.class, name="ConfigSynced"), @Type(value = EventType.WebxdcStatusUpdate.class, name="WebxdcStatusUpdate"), @Type(value = EventType.WebxdcRealtimeData.class, name="WebxdcRealtimeData"), @Type(value = EventType.WebxdcRealtimeAdvertisementReceived.class, name="WebxdcRealtimeAdvertisementReceived"), @Type(value = EventType.WebxdcInstanceDeleted.class, name="WebxdcInstanceDeleted"), @Type(value = EventType.AccountsBackgroundFetchDone.class, name="AccountsBackgroundFetchDone"), @Type(value = EventType.ChatlistChanged.class, name="ChatlistChanged"), @Type(value = EventType.ChatlistItemChanged.class, name="ChatlistItemChanged"), @Type(value = EventType.AccountsChanged.class, name="AccountsChanged"), @Type(value = EventType.AccountsItemChanged.class, name="AccountsItemChanged"), @Type(value = EventType.EventChannelOverflow.class, name="EventChannelOverflow"), @Type(value = EventType.IncomingCall.class, name="IncomingCall"), @Type(value = EventType.IncomingCallAccepted.class, name="IncomingCallAccepted"), @Type(value = EventType.OutgoingCallAccepted.class, name="OutgoingCallAccepted"), @Type(value = EventType.CallEnded.class, name="CallEnded"), @Type(value = EventType.TransportsModified.class, name="TransportsModified")})
public abstract class EventType {
/**
* The library-user may write an informational string to the log.
* <p>
* This event should *not* be reported to the end-user using a popup or something like that.
*/
public static class Info extends EventType {
public String msg;
}
/** Emitted when SMTP connection is established and login was successful. */
public static class SmtpConnected extends EventType {
public String msg;
}
/** Emitted when IMAP connection is established and login was successful. */
public static class ImapConnected extends EventType {
public String msg;
}
/** Emitted when a message was successfully sent to the SMTP server. */
public static class SmtpMessageSent extends EventType {
public String msg;
}
/** Emitted when an IMAP message has been marked as deleted */
public static class ImapMessageDeleted extends EventType {
public String msg;
}
/** Emitted when an IMAP message has been moved */
public static class ImapMessageMoved extends EventType {
public String msg;
}
/** Emitted before going into IDLE on the Inbox folder. */
public static class ImapInboxIdle extends EventType {
}
/** Emitted when an new file in the $BLOBDIR was created */
public static class NewBlobFile extends EventType {
public String file;
}
/** Emitted when an file in the $BLOBDIR was deleted */
public static class DeletedBlobFile extends EventType {
public String file;
}
/**
* The library-user should write a warning string to the log.
* <p>
* This event should *not* be reported to the end-user using a popup or something like that.
*/
public static class Warning extends EventType {
public String msg;
}
/**
* The library-user should report an error to the end-user.
* <p>
* As most things are asynchronous, things may go wrong at any time and the user should not be disturbed by a dialog or so. Instead, use a bubble or so.
* <p>
* However, for ongoing processes (eg. configure()) or for functions that are expected to fail (eg. autocryptContinueKeyTransfer()) it might be better to delay showing these events until the function has really failed (returned false). It should be sufficient to report only the *last* error in a message box then.
*/
public static class Error extends EventType {
public String msg;
}
/** An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
public static class ErrorSelfNotInGroup extends EventType {
public String msg;
}
/** Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
public static class MsgsChanged extends EventType {
/** Set if only a single chat is affected by the changes, otherwise 0. */
public Integer chatId;
/** Set if only a single message is affected by the changes, otherwise 0. */
public Integer msgId;
}
/** Reactions for the message changed. */
public static class ReactionsChanged extends EventType {
/** ID of the chat which the message belongs to. */
public Integer chatId;
/** ID of the contact whose reaction set is changed. */
public Integer contactId;
/** ID of the message for which reactions were changed. */
public Integer msgId;
}
/**
* A reaction to one's own sent message received. Typically, the UI will show a notification for that.
* <p>
* In addition to this event, ReactionsChanged is emitted.
*/
public static class IncomingReaction extends EventType {
/** ID of the chat which the message belongs to. */
public Integer chatId;
/** ID of the contact whose reaction set is changed. */
public Integer contactId;
/** ID of the message for which reactions were changed. */
public Integer msgId;
/** The reaction. */
public String reaction;
}
/** Incoming webxdc info or summary update, should be notified. */
public static class IncomingWebxdcNotify extends EventType {
/** ID of the chat. */
public Integer chatId;
/** ID of the contact sending. */
public Integer contactId;
/** Link assigned to this notification, if any. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String href;
/** ID of the added info message or webxdc instance in case of summary change. */
public Integer msgId;
/** Text to notify. */
public String text;
}
/**
* There is a fresh message. Typically, the user will show a notification when receiving this message.
* <p>
* There is no extra #DC_EVENT_MSGS_CHANGED event sent together with this event.
*/
public static class IncomingMsg extends EventType {
/** ID of the chat where the message is assigned. */
public Integer chatId;
/** ID of the message. */
public Integer msgId;
}
/** Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
public static class IncomingMsgBunch extends EventType {
}
/** Messages were seen or noticed. chat id is always set. */
public static class MsgsNoticed extends EventType {
public Integer chatId;
}
/** A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
public static class MsgDelivered extends EventType {
/** ID of the chat which the message belongs to. */
public Integer chatId;
/** ID of the message that was successfully sent. */
public Integer msgId;
}
/** A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
public static class MsgFailed extends EventType {
/** ID of the chat which the message belongs to. */
public Integer chatId;
/** ID of the message that could not be sent. */
public Integer msgId;
}
/** A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
public static class MsgRead extends EventType {
/** ID of the chat which the message belongs to. */
public Integer chatId;
/** ID of the message that was read. */
public Integer msgId;
}
/**
* A single message was deleted.
* <p>
* This event means that the message will no longer appear in the messagelist. UI should remove the message from the messagelist in response to this event if the message is currently displayed.
* <p>
* The message may have been explicitly deleted by the user or expired. Internally the message may have been removed from the database, moved to the trash chat or hidden.
* <p>
* This event does not indicate the message deletion from the server.
*/
public static class MsgDeleted extends EventType {
/** ID of the chat where the message was prior to deletion. Never 0. */
public Integer chatId;
/** ID of the deleted message. Never 0. */
public Integer msgId;
}
/**
* Chat changed. The name or the image of a chat group was changed or members were added or removed. See setChatName(), setChatProfileImage(), addContactToChat() and removeContactFromChat().
* <p>
* This event does not include ephemeral timer modification, which is a separate event.
*/
public static class ChatModified extends EventType {
public Integer chatId;
}
/** Chat ephemeral timer changed. */
public static class ChatEphemeralTimerModified extends EventType {
/** Chat ID. */
public Integer chatId;
/** New ephemeral timer value. */
public Integer timer;
}
/** Chat deleted. */
public static class ChatDeleted extends EventType {
/** Chat ID. */
public Integer chat_id;
}
/** Contact(s) created, renamed, blocked or deleted. */
public static class ContactsChanged extends EventType {
/** If set, this is the contact_id of an added contact that should be selected. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contactId;
}
/** Location of one or more contact has changed. */
public static class LocationChanged extends EventType {
/** contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contactId;
}
/** Inform about the configuration progress started by configure(). */
public static class ConfigureProgress extends EventType {
/** Progress comment or error, something to display to the user. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String comment;
/**
* Progress.
* <p>
* 0=error, 1-999=progress in permille, 1000=success and done
*/
public Integer progress;
}
/** Inform about the import/export progress started by imex(). */
public static class ImexProgress extends EventType {
/** 0=error, 1-999=progress in permille, 1000=success and done */
public Integer progress;
}
/**
* A file has been exported. A file has been written by imex(). This event may be sent multiple times by a single call to imex().
* <p>
* A typical purpose for a handler of this event may be to make the file public to some system services.
* <p>
* @param data2 0
*/
public static class ImexFileWritten extends EventType {
public String path;
}
/**
* Progress event sent when SecureJoin protocol has finished from the view of the inviter (Alice, the person who shows the QR code).
* <p>
* These events are typically sent after a joiner has scanned the QR code generated by getChatSecurejoinQrCodeSvg().
*/
public static class SecurejoinInviterProgress extends EventType {
/** ID of the chat in case of success. */
public Integer chatId;
/** The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
public ChatType chatType;
/** ID of the contact that wants to join. */
public Integer contactId;
/** Progress, always 1000. */
public Integer progress;
}
/** Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
public static class SecurejoinJoinerProgress extends EventType {
/** ID of the inviting contact. */
public Integer contactId;
/** Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
public Integer progress;
}
/** The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
public static class ConnectivityChanged extends EventType {
}
/** Deprecated by `ConfigSynced`. */
public static class SelfavatarChanged extends EventType {
}
/** A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
public static class ConfigSynced extends EventType {
/** Configuration key. */
public String key;
}
public static class WebxdcStatusUpdate extends EventType {
/** Message ID. */
public Integer msgId;
/** Status update ID. */
public Integer statusUpdateSerial;
}
/** Data received over an ephemeral peer channel. */
public static class WebxdcRealtimeData extends EventType {
/** Realtime data. */
public java.util.List<Integer> data;
/** Message ID. */
public Integer msgId;
}
/** Advertisement received over an ephemeral peer channel. This can be used by bots to initiate peer-to-peer communication from their side. */
public static class WebxdcRealtimeAdvertisementReceived extends EventType {
/** Message ID of the webxdc instance. */
public Integer msgId;
}
/** Inform that a message containing a webxdc instance has been deleted */
public static class WebxdcInstanceDeleted extends EventType {
/** ID of the deleted message. */
public Integer msgId;
}
/**
* Tells that the Background fetch was completed (or timed out). This event acts as a marker, when you reach this event you can be sure that all events emitted during the background fetch were processed.
* <p>
* This event is only emitted by the account manager
*/
public static class AccountsBackgroundFetchDone extends EventType {
}
/**
* Inform that set of chats or the order of the chats in the chatlist has changed.
* <p>
* Sometimes this is emitted together with `UIChatlistItemChanged`.
*/
public static class ChatlistChanged extends EventType {
}
/** Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
public static class ChatlistItemChanged extends EventType {
/** ID of the changed chat */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer chatId;
}
/**
* Inform that the list of accounts has changed (an account removed or added or (not yet implemented) the account order changes)
* <p>
* This event is only emitted by the account manager
*/
public static class AccountsChanged extends EventType {
}
/**
* Inform that an account property that might be shown in the account list changed, namely: - is_configured (see is_configured()) - displayname - selfavatar - private_tag
* <p>
* This event is emitted from the account whose property changed.
*/
public static class AccountsItemChanged extends EventType {
}
/** Inform than some events have been skipped due to event channel overflow. */
public static class EventChannelOverflow extends EventType {
/** Number of events skipped. */
public Integer n;
}
/** Incoming call. */
public static class IncomingCall extends EventType {
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/** True if incoming call is a video call. */
public Boolean has_video;
/** ID of the info message referring to the call. */
public Integer msg_id;
/** User-defined info as passed to place_outgoing_call() */
public String place_call_info;
}
/** Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
public static class IncomingCallAccepted extends EventType {
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/** ID of the info message referring to the call. */
public Integer msg_id;
}
/** Outgoing call accepted. */
public static class OutgoingCallAccepted extends EventType {
/** User-defined info passed to dc_accept_incoming_call( */
public String accept_call_info;
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/** ID of the info message referring to the call. */
public Integer msg_id;
}
/** Call ended. */
public static class CallEnded extends EventType {
/** ID of the chat which the message belongs to. */
public Integer chat_id;
/** ID of the info message referring to the call. */
public Integer msg_id;
}
/**
* One or more transports has changed.
* <p>
* This event is used for tests to detect when transport synchronization messages arrives. UIs don't need to use it, it is unlikely that user modifies transports on multiple devices simultaneously.
*/
public static class TransportsModified extends EventType {
}
}
@@ -0,0 +1,42 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class FullChat {
public Boolean archived;
public Boolean canSend;
public ChatType chatType;
public String color;
public java.util.List<Integer> contactIds;
public java.util.List<Contact> contacts;
public Integer ephemeralTimer;
public Integer freshMessageCounter;
public Integer id;
public Boolean isContactRequest;
public Boolean isDeviceChat;
/**
* True if the chat is encrypted. This means that all messages in the chat are encrypted, and all contacts in the chat are "key-contacts", i.e. identified by the PGP key fingerprint.
* <p>
* False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
* <p>
* Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
* <p>
* Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
* <p>
* See also `is_key_contact` on `Contact`.
*/
public Boolean isEncrypted;
public Boolean isMuted;
public Boolean isSelfTalk;
public Boolean isUnpromoted;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String mailingListAddress;
public String name;
/** Contact IDs of the past chat members. */
public java.util.List<Integer> pastContactIds;
public Boolean pinned;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
/** Note that this is different from [`ChatListItem::is_self_in_group`](`crate::api::types::chat_list::ChatListItemFetchResult::ChatListItem::is_self_in_group`). This property should only be accessed when [`FullChat::chat_type`] is [`Chattype::Group`]. */
public Boolean selfInGroup;
public Boolean wasSeenRecently;
}
@@ -2,12 +2,12 @@
package chat.delta.rpc.types;
public class HttpResponse {
/* base64-encoded response body. */
/** base64-encoded response body. */
public String blob;
/* Encoding, e.g. "utf-8". */
/** Encoding, e.g. "utf-8". */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String encoding;
/* MIME type, e.g. "text/plain" or "text/html". */
/** MIME type, e.g. "text/plain" or "text/html". */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String mimetype;
}
@@ -0,0 +1,16 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class Location {
public Float accuracy;
public Integer chatId;
public Integer contactId;
public Boolean isIndependent;
public Float latitude;
public Integer locationId;
public Float longitude;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String marker;
public Integer msgId;
public Integer timestamp;
}
@@ -0,0 +1,69 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class Message {
public Integer chatId;
public Integer dimensionsHeight;
public Integer dimensionsWidth;
public DownloadState downloadState;
public Integer duration;
/** An error text, if there is one. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String error;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String file;
public Integer fileBytes;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String fileMime;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String fileName;
public Integer fromId;
public Boolean hasDeviatingTimestamp;
public Boolean hasHtml;
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
public Boolean hasLocation;
public Integer id;
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer infoContactId;
/** True if the message was sent by a bot. */
public Boolean isBot;
public Boolean isEdited;
public Boolean isForwarded;
public Boolean isInfo;
public Boolean isSetupmessage;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer originalMsgId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String overrideSenderName;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer parentId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public MessageQuote quote;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Reactions reactions;
public Integer receivedTimestamp;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer savedMessageId;
public Contact sender;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String setupCodeBegin;
/**
* True if the message was correctly encrypted&signed, false otherwise. Historically, UIs showed a small padlock on the message then.
* <p>
* Today, the UIs should instead show a small email-icon on the message if `show_padlock` is `false`, and nothing if it is `true`.
*/
public Boolean showPadlock;
public Integer sortTimestamp;
public Integer state;
public String subject;
/** when is_info is true this describes what type of system message it is */
public SystemMessageType systemMessageType;
public String text;
public Integer timestamp;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public VcardContact vcardContact;
public Viewtype viewType;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String webxdcHref;
}
@@ -0,0 +1,24 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class MessageData {
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String file;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String filename;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String html;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Pair<Float, Float> location;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String overrideSenderName;
/** Quoted message id. Takes preference over `quoted_text` (see below). */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer quotedMessageId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String quotedText;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String text;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Viewtype viewtype;
}
@@ -0,0 +1,14 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class MessageInfo {
public EphemeralTimer ephemeralTimer;
/** When message is ephemeral this contains the timestamp of the message expiry */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer ephemeralTimestamp;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String error;
public String hopInfo;
public String rfc724Mid;
public java.util.List<String> serverUrls;
}
@@ -0,0 +1,24 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = MessageListItem.Message.class, name="Message"), @Type(value = MessageListItem.DayMarker.class, name="DayMarker")})
public abstract class MessageListItem {
public static class Message extends MessageListItem {
public Integer msg_id;
}
/** Day marker, separating messages that correspond to different days according to local time. */
public static class DayMarker extends MessageListItem {
/** Marker timestamp, for day markers, in unix milliseconds */
public Integer timestamp;
}
}
@@ -0,0 +1,85 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = MessageLoadResult.Message.class, name="Message"), @Type(value = MessageLoadResult.LoadingError.class, name="LoadingError")})
public abstract class MessageLoadResult {
public static class Message extends MessageLoadResult {
public Integer chatId;
public Integer dimensionsHeight;
public Integer dimensionsWidth;
public DownloadState downloadState;
public Integer duration;
/** An error text, if there is one. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String error;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String file;
public Integer fileBytes;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String fileMime;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String fileName;
public Integer fromId;
public Boolean hasDeviatingTimestamp;
public Boolean hasHtml;
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
public Boolean hasLocation;
public Integer id;
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer infoContactId;
/** True if the message was sent by a bot. */
public Boolean isBot;
public Boolean isEdited;
public Boolean isForwarded;
public Boolean isInfo;
public Boolean isSetupmessage;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer originalMsgId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String overrideSenderName;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer parentId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public MessageQuote quote;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Reactions reactions;
public Integer receivedTimestamp;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer savedMessageId;
public Contact sender;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String setupCodeBegin;
/**
* True if the message was correctly encrypted&signed, false otherwise. Historically, UIs showed a small padlock on the message then.
* <p>
* Today, the UIs should instead show a small email-icon on the message if `show_padlock` is `false`, and nothing if it is `true`.
*/
public Boolean showPadlock;
public Integer sortTimestamp;
public Integer state;
public String subject;
/** when is_info is true this describes what type of system message it is */
public SystemMessageType systemMessageType;
public String text;
public Integer timestamp;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public VcardContact vcardContact;
public Viewtype viewType;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String webxdcHref;
}
public static class LoadingError extends MessageLoadResult {
public String error;
}
}
@@ -0,0 +1,20 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class MessageNotificationInfo {
public Integer accountId;
public Integer chatId;
public String chatName;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String chatProfileImage;
public Integer id;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String image;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String imageMimeType;
/** also known as summary_text1 */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summaryPrefix;
/** also known as summary_text2 */
public String summaryText;
}
@@ -0,0 +1,33 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = MessageQuote.JustText.class, name="JustText"), @Type(value = MessageQuote.WithMessage.class, name="WithMessage")})
public abstract class MessageQuote {
public static class JustText extends MessageQuote {
public String text;
}
public static class WithMessage extends MessageQuote {
public String authorDisplayColor;
public String authorDisplayName;
/** The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
public Integer chatId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String image;
public Boolean isForwarded;
public Integer messageId;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String overrideSenderName;
public String text;
public Viewtype viewType;
}
}
@@ -0,0 +1,7 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class MessageReadReceipt {
public Integer contactId;
public Integer timestamp;
}
@@ -0,0 +1,22 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class MessageSearchResult {
public String authorColor;
public Integer authorId;
/** if sender name if overridden it will show it as ~alias */
public String authorName;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String authorProfileImage;
public String chatColor;
public Integer chatId;
public String chatName;
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String chatProfileImage;
public ChatType chatType;
public Integer id;
public Boolean isChatArchived;
public Boolean isChatContactRequest;
public String message;
public Integer timestamp;
}
@@ -0,0 +1,24 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = MuteDuration.NotMuted.class, name="NotMuted"), @Type(value = MuteDuration.Forever.class, name="Forever"), @Type(value = MuteDuration.Until.class, name="Until")})
public abstract class MuteDuration {
public static class NotMuted extends MuteDuration {
}
public static class Forever extends MuteDuration {
}
public static class Until extends MuteDuration {
public Integer duration;
}
}
@@ -0,0 +1,13 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum NotifyState {
/** Not subscribed to push notifications. */
NotConnected,
/** Subscribed to heartbeat push notifications. */
Heartbeat,
/** Subscribed to push notifications for new messages. */
Connected,
}
@@ -0,0 +1,36 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class Pair<T1, T2> {
private final T1 v1;
private final T2 v2;
public Pair(T1 v1, T2 v2) {
this.v1 = v1;
this.v2 = v2;
}
public T1 first(){
return v1;
}
public T2 second(){
return v2;
}
public boolean equals(Object o) {
return o instanceof Pair &&
equal(((Pair) o).first(), first()) &&
equal(((Pair) o).second(), second());
}
public int hashCode() {
return first().hashCode() ^ second().hashCode();
}
private boolean equal(Object first, Object second) {
if (first == null && second == null) return true;
if (first == null || second == null) return false;
return first.equals(second);
}
}
@@ -0,0 +1,10 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class ProviderInfo {
public String beforeLoginHint;
/** Unique ID, corresponding to provider database filename. */
public String id;
public String overviewPage;
public Integer status;
}
+254
View File
@@ -0,0 +1,254 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
@JsonSubTypes({@Type(value = Qr.AskVerifyContact.class, name="AskVerifyContact"), @Type(value = Qr.AskVerifyGroup.class, name="AskVerifyGroup"), @Type(value = Qr.AskJoinBroadcast.class, name="AskJoinBroadcast"), @Type(value = Qr.FprOk.class, name="FprOk"), @Type(value = Qr.FprMismatch.class, name="FprMismatch"), @Type(value = Qr.FprWithoutAddr.class, name="FprWithoutAddr"), @Type(value = Qr.Account.class, name="Account"), @Type(value = Qr.Backup2.class, name="Backup2"), @Type(value = Qr.BackupTooNew.class, name="BackupTooNew"), @Type(value = Qr.WebrtcInstance.class, name="WebrtcInstance"), @Type(value = Qr.Proxy.class, name="Proxy"), @Type(value = Qr.Addr.class, name="Addr"), @Type(value = Qr.Url.class, name="Url"), @Type(value = Qr.Text.class, name="Text"), @Type(value = Qr.WithdrawVerifyContact.class, name="WithdrawVerifyContact"), @Type(value = Qr.WithdrawVerifyGroup.class, name="WithdrawVerifyGroup"), @Type(value = Qr.WithdrawJoinBroadcast.class, name="WithdrawJoinBroadcast"), @Type(value = Qr.ReviveVerifyContact.class, name="ReviveVerifyContact"), @Type(value = Qr.ReviveVerifyGroup.class, name="ReviveVerifyGroup"), @Type(value = Qr.ReviveJoinBroadcast.class, name="ReviveJoinBroadcast"), @Type(value = Qr.Login.class, name="Login")})
public abstract class Qr {
/**
* Ask the user whether to verify the contact.
* <p>
* If the user agrees, pass this QR code to [`crate::securejoin::join_securejoin`].
*/
public static class AskVerifyContact extends Qr {
/** Authentication code. */
public String authcode;
/** ID of the contact. */
public Integer contact_id;
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/** Invite number. */
public String invitenumber;
}
/** Ask the user whether to join the group. */
public static class AskVerifyGroup extends Qr {
/** Authentication code. */
public String authcode;
/** ID of the contact. */
public Integer contact_id;
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/** Group ID. */
public String grpid;
/** Group name. */
public String grpname;
/** Invite number. */
public String invitenumber;
}
/** Ask the user whether to join the broadcast channel. */
public static class AskJoinBroadcast extends Qr {
/** Authentication code. */
public String authcode;
/** ID of the contact who owns the broadcast channel and created the QR code. */
public Integer contact_id;
/** Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
public String fingerprint;
/** A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
public String grpid;
/** Invite number. */
public String invitenumber;
/** The user-visible name of this broadcast channel */
public String name;
}
/**
* Contact fingerprint is verified.
* <p>
* Ask the user if they want to start chatting.
*/
public static class FprOk extends Qr {
/** Contact ID. */
public Integer contact_id;
}
/** Scanned fingerprint does not match the last seen fingerprint. */
public static class FprMismatch extends Qr {
/** Contact ID. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer contact_id;
}
/** The scanned QR code contains a fingerprint but no e-mail address. */
public static class FprWithoutAddr extends Qr {
/** Key fingerprint. */
public String fingerprint;
}
/** Ask the user if they want to create an account on the given domain. */
public static class Account extends Qr {
/** Server domain name. */
public String domain;
}
/** Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
public static class Backup2 extends Qr {
/** Authentication token. */
public String auth_token;
/** Iroh node address. */
public String node_addr;
}
public static class BackupTooNew extends Qr {
}
/** Ask the user if they want to use the given service for video chats. */
public static class WebrtcInstance extends Qr {
public String domain;
public String instance_pattern;
}
/**
* Ask the user if they want to use the given proxy.
* <p>
* Note that HTTP(S) URLs without a path and query parameters are treated as HTTP(S) proxy URL. UI may want to still offer to open the URL in the browser if QR code contents starts with `http://` or `https://` and the QR code was not scanned from the proxy configuration screen.
*/
public static class Proxy extends Qr {
/** Host extracted from the URL to display in the UI. */
public String host;
/** Port extracted from the URL to display in the UI. */
public Integer port;
/**
* Proxy URL.
* <p>
* This is the URL that is going to be added.
*/
public String url;
}
/**
* Contact address is scanned.
* <p>
* Optionally, a draft message could be provided. Ask the user if they want to start chatting.
*/
public static class Addr extends Qr {
/** Contact ID. */
public Integer contact_id;
/** Draft message. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String draft;
}
/**
* URL scanned.
* <p>
* Ask the user if they want to open a browser or copy the URL to clipboard.
*/
public static class Url extends Qr {
public String url;
}
/**
* Text scanned.
* <p>
* Ask the user if they want to copy the text to clipboard.
*/
public static class Text extends Qr {
public String text;
}
/** Ask the user if they want to withdraw their own QR code. */
public static class WithdrawVerifyContact extends Qr {
/** Authentication code. */
public String authcode;
/** Contact ID. */
public Integer contact_id;
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/** Invite number. */
public String invitenumber;
}
/** Ask the user if they want to withdraw their own group invite QR code. */
public static class WithdrawVerifyGroup extends Qr {
/** Authentication code. */
public String authcode;
/** Contact ID. */
public Integer contact_id;
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/** Group ID. */
public String grpid;
/** Group name. */
public String grpname;
/** Invite number. */
public String invitenumber;
}
/** Ask the user if they want to withdraw their own broadcast channel invite QR code. */
public static class WithdrawJoinBroadcast extends Qr {
/** Authentication code. */
public String authcode;
/** Contact ID. Always `ContactId::SELF`. */
public Integer contact_id;
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/** ID, uniquely identifying this chat. Called grpid for historic reasons. */
public String grpid;
/** Invite number. */
public String invitenumber;
/** Broadcast name. */
public String name;
}
/** Ask the user if they want to revive their own QR code. */
public static class ReviveVerifyContact extends Qr {
/** Authentication code. */
public String authcode;
/** Contact ID. */
public Integer contact_id;
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/** Invite number. */
public String invitenumber;
}
/** Ask the user if they want to revive their own group invite QR code. */
public static class ReviveVerifyGroup extends Qr {
/** Authentication code. */
public String authcode;
/** Contact ID. */
public Integer contact_id;
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/** Group ID. */
public String grpid;
/** Contact ID. */
public String grpname;
/** Invite number. */
public String invitenumber;
}
/** Ask the user if they want to revive their own broadcast channel invite QR code. */
public static class ReviveJoinBroadcast extends Qr {
/** Authentication code. */
public String authcode;
/** Contact ID. Always `ContactId::SELF`. */
public Integer contact_id;
/** Fingerprint of the contact key as scanned from the QR code. */
public String fingerprint;
/** Globally unique chat ID. Called grpid for historic reasons. */
public String grpid;
/** Invite number. */
public String invitenumber;
/** Broadcast name. */
public String name;
}
/**
* `dclogin:` scheme parameters.
* <p>
* Ask the user if they want to login with the email address.
*/
public static class Login extends Qr {
public String address;
}
}
@@ -1,12 +1,12 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/* A single reaction emoji. */
/** A single reaction emoji. */
public class Reaction {
/* Emoji frequency. */
/** Emoji frequency. */
public Integer count;
/* Emoji. */
/** Emoji. */
public String emoji;
/* True if we reacted with this emoji. */
/** True if we reacted with this emoji. */
public Boolean isFromSelf;
}
@@ -1,10 +1,10 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
/* Structure representing all reactions to a particular message. */
/** Structure representing all reactions to a particular message. */
public class Reactions {
/* Unique reactions and their count, sorted in descending order. */
/** Unique reactions and their count, sorted in descending order. */
public java.util.List<Reaction> reactions;
/* Map from a contact to it's reaction to message. */
/** Map from a contact to it's reaction to message. */
public java.util.Map<String, java.util.List<String>> reactionsByContact;
}
@@ -0,0 +1,22 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum SecurejoinSource {
/** Because of some problem, it is unknown where the QR code came from. */
Unknown,
/** The user opened a link somewhere outside Delta Chat */
ExternalLink,
/** The user clicked on a link in a message inside Delta Chat */
InternalLink,
/** The user clicked "Paste from Clipboard" in the QR scan activity */
Clipboard,
/** The user clicked "Load QR code as image" in the QR scan activity */
ImageLoaded,
/** The user scanned a QR code */
Scan,
}
@@ -0,0 +1,13 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum SecurejoinUiPath {
/** The UI path is unknown, or the user didn't open the QR code screen at all. */
Unknown,
/** The user directly clicked on the QR icon in the main screen */
QrIcon,
/** The user first clicked on the `+` button in the main screen, and then on "New Contact" */
NewContact,
}
@@ -2,15 +2,15 @@
package chat.delta.rpc.types;
public enum Socket {
/* Unspecified socket security, select automatically. */
/** Unspecified socket security, select automatically. */
automatic,
/* TLS connection. */
/** TLS connection. */
ssl,
/* STARTTLS connection. */
/** STARTTLS connection. */
starttls,
/* No TLS, plaintext connection. */
/** No TLS, plaintext connection. */
plain,
}
@@ -0,0 +1,39 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum SystemMessageType {
Unknown,
GroupNameChanged,
GroupImageChanged,
MemberAddedToGroup,
MemberRemovedFromGroup,
AutocryptSetupMessage,
SecurejoinMessage,
LocationStreamingEnabled,
LocationOnly,
InvalidUnencryptedMail,
ChatE2ee,
ChatProtectionEnabled,
ChatProtectionDisabled,
WebxdcStatusUpdate,
CallAccepted,
CallEnded,
/** 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
SecurejoinWait,
/** 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
SecurejoinWaitTimeout,
/** Chat ephemeral message timer is changed. */
EphemeralTimerChanged,
/** Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
MultiDeviceSync,
/** Webxdc info added with `info` set in `send_webxdc_status_update()`. */
WebxdcInfoMessage,
/** This message contains a users iroh node address. */
IrohNodeAddr,
}
@@ -2,19 +2,19 @@
package chat.delta.rpc.types;
public class VcardContact {
/* Email address. */
/** Email address. */
public String addr;
/* Contact color as hex string. */
/** Contact color as hex string. */
public String color;
/* The contact's name, or the email address if no name was given. */
/** The contact's name, or the email address if no name was given. */
public String displayName;
/* Public PGP key in Base64. */
/** Public PGP key in Base64. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String key;
/* Profile image in Base64. */
/** Profile image in Base64. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String profileImage;
/* Last update timestamp. */
/** Last update timestamp. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public Integer timestamp;
}
@@ -0,0 +1,43 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public enum Viewtype {
Unknown,
/** Text message. */
Text,
/** Image message. If the image is an animated GIF, the type `Viewtype.Gif` should be used. */
Image,
/** Animated GIF message. */
Gif,
/**
* Message containing a sticker, similar to image. NB: When sending, the message viewtype may be changed to `Image` by some heuristics like checking for transparent pixels. Use `Message::force_sticker()` to disable them.
* <p>
* If possible, the ui should display the image without borders in a transparent way. A click on a sticker will offer to install the sticker set in some future.
*/
Sticker,
/** Message containing an Audio file. */
Audio,
/** A voice message that was directly recorded by the user. For all other audio messages, the type `Viewtype.Audio` should be used. */
Voice,
/** Video messages. */
Video,
/** Message containing any file, eg. a PDF. */
File,
/** Message is a call. */
Call,
/** Message is an webxdc instance. */
Webxdc,
/** Message containing shared contacts represented as a vCard (virtual contact file) with email addresses and possibly other fields. Use `parse_vcard()` to retrieve them. */
Vcard,
}
@@ -0,0 +1,36 @@
/* Autogenerated file, do not edit manually */
package chat.delta.rpc.types;
public class WebxdcMessageInfo {
/** if the Webxdc represents a document, then this is the name of the document */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String document;
/**
* App icon file name. Defaults to an standard icon if nothing is set in the manifest.
* <p>
* To get the file, use dc_msg_get_webxdc_blob(). (not yet in jsonrpc, use rust api or cffi for it)
* <p>
* App icons should should be square, the implementations will add round corners etc. as needed.
*/
public String icon;
/** True if full internet access should be granted to the app. */
public Boolean internetAccess;
/**
* The name of the app.
* <p>
* Defaults to the filename if not set in the manifest.
*/
public String name;
/** Address to be used for `window.webxdc.selfAddr` in JS land. */
public String selfAddr;
/** Milliseconds to wait before calling `sendUpdate()` again since the last call. Should be exposed to `window.sendUpdateInterval` in JS land. */
public Integer sendUpdateInterval;
/** Maximum number of bytes accepted for a serialized update object. Should be exposed to `window.sendUpdateMaxSize` in JS land. */
public Integer sendUpdateMaxSize;
/** URL where the source code of the Webxdc and other information can be found; defaults to an empty string. Implementations may offer an menu or a button to open this URL. */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String sourceCodeUrl;
/** short string describing the state of the app, sth. as "2 votes", "Highscore: 123", can be changed by the apps */
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
public String summary;
}
@@ -34,6 +34,7 @@ public class DcAccounts {
public native void maybeNetwork ();
public native void setPushDeviceToken (String token);
public native boolean backgroundFetch (int timeoutSeconds);
public native void stopBackgroundFetch ();
public native int migrateAccount (String dbfile);
public native boolean removeAccount (int accountId);
@@ -44,7 +44,6 @@ public class DcChat {
public native boolean isSelfTalk ();
public native boolean isDeviceTalk ();
public native boolean canSend ();
public native boolean isProtected ();
public native boolean isSendingLocations();
public native boolean isMuted ();
public native boolean isContactRequest ();
@@ -53,6 +53,7 @@ public class DcContext {
public final static int DC_QR_ASK_VERIFYCONTACT = 200;
public final static int DC_QR_ASK_VERIFYGROUP = 202;
public final static int DC_QR_ASK_JOIN_BROADCAST= 204;
public final static int DC_QR_FPR_OK = 210;
public final static int DC_QR_FPR_MISMATCH = 220;
public final static int DC_QR_FPR_WITHOUT_ADDR = 230;
@@ -67,13 +68,12 @@ public class DcContext {
public final static int DC_QR_ERROR = 400;
public final static int DC_QR_WITHDRAW_VERIFYCONTACT = 500;
public final static int DC_QR_WITHDRAW_VERIFYGROUP = 502;
public final static int DC_QR_WITHDRAW_JOINBROADCAST = 504;
public final static int DC_QR_REVIVE_VERIFYCONTACT = 510;
public final static int DC_QR_REVIVE_VERIFYGROUP = 512;
public final static int DC_QR_REVIVE_JOINBROADCAST = 514;
public final static int DC_QR_LOGIN = 520;
public final static int DC_LP_AUTH_OAUTH2 = 0x2;
public final static int DC_LP_AUTH_NORMAL = 0x4;
public final static int DC_SOCKET_AUTO = 0;
public final static int DC_SOCKET_SSL = 1;
public final static int DC_SOCKET_STARTTLS = 2;
@@ -147,7 +147,6 @@ public class DcContext {
public native String getInfo ();
public native int getConnectivity ();
public native String getConnectivityHtml ();
public native String getOauth2Url (String addr, String redirectUrl);
public native String initiateKeyTransfer ();
public native void imex (int what, String dir);
public native String imexHasBackup (String dir);
@@ -171,7 +170,7 @@ public class DcContext {
public native void setChatVisibility (int chat_id, int visibility);
public native int getChatIdByContactId (int contact_id);
public native int createChatByContactId(int contact_id);
public native int createGroupChat (boolean verified, String name);
public native int createGroupChat (String name);
public native int createBroadcastList ();
public native boolean isContactInChat (int chat_id, int contact_id);
public native int addContactToChat (int chat_id, int contact_id);
@@ -261,15 +260,6 @@ public class DcContext {
setConfigInt("is_muted", muted? 1 : 0);
}
public boolean isGmailOauth2Addr(String addr) {
final String oauth2url = getOauth2Url(addr, "chat.delta:/foo");
return isGmailOauth2Url(oauth2url);
}
public boolean isGmailOauth2Url(String oauth2url) {
return oauth2url.startsWith("https://accounts.google.com/");
}
public void restartIo() {
if (!isEnabled()) return;
stopIo();
@@ -68,8 +68,8 @@ public class AllMediaActivity extends PassphraseRequiredActionBarActivity
protected void onCreate(Bundle bundle, boolean ready) {
tabs.add(new TabData(R.string.webxdc_apps, DcMsg.DC_MSG_WEBXDC, 0, 0));
tabs.add(new TabData(R.string.tab_gallery, DcMsg.DC_MSG_IMAGE, DcMsg.DC_MSG_GIF, DcMsg.DC_MSG_VIDEO));
tabs.add(new TabData(R.string.files, DcMsg.DC_MSG_FILE, 0, 0));
tabs.add(new TabData(R.string.audio, DcMsg.DC_MSG_AUDIO, DcMsg.DC_MSG_VOICE, 0));
tabs.add(new TabData(R.string.files, DcMsg.DC_MSG_FILE, 0, 0));
setContentView(R.layout.all_media_activity);
@@ -70,6 +70,9 @@ public class AllMediaDocumentsFragment
this.noMedia = ViewUtil.findById(view, R.id.no_documents);
this.gridManager = new StickyHeaderGridLayoutManager(1);
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
this.recyclerView.setAdapter(new AllMediaDocumentsAdapter(getContext(),
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
this));
@@ -66,6 +66,9 @@ public class AllMediaGalleryFragment
this.noMedia = ViewUtil.findById(view, R.id.no_images);
this.gridManager = new StickyHeaderGridLayoutManager(getCols());
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
this.recyclerView.setAdapter(new AllMediaGalleryAdapter(getContext(),
GlideApp.with(this),
new BucketedThreadMediaLoader.BucketedThreadMedia(getContext()),
@@ -12,6 +12,7 @@ import android.util.Log;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.app.NotificationManagerCompat;
import androidx.multidex.MultiDexApplication;
import androidx.work.Constraints;
import androidx.work.ExistingPeriodicWorkPolicy;
@@ -44,6 +45,7 @@ import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.webxdc.WebxdcGarbageCollectionWorker;
import java.io.File;
import java.io.PrintWriter;
@@ -55,10 +57,13 @@ import chat.delta.rpc.RpcException;
public class ApplicationContext extends MultiDexApplication {
private static final String TAG = ApplicationContext.class.getSimpleName();
private static final Object initLock = new Object();
private static volatile boolean isInitialized = false;
private static DcAccounts dcAccounts;
private Rpc rpc;
private DcContext dcContext;
public static DcAccounts dcAccounts;
public Rpc rpc;
public DcContext dcContext;
public DcLocationManager dcLocationManager;
public DcEventCenter eventCenter;
public NotificationCenter notificationCenter;
@@ -73,6 +78,57 @@ public class ApplicationContext extends MultiDexApplication {
return (ApplicationContext)context.getApplicationContext();
}
private static void ensureInitialized() {
synchronized (initLock) {
while (!isInitialized) {
try {
initLock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("Interrupted while waiting for initialization", e);
}
}
}
}
/**
* Get DcAccounts instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public static DcAccounts getDcAccounts() {
ensureInitialized();
return dcAccounts;
}
/**
* Get Rpc instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public Rpc getRpc() {
ensureInitialized();
return rpc;
}
/**
* Get DcContext instance, waiting for initialization if necessary.
* This method is thread-safe and will block until initialization is complete.
*/
public DcContext getDcContext() {
ensureInitialized();
return dcContext;
}
/**
* Set DcContext instance. This should only be called by AccountManager when switching accounts,
* which only happens after initial initialization is complete.
* This method is thread-safe but does NOT trigger initialization or notify waiting threads.
*/
public void setDcContext(DcContext dcContext) {
synchronized (initLock) {
this.dcContext = dcContext;
}
}
@Override
public void onCreate() {
super.onCreate();
@@ -108,50 +164,87 @@ public class ApplicationContext extends MultiDexApplication {
System.loadLibrary("native-utils");
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
rpc = new Rpc(new FFITransport(dcAccounts.getJsonrpcInstance()));
AccountManager.getInstance().migrateToDcAccounts(this);
int[] allAccounts = dcAccounts.getAll();
for (int accountId : allAccounts) {
DcContext ac = dcAccounts.getAccount(accountId);
if (!ac.isOpen()) {
// Initialize DcAccounts in background to avoid ANR during SQL migrations
Util.runOnBackground(() -> {
synchronized (initLock) {
try {
DatabaseSecret secret = DatabaseSecretProvider.getOrCreateDatabaseSecret(this, accountId);
boolean res = ac.open(secret.asString());
if (res) Log.i(TAG, "Successfully opened account " + accountId + ", path: " + ac.getBlobdir());
else Log.e(TAG, "Error opening account " + accountId + ", path: " + ac.getBlobdir());
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
Log.i(TAG, "DcAccounts created");
rpc = new Rpc(new FFITransport(dcAccounts.getJsonrpcInstance()));
Log.i(TAG, "Rpc created");
AccountManager.getInstance().migrateToDcAccounts(this);
int[] allAccounts = dcAccounts.getAll();
Log.i(TAG, "Number of profiles: " + allAccounts.length);
for (int accountId : allAccounts) {
DcContext ac = dcAccounts.getAccount(accountId);
if (!ac.isOpen()) {
try {
DatabaseSecret secret = DatabaseSecretProvider.getOrCreateDatabaseSecret(this, accountId);
boolean res = ac.open(secret.asString());
if (res) Log.i(TAG, "Successfully opened account " + accountId + ", path: " + ac.getBlobdir());
else Log.e(TAG, "Error opening account " + accountId + ", path: " + ac.getBlobdir());
} catch (Exception e) {
Log.e(TAG, "Failed to open account " + accountId + ", path: " + ac.getBlobdir() + ": " + e);
e.printStackTrace();
}
}
// 2025.11.12: this is needed until core starts ignoring "delete_server_after" for chatmail
if (ac.isChatmail()) {
ac.setConfig("delete_server_after", null); // reset
}
}
if (allAccounts.length == 0) {
try {
rpc.addAccount();
} catch (RpcException e) {
e.printStackTrace();
}
}
dcContext = dcAccounts.getSelectedAccount();
notificationCenter = new NotificationCenter(this);
eventCenter = new DcEventCenter(this);
// Mark as initialized before starting threads that depend on it
isInitialized = true;
initLock.notifyAll();
Log.i(TAG, "DcAccounts initialization complete");
dcLocationManager = new DcLocationManager(this); // depends on dcContext
new Thread(() -> {
Log.i(TAG, "Starting event loop");
DcEventEmitter emitter = dcAccounts.getEventEmitter();
Log.i(TAG, "DcEventEmitter obtained");
while (true) {
DcEvent event = emitter.getNextEvent();
if (event==null) {
break;
}
eventCenter.handleEvent(event);
}
Log.i("DeltaChat", "shutting down event handler");
}, "eventThread").start();
// set translations before starting I/O to avoid sending untranslated MDNs (issue #2288)
DcHelper.setStockTranslations(this);
dcAccounts.startIo();
} catch (Exception e) {
Log.e(TAG, "Failed to open account " + accountId + ", path: " + ac.getBlobdir() + ": " + e);
e.printStackTrace();
Log.e(TAG, "Fatal error during DcAccounts initialization", e);
// Mark as initialized even on error to avoid deadlock
isInitialized = true;
initLock.notifyAll();
throw new RuntimeException("Failed to initialize DcAccounts", e);
}
}
}
if (allAccounts.length == 0) {
try {
rpc.addAccount();
} catch (RpcException e) {
e.printStackTrace();
}
}
dcContext = dcAccounts.getSelectedAccount();
notificationCenter = new NotificationCenter(this);
eventCenter = new DcEventCenter(this);
new Thread(() -> {
DcEventEmitter emitter = dcAccounts.getEventEmitter();
while (true) {
DcEvent event = emitter.getNextEvent();
if (event==null) {
break;
}
eventCenter.handleEvent(event);
}
Log.i("DeltaChat", "shutting down event handler");
}, "eventThread").start();
});
// set translations before starting I/O to avoid sending untranslated MDNs (issue #2288)
DcHelper.setStockTranslations(this);
dcAccounts.startIo();
// October-2025 migration: delete deprecated "permanent channel" id
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.deleteNotificationChannel("dc_foreground_notification_ch");
// end October-2025 migration
new ForegroundDetector(ApplicationContext.getInstance(this));
@@ -162,7 +255,7 @@ public class ApplicationContext extends MultiDexApplication {
@Override
public void onAvailable(@NonNull android.net.Network network) {
Log.i("DeltaChat", "++++++++++++++++++ NetworkCallback.onAvailable() #" + debugOnAvailableCount++);
dcAccounts.maybeNetwork();
getDcAccounts().maybeNetwork();
}
@Override
@@ -191,7 +284,6 @@ public class ApplicationContext extends MultiDexApplication {
initializeJobManager();
InChatSounds.getInstance(this);
dcLocationManager = new DcLocationManager(this);
DynamicTheme.setDefaultDayNightMode(this);
IntentFilter filter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
@@ -228,6 +320,20 @@ public class ApplicationContext extends MultiDexApplication {
ExistingPeriodicWorkPolicy.KEEP,
fetchWorkRequest);
}
PeriodicWorkRequest webxdcGarbageCollectionRequest = new PeriodicWorkRequest.Builder(
WebxdcGarbageCollectionWorker.class,
PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,
TimeUnit.MILLISECONDS,
PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS,
TimeUnit.MILLISECONDS)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"WebxdcGarbageCollectionWorker",
ExistingPeriodicWorkPolicy.KEEP,
webxdcGarbageCollectionRequest);
Log.i("DeltaChat", "+++++++++++ ApplicationContext.onCreate() finished ++++++++++");
}
public JobManager getJobManager() {
@@ -49,6 +49,7 @@ import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.ScreenLockUtil;
import org.thoughtcrime.securesms.util.ViewUtil;
/**
* The Activity for application preference display and management.
@@ -79,7 +80,9 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
//noinspection ConstantConditions
this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead
// add padding to avoid content hidden behind system bars
ViewUtil.applyWindowInsets(findViewById(R.id.fragment));
if (icicle == null) {
initFragment(R.id.fragment, new ApplicationPreferenceFragment());
@@ -1,5 +1,6 @@
package org.thoughtcrime.securesms;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
@@ -17,6 +18,7 @@ import androidx.fragment.app.Fragment;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.lang.reflect.Field;
@@ -33,9 +35,24 @@ public abstract class BaseActionBarActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
onPreCreate();
EdgeToEdge.enable(this); // docs says to use: WindowCompat.enableEdgeToEdge(getWindow()); but it is not available
super.onCreate(savedInstanceState);
WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView()).setAppearanceLightStatusBars(false); // force white text in status bar
// Only enable Edge-to-Edge if it is well supported
if (ViewUtil.isEdgeToEdgeSupported()) {
// docs says to use: WindowCompat.enableEdgeToEdge(getWindow());
// but it actually makes things worse, the next takes care of setting the 3-buttons navigation bar background
EdgeToEdge.enable(this);
// force white text in status bar so it visible over background color
WindowCompat.getInsetsController(getWindow(), getWindow().getDecorView()).setAppearanceLightStatusBars(false);
}
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Apply adjustments to the toolbar for edge-to-edge display
ViewUtil.adjustToolbarForE2E(this);
}
@Override

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