Compare commits
876 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 923e2a43a4 | |||
| f29f94f138 | |||
| 3a35374a03 | |||
| fe0793481c | |||
| 3c2a672799 | |||
| 2476d17394 | |||
| 5ae021bde3 | |||
| 9f46c242fc | |||
| cf36254c1a | |||
| 0d94bf2006 | |||
| 4757150aae | |||
| 0d76ab930f | |||
| 5515e2fe3c | |||
| 508f320b4c | |||
| 176e6c94b2 | |||
| deb650970c | |||
| 36fc2261f9 | |||
| f11c6baaf6 | |||
| 6add250258 | |||
| d15efbdb44 | |||
| 2422f9110c | |||
| b6162c2044 | |||
| 75245cfa02 | |||
| 0d19f058fe | |||
| 911e695187 | |||
| b8c8969162 | |||
| 0610520064 | |||
| 5ae60af73f | |||
| dd6f1015dc | |||
| 74ea10ebef | |||
| 877f991131 | |||
| e556878b2f | |||
| 99a1fee994 | |||
| dfd323a89f | |||
| 5a086ff022 | |||
| bedaa2c287 | |||
| 50037d5232 | |||
| 6756b04da9 | |||
| b12ecf66c5 | |||
| d05403db02 | |||
| 2d8344a61f | |||
| 44afda55e5 | |||
| bfa6eef604 | |||
| 6327b30350 | |||
| f92cac4d55 | |||
| 0204fca27d | |||
| eed844469b | |||
| 59ceae46a0 | |||
| 693188dcff | |||
| 025ff086c8 | |||
| a802bfcb61 | |||
| 1f18bfe2dd | |||
| dc1bc77925 | |||
| ac6383d79a | |||
| 59fec8462c | |||
| d64baa294f | |||
| e7e14af158 | |||
| e094e96669 | |||
| fa56e8ca0d | |||
| 3d5abdcd79 | |||
| 92c4e41b59 | |||
| bbfd0c31da | |||
| d5f627be50 | |||
| f0ca58d53f | |||
| 56f5655693 | |||
| 310a7f99c8 | |||
| d0f7fca8c9 | |||
| 80de08f980 | |||
| 80a0ff0098 | |||
| 9c55de17a3 | |||
| 8c1bc8e70e | |||
| 4659bbbe51 | |||
| f0760d6695 | |||
| 68ffedc1d1 | |||
| 4bdfe8e390 | |||
| f3a396daae | |||
| 6d038e9d7f | |||
| 5d62a439d2 | |||
| 46be278bf5 | |||
| ef6f8958ea | |||
| 78c73b3f8c | |||
| 18dc39d266 | |||
| 41cd10a76f | |||
| 7ccae5d3be | |||
| adbfbb9e77 | |||
| dda7f34599 | |||
| bf5a5dc9e9 | |||
| 84faf4115b | |||
| 1577b90047 | |||
| fc94684d04 | |||
| b92ff80e3a | |||
| 515a84b161 | |||
| d757ef59c0 | |||
| cabcc71545 | |||
| d0a584d15d | |||
| f8ec6d2da2 | |||
| c3b7e06b86 | |||
| d5edcea5d0 | |||
| 8a3d29fca3 | |||
| 6156ee0534 | |||
| 1cad6801b6 | |||
| a73af53c50 | |||
| 8eacd09336 | |||
| 673926b1ee | |||
| 643b7cc381 | |||
| 42db29304a | |||
| 323dbde715 | |||
| b9649a908e | |||
| 2f20f558ad | |||
| 6f868f653a | |||
| 42b529dd4a | |||
| d7eab73687 | |||
| 1deebdf552 | |||
| 20fbb0e1ee | |||
| 6a53e229d1 | |||
| 74ef2d478a | |||
| feeece405d | |||
| 20459a5710 | |||
| a3a8b3581f | |||
| f2571dba91 | |||
| 708ffe617c | |||
| f6ecb94047 | |||
| 2d4b52b037 | |||
| 5257f39aee | |||
| 20f1475856 | |||
| db0295e5a6 | |||
| d019c1bfb5 | |||
| 4542ba1b9a | |||
| 9b982db899 | |||
| a1a72b79b3 | |||
| 0ac9bea63c | |||
| 2bb3ad546e | |||
| 41a6b9a6c9 | |||
| fb7c119afc | |||
| 5910fc245a | |||
| 7d8887eddd | |||
| 37471ae9fa | |||
| 319e2ebe5a | |||
| 49a00f3788 | |||
| 74ee2fb8db | |||
| 29a4a4712c | |||
| 644bd1f594 | |||
| ed6eca8920 | |||
| 47512f786e | |||
| add51186e6 | |||
| 52f63b28ba | |||
| 889c9aab45 | |||
| de5940e709 | |||
| 6e184f735d | |||
| c33ff20d0a | |||
| c67c3c8972 | |||
| f98a5178b3 | |||
| 6dfccdab84 | |||
| 40faa3d43e | |||
| 74f6853815 | |||
| cef6817187 | |||
| 6f547dfb66 | |||
| d6e05f61ac | |||
| 55649b0c4b | |||
| 4d9f8dd244 | |||
| 3880da8a08 | |||
| 5e8666835d | |||
| 2f5619141e | |||
| 4a07d7fd9d | |||
| 1493583db7 | |||
| dc363a0281 | |||
| fcffe3922a | |||
| d546d8041f | |||
| 267caf9b03 | |||
| d55ad1f32a | |||
| be07043b47 | |||
| cc3e6bcd9d | |||
| 43654fdadb | |||
| 774add2380 | |||
| 1133a6e624 | |||
| 0aad1b3d76 | |||
| b58a9d0bab | |||
| 54a74a8586 | |||
| f25474947b | |||
| 9ebd8e4a37 | |||
| 975ad2e149 | |||
| e6350aaec2 | |||
| d373537d6d | |||
| 960581e5f2 | |||
| fccf8f402e | |||
| e0459978f7 | |||
| 72bd7376ca | |||
| 94fbdcde05 | |||
| 89d77e7638 | |||
| d9edee117f | |||
| 6cfdb87924 | |||
| 613940577c | |||
| 43a3e21495 | |||
| b5375b8c0e | |||
| 39aec04fea | |||
| 94e2c8dbed | |||
| da45c7bc1c | |||
| d180704d52 | |||
| 653c8688b7 | |||
| 9a382a4948 | |||
| dcaa19b29d | |||
| 11845da65f | |||
| 82262cb166 | |||
| e85ae5247a | |||
| 74e14bd0ea | |||
| 40cdeee47a | |||
| 844231e5e7 | |||
| 0ccf0a9309 | |||
| 5040fb4634 | |||
| a57122a902 | |||
| 4313e8824b | |||
| 464cba299a | |||
| 102c3fd82a | |||
| dc31eee4bc | |||
| 875f0e5c86 | |||
| 2b36e2dc26 | |||
| 6a9c3ab8ca | |||
| 2ab544b18e | |||
| 2630e22421 | |||
| 1b7e32ab44 | |||
| 8436909977 | |||
| 9dd44c24b3 | |||
| 5d0e85b30d | |||
| 5193dfa412 | |||
| 96490e23f8 | |||
| 7959b07d45 | |||
| c4ae7927ad | |||
| ba0515ebc5 | |||
| 655ed8cad4 | |||
| 349bab9510 | |||
| e26f803d1f | |||
| 60ab7f2826 | |||
| 67d2c89bcc | |||
| e511237e5e | |||
| f249fd6174 | |||
| 6db45c1911 | |||
| 06a1114744 | |||
| 3afff5625b | |||
| cef8ddeedb | |||
| 2f0ac973c0 | |||
| 9465776715 | |||
| 39685a575d | |||
| 8601736387 | |||
| 98d8572baf | |||
| 917e764b6f | |||
| 52263150c8 | |||
| c2aba94b34 | |||
| 1278dfd395 | |||
| 44a688470f | |||
| e9a09d9c72 | |||
| abc49a3b95 | |||
| cdd4e5eccd | |||
| fa8ed2b881 | |||
| 0731fe9447 | |||
| d3567d9f0c | |||
| 66ab1f8051 | |||
| 872fd17f5e | |||
| af49018911 | |||
| f870e9c8fd | |||
| d5982ba09f | |||
| 1d94fe8bca | |||
| 22d70d7bd4 | |||
| 09bdc32a9c | |||
| 7763ba17bf | |||
| 965204c46f | |||
| 815e4def6f | |||
| dc3ca8ff70 | |||
| 3bccb3fb84 | |||
| 402d93b5a4 | |||
| 927dc46431 | |||
| 87c32b1904 | |||
| bb97213460 | |||
| 9ca9bf1acd | |||
| 885c902b14 | |||
| dc4ee3f686 | |||
| 61bf5aaad4 | |||
| 18595cbee1 | |||
| 5d76586ac1 | |||
| dc78307df7 | |||
| 86a9cbfb45 | |||
| 623b20f713 | |||
| 5f4eae798f | |||
| 4a8609822d | |||
| 89ddc1e01f | |||
| 0ce42578fa | |||
| faa7ad0a35 | |||
| 38e8ceb253 | |||
| a32460f253 | |||
| 198268a4c3 | |||
| 71158970ae | |||
| 1383b06e86 | |||
| 24165e311b | |||
| 5ec892db34 | |||
| caef7eda29 | |||
| cf53af4778 | |||
| 415e0c2b5f | |||
| 9a22597473 | |||
| beb45af440 | |||
| 87a21eb0f2 | |||
| dea51cd356 | |||
| ed540e5584 | |||
| 9f80c9f35f | |||
| 5dec1b24cd | |||
| acb4eb2ae1 | |||
| 20c0354938 | |||
| eac112d602 | |||
| 9b4f659f67 | |||
| 0166d4e656 | |||
| 92b3761d2d | |||
| 484cee21c6 | |||
| 0e40318050 | |||
| b2cc76ff2e | |||
| 96acaaf000 | |||
| 400e5ea671 | |||
| 4fac460926 | |||
| 94a5631566 | |||
| ea91075107 | |||
| 0c7b82b9e4 | |||
| d765d3ddeb | |||
| 094fb1e2a4 | |||
| f7244c2152 | |||
| 2b5d1005e3 | |||
| b1eadf0716 | |||
| c001c13053 | |||
| ea4ec343bc | |||
| 5642e86f6a | |||
| 46db14fc3e | |||
| 0f6d9670ff | |||
| 4c3c24ae5a | |||
| eeb558d94d | |||
| 5e08f56dd3 | |||
| d99f150dd2 | |||
| 82b3100570 | |||
| 348b6fd3c1 | |||
| c2f492463f | |||
| 38239b2644 | |||
| 4b996c95de | |||
| 89d90efcef | |||
| d5b4bae502 | |||
| c3ec163e1a | |||
| a927a32909 | |||
| 9aab4517ef | |||
| 727e68edc7 | |||
| 9047de85c2 | |||
| 29c313ba58 | |||
| 487f601c09 | |||
| 7589b5ac37 | |||
| 8a9ce2ddd1 | |||
| be449f5afc | |||
| ac832a617e | |||
| 4fd2832370 | |||
| 52b072a7f3 | |||
| 55862757d6 | |||
| cbdf495c5f | |||
| a9d0d2e179 | |||
| d0cbf169dd | |||
| 833bc14405 | |||
| fb3620d0e3 | |||
| 02466e09fe | |||
| e39134faad | |||
| fa90b167ef | |||
| f5f20399ac | |||
| 659152dfcf | |||
| f34e87a593 | |||
| a172441155 | |||
| 90ca85ae9c | |||
| 40c0612412 | |||
| 5de79e3b0b | |||
| 39369aadd7 | |||
| b1e709d5bc | |||
| f760573fe4 | |||
| 4263ece65b | |||
| 217c45c102 | |||
| 3b2145ec79 | |||
| 566d1a1c13 | |||
| 09dab94807 | |||
| 6e3ddb8d96 | |||
| 8d7bb437eb | |||
| 392b43e8f7 | |||
| 32201a60c4 | |||
| bb114c570f | |||
| 42c52c10c7 | |||
| ade21a2cb8 | |||
| aced181d92 | |||
| 92cd1fc31c | |||
| 743138a100 | |||
| bebda06160 | |||
| f581930a40 | |||
| 70d4844dc6 | |||
| d3dd50dcac | |||
| ab8fdbad78 | |||
| 174bd9e986 | |||
| ab6f7ec97f | |||
| 6288463ddb | |||
| d700353ed8 | |||
| e979873bb3 | |||
| 331c77d317 | |||
| f9792615b7 | |||
| a94dc9336e | |||
| 6f1e11e860 | |||
| e720b4cef8 | |||
| 10f4534ee8 | |||
| 28c02a767d | |||
| 98f2ae5430 | |||
| 00c61133d5 | |||
| e457ab431d | |||
| b854fb6689 | |||
| 7c3a80296a | |||
| 4328bdd698 | |||
| e5f45df59a | |||
| 9dd270172b | |||
| 310f1fb921 | |||
| 5f14f0792f | |||
| fb3b43426a | |||
| 62b66d93ee | |||
| 6b12ff335d | |||
| ea522be8f4 | |||
| 44441f1ff9 | |||
| 3fca807356 | |||
| 4dc377233a | |||
| aabc60d36f | |||
| a653ac6382 | |||
| df7cc90da9 | |||
| eeb56a4630 | |||
| 713a87993e | |||
| 8ff55f3cf3 | |||
| 0fd72d2415 | |||
| 3c7f12c7b8 | |||
| 56abaa7c20 | |||
| 9335eedd04 | |||
| c13536031e | |||
| 57581634c4 | |||
| 4fa2535118 | |||
| 0ac0276dea | |||
| ed72a60f24 | |||
| 656aca7d1f | |||
| 3594847d8e | |||
| c17ac1d090 | |||
| 93ba86a779 | |||
| 738f5b2cc8 | |||
| 71a473d3e3 | |||
| d64d094de3 | |||
| 41df4eb03d | |||
| dde82ccb2f | |||
| c89f9ce875 | |||
| fc1adc4863 | |||
| d68c32ff26 | |||
| b67e9d795e | |||
| 87ac24124a | |||
| 138dcd7bdf | |||
| ae7be8a841 | |||
| 0d51e097d5 | |||
| abff1c0c55 | |||
| 1894425ad2 | |||
| 08643d3389 | |||
| 3460e7e405 | |||
| 36249777e0 | |||
| ca40ae7869 | |||
| cb05abb85f | |||
| b878ed4df3 | |||
| 16a02a5e4f | |||
| c614c5f004 | |||
| 8a76f99701 | |||
| fd5a3b9f8e | |||
| c7a542aac7 | |||
| 6cab1d1cf4 | |||
| be8009c950 | |||
| f6c1fa2f5c | |||
| e76f445985 | |||
| 6949be6fd8 | |||
| 69e18a009b | |||
| 64ef656544 | |||
| f95a6e8db7 | |||
| b81757d579 | |||
| 30c0026840 | |||
| efb4bf0536 | |||
| cd2fc0df0f | |||
| 51380cf906 | |||
| ded0c44ce3 | |||
| 61f5064929 | |||
| f316ebea20 | |||
| dc1a029e4a | |||
| 6bbacae54d | |||
| 972d372bd4 | |||
| fe7fb19adf | |||
| 5112389dae | |||
| c190a7b50a | |||
| 7ce8ccff78 | |||
| 7eb0a99fc7 | |||
| cbdd8f19ed | |||
| 5fdf319cda | |||
| 837e2313dd | |||
| e45fd2545e | |||
| 15537ea4b2 | |||
| df97f4069a | |||
| dea8b2bed9 | |||
| 0d130a4218 | |||
| b4ee89c1e8 | |||
| b2e7b8fdb6 | |||
| a494feb272 | |||
| 5efce4345a | |||
| b7703ce71f | |||
| c0ed32b645 | |||
| 7e4f408059 | |||
| a1993426de | |||
| bbb6ce8def | |||
| c601595477 | |||
| f909174119 | |||
| b0762a8b46 | |||
| 545f987f31 | |||
| b625c57d2d | |||
| 022d24bc5f | |||
| c5c09008a6 | |||
| 7679cc8bba | |||
| 4807d05861 | |||
| 34eedf5f07 | |||
| 941c186142 | |||
| b54ac50ea5 | |||
| b99426b7c6 | |||
| de1eedc63f | |||
| c3dac043cb | |||
| 00b52d4fe6 | |||
| b66bf595e2 | |||
| 7c24e836fe | |||
| 694f3bf013 | |||
| f6f42991e8 | |||
| 23f6803be9 | |||
| cdcb7fab4b | |||
| 5ee3607312 | |||
| 4b9642f51f | |||
| 4abbf3091f | |||
| ec4db3e58f | |||
| 0d2175b641 | |||
| a821ee363a | |||
| f43083acef | |||
| 7aed78a935 | |||
| 26c30fe3dc | |||
| 5550b8b1f5 | |||
| c94512fb24 | |||
| d1db6e5a8a | |||
| d352583237 | |||
| c8469be136 | |||
| 97620b8a3c | |||
| 24317b38bf | |||
| 6b28ed15e3 | |||
| b8b203e517 | |||
| e5c1e477f0 | |||
| 64752d3bae | |||
| 6145e0d2df | |||
| b365284743 | |||
| af62041c14 | |||
| 910dbf56fd | |||
| 4eca0dea4a | |||
| a76c17fd45 | |||
| b00aeec03a | |||
| ffe147fde8 | |||
| 02a5bb06a9 | |||
| a8997738bf | |||
| 202690d02e | |||
| 6d14bbdbc7 | |||
| b0699ab9be | |||
| 03a0b53eee | |||
| a044181a75 | |||
| e9ae9dc5bf | |||
| cbfa3b7e58 | |||
| 499f4aafc8 | |||
| bf57d3bd73 | |||
| 6200f354ca | |||
| c8dfb08dcb | |||
| 543e9d91e4 | |||
| dec5879919 | |||
| a1d21d8562 | |||
| 253ed877e5 | |||
| b809d24ab1 | |||
| 78aee0a487 | |||
| d16254c146 | |||
| 7ab3ef8453 | |||
| 4b695a3293 | |||
| da4c382c9a | |||
| 80973960f5 | |||
| 7be75f7008 | |||
| 6fa114c6c0 | |||
| 767b5f2bae | |||
| ed3a21b992 | |||
| 899c2b5647 | |||
| 61e616a53b | |||
| 3bf4504de9 | |||
| cd0740d895 | |||
| 9f99edc159 | |||
| 60568f23f5 | |||
| 6dc8bd7ba8 | |||
| ff4ecb3bda | |||
| c71e71359a | |||
| d5a09fa25e | |||
| f52c2be2c2 | |||
| 2233b93108 | |||
| d76eb3239a | |||
| a982bd2bbb | |||
| 9ef3edcc0e | |||
| de7c54b886 | |||
| 9c9f966597 | |||
| 12e77789d3 | |||
| bd640072ab | |||
| 0a9c46fbfc | |||
| 1cc4f11484 | |||
| 9386f2f9cb | |||
| 45d73d4604 | |||
| a5892330dd | |||
| 8a0e2d72a4 | |||
| 2629c65564 | |||
| 10694a6809 | |||
| aa3d177243 | |||
| 4d35d4edeb | |||
| bbaba3cd33 | |||
| d1f002a132 | |||
| 9ce9a91c95 | |||
| 7844e146b1 | |||
| eb997eca00 | |||
| 30124de2a8 | |||
| 1dcf7e4860 | |||
| 9ffc904ae5 | |||
| 2704749b44 | |||
| 1c174b5b70 | |||
| 8b5dd70d75 | |||
| f022316ad7 | |||
| 3386f5c5f7 | |||
| 57eead3a34 | |||
| 2868b51835 | |||
| 82118db71b | |||
| 14f55ca6b1 | |||
| cebfa12142 | |||
| 96c8c21b78 | |||
| 9ab1b1f3a7 | |||
| 94a0e426f8 | |||
| 006f8ae826 | |||
| 2889266522 | |||
| 5e6fccf143 | |||
| 3847e20d18 | |||
| fc69212a51 | |||
| 8999f54ba2 | |||
| f470e92300 | |||
| 3ac49e3e58 | |||
| 8dd9cfec5b | |||
| 0588214ee7 | |||
| 4ec49a031c | |||
| a31d7d6d3e | |||
| 64bbe9866d | |||
| 5d7ab84efc | |||
| 11f73a88e8 | |||
| dd0e847976 | |||
| 71ed333468 | |||
| 41d94ae3ee | |||
| b66bc1f863 | |||
| df7d80319c | |||
| 134145d166 | |||
| 688a103c10 | |||
| e2efa1f913 | |||
| aebd5c66f7 | |||
| 15c60c6b12 | |||
| f319ba2b83 | |||
| 93f12e7367 | |||
| 10acb07f82 | |||
| ee9a8dd53a | |||
| 0a55023bdb | |||
| fec9f8b4d3 | |||
| 13374df709 | |||
| 7fa04dc3c0 | |||
| 9d4e0e4e21 | |||
| 473c28ab07 | |||
| de47feac40 | |||
| 84894ff538 | |||
| f254c35749 | |||
| 1ff4e069ea | |||
| d574d33596 | |||
| f6756fc34b | |||
| 7c27eb47fc | |||
| 8d5a55c24c | |||
| 2e9aa79b02 | |||
| 1f9264225b | |||
| 18e145faaf | |||
| 47cf70120a | |||
| 86451a00ff | |||
| 34be7aab17 | |||
| 59139ed242 | |||
| 11f3964bdc | |||
| 7683408d18 | |||
| b74e793654 | |||
| 4bd74324d2 | |||
| 9a121b3039 | |||
| a9832c9c53 | |||
| 1e4c8bc291 | |||
| c45a47e53c | |||
| a07723d515 | |||
| 02d7a6fb1f | |||
| d62e8fa864 | |||
| a03fd337ef | |||
| 27c0f45430 | |||
| a0f1232261 | |||
| 5640d31080 | |||
| 1542fc67ca | |||
| a99a4ec85b | |||
| fa17b134cf | |||
| 6898a37704 | |||
| 45b6a5c565 | |||
| 7330e6ba39 | |||
| 8f405914a2 | |||
| 6d09a6f318 | |||
| b349a7e601 | |||
| 0d610895d2 | |||
| a65c677ecc | |||
| db93aeacc0 | |||
| 09ff0d888b | |||
| b9c5e741e8 | |||
| 620d86c903 | |||
| 14e31650e7 | |||
| 9848cb5847 | |||
| bf7db005ef | |||
| aa032dbb37 | |||
| 9e1b9775e2 | |||
| fcd16d9e32 | |||
| 2a4bd2a001 | |||
| eacd089c8f | |||
| 9ed355efd1 | |||
| d1bb25004d | |||
| 8d1b010d1b | |||
| 8a9b76af3a | |||
| 4bbd9428e3 | |||
| 83646003b6 | |||
| 947887f335 | |||
| 69631cd857 | |||
| 0722426425 | |||
| 98d54bbe6a | |||
| c1dc0cf127 | |||
| 44a1ce42f0 | |||
| a0c6cef0fa | |||
| f96e89956c | |||
| ce9ded9d8b | |||
| cb2d9f16ac | |||
| c2a13ae9dd | |||
| f8c2403e61 | |||
| 616b495426 | |||
| a22baa7fc3 | |||
| 0b9bb9ff76 | |||
| ef96192d8b | |||
| 13c34d9480 | |||
| 610f4cebc2 | |||
| d4d15eee7c | |||
| ee3886285b | |||
| a32c20473f | |||
| db956d93cf | |||
| 6a5a75131e | |||
| a676a47ed4 | |||
| 2067122d2c | |||
| 8a0fe892f4 | |||
| 29a6f4eb31 | |||
| f610592bff | |||
| 898008e2a1 | |||
| 9eaa3ca182 | |||
| c98818e5cf | |||
| 7643ecd90a | |||
| e4993bd302 | |||
| 32ee198128 | |||
| ab0d33b3c0 | |||
| 2c8b781817 | |||
| e59655c456 | |||
| 2ce7e5a3c7 | |||
| 79c7419b71 | |||
| 2efaf1df93 | |||
| 814ac7d976 | |||
| b0e5c1c634 | |||
| bae998f811 | |||
| 1b0d3f8583 | |||
| d81cb238df | |||
| 220ae351ee | |||
| 4b09158535 | |||
| e3c423cdd4 | |||
| 7840f5c577 | |||
| 87091c4214 | |||
| 4996ca9d93 | |||
| 9b8511b7f2 | |||
| a66fc7bf10 | |||
| 75cad1ab9c | |||
| be974b3fc8 | |||
| 777ef609ff | |||
| 224964db95 | |||
| 5bfc91de1b | |||
| b9d1aa4338 | |||
| e296dad260 | |||
| 4e372511fb | |||
| e0a71d0fff | |||
| 5bcdd4cf16 | |||
| 68b0b365da | |||
| 227046a739 | |||
| f9127341e7 | |||
| 184da9c20e | |||
| 96b5cabeb6 | |||
| 4a8706b9e3 | |||
| 94a10afac2 | |||
| a0660faf07 | |||
| 26170fc147 | |||
| 8d6147761b | |||
| 9d6abfd979 | |||
| 46f4324478 | |||
| bfeab57744 | |||
| 2e99926e82 | |||
| c28148b843 | |||
| b6b3fe12b6 | |||
| 56c00a7c43 | |||
| 4803bcccdd | |||
| 92f17d5156 | |||
| 5310c41694 | |||
| a54f3ed1a2 | |||
| 8ceb12370f | |||
| 0a7839fb7d | |||
| 76e4c59119 | |||
| 33b69b9f3a | |||
| b4f5e2d124 | |||
| 6853d797f2 | |||
| fa7a3c9c32 | |||
| a70c76f7f3 | |||
| 87a6a12367 | |||
| 9bcdcd918e | |||
| 7454454b63 | |||
| 69a5e42640 | |||
| 1e86ed225d | |||
| 4cd7977ced | |||
| 8d0f1a6602 | |||
| 0ce10cbb35 | |||
| 7decf02fd3 | |||
| 114731f722 | |||
| 2a7025ef17 | |||
| 257003ba09 | |||
| ca110c6d74 | |||
| 09f66caadc | |||
| 4a73ac19c2 | |||
| 9c3281e182 | |||
| a84e17635a | |||
| af7d915d14 | |||
| f679376445 | |||
| 4f32b994fa | |||
| dbb9115024 | |||
| af640044c9 | |||
| bece13d75e | |||
| 1b9c619739 | |||
| ccd8df85e4 | |||
| 1195945637 | |||
| 2e77ae8f4d | |||
| c8fefca916 | |||
| 6acb2203ef | |||
| 46c627dde1 | |||
| 1366bc3571 | |||
| 20c487be7a | |||
| ef674746d9 | |||
| e65268979c | |||
| e289432a09 | |||
| 8509049791 | |||
| d1b490a02d | |||
| 64d33bebbd | |||
| 0a44d00451 | |||
| 353b2c0488 | |||
| 85c68d0485 | |||
| 12c2237e00 | |||
| 68f9533392 | |||
| e93efa318a | |||
| fbc01ff0a2 | |||
| b0ca48740a | |||
| fa795dd149 | |||
| 0a4f1ded54 | |||
| b2e88d50fd | |||
| 1e31b479e8 | |||
| cf91468f65 | |||
| 6c31d8cf85 | |||
| 4c8d27f4bb | |||
| 87c49dc680 | |||
| f0d5695729 | |||
| 0289f47adc |
@@ -8,7 +8,7 @@ ArcaneChat is a Delta Chat Android client built on top of the official Delta Cha
|
|||||||
- **Language:** Java (Java 8 compatibility)
|
- **Language:** Java (Java 8 compatibility)
|
||||||
- **Build System:** Gradle with Android Gradle Plugin 8.11.1
|
- **Build System:** Gradle with Android Gradle Plugin 8.11.1
|
||||||
- **Min SDK:** 21 (Android 5.0)
|
- **Min SDK:** 21 (Android 5.0)
|
||||||
- **Target SDK:** 35 (Android 15)
|
- **Target SDK:** 36 (Android 16)
|
||||||
- **NDK Version:** 27.0.12077973
|
- **NDK Version:** 27.0.12077973
|
||||||
- **Native Components:** Rust (deltachat-core-rust submodule)
|
- **Native Components:** Rust (deltachat-core-rust submodule)
|
||||||
- **UI Framework:** Android SDK, Material Design Components
|
- **UI Framework:** Android SDK, Material Design Components
|
||||||
@@ -17,13 +17,23 @@ ArcaneChat is a Delta Chat Android client built on top of the official Delta Cha
|
|||||||
## Repository Structure
|
## Repository Structure
|
||||||
|
|
||||||
- `src/main/` - Main application source code
|
- `src/main/` - Main application source code
|
||||||
|
- `src/main/java/org/thoughtcrime/securesms/` - Main UI components
|
||||||
|
- `src/main/java/com/b44t/messenger/` - Delta Chat core integration
|
||||||
|
- `src/main/java/chat/delta/rpc/` - JSON-RPC bindings (generated, don't edit manually)
|
||||||
|
- `src/main/res/` - Android resources (layouts, strings, drawables)
|
||||||
- `src/androidTest/` - Instrumented tests (UI tests, benchmarks)
|
- `src/androidTest/` - Instrumented tests (UI tests, benchmarks)
|
||||||
|
- `src/androidTest/java/com/b44t/messenger/uitests/` - UI tests
|
||||||
|
- `src/androidTest/java/com/b44t/messenger/uibenchmarks/` - Performance benchmarks
|
||||||
- `src/gplay/` - Google Play flavor-specific code
|
- `src/gplay/` - Google Play flavor-specific code
|
||||||
- `src/foss/` - F-Droid/FOSS flavor-specific code
|
- `src/foss/` - F-Droid/FOSS flavor-specific code
|
||||||
- `jni/deltachat-core-rust/` - Native Rust core library (submodule)
|
- `jni/deltachat-core-rust/` - Native Rust core library (submodule, **don't edit directly**)
|
||||||
- `scripts/` - Build and helper scripts
|
- `scripts/` - Build and helper scripts
|
||||||
|
- `scripts/ndk-make.sh` - Build native libraries
|
||||||
|
- `scripts/install-toolchains.sh` - Install Rust cross-compilation toolchains
|
||||||
|
- `scripts/generate-rpc-bindings.sh` - Generate JSON-RPC bindings
|
||||||
- `docs/` - Documentation
|
- `docs/` - Documentation
|
||||||
- `fastlane/` - App store metadata and screenshots
|
- `fastlane/` - App store metadata and screenshots
|
||||||
|
- `.github/workflows/` - CI/CD workflows (GitHub Actions)
|
||||||
|
|
||||||
## Build Instructions
|
## Build Instructions
|
||||||
|
|
||||||
@@ -33,17 +43,36 @@ ArcaneChat is a Delta Chat Android client built on top of the official Delta Cha
|
|||||||
```bash
|
```bash
|
||||||
git submodule update --init --recursive
|
git submodule update --init --recursive
|
||||||
```
|
```
|
||||||
|
This MUST be done first before any build attempts.
|
||||||
|
|
||||||
2. **Build native libraries:**
|
2. **Set up environment variables:**
|
||||||
|
```bash
|
||||||
|
export ANDROID_NDK_ROOT=/path/to/ndk/27.0.12077973
|
||||||
|
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
|
||||||
|
```
|
||||||
|
Note: Path format varies by OS (linux-x86_64, darwin-x86_64, etc.)
|
||||||
|
|
||||||
|
3. **Install Rust toolchains:**
|
||||||
|
```bash
|
||||||
|
scripts/install-toolchains.sh
|
||||||
|
```
|
||||||
|
Required for building the native Rust components.
|
||||||
|
|
||||||
|
4. **Build native libraries:**
|
||||||
```bash
|
```bash
|
||||||
scripts/ndk-make.sh
|
scripts/ndk-make.sh
|
||||||
```
|
```
|
||||||
Note: First run may take significant time as it builds for all architectures (armeabi-v7a, arm64-v8a, x86, x86_64)
|
**IMPORTANT:** First run takes 30-60 minutes as it builds for all architectures (armeabi-v7a, arm64-v8a, x86, x86_64).
|
||||||
|
For faster development builds, build for a single architecture:
|
||||||
|
```bash
|
||||||
|
scripts/ndk-make.sh armeabi-v7a
|
||||||
|
```
|
||||||
|
|
||||||
3. **Build APK:**
|
5. **Build APK:**
|
||||||
```bash
|
```bash
|
||||||
./gradlew assembleDebug
|
./gradlew assembleDebug
|
||||||
```
|
```
|
||||||
|
Build time: ~2-5 minutes after native libraries are built.
|
||||||
|
|
||||||
### Build Flavors
|
### Build Flavors
|
||||||
|
|
||||||
@@ -55,6 +84,24 @@ ArcaneChat is a Delta Chat Android client built on top of the official Delta Cha
|
|||||||
- Debug APKs: `build/outputs/apk/gplay/debug/` and `build/outputs/apk/fat/debug/`
|
- Debug APKs: `build/outputs/apk/gplay/debug/` and `build/outputs/apk/fat/debug/`
|
||||||
- Release APKs require signing configuration in `~/.gradle/gradle.properties`
|
- Release APKs require signing configuration in `~/.gradle/gradle.properties`
|
||||||
|
|
||||||
|
### Common Build Issues
|
||||||
|
|
||||||
|
1. **Missing NDK or incorrect version:**
|
||||||
|
- Error: `ANDROID_NDK_ROOT not set` or native library missing
|
||||||
|
- Solution: Install NDK 27.0.12077973 and set ANDROID_NDK_ROOT environment variable
|
||||||
|
|
||||||
|
2. **Submodules not initialized:**
|
||||||
|
- Error: Missing deltachat-core-rust files
|
||||||
|
- Solution: Run `git submodule update --init --recursive`
|
||||||
|
|
||||||
|
3. **Gradle wrapper validation:**
|
||||||
|
- Always validate gradle wrapper before building: `./gradlew wrapper --gradle-version=current`
|
||||||
|
- Wrapper is validated in CI via `gradle/actions/wrapper-validation@v4`
|
||||||
|
|
||||||
|
4. **Clean build issues:**
|
||||||
|
- If build fails, try: `./gradlew clean && scripts/ndk-make.sh && ./gradlew assembleDebug`
|
||||||
|
- Remove `build/` directory if clean doesn't work
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
### Running Unit Tests
|
### Running Unit Tests
|
||||||
@@ -62,16 +109,19 @@ ArcaneChat is a Delta Chat Android client built on top of the official Delta Cha
|
|||||||
```bash
|
```bash
|
||||||
./gradlew test
|
./gradlew test
|
||||||
```
|
```
|
||||||
|
Expected duration: 1-3 minutes
|
||||||
|
|
||||||
### Running Instrumented Tests
|
### Running Instrumented Tests
|
||||||
|
|
||||||
1. **Disable animations** on your device/emulator:
|
1. **Disable animations** on your device/emulator:
|
||||||
- Developer Options → Set "Window animation scale", "Transition animation scale", and "Animator duration scale" to 0x
|
- Developer Options → Set "Window animation scale", "Transition animation scale", and "Animator duration scale" to 0x
|
||||||
|
- **CRITICAL:** Tests will fail if animations are enabled
|
||||||
|
|
||||||
2. **Run tests:**
|
2. **Run tests:**
|
||||||
```bash
|
```bash
|
||||||
./gradlew connectedAndroidTest
|
./gradlew connectedAndroidTest
|
||||||
```
|
```
|
||||||
|
Expected duration: 10-30 minutes depending on device/emulator
|
||||||
|
|
||||||
### Online Tests
|
### Online Tests
|
||||||
|
|
||||||
@@ -129,6 +179,14 @@ TEST_MAIL_PW=yourpassword
|
|||||||
- Java bindings are in `src/main/java/com/b44t/messenger/Dc*.java`
|
- Java bindings are in `src/main/java/com/b44t/messenger/Dc*.java`
|
||||||
- JSON-RPC bindings in `chat.delta.rpc.*` package (generated via dcrpcgen)
|
- JSON-RPC bindings in `chat.delta.rpc.*` package (generated via dcrpcgen)
|
||||||
|
|
||||||
|
### Generating JSON-RPC Bindings
|
||||||
|
|
||||||
|
To regenerate JSON-RPC bindings after core changes:
|
||||||
|
```bash
|
||||||
|
./scripts/generate-rpc-bindings.sh
|
||||||
|
```
|
||||||
|
**Note:** Requires Rust tooling and [dcrpcgen tool](https://github.com/chatmail/dcrpcgen) installed
|
||||||
|
|
||||||
### Working with Translations
|
### Working with Translations
|
||||||
|
|
||||||
- Translations managed via Transifex (not in repository)
|
- Translations managed via Transifex (not in repository)
|
||||||
@@ -142,6 +200,43 @@ Decode crash symbols:
|
|||||||
$ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decoded.txt
|
$ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decoded.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Validation and Quality Checks
|
||||||
|
|
||||||
|
### Pre-commit Checks
|
||||||
|
|
||||||
|
Before committing changes, always run:
|
||||||
|
|
||||||
|
1. **Gradle wrapper validation:**
|
||||||
|
```bash
|
||||||
|
./gradlew wrapper --gradle-version=current
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Build verification:**
|
||||||
|
```bash
|
||||||
|
./gradlew assembleDebug
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Unit tests:**
|
||||||
|
```bash
|
||||||
|
./gradlew test
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Code style:** Match existing code style in modified files (no automatic formatter configured)
|
||||||
|
|
||||||
|
### When to Rebuild Native Libraries
|
||||||
|
|
||||||
|
Rebuild native libraries (`scripts/ndk-make.sh`) when:
|
||||||
|
- Updating deltachat-core-rust submodule
|
||||||
|
- Modifying anything in `jni/` directory
|
||||||
|
- Changing NDK version
|
||||||
|
- After `git clean -fdx` or fresh clone
|
||||||
|
|
||||||
|
**DO NOT** rebuild native libraries for:
|
||||||
|
- Pure Java/Kotlin code changes
|
||||||
|
- Resource file changes
|
||||||
|
- Gradle configuration changes (unless changing native library linking)
|
||||||
|
- Documentation updates
|
||||||
|
|
||||||
## WebXDC Support
|
## WebXDC Support
|
||||||
|
|
||||||
ArcaneChat has extended WebXDC support:
|
ArcaneChat has extended WebXDC support:
|
||||||
@@ -152,12 +247,24 @@ ArcaneChat has extended WebXDC support:
|
|||||||
|
|
||||||
## Important Files
|
## Important Files
|
||||||
|
|
||||||
- `build.gradle` - Main build configuration
|
- `build.gradle` - Main build configuration (Android Gradle Plugin 8.11.1, Java 8 compatibility)
|
||||||
- `CONTRIBUTING.md` - Contribution guidelines
|
- `CONTRIBUTING.md` - Contribution guidelines
|
||||||
- `BUILDING.md` - Detailed build setup
|
- `BUILDING.md` - Detailed build setup instructions
|
||||||
- `RELEASE.md` - Release process
|
- `RELEASE.md` - Release process
|
||||||
- `proguard-rules.pro` - ProGuard configuration
|
- `proguard-rules.pro` - ProGuard configuration (enabled for both debug and release)
|
||||||
- `google-services.json` - Firebase configuration (gplay flavor)
|
- `google-services.json` - Firebase configuration (gplay flavor only)
|
||||||
|
- `settings.gradle` - Gradle settings
|
||||||
|
- `.github/workflows/` - CI/CD configuration
|
||||||
|
|
||||||
|
## Dependencies and Constraints
|
||||||
|
|
||||||
|
- **Java Version:** Java 8 compatibility (do not use Java 9+ features)
|
||||||
|
- **Gradle:** Use wrapper (`./gradlew`) to ensure correct Gradle version
|
||||||
|
- **NDK:** Must use version 27.0.12077973 (specified in build.gradle)
|
||||||
|
- **Min SDK:** 21 (Android 5.0) - code must be compatible
|
||||||
|
- **Target SDK:** 36 (Android 16) - test on this API level when possible
|
||||||
|
- **ProGuard:** Always enabled - ensure ProGuard rules are correct for new dependencies
|
||||||
|
- **Multi-dex:** Enabled - app exceeds 65k method limit
|
||||||
|
|
||||||
## Package Structure
|
## Package Structure
|
||||||
|
|
||||||
@@ -173,3 +280,35 @@ ArcaneChat has extended WebXDC support:
|
|||||||
- Native library must be rebuilt after core changes
|
- Native library must be rebuilt after core changes
|
||||||
- ProGuard is enabled in both debug and release builds
|
- ProGuard is enabled in both debug and release builds
|
||||||
- Multi-dex is enabled due to app size
|
- Multi-dex is enabled due to app size
|
||||||
|
|
||||||
|
## CI/CD Workflows
|
||||||
|
|
||||||
|
### Preview APK Workflow (.github/workflows/preview-apk.yml)
|
||||||
|
|
||||||
|
Runs on every pull request to build and upload a preview APK:
|
||||||
|
|
||||||
|
1. **Setup steps:**
|
||||||
|
- Checks out repository with submodules
|
||||||
|
- Validates Fastlane metadata
|
||||||
|
- Sets up Rust cache (working-directory: jni/deltachat-core-rust)
|
||||||
|
- Sets up Java 17 (Temurin distribution)
|
||||||
|
- Sets up Android SDK
|
||||||
|
- Caches Gradle dependencies
|
||||||
|
- Sets up NDK r27
|
||||||
|
|
||||||
|
2. **Build process:**
|
||||||
|
```bash
|
||||||
|
scripts/install-toolchains.sh && scripts/ndk-make.sh armeabi-v7a
|
||||||
|
./gradlew --no-daemon -PABI_FILTER=armeabi-v7a assembleFossDebug
|
||||||
|
```
|
||||||
|
Note: Builds only armeabi-v7a for faster CI builds
|
||||||
|
|
||||||
|
3. **Output:** Uploads APK artifact to GitHub Actions
|
||||||
|
|
||||||
|
### Important CI Considerations
|
||||||
|
|
||||||
|
- Always validate Gradle wrapper before committing changes
|
||||||
|
- Fastlane metadata must be valid (validated in CI)
|
||||||
|
- Use `--no-daemon` flag for Gradle in CI environments
|
||||||
|
- CI builds use FOSS flavor to avoid Google Services dependencies
|
||||||
|
- Expected CI build time: 15-25 minutes for full workflow
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
name: add artifact links to pull request
|
|
||||||
on:
|
|
||||||
workflow_run:
|
|
||||||
workflows: ["Upload Preview APK"]
|
|
||||||
types: [completed]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
artifacts-url-comments:
|
|
||||||
name: add artifact links to pull request
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
|
||||||
steps:
|
|
||||||
- name: add artifact links to pull request
|
|
||||||
uses: tonyhallett/artifacts-url-comments@v1.1.0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
prefix: "**To test the changes in this pull request, install this apk:**"
|
|
||||||
format: "[📦 {name}]({url})"
|
|
||||||
addTo: pull
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
name: Core Cache
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
paths:
|
||||||
|
- 'jni/deltachat-core-rust'
|
||||||
|
- 'jni/Android.mk'
|
||||||
|
- 'jni/Application.mk'
|
||||||
|
- 'jni/dc_wrapper.c'
|
||||||
|
- 'scripts/ndk-make.sh'
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
|
||||||
|
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
|
||||||
|
id: setup-ndk
|
||||||
|
with:
|
||||||
|
ndk-version: "r29"
|
||||||
|
|
||||||
|
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
|
||||||
|
with:
|
||||||
|
workspaces: jni/deltachat-core-rust
|
||||||
|
|
||||||
|
- name: Get deltachat-core-rust submodule hash
|
||||||
|
id: core-hash
|
||||||
|
run: echo "hash=$(git rev-parse HEAD:jni/deltachat-core-rust)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Cache compiled core
|
||||||
|
id: cache-core
|
||||||
|
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
jni/arm64-v8a
|
||||||
|
libs/arm64-v8a
|
||||||
|
key: core-arm64-v8a-${{ steps.core-hash.outputs.hash }}-${{ hashFiles('jni/Android.mk', 'jni/Application.mk', 'jni/dc_wrapper.c', 'scripts/ndk-make.sh') }}-ndk-r27
|
||||||
|
|
||||||
|
- name: Compile core
|
||||||
|
if: steps.cache-core.outputs.cache-hit != 'true'
|
||||||
|
env:
|
||||||
|
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
|
||||||
|
run: |
|
||||||
|
export PATH="${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/"
|
||||||
|
scripts/install-toolchains.sh && scripts/ndk-make.sh arm64-v8a
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
name: Code Format
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
spotless:
|
||||||
|
name: Check code format (Spotless)
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
|
||||||
|
with:
|
||||||
|
java-version: 17
|
||||||
|
distribution: temurin
|
||||||
|
- name: Restore Gradle cache
|
||||||
|
id: gradle-cache
|
||||||
|
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
- name: Validate Gradle Wrapper
|
||||||
|
uses: gradle/actions/wrapper-validation@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
|
||||||
|
- name: Check formatting
|
||||||
|
run: ./gradlew spotlessCheck
|
||||||
|
- name: Save Gradle cache
|
||||||
|
if: github.event_name == 'push' && steps.gradle-cache.outputs.cache-hit != 'true'
|
||||||
|
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
@@ -6,25 +6,30 @@ concurrency:
|
|||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Upload Preview APK
|
name: Upload Preview APK
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Validate Fastlane Metadata
|
- name: Validate Fastlane Metadata
|
||||||
uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2
|
uses: ashutoshgngwr/validate-fastlane-supply-metadata@c8857fdbbd3e00f9a5cbe8604bcecfa95ce8fef8 # v2.1.0
|
||||||
- uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
|
||||||
working-directory: jni/deltachat-core-rust
|
|
||||||
- uses: actions/setup-java@v5
|
|
||||||
with:
|
with:
|
||||||
java-version: 17
|
java-version: 17
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
- uses: android-actions/setup-android@v3
|
|
||||||
- uses: actions/cache@v4
|
- uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.gradle/caches
|
~/.gradle/caches
|
||||||
@@ -32,26 +37,63 @@ jobs:
|
|||||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-gradle-
|
${{ runner.os }}-gradle-
|
||||||
- uses: nttld/setup-ndk@v1
|
|
||||||
id: setup-ndk
|
|
||||||
with:
|
|
||||||
ndk-version: r27
|
|
||||||
|
|
||||||
- name: Validate Gradle Wrapper
|
- name: Validate Gradle Wrapper
|
||||||
uses: gradle/actions/wrapper-validation@v4
|
uses: gradle/actions/wrapper-validation@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
|
||||||
|
|
||||||
|
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
|
||||||
|
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
|
||||||
|
id: setup-ndk
|
||||||
|
with:
|
||||||
|
ndk-version: "r29"
|
||||||
|
|
||||||
|
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
|
||||||
|
with:
|
||||||
|
workspaces: jni/deltachat-core-rust
|
||||||
|
|
||||||
|
- name: Get deltachat-core-rust submodule hash
|
||||||
|
id: core-hash
|
||||||
|
run: echo "hash=$(git rev-parse HEAD:jni/deltachat-core-rust)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Restore compiled core
|
||||||
|
id: core-cache
|
||||||
|
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
jni/arm64-v8a
|
||||||
|
libs/arm64-v8a
|
||||||
|
key: core-arm64-v8a-${{ steps.core-hash.outputs.hash }}-${{ hashFiles('jni/Android.mk', 'jni/Application.mk', 'jni/dc_wrapper.c', 'scripts/ndk-make.sh') }}-ndk-r27
|
||||||
|
|
||||||
- name: Compile core
|
- name: Compile core
|
||||||
|
if: steps.core-cache.outputs.cache-hit != 'true'
|
||||||
env:
|
env:
|
||||||
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
|
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
|
||||||
run: |
|
run: |
|
||||||
export PATH="${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/"
|
export PATH="${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/"
|
||||||
scripts/install-toolchains.sh && scripts/ndk-make.sh armeabi-v7a
|
scripts/install-toolchains.sh && scripts/ndk-make.sh arm64-v8a
|
||||||
|
|
||||||
- name: Build APK
|
- name: Build APK
|
||||||
run: ./gradlew --no-daemon -PABI_FILTER=armeabi-v7a assembleFossDebug
|
run: ./gradlew --no-daemon -PABI_FILTER=arm64-v8a assembleFossDebug
|
||||||
|
|
||||||
- name: Upload APK
|
- name: Upload APK
|
||||||
uses: actions/upload-artifact@v4
|
id: upload
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||||
with:
|
with:
|
||||||
name: app-preview.apk
|
name: app-preview.apk
|
||||||
path: 'build/outputs/apk/foss/debug/*.apk'
|
path: 'build/outputs/apk/foss/debug/*.apk'
|
||||||
|
|
||||||
|
- name: Add artifact links to PR
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||||
|
env:
|
||||||
|
ARTIFACT_URL: ${{ steps.upload.outputs.artifact-url }}
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const url = process.env.ARTIFACT_URL;
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
body: `**To test the changes in this pull request, install this apk:**\n\n[📦 app-preview.apk](${url})`,
|
||||||
|
});
|
||||||
|
|||||||
@@ -23,18 +23,18 @@ jobs:
|
|||||||
name: Upload Release APK
|
name: Upload Release APK
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- uses: Swatinem/rust-cache@v2
|
- uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
|
||||||
with:
|
with:
|
||||||
working-directory: jni/deltachat-core-rust
|
working-directory: jni/deltachat-core-rust
|
||||||
- uses: actions/setup-java@v3
|
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
|
||||||
with:
|
with:
|
||||||
java-version: 17
|
java-version: 17
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
- uses: android-actions/setup-android@v3
|
- uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4.0.1
|
||||||
- uses: nttld/setup-ndk@v1
|
- uses: nttld/setup-ndk@ed92fe6cadad69be94a966a7ee3271275e62f779 # v1.6.0
|
||||||
id: setup-ndk
|
id: setup-ndk
|
||||||
with:
|
with:
|
||||||
ndk-version: r27
|
ndk-version: r27
|
||||||
@@ -59,23 +59,16 @@ jobs:
|
|||||||
rm build/outputs/apk/foss/release/*universal*
|
rm build/outputs/apk/foss/release/*universal*
|
||||||
./gradlew assembleGplayRelease
|
./gradlew assembleGplayRelease
|
||||||
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
|
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
|
||||||
|
mv build/outputs/mapping/fossRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-foss.txt
|
||||||
|
mv build/outputs/mapping/gplayRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-gplay.txt
|
||||||
|
|
||||||
- name: Release on GitHub
|
- name: Release on GitHub
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
|
||||||
with:
|
with:
|
||||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
|
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
|
||||||
prerelease: ${{ contains(github.event.ref, '-beta') }}
|
prerelease: ${{ contains(github.event.ref, '-beta') }}
|
||||||
fail_on_unmatched_files: true
|
fail_on_unmatched_files: true
|
||||||
files: build/outputs/apk/foss/release/*.apk
|
files: |
|
||||||
|
build/outputs/apk/foss/release/*.apk
|
||||||
- name: Release on ZapStore
|
build/outputs/mapping/fossRelease/mapping-*.txt
|
||||||
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
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
name: GitHub Actions Security Analysis with zizmor
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
pull_request:
|
||||||
|
branches: ["**"]
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
zizmor:
|
||||||
|
name: Run zizmor
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
security-events: write # Required for upload-sarif (used by zizmor-action) to upload SARIF files.
|
||||||
|
contents: read
|
||||||
|
actions: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Run zizmor
|
||||||
|
uses: zizmorcore/zizmor-action@b1d7e1fb5de872772f31590499237e7cce841e8e # v0.5.3
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
rules:
|
||||||
|
unpinned-uses:
|
||||||
|
config:
|
||||||
|
policies:
|
||||||
|
actions/*: ref-pin
|
||||||
|
dependabot/*: ref-pin
|
||||||
@@ -27,7 +27,7 @@ install Rust tooling (read sections below) and the [dcrpcgen tool](https://githu
|
|||||||
then generate the code running the script:
|
then generate the code running the script:
|
||||||
|
|
||||||
```
|
```
|
||||||
./scripts/generate-rpc-bindings.sh
|
./scripts/update-rpc-bindings.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## Build Using Nix
|
## Build Using Nix
|
||||||
@@ -47,7 +47,7 @@ Nix development environment contains Rust with cross-compilation toolchains and
|
|||||||
|
|
||||||
To [build an APK](https://developer.android.com/studio/build/building-cmdline) run the following 2 steps.
|
To [build an APK](https://developer.android.com/studio/build/building-cmdline) run the following 2 steps.
|
||||||
Note that the first step may take some time to build for all architectures. You can optionally read
|
Note that the first step may take some time to build for all architectures. You can optionally read
|
||||||
[the first comment block in the `ndk-make.sh` script](https://github.com/deltachat/deltachat-android/blob/master/scripts/ndk-make.sh)
|
[the first comment block in the `ndk-make.sh` script](./scripts/ndk-make.sh)
|
||||||
for pointers on how to build for a specific architecture.
|
for pointers on how to build for a specific architecture.
|
||||||
```
|
```
|
||||||
$ scripts/ndk-make.sh
|
$ scripts/ndk-make.sh
|
||||||
@@ -56,7 +56,7 @@ $ ./gradlew assembleDebug
|
|||||||
|
|
||||||
Resulting APK files can be found in
|
Resulting APK files can be found in
|
||||||
`build/outputs/apk/gplay/debug/` and
|
`build/outputs/apk/gplay/debug/` and
|
||||||
`build/outputs/apk/fat/debug/`.
|
`build/outputs/apk/foss/debug/`.
|
||||||
|
|
||||||
## Build Using Dockerfile
|
## Build Using Dockerfile
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ deltachat@6012dcb974fe:/home/app$ ./gradlew assembleDebug
|
|||||||
|
|
||||||
In /etc/containers/storage.conf, replace the line: `driver = ""` with: `driver = "overlay"`.
|
In /etc/containers/storage.conf, replace the line: `driver = ""` with: `driver = "overlay"`.
|
||||||
You can also set the `driver` option to something else, you just need to set it to _something_.
|
You can also set the `driver` option to something else, you just need to set it to _something_.
|
||||||
[Read about possible options here](https://github.com/containers/storage/blob/master/docs/containers-storage.conf.5.md#storage-table).
|
[Read about possible options here](https://github.com/containers/storage/blob/main/docs/containers-storage.conf.5.md#storage-table).
|
||||||
|
|
||||||
## <a name="setup-podman"></a>Setup Podman
|
## <a name="setup-podman"></a>Setup Podman
|
||||||
|
|
||||||
@@ -135,8 +135,8 @@ See https://wiki.archlinux.org/index.php/Podman#Rootless_Podman for more informa
|
|||||||
|
|
||||||
To setup build environment manually:
|
To setup build environment manually:
|
||||||
- _Either_, in Android Studio, go to "Tools / SDK Manager / SDK Tools", enable "Show Package Details",
|
- _Either_, in Android Studio, go to "Tools / SDK Manager / SDK Tools", enable "Show Package Details",
|
||||||
select "CMake" and the desired NDK (install the same NDK version as the [Dockerfile](https://github.com/deltachat/deltachat-android/blob/master/Dockerfile)), hit "Apply".
|
select "CMake" and the desired NDK (install the same NDK version as the [Dockerfile](./Dockerfile)), hit "Apply".
|
||||||
- _Or_ read [Dockerfile](https://github.com/deltachat/deltachat-android/blob/master/Dockerfile) and mimic what it does.
|
- _Or_ read [Dockerfile](./Dockerfile) and mimic what it does.
|
||||||
|
|
||||||
Then, in both cases, install Rust using [rustup](https://rustup.rs/)
|
Then, in both cases, install Rust using [rustup](https://rustup.rs/)
|
||||||
and Rust toolchains for cross-compilation by executing `scripts/install-toolchains.sh`.
|
and Rust toolchains for cross-compilation by executing `scripts/install-toolchains.sh`.
|
||||||
@@ -243,3 +243,15 @@ $ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decod
|
|||||||
`obj/local/armeabi-v7a` is the extracted path from `deltachat-gplay-release-X.X.X.apk-symbols.zip` file from https://download.delta.chat/android/symbols/
|
`obj/local/armeabi-v7a` is the extracted path from `deltachat-gplay-release-X.X.X.apk-symbols.zip` file from https://download.delta.chat/android/symbols/
|
||||||
|
|
||||||
Replace `armeabi-v7a` by the correct architecture the logs come from (can be guessed by trial and error)
|
Replace `armeabi-v7a` by the correct architecture the logs come from (can be guessed by trial and error)
|
||||||
|
|
||||||
|
|
||||||
|
### Deobfuscating Java Stack Traces
|
||||||
|
|
||||||
|
Because the app uses code minification (ProGuard/R8), Java stack traces in crash reports are obfuscated.
|
||||||
|
To decode them, use `retrace` with the `mapping.txt` file that is included in the symbols zip:
|
||||||
|
|
||||||
|
```
|
||||||
|
retrace mapping.txt crash.txt > decoded-crash.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
`mapping.txt` is extracted from the same `deltachat-gplay-release-X.X.X.apk-symbols.zip` file available at https://download.delta.chat/android/symbols/
|
||||||
|
|||||||
@@ -1,11 +1,175 @@
|
|||||||
# Delta Chat Android Changelog
|
# Delta Chat Android Changelog
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
* Allow to select multiple files for sending
|
||||||
|
* Add notifications for missed calls
|
||||||
|
* Video call preview now accurately shows what is sent to remote
|
||||||
|
* Fix: properly hide draft attachment during in-chat search
|
||||||
|
* Fix: close mini-apps and chats if they are deleted
|
||||||
|
* Fix: cancel in-chat search when back is pressed, instead of directly returning to chatlist
|
||||||
|
|
||||||
|
## v2.53.0
|
||||||
|
2026-06
|
||||||
|
|
||||||
|
* Use message style notifications for longer message previews
|
||||||
|
* Remove notification after audio playback ends
|
||||||
|
* Fix: do not allow blocked contacts to use our invite links
|
||||||
|
* Fix sending mini-app that was used/prepared before sending
|
||||||
|
* Some more small fixes and updated translations
|
||||||
|
* Update to core 2.53.0
|
||||||
|
|
||||||
|
## v2.52.0
|
||||||
|
2026-06
|
||||||
|
|
||||||
|
* Fix: avoid crashes in Media preview sometimes
|
||||||
|
* Fix: Incorrect total time when attaching audio files as draft
|
||||||
|
* Fix: Audio files in draft showing total time from wrong file
|
||||||
|
* Fix: Update the channel title after joining if the QR code had an outdated title
|
||||||
|
* Voice recording will be automatically saved as draft when interrupted
|
||||||
|
* Update to core 2.52.0
|
||||||
|
|
||||||
|
## v2.51.0
|
||||||
|
2026-06
|
||||||
|
|
||||||
|
* Better incoming call system integration
|
||||||
|
* Calls are not experimental anymore and don't need to be manually enabled
|
||||||
|
* Calls can be answered by tapping messages
|
||||||
|
* Notify the user when they try to make a call while the device is offline
|
||||||
|
* Channels are no longer experimental and are available by default
|
||||||
|
* Display a permanent notification when doing location streaming and get rid of dangerous "Access Location in Background" permission
|
||||||
|
* Autoplay all voice messages in a chat
|
||||||
|
* Allow to share location for 24 hours
|
||||||
|
* Allow mini-apps to play audio without user interaction
|
||||||
|
* Allow to paste and open invitation links from search
|
||||||
|
* Mark chats as unread (long tap a chat and select the corresponding option from the three-dot-menu)
|
||||||
|
* Add "Mark all as read" option to profile menu in the profile switcher
|
||||||
|
* Fix process of upgrading from a very old version of the app
|
||||||
|
* Show more recent added stickers at the top of the sticker picker
|
||||||
|
* Allow to open links in messages via actions in TalkBack menu
|
||||||
|
* Allow to open map if user clicks "Location streaming enabled" system message
|
||||||
|
* Allow to disable incoming calls notifications
|
||||||
|
* Add an option to process unencrypted messages; by default, only encrypted messages can be sent or received
|
||||||
|
* Fix: do not accidentally set draft in chats that don't allow sending messages
|
||||||
|
* Fix swipe navigation between tabs in RTL languages
|
||||||
|
* Remove "Move to DeltaChat folder", in case you are using the option, a device message shows how to proceed
|
||||||
|
* Remove "Only fetch from DeltaChat folder" option, the functionality is preserved for existing profiles
|
||||||
|
* Remove "Delete Messages from Server" option, this is now up to the server:
|
||||||
|
Chatmail handles that automatically, classic email servers used as relay often have lots of storage or options themselves
|
||||||
|
* Remove "Show Email" options, all messages are shown by default, shared usage of email account is not supported
|
||||||
|
* Allow otherwise invalid TLS connections if the key is unchanged
|
||||||
|
* Adapt quota warning to automatic cleanup.
|
||||||
|
* Don't show non-delivery-notfications in broadcast channels
|
||||||
|
* Resend the last 10 messages to new broadcast channel member
|
||||||
|
* Enable PQC (Post-Quantum Cryptography) support. We do not generate PQC keys yet, this step is needed for forward compatibility
|
||||||
|
* Improve avatar quality
|
||||||
|
* Add new webxdc.isAppSender and webxdc.isBroadcast APIs for mini-apps
|
||||||
|
* Fix: avoid invalid empty "~" notifications when some peer is streaming location
|
||||||
|
* Fix: Improve detection of stickers
|
||||||
|
* Fix text direction issues for RTL languages in "Show full message" view
|
||||||
|
* Fix: Reconnect when removing a relay
|
||||||
|
* Fix: Location streaming now works correctly with multiple accounts
|
||||||
|
* Fix debouncing in chatlist and search
|
||||||
|
* Fix sharing contact across profiles
|
||||||
|
* Fix: Reset scroll location after switching account
|
||||||
|
* Update to core 2.51.0
|
||||||
|
|
||||||
|
## v2.49.0
|
||||||
|
2026-04
|
||||||
|
|
||||||
|
* Fix file sharing to certain apps (e.g. Material Files, etc.)
|
||||||
|
* Fix problem with calls when microphone permission is not granted
|
||||||
|
* Fix taking pictures and videos in devices with SD cards
|
||||||
|
* Fix flipped orientation for some images
|
||||||
|
* Fix: avoid empty contact request chats when using invite links in a multi-device setup
|
||||||
|
* Remove proxy toggle from profile editing to avoid confusion
|
||||||
|
* Updated translations
|
||||||
|
* Update to core 2.49.0
|
||||||
|
|
||||||
|
## v2.48.0
|
||||||
|
2026-03
|
||||||
|
|
||||||
|
* Add a warning when editing relays
|
||||||
|
* Fix message reordering problems in multi-relay setups
|
||||||
|
* Some more bug fixes and updated translations
|
||||||
|
* Update to core 2.48.0
|
||||||
|
|
||||||
|
## v2.47.0
|
||||||
|
2026-03
|
||||||
|
|
||||||
|
* Allow to set chat description
|
||||||
|
* Unified date display in call bubbles
|
||||||
|
* Explain at "Settings / Chats / Outgoing Media Quality" how to send original quality
|
||||||
|
* Add a basic sticker picker
|
||||||
|
* Leave groups and channels before deletion
|
||||||
|
* Further minimize metadata in messages and while getting in contact.
|
||||||
|
* Increase resilience of multi-relay usage: if on relay goes down, messages are still received in the others.
|
||||||
|
* Allow to hide a relay from contacts instead of removing, allowing smoother relay changes
|
||||||
|
* HTML emails: allow to review and copy links before opening them
|
||||||
|
* Mark call message as seen when accepting/declining a call
|
||||||
|
* Fix: keep original sent timestamp for resent messages
|
||||||
|
* Fix: make clicking on broadcast member-added messages work always
|
||||||
|
* Fix: remove notification when a message is deleted by sender
|
||||||
|
* Fix: avoid "reply privately" not quoting the selected message sometimes
|
||||||
|
* Fix: properly hide the calls button
|
||||||
|
* Some more bug fixes and updated translations
|
||||||
|
* Update to core 2.47.0
|
||||||
|
|
||||||
|
## v2.43.0
|
||||||
|
2026-02
|
||||||
|
|
||||||
|
* Improve switch speed when changing profiles
|
||||||
|
* Allow to switch profile when sharing or forwarding
|
||||||
|
* Display message views count for channel owners
|
||||||
|
* Don't notify notification-to-all from in-chat apps if the chat is muted
|
||||||
|
* Allow to see inbox quota for all relays in connectivity screen
|
||||||
|
* Truncate file names in the middle, not at the end; important information are more often at the end
|
||||||
|
* Remove email address from user profile
|
||||||
|
* Mark external links with " ↗" to make them clear
|
||||||
|
* Make QR code larger on "Add Second Device" screen
|
||||||
|
* Add indication for blocked contacts in user profile
|
||||||
|
* Allow to start calls with video disabled
|
||||||
|
* Show hint for empty contact search results
|
||||||
|
* Add background playing for voice messages and other audio files
|
||||||
|
* Allow scanning Invitation Code when creating a new profile
|
||||||
|
* Add context menu in long-pressing relays items instead of showing buttons
|
||||||
|
* Enhanced video player UI
|
||||||
|
* Fix: Show dialog if pasted QR codes are invalid
|
||||||
|
* Fix: Refresh chat list when returning from conversation if selected profile changed
|
||||||
|
* Fix: Update menu when using "select all" in contact selection
|
||||||
|
* Fix: Avoid empty profiles after using "add as second device" from welcome screen
|
||||||
|
* Fix: Remove from group deselected members in the contact selection list
|
||||||
|
* Fix multi-device seen messages synchronization when using multiple relays
|
||||||
|
* Fix mailto handling
|
||||||
|
* Fix layout problems inside in-chat apps
|
||||||
|
* Fix real-time for in-chat apps that need it
|
||||||
|
* Avoid crash when the app is minimized with profile switcher or reactions dialogs open
|
||||||
|
* Remove "trash icon" option from contact selection list when adding members to group
|
||||||
|
* Update to core 2.43.0
|
||||||
|
|
||||||
|
## v2.35.0
|
||||||
|
2026-01
|
||||||
|
|
||||||
|
* Protect profile deletion and relays management with system lock/pin
|
||||||
|
* Fix: Remove address from profile switcher
|
||||||
|
* Fix: Avoid crash if the system doesn't allow to start foreground service
|
||||||
|
* Remove deprecated "real-time apps" switch
|
||||||
|
* Update to core 2.35.0
|
||||||
|
|
||||||
|
## v2.34.0
|
||||||
|
2025-12
|
||||||
|
|
||||||
|
* Allow to add relay from clipboard or image if camera permission is not granted
|
||||||
|
* Avoid crash in the "View Log" screen
|
||||||
|
* Update to core 2.34.0
|
||||||
|
|
||||||
## v2.33.1
|
## v2.33.1
|
||||||
2025-12
|
2025-12
|
||||||
|
|
||||||
* Target Android 16
|
* Target Android 16
|
||||||
* Change color of links in text messages
|
* Change color of links in text messages
|
||||||
* Improve edge-to-edge support
|
* Improve edge-to-edge support
|
||||||
|
* Add the option (opt-in) to send anonymous statistics to Delta Chat's developers
|
||||||
* Metadata protection: protect message recipients
|
* Metadata protection: protect message recipients
|
||||||
* Allow to withdraw channel invite links and QR codes
|
* Allow to withdraw channel invite links and QR codes
|
||||||
* Allow to open externally links clicked inside in-chat apps
|
* Allow to open externally links clicked inside in-chat apps
|
||||||
|
|||||||
@@ -73,18 +73,15 @@ esp. before/after screenshots.
|
|||||||
|
|
||||||
### Coding Conventions
|
### Coding Conventions
|
||||||
|
|
||||||
Source files are partly derived from different other open source projects
|
|
||||||
and may follow different coding styles and conventions.
|
|
||||||
|
|
||||||
If you do a PR fixing a bug or adding a feature,
|
|
||||||
please embrace the coding convention you see in the corresponding files,
|
|
||||||
so that the result fits well together.
|
|
||||||
|
|
||||||
Do not refactor or rename things in the same PR
|
|
||||||
to make the diff small and the PR easy to review.
|
|
||||||
|
|
||||||
Project language is Java.
|
Project language is Java.
|
||||||
|
|
||||||
|
Code formatting is enforced via [Spotless](https://github.com/diffplug/spotless) Gradle plugin.
|
||||||
|
Auto-format all files by running `./gradlew spotlessApply` before opening a PR.
|
||||||
|
CI will fail if files are not formatted correctly so make sure to run the formatter before pushing.
|
||||||
|
|
||||||
|
If you do a PR fixing a bug or adding a feature, do not refactor or rename things in the same PR
|
||||||
|
to make the diff small and the PR easy to review.
|
||||||
|
|
||||||
By using [Delta Chat Core](https://github.com/deltachat/deltachat-core-rust)
|
By using [Delta Chat Core](https://github.com/deltachat/deltachat-core-rust)
|
||||||
there is already a strong separation between "UI" and "Model".
|
there is already a strong separation between "UI" and "Model".
|
||||||
Further separations and abstraction layers are often not helpful
|
Further separations and abstraction layers are often not helpful
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application' version '8.11.1'
|
id 'com.android.application' version '8.11.1'
|
||||||
id 'com.google.gms.google-services' version '4.4.1'
|
id 'com.google.gms.google-services' version '4.4.1'
|
||||||
|
id 'com.diffplug.spotless' version '8.3.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
@@ -33,8 +34,8 @@ android {
|
|||||||
useLibrary 'org.apache.http.legacy'
|
useLibrary 'org.apache.http.legacy'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
versionCode 30000734
|
versionCode 30000746
|
||||||
versionName "2.33.1"
|
versionName "2.53.0"
|
||||||
|
|
||||||
applicationId "chat.delta.lite"
|
applicationId "chat.delta.lite"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
@@ -72,10 +73,20 @@ android {
|
|||||||
packagingOptions {
|
packagingOptions {
|
||||||
jniLibs {
|
jniLibs {
|
||||||
doNotStrip '**/*.so'
|
doNotStrip '**/*.so'
|
||||||
keepDebugSymbols += ['*/mips/*.so', '*/mips64/*.so']
|
keepDebugSymbols += [
|
||||||
|
'*/mips/*.so',
|
||||||
|
'*/mips64/*.so'
|
||||||
|
]
|
||||||
}
|
}
|
||||||
resources {
|
resources {
|
||||||
excludes += ['LICENSE.txt', 'LICENSE', 'NOTICE', 'asm-license.txt', 'META-INF/LICENSE', 'META-INF/NOTICE']
|
excludes += [
|
||||||
|
'LICENSE.txt',
|
||||||
|
'LICENSE',
|
||||||
|
'NOTICE',
|
||||||
|
'asm-license.txt',
|
||||||
|
'META-INF/LICENSE',
|
||||||
|
'META-INF/NOTICE'
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,7 +210,31 @@ android {
|
|||||||
renderScript true
|
renderScript true
|
||||||
aidl true
|
aidl true
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spotless {
|
||||||
|
java {
|
||||||
|
target 'src/*/java/**/*.java'
|
||||||
|
targetExclude 'src/main/java/chat/delta/**' // ignore auto-generated code
|
||||||
|
googleJavaFormat() // Google style = 2-space indent, matches Android Studio defaults
|
||||||
|
removeUnusedImports()
|
||||||
|
trimTrailingWhitespace()
|
||||||
|
endWithNewline()
|
||||||
|
}
|
||||||
|
format 'xml', {
|
||||||
|
target 'src/*/res/**/*.xml', 'src/*/AndroidManifest.xml'
|
||||||
|
targetExclude 'src/*/res/values*/strings*.xml' // line-break changes invalidate translations
|
||||||
|
eclipseWtp('xml').configFile('spotless/eclipse-wtp-xml.prefs')
|
||||||
|
trimTrailingWhitespace()
|
||||||
|
endWithNewline()
|
||||||
|
}
|
||||||
|
groovyGradle {
|
||||||
|
target '*.gradle'
|
||||||
|
greclipse()
|
||||||
|
leadingTabsToSpaces(4)
|
||||||
|
trimTrailingWhitespace()
|
||||||
|
endWithNewline()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final def markwon_version = '4.6.2'
|
final def markwon_version = '4.6.2'
|
||||||
@@ -211,7 +246,14 @@ dependencies {
|
|||||||
implementation "io.noties.markwon:inline-parser:$markwon_version"
|
implementation "io.noties.markwon:inline-parser:$markwon_version"
|
||||||
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
|
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
|
||||||
|
|
||||||
|
def media3_version = "1.8.0" // 1.9.0 need minSdkVersion 23
|
||||||
|
|
||||||
implementation 'androidx.concurrent:concurrent-futures:1.3.0'
|
implementation 'androidx.concurrent:concurrent-futures:1.3.0'
|
||||||
|
implementation 'androidx.core:core:1.17.0'
|
||||||
|
implementation 'androidx.core:core-telecom:1.0.1'
|
||||||
|
implementation 'im.conversations.webrtc:webrtc-android:129.0.0'
|
||||||
|
// For Kotlin->Java interpolation
|
||||||
|
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.9.4'
|
||||||
implementation 'androidx.sharetarget:sharetarget:1.2.0'
|
implementation 'androidx.sharetarget:sharetarget:1.2.0'
|
||||||
implementation 'androidx.webkit:webkit:1.14.0'
|
implementation 'androidx.webkit:webkit:1.14.0'
|
||||||
implementation 'androidx.multidex:multidex:2.0.1'
|
implementation 'androidx.multidex:multidex:2.0.1'
|
||||||
@@ -231,8 +273,11 @@ dependencies {
|
|||||||
implementation 'androidx.work:work-runtime:2.9.1'
|
implementation 'androidx.work:work-runtime:2.9.1'
|
||||||
implementation 'androidx.emoji2:emoji2-emojipicker:1.5.0'
|
implementation 'androidx.emoji2:emoji2-emojipicker:1.5.0'
|
||||||
implementation 'com.google.guava:guava:31.1-android'
|
implementation 'com.google.guava:guava:31.1-android'
|
||||||
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' // plays video and audio
|
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' // FIXME: exoplayer dependencies kept for Video, but we shall migrate them at some point
|
||||||
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'
|
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'
|
||||||
|
implementation "androidx.media3:media3-exoplayer:$media3_version"
|
||||||
|
implementation "androidx.media3:media3-session:$media3_version"
|
||||||
|
implementation "androidx.media3:media3-ui:$media3_version"
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
|
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
|
||||||
implementation 'com.google.zxing:core:3.3.0' // fixed version to support SDK<24
|
implementation 'com.google.zxing:core:3.3.0' // fixed version to support SDK<24
|
||||||
implementation ('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } // QR Code scanner
|
implementation ('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } // QR Code scanner
|
||||||
@@ -246,7 +291,8 @@ dependencies {
|
|||||||
implementation 'com.github.amulyakhare:TextDrawable:558677ea31' // number of unread messages,
|
implementation 'com.github.amulyakhare:TextDrawable:558677ea31' // number of unread messages,
|
||||||
// the one-letter circle for the contacts (when there is not avatar) and a white background.
|
// the one-letter circle for the contacts (when there is not avatar) and a white background.
|
||||||
implementation 'com.googlecode.mp4parser:isoparser:1.0.6' // MP4 recoding; upgrading eg. to 1.1.22 breaks recoding, however, i have not investigated further, just reset to 1.0.6
|
implementation 'com.googlecode.mp4parser:isoparser:1.0.6' // MP4 recoding; upgrading eg. to 1.1.22 breaks recoding, however, i have not investigated further, just reset to 1.0.6
|
||||||
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.10.0') { // for the zooming on photos / media
|
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.10.0') {
|
||||||
|
// for the zooming on photos / media
|
||||||
exclude group: 'com.android.support', module: 'support-annotations'
|
exclude group: 'com.android.support', module: 'support-annotations'
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,11 +301,13 @@ dependencies {
|
|||||||
// <https://github.com/cketti/SafeContentResolver>
|
// <https://github.com/cketti/SafeContentResolver>
|
||||||
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0'
|
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0'
|
||||||
|
|
||||||
gplayImplementation('com.google.firebase:firebase-messaging:24.1.2') { // for PUSH notifications, don't upgrade: v25.0.0 requires minSdk>=23
|
gplayImplementation('com.google.firebase:firebase-messaging:24.1.2') {
|
||||||
|
// for PUSH notifications, don't upgrade: v25.0.0 requires minSdk>=23
|
||||||
exclude group: 'com.google.firebase', module: 'firebase-core'
|
exclude group: 'com.google.firebase', module: 'firebase-core'
|
||||||
exclude group: 'com.google.firebase', module: 'firebase-analytics'
|
exclude group: 'com.google.firebase', module: 'firebase-analytics'
|
||||||
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
|
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
|
||||||
}
|
}
|
||||||
|
gplayImplementation 'com.google.android.gms:play-services-location:21.3.0'
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
testImplementation 'org.assertj:assertj-core:3.27.3'
|
testImplementation 'org.assertj:assertj-core:3.27.3'
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
ArcaneChat is a decentralized and secure instant messenger that is easy to use for friends and family.
|
ArcaneChat is a decentralized and secure instant messenger that is easy to use for friends and family.
|
||||||
|
|
||||||
• Anonymous. Instant onboarding without a phone number, e-mail or other private data.
|
• Private. Instant on-boarding without a phone number or other private data.
|
||||||
|
|
||||||
|
• Friends & Family: Only chat with people you know. Unknown users cannot message or follow you without mutual consent.
|
||||||
|
|
||||||
• Flexible. Supports multiple chat profiles and is easy to setup on multiple devices.
|
• Flexible. Supports multiple chat profiles and is easy to setup on multiple devices.
|
||||||
|
|
||||||
@@ -23,7 +25,7 @@ ArcaneChat is a Delta Chat client and was created with a focus on usability, goo
|
|||||||
<li>Multiple color themes/skins</li>
|
<li>Multiple color themes/skins</li>
|
||||||
<li>It is possible to disable profiles to completely disconnect them saving data/bandwidth</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>You can easily see the connection status of all your profiles in the profile switcher</li>
|
||||||
<li>Extra option to share location for 12 hours</li>
|
<li>Extra option to share location for 24 hours</li>
|
||||||
<li>Clicking on a message with a POI location, will open the POI on the map</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>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>Videos are played in loop, useful for short GIF videos</li>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 447 KiB After Width: | Height: | Size: 446 KiB |
@@ -7,11 +7,11 @@
|
|||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1756239746,
|
"lastModified": 1775939535,
|
||||||
"narHash": "sha256-0ibN685tT+u/Nbmbrrq9G3mRUzct2Votyv/a7Wwv26s=",
|
"narHash": "sha256-Zq1U7Vhw5ctvhJQy+3ShqIv7Mplf3XkgJY+QJnhfUGQ=",
|
||||||
"owner": "tadfisher",
|
"owner": "tadfisher",
|
||||||
"repo": "android-nixpkgs",
|
"repo": "android-nixpkgs",
|
||||||
"rev": "256631d162ec883b2341ee59621516e1f65f0f6b",
|
"rev": "d2e16192309bf3101e4998ffa62e914819dee077",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -28,11 +28,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1741473158,
|
"lastModified": 1768818222,
|
||||||
"narHash": "sha256-kWNaq6wQUbUMlPgw8Y+9/9wP0F8SHkjy24/mN3UAppg=",
|
"narHash": "sha256-460jc0+CZfyaO8+w8JNtlClB2n4ui1RbHfPTLkpwhU8=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "devshell",
|
"repo": "devshell",
|
||||||
"rev": "7c9e793ebe66bcba8292989a68c0419b737a22a0",
|
"rev": "255a2b1725a20d060f566e4755dbf571bbbb5f76",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -79,11 +79,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1756125398,
|
"lastModified": 1775710090,
|
||||||
"narHash": "sha256-XexyKZpf46cMiO5Vbj+dWSAXOnr285GHsMch8FBoHbc=",
|
"narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "3b9f00d7a7bf68acd4c4abb9d43695afb04e03a5",
|
"rev": "4c1018dae018162ec878d42fec712642d214fdfa",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -95,11 +95,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1756159630,
|
"lastModified": 1775823930,
|
||||||
"narHash": "sha256-ohMvsjtSVdT/bruXf5ClBh8ZYXRmD4krmjKrXhEvwMg=",
|
"narHash": "sha256-ALT447J7FcxP/97J01A/gp/hgdO5lXRsm+zLMt+gIjc=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "84c256e42600cb0fdf25763b48d28df2f25a0c8b",
|
"rev": "8c11f88bb9573a10a7d6bf87161ef08455ac70b9",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -138,11 +138,11 @@
|
|||||||
"nixpkgs": "nixpkgs_3"
|
"nixpkgs": "nixpkgs_3"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1763347184,
|
"lastModified": 1775877051,
|
||||||
"narHash": "sha256-6QH8hpCYJxifvyHEYg+Da0BotUn03BwLIvYo3JAxuqQ=",
|
"narHash": "sha256-wpSQm2PD/w4uRo2wb8utk0b5hOBkkg/CZ1xICY+qB7M=",
|
||||||
"owner": "oxalica",
|
"owner": "oxalica",
|
||||||
"repo": "rust-overlay",
|
"repo": "rust-overlay",
|
||||||
"rev": "08895cce80433978d5bfd668efa41c5e24578cbd",
|
"rev": "08b4f3633471874c8894632ade1b78d75dbda002",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
buildInputs = [
|
buildInputs = [
|
||||||
android-sdk
|
android-sdk
|
||||||
pkgs.openjdk17
|
pkgs.openjdk17
|
||||||
|
pkgs.perl
|
||||||
(pkgs.buildPackages.rust-bin.stable."${rust-version}".minimal.override {
|
(pkgs.buildPackages.rust-bin.stable."${rust-version}".minimal.override {
|
||||||
targets = [
|
targets = [
|
||||||
"armv7-linux-androideabi"
|
"armv7-linux-androideabi"
|
||||||
|
|||||||
@@ -153,6 +153,42 @@ static uint32_t* jintArray2uint32Pointer(JNIEnv* env, jintArray ja, int* ret_icn
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************
|
||||||
|
* DcEventChannel
|
||||||
|
************************************************************/
|
||||||
|
|
||||||
|
static dc_event_channel_t* get_dc_event_channel(JNIEnv *env, jobject obj)
|
||||||
|
{
|
||||||
|
static jfieldID fid = 0;
|
||||||
|
if (fid==0) {
|
||||||
|
jclass cls = (*env)->GetObjectClass(env, obj);
|
||||||
|
fid = (*env)->GetFieldID(env, cls, "eventChannelCPtr", "J" /*Signature, J=long*/);
|
||||||
|
}
|
||||||
|
if (fid) {
|
||||||
|
return (dc_event_channel_t*)(*env)->GetLongField(env, obj, fid);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jlong Java_com_b44t_messenger_DcEventChannel_createEventChannelCPtr(JNIEnv *env, jobject obj)
|
||||||
|
{
|
||||||
|
return (jlong)dc_event_channel_new();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT void Java_com_b44t_messenger_DcEventChannel_unrefEventChannelCPtr(JNIEnv *env, jobject obj)
|
||||||
|
{
|
||||||
|
dc_event_channel_unref(get_dc_event_channel(env, obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JNIEXPORT jlong Java_com_b44t_messenger_DcEventChannel_getEventEmitterCPtr(JNIEnv *env, jobject obj)
|
||||||
|
{
|
||||||
|
return (jlong)dc_event_channel_get_event_emitter(get_dc_event_channel(env, obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* DcAccounts
|
* DcAccounts
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@@ -172,11 +208,11 @@ static dc_accounts_t* get_dc_accounts(JNIEnv *env, jobject obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *env, jobject obj, jstring dir)
|
JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *env, jobject obj, jstring dir, jobject chanObj)
|
||||||
{
|
{
|
||||||
CHAR_REF(dir);
|
CHAR_REF(dir);
|
||||||
int writable = 1;
|
int writable = 1;
|
||||||
jlong accountsCPtr = (jlong)dc_accounts_new(dirPtr, writable);
|
jlong accountsCPtr = (jlong)dc_accounts_new_with_event_channel(dirPtr, writable, get_dc_event_channel(env, chanObj));
|
||||||
CHAR_UNREF(dir);
|
CHAR_UNREF(dir);
|
||||||
return accountsCPtr;
|
return accountsCPtr;
|
||||||
}
|
}
|
||||||
@@ -910,18 +946,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getContactEncrInfo(JNIEnv *e
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT jstring Java_com_b44t_messenger_DcContext_initiateKeyTransfer(JNIEnv *env, jobject obj)
|
|
||||||
{
|
|
||||||
jstring setup_code = NULL;
|
|
||||||
char* temp = dc_initiate_key_transfer(get_dc_context(env, obj));
|
|
||||||
if (temp) {
|
|
||||||
setup_code = JSTRING_NEW(temp);
|
|
||||||
dc_str_unref(temp);
|
|
||||||
}
|
|
||||||
return setup_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT void Java_com_b44t_messenger_DcContext_imex(JNIEnv *env, jobject obj, jint what, jstring dir)
|
JNIEXPORT void Java_com_b44t_messenger_DcContext_imex(JNIEnv *env, jobject obj, jint what, jstring dir)
|
||||||
{
|
{
|
||||||
CHAR_REF(dir);
|
CHAR_REF(dir);
|
||||||
@@ -1369,6 +1393,7 @@ JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getId(JNIEnv *env, jobject obj)
|
|||||||
return dc_msg_get_id(get_dc_msg(env, obj));
|
return dc_msg_get_id(get_dc_msg(env, obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getText(JNIEnv *env, jobject obj)
|
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getText(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
char* temp = dc_msg_get_text(get_dc_msg(env, obj));
|
char* temp = dc_msg_get_text(get_dc_msg(env, obj));
|
||||||
@@ -1594,15 +1619,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_hasHtml(JNIEnv *env, jobject ob
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getSetupCodeBegin(JNIEnv *env, jobject obj)
|
|
||||||
{
|
|
||||||
char* temp = dc_msg_get_setupcodebegin(get_dc_msg(env, obj));
|
|
||||||
jstring ret = JSTRING_NEW(temp);
|
|
||||||
dc_str_unref(temp);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setSubject(JNIEnv *env, jobject obj, jstring text)
|
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setSubject(JNIEnv *env, jobject obj, jstring text)
|
||||||
{
|
{
|
||||||
CHAR_REF(text);
|
CHAR_REF(text);
|
||||||
@@ -1627,12 +1643,6 @@ JNIEXPORT void Java_com_b44t_messenger_DcMsg_setHtml(JNIEnv *env, jobject obj, j
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT void Java_com_b44t_messenger_DcMsg_forceSticker(JNIEnv *env, jobject obj)
|
|
||||||
{
|
|
||||||
dc_msg_force_sticker(get_dc_msg(env, obj));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getPOILocation(JNIEnv *env, jobject obj)
|
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getPOILocation(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
char* temp = dc_msg_get_poi_location(get_dc_msg(env, obj));
|
char* temp = dc_msg_get_poi_location(get_dc_msg(env, obj));
|
||||||
@@ -1957,7 +1967,7 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQr(JNIEnv *env, jo
|
|||||||
|
|
||||||
JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQrSvg(JNIEnv *env, jobject obj)
|
JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQrSvg(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
char* temp = dc_backup_provider_get_qr_svg(get_dc_backup_provider(env, obj));
|
char* temp = dc_create_qr_svg(dc_backup_provider_get_qr(get_dc_backup_provider(env, obj)));
|
||||||
jstring ret = JSTRING_NEW(temp);
|
jstring ret = JSTRING_NEW(temp);
|
||||||
dc_str_unref(temp);
|
dc_str_unref(temp);
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -13,3 +13,8 @@
|
|||||||
-keep class org.thoughtcrime.securesms.crypto.KeyStoreHelper* { *; }
|
-keep class org.thoughtcrime.securesms.crypto.KeyStoreHelper* { *; }
|
||||||
|
|
||||||
-dontwarn com.google.firebase.analytics.connector.AnalyticsConnector
|
-dontwarn com.google.firebase.analytics.connector.AnalyticsConnector
|
||||||
|
|
||||||
|
# Keep WebRTC classes
|
||||||
|
-keep class org.webrtc.** { *; }
|
||||||
|
-keepclassmembers class org.webrtc.** { *; }
|
||||||
|
-keepattributes InnerClasses
|
||||||
|
|||||||
@@ -6,3 +6,4 @@ find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/Delta Chat
|
|||||||
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/get.delta.chat/github.com\/ArcaneChat/g'
|
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/get.delta.chat/github.com\/ArcaneChat/g'
|
||||||
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/delta.chat\/donate/arcanechat.me\/#contribute/g'
|
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/delta.chat\/donate/arcanechat.me\/#contribute/g'
|
||||||
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/Delta Chat/ArcaneChat/g'
|
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/Delta Chat/ArcaneChat/g'
|
||||||
|
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/❤️/💜/g'
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ find ./src/main/assets/help/ -type f -name '*.html' | xargs sed -i 's/ArcaneChat
|
|||||||
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/github.com\/ArcaneChat/get.delta.chat/g'
|
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/github.com\/ArcaneChat/get.delta.chat/g'
|
||||||
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/arcanechat.me\/#contribute/delta.chat\/donate/g'
|
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/arcanechat.me\/#contribute/delta.chat\/donate/g'
|
||||||
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/ArcaneChat/Delta Chat/g'
|
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/ArcaneChat/Delta Chat/g'
|
||||||
|
find ./src/ -type f -name 'strings.xml' | xargs sed -i 's/💜/❤️/g'
|
||||||
|
|
||||||
# don't revert the app name
|
# don't revert the app name
|
||||||
sed -i 's/>Delta Chat</>ArcaneChat</g' ./src/main/res/values/strings.xml
|
sed -i 's/>Delta Chat</>ArcaneChat</g' ./src/main/res/values/strings.xml
|
||||||
|
|||||||
@@ -9,3 +9,4 @@ cd "$ROOT_DIR"
|
|||||||
|
|
||||||
# generate code
|
# generate code
|
||||||
dcrpcgen java --schema schema.json -o ./src/main/java/
|
dcrpcgen java --schema schema.json -o ./src/main/java/
|
||||||
|
rm schema.json
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ cd ../..
|
|||||||
SYMBOLS_ZIP="$APK-symbols.zip"
|
SYMBOLS_ZIP="$APK-symbols.zip"
|
||||||
rm $SYMBOLS_ZIP
|
rm $SYMBOLS_ZIP
|
||||||
zip -r $SYMBOLS_ZIP obj
|
zip -r $SYMBOLS_ZIP obj
|
||||||
|
zip $SYMBOLS_ZIP build/outputs/mapping/gplayRelease/mapping.txt
|
||||||
ls -l $SYMBOLS_ZIP
|
ls -l $SYMBOLS_ZIP
|
||||||
rsync --progress $SYMBOLS_ZIP jekyll@download.delta.chat:/var/www/html/download/android/symbols/
|
rsync --progress $SYMBOLS_ZIP jekyll@download.delta.chat:/var/www/html/download/android/symbols/
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
pluginManagement {
|
pluginManagement {
|
||||||
repositories {
|
repositories {
|
||||||
|
gradlePluginPortal()
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
eclipse.preferences.version=1
|
||||||
|
lineWidth=100
|
||||||
|
splitMultiAttrs=true
|
||||||
|
indentMultipleAttributes=true
|
||||||
|
indentationChar=space
|
||||||
|
indentationSize=4
|
||||||
|
spaceBeforeEmptyCloseTag=true
|
||||||
@@ -11,7 +11,6 @@ import android.content.ComponentName;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.test.espresso.NoMatchingViewException;
|
import androidx.test.espresso.NoMatchingViewException;
|
||||||
import androidx.test.espresso.UiController;
|
import androidx.test.espresso.UiController;
|
||||||
@@ -19,7 +18,6 @@ import androidx.test.espresso.ViewAction;
|
|||||||
import androidx.test.espresso.ViewInteraction;
|
import androidx.test.espresso.ViewInteraction;
|
||||||
import androidx.test.espresso.util.TreeIterables;
|
import androidx.test.espresso.util.TreeIterables;
|
||||||
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
||||||
|
|
||||||
import org.hamcrest.Matcher;
|
import org.hamcrest.Matcher;
|
||||||
import org.thoughtcrime.securesms.ConversationListActivity;
|
import org.thoughtcrime.securesms.ConversationListActivity;
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
@@ -60,10 +58,12 @@ public class TestUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static ActivityScenarioRule<ConversationListActivity> getOfflineActivityRule(boolean useExistingChats) {
|
public static ActivityScenarioRule<ConversationListActivity> getOfflineActivityRule(
|
||||||
|
boolean useExistingChats) {
|
||||||
Intent intent =
|
Intent intent =
|
||||||
Intent.makeMainActivity(
|
Intent.makeMainActivity(
|
||||||
new ComponentName(getInstrumentation().getTargetContext(), ConversationListActivity.class));
|
new ComponentName(
|
||||||
|
getInstrumentation().getTargetContext(), ConversationListActivity.class));
|
||||||
if (!useExistingChats) {
|
if (!useExistingChats) {
|
||||||
createOfflineAccount();
|
createOfflineAccount();
|
||||||
}
|
}
|
||||||
@@ -72,18 +72,22 @@ public class TestUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static <T extends Activity> ActivityScenarioRule<T> getOnlineActivityRule(Class<T> activityClass) {
|
public static <T extends Activity> ActivityScenarioRule<T> getOnlineActivityRule(
|
||||||
|
Class<T> activityClass) {
|
||||||
Context context = getInstrumentation().getTargetContext();
|
Context context = getInstrumentation().getTargetContext();
|
||||||
AccountManager.getInstance().beginAccountCreation(context);
|
AccountManager.getInstance().beginAccountCreation(context);
|
||||||
prepare();
|
prepare();
|
||||||
return new ActivityScenarioRule<>(new Intent(getInstrumentation().getTargetContext(), activityClass));
|
return new ActivityScenarioRule<>(
|
||||||
|
new Intent(getInstrumentation().getTargetContext(), activityClass));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void prepare() {
|
private static void prepare() {
|
||||||
Prefs.setBooleanPreference(getInstrumentation().getTargetContext(), Prefs.DOZE_ASKED_DIRECTLY, true);
|
Prefs.setBooleanPreference(
|
||||||
|
getInstrumentation().getTargetContext(), Prefs.DOZE_ASKED_DIRECTLY, true);
|
||||||
if (!AccessibilityUtil.areAnimationsDisabled(getInstrumentation().getTargetContext())) {
|
if (!AccessibilityUtil.areAnimationsDisabled(getInstrumentation().getTargetContext())) {
|
||||||
throw new RuntimeException("To run the tests, disable animations at Developer options' " +
|
throw new RuntimeException(
|
||||||
"-> 'Window/Transition/Animator animation scale' -> Set all 3 to 'off'");
|
"To run the tests, disable animations at Developer options' "
|
||||||
|
+ "-> 'Window/Transition/Animator animation scale' -> Set all 3 to 'off'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,18 +128,14 @@ public class TestUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Perform action of implicitly waiting for a certain view.
|
* Perform action of implicitly waiting for a certain view. This differs from
|
||||||
* This differs from EspressoExtensions.searchFor in that,
|
* EspressoExtensions.searchFor in that, upon failure to locate an element, it will fetch a new
|
||||||
* upon failure to locate an element, it will fetch a new root view
|
* root view in which to traverse searching for our @param match
|
||||||
* in which to traverse searching for our @param match
|
|
||||||
*
|
*
|
||||||
* @param viewMatcher ViewMatcher used to find our view
|
* @param viewMatcher ViewMatcher used to find our view
|
||||||
*/
|
*/
|
||||||
public static ViewInteraction waitForView(
|
public static ViewInteraction waitForView(
|
||||||
Matcher<View> viewMatcher,
|
Matcher<View> viewMatcher, int waitMillis, int waitMillisPerTry) {
|
||||||
int waitMillis,
|
|
||||||
int waitMillisPerTry
|
|
||||||
) {
|
|
||||||
|
|
||||||
// Derive the max tries
|
// Derive the max tries
|
||||||
int maxTries = (int) (waitMillis / waitMillisPerTry);
|
int maxTries = (int) (waitMillis / waitMillisPerTry);
|
||||||
@@ -164,12 +164,11 @@ public class TestUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normally, you would do
|
* Normally, you would do onView(withId(R.id.send_button)).perform(click()); to send the draft
|
||||||
* onView(withId(R.id.send_button)).perform(click());
|
* message. However, in order to change the send button to the attach button while there is no
|
||||||
* to send the draft message. However, in order to change the send button to the attach button
|
* draft, the send button is made invisible and the attach button is made visible instead. This
|
||||||
* while there is no draft, the send button is made invisible and the attach button is made
|
* confuses the test framework.<br>
|
||||||
* visible instead. This confuses the test framework.<br/><br/>
|
* <br>
|
||||||
*
|
|
||||||
* So, this is a workaround for pressing the send button.
|
* So, this is a workaround for pressing the send button.
|
||||||
*/
|
*/
|
||||||
public static void pressSend() {
|
public static void pressSend() {
|
||||||
|
|||||||
@@ -10,14 +10,11 @@ import static androidx.test.espresso.matcher.ViewMatchers.withId;
|
|||||||
import static androidx.test.espresso.matcher.ViewMatchers.withText;
|
import static androidx.test.espresso.matcher.ViewMatchers.withText;
|
||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.test.espresso.contrib.RecyclerViewActions;
|
import androidx.test.espresso.contrib.RecyclerViewActions;
|
||||||
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import androidx.test.filters.LargeTest;
|
import androidx.test.filters.LargeTest;
|
||||||
|
|
||||||
import com.b44t.messenger.TestUtils;
|
import com.b44t.messenger.TestUtils;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
@@ -34,18 +31,19 @@ public class EnterChatsBenchmark {
|
|||||||
// ==============================================================================================
|
// ==============================================================================================
|
||||||
// Set this to true if you already have at least 10 chats on your existing DeltaChat installation
|
// Set this to true if you already have at least 10 chats on your existing DeltaChat installation
|
||||||
// and want to traverse through them instead of 10 newly created chats
|
// and want to traverse through them instead of 10 newly created chats
|
||||||
private final static boolean USE_EXISTING_CHATS = false;
|
private static final boolean USE_EXISTING_CHATS = false;
|
||||||
// ==============================================================================================
|
// ==============================================================================================
|
||||||
private final static int GO_THROUGH_ALL_CHATS_N_TIMES = 8;
|
private static final int GO_THROUGH_ALL_CHATS_N_TIMES = 8;
|
||||||
|
|
||||||
// ==============================================================================================
|
// ==============================================================================================
|
||||||
// PLEASE BACKUP YOUR ACCOUNT BEFORE RUNNING THIS!
|
// PLEASE BACKUP YOUR ACCOUNT BEFORE RUNNING THIS!
|
||||||
// ==============================================================================================
|
// ==============================================================================================
|
||||||
|
|
||||||
private final static String TAG = EnterChatsBenchmark.class.getSimpleName();
|
private static final String TAG = "EnterChatsBenchmark";
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public ActivityScenarioRule<ConversationListActivity> activityRule = TestUtils.getOfflineActivityRule(USE_EXISTING_CHATS);
|
public ActivityScenarioRule<ConversationListActivity> activityRule =
|
||||||
|
TestUtils.getOfflineActivityRule(USE_EXISTING_CHATS);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createAndEnter10FilledChats() {
|
public void createAndEnter10FilledChats() {
|
||||||
@@ -55,7 +53,9 @@ public class EnterChatsBenchmark {
|
|||||||
for (int i = 0; i < GO_THROUGH_ALL_CHATS_N_TIMES; i++) {
|
for (int i = 0; i < GO_THROUGH_ALL_CHATS_N_TIMES; i++) {
|
||||||
times[i] = "" + timeGoToNChats(10); // 10 group chats were created
|
times[i] = "" + timeGoToNChats(10); // 10 group chats were created
|
||||||
}
|
}
|
||||||
Log.i(TAG, "MEASURED RESULTS (Benchmark) - Going thorough all 10 chats: " + String.join(",", times));
|
Log.i(
|
||||||
|
TAG,
|
||||||
|
"MEASURED RESULTS (Benchmark) - Going thorough all 10 chats: " + String.join(",", times));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -66,13 +66,17 @@ public class EnterChatsBenchmark {
|
|||||||
for (int i = 0; i < GO_THROUGH_ALL_CHATS_N_TIMES; i++) {
|
for (int i = 0; i < GO_THROUGH_ALL_CHATS_N_TIMES; i++) {
|
||||||
times[i] = "" + timeGoToNChats(1);
|
times[i] = "" + timeGoToNChats(1);
|
||||||
}
|
}
|
||||||
Log.i(TAG, "MEASURED RESULTS (Benchmark) - Entering and leaving 1 empty chat: " + String.join(",", times));
|
Log.i(
|
||||||
|
TAG,
|
||||||
|
"MEASURED RESULTS (Benchmark) - Entering and leaving 1 empty chat: "
|
||||||
|
+ String.join(",", times));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void enterFilledChat() {
|
public void enterFilledChat() {
|
||||||
if (!USE_EXISTING_CHATS) {
|
if (!USE_EXISTING_CHATS) {
|
||||||
createChatAndGoBack("Group #1", true, "Hello!", "Some links: https://testrun.org", "And a command: /help");
|
createChatAndGoBack(
|
||||||
|
"Group #1", true, "Hello!", "Some links: https://testrun.org", "And a command: /help");
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] times = new String[50];
|
String[] times = new String[50];
|
||||||
@@ -82,7 +86,18 @@ public class EnterChatsBenchmark {
|
|||||||
long end = System.currentTimeMillis();
|
long end = System.currentTimeMillis();
|
||||||
long diff = end - start;
|
long diff = end - start;
|
||||||
pressBack();
|
pressBack();
|
||||||
Log.i(TAG, "Measured (Benchmark) " + (i+1) + "/" + times.length + ": Entering 1 filled chat took " + diff + "ms " + "(going back took " + (System.currentTimeMillis() - end) + "ms)");
|
Log.i(
|
||||||
|
TAG,
|
||||||
|
"Measured (Benchmark) "
|
||||||
|
+ (i + 1)
|
||||||
|
+ "/"
|
||||||
|
+ times.length
|
||||||
|
+ ": Entering 1 filled chat took "
|
||||||
|
+ diff
|
||||||
|
+ "ms "
|
||||||
|
+ "(going back took "
|
||||||
|
+ (System.currentTimeMillis() - end)
|
||||||
|
+ "ms)");
|
||||||
|
|
||||||
times[i] = "" + diff;
|
times[i] = "" + diff;
|
||||||
}
|
}
|
||||||
@@ -91,16 +106,37 @@ public class EnterChatsBenchmark {
|
|||||||
|
|
||||||
private void create10Chats(boolean fillWithMsgs) {
|
private void create10Chats(boolean fillWithMsgs) {
|
||||||
if (!USE_EXISTING_CHATS) {
|
if (!USE_EXISTING_CHATS) {
|
||||||
createChatAndGoBack("Group #1", fillWithMsgs, "Hello!", "Some links: https://testrun.org", "And a command: /help");
|
createChatAndGoBack(
|
||||||
createChatAndGoBack("Group #2", fillWithMsgs, "example.org, alice@example.org", "aaaaaaa", "bbbbbb");
|
"Group #1",
|
||||||
createChatAndGoBack("Group #3", fillWithMsgs, repeat("Some string ", 600), repeat("Another string", 200), "Hi!!!");
|
fillWithMsgs,
|
||||||
|
"Hello!",
|
||||||
|
"Some links: https://testrun.org",
|
||||||
|
"And a command: /help");
|
||||||
|
createChatAndGoBack(
|
||||||
|
"Group #2", fillWithMsgs, "example.org, alice@example.org", "aaaaaaa", "bbbbbb");
|
||||||
|
createChatAndGoBack(
|
||||||
|
"Group #3",
|
||||||
|
fillWithMsgs,
|
||||||
|
repeat("Some string ", 600),
|
||||||
|
repeat("Another string", 200),
|
||||||
|
"Hi!!!");
|
||||||
createChatAndGoBack("Group #4", fillWithMsgs, "xyzabc", "Hi!!!!", "Let's meet!");
|
createChatAndGoBack("Group #4", fillWithMsgs, "xyzabc", "Hi!!!!", "Let's meet!");
|
||||||
createChatAndGoBack("Group #5", fillWithMsgs, repeat("aaaa", 40), "bbbbbbbbbbbbbbbbbb", "ccccccccccccccc");
|
createChatAndGoBack(
|
||||||
createChatAndGoBack("Group #6", fillWithMsgs, "aaaaaaaaaaa", repeat("Hi! ", 1000), "bbbbbbbbbb");
|
"Group #5", fillWithMsgs, repeat("aaaa", 40), "bbbbbbbbbbbbbbbbbb", "ccccccccccccccc");
|
||||||
createChatAndGoBack("Group #7", fillWithMsgs, repeat("abcdefg ", 500), repeat("xxxxx", 100), "yrrrrrrrrrrrrr");
|
createChatAndGoBack(
|
||||||
createChatAndGoBack("Group #8", fillWithMsgs, "and a number: 037362/384756", "ccccc", "Nice!");
|
"Group #6", fillWithMsgs, "aaaaaaaaaaa", repeat("Hi! ", 1000), "bbbbbbbbbb");
|
||||||
createChatAndGoBack("Group #9", fillWithMsgs, "ddddddddddddddddd", "zuuuuuuuuuuuuuuuu", "ccccc");
|
createChatAndGoBack(
|
||||||
createChatAndGoBack("Group #10", fillWithMsgs, repeat("xxxxxxyyyyy", 100), repeat("String!!", 10), "abcd");
|
"Group #7",
|
||||||
|
fillWithMsgs,
|
||||||
|
repeat("abcdefg ", 500),
|
||||||
|
repeat("xxxxx", 100),
|
||||||
|
"yrrrrrrrrrrrrr");
|
||||||
|
createChatAndGoBack(
|
||||||
|
"Group #8", fillWithMsgs, "and a number: 037362/384756", "ccccc", "Nice!");
|
||||||
|
createChatAndGoBack(
|
||||||
|
"Group #9", fillWithMsgs, "ddddddddddddddddd", "zuuuuuuuuuuuuuuuu", "ccccc");
|
||||||
|
createChatAndGoBack(
|
||||||
|
"Group #10", fillWithMsgs, repeat("xxxxxxyyyyy", 100), repeat("String!!", 10), "abcd");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,10 @@ import androidx.test.espresso.contrib.RecyclerViewActions;
|
|||||||
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import androidx.test.filters.LargeTest;
|
import androidx.test.filters.LargeTest;
|
||||||
|
|
||||||
import com.b44t.messenger.DcContact;
|
import com.b44t.messenger.DcContact;
|
||||||
import com.b44t.messenger.DcContext;
|
import com.b44t.messenger.DcContext;
|
||||||
import com.b44t.messenger.TestUtils;
|
import com.b44t.messenger.TestUtils;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
@@ -29,8 +28,6 @@ import org.thoughtcrime.securesms.ConversationListActivity;
|
|||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@LargeTest
|
@LargeTest
|
||||||
public class ForwardingTest {
|
public class ForwardingTest {
|
||||||
@@ -43,7 +40,8 @@ public class ForwardingTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public final ActivityScenarioRule<ConversationListActivity> activityRule = TestUtils.getOfflineActivityRule(false);
|
public final ActivityScenarioRule<ConversationListActivity> activityRule =
|
||||||
|
TestUtils.getOfflineActivityRule(false);
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void createChats() {
|
public void createChats() {
|
||||||
@@ -51,10 +49,13 @@ public class ForwardingTest {
|
|||||||
dcContext.createChatByContactId(DcContact.DC_CONTACT_ID_SELF);
|
dcContext.createChatByContactId(DcContact.DC_CONTACT_ID_SELF);
|
||||||
// Disable bcc_self so that DC doesn't try to send messages to the server.
|
// Disable bcc_self so that DC doesn't try to send messages to the server.
|
||||||
// If we didn't do this, messages would stay in DC_STATE_OUT_PENDING forever.
|
// If we didn't do this, messages would stay in DC_STATE_OUT_PENDING forever.
|
||||||
// The thing is, DC_STATE_OUT_PENDING show a rotating circle animation, and Espresso doesn't work
|
// 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.
|
// with animations, and the tests would hang and never finish.
|
||||||
dcContext.setConfig("bcc_self", "0");
|
dcContext.setConfig("bcc_self", "0");
|
||||||
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat( "group"));
|
activityRule
|
||||||
|
.getScenario()
|
||||||
|
.onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat("group"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@@ -68,7 +69,8 @@ public class ForwardingTest {
|
|||||||
// The group is at position 0, self chat is at position 1, device talk is at position 2
|
// The group is at position 0, self chat is at position 1, device talk is at position 2
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));
|
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));
|
||||||
onView(withId(R.id.title)).check(matches(withText(R.string.device_talk)));
|
onView(withId(R.id.title)).check(matches(withText(R.string.device_talk)));
|
||||||
onView(withId(android.R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(0, longClick()));
|
onView(withId(android.R.id.list))
|
||||||
|
.perform(RecyclerViewActions.actionOnItemAtPosition(0, longClick()));
|
||||||
onView(withId(R.id.menu_context_forward)).perform(click());
|
onView(withId(R.id.menu_context_forward)).perform(click());
|
||||||
// Send it to self chat (which is sorted to the top because we're forwarding)
|
// Send it to self chat (which is sorted to the top because we're forwarding)
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
|
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
|
||||||
@@ -77,11 +79,13 @@ public class ForwardingTest {
|
|||||||
|
|
||||||
pressBack();
|
pressBack();
|
||||||
|
|
||||||
onView(withId(R.id.toolbar_title)).check(matches(withText(R.string.connectivity_not_connected)));
|
onView(withId(R.id.toolbar_title))
|
||||||
|
.check(matches(withText(R.string.connectivity_not_connected)));
|
||||||
// Self chat moved up because we sent a message there
|
// Self chat moved up because we sent a message there
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
|
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
|
||||||
onView(withId(R.id.title)).check(matches(withText(R.string.saved_messages)));
|
onView(withId(R.id.title)).check(matches(withText(R.string.saved_messages)));
|
||||||
onView(withId(android.R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(0, longClick()));
|
onView(withId(android.R.id.list))
|
||||||
|
.perform(RecyclerViewActions.actionOnItemAtPosition(0, longClick()));
|
||||||
onView(withId(R.id.menu_context_forward)).perform(click());
|
onView(withId(R.id.menu_context_forward)).perform(click());
|
||||||
// Send it to the group
|
// Send it to the group
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(1, click()));
|
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(1, click()));
|
||||||
@@ -89,6 +93,7 @@ public class ForwardingTest {
|
|||||||
onView(withId(R.id.title)).check(matches(withText("group")));
|
onView(withId(R.id.title)).check(matches(withText("group")));
|
||||||
|
|
||||||
pressBack();
|
pressBack();
|
||||||
onView(withId(R.id.toolbar_title)).check(matches(withText(R.string.connectivity_not_connected)));
|
onView(withId(R.id.toolbar_title))
|
||||||
|
.check(matches(withText(R.string.connectivity_not_connected)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,15 +14,13 @@ import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentat
|
|||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
import androidx.test.espresso.contrib.RecyclerViewActions;
|
import androidx.test.espresso.contrib.RecyclerViewActions;
|
||||||
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import androidx.test.filters.LargeTest;
|
import androidx.test.filters.LargeTest;
|
||||||
|
|
||||||
import com.b44t.messenger.DcContext;
|
import com.b44t.messenger.DcContext;
|
||||||
import com.b44t.messenger.TestUtils;
|
import com.b44t.messenger.TestUtils;
|
||||||
|
import java.io.File;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
@@ -34,9 +32,6 @@ import org.thoughtcrime.securesms.R;
|
|||||||
import org.thoughtcrime.securesms.ShareActivity;
|
import org.thoughtcrime.securesms.ShareActivity;
|
||||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
@LargeTest
|
@LargeTest
|
||||||
public class SharingTest {
|
public class SharingTest {
|
||||||
@@ -48,16 +43,22 @@ public class SharingTest {
|
|||||||
private static int createdSingleChatId;
|
private static int createdSingleChatId;
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public final ActivityScenarioRule<ConversationListActivity> activityRule = TestUtils.getOfflineActivityRule(false);
|
public final ActivityScenarioRule<ConversationListActivity> activityRule =
|
||||||
|
TestUtils.getOfflineActivityRule(false);
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void createGroup() {
|
public void createGroup() {
|
||||||
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat( "group"));
|
activityRule
|
||||||
|
.getScenario()
|
||||||
|
.onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat("group"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void createSingleChat() {
|
public void createSingleChat() {
|
||||||
activityRule.getScenario().onActivity(a -> {
|
activityRule
|
||||||
|
.getScenario()
|
||||||
|
.onActivity(
|
||||||
|
a -> {
|
||||||
int contactId = DcHelper.getContext(a).createContact("", "abc@example.org");
|
int contactId = DcHelper.getContext(a).createContact("", "abc@example.org");
|
||||||
createdSingleChatId = DcHelper.getContext(a).createChatByContactId(contactId);
|
createdSingleChatId = DcHelper.getContext(a).createChatByContactId(contactId);
|
||||||
});
|
});
|
||||||
@@ -67,7 +68,9 @@ public class SharingTest {
|
|||||||
public void testNormalSharing() {
|
public void testNormalSharing() {
|
||||||
Intent i = new Intent(Intent.ACTION_SEND);
|
Intent i = new Intent(Intent.ACTION_SEND);
|
||||||
i.putExtra(Intent.EXTRA_TEXT, "Hello!");
|
i.putExtra(Intent.EXTRA_TEXT, "Hello!");
|
||||||
i.setComponent(new ComponentName(getInstrumentation().getTargetContext().getApplicationContext(), ShareActivity.class));
|
i.setComponent(
|
||||||
|
new ComponentName(
|
||||||
|
getInstrumentation().getTargetContext().getApplicationContext(), ShareActivity.class));
|
||||||
activityRule.getScenario().onActivity(a -> a.startActivity(i));
|
activityRule.getScenario().onActivity(a -> a.startActivity(i));
|
||||||
|
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
|
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
|
||||||
@@ -77,9 +80,9 @@ public class SharingTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test direct sharing from a screenshot.
|
* Test direct sharing from a screenshot. Also, this is the regression test for
|
||||||
* Also, this is the regression test for https://github.com/deltachat/deltachat-android/issues/2040
|
* https://github.com/deltachat/deltachat-android/issues/2040 where network changes during sharing
|
||||||
* where network changes during sharing lead to a bug
|
* lead to a bug
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testShareFromScreenshot() {
|
public void testShareFromScreenshot() {
|
||||||
@@ -92,20 +95,25 @@ public class SharingTest {
|
|||||||
pngImage = file;
|
pngImage = file;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Uri uri = Uri.parse("content://" + BuildConfig.APPLICATION_ID + ".attachments/" + Uri.encode(pngImage));
|
Uri uri =
|
||||||
|
Uri.parse(
|
||||||
|
"content://" + BuildConfig.APPLICATION_ID + ".attachments/" + Uri.encode(pngImage));
|
||||||
DcHelper.sharedFiles.put(pngImage, "image/png");
|
DcHelper.sharedFiles.put(pngImage, "image/png");
|
||||||
|
|
||||||
Intent i = new Intent(Intent.ACTION_SEND);
|
Intent i = new Intent(Intent.ACTION_SEND);
|
||||||
i.setType("image/png");
|
i.setType("image/png");
|
||||||
i.putExtra(Intent.EXTRA_SUBJECT, "Screenshot (Sep 27, 2021 00:00:00");
|
i.putExtra(Intent.EXTRA_SUBJECT, "Screenshot (Sep 27, 2021 00:00:00");
|
||||||
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
|
i.setFlags(
|
||||||
|
Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
|
||||||
| Intent.FLAG_ACTIVITY_FORWARD_RESULT
|
| Intent.FLAG_ACTIVITY_FORWARD_RESULT
|
||||||
| Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP
|
| Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP
|
||||||
| Intent.FLAG_RECEIVER_FOREGROUND
|
| Intent.FLAG_RECEIVER_FOREGROUND
|
||||||
| Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
| Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||||
i.putExtra(Intent.EXTRA_STREAM, uri);
|
i.putExtra(Intent.EXTRA_STREAM, uri);
|
||||||
i.putExtra(ShareActivity.EXTRA_CHAT_ID, createdGroupId);
|
i.putExtra(ShareActivity.EXTRA_CHAT_ID, createdGroupId);
|
||||||
i.setComponent(new ComponentName(getInstrumentation().getTargetContext().getApplicationContext(), ShareActivity.class));
|
i.setComponent(
|
||||||
|
new ComponentName(
|
||||||
|
getInstrumentation().getTargetContext().getApplicationContext(), ShareActivity.class));
|
||||||
activityRule.getScenario().onActivity(a -> a.startActivity(i));
|
activityRule.getScenario().onActivity(a -> a.startActivity(i));
|
||||||
|
|
||||||
TestUtils.waitForView(withId(R.id.send_button), 10000, 50);
|
TestUtils.waitForView(withId(R.id.send_button), 10000, 50);
|
||||||
@@ -121,16 +129,32 @@ public class SharingTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests https://github.com/deltachat/interface/blob/master/user-testing/mailto-links.md#mailto-links:
|
* Tests
|
||||||
|
* https://github.com/deltachat/interface/blob/master/user-testing/mailto-links.md#mailto-links:
|
||||||
*
|
*
|
||||||
* <ul dir="auto">
|
* <ul dir="auto">
|
||||||
* <li><a href="mailto:abc@example.org">Just an email address</a> - should open a chat with <code>abc@example.org</code> (and maybe ask whether a chat should be created if it does not exist already)</li>
|
* <li><a href="mailto:abc@example.org">Just an email address</a> - should open a chat with
|
||||||
* <li><a href="mailto:abc@example.org?subject=testing%20mailto%20uris">email address with subject</a> - should open a chat with <code>abc@example.org</code> and fill <code>testing mailto uris</code>; as we created the chat in the previous step, it should not ask <code>Chat with …</code> but directly open the chat</li>
|
* <code>abc@example.org</code> (and maybe ask whether a chat should be created if it does
|
||||||
* <li><a href="mailto:abc@example.org?body=this%20is%20a%20test">email address with body</a> - should open a chat with <code>abc@example.org</code>, draft <code>this is a test</code></li>
|
* not exist already)
|
||||||
* <li><a href="mailto:abc@example.org?subject=testing%20mailto%20uris&body=this%20is%20a%20test">email address with subject and body</a> - should open a chat with <code>abc@example.org</code>, draft <code>testing mailto uris</code> <newline> <code>this is a test</code></li>
|
* <li><a href="mailto:abc@example.org?subject=testing%20mailto%20uris">email address with
|
||||||
* <li><a href="mailto:%20info@example.org">HTML encoding</a> - should open a chat with <code>info@example.org</code></li>
|
* subject</a> - should open a chat with <code>abc@example.org</code> and fill <code>
|
||||||
* <li><a href="mailto:simplebot@example.org?body=!web%20https%3A%2F%2Fduckduckgo.com%2Flite%3Fq%3Dduck%2520it">more HTML encoding</a> - should open a chat with <code>simplebot@example.org</code>, draft <code>!web https://duckduckgo.com/lite?q=duck%20it</code></li>
|
* testing mailto uris</code>; as we created the chat in the previous step, it should not
|
||||||
* <li><a href="mailto:?subject=bla&body=blub">no email, just subject&body</a> - this should let you choose a chat and create a draft <code>bla</code> <newline> <code>blub</code> there</li>
|
* ask <code>Chat with …</code> but directly open the chat
|
||||||
|
* <li><a href="mailto:abc@example.org?body=this%20is%20a%20test">email address with body</a> -
|
||||||
|
* should open a chat with <code>abc@example.org</code>, draft <code>this is a test</code>
|
||||||
|
* <li><a
|
||||||
|
* href="mailto:abc@example.org?subject=testing%20mailto%20uris&body=this%20is%20a%20test">email
|
||||||
|
* address with subject and body</a> - should open a chat with <code>abc@example.org</code>,
|
||||||
|
* draft <code>testing mailto uris</code> <newline> <code>this is a test</code>
|
||||||
|
* <li><a href="mailto:%20info@example.org">HTML encoding</a> - should open a chat with <code>
|
||||||
|
* info@example.org</code>
|
||||||
|
* <li><a
|
||||||
|
* href="mailto:simplebot@example.org?body=!web%20https%3A%2F%2Fduckduckgo.com%2Flite%3Fq%3Dduck%2520it">more
|
||||||
|
* HTML encoding</a> - should open a chat with <code>simplebot@example.org</code>, draft
|
||||||
|
* <code>!web https://duckduckgo.com/lite?q=duck%20it</code>
|
||||||
|
* <li><a href="mailto:?subject=bla&body=blub">no email, just subject&body</a> - this
|
||||||
|
* should let you choose a chat and create a draft <code>bla</code> <newline> <code>
|
||||||
|
* blub</code> there
|
||||||
* </ul>
|
* </ul>
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
@@ -140,7 +164,8 @@ public class SharingTest {
|
|||||||
|
|
||||||
openLink("mailto:abc@example.org?subject=testing%20mailto%20uris");
|
openLink("mailto:abc@example.org?subject=testing%20mailto%20uris");
|
||||||
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
||||||
onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("testing mailto uris")));
|
onView(withHint(R.string.chat_input_placeholder))
|
||||||
|
.check(matches(withText("testing mailto uris")));
|
||||||
|
|
||||||
openLink("mailto:abc@example.org?body=this%20is%20a%20test");
|
openLink("mailto:abc@example.org?body=this%20is%20a%20test");
|
||||||
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
||||||
@@ -148,17 +173,22 @@ public class SharingTest {
|
|||||||
|
|
||||||
openLink("mailto:abc@example.org?subject=testing%20mailto%20uris&body=this%20is%20a%20test");
|
openLink("mailto:abc@example.org?subject=testing%20mailto%20uris&body=this%20is%20a%20test");
|
||||||
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
||||||
onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("testing mailto uris\nthis is a test")));
|
onView(withHint(R.string.chat_input_placeholder))
|
||||||
|
.check(matches(withText("testing mailto uris\nthis is a test")));
|
||||||
|
|
||||||
openLink("mailto:%20abc@example.org");
|
openLink("mailto:%20abc@example.org");
|
||||||
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
||||||
|
|
||||||
openLink("mailto:abc@example.org?body=!web%20https%3A%2F%2Fduckduckgo.com%2Flite%3Fq%3Dduck%2520it");
|
openLink(
|
||||||
|
"mailto:abc@example.org?body=!web%20https%3A%2F%2Fduckduckgo.com%2Flite%3Fq%3Dduck%2520it");
|
||||||
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
||||||
onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("!web https://duckduckgo.com/lite?q=duck%20it")));
|
onView(withHint(R.string.chat_input_placeholder))
|
||||||
|
.check(matches(withText("!web https://duckduckgo.com/lite?q=duck%20it")));
|
||||||
|
|
||||||
openLink("mailto:?subject=bla&body=blub");
|
openLink("mailto:?subject=bla&body=blub");
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click()));
|
onView(withId(R.id.list))
|
||||||
|
.perform(
|
||||||
|
RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click()));
|
||||||
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
onView(withId(R.id.subtitle)).check(matches(withText("abc@example.org")));
|
||||||
onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("bla\nblub")));
|
onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("bla\nblub")));
|
||||||
}
|
}
|
||||||
@@ -170,49 +200,61 @@ public class SharingTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
* <ul dir="auto">
|
* <ul dir="auto">
|
||||||
* <li>Open Saved Messages chat (could be any other chat too)</li>
|
* <li>Open Saved Messages chat (could be any other chat too)
|
||||||
* <li>Go to another app and share some text to DC</li>
|
* <li>Go to another app and share some text to DC
|
||||||
* <li>In DC select Saved Messages. Edit the shared text if you like. <em>Don't</em> hit the Send button.</li>
|
* <li>In DC select Saved Messages. Edit the shared text if you like. <em>Don't</em> hit the
|
||||||
* <li>Leave DC</li>
|
* Send button.
|
||||||
* <li>Open DC again from the "Recent apps"</li>
|
* <li>Leave DC
|
||||||
* <li>Check that your draft is still there</li>
|
* <li>Open DC again from the "Recent apps"
|
||||||
|
* <li>Check that your draft is still there
|
||||||
* </ul>
|
* </ul>
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testOpenAgainFromRecents() {
|
public void testOpenAgainFromRecents() {
|
||||||
// Open a chat
|
// Open a chat
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click()));
|
onView(withId(R.id.list))
|
||||||
|
.perform(
|
||||||
|
RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click()));
|
||||||
|
|
||||||
// Share some text to DC
|
// Share some text to DC
|
||||||
Intent i = new Intent(Intent.ACTION_SEND);
|
Intent i = new Intent(Intent.ACTION_SEND);
|
||||||
i.putExtra(Intent.EXTRA_TEXT, "Veeery important draft");
|
i.putExtra(Intent.EXTRA_TEXT, "Veeery important draft");
|
||||||
i.setComponent(new ComponentName(getInstrumentation().getTargetContext().getApplicationContext(), ShareActivity.class));
|
i.setComponent(
|
||||||
|
new ComponentName(
|
||||||
|
getInstrumentation().getTargetContext().getApplicationContext(), ShareActivity.class));
|
||||||
activityRule.getScenario().onActivity(a -> a.startActivity(i));
|
activityRule.getScenario().onActivity(a -> a.startActivity(i));
|
||||||
|
|
||||||
// In DC, select the same chat you opened before
|
// In DC, select the same chat you opened before
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click()));
|
onView(withId(R.id.list))
|
||||||
|
.perform(
|
||||||
|
RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click()));
|
||||||
|
|
||||||
// Leave DC and go back to the previous activity
|
// Leave DC and go back to the previous activity
|
||||||
pressBack();
|
pressBack();
|
||||||
|
|
||||||
// Here, we can't exactly replicate the "steps to reproduce". Previously, the other activity
|
// Here, we can't exactly replicate the "steps to reproduce". Previously, the other activity
|
||||||
// stayed open in the background, but since it doesn't anymore, we need to open it again:
|
// stayed open in the background, but since it doesn't anymore, we need to open it again:
|
||||||
onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click()));
|
onView(withId(R.id.list))
|
||||||
|
.perform(
|
||||||
|
RecyclerViewActions.actionOnItem(hasDescendant(withText("abc@example.org")), click()));
|
||||||
|
|
||||||
// Check that the draft is still there
|
// Check that the draft is still there
|
||||||
// Util.sleep(2000); // Uncomment for debugging
|
// Util.sleep(2000); // Uncomment for debugging
|
||||||
onView(withHint(R.string.chat_input_placeholder)).check(matches(withText("Veeery important draft")));
|
onView(withHint(R.string.chat_input_placeholder))
|
||||||
|
.check(matches(withText("Veeery important draft")));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Regression test:
|
* Regression test:
|
||||||
*
|
*
|
||||||
* If you save your contacts's emails in the contacts app of the phone, there are buttons to call
|
* <p>If you save your contacts's emails in the contacts app of the phone, there are buttons to
|
||||||
* them and also to write an email to them.
|
* call them and also to write an email to them.
|
||||||
*
|
*
|
||||||
* If you click the email button, ArcaneChat opened but instead of opening a chat with that contact,
|
* <p>If you click the email button, Delta Chat opened but instead of opening a chat with that
|
||||||
* the chat list was show and "share with" was displayed at the top
|
* contact, the chat list was show and "share with" was displayed at the top
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testOpenChatFromContacts() {
|
public void testOpenChatFromContacts() {
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.b44t.messenger.uitests.online;
|
package com.b44t.messenger.uitests.online;
|
||||||
|
|
||||||
|
|
||||||
import static androidx.test.espresso.Espresso.onView;
|
import static androidx.test.espresso.Espresso.onView;
|
||||||
import static androidx.test.espresso.action.ViewActions.click;
|
import static androidx.test.espresso.action.ViewActions.click;
|
||||||
import static androidx.test.espresso.action.ViewActions.replaceText;
|
import static androidx.test.espresso.action.ViewActions.replaceText;
|
||||||
@@ -11,13 +10,10 @@ import static androidx.test.espresso.matcher.ViewMatchers.withHint;
|
|||||||
import static androidx.test.espresso.matcher.ViewMatchers.withText;
|
import static androidx.test.espresso.matcher.ViewMatchers.withText;
|
||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
import androidx.test.ext.junit.rules.ActivityScenarioRule;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import androidx.test.filters.LargeTest;
|
import androidx.test.filters.LargeTest;
|
||||||
|
|
||||||
import com.b44t.messenger.TestUtils;
|
import com.b44t.messenger.TestUtils;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -30,14 +26,16 @@ import org.thoughtcrime.securesms.WelcomeActivity;
|
|||||||
@LargeTest
|
@LargeTest
|
||||||
public class OnboardingTest {
|
public class OnboardingTest {
|
||||||
@Rule
|
@Rule
|
||||||
public ActivityScenarioRule<WelcomeActivity> activityRule = TestUtils.getOnlineActivityRule(WelcomeActivity.class);
|
public ActivityScenarioRule<WelcomeActivity> activityRule =
|
||||||
|
TestUtils.getOnlineActivityRule(WelcomeActivity.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAccountCreation() {
|
public void testAccountCreation() {
|
||||||
if (TextUtils.isEmpty(BuildConfig.TEST_ADDR) || TextUtils.isEmpty(BuildConfig.TEST_MAIL_PW)) {
|
if (TextUtils.isEmpty(BuildConfig.TEST_ADDR) || TextUtils.isEmpty(BuildConfig.TEST_MAIL_PW)) {
|
||||||
throw new RuntimeException("You need to set TEST_ADDR and TEST_MAIL_PW; " +
|
throw new RuntimeException(
|
||||||
"either in gradle.properties or via an environment variable. " +
|
"You need to set TEST_ADDR and TEST_MAIL_PW; "
|
||||||
"See README.md for more details.");
|
+ "either in gradle.properties or via an environment variable. "
|
||||||
|
+ "See README.md for more details.");
|
||||||
}
|
}
|
||||||
onView(withText(R.string.scan_invitation_code)).check(matches(isClickable()));
|
onView(withText(R.string.scan_invitation_code)).check(matches(isClickable()));
|
||||||
onView(withText(R.string.import_backup_title)).check(matches(isClickable()));
|
onView(withText(R.string.import_backup_title)).check(matches(isClickable()));
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="228"
|
||||||
|
android:viewportHeight="280">
|
||||||
|
<group
|
||||||
|
android:scaleX="0.35014287"
|
||||||
|
android:scaleY="0.43"
|
||||||
|
android:translateX="74.08372"
|
||||||
|
android:translateY="79.8">
|
||||||
|
<path
|
||||||
|
android:pathData="m10.03,234.14c0.3,-0.01 0.6,-0.02 0.9,-0.04 -0.07,-0.49 -0.14,-0.97 -0.2,-1.46 -0.15,-1.34 -0.26,-2.69 -0.25,-4.04 -0.02,-0.86 -0.05,-1.71 -0.07,-2.57 -0.09,-0.06 -0.18,-0.13 -0.27,-0.19 -0.02,-0.02 -0.04,-0.03 -0.07,-0.05zM44.87,232.95c11.71,-8.35 26.86,-14.79 46.21,-15.9 0,0 39.93,-0.27 47.91,-3.53 7.98,-3.26 68.68,-14.69 82.94,-98.43 14.26,-83.74 -1.06,-115.09 -1.06,-115.09 0,0 -21.14,55.68 -81.02,59.81 0,0 -14.5,1.03 -38.82,1.42 -24.32,0.39 -75.77,20.65 -90.55,85.62l-0.22,43.44c2.5,4.22 5.49,8.12 8.91,11.66 3.99,4.11 8.11,8.12 12.79,11.45 2.26,1.65 4.65,3.2 6.51,5.33 1.94,2.34 3.33,5 4.2,7.93 0.71,2.1 1.45,4.2 2.2,6.28z"
|
||||||
|
android:fillColor="@color/ic_launcher_background" />
|
||||||
|
<path
|
||||||
|
android:pathData="m217.97,45.86c-0.3,0.01 -0.6,0.02 -0.9,0.04 0.07,0.49 0.14,0.97 0.2,1.46 0.15,1.34 0.26,2.69 0.25,4.04 0.02,0.86 0.05,1.71 0.07,2.57 0.09,0.06 0.18,0.13 0.27,0.19 0.02,0.02 0.04,0.03 0.07,0.05zM183.13,47.05c-11.71,8.35 -26.86,14.79 -46.21,15.9 0,0 -39.93,0.27 -47.91,3.53 -7.98,3.26 -68.68,14.69 -82.94,98.43 -14.26,83.74 1.06,115.09 1.06,115.09 0,0 21.14,-55.68 81.02,-59.81 0,0 14.5,-1.03 38.82,-1.42 24.32,-0.39 75.77,-20.65 90.55,-85.62l0.22,-43.44c-2.5,-4.22 -5.49,-8.12 -8.91,-11.66 -3.99,-4.11 -8.11,-8.12 -12.79,-11.45 -2.26,-1.65 -4.65,-3.2 -6.51,-5.33 -1.94,-2.34 -3.33,-5 -4.2,-7.93 -0.71,-2.1 -1.45,-4.2 -2.2,-6.28z"
|
||||||
|
android:fillColor="@color/ic_launcher_background" />
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/white" />
|
||||||
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
</adaptive-icon>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/white" />
|
||||||
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
</adaptive-icon>
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
<uses-permission
|
||||||
|
android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||||
|
|
||||||
<application>
|
<application>
|
||||||
<service
|
<service
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package org.thoughtcrime.securesms.geolocation;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
/** Non-GMS, always uses the platform LocationManager. */
|
||||||
|
public final class LocationSourceFactory {
|
||||||
|
|
||||||
|
private static final String TAG = "LocationSourceFactory";
|
||||||
|
|
||||||
|
private LocationSourceFactory() {}
|
||||||
|
|
||||||
|
public static LocationSource create(Context context) {
|
||||||
|
Log.i(TAG, "Non-GMS build, Using platform LocationManager");
|
||||||
|
return new PlatformLocationSource();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package org.thoughtcrime.securesms.notifications;
|
package org.thoughtcrime.securesms.notifications;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -10,6 +9,11 @@ import androidx.annotation.Nullable;
|
|||||||
*/
|
*/
|
||||||
public class FcmReceiveService {
|
public class FcmReceiveService {
|
||||||
public static void register(Context context) {}
|
public static void register(Context context) {}
|
||||||
|
|
||||||
public static void waitForRegisterFinished() {}
|
public static void waitForRegisterFinished() {}
|
||||||
@Nullable public static String getToken() { return null; }
|
|
||||||
|
@Nullable
|
||||||
|
public static String getToken() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<!-- force compiling emojipicker on sdk<21 and firebase on sdk<19; runtime checks are required then -->
|
<meta-data
|
||||||
<uses-sdk tools:overrideLibrary="androidx.emoji2.emojipicker, com.google.firebase.messaging, com.google.android.gms.cloudmessaging"/>
|
android:name="firebase_analytics_collection_deactivated"
|
||||||
|
android:value="true" />
|
||||||
<meta-data android:name="firebase_analytics_collection_deactivated" android:value="true" />
|
<meta-data
|
||||||
<meta-data android:name="google_analytics_adid_collection_enabled" android:value="false" />
|
android:name="google_analytics_adid_collection_enabled"
|
||||||
<meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" />
|
android:value="false" />
|
||||||
|
<meta-data
|
||||||
|
android:name="firebase_messaging_auto_init_enabled"
|
||||||
|
android:value="false" />
|
||||||
|
|
||||||
<application>
|
<application>
|
||||||
<service
|
<service
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package org.thoughtcrime.securesms.geolocation;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.location.Location;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.util.Log;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import com.google.android.gms.location.FusedLocationProviderClient;
|
||||||
|
import com.google.android.gms.location.LocationCallback;
|
||||||
|
import com.google.android.gms.location.LocationRequest;
|
||||||
|
import com.google.android.gms.location.LocationResult;
|
||||||
|
import com.google.android.gms.location.LocationServices;
|
||||||
|
import com.google.android.gms.location.Priority;
|
||||||
|
|
||||||
|
public class GmsLocationSource implements LocationSource {
|
||||||
|
|
||||||
|
private static final String TAG = "GmsLocationSource";
|
||||||
|
private static final long UPDATE_INTERVAL_MS = 3_000;
|
||||||
|
private static final long FASTEST_INTERVAL_MS = 1_000;
|
||||||
|
|
||||||
|
private FusedLocationProviderClient client;
|
||||||
|
private LocationCallback locationCallback;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startUpdates(@NonNull Context context, @NonNull Callback callback) {
|
||||||
|
client = LocationServices.getFusedLocationProviderClient(context);
|
||||||
|
|
||||||
|
LocationRequest request =
|
||||||
|
new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, UPDATE_INTERVAL_MS)
|
||||||
|
.setMinUpdateIntervalMillis(FASTEST_INTERVAL_MS)
|
||||||
|
.setMinUpdateDistanceMeters(0)
|
||||||
|
.setWaitForAccurateLocation(false)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
locationCallback =
|
||||||
|
new LocationCallback() {
|
||||||
|
@Override
|
||||||
|
public void onLocationResult(@NonNull LocationResult result) {
|
||||||
|
Location loc = result.getLastLocation();
|
||||||
|
if (loc != null) {
|
||||||
|
callback.onLocationUpdate(loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
client.requestLocationUpdates(request, locationCallback, Looper.getMainLooper());
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
Log.e(TAG, "Missing location permission", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stopUpdates() {
|
||||||
|
if (client != null && locationCallback != null) {
|
||||||
|
client.removeLocationUpdates(locationCallback);
|
||||||
|
client = null;
|
||||||
|
locationCallback = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package org.thoughtcrime.securesms.geolocation;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
import com.google.android.gms.common.ConnectionResult;
|
||||||
|
import com.google.android.gms.common.GoogleApiAvailability;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefers FusedLocationProviderClient, falls back to platform LocationManager if Play Services are
|
||||||
|
* somehow unavailable.
|
||||||
|
*/
|
||||||
|
public final class LocationSourceFactory {
|
||||||
|
|
||||||
|
private static final String TAG = "LocationSourceFactory";
|
||||||
|
|
||||||
|
private LocationSourceFactory() {}
|
||||||
|
|
||||||
|
public static LocationSource create(Context context) {
|
||||||
|
if (isGmsAvailable(context)) {
|
||||||
|
Log.i(TAG, "Using FusedLocationProviderClient");
|
||||||
|
return new GmsLocationSource();
|
||||||
|
}
|
||||||
|
Log.i(TAG, "GMS unavailable, falling back to LocationManager");
|
||||||
|
return new PlatformLocationSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isGmsAvailable(Context context) {
|
||||||
|
try {
|
||||||
|
return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
|
||||||
|
== ConnectionResult.SUCCESS;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +1,23 @@
|
|||||||
package org.thoughtcrime.securesms.notifications;
|
package org.thoughtcrime.securesms.notifications;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.WorkerThread;
|
import androidx.annotation.WorkerThread;
|
||||||
|
|
||||||
import com.google.android.gms.tasks.Tasks;
|
import com.google.android.gms.tasks.Tasks;
|
||||||
import com.google.firebase.FirebaseApp;
|
import com.google.firebase.FirebaseApp;
|
||||||
import com.google.firebase.messaging.FirebaseMessaging;
|
import com.google.firebase.messaging.FirebaseMessaging;
|
||||||
import com.google.firebase.messaging.FirebaseMessagingService;
|
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||||
import com.google.firebase.messaging.RemoteMessage;
|
import com.google.firebase.messaging.RemoteMessage;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.ApplicationContext;
|
import org.thoughtcrime.securesms.ApplicationContext;
|
||||||
import org.thoughtcrime.securesms.BuildConfig;
|
import org.thoughtcrime.securesms.BuildConfig;
|
||||||
import org.thoughtcrime.securesms.service.FetchForegroundService;
|
import org.thoughtcrime.securesms.service.FetchForegroundService;
|
||||||
import org.thoughtcrime.securesms.util.Util;
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
|
|
||||||
public class FcmReceiveService extends FirebaseMessagingService {
|
public class FcmReceiveService extends FirebaseMessagingService {
|
||||||
private static final String TAG = FcmReceiveService.class.getSimpleName();
|
private static final String TAG = "FcmReceiveService";
|
||||||
private static final Object INIT_LOCK = new Object();
|
private static final Object INIT_LOCK = new Object();
|
||||||
private static boolean initialized;
|
private static boolean initialized;
|
||||||
private static volatile boolean triedRegistering;
|
private static volatile boolean triedRegistering;
|
||||||
@@ -35,7 +31,8 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Util.runOnAnyBackgroundThread(() -> {
|
Util.runOnAnyBackgroundThread(
|
||||||
|
() -> {
|
||||||
final String rawToken;
|
final String rawToken;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -49,7 +46,8 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
|||||||
}
|
}
|
||||||
rawToken = Tasks.await(FirebaseMessaging.getInstance().getToken());
|
rawToken = Tasks.await(FirebaseMessaging.getInstance().getToken());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// we're here usually when FCM is not available and initializeApp() or getToken() failed.
|
// we're here usually when FCM is not available and initializeApp() or getToken()
|
||||||
|
// failed.
|
||||||
Log.w(TAG, "cannot get FCM token for " + BuildConfig.APPLICATION_ID + ": " + e);
|
Log.w(TAG, "cannot get FCM token for " + BuildConfig.APPLICATION_ID + ": " + e);
|
||||||
triedRegistering = true;
|
triedRegistering = true;
|
||||||
return;
|
return;
|
||||||
@@ -62,7 +60,7 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
|||||||
|
|
||||||
prefixedToken = addPrefix(rawToken);
|
prefixedToken = addPrefix(rawToken);
|
||||||
Log.i(TAG, "FCM token: " + prefixedToken);
|
Log.i(TAG, "FCM token: " + prefixedToken);
|
||||||
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
|
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
|
||||||
triedRegistering = true;
|
triedRegistering = true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -91,7 +89,20 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
|||||||
@Override
|
@Override
|
||||||
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||||
Log.i(TAG, "FCM push notification received");
|
Log.i(TAG, "FCM push notification received");
|
||||||
|
// Note: The system can downgrade the high priority messages to normal priority
|
||||||
|
// if the app is not using the high priority messages for surfacing time sensitive
|
||||||
|
// content to the user. If the message's priority is downgraded, your app cannot
|
||||||
|
// start a foreground service and attempting to start one results in a
|
||||||
|
// ForegroundServiceStartNotAllowedException.
|
||||||
|
// So, it's recommended to check the result of RemoteMessage.getPriority() and
|
||||||
|
// confirm it's PRIORITY_HIGH() before attempting to start a foreground service.
|
||||||
|
// source:
|
||||||
|
// https://developer.android.com/develop/background-work/services/fgs/restrictions-bg-start
|
||||||
|
if (remoteMessage.getPriority() == RemoteMessage.PRIORITY_HIGH) {
|
||||||
FetchForegroundService.start(this);
|
FetchForegroundService.start(this);
|
||||||
|
} else {
|
||||||
|
FetchForegroundService.fetchSynchronously();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -104,6 +115,6 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
|||||||
public void onNewToken(@NonNull String rawToken) {
|
public void onNewToken(@NonNull String rawToken) {
|
||||||
prefixedToken = addPrefix(rawToken);
|
prefixedToken = addPrefix(rawToken);
|
||||||
Log.i(TAG, "new FCM token: " + prefixedToken);
|
Log.i(TAG, "new FCM token: " + prefixedToken);
|
||||||
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
|
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,55 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
<uses-feature
|
||||||
<uses-feature android:name="android.hardware.bluetooth" android:required="false" />
|
android:name="android.hardware.camera"
|
||||||
<uses-feature android:name="android.hardware.location" android:required="false"/>
|
android:required="false" />
|
||||||
<uses-feature android:name="android.hardware.location.network" android:required="false"/>
|
<uses-feature
|
||||||
<uses-feature android:name="android.hardware.location.gps" android:required="false"/>
|
android:name="android.hardware.bluetooth"
|
||||||
<uses-feature android:name="android.hardware.microphone" android:required="false"/>
|
android:required="false" />
|
||||||
<uses-feature android:name="android.hardware.wifi" android:required="false"/>
|
<uses-feature
|
||||||
<uses-feature android:name="android.hardware.portrait" android:required="false"/>
|
android:name="android.hardware.location"
|
||||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
|
android:required="false" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.location.network"
|
||||||
|
android:required="false" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.location.gps"
|
||||||
|
android:required="false" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.microphone"
|
||||||
|
android:required="false" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.wifi"
|
||||||
|
android:required="false" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.portrait"
|
||||||
|
android:required="false" />
|
||||||
|
<uses-feature
|
||||||
|
android:name="android.hardware.touchscreen"
|
||||||
|
android:required="false" />
|
||||||
|
|
||||||
<!-- dangerous permissions - we need to as the user with a PermissionsRequest -->
|
<!-- dangerous permissions - we need to as the user with a PermissionsRequest -->
|
||||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
<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_MEDIA_VIDEO" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
|
<uses-permission
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
|
android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="32" />
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="29" />
|
||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.BLUETOOTH"
|
||||||
|
android:maxSdkVersion="30" />
|
||||||
|
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
||||||
|
|
||||||
<!-- normal/instant permissions - adding them here is enough -->
|
<!-- normal/instant permissions - adding them here is enough -->
|
||||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||||
@@ -34,42 +62,47 @@
|
|||||||
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
|
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY" />
|
<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY" />
|
||||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
<uses-permission
|
||||||
|
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
||||||
|
<uses-permission
|
||||||
|
android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
|
||||||
|
|
||||||
<!-- force compiling emojipicker on sdk<21; runtime checks are required then -->
|
<!-- force compiling libs on older sdk than supported; runtime checks are required -->
|
||||||
<uses-sdk tools:overrideLibrary="androidx.emoji2.emojipicker"/>
|
<uses-sdk tools:overrideLibrary="androidx.core.telecom,im.conversations.webrtc" />
|
||||||
|
|
||||||
<application android:name=".ApplicationContext"
|
<application
|
||||||
|
android:name=".ApplicationContext"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
tools:replace="android:allowBackup"
|
|
||||||
android:allowBackup="false"
|
android:allowBackup="false"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:largeHeap="true"
|
android:largeHeap="true"
|
||||||
tools:ignore="GoogleAppIndexingWarning"
|
tools:ignore="GoogleAppIndexingWarning"
|
||||||
android:requestLegacyExternalStorage="true"
|
android:requestLegacyExternalStorage="true"
|
||||||
tools:targetApi="TIRAMISU"
|
tools:targetApi="TIRAMISU"
|
||||||
android:hasFragileUserData="true"
|
android:hasFragileUserData="true">
|
||||||
android:enableOnBackInvokedCallback="false"
|
|
||||||
>
|
|
||||||
|
|
||||||
<!-- android car support, see https://developer.android.com/training/auto/start/,
|
<!-- android car support, see https://developer.android.com/training/auto/start/, as this potentially
|
||||||
as this potentially blocks releases on gplay due to extra-checks,
|
blocks releases on gplay due to extra-checks, we disable this during the first gplay releases -->
|
||||||
we disable this during the first gplay releases -->
|
<!-- <meta-data android:name="com.google.android.gms.car.application" android:resource="@xml/automotive_app_desc"
|
||||||
<!--
|
/> -->
|
||||||
<meta-data android:name="com.google.android.gms.car.application"
|
|
||||||
android:resource="@xml/automotive_app_desc" />
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Opt out of metrics collection: https://developer.android.com/develop/ui/views/layout/webapps/managing-webview#metrics -->
|
<!-- Opt out of metrics collection: https://developer.android.com/develop/ui/views/layout/webapps/managing-webview#metrics -->
|
||||||
<meta-data android:name="android.webkit.WebView.MetricsOptOut"
|
<meta-data
|
||||||
|
android:name="android.webkit.WebView.MetricsOptOut"
|
||||||
android:value="true" />
|
android:value="true" />
|
||||||
|
|
||||||
<activity android:name=".ShareActivity"
|
<activity
|
||||||
|
android:name=".ShareActivity"
|
||||||
android:theme="@android:style/Theme.Translucent.NoTitleBar"
|
android:theme="@android:style/Theme.Translucent.NoTitleBar"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
@@ -93,6 +126,7 @@
|
|||||||
<intent-filter>
|
<intent-filter>
|
||||||
<data android:scheme="mailto" />
|
<data android:scheme="mailto" />
|
||||||
<action android:name="android.intent.action.SENDTO" />
|
<action android:name="android.intent.action.SENDTO" />
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@@ -114,14 +148,16 @@
|
|||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".ConversationListActivity"
|
<activity
|
||||||
|
android:name=".ConversationListActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:theme="@style/TextSecure.Splash"
|
android:theme="@style/TextSecure.Splash"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
||||||
android:exported="true" />
|
android:exported="true" />
|
||||||
|
|
||||||
<activity-alias android:name=".RoutingActivity"
|
<activity-alias
|
||||||
|
android:name=".RoutingActivity"
|
||||||
android:targetActivity=".ConversationListActivity"
|
android:targetActivity=".ConversationListActivity"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
|
|
||||||
@@ -137,13 +173,17 @@
|
|||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
|
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
|
||||||
<data android:scheme="openpgp4fpr" />
|
<data android:scheme="openpgp4fpr" />
|
||||||
<data android:scheme="OPENPGP4FPR"
|
<data
|
||||||
|
android:scheme="OPENPGP4FPR"
|
||||||
tools:ignore="AppLinkUrlError" />
|
tools:ignore="AppLinkUrlError" />
|
||||||
<data android:scheme="OpenPGP4FPR"
|
<data
|
||||||
|
android:scheme="OpenPGP4FPR"
|
||||||
tools:ignore="AppLinkUrlError" />
|
tools:ignore="AppLinkUrlError" />
|
||||||
<data android:scheme="OpenPGP4Fpr"
|
<data
|
||||||
|
android:scheme="OpenPGP4Fpr"
|
||||||
tools:ignore="AppLinkUrlError" />
|
tools:ignore="AppLinkUrlError" />
|
||||||
<data android:scheme="OpenPGP4fpr"
|
<data
|
||||||
|
android:scheme="OpenPGP4fpr"
|
||||||
tools:ignore="AppLinkUrlError" />
|
tools:ignore="AppLinkUrlError" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
@@ -151,13 +191,16 @@
|
|||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
<data android:scheme="https"
|
<data
|
||||||
|
android:scheme="https"
|
||||||
android:host="i.delta.chat" />
|
android:host="i.delta.chat" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<meta-data android:name="com.sec.minimode.icon.portrait.normal"
|
<meta-data
|
||||||
|
android:name="com.sec.minimode.icon.portrait.normal"
|
||||||
android:resource="@mipmap/ic_launcher" />
|
android:resource="@mipmap/ic_launcher" />
|
||||||
<meta-data android:name="com.sec.minimode.icon.landscape.normal"
|
<meta-data
|
||||||
|
android:name="com.sec.minimode.icon.landscape.normal"
|
||||||
android:resource="@mipmap/ic_launcher" />
|
android:resource="@mipmap/ic_launcher" />
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.app.shortcuts"
|
android:name="android.app.shortcuts"
|
||||||
@@ -165,7 +208,8 @@
|
|||||||
|
|
||||||
</activity-alias>
|
</activity-alias>
|
||||||
|
|
||||||
<activity android:name=".ConversationListArchiveActivity"
|
<activity
|
||||||
|
android:name=".ConversationListArchiveActivity"
|
||||||
android:label="@string/chat_archived_label"
|
android:label="@string/chat_archived_label"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
||||||
@@ -175,76 +219,74 @@
|
|||||||
android:value="org.thoughtcrime.securesms.ConversationListActivity" />
|
android:value="org.thoughtcrime.securesms.ConversationListActivity" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".ConversationListRelayingActivity"
|
<activity
|
||||||
|
android:name=".ConversationListRelayingActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:theme="@style/TextSecure.LightNoActionBar"
|
android:theme="@style/TextSecure.LightNoActionBar"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".ConversationActivity"
|
<activity
|
||||||
|
android:name=".ConversationActivity"
|
||||||
android:windowSoftInputMode="stateUnchanged"
|
android:windowSoftInputMode="stateUnchanged"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:relinquishTaskIdentity="true"
|
android:relinquishTaskIdentity="true"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
||||||
android:parentActivityName=".ConversationListActivity">
|
android:parentActivityName=".ConversationListActivity">
|
||||||
<!--
|
<!-- Without relinquishTaskIdentity="true", we would have the following bug: - Directly open
|
||||||
Without relinquishTaskIdentity="true", we would have the following bug:
|
a chat via shortcut (by long-pressing on the DeltaChat icon in the launcher) - Press back twice - Reopen
|
||||||
- Directly open a chat via shortcut (by long-pressing on the DeltaChat icon in the launcher)
|
DeltaChat from recent apps - Expected: ConversationList shown. Actual: The chat from the beginning is
|
||||||
- Press back twice
|
shown again. -->
|
||||||
- Reopen DeltaChat from recent apps
|
|
||||||
- Expected: ConversationList shown. Actual: The chat from the beginning is shown again.
|
|
||||||
-->
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
android:value="org.thoughtcrime.securesms.ConversationListActivity" />
|
android:value="org.thoughtcrime.securesms.ConversationListActivity" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".GroupCreateActivity"
|
<activity
|
||||||
|
android:name=".GroupCreateActivity"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".contacts.NewContactActivity"
|
<activity
|
||||||
|
android:name=".contacts.NewContactActivity"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".NewConversationActivity"
|
<activity
|
||||||
|
android:name=".NewConversationActivity"
|
||||||
android:theme="@style/TextSecure.LightNoActionBar"
|
android:theme="@style/TextSecure.LightNoActionBar"
|
||||||
android:windowSoftInputMode="stateHidden"
|
android:windowSoftInputMode="stateHidden"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||||
android:exported="true">
|
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<data android:scheme="mailto"/>
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".ContactMultiSelectionActivity"
|
<activity
|
||||||
|
android:name=".ContactMultiSelectionActivity"
|
||||||
android:label="@string/contacts_title"
|
android:label="@string/contacts_title"
|
||||||
android:windowSoftInputMode="stateHidden"
|
android:windowSoftInputMode="stateHidden"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".ApplicationPreferencesActivity"
|
<activity
|
||||||
|
android:name=".ApplicationPreferencesActivity"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".WelcomeActivity"
|
<activity
|
||||||
android:launchMode="singleTask"
|
android:name=".WelcomeActivity"
|
||||||
|
android:launchMode="singleTop"
|
||||||
android:theme="@style/TextSecure.LightNoActionBar"
|
android:theme="@style/TextSecure.LightNoActionBar"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".relay.EditRelayActivity"
|
<activity
|
||||||
|
android:name=".relay.EditRelayActivity"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:windowSoftInputMode="stateUnchanged"
|
android:windowSoftInputMode="stateUnchanged"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||||
android:exported="true">
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".relay.RelayListActivity"
|
<activity
|
||||||
|
android:name=".relay.RelayListActivity"
|
||||||
android:windowSoftInputMode="stateHidden"
|
android:windowSoftInputMode="stateHidden"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".proxy.ProxySettingsActivity"
|
<activity
|
||||||
|
android:name=".proxy.ProxySettingsActivity"
|
||||||
android:label="@string/proxy_settings"
|
android:label="@string/proxy_settings"
|
||||||
android:windowSoftInputMode="stateHidden"
|
android:windowSoftInputMode="stateHidden"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
@@ -257,33 +299,42 @@
|
|||||||
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
|
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
|
||||||
<data android:scheme="ss" />
|
<data android:scheme="ss" />
|
||||||
<data android:scheme="socks5" />
|
<data android:scheme="socks5" />
|
||||||
<data android:scheme="SOCKS5" tools:ignore="AppLinkUrlError" />
|
<data
|
||||||
<data android:scheme="SS" tools:ignore="AppLinkUrlError" />
|
android:scheme="SOCKS5"
|
||||||
|
tools:ignore="AppLinkUrlError" />
|
||||||
|
<data
|
||||||
|
android:scheme="SS"
|
||||||
|
tools:ignore="AppLinkUrlError" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<activity android:name=".LogViewActivity"
|
<activity
|
||||||
|
android:name=".LogViewActivity"
|
||||||
android:label="@string/pref_log_header"
|
android:label="@string/pref_log_header"
|
||||||
android:windowSoftInputMode="stateHidden"
|
android:windowSoftInputMode="stateHidden"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".MediaPreviewActivity"
|
<activity
|
||||||
|
android:name=".MediaPreviewActivity"
|
||||||
android:label="@string/media_preview"
|
android:label="@string/media_preview"
|
||||||
android:windowSoftInputMode="stateHidden"
|
android:windowSoftInputMode="stateHidden"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".ProfileActivity"
|
<activity
|
||||||
|
android:name=".ProfileActivity"
|
||||||
android:theme="@style/TextSecure.LightNoActionBar"
|
android:theme="@style/TextSecure.LightNoActionBar"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".AllMediaActivity"
|
<activity
|
||||||
|
android:name=".AllMediaActivity"
|
||||||
android:theme="@style/TextSecure.LightNoActionBar"
|
android:theme="@style/TextSecure.LightNoActionBar"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".DummyActivity"
|
<activity
|
||||||
|
android:name=".DummyActivity"
|
||||||
android:theme="@android:style/Theme.NoDisplay"
|
android:theme="@android:style/Theme.NoDisplay"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:allowTaskReparenting="true"
|
android:allowTaskReparenting="true"
|
||||||
@@ -294,24 +345,29 @@
|
|||||||
android:clearTaskOnLaunch="true"
|
android:clearTaskOnLaunch="true"
|
||||||
android:finishOnTaskLaunch="true" />
|
android:finishOnTaskLaunch="true" />
|
||||||
|
|
||||||
<activity android:name=".AttachContactActivity"
|
<activity
|
||||||
|
android:name=".AttachContactActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".BlockedContactsActivity"
|
<activity
|
||||||
|
android:name=".BlockedContactsActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".scribbles.ScribbleActivity"
|
<activity
|
||||||
|
android:name=".scribbles.ScribbleActivity"
|
||||||
android:theme="@style/TextSecure.ScribbleTheme"
|
android:theme="@style/TextSecure.ScribbleTheme"
|
||||||
android:windowSoftInputMode="stateHidden"
|
android:windowSoftInputMode="stateHidden"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".scribbles.StickerSelectActivity"
|
<activity
|
||||||
|
android:name=".scribbles.StickerSelectActivity"
|
||||||
android:theme="@style/TextSecure.ScribbleTheme"
|
android:theme="@style/TextSecure.ScribbleTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".InstantOnboardingActivity"
|
<activity
|
||||||
|
android:name=".InstantOnboardingActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:windowSoftInputMode="stateHidden|adjustResize"
|
android:windowSoftInputMode="stateHidden|adjustResize"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
||||||
@@ -321,80 +377,94 @@
|
|||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
|
<!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
|
||||||
<data android:scheme="DCACCOUNT"
|
<data
|
||||||
|
android:scheme="DCACCOUNT"
|
||||||
tools:ignore="AppLinkUrlError" />
|
tools:ignore="AppLinkUrlError" />
|
||||||
<data android:scheme="dcaccount"
|
<data
|
||||||
|
android:scheme="dcaccount"
|
||||||
tools:ignore="AppLinkUrlError" />
|
tools:ignore="AppLinkUrlError" />
|
||||||
<data android:scheme="DCLOGIN"
|
<data
|
||||||
|
android:scheme="DCLOGIN"
|
||||||
tools:ignore="AppLinkUrlError" />
|
tools:ignore="AppLinkUrlError" />
|
||||||
<data android:scheme="dclogin"
|
<data
|
||||||
|
android:scheme="dclogin"
|
||||||
tools:ignore="AppLinkUrlError" />
|
tools:ignore="AppLinkUrlError" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".CreateProfileActivity"
|
<activity
|
||||||
|
android:name=".CreateProfileActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:windowSoftInputMode="stateHidden|adjustResize"
|
android:windowSoftInputMode="stateHidden|adjustResize"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".qr.QrActivity"
|
<activity
|
||||||
|
android:name=".qr.QrActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".qr.QrShowActivity"
|
<activity
|
||||||
|
android:name=".qr.QrShowActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".qr.RegistrationQrActivity"
|
<activity
|
||||||
|
android:name=".qr.RegistrationQrActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".qr.BackupTransferActivity"
|
<activity
|
||||||
|
android:name=".qr.BackupTransferActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".preferences.ChatBackgroundActivity"
|
<activity
|
||||||
|
android:name=".preferences.ChatBackgroundActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize" />
|
||||||
|
|
||||||
<activity android:name=".LocalHelpActivity"
|
<activity
|
||||||
|
android:name=".LocalHelpActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".calls.CallActivity"
|
<activity
|
||||||
android:label=""
|
android:name=".calls.CallActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
|
android:launchMode="singleTask"
|
||||||
android:exported="true">
|
android:taskAffinity=".calls.PipCallTask"
|
||||||
|
android:theme="@style/Theme.App.NoActionBar.Fullscreen"
|
||||||
|
android:exported="false"
|
||||||
|
android:supportsPictureInPicture="true"
|
||||||
|
android:excludeFromRecents="true">
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".WebxdcActivity"
|
<activity
|
||||||
|
android:name=".WebxdcActivity"
|
||||||
android:label=""
|
android:label=""
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
|
|
||||||
android:exported="true">
|
|
||||||
</activity>
|
|
||||||
|
|
||||||
<activity android:name=".WebxdcStoreActivity"
|
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode">
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode">
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".FullMsgActivity"
|
<activity
|
||||||
|
android:name=".WebxdcStoreActivity"
|
||||||
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode">
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".FullMsgActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".ConnectivityActivity"
|
<activity
|
||||||
|
android:name=".ConnectivityActivity"
|
||||||
android:theme="@style/TextSecure.LightTheme"
|
android:theme="@style/TextSecure.LightTheme"
|
||||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<service
|
|
||||||
android:name=".geolocation.LocationBackgroundService"
|
|
||||||
android:foregroundServiceType="location" />
|
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".service.GenericForegroundService"
|
android:name=".service.GenericForegroundService"
|
||||||
android:foregroundServiceType="dataSync" />
|
android:foregroundServiceType="dataSync" />
|
||||||
@@ -403,7 +473,33 @@
|
|||||||
android:name=".service.FetchForegroundService"
|
android:name=".service.FetchForegroundService"
|
||||||
android:foregroundServiceType="dataSync" />
|
android:foregroundServiceType="dataSync" />
|
||||||
|
|
||||||
<receiver android:name=".notifications.MarkReadReceiver"
|
<service
|
||||||
|
android:name=".geolocation.LocationStreamingService"
|
||||||
|
android:foregroundServiceType="location"
|
||||||
|
android:exported="false" />
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".service.AudioPlaybackService"
|
||||||
|
android:foregroundServiceType="mediaPlayback"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="androidx.media3.session.MediaSessionService" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".calls.CallService"
|
||||||
|
android:enabled="true"
|
||||||
|
android:exported="false"
|
||||||
|
android:foregroundServiceType="camera|microphone|phoneCall" />
|
||||||
|
|
||||||
|
<receiver
|
||||||
|
android:name=".calls.CallActionReceiver"
|
||||||
|
android:enabled="true"
|
||||||
|
android:exported="false" />
|
||||||
|
|
||||||
|
<receiver
|
||||||
|
android:name=".notifications.MarkReadReceiver"
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="false">
|
android:exported="false">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@@ -412,15 +508,8 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<receiver android:name=".notifications.DeclineCallReceiver"
|
<receiver
|
||||||
android:enabled="true"
|
android:name=".notifications.RemoteReplyReceiver"
|
||||||
android:exported="false">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="org.thoughtcrime.securesms.notifications.DECLINE_CALL_NOTICED"/>
|
|
||||||
</intent-filter>
|
|
||||||
</receiver>
|
|
||||||
|
|
||||||
<receiver android:name=".notifications.RemoteReplyReceiver"
|
|
||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="false">
|
android:exported="false">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@@ -428,20 +517,19 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<provider android:name="androidx.core.content.FileProvider"
|
<provider
|
||||||
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.fileprovider"
|
android:authorities="${applicationId}.fileprovider"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:grantUriPermissions="true">
|
android:grantUriPermissions="true">
|
||||||
|
|
||||||
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_provider_paths" />
|
<meta-data
|
||||||
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||||
|
android:resource="@xml/file_provider_paths" />
|
||||||
|
|
||||||
<!--
|
<!-- tell SafeContentResolver to allow incoming share-file Intent pointing to files from
|
||||||
tell SafeContentResolver to allow incoming share-file Intent pointing to files from
|
this content resolver, it could be the user sharing the app's log file to a chat. See: https://github.com/deltachat/deltachat-android/pull/3052
|
||||||
this content resolver, it could be the user sharing the app's log file to a chat.
|
https://github.com/deltachat/deltachat-android/pull/3031 -->
|
||||||
See:
|
|
||||||
https://github.com/deltachat/deltachat-android/pull/3052
|
|
||||||
https://github.com/deltachat/deltachat-android/pull/3031
|
|
||||||
-->
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="de.cketti.safecontentresolver.ALLOW_INTERNAL_ACCESS"
|
android:name="de.cketti.safecontentresolver.ALLOW_INTERNAL_ACCESS"
|
||||||
android:value="true" />
|
android:value="true" />
|
||||||
@@ -454,18 +542,16 @@
|
|||||||
android:grantUriPermissions="true"
|
android:grantUriPermissions="true"
|
||||||
android:exported="false">
|
android:exported="false">
|
||||||
|
|
||||||
<!--
|
<!-- tell SafeContentResolver to allow incoming share-file Intent pointing to files from
|
||||||
tell SafeContentResolver to allow incoming share-file Intent pointing to files from
|
this content resolver, it could be the user sharing a file from one chat to another. See: https://github.com/deltachat/deltachat-android/pull/3031 -->
|
||||||
this content resolver, it could be the user sharing a file from one chat to another.
|
|
||||||
See: https://github.com/deltachat/deltachat-android/pull/3031
|
|
||||||
-->
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="de.cketti.safecontentresolver.ALLOW_INTERNAL_ACCESS"
|
android:name="de.cketti.safecontentresolver.ALLOW_INTERNAL_ACCESS"
|
||||||
android:value="true" />
|
android:value="true" />
|
||||||
|
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
<receiver android:name=".service.BootReceiver"
|
<receiver
|
||||||
|
android:name=".service.BootReceiver"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
@@ -481,12 +567,24 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<uses-library android:name="com.sec.android.app.multiwindow" android:required="false"/>
|
<uses-library
|
||||||
<meta-data android:name="com.sec.android.support.multiwindow" android:value="true" />
|
android:name="com.sec.android.app.multiwindow"
|
||||||
<meta-data android:name="com.sec.android.multiwindow.DEFAULT_SIZE_W" android:value="632.0dip" />
|
android:required="false" />
|
||||||
<meta-data android:name="com.sec.android.multiwindow.DEFAULT_SIZE_H" android:value="598.0dip" />
|
<meta-data
|
||||||
<meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_W" android:value="632.0dip" />
|
android:name="com.sec.android.support.multiwindow"
|
||||||
<meta-data android:name="com.sec.android.multiwindow.MINIMUM_SIZE_H" android:value="598.0dip" />
|
android:value="true" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.sec.android.multiwindow.DEFAULT_SIZE_W"
|
||||||
|
android:value="632.0dip" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.sec.android.multiwindow.DEFAULT_SIZE_H"
|
||||||
|
android:value="598.0dip" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.sec.android.multiwindow.MINIMUM_SIZE_W"
|
||||||
|
android:value="632.0dip" />
|
||||||
|
<meta-data
|
||||||
|
android:name="com.sec.android.multiwindow.MINIMUM_SIZE_H"
|
||||||
|
android:value="598.0dip" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
<queries>
|
<queries>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
||||||
<li><a href="#podporuje-delta-chat-obrázky-videa-a-jiné-přílohy">Podporuje Delta Chat obrázky, videa a jiné přílohy?</a></li>
|
|
||||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||||
<li><a href="#kdo-uvidí-můj-profilový-obrázek">Kdo uvidí můj profilový obrázek?</a></li>
|
<li><a href="#kdo-uvidí-můj-profilový-obrázek">Kdo uvidí můj profilový obrázek?</a></li>
|
||||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
||||||
@@ -14,8 +13,9 @@
|
|||||||
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
||||||
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
|
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
|
||||||
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
||||||
|
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
||||||
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
|
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
|
||||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -26,6 +26,22 @@
|
|||||||
<li><a href="#kdyź-se-nedopatřením-odstraníš">Kdyź se nedopatřením odstraníš.</a></li>
|
<li><a href="#kdyź-se-nedopatřením-odstraníš">Kdyź se nedopatřením odstraníš.</a></li>
|
||||||
<li><a href="#nechci-již-přijímat-zprávy-ze-skupiny">Nechci již přijímat zprávy ze skupiny.</a></li>
|
<li><a href="#nechci-již-přijímat-zprávy-ze-skupiny">Nechci již přijímat zprávy ze skupiny.</a></li>
|
||||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
||||||
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
@@ -54,11 +70,12 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#advanced">Advanced</a>
|
<li><a href="#advanced">Advanced</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#experimental-features">Experimental Features</a></li>
|
<li><a href="#experiments">Experimental Features</a></li>
|
||||||
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
<li><a href="#relays">What are Relays?</a></li>
|
||||||
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
||||||
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
||||||
|
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
||||||
<li><a href="#mám-zájem-o-technické-podrobnosti-kde-najdu-víc">Mám zájem o technické podrobnosti. Kde najdu víc?</a></li>
|
<li><a href="#mám-zájem-o-technické-podrobnosti-kde-najdu-víc">Mám zájem o technické podrobnosti. Kde najdu víc?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -75,6 +92,7 @@
|
|||||||
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
||||||
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
||||||
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
||||||
|
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
|
||||||
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
||||||
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
||||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
||||||
@@ -184,7 +202,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
|
|||||||
<p>As being a private messenger,
|
<p>As being a private messenger,
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
|
<p>Your friends may share your contact with other friends,
|
||||||
|
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -214,24 +233,6 @@ You can also add a little introduction message.</p>
|
|||||||
<p>The second contact will receive a <strong>card</strong> then
|
<p>The second contact will receive a <strong>card</strong> then
|
||||||
and can tap it to start chatting with the first contact.</p>
|
and can tap it to start chatting with the first contact.</p>
|
||||||
|
|
||||||
<h3 id="podporuje-delta-chat-obrázky-videa-a-jiné-přílohy">
|
|
||||||
|
|
||||||
|
|
||||||
Podporuje Delta Chat obrázky, videa a jiné přílohy? <a href="#podporuje-delta-chat-obrázky-videa-a-jiné-přílohy" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
|
|
||||||
@@ -261,14 +262,11 @@ or to <strong>Switch Profiles</strong>.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Profilový obrázek lze zvolit v nastavení. Když napíšeš svému kontaktu,
|
<p>Profilový obrázek lze zvolit v nastavení. Když napíšeš svému kontaktu,
|
||||||
nebo přidáš nový vyfocením QR kódu, tyto kontakty automaticky uvidí tvůj profilový obrázek.</p>
|
nebo přidáš nový vyfocením QR kódu, tyto kontakty automaticky uvidí tvůj profilový obrázek.</p>
|
||||||
</li>
|
|
||||||
<li>
|
<ul>
|
||||||
<p>Z důvodu soukromí nikdo nevidí tvůj profilový obrázek dokud jim nenapíšeš.</p>
|
<li>Z důvodu soukromí nikdo nevidí tvůj profilový obrázek dokud jim nenapíšeš.</li>
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
@@ -303,7 +301,8 @@ they will see it when they view your contact details.</p>
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
||||||
Archived chats remain accessible above the chat list or via search.</p>
|
They remain accessible above the chat list or via search
|
||||||
|
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
||||||
@@ -338,7 +337,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
|
|||||||
you can go back to the original message in the original chat</p>
|
you can go back to the original message in the original chat</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||||
@@ -375,23 +374,19 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
means that the message was sent successfully to your provider.</p>
|
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
mean that at least one recipient’s device
|
indicate your contact has read the message.</p>
|
||||||
reported back to having received the message.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Recipients may have disabled read-receipts,
|
|
||||||
so even if you see only one tick, the message may have been read.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>The other way round, two ticks do not automatically mean
|
|
||||||
that a human has read or understood the message ;)</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||||
|
|
||||||
|
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||||
|
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
|
|
||||||
@@ -419,6 +414,32 @@ Notifications are not sent and there is no time limit.</p>
|
|||||||
<p>Note, that the original message may still be received by chat members
|
<p>Note, that the original message may still be received by chat members
|
||||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||||
|
|
||||||
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
|
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
||||||
|
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>By default, compression ensures <strong>fast, efficient delivery</strong> that respects everyone’s data limits and storage.
|
||||||
|
This is ideal for everyday communication.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In regions with worse connectivity,
|
||||||
|
you can choose higher compression at <strong>Settings → Chats → Outgoing Media Quality</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you specifically need to send media in its <strong>original quality</strong>, use <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach → File</strong> in the chat.
|
||||||
|
Please use this method sparingly, as sending original files will significantly increase data usage for you and all recipients in the chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3 id="ephemeralmsgs">
|
<h3 id="ephemeralmsgs">
|
||||||
|
|
||||||
|
|
||||||
@@ -455,19 +476,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
<h3 id="delold">
|
<h3 id="delold">
|
||||||
|
|
||||||
|
|
||||||
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
|
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>If you want to save storage on your device, you can choose to delete old
|
||||||
<li>If you want to save storage on your device, you can choose to delete old
|
messages automatically.</p>
|
||||||
messages automatically.</li>
|
|
||||||
<li>To turn it on, go to “delete old messages from device” in the “Chats & Media”
|
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
|
||||||
settings. You can set a timeframe between “after an hour” and “after a year”;
|
You can set a timeframe between “after an hour” and “after a year”;
|
||||||
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
||||||
older than that.</li>
|
older than that.</p>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
@@ -515,9 +535,15 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Z menu v pravém horním rohu, nebo stiskem příslušného tlačítka na Androidu / iOS vyber <strong>Nový hovor</strong> a pak <strong>Nová skupina</strong>.</li>
|
<li>
|
||||||
<li>Na další obrazovce, vyber <strong>členy skupiny</strong> a zadej <strong>Název skupiny</strong>. Také můžeš vybrat <strong>obrázek skupiny</strong>.</li>
|
<p>Z menu v pravém horním rohu, nebo stiskem příslušného tlačítka na Androidu / iOS vyber <strong>Nový hovor</strong> a pak <strong>Nová skupina</strong>.</p>
|
||||||
<li>Jakmile do skupiny pošleš <strong>první zprávu</strong>, všichni členové budou vyrozuměni o nové skupině a mohou do ní také psát (dokud nepošleš první zprávu členové skupiny o ní nebudou vědět).</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Na další obrazovce, vyber <strong>členy skupiny</strong> a zadej <strong>Název skupiny</strong>. Také můžeš vybrat <strong>obrázek skupiny</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Jakmile do skupiny pošleš <strong>první zprávu</strong>, všichni členové budou vyrozuměni o nové skupině a mohou do ní také psát (dokud nepošleš první zprávu členové skupiny o ní nebudou vědět).</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
@@ -528,11 +554,10 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>All group members have the <strong>same rights</strong>.
|
<p>All group members have the <strong>same rights</strong>.
|
||||||
For this reason, everyone can delete any member or add new ones.</p>
|
For this reason, everyone can delete any member or add new ones.</p>
|
||||||
</li>
|
|
||||||
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -560,10 +585,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Když nejsi členem skupiny nelze se znovu připojit. Nicméně, není to velká potíž -
|
||||||
<li>Když nejsi členem skupiny nelze se znovu připojit. Nicméně, není to velká potíž -
|
požádej běžnou zprávou jiného člena skupiny o znovupřipojení.</p>
|
||||||
požádej běžnou zprávou jiného člena skupiny o znovupřipojení.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="nechci-již-přijímat-zprávy-ze-skupiny">
|
<h3 id="nechci-již-přijímat-zprávy-ze-skupiny">
|
||||||
|
|
||||||
@@ -574,15 +597,12 @@ požádej běžnou zprávou jiného člena skupiny o znovupřipojení.</li>
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Buď se odeber ze seznamu členů a nebo vymaž celý skupinový hovor.
|
||||||
<p>Buď se odeber ze seznamu členů a nebo vymaž celý skupinový hovor.
|
K opětovnému připojení v budoucnu požádej nějakého člena skupiny o znovupřidání.</li>
|
||||||
K opětovnému připojení v budoucnu požádej nějakého člena skupiny o znovupřidání.</p>
|
</ul>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Jiná možnost je “Umlčení” skupiny, což znamená nadále přijímat a také posílat zprávy,
|
<p>Jiná možnost je “Umlčení” skupiny, což znamená nadále přijímat a také posílat zprávy,
|
||||||
ale nebudeš dostávat upozrnění na nově příchozí zprávy.</p>
|
ale nebudeš dostávat upozrnění na nově příchozí zprávy.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="cloning-a-group">
|
<h3 id="cloning-a-group">
|
||||||
|
|
||||||
@@ -608,6 +628,212 @@ or right-click the group in the chat list (Desktop).</p>
|
|||||||
<p>The new group is <strong>fully independent</strong> from the original,
|
<p>The new group is <strong>fully independent</strong> from the original,
|
||||||
which continues to work as before.</p>
|
which continues to work as before.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||||
|
|
||||||
|
|
||||||
|
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>There is no strict technical limit,
|
||||||
|
but more than 150 is not recommended.</p>
|
||||||
|
|
||||||
|
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||||
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -896,7 +1122,7 @@ One device is not needed for the other to work.</p>
|
|||||||
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
|
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
|
<p>On <strong>Windows</strong>, go to “Control Panel / Network and Internet”
|
||||||
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
||||||
(after transfer, you can change back to the original value)</p>
|
(after transfer, you can change back to the original value)</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -948,23 +1174,22 @@ try the <strong>manual transfer</strong> described below</p>
|
|||||||
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
|
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>On the old device, go to “Settings -> Chats and media -> Export Backup”. Enter your
|
<li>
|
||||||
|
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
|
||||||
screen unlock PIN, pattern, or password. Then you can click on “Start
|
screen unlock PIN, pattern, or password. Then you can click on “Start
|
||||||
Backup”. This saves the backup file to your device. Now you have to transfer
|
Backup”. This saves the backup file to your device. Now you have to transfer
|
||||||
it to the other device somehow.</li>
|
it to the other device somehow.</p>
|
||||||
<li>On the new device, in the “I already have a profile” menu,
|
</li>
|
||||||
choose “restore from backup”. After import, your conversations, encryption
|
<li>
|
||||||
keys, and media should be copied to the new device.
|
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
|
||||||
<ul>
|
If you use iOS and encounter difficulties,
|
||||||
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
|
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
|
||||||
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
|
|
||||||
help you.</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
</li>
|
||||||
<li>You are now synchronized, and can use both devices for sending and receiving
|
|
||||||
end-to-end encrypted messages with your communication partners.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>You are now synchronized, and can use both devices for sending and receiving
|
||||||
|
end-to-end encrypted messages with your communication partners.</p>
|
||||||
|
|
||||||
<h3 id="je-v-plánu-vytvořit-webovou-verzi-delta-chatu">
|
<h3 id="je-v-plánu-vytvořit-webovou-verzi-delta-chatu">
|
||||||
|
|
||||||
|
|
||||||
@@ -991,10 +1216,10 @@ Všechny softwarové balíčky jsou na <a href="https://get.delta.chat">get.delt
|
|||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<h3 id="experimental-features">
|
<h3 id="experiments">
|
||||||
|
|
||||||
|
|
||||||
Experimental Features <a href="#experimental-features" class="anchor"></a>
|
Experimental Features <a href="#experiments" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1007,33 +1232,48 @@ you can try out features we are working on.</p>
|
|||||||
<p>You can find more information
|
<p>You can find more information
|
||||||
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="statssending">
|
<h3 id="relays">
|
||||||
|
|
||||||
|
|
||||||
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
What are Relays? <a href="#relays" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>We would like to improve Delta Chat with your help,
|
<p>Relays are used to temporarily hold messages in case your device is offline.
|
||||||
which is why Delta Chat for Android asks whether you want
|
Relays are cheap and dumb servers,
|
||||||
to send anonymous usage statistics.</p>
|
that do not store data as group states, your name or avatar -
|
||||||
|
all that exist only on your device.
|
||||||
|
Relays are operated by different groups and people.</p>
|
||||||
|
|
||||||
<p>You can turn it on and off at
|
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
|
||||||
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
so you do not need to care about that.
|
||||||
|
However, if you want to,
|
||||||
<p>When you turn it on,
|
you can configure relays at <strong>Settings → Advanced → Relays</strong>:</p>
|
||||||
weekly statistics will be automatically sent to a bot.</p>
|
|
||||||
|
|
||||||
<p>We are interested e.g. in statistics like:</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>How many contacts are introduced by personally scanning a QR code?</li>
|
<li>
|
||||||
<li>Which versions of Delta Chat are being used?</li>
|
<p>You can <strong>add</strong> a relay by scanning its QR code;
|
||||||
<li>How many messages are unencrypted?</li>
|
<a href="https://chatmail.at/relays">chatmail.at/relays</a> shows some known ones.
|
||||||
|
If you have multiple relays, you will receive messages on all of them.
|
||||||
|
Contacts learn your current relays automatically when you message them.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap on a relay to set it as <strong>used for sending</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you <strong>remove</strong> a relay,
|
||||||
|
contacts who only know this relay may not reach you until you message them again.
|
||||||
|
To stay reachable in the meantime, choose <strong>Hide from Contacts</strong> in the confirmation dialog
|
||||||
|
instead of removing it right away.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>To <strong>show</strong> a hidden relay again, tap on it.</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
<p>For more details and future possibilities of relays,
|
||||||
|
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
||||||
|
|
||||||
@@ -1100,6 +1340,40 @@ except if your users’ devices require Google/Apple <a href="#instant-delivery"
|
|||||||
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
||||||
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
||||||
|
|
||||||
|
<h3 id="statssending">
|
||||||
|
|
||||||
|
|
||||||
|
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>We would like to improve Delta Chat with your help,
|
||||||
|
which is why Delta Chat for Android asks whether you want
|
||||||
|
to send anonymous usage statistics.</p>
|
||||||
|
|
||||||
|
<p>You can turn it on and off at
|
||||||
|
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
||||||
|
|
||||||
|
<p>When you turn it on,
|
||||||
|
weekly statistics will be automatically sent to a bot.</p>
|
||||||
|
|
||||||
|
<p>We are interested e.g. in statistics like:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>How many contacts are introduced by personally scanning a QR code?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Which versions of Delta Chat are being used?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>What errors occur for users?</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
||||||
|
|
||||||
<h3 id="mám-zájem-o-technické-podrobnosti-kde-najdu-víc">
|
<h3 id="mám-zájem-o-technické-podrobnosti-kde-najdu-víc">
|
||||||
|
|
||||||
|
|
||||||
@@ -1108,9 +1382,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Dobrý začátek je <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</p>
|
||||||
<li>Dobrý začátek je <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="e2ee">
|
<h2 id="e2ee">
|
||||||
|
|
||||||
@@ -1139,6 +1411,10 @@ to exchange encryption setup information through QR-code scanning or “invite l
|
|||||||
<li>
|
<li>
|
||||||
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
||||||
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption and forward secrecy.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
||||||
@@ -1323,12 +1599,10 @@ Instead, all group metadata is end-to-end encrypted and stored on end-user devic
|
|||||||
<p>Servers can therefore only see:</p>
|
<p>Servers can therefore only see:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>the sender and receiver addresses</li>
|
<li>Sender and receiver addresses, randomly generated by default</li>
|
||||||
<li>and the message size.</li>
|
<li>Message size</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>By default, the addresses are randomly generated.</p>
|
|
||||||
|
|
||||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||||
|
|
||||||
<h3 id="device-seizure">
|
<h3 id="device-seizure">
|
||||||
@@ -1349,6 +1623,29 @@ with the knowledge that all their data, along with all metadata, will be deleted
|
|||||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||||
can not be identified easily.</p>
|
can not be identified easily.</p>
|
||||||
|
|
||||||
|
<h3 id="who-sees-my-ip-address">
|
||||||
|
|
||||||
|
|
||||||
|
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
|
Delta Chat neither persists nor exposes them.
|
||||||
|
Note that IP Addresses
|
||||||
|
are not like an address you give to a delivery service,
|
||||||
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
|
<p>If you see your IP Address as a risk,
|
||||||
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
@@ -1378,7 +1675,7 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||||
This means that if your private decryption key is leaked,
|
This means that if your private decryption key is leaked,
|
||||||
@@ -1389,12 +1686,9 @@ Otherwise, someone obtaining your decryption keys
|
|||||||
is typically also able to get all your non-deleted messages
|
is typically also able to get all your non-deleted messages
|
||||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||||
|
|
||||||
<p>We designed a Forward Secrecy approach that withstood
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
initial examination from some cryptographers and implementation experts
|
will provide reliable deletion (forward secrecy) through automatic key rotation.
|
||||||
but is pending a more formal write up
|
This approach is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
|
||||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
|
||||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
|
||||||
|
|
||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
@@ -1404,12 +1698,13 @@ which would make it available in all <a href="https://chatmail.at/clients">chatm
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
||||||
|
Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
in collaboration with other OpenPGP implementers.</p>
|
|
||||||
|
|
||||||
<h3 id="how-can-i-manually-check-encryption-information">
|
<h3 id="how-can-i-manually-check-encryption-information">
|
||||||
|
|
||||||
@@ -1486,7 +1781,7 @@ See <a href="https://delta.chat/en/2023-05-22-webxdc-security">here for the full
|
|||||||
<li>
|
<li>
|
||||||
<p>2023 March, <a href="https://cure53.de">Cure53</a> analyzed both the transport encryption of
|
<p>2023 March, <a href="https://cure53.de">Cure53</a> analyzed both the transport encryption of
|
||||||
Delta Chat’s network connections and a reproducible mail server setup as
|
Delta Chat’s network connections and a reproducible mail server setup as
|
||||||
<a href="https://delta.chat/cs/serverguide">recommended on this site</a>.
|
<a href="https://delta.chat/serverguide">recommended on this site</a>.
|
||||||
You can read more about the audit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">on our blog</a>
|
You can read more about the audit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">on our blog</a>
|
||||||
or read the <a href="https://delta.chat/assets/blog/MER-01-report.pdf">full report here</a>.</p>
|
or read the <a href="https://delta.chat/assets/blog/MER-01-report.pdf">full report here</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -1588,10 +1883,22 @@ ordered chronologically:</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||||
and implementation of verified groups and setup contact protocols
|
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
along with collaboration partners working on
|
||||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||||
|
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||||
|
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||||
|
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||||
|
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||||
@@ -1604,36 +1911,10 @@ release Delta/iOS versions, to convert our core library to Rust, and
|
|||||||
to provide new features for all platforms.</p>
|
to provide new features for all platforms.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
and implementation of verified groups and setup contact protocols
|
||||||
</li>
|
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||||
<li>
|
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
|
||||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
|
||||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
|
||||||
This funding supported our long-running goals to make Delta Chat more usable
|
|
||||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
|
||||||
in places often affected by internet censorship and shutdowns.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>2023-2024 we successfully completed the OTF-funded
|
|
||||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
|
||||||
allowing us to introduce guaranteed encryption,
|
|
||||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
|
||||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
|
||||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
|
||||||
along with collaboration partners working on
|
|
||||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
|
||||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
|
||||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Sometimes we receive one-time donations from private individuals.
|
<p>Sometimes we receive one-time donations from private individuals.
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
||||||
<li><a href="#does-delta-chat-support-images-videos-and-other-attachments">Does Delta Chat support images, videos and other attachments?</a></li>
|
|
||||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||||
<li><a href="#who-sees-my-profile-picture">Who sees my profile picture?</a></li>
|
<li><a href="#who-sees-my-profile-picture">Who sees my profile picture?</a></li>
|
||||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
||||||
@@ -14,8 +13,9 @@
|
|||||||
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
||||||
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
|
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
|
||||||
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
||||||
|
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
||||||
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
|
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
|
||||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -26,6 +26,22 @@
|
|||||||
<li><a href="#i-have-deleted-myself-by-accident">I have deleted myself by accident.</a></li>
|
<li><a href="#i-have-deleted-myself-by-accident">I have deleted myself by accident.</a></li>
|
||||||
<li><a href="#i-do-not-want-to-receive-the-messages-of-a-group-any-longer">I do not want to receive the messages of a group any longer.</a></li>
|
<li><a href="#i-do-not-want-to-receive-the-messages-of-a-group-any-longer">I do not want to receive the messages of a group any longer.</a></li>
|
||||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
||||||
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
@@ -54,7 +70,8 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#advanced">Advanced</a>
|
<li><a href="#advanced">Advanced</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#experimental-features">Experimental Features</a></li>
|
<li><a href="#experiments">Experimental Features</a></li>
|
||||||
|
<li><a href="#relays">What are Relays?</a></li>
|
||||||
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
||||||
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
||||||
@@ -75,6 +92,7 @@
|
|||||||
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
||||||
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
||||||
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
||||||
|
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
|
||||||
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
||||||
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
||||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
||||||
@@ -184,7 +202,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
|
|||||||
<p>As being a private messenger,
|
<p>As being a private messenger,
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
|
<p>Your friends may share your contact with other friends,
|
||||||
|
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -214,24 +233,6 @@ You can also add a little introduction message.</p>
|
|||||||
<p>The second contact will receive a <strong>card</strong> then
|
<p>The second contact will receive a <strong>card</strong> then
|
||||||
and can tap it to start chatting with the first contact.</p>
|
and can tap it to start chatting with the first contact.</p>
|
||||||
|
|
||||||
<h3 id="does-delta-chat-support-images-videos-and-other-attachments">
|
|
||||||
|
|
||||||
|
|
||||||
Does Delta Chat support images, videos and other attachments? <a href="#does-delta-chat-support-images-videos-and-other-attachments" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
|
|
||||||
@@ -261,16 +262,11 @@ or to <strong>Switch Profiles</strong>.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>You can add a profile picture in your settings. If you write to your contacts
|
<p>You can add a profile picture in your settings. If you write to your contacts
|
||||||
or add them via QR code, they automatically see it as your profile picture.</p>
|
or add them via QR code, they automatically see it as your profile picture.</p>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>For privacy reasons, no one sees your profile picture until you write a
|
<p>For privacy reasons, no one sees your profile picture until you write a
|
||||||
message to them.</p>
|
message to them.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
@@ -304,7 +300,8 @@ they will see it when they view your contact details.</p>
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
||||||
Archived chats remain accessible above the chat list or via search.</p>
|
They remain accessible above the chat list or via search
|
||||||
|
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
||||||
@@ -339,7 +336,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
|
|||||||
you can go back to the original message in the original chat</p>
|
you can go back to the original message in the original chat</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||||
@@ -376,23 +373,19 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
means that the message was sent successfully to your provider.</p>
|
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
mean that at least one recipient’s device
|
indicate your contact has read the message.</p>
|
||||||
reported back to having received the message.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Recipients may have disabled read-receipts,
|
|
||||||
so even if you see only one tick, the message may have been read.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>The other way round, two ticks do not automatically mean
|
|
||||||
that a human has read or understood the message ;)</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||||
|
|
||||||
|
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||||
|
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
|
|
||||||
@@ -420,6 +413,32 @@ Notifications are not sent and there is no time limit.</p>
|
|||||||
<p>Note, that the original message may still be received by chat members
|
<p>Note, that the original message may still be received by chat members
|
||||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||||
|
|
||||||
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
|
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
||||||
|
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>By default, compression ensures <strong>fast, efficient delivery</strong> that respects everyone’s data limits and storage.
|
||||||
|
This is ideal for everyday communication.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In regions with worse connectivity,
|
||||||
|
you can choose higher compression at <strong>Settings → Chats → Outgoing Media Quality</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you specifically need to send media in its <strong>original quality</strong>, use <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach → File</strong> in the chat.
|
||||||
|
Please use this method sparingly, as sending original files will significantly increase data usage for you and all recipients in the chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3 id="ephemeralmsgs">
|
<h3 id="ephemeralmsgs">
|
||||||
|
|
||||||
|
|
||||||
@@ -456,19 +475,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
<h3 id="delold">
|
<h3 id="delold">
|
||||||
|
|
||||||
|
|
||||||
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
|
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>If you want to save storage on your device, you can choose to delete old
|
||||||
<li>If you want to save storage on your device, you can choose to delete old
|
messages automatically.</p>
|
||||||
messages automatically.</li>
|
|
||||||
<li>To turn it on, go to “delete old messages from device” in the “Chats & Media”
|
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
|
||||||
settings. You can set a timeframe between “after an hour” and “after a year”;
|
You can set a timeframe between “after an hour” and “after a year”;
|
||||||
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
||||||
older than that.</li>
|
older than that.</p>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
@@ -516,9 +534,15 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Select <strong>New chat</strong> and then <strong>New group</strong> from the menu in the upper right corner or hit the corresponding button on Android/iOS.</li>
|
<li>
|
||||||
<li>On the following screen, select the <strong>group members</strong> and define a <strong>group name</strong>. You can also select a <strong>group avatar</strong>.</li>
|
<p>Select <strong>New chat</strong> and then <strong>New group</strong> from the menu in the upper right corner or hit the corresponding button on Android/iOS.</p>
|
||||||
<li>As soon as you write the <strong>first message</strong> in the group, all members are informed about the new group and can answer in the group (as long as you do not write a message in the group the group is invisible to the members).</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On the following screen, select the <strong>group members</strong> and define a <strong>group name</strong>. You can also select a <strong>group avatar</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>As soon as you write the <strong>first message</strong> in the group, all members are informed about the new group and can answer in the group (as long as you do not write a message in the group the group is invisible to the members).</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
@@ -529,11 +553,10 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>All group members have the <strong>same rights</strong>.
|
<p>All group members have the <strong>same rights</strong>.
|
||||||
For this reason, everyone can delete any member or add new ones.</p>
|
For this reason, everyone can delete any member or add new ones.</p>
|
||||||
</li>
|
|
||||||
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -561,10 +584,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>As you’re no longer a group member, you cannot add yourself again.
|
||||||
<li>As you’re no longer a group member, you cannot add yourself again.
|
However, no problem, just ask any other group member in a normal chat to re-add you.</p>
|
||||||
However, no problem, just ask any other group member in a normal chat to re-add you.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="i-do-not-want-to-receive-the-messages-of-a-group-any-longer">
|
<h3 id="i-do-not-want-to-receive-the-messages-of-a-group-any-longer">
|
||||||
|
|
||||||
@@ -575,15 +596,12 @@ However, no problem, just ask any other group member in a normal chat to re-add
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Either delete yourself from the member list or delete the whole chat.
|
||||||
<p>Either delete yourself from the member list or delete the whole chat.
|
If you want to join the group again later on, ask another group member to add you again.</li>
|
||||||
If you want to join the group again later on, ask another group member to add you again.</p>
|
</ul>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>As an alternative, you can also “Mute” a group - doing so means you get all messages and
|
<p>As an alternative, you can also “Mute” a group - doing so means you get all messages and
|
||||||
can still write, but are no longer notified of any new messages.</p>
|
can still write, but are no longer notified of any new messages.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="cloning-a-group">
|
<h3 id="cloning-a-group">
|
||||||
|
|
||||||
@@ -609,6 +627,212 @@ or right-click the group in the chat list (Desktop).</p>
|
|||||||
<p>The new group is <strong>fully independent</strong> from the original,
|
<p>The new group is <strong>fully independent</strong> from the original,
|
||||||
which continues to work as before.</p>
|
which continues to work as before.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||||
|
|
||||||
|
|
||||||
|
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>There is no strict technical limit,
|
||||||
|
but more than 150 is not recommended.</p>
|
||||||
|
|
||||||
|
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||||
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -897,7 +1121,7 @@ One device is not needed for the other to work.</p>
|
|||||||
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
|
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
|
<p>On <strong>Windows</strong>, go to “Control Panel / Network and Internet”
|
||||||
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
||||||
(after transfer, you can change back to the original value)</p>
|
(after transfer, you can change back to the original value)</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -949,23 +1173,22 @@ try the <strong>manual transfer</strong> described below</p>
|
|||||||
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
|
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>On the old device, go to “Settings -> Chats and media -> Export Backup”. Enter your
|
<li>
|
||||||
|
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
|
||||||
screen unlock PIN, pattern, or password. Then you can click on “Start
|
screen unlock PIN, pattern, or password. Then you can click on “Start
|
||||||
Backup”. This saves the backup file to your device. Now you have to transfer
|
Backup”. This saves the backup file to your device. Now you have to transfer
|
||||||
it to the other device somehow.</li>
|
it to the other device somehow.</p>
|
||||||
<li>On the new device, in the “I already have a profile” menu,
|
</li>
|
||||||
choose “restore from backup”. After import, your conversations, encryption
|
<li>
|
||||||
keys, and media should be copied to the new device.
|
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
|
||||||
<ul>
|
If you use iOS and encounter difficulties,
|
||||||
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
|
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
|
||||||
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
|
|
||||||
help you.</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
</li>
|
||||||
<li>You are now synchronized, and can use both devices for sending and receiving
|
|
||||||
end-to-end encrypted messages with your communication partners.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>You are now synchronized, and can use both devices for sending and receiving
|
||||||
|
end-to-end encrypted messages with your communication partners.</p>
|
||||||
|
|
||||||
<h3 id="are-there-any-plans-for-introducing-a-delta-chat-web-client">
|
<h3 id="are-there-any-plans-for-introducing-a-delta-chat-web-client">
|
||||||
|
|
||||||
|
|
||||||
@@ -993,10 +1216,10 @@ or the AppImage for Linux. You can find them on
|
|||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<h3 id="experimental-features">
|
<h3 id="experiments">
|
||||||
|
|
||||||
|
|
||||||
Experimental Features <a href="#experimental-features" class="anchor"></a>
|
Experimental Features <a href="#experiments" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1009,6 +1232,49 @@ you can try out features we are working on.</p>
|
|||||||
<p>You can find more information
|
<p>You can find more information
|
||||||
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
|
<h3 id="relays">
|
||||||
|
|
||||||
|
|
||||||
|
What are Relays? <a href="#relays" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Relays are used to temporarily hold messages in case your device is offline.
|
||||||
|
Relays are cheap and dumb servers,
|
||||||
|
that do not store data as group states, your name or avatar -
|
||||||
|
all that exist only on your device.
|
||||||
|
Relays are operated by different groups and people.</p>
|
||||||
|
|
||||||
|
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
|
||||||
|
so you do not need to care about that.
|
||||||
|
However, if you want to,
|
||||||
|
you can configure relays at <strong>Settings → Advanced → Relays</strong>:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>add</strong> a relay by scanning its QR code;
|
||||||
|
<a href="https://chatmail.at/relays">chatmail.at/relays</a> shows some known ones.
|
||||||
|
If you have multiple relays, you will receive messages on all of them.
|
||||||
|
Contacts learn your current relays automatically when you message them.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap on a relay to set it as <strong>used for sending</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you <strong>remove</strong> a relay,
|
||||||
|
contacts who only know this relay may not reach you until you message them again.
|
||||||
|
To stay reachable in the meantime, choose <strong>Hide from Contacts</strong> in the confirmation dialog
|
||||||
|
instead of removing it right away.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>To <strong>show</strong> a hidden relay again, tap on it.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>For more details and future possibilities of relays,
|
||||||
|
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
||||||
|
|
||||||
|
|
||||||
@@ -1116,9 +1382,7 @@ weekly statistics will be automatically sent to a bot.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>See <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</p>
|
||||||
<li>See <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="e2ee">
|
<h2 id="e2ee">
|
||||||
|
|
||||||
@@ -1147,6 +1411,10 @@ to exchange encryption setup information through QR-code scanning or “invite l
|
|||||||
<li>
|
<li>
|
||||||
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
||||||
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption and forward secrecy.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
||||||
@@ -1331,12 +1599,10 @@ Instead, all group metadata is end-to-end encrypted and stored on end-user devic
|
|||||||
<p>Servers can therefore only see:</p>
|
<p>Servers can therefore only see:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>the sender and receiver addresses</li>
|
<li>Sender and receiver addresses, randomly generated by default</li>
|
||||||
<li>and the message size.</li>
|
<li>Message size</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>By default, the addresses are randomly generated.</p>
|
|
||||||
|
|
||||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||||
|
|
||||||
<h3 id="device-seizure">
|
<h3 id="device-seizure">
|
||||||
@@ -1357,6 +1623,29 @@ with the knowledge that all their data, along with all metadata, will be deleted
|
|||||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||||
can not be identified easily.</p>
|
can not be identified easily.</p>
|
||||||
|
|
||||||
|
<h3 id="who-sees-my-ip-address">
|
||||||
|
|
||||||
|
|
||||||
|
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
|
Delta Chat neither persists nor exposes them.
|
||||||
|
Note that IP Addresses
|
||||||
|
are not like an address you give to a delivery service,
|
||||||
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
|
<p>If you see your IP Address as a risk,
|
||||||
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
@@ -1386,7 +1675,7 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||||
This means that if your private decryption key is leaked,
|
This means that if your private decryption key is leaked,
|
||||||
@@ -1397,12 +1686,9 @@ Otherwise, someone obtaining your decryption keys
|
|||||||
is typically also able to get all your non-deleted messages
|
is typically also able to get all your non-deleted messages
|
||||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||||
|
|
||||||
<p>We designed a Forward Secrecy approach that withstood
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
initial examination from some cryptographers and implementation experts
|
will provide reliable deletion (forward secrecy) through automatic key rotation.
|
||||||
but is pending a more formal write up
|
This approach is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
|
||||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
|
||||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
|
||||||
|
|
||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
@@ -1412,12 +1698,13 @@ which would make it available in all <a href="https://chatmail.at/clients">chatm
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
||||||
|
Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
in collaboration with other OpenPGP implementers.</p>
|
|
||||||
|
|
||||||
<h3 id="how-can-i-manually-check-encryption-information">
|
<h3 id="how-can-i-manually-check-encryption-information">
|
||||||
|
|
||||||
@@ -1494,7 +1781,7 @@ See <a href="https://delta.chat/en/2023-05-22-webxdc-security">here for the full
|
|||||||
<li>
|
<li>
|
||||||
<p>2023 March, <a href="https://cure53.de">Cure53</a> analyzed both the transport encryption of
|
<p>2023 March, <a href="https://cure53.de">Cure53</a> analyzed both the transport encryption of
|
||||||
Delta Chat’s network connections and a reproducible mail server setup as
|
Delta Chat’s network connections and a reproducible mail server setup as
|
||||||
<a href="https://delta.chat/en/serverguide">recommended on this site</a>.
|
<a href="https://delta.chat/serverguide">recommended on this site</a>.
|
||||||
You can read more about the audit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">on our blog</a>
|
You can read more about the audit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">on our blog</a>
|
||||||
or read the <a href="https://delta.chat/assets/blog/MER-01-report.pdf">full report here</a>.</p>
|
or read the <a href="https://delta.chat/assets/blog/MER-01-report.pdf">full report here</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -1596,10 +1883,22 @@ ordered chronologically:</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||||
and implementation of verified groups and setup contact protocols
|
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
along with collaboration partners working on
|
||||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||||
|
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||||
|
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||||
|
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||||
|
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||||
@@ -1612,36 +1911,10 @@ release Delta/iOS versions, to convert our core library to Rust, and
|
|||||||
to provide new features for all platforms.</p>
|
to provide new features for all platforms.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
and implementation of verified groups and setup contact protocols
|
||||||
</li>
|
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||||
<li>
|
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
|
||||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
|
||||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
|
||||||
This funding supported our long-running goals to make Delta Chat more usable
|
|
||||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
|
||||||
in places often affected by internet censorship and shutdowns.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>2023-2024 we successfully completed the OTF-funded
|
|
||||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
|
||||||
allowing us to introduce guaranteed encryption,
|
|
||||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
|
||||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
|
||||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
|
||||||
along with collaboration partners working on
|
|
||||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
|
||||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
|
||||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Sometimes we receive one-time donations from private individuals.
|
<p>Sometimes we receive one-time donations from private individuals.
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ a {
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a[href^='http']::after {
|
||||||
|
content: " ↗";
|
||||||
|
}
|
||||||
|
|
||||||
h2, h3, h4 {
|
h2, h3, h4 {
|
||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
||||||
<li><a href="#apakah-delta-chat-mendukung-gambar-vidio-dan-lampiran-lainnya">Apakah Delta Chat mendukung gambar, vidio dan lampiran lainnya?</a></li>
|
|
||||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||||
<li><a href="#siapa-yang-dapat-melihat-foto-profil-saya">Siapa yang dapat melihat Foto Profil saya?</a></li>
|
<li><a href="#siapa-yang-dapat-melihat-foto-profil-saya">Siapa yang dapat melihat Foto Profil saya?</a></li>
|
||||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
||||||
@@ -14,8 +13,9 @@
|
|||||||
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
||||||
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
|
<li><a href="#what-do-the-ticks-shown-beside-outgoing-messages-mean">What do the ticks shown beside outgoing messages mean?</a></li>
|
||||||
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
||||||
|
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
||||||
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
|
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
|
||||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -26,6 +26,22 @@
|
|||||||
<li><a href="#i-have-deleted-myself-by-accident">I have deleted myself by accident.</a></li>
|
<li><a href="#i-have-deleted-myself-by-accident">I have deleted myself by accident.</a></li>
|
||||||
<li><a href="#i-do-not-want-to-receive-the-messages-of-a-group-any-longer">I do not want to receive the messages of a group any longer.</a></li>
|
<li><a href="#i-do-not-want-to-receive-the-messages-of-a-group-any-longer">I do not want to receive the messages of a group any longer.</a></li>
|
||||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
||||||
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
@@ -54,11 +70,12 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#advanced">Advanced</a>
|
<li><a href="#advanced">Advanced</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#experimental-features">Experimental Features</a></li>
|
<li><a href="#experiments">Experimental Features</a></li>
|
||||||
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
<li><a href="#relays">What are Relays?</a></li>
|
||||||
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
||||||
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
||||||
|
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
||||||
<li><a href="#im-interested-in-the-technical-details-can-you-tell-me-more">I’m interested in the technical details. Can you tell me more?</a></li>
|
<li><a href="#im-interested-in-the-technical-details-can-you-tell-me-more">I’m interested in the technical details. Can you tell me more?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -75,6 +92,7 @@
|
|||||||
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
||||||
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
||||||
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
||||||
|
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
|
||||||
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
||||||
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
||||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
||||||
@@ -184,7 +202,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
|
|||||||
<p>As being a private messenger,
|
<p>As being a private messenger,
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
|
<p>Your friends may share your contact with other friends,
|
||||||
|
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -214,24 +233,6 @@ You can also add a little introduction message.</p>
|
|||||||
<p>The second contact will receive a <strong>card</strong> then
|
<p>The second contact will receive a <strong>card</strong> then
|
||||||
and can tap it to start chatting with the first contact.</p>
|
and can tap it to start chatting with the first contact.</p>
|
||||||
|
|
||||||
<h3 id="apakah-delta-chat-mendukung-gambar-vidio-dan-lampiran-lainnya">
|
|
||||||
|
|
||||||
|
|
||||||
Apakah Delta Chat mendukung gambar, vidio dan lampiran lainnya? <a href="#apakah-delta-chat-mendukung-gambar-vidio-dan-lampiran-lainnya" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
|
|
||||||
@@ -261,16 +262,11 @@ or to <strong>Switch Profiles</strong>.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Anda dapat menambahkan gambar profil di pengaturan Anda. Jika Anda menulis ke kontak Anda
|
<p>Anda dapat menambahkan gambar profil di pengaturan Anda. Jika Anda menulis ke kontak Anda
|
||||||
atau menambahkannya melalui kode QR, mereka secara otomatis melihatnya sebagai gambar profil Anda.</p>
|
atau menambahkannya melalui kode QR, mereka secara otomatis melihatnya sebagai gambar profil Anda.</p>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Untuk alasan kerahasiaan, tidak ada satupun yang dapat melihat Foto Profil anda hingga anda menulis
|
<p>Untuk alasan kerahasiaan, tidak ada satupun yang dapat melihat Foto Profil anda hingga anda menulis
|
||||||
sebuah pesan kepada mereka.</p>
|
sebuah pesan kepada mereka.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
@@ -304,7 +300,8 @@ they will see it when they view your contact details.</p>
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
||||||
Archived chats remain accessible above the chat list or via search.</p>
|
They remain accessible above the chat list or via search
|
||||||
|
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
||||||
@@ -339,7 +336,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
|
|||||||
you can go back to the original message in the original chat</p>
|
you can go back to the original message in the original chat</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||||
@@ -376,23 +373,19 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
means that the message was sent successfully to your provider.</p>
|
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
mean that at least one recipient’s device
|
indicate your contact has read the message.</p>
|
||||||
reported back to having received the message.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Recipients may have disabled read-receipts,
|
|
||||||
so even if you see only one tick, the message may have been read.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>The other way round, two ticks do not automatically mean
|
|
||||||
that a human has read or understood the message ;)</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||||
|
|
||||||
|
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||||
|
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
|
|
||||||
@@ -420,6 +413,32 @@ Notifications are not sent and there is no time limit.</p>
|
|||||||
<p>Note, that the original message may still be received by chat members
|
<p>Note, that the original message may still be received by chat members
|
||||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||||
|
|
||||||
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
|
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
||||||
|
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>By default, compression ensures <strong>fast, efficient delivery</strong> that respects everyone’s data limits and storage.
|
||||||
|
This is ideal for everyday communication.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In regions with worse connectivity,
|
||||||
|
you can choose higher compression at <strong>Settings → Chats → Outgoing Media Quality</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you specifically need to send media in its <strong>original quality</strong>, use <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach → File</strong> in the chat.
|
||||||
|
Please use this method sparingly, as sending original files will significantly increase data usage for you and all recipients in the chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3 id="ephemeralmsgs">
|
<h3 id="ephemeralmsgs">
|
||||||
|
|
||||||
|
|
||||||
@@ -456,19 +475,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
<h3 id="delold">
|
<h3 id="delold">
|
||||||
|
|
||||||
|
|
||||||
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
|
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>If you want to save storage on your device, you can choose to delete old
|
||||||
<li>If you want to save storage on your device, you can choose to delete old
|
messages automatically.</p>
|
||||||
messages automatically.</li>
|
|
||||||
<li>To turn it on, go to “delete old messages from device” in the “Chats & Media”
|
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
|
||||||
settings. You can set a timeframe between “after an hour” and “after a year”;
|
You can set a timeframe between “after an hour” and “after a year”;
|
||||||
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
||||||
older than that.</li>
|
older than that.</p>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
@@ -516,9 +534,15 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Select <strong>New chat</strong> and then <strong>New group</strong> from the menu in the upper right corner or hit the corresponding button on Android/iOS.</li>
|
<li>
|
||||||
<li>On the following screen, select the <strong>group members</strong> and define a <strong>group name</strong>. You can also select a <strong>group avatar</strong>.</li>
|
<p>Select <strong>New chat</strong> and then <strong>New group</strong> from the menu in the upper right corner or hit the corresponding button on Android/iOS.</p>
|
||||||
<li>As soon as you write the <strong>first message</strong> in the group, all members are informed about the new group and can answer in the group (as long as you do not write a message in the group the group is invisible to the members).</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On the following screen, select the <strong>group members</strong> and define a <strong>group name</strong>. You can also select a <strong>group avatar</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>As soon as you write the <strong>first message</strong> in the group, all members are informed about the new group and can answer in the group (as long as you do not write a message in the group the group is invisible to the members).</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
@@ -529,11 +553,10 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>All group members have the <strong>same rights</strong>.
|
<p>All group members have the <strong>same rights</strong>.
|
||||||
For this reason, everyone can delete any member or add new ones.</p>
|
For this reason, everyone can delete any member or add new ones.</p>
|
||||||
</li>
|
|
||||||
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -561,10 +584,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>As you’re no longer a group member, you cannot add yourself again.
|
||||||
<li>As you’re no longer a group member, you cannot add yourself again.
|
However, no problem, just ask any other group member in a normal chat to re-add you.</p>
|
||||||
However, no problem, just ask any other group member in a normal chat to re-add you.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="i-do-not-want-to-receive-the-messages-of-a-group-any-longer">
|
<h3 id="i-do-not-want-to-receive-the-messages-of-a-group-any-longer">
|
||||||
|
|
||||||
@@ -575,15 +596,12 @@ However, no problem, just ask any other group member in a normal chat to re-add
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Either delete yourself from the member list or delete the whole chat.
|
||||||
<p>Either delete yourself from the member list or delete the whole chat.
|
If you want to join the group again later on, ask another group member to add you again.</li>
|
||||||
If you want to join the group again later on, ask another group member to add you again.</p>
|
</ul>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>As an alternative, you can also “Mute” a group - doing so means you get all messages and
|
<p>As an alternative, you can also “Mute” a group - doing so means you get all messages and
|
||||||
can still write, but are no longer notified of any new messages.</p>
|
can still write, but are no longer notified of any new messages.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="cloning-a-group">
|
<h3 id="cloning-a-group">
|
||||||
|
|
||||||
@@ -609,6 +627,212 @@ or right-click the group in the chat list (Desktop).</p>
|
|||||||
<p>The new group is <strong>fully independent</strong> from the original,
|
<p>The new group is <strong>fully independent</strong> from the original,
|
||||||
which continues to work as before.</p>
|
which continues to work as before.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||||
|
|
||||||
|
|
||||||
|
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>There is no strict technical limit,
|
||||||
|
but more than 150 is not recommended.</p>
|
||||||
|
|
||||||
|
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||||
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -897,7 +1121,7 @@ One device is not needed for the other to work.</p>
|
|||||||
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
|
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
|
<p>On <strong>Windows</strong>, go to “Control Panel / Network and Internet”
|
||||||
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
||||||
(after transfer, you can change back to the original value)</p>
|
(after transfer, you can change back to the original value)</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -949,23 +1173,22 @@ try the <strong>manual transfer</strong> described below</p>
|
|||||||
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
|
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>On the old device, go to “Settings -> Chats and media -> Export Backup”. Enter your
|
<li>
|
||||||
|
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
|
||||||
screen unlock PIN, pattern, or password. Then you can click on “Start
|
screen unlock PIN, pattern, or password. Then you can click on “Start
|
||||||
Backup”. This saves the backup file to your device. Now you have to transfer
|
Backup”. This saves the backup file to your device. Now you have to transfer
|
||||||
it to the other device somehow.</li>
|
it to the other device somehow.</p>
|
||||||
<li>On the new device, in the “I already have a profile” menu,
|
</li>
|
||||||
choose “restore from backup”. After import, your conversations, encryption
|
<li>
|
||||||
keys, and media should be copied to the new device.
|
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
|
||||||
<ul>
|
If you use iOS and encounter difficulties,
|
||||||
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
|
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
|
||||||
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
|
|
||||||
help you.</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
</li>
|
||||||
<li>You are now synchronized, and can use both devices for sending and receiving
|
|
||||||
end-to-end encrypted messages with your communication partners.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>You are now synchronized, and can use both devices for sending and receiving
|
||||||
|
end-to-end encrypted messages with your communication partners.</p>
|
||||||
|
|
||||||
<h3 id="are-there-any-plans-for-introducing-a-delta-chat-web-client">
|
<h3 id="are-there-any-plans-for-introducing-a-delta-chat-web-client">
|
||||||
|
|
||||||
|
|
||||||
@@ -993,10 +1216,10 @@ or the AppImage for Linux. You can find them on
|
|||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<h3 id="experimental-features">
|
<h3 id="experiments">
|
||||||
|
|
||||||
|
|
||||||
Experimental Features <a href="#experimental-features" class="anchor"></a>
|
Experimental Features <a href="#experiments" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1009,33 +1232,48 @@ you can try out features we are working on.</p>
|
|||||||
<p>You can find more information
|
<p>You can find more information
|
||||||
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="statssending">
|
<h3 id="relays">
|
||||||
|
|
||||||
|
|
||||||
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
What are Relays? <a href="#relays" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>We would like to improve Delta Chat with your help,
|
<p>Relays are used to temporarily hold messages in case your device is offline.
|
||||||
which is why Delta Chat for Android asks whether you want
|
Relays are cheap and dumb servers,
|
||||||
to send anonymous usage statistics.</p>
|
that do not store data as group states, your name or avatar -
|
||||||
|
all that exist only on your device.
|
||||||
|
Relays are operated by different groups and people.</p>
|
||||||
|
|
||||||
<p>You can turn it on and off at
|
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
|
||||||
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
so you do not need to care about that.
|
||||||
|
However, if you want to,
|
||||||
<p>When you turn it on,
|
you can configure relays at <strong>Settings → Advanced → Relays</strong>:</p>
|
||||||
weekly statistics will be automatically sent to a bot.</p>
|
|
||||||
|
|
||||||
<p>We are interested e.g. in statistics like:</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>How many contacts are introduced by personally scanning a QR code?</li>
|
<li>
|
||||||
<li>Which versions of Delta Chat are being used?</li>
|
<p>You can <strong>add</strong> a relay by scanning its QR code;
|
||||||
<li>How many messages are unencrypted?</li>
|
<a href="https://chatmail.at/relays">chatmail.at/relays</a> shows some known ones.
|
||||||
|
If you have multiple relays, you will receive messages on all of them.
|
||||||
|
Contacts learn your current relays automatically when you message them.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap on a relay to set it as <strong>used for sending</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you <strong>remove</strong> a relay,
|
||||||
|
contacts who only know this relay may not reach you until you message them again.
|
||||||
|
To stay reachable in the meantime, choose <strong>Hide from Contacts</strong> in the confirmation dialog
|
||||||
|
instead of removing it right away.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>To <strong>show</strong> a hidden relay again, tap on it.</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
<p>For more details and future possibilities of relays,
|
||||||
|
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
||||||
|
|
||||||
@@ -1102,6 +1340,40 @@ except if your users’ devices require Google/Apple <a href="#instant-delivery"
|
|||||||
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
||||||
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
||||||
|
|
||||||
|
<h3 id="statssending">
|
||||||
|
|
||||||
|
|
||||||
|
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>We would like to improve Delta Chat with your help,
|
||||||
|
which is why Delta Chat for Android asks whether you want
|
||||||
|
to send anonymous usage statistics.</p>
|
||||||
|
|
||||||
|
<p>You can turn it on and off at
|
||||||
|
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
||||||
|
|
||||||
|
<p>When you turn it on,
|
||||||
|
weekly statistics will be automatically sent to a bot.</p>
|
||||||
|
|
||||||
|
<p>We are interested e.g. in statistics like:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>How many contacts are introduced by personally scanning a QR code?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Which versions of Delta Chat are being used?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>What errors occur for users?</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
||||||
|
|
||||||
<h3 id="im-interested-in-the-technical-details-can-you-tell-me-more">
|
<h3 id="im-interested-in-the-technical-details-can-you-tell-me-more">
|
||||||
|
|
||||||
|
|
||||||
@@ -1110,9 +1382,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>See <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</p>
|
||||||
<li>See <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standards used in Delta Chat</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="e2ee">
|
<h2 id="e2ee">
|
||||||
|
|
||||||
@@ -1141,6 +1411,10 @@ to exchange encryption setup information through QR-code scanning or “invite l
|
|||||||
<li>
|
<li>
|
||||||
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
||||||
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption and forward secrecy.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
||||||
@@ -1325,12 +1599,10 @@ Instead, all group metadata is end-to-end encrypted and stored on end-user devic
|
|||||||
<p>Servers can therefore only see:</p>
|
<p>Servers can therefore only see:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>the sender and receiver addresses</li>
|
<li>Sender and receiver addresses, randomly generated by default</li>
|
||||||
<li>and the message size.</li>
|
<li>Message size</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>By default, the addresses are randomly generated.</p>
|
|
||||||
|
|
||||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||||
|
|
||||||
<h3 id="device-seizure">
|
<h3 id="device-seizure">
|
||||||
@@ -1351,6 +1623,29 @@ with the knowledge that all their data, along with all metadata, will be deleted
|
|||||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||||
can not be identified easily.</p>
|
can not be identified easily.</p>
|
||||||
|
|
||||||
|
<h3 id="who-sees-my-ip-address">
|
||||||
|
|
||||||
|
|
||||||
|
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
|
Delta Chat neither persists nor exposes them.
|
||||||
|
Note that IP Addresses
|
||||||
|
are not like an address you give to a delivery service,
|
||||||
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
|
<p>If you see your IP Address as a risk,
|
||||||
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
@@ -1380,7 +1675,7 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||||
This means that if your private decryption key is leaked,
|
This means that if your private decryption key is leaked,
|
||||||
@@ -1391,12 +1686,9 @@ Otherwise, someone obtaining your decryption keys
|
|||||||
is typically also able to get all your non-deleted messages
|
is typically also able to get all your non-deleted messages
|
||||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||||
|
|
||||||
<p>We designed a Forward Secrecy approach that withstood
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
initial examination from some cryptographers and implementation experts
|
will provide reliable deletion (forward secrecy) through automatic key rotation.
|
||||||
but is pending a more formal write up
|
This approach is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
|
||||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
|
||||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
|
||||||
|
|
||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
@@ -1406,12 +1698,13 @@ which would make it available in all <a href="https://chatmail.at/clients">chatm
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
||||||
|
Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
in collaboration with other OpenPGP implementers.</p>
|
|
||||||
|
|
||||||
<h3 id="how-can-i-manually-check-encryption-information">
|
<h3 id="how-can-i-manually-check-encryption-information">
|
||||||
|
|
||||||
@@ -1488,7 +1781,7 @@ See <a href="https://delta.chat/en/2023-05-22-webxdc-security">here for the full
|
|||||||
<li>
|
<li>
|
||||||
<p>2023 March, <a href="https://cure53.de">Cure53</a> analyzed both the transport encryption of
|
<p>2023 March, <a href="https://cure53.de">Cure53</a> analyzed both the transport encryption of
|
||||||
Delta Chat’s network connections and a reproducible mail server setup as
|
Delta Chat’s network connections and a reproducible mail server setup as
|
||||||
<a href="https://delta.chat/id/serverguide">recommended on this site</a>.
|
<a href="https://delta.chat/serverguide">recommended on this site</a>.
|
||||||
You can read more about the audit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">on our blog</a>
|
You can read more about the audit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">on our blog</a>
|
||||||
or read the <a href="https://delta.chat/assets/blog/MER-01-report.pdf">full report here</a>.</p>
|
or read the <a href="https://delta.chat/assets/blog/MER-01-report.pdf">full report here</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -1590,10 +1883,22 @@ ordered chronologically:</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||||
and implementation of verified groups and setup contact protocols
|
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
along with collaboration partners working on
|
||||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||||
|
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||||
|
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||||
|
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||||
|
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||||
@@ -1606,36 +1911,10 @@ release Delta/iOS versions, to convert our core library to Rust, and
|
|||||||
to provide new features for all platforms.</p>
|
to provide new features for all platforms.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
and implementation of verified groups and setup contact protocols
|
||||||
</li>
|
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||||
<li>
|
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
|
||||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
|
||||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
|
||||||
This funding supported our long-running goals to make Delta Chat more usable
|
|
||||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
|
||||||
in places often affected by internet censorship and shutdowns.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>2023-2024 we successfully completed the OTF-funded
|
|
||||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
|
||||||
allowing us to introduce guaranteed encryption,
|
|
||||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
|
||||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
|
||||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
|
||||||
along with collaboration partners working on
|
|
||||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
|
||||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
|
||||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Terkadang kami menerima sumbangan satu kali dari perorangan.
|
<p>Terkadang kami menerima sumbangan satu kali dari perorangan.
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
||||||
<li><a href="#ondersteunt-delta-chat-afbeeldingen-videos-en-ander-soort-bijlagen">Ondersteunt Delta Chat afbeeldingen, video’s en ander soort bijlagen?</a></li>
|
|
||||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||||
<li><a href="#wie-kan-mijn-profielfoto-zien">Wie kan mijn profielfoto zien?</a></li>
|
<li><a href="#wie-kan-mijn-profielfoto-zien">Wie kan mijn profielfoto zien?</a></li>
|
||||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
||||||
@@ -14,6 +13,7 @@
|
|||||||
<li><a href="#wat-betekent-die-groene-stip">Wat betekent die groene stip?</a></li>
|
<li><a href="#wat-betekent-die-groene-stip">Wat betekent die groene stip?</a></li>
|
||||||
<li><a href="#wat-betekenen-de-vinkjes-naast-verzonden-berichten">Wat betekenen de vinkjes naast verzonden berichten?</a></li>
|
<li><a href="#wat-betekenen-de-vinkjes-naast-verzonden-berichten">Wat betekenen de vinkjes naast verzonden berichten?</a></li>
|
||||||
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
||||||
|
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
||||||
<li><a href="#delold">Wat gebeurt er als ik ‘Oude berichten van server verwijderen’ inschakel?</a></li>
|
<li><a href="#delold">Wat gebeurt er als ik ‘Oude berichten van server verwijderen’ inschakel?</a></li>
|
||||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||||
@@ -26,6 +26,22 @@
|
|||||||
<li><a href="#ik-heb-mezelf-per-ongeluk-verwijderd">Ik heb mezelf per ongeluk verwijderd</a></li>
|
<li><a href="#ik-heb-mezelf-per-ongeluk-verwijderd">Ik heb mezelf per ongeluk verwijderd</a></li>
|
||||||
<li><a href="#ik-wil-geen-groepsberichten-meer-ontvangen">Ik wil geen groepsberichten meer ontvangen</a></li>
|
<li><a href="#ik-wil-geen-groepsberichten-meer-ontvangen">Ik wil geen groepsberichten meer ontvangen</a></li>
|
||||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
||||||
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
@@ -54,11 +70,12 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#advanced">Advanced</a>
|
<li><a href="#advanced">Advanced</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#experimental-features">Experimental Features</a></li>
|
<li><a href="#experiments">Experimental Features</a></li>
|
||||||
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
<li><a href="#relays">What are Relays?</a></li>
|
||||||
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
||||||
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
||||||
|
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
||||||
<li><a href="#ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">Ik wil graag meer weten over de gebruikte technieken. Waar kan ik meer informatie vinden?</a></li>
|
<li><a href="#ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">Ik wil graag meer weten over de gebruikte technieken. Waar kan ik meer informatie vinden?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -75,6 +92,7 @@
|
|||||||
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
||||||
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
||||||
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
||||||
|
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
|
||||||
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
||||||
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
||||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
||||||
@@ -184,7 +202,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
|
|||||||
<p>As being a private messenger,
|
<p>As being a private messenger,
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
|
<p>Your friends may share your contact with other friends,
|
||||||
|
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -214,24 +233,6 @@ You can also add a little introduction message.</p>
|
|||||||
<p>The second contact will receive a <strong>card</strong> then
|
<p>The second contact will receive a <strong>card</strong> then
|
||||||
and can tap it to start chatting with the first contact.</p>
|
and can tap it to start chatting with the first contact.</p>
|
||||||
|
|
||||||
<h3 id="ondersteunt-delta-chat-afbeeldingen-videos-en-ander-soort-bijlagen">
|
|
||||||
|
|
||||||
|
|
||||||
Ondersteunt Delta Chat afbeeldingen, video’s en ander soort bijlagen? <a href="#ondersteunt-delta-chat-afbeeldingen-videos-en-ander-soort-bijlagen" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Om de prestaties te verhogen, worden afbeeldingen standaard geoptimaliseerd en verkleind verstuurd, maar je kunt ze als een bestand verzenden om het origineel te sturen.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
|
|
||||||
@@ -261,16 +262,11 @@ or to <strong>Switch Profiles</strong>.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>In de instellingen kun je een profielfoto toevoegen. Als je een bericht stuurt aan
|
<p>In de instellingen kun je een profielfoto toevoegen. Als je een bericht stuurt aan
|
||||||
je contactpersonen of ze toevoegt middels hun QR-code, dan krijgen ze je profielfoto te zien.</p>
|
je contactpersonen of ze toevoegt middels hun QR-code, dan krijgen ze je profielfoto te zien.</p>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Omwille van je privacy, krijgen anderen je profielfoto pas te zien
|
<p>Omwille van je privacy, krijgen anderen je profielfoto pas te zien
|
||||||
als je ze een bericht stuurt.</p>
|
als je ze een bericht stuurt.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
@@ -303,8 +299,7 @@ they will see it when they view your contact details.</p>
|
|||||||
<p>Stel gesprekken in op <strong>Negeren</strong> als je geen meldingen meer wilt ontvangen. Wel blijven genegeerde gesprekken op de lijst staan en kun je ze te allen tijde vastmaken.</p>
|
<p>Stel gesprekken in op <strong>Negeren</strong> als je geen meldingen meer wilt ontvangen. Wel blijven genegeerde gesprekken op de lijst staan en kun je ze te allen tijde vastmaken.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Archiveer gesprekken</strong> als je ze niet meer op de gesprekslijst wilt zien.
|
<p><strong>Archiveer gesprekken</strong> als je ze niet meer op de gesprekslijst wilt zien. Gearchiveerde gesprekken zijn te allen tijde te bekijken boven de lijst of via een zoekopdracht.</p>
|
||||||
Gearchiveerde gesprekken zijn te allen tijde te bekijken boven de lijst of via een zoekopdracht.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Als er een nieuw bericht in een gearchiveerd gesprek wordt ontvangen, dan wordt het gesprek in kwestie <strong>ge-dearchiveerd</strong> en dus weer op de gesprekslijst geplaatst.
|
<p>Als er een nieuw bericht in een gearchiveerd gesprek wordt ontvangen, dan wordt het gesprek in kwestie <strong>ge-dearchiveerd</strong> en dus weer op de gesprekslijst geplaatst.
|
||||||
@@ -340,7 +335,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
|
|||||||
you can go back to the original message in the original chat</p>
|
you can go back to the original message in the original chat</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||||
@@ -377,23 +372,19 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
means that the message was sent successfully to your provider.</p>
|
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
mean that at least one recipient’s device
|
indicate your contact has read the message.</p>
|
||||||
reported back to having received the message.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Recipients may have disabled read-receipts,
|
|
||||||
so even if you see only one tick, the message may have been read.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>The other way round, two ticks do not automatically mean
|
|
||||||
that a human has read or understood the message ;)</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||||
|
|
||||||
|
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||||
|
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
|
|
||||||
@@ -421,6 +412,32 @@ Notifications are not sent and there is no time limit.</p>
|
|||||||
<p>Note, that the original message may still be received by chat members
|
<p>Note, that the original message may still be received by chat members
|
||||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||||
|
|
||||||
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
|
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
||||||
|
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>By default, compression ensures <strong>fast, efficient delivery</strong> that respects everyone’s data limits and storage.
|
||||||
|
This is ideal for everyday communication.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In regions with worse connectivity,
|
||||||
|
you can choose higher compression at <strong>Settings → Chats → Outgoing Media Quality</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you specifically need to send media in its <strong>original quality</strong>, use <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach → File</strong> in the chat.
|
||||||
|
Please use this method sparingly, as sending original files will significantly increase data usage for you and all recipients in the chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3 id="ephemeralmsgs">
|
<h3 id="ephemeralmsgs">
|
||||||
|
|
||||||
|
|
||||||
@@ -462,12 +479,9 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Als je ruimte wilt besparen op je apparaat, dan kun je er voor kiezen om oude berichten automatisch te verwijderen.</p>
|
||||||
<li>Als je ruimte wilt besparen op je apparaat, dan kun je er voor kiezen om oude
|
|
||||||
berichten automatisch te verwijderen.</li>
|
<p>Inschakelen kan via de sectie ‘Gesprekken en media’ in de instellingen. Je kunt een periode tussen ‘na één uur’ en ‘na één jaar’ kiezen. <em>Alle</em> berichten die ouder zijn, worden verwijderd.</p>
|
||||||
<li>Inschakelen kan via de sectie ‘Gesprekken en media’ in de instellingen. Je kunt een periode tussen
|
|
||||||
‘na één uur’ en ‘na één jaar’ kiezen. *Alle berichten die ouder zijn, worden verwijderd.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
@@ -515,9 +529,15 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Open het ‘menu met de drie puntjes’ rechtsboven in het gespreksoverzicht, kies <strong>Nieuw gesprek</strong> en daarna <strong>Nieuwe groep</strong>.</li>
|
<li>
|
||||||
<li>Kies dan de <strong>groepsleden</strong> en druk op het vinkje rechtsboven. Daarna kun je een <strong>groepsnaam</strong> opgeven.</li>
|
<p>Open het ‘menu met de drie puntjes’ rechtsboven in het gespreksoverzicht, kies <strong>Nieuw gesprek</strong> en daarna <strong>Nieuwe groep</strong>.</p>
|
||||||
<li>Zodra je het <strong>eerste groepsbericht</strong> hebt verstuurd, worden alle deelnemers op de hoogte gebracht en kunnen zij antwoorden versturen (de groep blijft onzichtbaar voor anderen zolang jij geen bericht verstuurt).</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Kies dan de <strong>groepsleden</strong> en druk op het vinkje rechtsboven. Daarna kun je een <strong>groepsnaam</strong> opgeven.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Zodra je het <strong>eerste groepsbericht</strong> hebt verstuurd, worden alle deelnemers op de hoogte gebracht en kunnen zij antwoorden versturen (de groep blijft onzichtbaar voor anderen zolang jij geen bericht verstuurt).</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
@@ -528,11 +548,10 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>All group members have the <strong>same rights</strong>.
|
<p>All group members have the <strong>same rights</strong>.
|
||||||
For this reason, everyone can delete any member or add new ones.</p>
|
For this reason, everyone can delete any member or add new ones.</p>
|
||||||
</li>
|
|
||||||
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -560,10 +579,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Je neemt geen deel meer aan de groep en kunt jezelf dus niet meer toevoegen.
|
||||||
<li>Je neemt geen deel meer aan de groep en kunt jezelf dus niet meer toevoegen.
|
Vraag iemand via een één-op-ééngesprek of hij/zij je weer wilt toevoegen.</p>
|
||||||
Vraag iemand via een één-op-ééngesprek of hij/zij je weer wilt toevoegen.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="ik-wil-geen-groepsberichten-meer-ontvangen">
|
<h3 id="ik-wil-geen-groepsberichten-meer-ontvangen">
|
||||||
|
|
||||||
@@ -574,15 +591,12 @@ Vraag iemand via een één-op-ééngesprek of hij/zij je weer wilt toevoegen.</l
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Verwijder jezelf van de groepslijst of verwijder het hele groepsgesprek.
|
||||||
<p>Verwijder jezelf van de groepslijst of verwijder het hele groepsgesprek.
|
Als je later weer wilt deelnemen, vraag dan iemand anders of hij/zij je weer wilt toevoegen.</li>
|
||||||
Als je later weer wilt deelnemen, vraag dan iemand anders of hij/zij je weer wilt toevoegen.</p>
|
</ul>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Wat ook kan doen is groepsmeldingen uitschakelen. Zo blijf je in de groep, maar ontvang je
|
<p>Wat ook kan doen is groepsmeldingen uitschakelen. Zo blijf je in de groep, maar ontvang je
|
||||||
geen meldingen meer als er nieuwe berichten zijn.</p>
|
geen meldingen meer als er nieuwe berichten zijn.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="cloning-a-group">
|
<h3 id="cloning-a-group">
|
||||||
|
|
||||||
@@ -608,6 +622,212 @@ or right-click the group in the chat list (Desktop).</p>
|
|||||||
<p>The new group is <strong>fully independent</strong> from the original,
|
<p>The new group is <strong>fully independent</strong> from the original,
|
||||||
which continues to work as before.</p>
|
which continues to work as before.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||||
|
|
||||||
|
|
||||||
|
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>There is no strict technical limit,
|
||||||
|
but more than 150 is not recommended.</p>
|
||||||
|
|
||||||
|
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||||
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -895,7 +1115,7 @@ op beide apparaten</strong>. Hierdoor hoef je niet het ene apparaat bij de hand
|
|||||||
<p>Controleer of beide apparaten verbonden zijn met <strong>hetzelfde (wifi)netwerk</strong></p>
|
<p>Controleer of beide apparaten verbonden zijn met <strong>hetzelfde (wifi)netwerk</strong></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
|
<p>On <strong>Windows</strong>, go to “Control Panel / Network and Internet”
|
||||||
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
||||||
(after transfer, you can change back to the original value)</p>
|
(after transfer, you can change back to the original value)</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -947,23 +1167,22 @@ volg dan onderstaande stappen omtrent handmatige overzetting</p>
|
|||||||
<p>Deze methode is vooral bedoeld voor situaties waarin ‘Tweede apparaat toevoegen’ niet lukt.</p>
|
<p>Deze methode is vooral bedoeld voor situaties waarin ‘Tweede apparaat toevoegen’ niet lukt.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>On the old device, go to “Settings -> Chats and media -> Export Backup”. Enter your
|
<li>
|
||||||
|
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
|
||||||
screen unlock PIN, pattern, or password. Then you can click on “Start
|
screen unlock PIN, pattern, or password. Then you can click on “Start
|
||||||
Backup”. This saves the backup file to your device. Now you have to transfer
|
Backup”. This saves the backup file to your device. Now you have to transfer
|
||||||
it to the other device somehow.</li>
|
it to the other device somehow.</p>
|
||||||
<li>On the new device, in the “I already have a profile” menu,
|
</li>
|
||||||
choose “restore from backup”. After import, your conversations, encryption
|
<li>
|
||||||
keys, and media should be copied to the new device.
|
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
|
||||||
<ul>
|
If you use iOS and encounter difficulties,
|
||||||
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
|
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
|
||||||
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
|
|
||||||
help you.</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
</li>
|
||||||
<li>You are now synchronized, and can use both devices for sending and receiving
|
|
||||||
end-to-end encrypted messages with your communication partners.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>You are now synchronized, and can use both devices for sending and receiving
|
||||||
|
end-to-end encrypted messages with your communication partners.</p>
|
||||||
|
|
||||||
<h3 id="bestaan-er-plannen-om-een-delta-chat-webclient-te-maken">
|
<h3 id="bestaan-er-plannen-om-een-delta-chat-webclient-te-maken">
|
||||||
|
|
||||||
|
|
||||||
@@ -991,10 +1210,10 @@ of de AppImage van de Linux-client. Deze kun je downloaden op
|
|||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<h3 id="experimental-features">
|
<h3 id="experiments">
|
||||||
|
|
||||||
|
|
||||||
Experimental Features <a href="#experimental-features" class="anchor"></a>
|
Experimental Features <a href="#experiments" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1007,33 +1226,48 @@ you can try out features we are working on.</p>
|
|||||||
<p>You can find more information
|
<p>You can find more information
|
||||||
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="statssending">
|
<h3 id="relays">
|
||||||
|
|
||||||
|
|
||||||
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
What are Relays? <a href="#relays" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>We would like to improve Delta Chat with your help,
|
<p>Relays are used to temporarily hold messages in case your device is offline.
|
||||||
which is why Delta Chat for Android asks whether you want
|
Relays are cheap and dumb servers,
|
||||||
to send anonymous usage statistics.</p>
|
that do not store data as group states, your name or avatar -
|
||||||
|
all that exist only on your device.
|
||||||
|
Relays are operated by different groups and people.</p>
|
||||||
|
|
||||||
<p>You can turn it on and off at
|
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
|
||||||
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
so you do not need to care about that.
|
||||||
|
However, if you want to,
|
||||||
<p>When you turn it on,
|
you can configure relays at <strong>Settings → Advanced → Relays</strong>:</p>
|
||||||
weekly statistics will be automatically sent to a bot.</p>
|
|
||||||
|
|
||||||
<p>We are interested e.g. in statistics like:</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>How many contacts are introduced by personally scanning a QR code?</li>
|
<li>
|
||||||
<li>Which versions of Delta Chat are being used?</li>
|
<p>You can <strong>add</strong> a relay by scanning its QR code;
|
||||||
<li>How many messages are unencrypted?</li>
|
<a href="https://chatmail.at/relays">chatmail.at/relays</a> shows some known ones.
|
||||||
|
If you have multiple relays, you will receive messages on all of them.
|
||||||
|
Contacts learn your current relays automatically when you message them.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap on a relay to set it as <strong>used for sending</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you <strong>remove</strong> a relay,
|
||||||
|
contacts who only know this relay may not reach you until you message them again.
|
||||||
|
To stay reachable in the meantime, choose <strong>Hide from Contacts</strong> in the confirmation dialog
|
||||||
|
instead of removing it right away.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>To <strong>show</strong> a hidden relay again, tap on it.</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
<p>For more details and future possibilities of relays,
|
||||||
|
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
||||||
|
|
||||||
@@ -1100,6 +1334,40 @@ except if your users’ devices require Google/Apple <a href="#instant-delivery"
|
|||||||
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
||||||
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
||||||
|
|
||||||
|
<h3 id="statssending">
|
||||||
|
|
||||||
|
|
||||||
|
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>We would like to improve Delta Chat with your help,
|
||||||
|
which is why Delta Chat for Android asks whether you want
|
||||||
|
to send anonymous usage statistics.</p>
|
||||||
|
|
||||||
|
<p>You can turn it on and off at
|
||||||
|
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
||||||
|
|
||||||
|
<p>When you turn it on,
|
||||||
|
weekly statistics will be automatically sent to a bot.</p>
|
||||||
|
|
||||||
|
<p>We are interested e.g. in statistics like:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>How many contacts are introduced by personally scanning a QR code?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Which versions of Delta Chat are being used?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>What errors occur for users?</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
||||||
|
|
||||||
<h3 id="ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">
|
<h3 id="ik-wil-graag-meer-weten-over-de-gebruikte-technieken-waar-kan-ik-meer-informatie-vinden">
|
||||||
|
|
||||||
|
|
||||||
@@ -1108,9 +1376,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Bekijk de pagina <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Door Delta Chat gebruikte standaarden</a>.</p>
|
||||||
<li>Bekijk de pagina <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Door Delta Chat gebruikte standaarden</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="e2ee">
|
<h2 id="e2ee">
|
||||||
|
|
||||||
@@ -1139,6 +1405,10 @@ to exchange encryption setup information through QR-code scanning or “invite l
|
|||||||
<li>
|
<li>
|
||||||
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
||||||
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption and forward secrecy.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
||||||
@@ -1323,12 +1593,10 @@ Instead, all group metadata is end-to-end encrypted and stored on end-user devic
|
|||||||
<p>Servers can therefore only see:</p>
|
<p>Servers can therefore only see:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>the sender and receiver addresses</li>
|
<li>Sender and receiver addresses, randomly generated by default</li>
|
||||||
<li>and the message size.</li>
|
<li>Message size</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>By default, the addresses are randomly generated.</p>
|
|
||||||
|
|
||||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||||
|
|
||||||
<h3 id="device-seizure">
|
<h3 id="device-seizure">
|
||||||
@@ -1349,6 +1617,29 @@ with the knowledge that all their data, along with all metadata, will be deleted
|
|||||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||||
can not be identified easily.</p>
|
can not be identified easily.</p>
|
||||||
|
|
||||||
|
<h3 id="who-sees-my-ip-address">
|
||||||
|
|
||||||
|
|
||||||
|
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
|
Delta Chat neither persists nor exposes them.
|
||||||
|
Note that IP Addresses
|
||||||
|
are not like an address you give to a delivery service,
|
||||||
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
|
<p>If you see your IP Address as a risk,
|
||||||
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
@@ -1378,7 +1669,7 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||||
This means that if your private decryption key is leaked,
|
This means that if your private decryption key is leaked,
|
||||||
@@ -1389,12 +1680,9 @@ Otherwise, someone obtaining your decryption keys
|
|||||||
is typically also able to get all your non-deleted messages
|
is typically also able to get all your non-deleted messages
|
||||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||||
|
|
||||||
<p>We designed a Forward Secrecy approach that withstood
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
initial examination from some cryptographers and implementation experts
|
will provide reliable deletion (forward secrecy) through automatic key rotation.
|
||||||
but is pending a more formal write up
|
This approach is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
|
||||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
|
||||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
|
||||||
|
|
||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
@@ -1404,12 +1692,13 @@ which would make it available in all <a href="https://chatmail.at/clients">chatm
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
||||||
|
Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
in collaboration with other OpenPGP implementers.</p>
|
|
||||||
|
|
||||||
<h3 id="how-can-i-manually-check-encryption-information">
|
<h3 id="how-can-i-manually-check-encryption-information">
|
||||||
|
|
||||||
@@ -1486,7 +1775,7 @@ Lees <a href="https://delta.chat/en/2023-05-22-webxdc-security">hier het volledi
|
|||||||
<li>
|
<li>
|
||||||
<p>Aan het begin van 2023 heeft <a href="https://cure53.de">Cure53</a> de transportversleuteling van
|
<p>Aan het begin van 2023 heeft <a href="https://cure53.de">Cure53</a> de transportversleuteling van
|
||||||
Delta Chats netwerkverbindingen getest, evenals de e-mailserveropzet zoals
|
Delta Chats netwerkverbindingen getest, evenals de e-mailserveropzet zoals
|
||||||
<a href="https://delta.chat/nl/serverguide">beschreven op onze site</a>.
|
<a href="https://delta.chat/serverguide">beschreven op onze site</a>.
|
||||||
Meer informatie over deze test is te lezen <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">op ons blog</a>
|
Meer informatie over deze test is te lezen <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">op ons blog</a>
|
||||||
of in het <a href="https://delta.chat/assets/blog/MER-01-report.pdf">volledige verslag</a>.</p>
|
of in het <a href="https://delta.chat/assets/blog/MER-01-report.pdf">volledige verslag</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -1587,44 +1876,6 @@ op basis van vrije en opensource-gemeenschapsontwikkelingen.</p>
|
|||||||
ordered chronologically:</p>
|
ordered chronologically:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
|
||||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
|
||||||
and implementation of verified groups and setup contact protocols
|
|
||||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
|
||||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> heeft twee subsidies toegekend.
|
|
||||||
De eerste subsidie, voor 2018/2019, ter waarde van ong. $200,000, heeft enorm geholpen om de Android-app
|
|
||||||
te verbeteren en een bètaversie van de computerclient vrij te geven.
|
|
||||||
Verder hebben we onderzoek kunnen doen naar het uiterlijk in relatie tot mensenrechten -
|
|
||||||
bekijk onze conclusie hier: <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
|
||||||
De tweede subsidie, voor 2019/2020, ter waarde van ong. $300,000, loopt nog en ondersteunt ons bij het
|
|
||||||
vrijgeven van de iOS-client, het overzetten van de code van de kernbibliotheek naar Rust en
|
|
||||||
het implementeren van nieuwe functies op alle platformen.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
|
||||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
|
||||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
|
||||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
|
||||||
This funding supported our long-running goals to make Delta Chat more usable
|
|
||||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
|
||||||
in places often affected by internet censorship and shutdowns.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>2023-2024 we successfully completed the OTF-funded
|
|
||||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
|
||||||
allowing us to introduce guaranteed encryption,
|
|
||||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
|
||||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||||
@@ -1634,6 +1885,30 @@ along with collaboration partners working on
|
|||||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||||
|
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||||
|
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||||
|
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||||
|
and released a first Desktop app beta version, and which moreover
|
||||||
|
moored our feature developments in UX research in human rights contexts,
|
||||||
|
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||||
|
The second 2019/2020 grant (~$300K) helped us to
|
||||||
|
release Delta/iOS versions, to convert our core library to Rust, and
|
||||||
|
to provide new features for all platforms.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||||
|
and implementation of verified groups and setup contact protocols
|
||||||
|
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||||
|
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Soms ontvangen we eenmalige donaties van privépersonen, waar we
|
<p>Soms ontvangen we eenmalige donaties van privépersonen, waar we
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<li><a href="#howtoe2ee">Как найти людей для общения?</a></li>
|
<li><a href="#howtoe2ee">Как найти людей для общения?</a></li>
|
||||||
<li><a href="#почему-чат-помечен-как-запрос">Почему чат помечен как “Запрос”?</a></li>
|
<li><a href="#почему-чат-помечен-как-запрос">Почему чат помечен как “Запрос”?</a></li>
|
||||||
<li><a href="#как-я-могу-связать-двух-своих-друзей-друг-с-другом">Как я могу связать двух своих друзей друг с другом?</a></li>
|
<li><a href="#как-я-могу-связать-двух-своих-друзей-друг-с-другом">Как я могу связать двух своих друзей друг с другом?</a></li>
|
||||||
<li><a href="#поддерживает-ли-delta-chat-изображения-видео-и-другие-вложения">Поддерживает ли Delta Chat изображения, видео и другие вложения?</a></li>
|
|
||||||
<li><a href="#multiple-accounts">Что такое профили? Как я могу переключатся между ними?</a></li>
|
<li><a href="#multiple-accounts">Что такое профили? Как я могу переключатся между ними?</a></li>
|
||||||
<li><a href="#кто-видит-изображение-моего-профиля">Кто видит изображение моего профиля?</a></li>
|
<li><a href="#кто-видит-изображение-моего-профиля">Кто видит изображение моего профиля?</a></li>
|
||||||
<li><a href="#signature">Могу ли я установить статус/подпись в Delta Chat?</a></li>
|
<li><a href="#signature">Могу ли я установить статус/подпись в Delta Chat?</a></li>
|
||||||
@@ -14,8 +13,9 @@
|
|||||||
<li><a href="#что-означает-зеленая-точка">Что означает зеленая точка?</a></li>
|
<li><a href="#что-означает-зеленая-точка">Что означает зеленая точка?</a></li>
|
||||||
<li><a href="#что-означают-галочки-рядом-с-исходящими-сообщениями">Что означают галочки рядом с исходящими сообщениями?</a></li>
|
<li><a href="#что-означают-галочки-рядом-с-исходящими-сообщениями">Что означают галочки рядом с исходящими сообщениями?</a></li>
|
||||||
<li><a href="#edit">Исправление опечаток и удаление сообщений после отправки</a></li>
|
<li><a href="#edit">Исправление опечаток и удаление сообщений после отправки</a></li>
|
||||||
|
<li><a href="#mediaquality">Как обеспечивается качество мультимедиа?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">Как работают исчезающие сообщения?</a></li>
|
<li><a href="#ephemeralmsgs">Как работают исчезающие сообщения?</a></li>
|
||||||
<li><a href="#delold">Что произойдет, если я включу функцию “Удалять старые сообщения с устройства”?</a></li>
|
<li><a href="#delold">Что произойдет, если я включу функцию “Удалять сообщения с устройства”?</a></li>
|
||||||
<li><a href="#remove-account">Как удалить свой профиль в чате?</a></li>
|
<li><a href="#remove-account">Как удалить свой профиль в чате?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -26,6 +26,22 @@
|
|||||||
<li><a href="#я-случайно-удалил-самого-себя">Я случайно удалил самого себя.</a></li>
|
<li><a href="#я-случайно-удалил-самого-себя">Я случайно удалил самого себя.</a></li>
|
||||||
<li><a href="#я-больше-не-хочу-получать-сообщения-группы">Я больше не хочу получать сообщения группы.</a></li>
|
<li><a href="#я-больше-не-хочу-получать-сообщения-группы">Я больше не хочу получать сообщения группы.</a></li>
|
||||||
<li><a href="#клонирование-группы">Клонирование группы</a></li>
|
<li><a href="#клонирование-группы">Клонирование группы</a></li>
|
||||||
|
<li><a href="#сколько-участников-может-быть-в-одной-группе">Сколько участников может быть в одной группе?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#channels">Каналы</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#подписка-на-канал">Подписка на канал</a></li>
|
||||||
|
<li><a href="#создание-канала">Создание канала</a></li>
|
||||||
|
<li><a href="#какое-максимальное-количество-подписчиков-может-быть-у-канала">Какое максимальное количество подписчиков может быть у канала?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Звонки</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#как-сделать-звонок">Как сделать звонок</a></li>
|
||||||
|
<li><a href="#принять-или-отклонить-вызов">Принять или отклонить вызов</a></li>
|
||||||
|
<li><a href="#во-время-звонка">Во время звонка</a></li>
|
||||||
|
<li><a href="#пропущенные-вызовы-и-уведомления">Пропущенные вызовы и уведомления</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">Встроенные приложения чата</a>
|
<li><a href="#webxdc">Встроенные приложения чата</a>
|
||||||
@@ -54,11 +70,12 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#расширенные">Расширенные</a>
|
<li><a href="#расширенные">Расширенные</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#экспериментальные-функции">Экспериментальные функции</a></li>
|
<li><a href="#experiments">Экспериментальные функции</a></li>
|
||||||
<li><a href="#statssending">Что означает “Отправлять статистику разработчикам Delta Chat”?</a></li>
|
<li><a href="#relays">Что такое релеи chatmail?</a></li>
|
||||||
<li><a href="#могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat">Могу ли я использовать обычный адрес электронной почты с Delta Chat?</a></li>
|
<li><a href="#могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat">Могу ли я использовать обычный адрес электронной почты с Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">Как настроить профиль чата с использованием классического адреса электронной почты в качестве транспорта?</a></li>
|
<li><a href="#classic-email">Как настроить профиль чата с использованием классического адреса электронной почты в качестве релея?</a></li>
|
||||||
<li><a href="#я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете">Я хочу управлять своим собственным сервером для Delta Chat. Что вы посоветуете?</a></li>
|
<li><a href="#я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете">Я хочу управлять своим собственным сервером для Delta Chat. Что вы посоветуете?</a></li>
|
||||||
|
<li><a href="#statssending">Что означает “Отправлять статистику разработчикам Delta Chat”?</a></li>
|
||||||
<li><a href="#меня-интересуют-технические-детали-можете-рассказать-больше">Меня интересуют технические детали. Можете рассказать больше?</a></li>
|
<li><a href="#меня-интересуют-технические-детали-можете-рассказать-больше">Меня интересуют технические детали. Можете рассказать больше?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -75,6 +92,7 @@
|
|||||||
<li><a href="#tls">Видны ли в Интернете сообщения, отмеченные значком почты?</a></li>
|
<li><a href="#tls">Видны ли в Интернете сообщения, отмеченные значком почты?</a></li>
|
||||||
<li><a href="#message-metadata">Как Delta Chat защищает метаданные в сообщениях?</a></li>
|
<li><a href="#message-metadata">Как Delta Chat защищает метаданные в сообщениях?</a></li>
|
||||||
<li><a href="#device-seizure">Как защитить метаданные и контакты при изъятии устройства?</a></li>
|
<li><a href="#device-seizure">Как защитить метаданные и контакты при изъятии устройства?</a></li>
|
||||||
|
<li><a href="#кто-видит-мой-ip-адрес">Кто видит мой IP-адрес?</a></li>
|
||||||
<li><a href="#sealedsender">Поддерживает ли Delta Chat функцию “Sealed Sender” (Засекреченный отправитель)?</a></li>
|
<li><a href="#sealedsender">Поддерживает ли Delta Chat функцию “Sealed Sender” (Засекреченный отправитель)?</a></li>
|
||||||
<li><a href="#pfs">Поддерживает ли Delta Chat свойство Perfect forward secrecy, PFS (Совершенную прямую секретность)?</a></li>
|
<li><a href="#pfs">Поддерживает ли Delta Chat свойство Perfect forward secrecy, PFS (Совершенную прямую секретность)?</a></li>
|
||||||
<li><a href="#pqc">Поддерживает ли Delta Chat Post-Quantum-Cryptography (Постквантовую криптографию)?</a></li>
|
<li><a href="#pqc">Поддерживает ли Delta Chat Post-Quantum-Cryptography (Постквантовую криптографию)?</a></li>
|
||||||
@@ -184,7 +202,8 @@
|
|||||||
<p>Поскольку это приватный мессенджер,
|
<p>Поскольку это приватный мессенджер,
|
||||||
писать вам могут только друзья и члены семьи, с которыми вы <a href="#howtoe2ee">поделились QR-кодом или ссылкой-приглашением.</a></p>
|
писать вам могут только друзья и члены семьи, с которыми вы <a href="#howtoe2ee">поделились QR-кодом или ссылкой-приглашением.</a></p>
|
||||||
|
|
||||||
<p>Ваши друзья могут поделиться вашим контактом с другими друзьями, это отображается как <strong>запрос</strong>.</p>
|
<p>Ваши друзья могут поделиться вашим контактом с другими друзьями,
|
||||||
|
это отображается как <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Запрос</b></p>
|
||||||
|
|
||||||
<p>— Нужно <strong>принять</strong> запрос, прежде чем ответить.</p>
|
<p>— Нужно <strong>принять</strong> запрос, прежде чем ответить.</p>
|
||||||
|
|
||||||
@@ -210,24 +229,6 @@
|
|||||||
<p>Второй контакт получит <strong>карточку</strong>
|
<p>Второй контакт получит <strong>карточку</strong>
|
||||||
на которую можно нажать, чтобы начать общение с первым контактом.</p>
|
на которую можно нажать, чтобы начать общение с первым контактом.</p>
|
||||||
|
|
||||||
<h3 id="поддерживает-ли-delta-chat-изображения-видео-и-другие-вложения">
|
|
||||||
|
|
||||||
|
|
||||||
Поддерживает ли Delta Chat изображения, видео и другие вложения? <a href="#поддерживает-ли-delta-chat-изображения-видео-и-другие-вложения" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Да. Изображения, видео, файлы, голосовые сообщения и т.д. можно отправлять с помощью кнопок <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Вложение</strong>
|
|
||||||
или <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Голосовое сообщение</strong>.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Для лучшей производительности изображения по умолчанию оптимизируются и отправляются в меньшем размере, но вы можете отправить их как “файл”, чтобы сохранить оригинал.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
|
|
||||||
@@ -257,16 +258,11 @@
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Вы можете добавить изображение профиля в настройках. Если вы пишете своим контактам
|
<p>Вы можете добавить изображение профиля в настройках. Если вы пишете своим контактам
|
||||||
или добавляете их с помощью QR-кода, они автоматически видят его как изображение вашего профиля.</p>
|
или добавляете их с помощью QR-кода, они автоматически видят его как изображение вашего профиля.</p>
|
||||||
</li>
|
|
||||||
<li>
|
<p>По соображениям конфиденциальности, никто не увидит изображение вашего профиля, пока вы не напишете
|
||||||
<p>По соображениям конфиденциальности, никто не увидит изображение вашего профиля,
|
им сообщение.</p>
|
||||||
пока вы не напишете им сообщение.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
@@ -300,7 +296,8 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Отправить в архив</strong> необходимо, если вы не хотите больше видеть их в списке чатов.
|
<p><strong>Отправить в архив</strong> необходимо, если вы не хотите больше видеть их в списке чатов.
|
||||||
Архивные чаты остаются доступными над списком чатов или через поиск.</p>
|
Архивные чаты остаются доступными над списком чатов или через поиск
|
||||||
|
и будут отмечены как <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Архивировано</b></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Когда в чат, находящийся в архиве, приходит новое сообщение, если не включена опция <strong>Отключить уведомления</strong>, он <strong>Возвращается из архива</strong> в ваш список чатов.
|
<p>Когда в чат, находящийся в архиве, приходит новое сообщение, если не включена опция <strong>Отключить уведомления</strong>, он <strong>Возвращается из архива</strong> в ваш список чатов.
|
||||||
@@ -335,7 +332,7 @@
|
|||||||
вы можете вернуться к этому сообщению в исходном чате</p>
|
вы можете вернуться к этому сообщению в исходном чате</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Наконец, вы также можете использовать “Сохраненные сообщения” для создания <strong>личных заметок</strong> - откройте чат, введите что-то, добавьте фото или голосовое сообщение и т.д.</p>
|
<p>Наконец, вы можете использовать “Сохраненные сообщения”, для создания <strong>личных заметок</strong> - откройте чат, напечатайте что-нибудь, добавьте фото или голосовое сообщение и т.д.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Поскольку “Сохраненные сообщения” синхронизируются, они могут стать удобным способом передачи данных между устройствами</p>
|
<p>Поскольку “Сохраненные сообщения” синхронизируются, они могут стать удобным способом передачи данных между устройствами</p>
|
||||||
@@ -371,23 +368,19 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Одна галочка</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>Одна галочка</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
означает, что сообщение было успешно отправлено вашему провайдеру.</p>
|
означает, что сообщение успешно отправлено на <a href="#relays">релей</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Две галочки</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Две галочки</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
означают, что по крайней мере одно устройство получателя
|
указывают на то, что ваш контакт прочитал сообщение.</p>
|
||||||
сообщило об успешном получении сообщения.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Получатели могли отключить подтверждения прочтения,
|
|
||||||
поэтому даже если вы видите только одну галочку, сообщение могло быть прочитано.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>И наоборот, две галочки не обязательно означают
|
|
||||||
что человек прочитал или понял сообщение ;)</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>В <a href="#groups">группах</a> вторая галочка означает, что хотя бы один из участников подтвердил прочтение сообщения.</p>
|
||||||
|
|
||||||
|
<p>Вторая галочка появится только в том случае, если у вас и хотя бы одного из получателей, прочитавшего сообщение,
|
||||||
|
включена опция <strong>Настройки → Чаты → Уведомление о прочтении</strong>.</p>
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
|
|
||||||
@@ -415,6 +408,32 @@
|
|||||||
<p>Обратите внимание, что исходное сообщение все еще может быть получено участниками чата
|
<p>Обратите внимание, что исходное сообщение все еще может быть получено участниками чата
|
||||||
которые могли уже ответить, переслать, сохранить, сделать скриншот или иным образом скопировать сообщение.</p>
|
которые могли уже ответить, переслать, сохранить, сделать скриншот или иным образом скопировать сообщение.</p>
|
||||||
|
|
||||||
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
|
Как обеспечивается качество мультимедиа? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Изображения, видео, файлы, голосовые сообщения и т.д. можно отправлять с помощью кнопок <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Вложение</strong>
|
||||||
|
или <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Голосовое сообщение</strong>.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>По умолчанию сжатие обеспечивает <strong>быструю и эффективную доставку</strong> сообщений, учитывая ограничения по объему данных и хранилищу у всех пользователей.
|
||||||
|
Это идеально подходит для повседневного общения.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>В регионах с плохим качеством связи,
|
||||||
|
вы можете выбрать более высокую степень сжатия в меню <strong>Настройки → Чаты → Качество отправляемых медиафайлов</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Если вам необходимо отправить мультимедийный файл в <strong>исходном качестве</strong>, используйте значок <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Прикрепить → Файл</strong> в чате.
|
||||||
|
Используйте этот метод с осторожностью, так как отправка файлов в исходном качестве значительно увеличит объем трафика как для вас, так и для всех участников чата.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3 id="ephemeralmsgs">
|
<h3 id="ephemeralmsgs">
|
||||||
|
|
||||||
|
|
||||||
@@ -451,18 +470,18 @@
|
|||||||
<h3 id="delold">
|
<h3 id="delold">
|
||||||
|
|
||||||
|
|
||||||
Что произойдет, если я включу функцию “Удалять старые сообщения с устройства”? <a href="#delold" class="anchor"></a>
|
Что произойдет, если я включу функцию “Удалять сообщения с устройства”? <a href="#delold" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Если вы хотите сэкономить место на устройстве, можно выбрать функцию автоматического удаления старых
|
||||||
<li>Если вы хотите сэкономить место на устройстве, вы можете выбрать
|
сообщений.</p>
|
||||||
автоматическое удаление старых сообщений.</li>
|
|
||||||
<li>Чтобы включить эту функцию, перейдите в “Удалять сообщения с устройства” в настройках “Чаты и медиафайлы”
|
<p>Чтобы включить эту функцию, перейдите в <strong>Настройки → Чаты → Удалять сообщения с устройства</strong>.
|
||||||
Вы можете установить период от “Через 1 час” до “Через 1 год”;
|
Вы можете установить временные рамки от “через 1 час” до “через 1 год”;
|
||||||
Таким образом, <em>все</em> сообщения будут удалены с устройства, как только они станут старше выбранного срока.</li>
|
Таким образом, <em>все</em> сообщения будут удаляться с вашего устройства, как только они станут
|
||||||
</ul>
|
старше выбранного срока.</p>
|
||||||
|
|
||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
@@ -510,9 +529,15 @@
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Выберите <strong>Новый чат</strong>, а затем <strong>Новая группа</strong> из меню в правом верхнем углу или нажмите соответствующую кнопку на Android/iOS.</li>
|
<li>
|
||||||
<li>На следующем экране выберите <strong>участников</strong> и придумайте <strong>название группы</strong>. Вы также можете выбрать <strong>изображение группы</strong>.</li>
|
<p>Выберите <strong>Новый чат</strong>, а затем <strong>Новая группа</strong> из меню в правом верхнем углу или нажмите соответствующую кнопку на Android/iOS.</p>
|
||||||
<li>Как только вы напишете <strong>первое сообщение</strong> в группе, все участники будут проинформированы о новой группе и смогут ответить. (Пока вы не напишете сообщение в группе, группа будет невидима для участников).</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>На следующем экране выберите <strong>участников группы</strong> и придумайте <strong>название группы</strong>. Вы также можете выбрать <strong>аватар группы</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Как только вы напишете <strong>первое сообщение</strong> в группе, все участники будут проинформированы о новой группе и смогут ответить. (Пока вы не напишете сообщение в группе, группа будет невидима для участников).</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
@@ -523,11 +548,10 @@
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
<p>Все участники группы имеют <strong>одинаковые права</strong>.
|
||||||
|
Поэтому каждый может удалить любого участника или добавить нового.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
|
||||||
<p>У всех участников группы <strong>одинаковые права</strong>.
|
|
||||||
Поэтому каждый может удалить любого участника или добавить новых.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<p>Чтобы <strong>добавлять или удалять участников</strong>, коснитесь названия группы в чате и выберите участника, которого нужно добавить или удалить.</p>
|
<p>Чтобы <strong>добавлять или удалять участников</strong>, коснитесь названия группы в чате и выберите участника, которого нужно добавить или удалить.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -555,10 +579,8 @@
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Поскольку вы больше не являетесь участником группы, вы не можете добавить себя снова.
|
||||||
<li>Поскольку вы больше не являетесь участником группы, вы не можете добавлять себя снова.
|
Однако, это не проблема, просто попросите любого другого участника группы в обычном чате добавить вас снова.</p>
|
||||||
Однако, это не проблема, просто попросите любого другого участника группы в обычном чате добавить вас снова.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="я-больше-не-хочу-получать-сообщения-группы">
|
<h3 id="я-больше-не-хочу-получать-сообщения-группы">
|
||||||
|
|
||||||
@@ -569,15 +591,13 @@
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Либо удалите себя из списка участников, либо удалите весь чат.
|
||||||
<p>Либо удалите себя из списка участников, либо удалите весь чат.
|
Если позже вы снова захотите присоединиться к группе, попросите другого участника группы добавить вас.</li>
|
||||||
Если позже вы снова захотите присоединиться к группе, попросите другого участника группы добавить вас.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Или, вместо этого, вы можете “отключить уведомления” для группы — это означает, что вы будете получать все сообщения и сможете их писать, но больше не будете получать уведомления о новых сообщениях.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>Или, вместо этого, вы можете “отключить уведомления” для группы - в этом случае вы будете получать все сообщения и
|
||||||
|
можете их писать, но больше не будете получать уведомления о новых сообщениях.</p>
|
||||||
|
|
||||||
<h3 id="клонирование-группы">
|
<h3 id="клонирование-группы">
|
||||||
|
|
||||||
|
|
||||||
@@ -602,6 +622,212 @@
|
|||||||
<p>Новая группа <strong>полностью независима</strong> от исходной,
|
<p>Новая группа <strong>полностью независима</strong> от исходной,
|
||||||
которая продолжает работать как прежде.</p>
|
которая продолжает работать как прежде.</p>
|
||||||
|
|
||||||
|
<h3 id="сколько-участников-может-быть-в-одной-группе">
|
||||||
|
|
||||||
|
|
||||||
|
Сколько участников может быть в одной группе? <a href="#сколько-участников-может-быть-в-одной-группе" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Строгого технического ограничения нет,
|
||||||
|
но не рекомендуется создавать группы больше 150 участников.</p>
|
||||||
|
|
||||||
|
<p>По мере увеличения размера групп они могут стать социально нестабильными и потребовать иерархии,
|
||||||
|
в то время как Delta Chat - это приватный мессенджер для общения на <a href="#groups">равных правах</a>.
|
||||||
|
Смотрите <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">число Данбара</a> для более глубокого понимания.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Каналы <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Каналы представляют собой инструмент типа “один-ко-многим” для трансляции сообщений.</p>
|
||||||
|
|
||||||
|
<h3 id="подписка-на-канал">
|
||||||
|
|
||||||
|
|
||||||
|
Подписка на канал <a href="#подписка-на-канал" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Отсканируйте <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR-код</strong>
|
||||||
|
или нажмите на ссылку-приглашение, которую вы получили от владельца канала.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Всё готово!
|
||||||
|
Сначала вы получите несколько сообщений из истории канала,
|
||||||
|
а затем — все новые сообщения, поступающие в него.</p>
|
||||||
|
|
||||||
|
<p><strong>Не беспокойтесь,</strong> если это произойдет не сразу.
|
||||||
|
Как только владелец канала выйдет в сеть, ваш запрос на вступление будет обработан.</p>
|
||||||
|
|
||||||
|
<p>Как и весь Delta Chat, каналы являются приватными и децентрализованными,
|
||||||
|
поэтому возможность публичного поиска каналов отсутствует.</p>
|
||||||
|
|
||||||
|
<p>Другие подписчики канала не увидят факта вашей подписки и не смогут отправлять вам сообщения.
|
||||||
|
Однако, владелец канала сможет отправить вам сообщение.
|
||||||
|
Также он будет видеть, что вы прочитали сообщение, если только вы не отключите подтверждение о прочтении.</p>
|
||||||
|
|
||||||
|
<p>Если вы не хотите использовать свой основной профиль,
|
||||||
|
вы можете создать <a href="#multiple-accounts">специальный профиль</a> для подписки на канал.</p>
|
||||||
|
|
||||||
|
<h3 id="создание-канала">
|
||||||
|
|
||||||
|
|
||||||
|
Создание канала <a href="#создание-канала" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Нажмите <strong>Новый чат</strong> и выберите <strong>Новый канал</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Введите <strong>название</strong>, по желанию добавьте <strong>изображение</strong> и <strong>описание</strong>, а затем нажмите кнопку <strong>Создать</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Теперь вы можете отправлять сообщения и управлять ими в обычном режиме.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>В профиле канала вы можете <strong>поделиться QR-кодом или ссылкой-приглашением с другими пользователями</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Подписчики будут получать ваши сообщения,
|
||||||
|
но не смогут отправлять сообщения в вашем канале.
|
||||||
|
При подписке они получат <strong>несколько последних сообщений из истории канала</strong>.</p>
|
||||||
|
|
||||||
|
<p>Рядом с каждым сообщением вы можете увидеть <strong>количество просмотров</strong>.
|
||||||
|
Обратите внимание, что учитываются только те подписчики, у которых включены уведомления о прочтении,
|
||||||
|
поэтому реальное количество просмотров может быть больше.</p>
|
||||||
|
|
||||||
|
<h3 id="какое-максимальное-количество-подписчиков-может-быть-у-канала">
|
||||||
|
|
||||||
|
|
||||||
|
Какое максимальное количество подписчиков может быть у канала? <a href="#какое-максимальное-количество-подписчиков-может-быть-у-канала" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Каналы предназначены для гораздо более широкой аудитории, чем <a href="#groups">группы</a>.</p>
|
||||||
|
|
||||||
|
<p>Практический предел зависит от используемого <a href="#relays">релея</a>,
|
||||||
|
поэтому не существует единого фиксированного значения, применимого во всех случаях.</p>
|
||||||
|
|
||||||
|
<p>Для крайне крупных каналов с десятками тысяч подписчиков,
|
||||||
|
мы рекомендуем использовать <a href="#multiple-accounts">специальный профиль</a> для управления каналом,
|
||||||
|
а также предварительно проверить пригодность релея.</p>
|
||||||
|
|
||||||
|
<p>Не стоит опасаться: архитектура Delta Chat позволяет использовать любой релей (relay-agnostic),
|
||||||
|
поэтому вы можете легко изменить его в любой момент -
|
||||||
|
ваши текущие подписчики этого даже не заметят.
|
||||||
|
В этом случае достаточно будет обновить ссылку-приглашение, которую вы передаёте новым пользователям.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Звонки <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat поддерживает <strong>аудио-</strong> и <strong>видеозвонки</strong> в режиме “один-на-один”.</p>
|
||||||
|
|
||||||
|
<p>Звонки работают на ПК, Ubuntu Touch, iOS и Android версии 8 и новее.</p>
|
||||||
|
|
||||||
|
<h3 id="как-сделать-звонок">
|
||||||
|
|
||||||
|
|
||||||
|
Как сделать звонок <a href="#как-сделать-звонок" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>В чате “один-на-один” нажмите на 📞 <strong>значок вызова</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Откроется небольшое меню
|
||||||
|
в котором вы сможете выбрать вид связи <strong>аудио-</strong> или <strong>видеозвонок</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="принять-или-отклонить-вызов">
|
||||||
|
|
||||||
|
|
||||||
|
Принять или отклонить вызов <a href="#принять-или-отклонить-вызов" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>При входящем звонке,
|
||||||
|
Delta Chat показывает <strong>экран входящего вызова</strong> или уведомление.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Нажмите <strong>Принять</strong> чтобы ответить
|
||||||
|
или <strong>Отклонить</strong> чтобы сбросить звонок.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="во-время-звонка">
|
||||||
|
|
||||||
|
|
||||||
|
Во время звонка <a href="#во-время-звонка" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Вы можете <strong>отключить</strong> звук микрофона.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Вы можете <strong>включить или выключить камеру</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>На мобильных устройствах можно <strong>переключаться между фронтальной и основной камерами</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>В зависимости от устройства вы можете выбрать источник аудиовыхода или использовать режим “картинка в картинке”.
|
||||||
|
В приложении для ПК звонок осуществляется в отдельном окне,
|
||||||
|
что позволяет продолжать работу в основном окне Delta Chat в обычном режиме.</p>
|
||||||
|
|
||||||
|
<h3 id="пропущенные-вызовы-и-уведомления">
|
||||||
|
|
||||||
|
|
||||||
|
Пропущенные вызовы и уведомления <a href="#пропущенные-вызовы-и-уведомления" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Если вы не ответите на звонок, не услышите сигнал или ваше устройство будет недоступно,
|
||||||
|
вызов отобразится как <strong>пропущенный</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Только ваши подтвержденные контакты</strong> могут заставить ваше устройство звонить.
|
||||||
|
Запросы на добавление в контакты будут приходить как обычно, но вызова не будет.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>В разделе <strong>Настройки → Уведомления → Звонки</strong>,
|
||||||
|
вы можете полностью отключить специальный экран входящего вызова.
|
||||||
|
Если вы это сделаете, никакие уведомления о звонках не будут вас беспокоить;
|
||||||
|
при этом вы всё равно сможете принять звонок, нажав на иконку сообщения о входящем звонке в соответствующем чате.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -643,7 +869,7 @@
|
|||||||
<p>Встроенные приложения не могут отправлять данные в Интернет или что-либо загружать.</p>
|
<p>Встроенные приложения не могут отправлять данные в Интернет или что-либо загружать.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Встроенное приложение может обмениваться данными только внутри чата Delta Chat с его
|
<p>Встроенное приложение может обмениваться данными только в рамках этого чата с его
|
||||||
копиями на устройствах ваших собеседников. В остальном оно полностью
|
копиями на устройствах ваших собеседников. В остальном оно полностью
|
||||||
изолировано от Интернета.</p>
|
изолировано от Интернета.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -889,9 +1115,9 @@ Push-уведомления автоматически активируются
|
|||||||
<p>Перепроверьте, что оба устройства находятся <strong>в одной Wi-Fi или локальной сети</strong>.</p>
|
<p>Перепроверьте, что оба устройства находятся <strong>в одной Wi-Fi или локальной сети</strong>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>В <strong>Windows</strong> перейдите в <strong>Панель управления / Сеть и Интернет</strong>
|
<p>В <strong>Windows</strong> перейдите в “Панель управления / Сеть и Интернет”
|
||||||
и убедитесь, что в качестве “Типа сетевого профиля” выбрана <strong>Частная сеть</strong>.
|
и убедитесь, что в качестве “Типа сетевого профиля” выбрана <strong>Частная сеть</strong>.
|
||||||
(после передачи, вы можете изменить обратно на исходное значение)</p>
|
(после передачи можно вернуть исходное значение)</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>На <strong>iOS</strong>, убедитесь, что предоставлен доступ “Настройки системы / Приложения / Delta Chat / <strong>Локальная сеть</strong>”</p>
|
<p>На <strong>iOS</strong>, убедитесь, что предоставлен доступ “Настройки системы / Приложения / Delta Chat / <strong>Локальная сеть</strong>”</p>
|
||||||
@@ -941,23 +1167,22 @@ Push-уведомления автоматически активируются
|
|||||||
<p>Этот метод рекомендуется использовать только в том случае, если функция “Добавить второе устройство”, описанная выше, не работает.</p>
|
<p>Этот метод рекомендуется использовать только в том случае, если функция “Добавить второе устройство”, описанная выше, не работает.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>На старом устройстве, перейдите в “Настройки -> Чаты и медиафайлы -> Экспорт резервной копии”. Введите свой
|
<li>
|
||||||
PIN-код разблокировки экрана, графический ключ или пароль. Затем вы можете нажать “Начать
|
<p>На старом устройстве перейдите в <strong>Настройки → Чаты → Экспорт резервной копии</strong>. Введите свой
|
||||||
|
PIN-код разблокировки экрана, графический ключ или пароль. Затем нажмите на кнопку “Начать
|
||||||
резервное копирование”. Это сохранит файл резервной копии на вашем устройстве. Теперь вам нужно передать
|
резервное копирование”. Это сохранит файл резервной копии на вашем устройстве. Теперь вам нужно передать
|
||||||
его на другое устройство каким-то образом.</li>
|
его на другое устройство каким-то образом.</p>
|
||||||
<li>На новом устройстве, в меню “У меня уже есть профиль”,
|
</li>
|
||||||
выберите “Восстановить из резервной копии”. После импорта, ваши чаты, ключи
|
<li>
|
||||||
шифрования, медиафайлы будут скопированы на новое устройство.
|
<p>На новом устройстве выберите <strong>У меня уже есть профиль → Восстановить из резервной копии</strong>.
|
||||||
<ul>
|
Если вы используете iOS: и у вас возникли трудности,
|
||||||
<li><strong>Если вы используете iOS:</strong> и у вас возникли трудности, возможно,
|
возможно, <a href="https://support.delta.chat/t/import-backup-to-ios/1628">это руководство</a> поможет вам.</p>
|
||||||
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">это руководство</a>
|
|
||||||
поможет вам.</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
</li>
|
||||||
<li>Теперь вы синхронизированы и можете использовать оба устройства для отправки и получения
|
|
||||||
зашифрованных сквозным шифрованием сообщений с вашими собеседниками.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>Теперь вы синхронизированы и можете использовать оба устройства для отправки и получения
|
||||||
|
зашифрованных сквозным шифрованием сообщений с вашими собеседниками.</p>
|
||||||
|
|
||||||
<h3 id="есть-ли-какие-либо-планы-по-внедрению-веб-клиента-delta-chat">
|
<h3 id="есть-ли-какие-либо-планы-по-внедрению-веб-клиента-delta-chat">
|
||||||
|
|
||||||
|
|
||||||
@@ -985,10 +1210,10 @@ PIN-код разблокировки экрана, графический кл
|
|||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<h3 id="экспериментальные-функции">
|
<h3 id="experiments">
|
||||||
|
|
||||||
|
|
||||||
Экспериментальные функции <a href="#экспериментальные-функции" class="anchor"></a>
|
Экспериментальные функции <a href="#experiments" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1001,6 +1226,113 @@ PIN-код разблокировки экрана, графический кл
|
|||||||
<p>Вы можете найти дополнительную информацию
|
<p>Вы можете найти дополнительную информацию
|
||||||
и оставить отзыв на <a href="https://support.delta.chat">Форуме</a>.</p>
|
и оставить отзыв на <a href="https://support.delta.chat">Форуме</a>.</p>
|
||||||
|
|
||||||
|
<h3 id="relays">
|
||||||
|
|
||||||
|
|
||||||
|
Что такое релеи chatmail? <a href="#relays" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Релеи используются для временного хранения сообщений, если ваше устройство не в сети.
|
||||||
|
Релеи - это недорогие и простые серверы,
|
||||||
|
которые не хранят данные о статусах групп, вашем имени или аватаре, -
|
||||||
|
всё это существует только на вашем устройстве.
|
||||||
|
Релеи управляются разными группами и людьми.</p>
|
||||||
|
|
||||||
|
<p>По умолчанию, после установки, релей <strong>настраивается автоматически</strong>,
|
||||||
|
поэтому вам не нужно об этом волноваться.
|
||||||
|
Однако, если хотите,
|
||||||
|
вы можете настроить релеи в меню <strong>Настройки → Дополнительно → Релеи</strong>:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Вы можете <strong>добавить</strong> релей, отсканировав его QR-код;
|
||||||
|
на сайте <a href="https://chatmail.at/relays">chatmail.at/relays</a> представлен список известных.
|
||||||
|
Если у вас настроено несколько релеев, сообщения будут доставляться через все из них.
|
||||||
|
Ваши контакты автоматически узнают о текущих используемых вами релеях при обмене сообщениями.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Нажмите на релей, чтобы установить его как <strong>используемый для отправки</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Если вы <strong>удалите</strong> релей,
|
||||||
|
контакты, которые знают только этот релей, не смогут связаться с вами до тех пор, пока вы снова не напишите им.
|
||||||
|
Чтобы оставаться на связи в это время, выберите опцию <strong>Скрыть из контактов</strong> во всплывающем окне
|
||||||
|
вместо того, чтобы удалять его сразу.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Чтобы снова <strong>показать</strong> скрытый релей, нажмите на него.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Для получения более подробной информации и ознакомления с будущими возможностями релеев,
|
||||||
|
вы можете следить за обсуждениями на <a href="https://support.delta.chat">Форуме</a>.</p>
|
||||||
|
|
||||||
|
<h3 id="могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat">
|
||||||
|
|
||||||
|
|
||||||
|
Могу ли я использовать обычный адрес электронной почты с Delta Chat? <a href="#могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Да, но только если адрес электронной почты используется исключительно <a href="https://chatmail.at/clients">chatmail клиентами</a>.</p>
|
||||||
|
|
||||||
|
<p>Не поддерживается совместное использование адреса электронной почты с приложениями, не являющимися клиентами chatmail или веб-интерфейсами для работы с почтой,
|
||||||
|
по следующим причинам:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Приложения, не являющиеся клиентами chatmail, в основном не обеспечивают автоматическое сквозное шифрование электронной почты для своих пользователей,
|
||||||
|
тогда как приложения и релеи chatmail повсеместно применяют сквозное шифрование и стандарты безопасности.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Приложения, не являющиеся клиентами chatmail, используют серверы электронной почты в качестве долгосрочного архива сообщений,
|
||||||
|
тогда как клиенты chatmail используют их как релей для мгновенной пересылки сообщений.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Поддержка всего разнообразия классических настроек электронной почты
|
||||||
|
потребует значительных усилий по разработке и сопровождению,
|
||||||
|
а также усложнит повышение устойчивости, надёжности и скорости обмена сообщениями на основе chatmail.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="classic-email">
|
||||||
|
|
||||||
|
|
||||||
|
Как настроить профиль чата с использованием классического адреса электронной почты в качестве релея? <a href="#classic-email" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Прежде всего, <strong>не используйте те же классические адреса электронной почты, которые используются в обычных приложениях для отправки писем</strong>
|
||||||
|
если вы не готовы к зашифрованным сообщениям во входящих,
|
||||||
|
двойным уведомлениям, случайному удалению писем или подобным неудобствам.</p>
|
||||||
|
|
||||||
|
<p>Вы можете настроить адрес электронной почты для чата в разделе <strong>Новый профиль → Использовать другой сервер → Использовать электронную почту как релей</strong>.
|
||||||
|
Обратите внимание, что провайдеры классической почты обычно не поддерживают <a href="#instant-delivery">Push-уведомления</a>
|
||||||
|
и имеют другие ограничения, см. раздел <a href="https://providers.delta.chat">Обзор провайдеров</a>.
|
||||||
|
Chatmail использует INBOX по умолчанию для ретрансляции; убедитесь, что настройки провайдера этому соответствуют.
|
||||||
|
Профиль чата, использующий классический адрес электронной почты, позволяет отправлять и получать незашифрованные сообщения.
|
||||||
|
Эти сообщения и чаты, в которых они появляются, помечаются значком электронной почты
|
||||||
|
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
|
||||||
|
|
||||||
|
<h3 id="я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете">
|
||||||
|
|
||||||
|
|
||||||
|
Я хочу управлять своим собственным сервером для Delta Chat. Что вы посоветуете? <a href="#я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Подойдет любая корректная настройка почтового сервера, за исключением случаев, когда для корректной работы устройств ваших пользователей требуются <a href="#instant-delivery">Push-уведомления</a> Google/Apple.</p>
|
||||||
|
|
||||||
|
<p>Мы обычно рекомендуем <a href="https://chatmail.at/doc/relay/getting_started.html">настроить chatmail релей</a>.
|
||||||
|
<a href="https://chatmail.at">Chatmail</a> — это проект, поддерживаемый сообществом который охватывает как настройку релеев, так
|
||||||
|
и <a href="https://github.com/chatmail/core">основные разработки на Rust</a>
|
||||||
|
которые обеспечивают работу <a href="https://chatmail.at/clients">клиентов chatmail</a> наиболее известным из которых является Delta Chat.</p>
|
||||||
|
|
||||||
<h3 id="statssending">
|
<h3 id="statssending">
|
||||||
|
|
||||||
|
|
||||||
@@ -1022,77 +1354,19 @@ PIN-код разблокировки экрана, графический кл
|
|||||||
<p>Нас интересует, например, следующая статистика:</p>
|
<p>Нас интересует, например, следующая статистика:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Сколько контактов добавляется путём личного сканирования QR-кода?</li>
|
<li>
|
||||||
<li>Какие версии Delta Chat используются?</li>
|
<p>Сколько контактов можно добавить ручным сканированием QR-кода?</p>
|
||||||
<li>Сколько сообщений в незашифрованном виде?</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Какие версии Delta Chat используются?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Какие ошибки возникают у пользователей?</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Мы <em>не</em> собираем какую-либо информацию, позволяющую идентифицировать вас лично.</p>
|
<p>Мы <em>не</em> собираем какую-либо информацию, позволяющую идентифицировать вас лично.</p>
|
||||||
|
|
||||||
<h3 id="могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat">
|
|
||||||
|
|
||||||
|
|
||||||
Могу ли я использовать обычный адрес электронной почты с Delta Chat? <a href="#могу-ли-я-использовать-обычный-адрес-электронной-почты-с-delta-chat" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<p>Да, но только если адрес электронной почты используется исключительно <a href="https://chatmail.at/clients">chatmail клиентами</a>.</p>
|
|
||||||
|
|
||||||
<p>Не поддерживается совместное использование адреса электронной почты с приложениями, не являющимися клиентами chatmail или веб-интерфейсами для работы с почтой,
|
|
||||||
по следующим причинам:</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Приложения, не являющиеся клиентами chatmail, в основном не обеспечивают автоматическое сквозное шифрование электронной почты для своих пользователей,
|
|
||||||
тогда как приложения и релеи chatmail повсеместно применяют сквозное шифрование и стандарты безопасности.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Приложения, не являющиеся клиентами chatmail, используют серверы электронной почты в качестве долгосрочного архива сообщений,
|
|
||||||
тогда как клиенты chatmail используют почтовые серверы для передачи мгновенных сообщений с коротким сроком жизни.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Поддержка всего разнообразия классических настроек электронной почты
|
|
||||||
потребует значительных усилий по разработке и сопровождению,
|
|
||||||
а также усложнит повышение устойчивости, надёжности и скорости обмена сообщениями на основе chatmail.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="classic-email">
|
|
||||||
|
|
||||||
|
|
||||||
Как настроить профиль чата с использованием классического адреса электронной почты в качестве транспорта? <a href="#classic-email" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<p>Прежде всего, <strong>не используйте те же классические адреса электронной почты, которые используются в обычных приложениях для отправки писем</strong>
|
|
||||||
если вы не готовы к зашифрованным сообщениям во входящих,
|
|
||||||
двойным уведомлениям, случайному удалению писем или подобным неудобствам.</p>
|
|
||||||
|
|
||||||
<p>Вы можете настроить адрес электронной почты для чата в разделе <strong>Новый профиль → Использовать другой сервер → Использовать классическую почту в качестве транспорта</strong>.
|
|
||||||
Обратите внимание, что классические почтовые провайдеры обычно не поддерживают <a href="#instant-delivery">Push-уведомления</a>
|
|
||||||
и имеют другие ограничения, см. раздел <a href="https://providers.delta.chat">Обзор провайдеров</a>.
|
|
||||||
Chatmail использует INBOX по умолчанию для ретрансляции; убедитесь, что провайдер также настроен.
|
|
||||||
Профиль чата, использующий классический адрес электронной почты, позволяет отправлять и получать незашифрованные сообщения.
|
|
||||||
Эти сообщения и чаты, в которых они появляются, помечаются значком электронной почты
|
|
||||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../email-icon.png" alt="email" />.</p>
|
|
||||||
|
|
||||||
<h3 id="я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете">
|
|
||||||
|
|
||||||
|
|
||||||
Я хочу управлять своим собственным сервером для Delta Chat. Что вы посоветуете? <a href="#я-хочу-управлять-своим-собственным-сервером-для-delta-chat-что-вы-посоветуете" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<p>Подойдет любая корректная настройка почтового сервера, за исключением случаев, когда для корректной работы устройств ваших пользователей требуются <a href="#instant-delivery">Push-уведомления</a> Google/Apple.</p>
|
|
||||||
|
|
||||||
<p>Мы обычно рекомендуем <a href="https://chatmail.at/doc/relay/getting_started.html">настроить chatmail релей</a>.
|
|
||||||
<a href="https://chatmail.at">Chatmail</a> — это проект, поддерживаемый сообществом который охватывает как настройку релеев, так
|
|
||||||
и <a href="https://github.com/chatmail/core">основные разработки на Rust</a>
|
|
||||||
которые обеспечивают работу <a href="https://chatmail.at/clients">клиентов chatmail</a> наиболее известным из которых является Delta Chat.</p>
|
|
||||||
|
|
||||||
<h3 id="меня-интересуют-технические-детали-можете-рассказать-больше">
|
<h3 id="меня-интересуют-технические-детали-можете-рассказать-больше">
|
||||||
|
|
||||||
|
|
||||||
@@ -1101,9 +1375,7 @@ Chatmail использует INBOX по умолчанию для ретран
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Смотрите <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарты, используемые в Delta Chat</a>.</p>
|
||||||
<li>Смотрите <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарты, используемые в Delta Chat</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="e2ee">
|
<h2 id="e2ee">
|
||||||
|
|
||||||
@@ -1132,6 +1404,10 @@ Chatmail использует INBOX по умолчанию для ретран
|
|||||||
<li>
|
<li>
|
||||||
<p><a href="https://autocrypt.org">Autocrypt</a> используется для автоматической
|
<p><a href="https://autocrypt.org">Autocrypt</a> используется для автоматической
|
||||||
настройки сквозного шифрования между контактами и всеми членами группового чата.</p>
|
настройки сквозного шифрования между контактами и всеми членами группового чата.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, полное внедрение которого запланировано на 2026 год,
|
||||||
|
обеспечит поддержку постквантового шифрования и прямой секретности.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Обмен контактом в
|
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Обмен контактом в
|
||||||
@@ -1316,12 +1592,10 @@ Delta Chat вместо этого использует реализацию Ope
|
|||||||
<p>Таким образом, серверы могут видеть только:</p>
|
<p>Таким образом, серверы могут видеть только:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>адрес отправителя и получателя</li>
|
<li>Адреса отправителя и получателя, по умолчанию генерируются случайным образом</li>
|
||||||
<li>а также размер сообщения.</li>
|
<li>Размер сообщения</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>По умолчанию адреса генерируются случайным образом.</p>
|
|
||||||
|
|
||||||
<p>Все прочие метаданные сообщений, контактов и групп содержатся в части сообщений, защищённой сквозным шифрованием.</p>
|
<p>Все прочие метаданные сообщений, контактов и групп содержатся в части сообщений, защищённой сквозным шифрованием.</p>
|
||||||
|
|
||||||
<h3 id="device-seizure">
|
<h3 id="device-seizure">
|
||||||
@@ -1342,6 +1616,29 @@ Delta Chat вместо этого использует реализацию Ope
|
|||||||
Кроме того, если устройство изъято, контакты, использующие временные профили,
|
Кроме того, если устройство изъято, контакты, использующие временные профили,
|
||||||
не могут быть легко идентифицированы.</p>
|
не могут быть легко идентифицированы.</p>
|
||||||
|
|
||||||
|
<h3 id="кто-видит-мой-ip-адрес">
|
||||||
|
|
||||||
|
|
||||||
|
Кто видит мой IP-адрес? <a href="#кто-видит-мой-ip-адрес" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Используемым <a href="#relays">релеям</a> необходимо знать ваш IP-адрес,
|
||||||
|
а в некоторых случаях — данные устройств ваших контактов, если вы совершаете <a href="#calls">вызов</a>
|
||||||
|
или совместно используете <a href="#webxdc">приложения</a>.</p>
|
||||||
|
|
||||||
|
<p>IP-адреса необходимы для обеспечения связи и эффективной работы.
|
||||||
|
Delta Chat не сохраняет их и не раскрывает третьим лицам.
|
||||||
|
Обратите внимание, что IP-адрес
|
||||||
|
— это не тот же адрес, который вы указываете службе доставки,
|
||||||
|
он, как правило, менее точен и зачастую позволяет определить лишь город или регион.</p>
|
||||||
|
|
||||||
|
<p>Если вы считаете свой IP-адрес зоной риска,
|
||||||
|
мы рекомендуем использовать VPN для всей системы.
|
||||||
|
Настройка VPN для отдельных приложений оставляет уязвимости в общей защите устройства.
|
||||||
|
Например, нажатие на ссылку может раскрыть ваш IP-адрес неизвестным сторонам, что представляет собой гораздо больший риск.</p>
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
@@ -1371,7 +1668,7 @@ Delta Chat вместо этого использует реализацию Ope
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Нет, пока нет.</p>
|
<p>Пока нет, но это будет реализовано в <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>На данный момент, Delta Chat не поддерживает Perfect Forward Secrecy (PFS) (Совершенную прямую секретность).
|
<p>На данный момент, Delta Chat не поддерживает Perfect Forward Secrecy (PFS) (Совершенную прямую секретность).
|
||||||
Это означает, что если ваш приватный ключ дешифрования будет скомпрометирован,
|
Это означает, что если ваш приватный ключ дешифрования будет скомпрометирован,
|
||||||
@@ -1382,12 +1679,9 @@ Delta Chat вместо этого использует реализацию Ope
|
|||||||
также может получить все ваши не удалённые сообщения
|
также может получить все ваши не удалённые сообщения
|
||||||
и ему даже не нужно расшифровывать какие-либо ранее собранные сообщения.</p>
|
и ему даже не нужно расшифровывать какие-либо ранее собранные сообщения.</p>
|
||||||
|
|
||||||
<p>Мы разработали подход к Forward Secrecy (Прямой секретности), который прошёл
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, полное внедрение которого запланировано на 2026 год,
|
||||||
первичную проверку некоторыми криптографами и экспертами по реализации
|
обеспечит надёжное удаление (прямую секретность) за счёт автоматической ротации ключей.
|
||||||
но требует более формального описания
|
Этот подход описан в черновике спецификации <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a>.</p>
|
||||||
чтобы убедиться, что он надёжно работает в федеративном обмене сообщениями и при использовании нескольких устройств,
|
|
||||||
прежде чем он может быть внедрён в <a href="https://github.com/chatmail/core">ядро chatmail</a>,
|
|
||||||
что сделает его доступным во всех <a href="https://chatmail.at/clients">клиентах clients</a>.</p>
|
|
||||||
|
|
||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
@@ -1397,12 +1691,13 @@ Delta Chat вместо этого использует реализацию Ope
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Нет, пока нет.</p>
|
<p>Пока нет, но эта возможность появится в <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat использует библиотеку OpenPGP на Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>,
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, полное внедрение которого запланировано на 2026 год,
|
||||||
которая поддерживает последний <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">черновик IETF Post-Quantum-Cryptography OpenPGP</a>.
|
обеспечит поддержку постквантового шифрования для защиты от атак с использованием квантовых компьютеров.
|
||||||
Мы планируем добавить поддержку PQC в <a href="https://github.com/chatmail/core">ядро chatmail</a> после того, как черновик будет окончательно утвержден в IETF
|
Delta Chat использует Rust-библиотеку OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||||
в сотрудничестве с другими разработчиками OpenPGP.</p>
|
которая поддерживает актуальный черновик IETF <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP</a>.
|
||||||
|
Особенности реализации описаны в черновике спецификации <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a>.</p>
|
||||||
|
|
||||||
<h3 id="как-можно-вручную-проверить-информацию-о-шифровании">
|
<h3 id="как-можно-вручную-проверить-информацию-о-шифровании">
|
||||||
|
|
||||||
@@ -1477,11 +1772,10 @@ Applied Cryptography в ETH Цюрихе и устранили все выявл
|
|||||||
См. здесь <a href="https://delta.chat/en/2023-05-22-webxdc-security">полную информацию о безопасности сквозного шифрования в Интернете</a>.</p>
|
См. здесь <a href="https://delta.chat/en/2023-05-22-webxdc-security">полную информацию о безопасности сквозного шифрования в Интернете</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>В Марте 2023 года, <a href="https://cure53.de">Cure53</a> проанализировал как протокол защиты транспортного уровня
|
<p>В марте 2023 года компания <a href="https://cure53.de">Cure53</a> провела анализ шифрования транспортного уровня сетевых соединений Delta Chat, а также проверку воспроизводимой конфигурации почтового сервера,
|
||||||
сетевого соединения Delta Chat, так и воспроизводимую установку почтового сервера,
|
<a href="https://delta.chat/serverguide">рекомендованной на этом сайте</a>.
|
||||||
<a href="https://delta.chat/ru/serverguide">рекомендуемую на этом сайте</a>.
|
Подробнее об аудите можно узнать <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">в нашем блоге</a>,
|
||||||
Подробнее об аудите можно узнать <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">в нашем блоге</a>
|
а <a href="https://delta.chat/assets/blog/MER-01-report.pdf">полный отчет доступен по этой ссылке</a>.</p>
|
||||||
или прочитать <a href="https://delta.chat/assets/blog/MER-01-report.pdf">полный отчёт здесь</a>.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>2020 год, <a href="https://includesecurity.com">Include Security</a> проанализировала Delta
|
<p>2020 год, <a href="https://includesecurity.com">Include Security</a> проанализировала Delta
|
||||||
@@ -1581,10 +1875,22 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS и macOS App Store, Microsof
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>Проект ЕС <a href="https://nextleap.eu">NEXTLEAP</a> финансировал исследование
|
<p>В 2023 и 2024 годах мы были приняты в программу Next Generation Internet (NGI)
|
||||||
и внедрение проверенных групп и настройку протоколов контактов
|
за нашу работу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||||
в 2017 и 2018 годах, а также помог интегрировать сквозное шифрование
|
в сотрудничестве с партнерами, работающими над
|
||||||
через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||||
|
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> и
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||||
|
Все эти проекты частично завершены или будут завершены в начале 2025 года.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>В 2021 г. мы получили дополнительное финансирование из ЕС для двух Next-Generation-Internet
|
||||||
|
целей, а именно для <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - e-mail provider portability directory</a> (~97 тыс. евро) и <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90 тыс. евро). Это привело к улучшению поддержки нескольких профилей, улучшению настройки контактов и групп с помощью QR-кода и многим улучшениям в сетевом взаимодействии на всех платформах.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Фонд <a href="https://nlnet.nl/">NLnet Foundation</a> выделил в 2019/2020 году 46 тысяч евро на
|
||||||
|
доработку связки Rust/Python и создание экосистемы чат-ботов..</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Фонд <a href="https://opentechfund.org">Open Technology Fund</a> предоставил нам
|
<p>Фонд <a href="https://opentechfund.org">Open Technology Fund</a> предоставил нам
|
||||||
@@ -1597,36 +1903,10 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS и macOS App Store, Microsof
|
|||||||
предоставить новые функции для всех платформ.</p>
|
предоставить новые функции для всех платформ.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://nlnet.nl/">Фонд NLnet</a> выделил в 2019/2020 году 46 тыс. евро на
|
<p>Проект ЕС <a href="https://nextleap.eu">NEXTLEAP</a> финансировал исследование
|
||||||
завершение привязки Rust/Python и создание экосистемы чат-ботов.</p>
|
и внедрение проверенных групп и настройку протоколов контактов
|
||||||
</li>
|
в 2017 и 2018 годах, а также помог интегрировать сквозное шифрование
|
||||||
<li>
|
через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||||
<p>В 2021 г. мы получили дополнительное финансирование из ЕС для двух Next-Generation-Internet
|
|
||||||
целей, а именно для <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - e-mail provider portability directory</a> (~97 тыс. евро) и <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90 тыс. евро). Это привело к улучшению поддержки нескольких профилей, улучшению настройки контактов и групп с помощью QR-кода и многим улучшениям в сетевом взаимодействии на всех платформах.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>С конца 2021 года по март 2023 года мы получили финансирование в размере ($500 тыс.) от
|
|
||||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL) для поддержки <em>свободы интернета</em>.
|
|
||||||
Это финансирование поддержало наши долгосрочные цели, сделать Delta Chat более удобным для использования
|
|
||||||
и совместимым с широким спектром электронных почтовых серверов по всему миру, а также более устойчивым
|
|
||||||
и безопасным в местах, часто подвергающихся интернет-цензуре и отключениям.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>2023-2024 мы завершили проект финансируемый OTF
|
|
||||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
|
||||||
что позволило нам внедрить гарантированное шифрование,
|
|
||||||
создать сеть серверов <a href="https://delta.chat/chatmail">chatmail</a>
|
|
||||||
и обеспечить “немедленную регистрацию” во всех приложениях, выпущенных с апреля 2024 года.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>В 2023 и 2024 годах мы были приняты в программу Next Generation Internet (NGI)
|
|
||||||
за нашу работу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
|
||||||
в сотрудничестве с партнерами, работающими над
|
|
||||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
|
||||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> и
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
|
||||||
Все эти проекты частично завершены или будут завершены в начале 2025 года.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Иногда мы получаем разовые пожертвования от физических лиц.
|
<p>Иногда мы получаем разовые пожертвования от физических лиц.
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
||||||
<li><a href="#podporuje-delta-chat-obrázky-videá-a-iné-prílohy">Podporuje Delta Chat obrázky, videá a iné prílohy?</a></li>
|
|
||||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||||
<li><a href="#kto-vidí-moju-profilovú-fotku">Kto vidí moju profilovú fotku?</a></li>
|
<li><a href="#kto-vidí-moju-profilovú-fotku">Kto vidí moju profilovú fotku?</a></li>
|
||||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
||||||
@@ -14,8 +13,9 @@
|
|||||||
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
||||||
<li><a href="#čo-znamenajú-zaškrtnutia-zobrazené-vedľa-odchádzajúcich-správ">Čo znamenajú zaškrtnutia zobrazené vedľa odchádzajúcich správ?</a></li>
|
<li><a href="#čo-znamenajú-zaškrtnutia-zobrazené-vedľa-odchádzajúcich-správ">Čo znamenajú zaškrtnutia zobrazené vedľa odchádzajúcich správ?</a></li>
|
||||||
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
||||||
|
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
||||||
<li><a href="#delold">What happens if I turn on “Delete old messages from device”?</a></li>
|
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
|
||||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -26,6 +26,22 @@
|
|||||||
<li><a href="#omylom-som-sa-vymazal">Omylom som sa vymazal.</a></li>
|
<li><a href="#omylom-som-sa-vymazal">Omylom som sa vymazal.</a></li>
|
||||||
<li><a href="#už-viac-nechcem-dostávať-správy-od-skupiny">Už viac nechcem dostávať správy od skupiny.</a></li>
|
<li><a href="#už-viac-nechcem-dostávať-správy-od-skupiny">Už viac nechcem dostávať správy od skupiny.</a></li>
|
||||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
||||||
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
@@ -54,11 +70,12 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#advanced">Advanced</a>
|
<li><a href="#advanced">Advanced</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#experimental-features">Experimental Features</a></li>
|
<li><a href="#experiments">Experimental Features</a></li>
|
||||||
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
<li><a href="#relays">What are Relays?</a></li>
|
||||||
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
||||||
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
||||||
|
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
||||||
<li><a href="#zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">Zaujímajú ma technické detaily. Môžete mi povedať viac?</a></li>
|
<li><a href="#zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">Zaujímajú ma technické detaily. Môžete mi povedať viac?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -75,6 +92,7 @@
|
|||||||
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
||||||
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
<li><a href="#message-metadata">How does Delta Chat protect metadata in messages?</a></li>
|
||||||
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
<li><a href="#device-seizure">How to protect metadata and contacts when a device is seized?</a></li>
|
||||||
|
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
|
||||||
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
||||||
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
||||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
||||||
@@ -184,7 +202,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
|
|||||||
<p>As being a private messenger,
|
<p>As being a private messenger,
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
|
<p>Your friends may share your contact with other friends,
|
||||||
|
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -214,24 +233,6 @@ You can also add a little introduction message.</p>
|
|||||||
<p>The second contact will receive a <strong>card</strong> then
|
<p>The second contact will receive a <strong>card</strong> then
|
||||||
and can tap it to start chatting with the first contact.</p>
|
and can tap it to start chatting with the first contact.</p>
|
||||||
|
|
||||||
<h3 id="podporuje-delta-chat-obrázky-videá-a-iné-prílohy">
|
|
||||||
|
|
||||||
|
|
||||||
Podporuje Delta Chat obrázky, videá a iné prílohy? <a href="#podporuje-delta-chat-obrázky-videá-a-iné-prílohy" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Yes. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
|
|
||||||
@@ -261,16 +262,11 @@ or to <strong>Switch Profiles</strong>.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>V nastaveniach si môžete pridať profilový obrázok. Ak napíšete svojim kontaktom
|
<p>V nastaveniach si môžete pridať profilový obrázok. Ak napíšete svojim kontaktom
|
||||||
alebo si ich pridáte pomocou QR kódu, automaticky to vidia ako váš profilový obrázok.</p>
|
alebo si ich pridáte pomocou QR kódu, automaticky to vidia ako váš profilový obrázok.</p>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Z dôvodu ochrany osobných údajov nikto nevidí váš profilový obrázok, kým im nenapíšete
|
<p>Z dôvodu ochrany osobných údajov nikto nevidí váš profilový obrázok, kým im nenapíšete
|
||||||
správu.</p>
|
správu.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
@@ -304,7 +300,8 @@ they will see it when they view your contact details.</p>
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
||||||
Archived chats remain accessible above the chat list or via search.</p>
|
They remain accessible above the chat list or via search
|
||||||
|
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
||||||
@@ -339,7 +336,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
|
|||||||
you can go back to the original message in the original chat</p>
|
you can go back to the original message in the original chat</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||||
@@ -376,23 +373,19 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
means that the message was sent successfully to your provider.</p>
|
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
mean that at least one recipient’s device
|
indicate your contact has read the message.</p>
|
||||||
reported back to having received the message.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Recipients may have disabled read-receipts,
|
|
||||||
so even if you see only one tick, the message may have been read.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>The other way round, two ticks do not automatically mean
|
|
||||||
that a human has read or understood the message ;)</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||||
|
|
||||||
|
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||||
|
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
|
|
||||||
@@ -420,6 +413,32 @@ Notifications are not sent and there is no time limit.</p>
|
|||||||
<p>Note, that the original message may still be received by chat members
|
<p>Note, that the original message may still be received by chat members
|
||||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||||
|
|
||||||
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
|
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
||||||
|
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>By default, compression ensures <strong>fast, efficient delivery</strong> that respects everyone’s data limits and storage.
|
||||||
|
This is ideal for everyday communication.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In regions with worse connectivity,
|
||||||
|
you can choose higher compression at <strong>Settings → Chats → Outgoing Media Quality</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you specifically need to send media in its <strong>original quality</strong>, use <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach → File</strong> in the chat.
|
||||||
|
Please use this method sparingly, as sending original files will significantly increase data usage for you and all recipients in the chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3 id="ephemeralmsgs">
|
<h3 id="ephemeralmsgs">
|
||||||
|
|
||||||
|
|
||||||
@@ -456,19 +475,18 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
<h3 id="delold">
|
<h3 id="delold">
|
||||||
|
|
||||||
|
|
||||||
What happens if I turn on “Delete old messages from device”? <a href="#delold" class="anchor"></a>
|
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>If you want to save storage on your device, you can choose to delete old
|
||||||
<li>If you want to save storage on your device, you can choose to delete old
|
messages automatically.</p>
|
||||||
messages automatically.</li>
|
|
||||||
<li>To turn it on, go to “delete old messages from device” in the “Chats & Media”
|
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
|
||||||
settings. You can set a timeframe between “after an hour” and “after a year”;
|
You can set a timeframe between “after an hour” and “after a year”;
|
||||||
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
||||||
older than that.</li>
|
older than that.</p>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
@@ -516,9 +534,15 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Vyberte <strong>Nový chat</strong> a potom <strong>Nová skupina</strong> z ponuky v pravom hornom rohu alebo stlačte príslušné tlačidlo v systéme Android/iOS.</li>
|
<li>
|
||||||
<li>Na nasledujúcej obrazovke vyberte <strong>členov skupiny</strong> a definujte <strong>názov skupiny</strong>. Môžete si tiež vybrať <strong>avatara skupiny</strong>.</li>
|
<p>Vyberte <strong>Nový chat</strong> a potom <strong>Nová skupina</strong> z ponuky v pravom hornom rohu alebo stlačte príslušné tlačidlo v systéme Android/iOS.</p>
|
||||||
<li>Hneď ako napíšete <strong>prvú správu</strong> v skupine, všetci členovia sú informovaní o novej skupine a môžu odpovedať v skupine (pokiaľ nenapíšete správu v skupine, skupina je pre skupinu neviditeľná členovia).</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Na nasledujúcej obrazovke vyberte <strong>členov skupiny</strong> a definujte <strong>názov skupiny</strong>. Môžete si tiež vybrať <strong>avatara skupiny</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Hneď ako napíšete <strong>prvú správu</strong> v skupine, všetci členovia sú informovaní o novej skupine a môžu odpovedať v skupine (pokiaľ nenapíšete správu v skupine, skupina je pre skupinu neviditeľná členovia).</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
@@ -529,11 +553,10 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>All group members have the <strong>same rights</strong>.
|
<p>All group members have the <strong>same rights</strong>.
|
||||||
For this reason, everyone can delete any member or add new ones.</p>
|
For this reason, everyone can delete any member or add new ones.</p>
|
||||||
</li>
|
|
||||||
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -561,10 +584,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Keďže už nie ste členom skupiny, nemôžete sa znova pridať.
|
||||||
<li>Keďže už nie ste členom skupiny, nemôžete sa znova pridať.
|
Žiadny problém, jednoducho požiadajte ktoréhokoľvek iného člena skupiny v bežnom chate, aby vás znova pridal.</p>
|
||||||
Žiadny problém, jednoducho požiadajte ktoréhokoľvek iného člena skupiny v bežnom chate, aby vás znova pridal.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="už-viac-nechcem-dostávať-správy-od-skupiny">
|
<h3 id="už-viac-nechcem-dostávať-správy-od-skupiny">
|
||||||
|
|
||||||
@@ -575,15 +596,12 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Vymažte sa zo zoznamu členov alebo odstráňte celý chat.
|
||||||
<p>Vymažte sa zo zoznamu členov alebo odstráňte celý chat.
|
Ak sa chcete neskôr znova pripojiť k skupine, požiadajte iného člena skupiny, aby vás znova pridal.</li>
|
||||||
Ak sa chcete neskôr znova pripojiť k skupine, požiadajte iného člena skupiny, aby vás znova pridal.</p>
|
</ul>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Ako alternatívu môžete tiež “Stlmiť” skupinu - znamená to, že budete dostávať všetky správy a
|
<p>Ako alternatívu môžete tiež “Stlmiť” skupinu - znamená to, že budete dostávať všetky správy a
|
||||||
môžete stále písať, ale už nebudete upozorňovaní na žiadne nové správy.</p>
|
môžete stále písať, ale už nebudete upozorňovaní na žiadne nové správy.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="cloning-a-group">
|
<h3 id="cloning-a-group">
|
||||||
|
|
||||||
@@ -609,6 +627,212 @@ or right-click the group in the chat list (Desktop).</p>
|
|||||||
<p>The new group is <strong>fully independent</strong> from the original,
|
<p>The new group is <strong>fully independent</strong> from the original,
|
||||||
which continues to work as before.</p>
|
which continues to work as before.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||||
|
|
||||||
|
|
||||||
|
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>There is no strict technical limit,
|
||||||
|
but more than 150 is not recommended.</p>
|
||||||
|
|
||||||
|
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||||
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -897,7 +1121,7 @@ One device is not needed for the other to work.</p>
|
|||||||
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
|
<p>Double-check both devices are in the <strong>same Wi-Fi or network</strong></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
|
<p>On <strong>Windows</strong>, go to “Control Panel / Network and Internet”
|
||||||
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
||||||
(after transfer, you can change back to the original value)</p>
|
(after transfer, you can change back to the original value)</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -949,23 +1173,22 @@ try the <strong>manual transfer</strong> described below</p>
|
|||||||
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
|
<p>This method is only recommended if “Add Second Device” as described above does not work.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>On the old device, go to “Settings -> Chats and media -> Export Backup”. Enter your
|
<li>
|
||||||
|
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
|
||||||
screen unlock PIN, pattern, or password. Then you can click on “Start
|
screen unlock PIN, pattern, or password. Then you can click on “Start
|
||||||
Backup”. This saves the backup file to your device. Now you have to transfer
|
Backup”. This saves the backup file to your device. Now you have to transfer
|
||||||
it to the other device somehow.</li>
|
it to the other device somehow.</p>
|
||||||
<li>On the new device, in the “I already have a profile” menu,
|
</li>
|
||||||
choose “restore from backup”. After import, your conversations, encryption
|
<li>
|
||||||
keys, and media should be copied to the new device.
|
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
|
||||||
<ul>
|
If you use iOS and encounter difficulties,
|
||||||
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
|
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
|
||||||
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
|
|
||||||
help you.</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
</li>
|
||||||
<li>You are now synchronized, and can use both devices for sending and receiving
|
|
||||||
end-to-end encrypted messages with your communication partners.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>You are now synchronized, and can use both devices for sending and receiving
|
||||||
|
end-to-end encrypted messages with your communication partners.</p>
|
||||||
|
|
||||||
<h3 id="máte-nejaké-plány-na-zavedenie-webového-klienta-delta-chat">
|
<h3 id="máte-nejaké-plány-na-zavedenie-webového-klienta-delta-chat">
|
||||||
|
|
||||||
|
|
||||||
@@ -993,10 +1216,10 @@ alebo AppImage pre Linux. Nájdete ich na
|
|||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<h3 id="experimental-features">
|
<h3 id="experiments">
|
||||||
|
|
||||||
|
|
||||||
Experimental Features <a href="#experimental-features" class="anchor"></a>
|
Experimental Features <a href="#experiments" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1009,33 +1232,48 @@ you can try out features we are working on.</p>
|
|||||||
<p>You can find more information
|
<p>You can find more information
|
||||||
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="statssending">
|
<h3 id="relays">
|
||||||
|
|
||||||
|
|
||||||
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
What are Relays? <a href="#relays" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>We would like to improve Delta Chat with your help,
|
<p>Relays are used to temporarily hold messages in case your device is offline.
|
||||||
which is why Delta Chat for Android asks whether you want
|
Relays are cheap and dumb servers,
|
||||||
to send anonymous usage statistics.</p>
|
that do not store data as group states, your name or avatar -
|
||||||
|
all that exist only on your device.
|
||||||
|
Relays are operated by different groups and people.</p>
|
||||||
|
|
||||||
<p>You can turn it on and off at
|
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
|
||||||
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
so you do not need to care about that.
|
||||||
|
However, if you want to,
|
||||||
<p>When you turn it on,
|
you can configure relays at <strong>Settings → Advanced → Relays</strong>:</p>
|
||||||
weekly statistics will be automatically sent to a bot.</p>
|
|
||||||
|
|
||||||
<p>We are interested e.g. in statistics like:</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>How many contacts are introduced by personally scanning a QR code?</li>
|
<li>
|
||||||
<li>Which versions of Delta Chat are being used?</li>
|
<p>You can <strong>add</strong> a relay by scanning its QR code;
|
||||||
<li>How many messages are unencrypted?</li>
|
<a href="https://chatmail.at/relays">chatmail.at/relays</a> shows some known ones.
|
||||||
|
If you have multiple relays, you will receive messages on all of them.
|
||||||
|
Contacts learn your current relays automatically when you message them.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap on a relay to set it as <strong>used for sending</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you <strong>remove</strong> a relay,
|
||||||
|
contacts who only know this relay may not reach you until you message them again.
|
||||||
|
To stay reachable in the meantime, choose <strong>Hide from Contacts</strong> in the confirmation dialog
|
||||||
|
instead of removing it right away.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>To <strong>show</strong> a hidden relay again, tap on it.</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
<p>For more details and future possibilities of relays,
|
||||||
|
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
||||||
|
|
||||||
@@ -1102,6 +1340,40 @@ except if your users’ devices require Google/Apple <a href="#instant-delivery"
|
|||||||
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
||||||
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
||||||
|
|
||||||
|
<h3 id="statssending">
|
||||||
|
|
||||||
|
|
||||||
|
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>We would like to improve Delta Chat with your help,
|
||||||
|
which is why Delta Chat for Android asks whether you want
|
||||||
|
to send anonymous usage statistics.</p>
|
||||||
|
|
||||||
|
<p>You can turn it on and off at
|
||||||
|
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
||||||
|
|
||||||
|
<p>When you turn it on,
|
||||||
|
weekly statistics will be automatically sent to a bot.</p>
|
||||||
|
|
||||||
|
<p>We are interested e.g. in statistics like:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>How many contacts are introduced by personally scanning a QR code?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Which versions of Delta Chat are being used?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>What errors occur for users?</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
||||||
|
|
||||||
<h3 id="zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">
|
<h3 id="zaujímajú-ma-technické-detaily-môžete-mi-povedať-viac">
|
||||||
|
|
||||||
|
|
||||||
@@ -1110,9 +1382,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Pozrite si <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Štandardy používané v Delta Chate</a>.</p>
|
||||||
<li>Pozrite si <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Štandardy používané v Delta Chate</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="e2ee">
|
<h2 id="e2ee">
|
||||||
|
|
||||||
@@ -1141,6 +1411,10 @@ to exchange encryption setup information through QR-code scanning or “invite l
|
|||||||
<li>
|
<li>
|
||||||
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
||||||
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption and forward secrecy.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
||||||
@@ -1325,12 +1599,10 @@ Instead, all group metadata is end-to-end encrypted and stored on end-user devic
|
|||||||
<p>Servers can therefore only see:</p>
|
<p>Servers can therefore only see:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>the sender and receiver addresses</li>
|
<li>Sender and receiver addresses, randomly generated by default</li>
|
||||||
<li>and the message size.</li>
|
<li>Message size</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>By default, the addresses are randomly generated.</p>
|
|
||||||
|
|
||||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||||
|
|
||||||
<h3 id="device-seizure">
|
<h3 id="device-seizure">
|
||||||
@@ -1351,6 +1623,29 @@ with the knowledge that all their data, along with all metadata, will be deleted
|
|||||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||||
can not be identified easily.</p>
|
can not be identified easily.</p>
|
||||||
|
|
||||||
|
<h3 id="who-sees-my-ip-address">
|
||||||
|
|
||||||
|
|
||||||
|
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
|
Delta Chat neither persists nor exposes them.
|
||||||
|
Note that IP Addresses
|
||||||
|
are not like an address you give to a delivery service,
|
||||||
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
|
<p>If you see your IP Address as a risk,
|
||||||
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
@@ -1380,7 +1675,7 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||||
This means that if your private decryption key is leaked,
|
This means that if your private decryption key is leaked,
|
||||||
@@ -1391,12 +1686,9 @@ Otherwise, someone obtaining your decryption keys
|
|||||||
is typically also able to get all your non-deleted messages
|
is typically also able to get all your non-deleted messages
|
||||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||||
|
|
||||||
<p>We designed a Forward Secrecy approach that withstood
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
initial examination from some cryptographers and implementation experts
|
will provide reliable deletion (forward secrecy) through automatic key rotation.
|
||||||
but is pending a more formal write up
|
This approach is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
|
||||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
|
||||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
|
||||||
|
|
||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
@@ -1406,12 +1698,13 @@ which would make it available in all <a href="https://chatmail.at/clients">chatm
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
||||||
|
Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
in collaboration with other OpenPGP implementers.</p>
|
|
||||||
|
|
||||||
<h3 id="how-can-i-manually-check-encryption-information">
|
<h3 id="how-can-i-manually-check-encryption-information">
|
||||||
|
|
||||||
@@ -1488,7 +1781,7 @@ See <a href="https://delta.chat/en/2023-05-22-webxdc-security">here for the full
|
|||||||
<li>
|
<li>
|
||||||
<p>2023 March, <a href="https://cure53.de">Cure53</a> analyzed both the transport encryption of
|
<p>2023 March, <a href="https://cure53.de">Cure53</a> analyzed both the transport encryption of
|
||||||
Delta Chat’s network connections and a reproducible mail server setup as
|
Delta Chat’s network connections and a reproducible mail server setup as
|
||||||
<a href="https://delta.chat/sk/serverguide">recommended on this site</a>.
|
<a href="https://delta.chat/serverguide">recommended on this site</a>.
|
||||||
You can read more about the audit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">on our blog</a>
|
You can read more about the audit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">on our blog</a>
|
||||||
or read the <a href="https://delta.chat/assets/blog/MER-01-report.pdf">full report here</a>.</p>
|
or read the <a href="https://delta.chat/assets/blog/MER-01-report.pdf">full report here</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -1590,10 +1883,22 @@ ordered chronologically:</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||||
and implementation of verified groups and setup contact protocols
|
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
along with collaboration partners working on
|
||||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||||
|
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||||
|
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||||
|
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||||
|
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||||
@@ -1606,36 +1911,10 @@ release Delta/iOS versions, to convert our core library to Rust, and
|
|||||||
to provide new features for all platforms.</p>
|
to provide new features for all platforms.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
and implementation of verified groups and setup contact protocols
|
||||||
</li>
|
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||||
<li>
|
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
|
||||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
|
||||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
|
||||||
This funding supported our long-running goals to make Delta Chat more usable
|
|
||||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
|
||||||
in places often affected by internet censorship and shutdowns.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>2023-2024 we successfully completed the OTF-funded
|
|
||||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
|
||||||
allowing us to introduce guaranteed encryption,
|
|
||||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
|
||||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
|
||||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
|
||||||
along with collaboration partners working on
|
|
||||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
|
||||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
|
||||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Sometimes we receive one-time donations from private individuals.
|
<p>Sometimes we receive one-time donations from private individuals.
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
||||||
<li><a href="#a-mbulon-delta-chat-i-figura-video-dhe-bashkëngjitje-të-tjera">A mbulon Delta Chat-i figura, video dhe bashkëngjitje të tjera?</a></li>
|
|
||||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||||
<li><a href="#kush-e-sheh-profilin-tim">Kush e sheh profilin tim?</a></li>
|
<li><a href="#kush-e-sheh-profilin-tim">Kush e sheh profilin tim?</a></li>
|
||||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
||||||
@@ -14,6 +13,7 @@
|
|||||||
<li><a href="#çdo-të-thotë-pika-e-gjelbër">Ç’do të thotë pika e gjelbër?</a></li>
|
<li><a href="#çdo-të-thotë-pika-e-gjelbër">Ç’do të thotë pika e gjelbër?</a></li>
|
||||||
<li><a href="#çduan-të-thonë-shenjat-e-shfaqura-pas-mesazheve-që-dërgohen">Ç’duan të thonë shenjat e shfaqura pas mesazheve që dërgohen?</a></li>
|
<li><a href="#çduan-të-thonë-shenjat-e-shfaqura-pas-mesazheve-që-dërgohen">Ç’duan të thonë shenjat e shfaqura pas mesazheve që dërgohen?</a></li>
|
||||||
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
||||||
|
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
||||||
<li><a href="#delold">Ç’ndodh, nëse aktivizoj “Fshi prej pajisjes mesazhe të vjetër”?</a></li>
|
<li><a href="#delold">Ç’ndodh, nëse aktivizoj “Fshi prej pajisjes mesazhe të vjetër”?</a></li>
|
||||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||||
@@ -26,6 +26,22 @@
|
|||||||
<li><a href="#fshiva-veten-padashje">Fshiva veten padashje.</a></li>
|
<li><a href="#fshiva-veten-padashje">Fshiva veten padashje.</a></li>
|
||||||
<li><a href="#sdua-ti-marr-më-mesazhet-e-një-grupi">S’dua t’i marr më mesazhet e një grupi.</a></li>
|
<li><a href="#sdua-ti-marr-më-mesazhet-e-një-grupi">S’dua t’i marr më mesazhet e një grupi.</a></li>
|
||||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
||||||
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
@@ -54,11 +70,12 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#advanced">Advanced</a>
|
<li><a href="#advanced">Advanced</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#experimental-features">Experimental Features</a></li>
|
<li><a href="#experiments">Experimental Features</a></li>
|
||||||
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
<li><a href="#relays">What are Relays?</a></li>
|
||||||
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
||||||
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
<li><a href="#i-want-to-manage-my-own-server-for-delta-chat-what-do-you-recommend">I want to manage my own server for Delta Chat. What do you recommend?</a></li>
|
||||||
|
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
||||||
<li><a href="#më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">Më interesojnë hollësitë teknike. Mund të më tregoni diçka më tepër?</a></li>
|
<li><a href="#më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">Më interesojnë hollësitë teknike. Mund të më tregoni diçka më tepër?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -75,6 +92,7 @@
|
|||||||
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
<li><a href="#tls">Are messages marked with the mail icon exposed on the Internet?</a></li>
|
||||||
<li><a href="#message-metadata">Si i mbron Delta Chat-i tejtëdhënat në mesazhe?</a></li>
|
<li><a href="#message-metadata">Si i mbron Delta Chat-i tejtëdhënat në mesazhe?</a></li>
|
||||||
<li><a href="#device-seizure">Si të mbrohen tejtëdhënat dhe kontaktet, kur shtien në dorë një pajisje?</a></li>
|
<li><a href="#device-seizure">Si të mbrohen tejtëdhënat dhe kontaktet, kur shtien në dorë një pajisje?</a></li>
|
||||||
|
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
|
||||||
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
<li><a href="#sealedsender">Does Delta Chat support “Sealed Sender”?</a></li>
|
||||||
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
<li><a href="#pfs">Does Delta Chat support Perfect Forward Secrecy?</a></li>
|
||||||
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
<li><a href="#pqc">Does Delta Chat support Post-Quantum-Cryptography?</a></li>
|
||||||
@@ -184,7 +202,8 @@ If you add each other to <a href="#groups">groups</a>, end-to-end encryption wil
|
|||||||
<p>As being a private messenger,
|
<p>As being a private messenger,
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
|
<p>Your friends may share your contact with other friends,
|
||||||
|
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -214,24 +233,6 @@ You can also add a little introduction message.</p>
|
|||||||
<p>The second contact will receive a <strong>card</strong> then
|
<p>The second contact will receive a <strong>card</strong> then
|
||||||
and can tap it to start chatting with the first contact.</p>
|
and can tap it to start chatting with the first contact.</p>
|
||||||
|
|
||||||
<h3 id="a-mbulon-delta-chat-i-figura-video-dhe-bashkëngjitje-të-tjera">
|
|
||||||
|
|
||||||
|
|
||||||
A mbulon Delta Chat-i figura, video dhe bashkëngjitje të tjera? <a href="#a-mbulon-delta-chat-i-figura-video-dhe-bashkëngjitje-të-tjera" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Po Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Si parazgjedhje, për funksionim më të mirë, figurat optimizohen dhe dërgohen në madhësi më të vogël, por mund ta dërgoni si një “kartelë”, që të ruhet origjinali.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
|
|
||||||
@@ -261,16 +262,11 @@ or to <strong>Switch Profiles</strong>.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Mund të shtoni një foto profili te rregullimet tuaja. Nëse u shkruani kontakteve
|
<p>Mund të shtoni një foto profili te rregullimet tuaja. Nëse u shkruani kontakteve
|
||||||
tuaja ose i shtoni përmes kodi QR, e shohin automatikisht si foton e profilit tuaj.</p>
|
tuaja ose i shtoni përmes kodi QR, e shohin automatikisht si foton e profilit tuaj.</p>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Për arsye privatësie, askush s’e sheh foton tuaj të profilit, deri sa
|
<p>Për arsye privatësie, askush s’e sheh foton tuaj të profilit, deri sa
|
||||||
t’u shkruani një mesazh.</p>
|
t’u shkruani një mesazh.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
@@ -303,8 +299,7 @@ they will see it when they view your contact details.</p>
|
|||||||
<p><strong>Heshtoni fjalosje</strong>, nëse s’doni të merrni njoftime mbi to. Fjalosjet e heshtuara qëndrojnë në vend dhe mundeni edhe të fiksoni një fjalosje të heshtuar.</p>
|
<p><strong>Heshtoni fjalosje</strong>, nëse s’doni të merrni njoftime mbi to. Fjalosjet e heshtuara qëndrojnë në vend dhe mundeni edhe të fiksoni një fjalosje të heshtuar.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Arkivoni fjalosje</strong>, nëse s’doni t’i shihni më në listën tuaj të fjalosjeve.
|
<p><strong>Arkivoni fjalosje</strong>, nëse s’doni t’i shihni më në listën tuaj të fjalosjeve. Fjalosjet e arkivuara mbesin të përdorshme mbi listën e fjalosjeve, ose përmes kërkimit.</p>
|
||||||
Fjalosjet e arkivuara mbesin të përdorshme mbi listën e fjalosjeve, ose përmes kërkimit.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Kur te një fjalosje e arkivuar vjen një mesazh i ri, do të <strong>hapet jashtë arkivit</strong> dhe kalojë te lista juaj e fjalosjeve, veç në mos qoftë e heshtuar.
|
<p>Kur te një fjalosje e arkivuar vjen një mesazh i ri, do të <strong>hapet jashtë arkivit</strong> dhe kalojë te lista juaj e fjalosjeve, veç në mos qoftë e heshtuar.
|
||||||
@@ -340,7 +335,7 @@ By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../g
|
|||||||
you can go back to the original message in the original chat</p>
|
you can go back to the original message in the original chat</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Finally, you can also use “Save Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||||
@@ -377,23 +372,19 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
means that the message was sent successfully to your provider.</p>
|
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
mean that at least one recipient’s device
|
indicate your contact has read the message.</p>
|
||||||
reported back to having received the message.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Recipients may have disabled read-receipts,
|
|
||||||
so even if you see only one tick, the message may have been read.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>The other way round, two ticks do not automatically mean
|
|
||||||
that a human has read or understood the message ;)</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||||
|
|
||||||
|
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||||
|
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
|
|
||||||
@@ -421,6 +412,32 @@ Notifications are not sent and there is no time limit.</p>
|
|||||||
<p>Note, that the original message may still be received by chat members
|
<p>Note, that the original message may still be received by chat members
|
||||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||||
|
|
||||||
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
|
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
||||||
|
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>By default, compression ensures <strong>fast, efficient delivery</strong> that respects everyone’s data limits and storage.
|
||||||
|
This is ideal for everyday communication.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In regions with worse connectivity,
|
||||||
|
you can choose higher compression at <strong>Settings → Chats → Outgoing Media Quality</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you specifically need to send media in its <strong>original quality</strong>, use <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach → File</strong> in the chat.
|
||||||
|
Please use this method sparingly, as sending original files will significantly increase data usage for you and all recipients in the chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3 id="ephemeralmsgs">
|
<h3 id="ephemeralmsgs">
|
||||||
|
|
||||||
|
|
||||||
@@ -462,14 +479,13 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Nëse doni të kurseni hapësirë në pajisjen tuaj, mund të zgjidhni të fshihen
|
||||||
<li>Nëse doni të kurseni hapësirë në pajisjen tuaj, mund të zgjidhni të fshihen
|
automatikisht mesazhe të vjetër.</p>
|
||||||
automatikisht mesazhe të vjetër.</li>
|
|
||||||
<li>Për ta aktivizuar, kaloni te “fshi prej pajisjeje mesazhe të vjetër”, te rregullimet
|
<p>Për ta aktivizuar, kaloni te “fshi prej pajisjeje mesazhe të vjetër”, te rregullimet
|
||||||
“Fjalosje & Media”. Mund të caktoni një periudhë nga “pas një ore” e deri
|
“Fjalosje & Media”. Mund të caktoni një periudhë nga “pas një ore” e deri
|
||||||
“pas një viti”; në këtë mënyrë, <em>krejt</em> mesazhet do të fshihen nga pajisja juaj
|
“pas një viti”; në këtë mënyrë, <em>krejt</em> mesazhet do të fshihen nga pajisja juaj
|
||||||
sapo të jenë më të vjetër se aq.</li>
|
sapo të jenë më të vjetër se aq.</p>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="remove-account">
|
<h3 id="remove-account">
|
||||||
|
|
||||||
@@ -517,9 +533,15 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Prej menusë në cepin e sipërm djathtas, përzgjidhni <strong>Fjalosje e re</strong> dhe mandej <strong>Grup i ri</strong>, ose shtypni butonin përgjegjës në Android/iOS.</li>
|
<li>
|
||||||
<li>Te skena vijuese, përzgjidhni <strong>anëtarë grupi</strong> dhe përcaktoni një <strong>emër grupi</strong>. Mund të përzgjidhni edhe një <strong>avatar grupi</strong>.</li>
|
<p>Prej menusë në cepin e sipërm djathtas, përzgjidhni <strong>Fjalosje e re</strong> dhe mandej <strong>Grup i ri</strong>, ose shtypni butonin përgjegjës në Android/iOS.</p>
|
||||||
<li>Sapo të shkruani <strong>mesazhin e parë</strong> te grupi, krejt anëtarët marrin vesh për grupin e ri dhe mund të përgjigjen në të (për sa kohë që te grupi s’shkruani një mesazh i cili është i padukshëm për anëtarët).</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Te skena vijuese, përzgjidhni <strong>anëtarë grupi</strong> dhe përcaktoni një <strong>emër grupi</strong>. Mund të përzgjidhni edhe një <strong>avatar grupi</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Sapo të shkruani <strong>mesazhin e parë</strong> te grupi, krejt anëtarët marrin vesh për grupin e ri dhe mund të përgjigjen në të (për sa kohë që te grupi s’shkruani një mesazh i cili është i padukshëm për anëtarët).</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
@@ -530,11 +552,10 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>All group members have the <strong>same rights</strong>.
|
<p>All group members have the <strong>same rights</strong>.
|
||||||
For this reason, everyone can delete any member or add new ones.</p>
|
For this reason, everyone can delete any member or add new ones.</p>
|
||||||
</li>
|
|
||||||
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -562,10 +583,8 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Ngaqë s’jeni më anëtar i grupit, s’mund të shtoni veten sërish.
|
||||||
<li>Ngaqë s’jeni më anëtar i grupit, s’mund të shtoni veten sërish.
|
Megjithatë, s’ka problem, thjesht kërkojini një anëtari tjetër të grupit në një fjalosje të zakonshme t’ju shtojë sërish.</p>
|
||||||
Megjithatë, s’ka problem, thjesht kërkojini një anëtari tjetër të grupit në një fjalosje të zakonshme t’ju shtojë sërish.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="sdua-ti-marr-më-mesazhet-e-një-grupi">
|
<h3 id="sdua-ti-marr-më-mesazhet-e-një-grupi">
|
||||||
|
|
||||||
@@ -576,16 +595,13 @@ Megjithatë, s’ka problem, thjesht kërkojini një anëtari tjetër të grupit
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Ose fshini veten si anëtar i listës, ose fshini krejt bisedën.
|
||||||
<p>Ose fshini veten si anëtar i listës, ose fshini krejt bisedën.
|
Nëse më vonë doni të ribëheni pjesë e grupit, kërkojini një anëtari tjetër të grupit t’ju shtojë sërish.</li>
|
||||||
Nëse më vonë doni të ribëheni pjesë e grupit, kërkojini një anëtari tjetër të grupit t’ju shtojë sërish.</p>
|
</ul>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Ndryshe, mundeni edhe ta “Heshtoni” një grup - duke bërë këtë, do të merrni
|
<p>Ndryshe, mundeni edhe ta “Heshtoni” një grup - duke bërë këtë, do të merrni
|
||||||
krejt mesazhet dhe prapë mund të shkruani, por nuk njoftoheni më,
|
krejt mesazhet dhe prapë mund të shkruani, por nuk njoftoheni më,
|
||||||
për çfarëdo mesazhesh të rinj.</p>
|
për çfarëdo mesazhesh të rinj.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="cloning-a-group">
|
<h3 id="cloning-a-group">
|
||||||
|
|
||||||
@@ -611,6 +627,212 @@ or right-click the group in the chat list (Desktop).</p>
|
|||||||
<p>The new group is <strong>fully independent</strong> from the original,
|
<p>The new group is <strong>fully independent</strong> from the original,
|
||||||
which continues to work as before.</p>
|
which continues to work as before.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||||
|
|
||||||
|
|
||||||
|
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>There is no strict technical limit,
|
||||||
|
but more than 150 is not recommended.</p>
|
||||||
|
|
||||||
|
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||||
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -899,7 +1121,7 @@ Njëra pajisja s’ka nevojë për tjetrën që të funksionojë.</p>
|
|||||||
<p>Kontrolloni sërish që të dyja pajisjet të gjenden në <strong>të njëjtin rrjet Wi-Fi ose klasik</strong></p>
|
<p>Kontrolloni sërish që të dyja pajisjet të gjenden në <strong>të njëjtin rrjet Wi-Fi ose klasik</strong></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>On <strong>Windows</strong>, go to <strong>Control Panel / Network and Internet</strong>
|
<p>On <strong>Windows</strong>, go to “Control Panel / Network and Internet”
|
||||||
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
and make sure, <strong>Private Network</strong> is selected as “Network profile type”
|
||||||
(after transfer, you can change back to the original value)</p>
|
(after transfer, you can change back to the original value)</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -951,23 +1173,22 @@ provoni <strong>shpërnguljen dorazi</strong> të përshkruar më poshtë</p>
|
|||||||
<p>Kjo metodë rekomandohet vetëm nëse “Shtoni Pajisje të Dytë” si përshkruhet më sipër s’funksionon.</p>
|
<p>Kjo metodë rekomandohet vetëm nëse “Shtoni Pajisje të Dytë” si përshkruhet më sipër s’funksionon.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>On the old device, go to “Settings -> Chats and media -> Export Backup”. Enter your
|
<li>
|
||||||
|
<p>On the old device, go to <strong>Settings → Chats → Export Backup</strong>. Enter your
|
||||||
screen unlock PIN, pattern, or password. Then you can click on “Start
|
screen unlock PIN, pattern, or password. Then you can click on “Start
|
||||||
Backup”. This saves the backup file to your device. Now you have to transfer
|
Backup”. This saves the backup file to your device. Now you have to transfer
|
||||||
it to the other device somehow.</li>
|
it to the other device somehow.</p>
|
||||||
<li>On the new device, in the “I already have a profile” menu,
|
</li>
|
||||||
choose “restore from backup”. After import, your conversations, encryption
|
<li>
|
||||||
keys, and media should be copied to the new device.
|
<p>On the new device, select <strong>I Already Have a Profile → Restore from Backup</strong>.
|
||||||
<ul>
|
If you use iOS and encounter difficulties,
|
||||||
<li><strong>If you use iOS:</strong> and you encounter difficulties, maybe
|
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> might help you.</p>
|
||||||
<a href="https://support.delta.chat/t/import-backup-to-ios/1628">this guide</a> will
|
|
||||||
help you.</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
</li>
|
||||||
<li>You are now synchronized, and can use both devices for sending and receiving
|
|
||||||
end-to-end encrypted messages with your communication partners.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>You are now synchronized, and can use both devices for sending and receiving
|
||||||
|
end-to-end encrypted messages with your communication partners.</p>
|
||||||
|
|
||||||
<h3 id="a-ka-ndonjë-plan-për-të-sjellë-një-klient-web-delta-chat">
|
<h3 id="a-ka-ndonjë-plan-për-të-sjellë-një-klient-web-delta-chat">
|
||||||
|
|
||||||
|
|
||||||
@@ -997,10 +1218,10 @@ Windows Desktop, ose AppImage për Linux. Mund t’i gjeni te
|
|||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<h3 id="experimental-features">
|
<h3 id="experiments">
|
||||||
|
|
||||||
|
|
||||||
Experimental Features <a href="#experimental-features" class="anchor"></a>
|
Experimental Features <a href="#experiments" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -1013,33 +1234,48 @@ you can try out features we are working on.</p>
|
|||||||
<p>You can find more information
|
<p>You can find more information
|
||||||
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
and give feedback in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="statssending">
|
<h3 id="relays">
|
||||||
|
|
||||||
|
|
||||||
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
What are Relays? <a href="#relays" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>We would like to improve Delta Chat with your help,
|
<p>Relays are used to temporarily hold messages in case your device is offline.
|
||||||
which is why Delta Chat for Android asks whether you want
|
Relays are cheap and dumb servers,
|
||||||
to send anonymous usage statistics.</p>
|
that do not store data as group states, your name or avatar -
|
||||||
|
all that exist only on your device.
|
||||||
|
Relays are operated by different groups and people.</p>
|
||||||
|
|
||||||
<p>You can turn it on and off at
|
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
|
||||||
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
so you do not need to care about that.
|
||||||
|
However, if you want to,
|
||||||
<p>When you turn it on,
|
you can configure relays at <strong>Settings → Advanced → Relays</strong>:</p>
|
||||||
weekly statistics will be automatically sent to a bot.</p>
|
|
||||||
|
|
||||||
<p>We are interested e.g. in statistics like:</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>How many contacts are introduced by personally scanning a QR code?</li>
|
<li>
|
||||||
<li>Which versions of Delta Chat are being used?</li>
|
<p>You can <strong>add</strong> a relay by scanning its QR code;
|
||||||
<li>How many messages are unencrypted?</li>
|
<a href="https://chatmail.at/relays">chatmail.at/relays</a> shows some known ones.
|
||||||
|
If you have multiple relays, you will receive messages on all of them.
|
||||||
|
Contacts learn your current relays automatically when you message them.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap on a relay to set it as <strong>used for sending</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you <strong>remove</strong> a relay,
|
||||||
|
contacts who only know this relay may not reach you until you message them again.
|
||||||
|
To stay reachable in the meantime, choose <strong>Hide from Contacts</strong> in the confirmation dialog
|
||||||
|
instead of removing it right away.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>To <strong>show</strong> a hidden relay again, tap on it.</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
<p>For more details and future possibilities of relays,
|
||||||
|
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
||||||
|
|
||||||
@@ -1106,6 +1342,40 @@ except if your users’ devices require Google/Apple <a href="#instant-delivery"
|
|||||||
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
||||||
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
||||||
|
|
||||||
|
<h3 id="statssending">
|
||||||
|
|
||||||
|
|
||||||
|
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>We would like to improve Delta Chat with your help,
|
||||||
|
which is why Delta Chat for Android asks whether you want
|
||||||
|
to send anonymous usage statistics.</p>
|
||||||
|
|
||||||
|
<p>You can turn it on and off at
|
||||||
|
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
||||||
|
|
||||||
|
<p>When you turn it on,
|
||||||
|
weekly statistics will be automatically sent to a bot.</p>
|
||||||
|
|
||||||
|
<p>We are interested e.g. in statistics like:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>How many contacts are introduced by personally scanning a QR code?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Which versions of Delta Chat are being used?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>What errors occur for users?</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>We will <em>not</em> collect any personally identifiable information about you.</p>
|
||||||
|
|
||||||
<h3 id="më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">
|
<h3 id="më-interesojnë-hollësitë-teknike-mund-të-më-tregoni-diçka-më-tepër">
|
||||||
|
|
||||||
|
|
||||||
@@ -1114,9 +1384,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Shihni <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standarde të përdorur në Delta Chat</a>.</p>
|
||||||
<li>Shihni <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Standarde të përdorur në Delta Chat</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="e2ee">
|
<h2 id="e2ee">
|
||||||
|
|
||||||
@@ -1145,6 +1413,10 @@ to exchange encryption setup information through QR-code scanning or “invite l
|
|||||||
<li>
|
<li>
|
||||||
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
<p><a href="https://autocrypt.org">Autocrypt</a> is used for automatically
|
||||||
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
establishing end-to-end encryption between contacts and all members of a group chat.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption and forward secrecy.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Sharing a contact to a
|
||||||
@@ -1329,12 +1601,10 @@ Instead, all group metadata is end-to-end encrypted and stored on end-user devic
|
|||||||
<p>Servers can therefore only see:</p>
|
<p>Servers can therefore only see:</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>the sender and receiver addresses</li>
|
<li>Sender and receiver addresses, randomly generated by default</li>
|
||||||
<li>and the message size.</li>
|
<li>Message size</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>By default, the addresses are randomly generated.</p>
|
|
||||||
|
|
||||||
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
<p>All other message, contact and group metadata resides in the end-to-end encrypted part of messages.</p>
|
||||||
|
|
||||||
<h3 id="device-seizure">
|
<h3 id="device-seizure">
|
||||||
@@ -1355,6 +1625,29 @@ with the knowledge that all their data, along with all metadata, will be deleted
|
|||||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||||
can not be identified easily.</p>
|
can not be identified easily.</p>
|
||||||
|
|
||||||
|
<h3 id="who-sees-my-ip-address">
|
||||||
|
|
||||||
|
|
||||||
|
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
|
Delta Chat neither persists nor exposes them.
|
||||||
|
Note that IP Addresses
|
||||||
|
are not like an address you give to a delivery service,
|
||||||
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
|
<p>If you see your IP Address as a risk,
|
||||||
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
@@ -1384,7 +1677,7 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
<p>Delta Chat today doesn’t support Perfect Forward Secrecy (PFS).
|
||||||
This means that if your private decryption key is leaked,
|
This means that if your private decryption key is leaked,
|
||||||
@@ -1395,12 +1688,9 @@ Otherwise, someone obtaining your decryption keys
|
|||||||
is typically also able to get all your non-deleted messages
|
is typically also able to get all your non-deleted messages
|
||||||
and doesn’t even need to decrypt any previously collected messages.</p>
|
and doesn’t even need to decrypt any previously collected messages.</p>
|
||||||
|
|
||||||
<p>We designed a Forward Secrecy approach that withstood
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
initial examination from some cryptographers and implementation experts
|
will provide reliable deletion (forward secrecy) through automatic key rotation.
|
||||||
but is pending a more formal write up
|
This approach is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
to ascertain it reliably works in federated messaging and with multi-device usage,
|
|
||||||
before it could be implemented in <a href="https://github.com/chatmail/core">chatmail core</a>,
|
|
||||||
which would make it available in all <a href="https://chatmail.at/clients">chatmail clients</a>.</p>
|
|
||||||
|
|
||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
@@ -1410,12 +1700,13 @@ which would make it available in all <a href="https://chatmail.at/clients">chatm
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>No, not yet.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
||||||
|
Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||||
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||||
We aim to add PQC support in <a href="https://github.com/chatmail/core">chatmail core</a> after the draft is finalized at the IETF
|
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
in collaboration with other OpenPGP implementers.</p>
|
|
||||||
|
|
||||||
<h3 id="how-can-i-manually-check-encryption-information">
|
<h3 id="how-can-i-manually-check-encryption-information">
|
||||||
|
|
||||||
@@ -1493,7 +1784,7 @@ Shihni <a href="https://delta.chat/en/2023-05-22-webxdc-security">këtu, për sh
|
|||||||
<li>
|
<li>
|
||||||
<p>Në fillim të 2023-it, <a href="https://cure53.de">Cure53</a> analizoi qoftë fshehtëzimin
|
<p>Në fillim të 2023-it, <a href="https://cure53.de">Cure53</a> analizoi qoftë fshehtëzimin
|
||||||
e transporteve për lidhje rrjeti të Delta Chat-it, qoftë një formësim të riprodhueshëm
|
e transporteve për lidhje rrjeti të Delta Chat-it, qoftë një formësim të riprodhueshëm
|
||||||
shërbyesi poste si <a href="https://delta.chat/sq/serverguide">të rekomanduarin në këtë sajt</a>.
|
shërbyesi poste si <a href="https://delta.chat/serverguide">të rekomanduarin në këtë sajt</a>.
|
||||||
Mund të lexoni më tepër rreth auditimit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">në blogun tonë</a>,
|
Mund të lexoni më tepër rreth auditimit <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">në blogun tonë</a>,
|
||||||
ose të lexoni <a href="https://delta.chat/assets/blog/MER-01-report.pdf">raportin e plotë këtu</a>.</p>
|
ose të lexoni <a href="https://delta.chat/assets/blog/MER-01-report.pdf">raportin e plotë këtu</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -1594,10 +1885,25 @@ ordered chronologically:</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||||
and implementation of verified groups and setup contact protocols
|
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
along with collaboration partners working on
|
||||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||||
|
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||||
|
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||||
|
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Më 2021-n morëm financime të mëtejshme nga BE për dy propozime që shtrihen në
|
||||||
|
“Internetin e Brezit Tjetër”, konkretisht për <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - e-mail provider portability directory</a> (~97K euro) dhe <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K euro) që sollën mbulim më të mirë për përdorues me shumë
|
||||||
|
llogari, përmirësim të gjërave për kontakte me kod QR dhe grupe, si dhe mjaft
|
||||||
|
përmirësime në punën në rrjet për krejt platformat.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://nlnet.nl/">Fondacioni NLnet</a> dhuroi 46K euro gjatë 2019/2020 për
|
||||||
|
plotësimin e <em>Rust/Python bindings</em> dhe për t’i dhënë udhë një ekosistemi
|
||||||
|
Chat-bot.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> na dha grantin e parë
|
<p><a href="https://opentechfund.org">Open Technology Fund</a> na dha grantin e parë
|
||||||
@@ -1610,36 +1916,10 @@ versione Delta/iOS, për të shndërruar bibliotekën tonë bazë në Rust, si d
|
|||||||
për të sjellë veçori të reja për krejt platformat.</p>
|
për të sjellë veçori të reja për krejt platformat.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
<p>Projekti <a href="https://nextleap.eu">NEXTLEAP</a> i BE-së financoi kërkimin
|
||||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
për dhe sendërtimin e grupeve të verifikuara dhe protokolleve të
|
||||||
</li>
|
ujdisjes së kontakteve më 2017-n dhe 2018-n dhe ndihmoi gjithashtu
|
||||||
<li>
|
të integrohet Fshehtëzim Skaj-më-Skaj përmes <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
|
||||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
|
||||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
|
||||||
This funding supported our long-running goals to make Delta Chat more usable
|
|
||||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
|
||||||
in places often affected by internet censorship and shutdowns.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>2023-2024 we successfully completed the OTF-funded
|
|
||||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
|
||||||
allowing us to introduce guaranteed encryption,
|
|
||||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
|
||||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
|
||||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
|
||||||
along with collaboration partners working on
|
|
||||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
|
||||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
|
||||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
|
||||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Ndonjëherë marrim dhurime unike nga individë privatë.
|
<p>Ndonjëherë marrim dhurime unike nga individë privatë.
|
||||||
|
|||||||
@@ -3,9 +3,8 @@
|
|||||||
<li><a href="#що-таке-delta-chat">Що таке Delta Chat?</a>
|
<li><a href="#що-таке-delta-chat">Що таке Delta Chat?</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#howtoe2ee">Як мені знайти людей для спілкування?</a></li>
|
<li><a href="#howtoe2ee">Як мені знайти людей для спілкування?</a></li>
|
||||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
<li><a href="#чому-чат-позначений-як-запит">Чому чат позначений як «Запит»?</a></li>
|
||||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
<li><a href="#як-я-можу-познайомити-двох-своїх-друзів-один-з-одним">Як я можу познайомити двох своїх друзів один з одним?</a></li>
|
||||||
<li><a href="#чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">Чи підтримує Delta Chat вкладення у вигляді фото, відео тощо?</a></li>
|
|
||||||
<li><a href="#multiple-accounts">Що таке профілі? Як я можу перемикатися між ними?</a></li>
|
<li><a href="#multiple-accounts">Що таке профілі? Як я можу перемикатися між ними?</a></li>
|
||||||
<li><a href="#хто-бачить-моє-зображення-профілю">Хто бачить моє зображення профілю?</a></li>
|
<li><a href="#хто-бачить-моє-зображення-профілю">Хто бачить моє зображення профілю?</a></li>
|
||||||
<li><a href="#signature">Чи можу я встановити біографію/статус у Delta Chat?</a></li>
|
<li><a href="#signature">Чи можу я встановити біографію/статус у Delta Chat?</a></li>
|
||||||
@@ -14,6 +13,7 @@
|
|||||||
<li><a href="#що-означає-зелена-точка">Що означає зелена точка?</a></li>
|
<li><a href="#що-означає-зелена-точка">Що означає зелена точка?</a></li>
|
||||||
<li><a href="#що-означають-галочки-біля-вихідних-повідомлень">Що означають галочки біля вихідних повідомлень?</a></li>
|
<li><a href="#що-означають-галочки-біля-вихідних-повідомлень">Що означають галочки біля вихідних повідомлень?</a></li>
|
||||||
<li><a href="#edit">Виправлення помилок та видалення повідомлень після надсилання</a></li>
|
<li><a href="#edit">Виправлення помилок та видалення повідомлень після надсилання</a></li>
|
||||||
|
<li><a href="#mediaquality">How is media quality handled?</a></li>
|
||||||
<li><a href="#ephemeralmsgs">Як працюють повідомлення, що зникають?</a></li>
|
<li><a href="#ephemeralmsgs">Як працюють повідомлення, що зникають?</a></li>
|
||||||
<li><a href="#delold">Що станеться, якщо я ввімкну «Видаляти старі повідомлення з пристрою»?</a></li>
|
<li><a href="#delold">Що станеться, якщо я ввімкну «Видаляти старі повідомлення з пристрою»?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -25,6 +25,22 @@
|
|||||||
<li><a href="#я-випадково-себе-видалив">Я випадково себе видалив</a></li>
|
<li><a href="#я-випадково-себе-видалив">Я випадково себе видалив</a></li>
|
||||||
<li><a href="#я-більше-не-хочу-отримувати-повідомлення-групи">Я більше не хочу отримувати повідомлення групи.</a></li>
|
<li><a href="#я-більше-не-хочу-отримувати-повідомлення-групи">Я більше не хочу отримувати повідомлення групи.</a></li>
|
||||||
<li><a href="#клонування-групи">Клонування групи</a></li>
|
<li><a href="#клонування-групи">Клонування групи</a></li>
|
||||||
|
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#channels">Channels</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#subscribe-to-a-channel">Subscribe to a channel</a></li>
|
||||||
|
<li><a href="#create-a-channel">Create a channel</a></li>
|
||||||
|
<li><a href="#how-many-subscribers-can-a-channel-have">How many subscribers can a channel have?</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="#calls">Calls</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#place-a-call">Place a call</a></li>
|
||||||
|
<li><a href="#accept-or-reject-a-call">Accept or reject a call</a></li>
|
||||||
|
<li><a href="#during-a-call">During a call</a></li>
|
||||||
|
<li><a href="#missed-calls-and-notifications">Missed calls and notifications</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#webxdc">In-chat apps</a>
|
<li><a href="#webxdc">In-chat apps</a>
|
||||||
@@ -53,11 +69,12 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#advanced">Advanced</a>
|
<li><a href="#advanced">Advanced</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#експериментальні-функції">Експериментальні функції</a></li>
|
<li><a href="#experiments">Експериментальні функції</a></li>
|
||||||
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
<li><a href="#relays">What are Relays?</a></li>
|
||||||
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
<li><a href="#can-i-use-a-classic-email-address-with-delta-chat">Can I use a classic email address with Delta Chat?</a></li>
|
||||||
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
<li><a href="#classic-email">How can I configure a chat profile with a classic email address as relay?</a></li>
|
||||||
<li><a href="#я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте">Я хочу керувати власним сервером для Delta Chat. Що ви порекомендуєте?</a></li>
|
<li><a href="#я-хочу-керувати-власним-сервером-для-delta-chat-що-ви-порекомендуєте">Я хочу керувати власним сервером для Delta Chat. Що ви порекомендуєте?</a></li>
|
||||||
|
<li><a href="#statssending">What is “Send statistics to Delta Chat’s developers”?</a></li>
|
||||||
<li><a href="#мене-цікавлять-технічні-деталі-можете-розповісти-більше">Мене цікавлять технічні деталі. Можете розповісти більше?</a></li>
|
<li><a href="#мене-цікавлять-технічні-деталі-можете-розповісти-більше">Мене цікавлять технічні деталі. Можете розповісти більше?</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
@@ -74,6 +91,7 @@
|
|||||||
<li><a href="#чи-повідомлення-позначені-значком-пошти-доступні-в-інтернетіtls">Чи повідомлення, позначені значком пошти, доступні в Інтернеті?{#tls}</a></li>
|
<li><a href="#чи-повідомлення-позначені-значком-пошти-доступні-в-інтернетіtls">Чи повідомлення, позначені значком пошти, доступні в Інтернеті?{#tls}</a></li>
|
||||||
<li><a href="#message-metadata">Як Delta Chat захищає метадані у повідомленнях?</a></li>
|
<li><a href="#message-metadata">Як Delta Chat захищає метадані у повідомленнях?</a></li>
|
||||||
<li><a href="#device-seizure">Як захистити метадані та контакти якщо пристрій вилучено?</a></li>
|
<li><a href="#device-seizure">Як захистити метадані та контакти якщо пристрій вилучено?</a></li>
|
||||||
|
<li><a href="#who-sees-my-ip-address">Who sees my IP Address?</a></li>
|
||||||
<li><a href="#sealedsender">Чи підтримує Delta Chat функцію “Запечатаний відправник”?</a></li>
|
<li><a href="#sealedsender">Чи підтримує Delta Chat функцію “Запечатаний відправник”?</a></li>
|
||||||
<li><a href="#pfs">Чи підтримує Delta Chat цілковиту пряму секретність (Perfect Forward Secrecy)?</a></li>
|
<li><a href="#pfs">Чи підтримує Delta Chat цілковиту пряму секретність (Perfect Forward Secrecy)?</a></li>
|
||||||
<li><a href="#pqc">Чи підтримує Delta Chat пост-квантову криптографію?</a></li>
|
<li><a href="#pqc">Чи підтримує Delta Chat пост-квантову криптографію?</a></li>
|
||||||
@@ -137,17 +155,10 @@
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>If you are <strong>face to face</strong> with your friend or family,
|
<p>Якщо ви перебуваєте <strong>віч-на-віч</strong> зі своїм другом або родиною, торкніться піктограми <strong>QR-код</strong> на головному екрані <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> на головному екрані. Попросіть вашого партнера по чату <strong>сканувати</strong> QR-зображення за допомогою їхнього застосунку Delta Chat.</p>
|
||||||
tap the <strong>QR Code</strong> icon <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
|
|
||||||
on the main screen.<br />
|
|
||||||
Ask your chat partner to <strong>scan</strong> the QR image
|
|
||||||
with their Delta Chat app.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>For a <strong>remote</strong> contact setup,
|
<p>Для <strong>віддаленого</strong> налаштування контакту, на тому ж самому екрані, натисніть “Копіювати” або “Поділитися” і відправте <strong>запрошувальне посилання</strong> через інший приватний чат.</p>
|
||||||
from the same screen,
|
|
||||||
click “Copy” or “Share” and send the <strong>invite link</strong>
|
|
||||||
through another private chat.</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@@ -155,8 +166,7 @@ through another private chat.</p>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>If both sides are online, they will soon see a chat
|
<p>Якщо обидві сторони перебувають у мережі, незабаром з’явиться вікно чату, і вони зможуть безпечно обмінюватися повідомленнями.</p>
|
||||||
and can start messaging securely.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>If one side is offline or in bad network,
|
<p>If one side is offline or in bad network,
|
||||||
@@ -168,18 +178,17 @@ the ability to chat is delayed until connectivity is restored.</p>
|
|||||||
Тепер Ви автоматично використовуватимете <a href="#e2ee">наскрізне шифрування</a> з цим контактом.
|
Тепер Ви автоматично використовуватимете <a href="#e2ee">наскрізне шифрування</a> з цим контактом.
|
||||||
Якщо ви додасте один одного у <a href="#groups">групи</a>, наскрізне шифрування буде встановлено між усіма учасниками.</p>
|
Якщо ви додасте один одного у <a href="#groups">групи</a>, наскрізне шифрування буде встановлено між усіма учасниками.</p>
|
||||||
|
|
||||||
<h3 id="why-is-a-chat-marked-as-request">
|
<h3 id="чому-чат-позначений-як-запит">
|
||||||
|
|
||||||
|
|
||||||
Why is a chat marked as “Request”? <a href="#why-is-a-chat-marked-as-request" class="anchor"></a>
|
Чому чат позначений як «Запит»? <a href="#чому-чат-позначений-як-запит" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>As being a private messenger,
|
<p>Оскільки це приватний месенджер, лише друзі та родичі, яким ви <a href="#howtoe2ee">надіслали свій QR-код або посилання-запрошення</a>, можуть вам писати.</p>
|
||||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
|
||||||
|
|
||||||
<p>Your friends may share your contact with other friends, this appears as a <strong>request</strong>.</p>
|
<p>Ваші друзі можуть поділитися вашими контактними даними з іншими друзями, це відображається як <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Запит</b></p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -193,37 +202,17 @@ only friends and family you <a href="#howtoe2ee">share your QR code or invite li
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="how-can-i-put-two-of-my-friends-in-contact-with-each-other">
|
<h3 id="як-я-можу-познайомити-двох-своїх-друзів-один-з-одним">
|
||||||
|
|
||||||
|
|
||||||
How can I put two of my friends in contact with each other? <a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other" class="anchor"></a>
|
Як я можу познайомити двох своїх друзів один з одним? <a href="#як-я-можу-познайомити-двох-своїх-друзів-один-з-одним" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Attach the first contact to the chat of the second using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → Contact</strong>.
|
<p>Додайте перший контакт до чату другого, скориставшись функцією <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Кнопка «Додати» → Контакт</strong>. Ви також можете додати коротке повідомлення-представлення.</p>
|
||||||
You can also add a little introduction message.</p>
|
|
||||||
|
|
||||||
<p>The second contact will receive a <strong>card</strong> then
|
<p>Тоді другий контакт отримає <strong>картку</strong> і зможе натиснути на неї, щоб почати чат із першим контактом.</p>
|
||||||
and can tap it to start chatting with the first contact.</p>
|
|
||||||
|
|
||||||
<h3 id="чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо">
|
|
||||||
|
|
||||||
|
|
||||||
Чи підтримує Delta Chat вкладення у вигляді фото, відео тощо? <a href="#чи-підтримує-delta-chat-вкладення-у-вигляді-фото-відео-тощо" class="anchor"></a>
|
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Так. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
|
||||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>З міркувань продуктивності, зображення оптимізовані та надсилаються в меншому розмірі за замовчуванням, але ви можете надіслати їх як «файл», щоб зберегти оригінал.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="multiple-accounts">
|
<h3 id="multiple-accounts">
|
||||||
|
|
||||||
@@ -233,9 +222,7 @@ or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png"
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>A profile is <strong>a name, a picture</strong> and some additional information for encrypting messages.
|
<p>Профіль — це <strong>ім’я, зображення</strong> та деяка додаткова інформація для шифрування повідомлень. Профіль зберігається виключно на вашому пристрої (пристроях) і використовує сервер лише для передачі повідомлень.</p>
|
||||||
A profile lives on your device(s) only
|
|
||||||
and uses the server only to relay messages.</p>
|
|
||||||
|
|
||||||
<p>Під час першого встановлення Delta Chat створюється перший профіль.</p>
|
<p>Під час першого встановлення Delta Chat створюється перший профіль.</p>
|
||||||
|
|
||||||
@@ -253,14 +240,9 @@ and uses the server only to relay messages.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<p>Ви можете додати зображення профілю в ваших налаштуваннях. Якщо ви пишете комусь із ваших контактів чи додаєте їх через QR код, вони автоматично побачать ваше зображення профілю.</p>
|
<p>Ви можете додати зображення профілю в ваших налаштуваннях. Якщо ви пишете комусь із ваших контактів чи додаєте їх через QR код, вони автоматично побачать ваше зображення профілю.</p>
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Із міркувань приватності, ніхто не бачить ваше зображення профілю доки ви їм не напишете.</p>
|
<p>Із міркувань приватності, ніхто не бачить ваше зображення профілю доки ви їм не напишете.</p>
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="signature">
|
<h3 id="signature">
|
||||||
|
|
||||||
@@ -270,10 +252,7 @@ and uses the server only to relay messages.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Yes,
|
<p>Так, ви можете це зробити в розділі <strong>Налаштування → Профіль → Опис</strong>. Після того як ви надішлете повідомлення контакту, він побачить його, переглянувши ваші контактні дані.</p>
|
||||||
you can do so under <strong>Settings → Profile → Bio</strong>.
|
|
||||||
Once you sent a message to a contact,
|
|
||||||
they will see it when they view your contact details.</p>
|
|
||||||
|
|
||||||
<h3 id="що-значить-закріплення-приглушення-архівування">
|
<h3 id="що-значить-закріплення-приглушення-архівування">
|
||||||
|
|
||||||
@@ -293,8 +272,7 @@ they will see it when they view your contact details.</p>
|
|||||||
<p><strong>Приглушіть чати</strong> якщо ви не хочете отримувати сповіщення для них. Приглушені чати залишаються на місці і ви також можете закріпити приглушений чат.</p>
|
<p><strong>Приглушіть чати</strong> якщо ви не хочете отримувати сповіщення для них. Приглушені чати залишаються на місці і ви також можете закріпити приглушений чат.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Архівуйте чати</strong>, якщо ви більше не хочете бачити їх у своєму списку чатів.
|
<p><strong>Архівуйте чати</strong>, якщо ви більше не хочете бачити їх у своєму списку чатів. Заархівовані чати залишаються доступними над списком чатів або через пошук.</p>
|
||||||
Заархівовані чати залишаються доступними над списком чатів або через пошук.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Коли архівний чат отримує нове повідомлення, якщо не приглушений, він <strong>вискочить з архіву</strong> і повернеться у ваш список чатів.
|
<p>Коли архівний чат отримує нове повідомлення, якщо не приглушений, він <strong>вискочить з архіву</strong> і повернеться у ваш список чатів.
|
||||||
@@ -342,10 +320,7 @@ they will see it when they view your contact details.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>You can sometimes see a <strong>green dot</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
|
<p>Іноді біля аватара контакту можна побачити <strong>зелену крапку</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />. Це означає, що ви <strong>нещодавно бачили його</strong> протягом останніх 10 хвилин, наприклад, тому що він надіслав вам повідомлення або підтвердження прочитання.</p>
|
||||||
next to the avatar of a contact.
|
|
||||||
It means they were <strong>recently seen by you</strong> in the last 10 minutes,
|
|
||||||
e.g. because they messaged you or sent a read receipt.</p>
|
|
||||||
|
|
||||||
<p>So this is not a real time online status
|
<p>So this is not a real time online status
|
||||||
and others will as well not always see that you are “online”.</p>
|
and others will as well not always see that you are “online”.</p>
|
||||||
@@ -361,23 +336,19 @@ and others will as well not always see that you are “online”.</p>
|
|||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||||
means that the message was sent successfully to your provider.</p>
|
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||||
mean that at least one recipient’s device
|
indicate your contact has read the message.</p>
|
||||||
reported back to having received the message.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Recipients may have disabled read-receipts,
|
|
||||||
so even if you see only one tick, the message may have been read.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>The other way round, two ticks do not automatically mean
|
|
||||||
that a human has read or understood the message ;)</p>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||||
|
|
||||||
|
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||||
|
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||||
|
|
||||||
<h3 id="edit">
|
<h3 id="edit">
|
||||||
|
|
||||||
|
|
||||||
@@ -399,6 +370,32 @@ that a human has read or understood the message ;)</p>
|
|||||||
|
|
||||||
<p>Зауважте, що початкове повідомлення все ще може бути отримане учасниками чату які могли вже відповісти, переслати, зберегти, зробити знімок екрану або іншим чином скопіювати повідомлення.</p>
|
<p>Зауважте, що початкове повідомлення все ще може бути отримане учасниками чату які могли вже відповісти, переслати, зберегти, зробити знімок екрану або іншим чином скопіювати повідомлення.</p>
|
||||||
|
|
||||||
|
<h3 id="mediaquality">
|
||||||
|
|
||||||
|
|
||||||
|
How is media quality handled? <a href="#mediaquality" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach-</strong>
|
||||||
|
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>By default, compression ensures <strong>fast, efficient delivery</strong> that respects everyone’s data limits and storage.
|
||||||
|
This is ideal for everyday communication.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>In regions with worse connectivity,
|
||||||
|
you can choose higher compression at <strong>Settings → Chats → Outgoing Media Quality</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you specifically need to send media in its <strong>original quality</strong>, use <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attach → File</strong> in the chat.
|
||||||
|
Please use this method sparingly, as sending original files will significantly increase data usage for you and all recipients in the chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3 id="ephemeralmsgs">
|
<h3 id="ephemeralmsgs">
|
||||||
|
|
||||||
|
|
||||||
@@ -437,11 +434,10 @@ the (anyway encrypted) messages may take longer to get deleted from their server
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Якщо ви хочете заощадити пам’ять на своєму пристрої, ви можете видалити старе повідомлення автоматично.</p>
|
||||||
<li>Якщо ви хочете заощадити пам’ять на своєму пристрої, ви можете видалити старе повідомлення автоматично.</li>
|
|
||||||
<li>Щоб увімкнути його, перейдіть до «видалити старі повідомлення з пристрою» в налаштуваннях «Чатів та медіа» . Ви можете встановити часові рамки від «через годину» до «через рік»;
|
<p>Щоб увімкнути його, перейдіть до «видалити старі повідомлення з пристрою» в налаштуваннях «Чатів та медіа» . Ви можете встановити часові рамки від «через годину» до «через рік»;
|
||||||
Таким чином, <em>усі</em> повідомлення будуть видалені з вашого пристрою, як тільки вони будуть старішими за це.</li>
|
Таким чином, <em>усі</em> повідомлення будуть видалені з вашого пристрою, як тільки вони будуть старішими за це.</p>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>Як я можу видалити свій профіль у Delta Chat? {#remove-account}</p>
|
<p>Як я можу видалити свій профіль у Delta Chat? {#remove-account}</p>
|
||||||
|
|
||||||
@@ -483,9 +479,15 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Оберіть <strong>Новий чат</strong>, потім <strong>Нова групи</strong> у меню в верхньому правому кутку або натисніть відповідну кнопку у Android/iOS.</li>
|
<li>
|
||||||
<li>На наступному екрані виберіть <strong>учасники групи</strong> та встановіть <strong>назву групи</strong>. Ви також можете обрати <strong>аватар групи</strong>.</li>
|
<p>Оберіть <strong>Новий чат</strong>, потім <strong>Нова групи</strong> у меню в верхньому правому кутку або натисніть відповідну кнопку у Android/iOS.</p>
|
||||||
<li>Як тільки ви напишете <strong>перше повідомлення</strong> у групу, усі учасники будуть проінформовані про нову групу і зможуть відповісти у нову групу (доки ви не напишете повідомлення у групі, група залишатиметься невидимою для учасників).</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>На наступному екрані виберіть <strong>учасники групи</strong> та встановіть <strong>назву групи</strong>. Ви також можете обрати <strong>аватар групи</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Як тільки ви напишете <strong>перше повідомлення</strong> у групу, усі учасники будуть проінформовані про нову групу і зможуть відповісти у нову групу (доки ви не напишете повідомлення у групі, група залишатиметься невидимою для учасників).</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3 id="addmembers">
|
<h3 id="addmembers">
|
||||||
@@ -496,11 +498,10 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
|
<p>All group members have the <strong>same rights</strong>.
|
||||||
|
For this reason, everyone can delete any member or add new ones.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
|
||||||
<p>Усі учасники групи мають <strong>однакові права</strong>.
|
|
||||||
Тому кожен може видалити будь-якого учасника або додати нових.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -528,9 +529,7 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Оскільки ви більше не учасник групи, ви не зможете додати себе знову. Однак, це не проблема, просто попросіть будь-якого іншого учасника групи в звичайному чаті додати вас знову.</p>
|
||||||
<li>Оскільки ви більше не учасник групи, ви не зможете додати себе знову. Однак, це не проблема, просто попросіть будь-якого іншого учасника групи в звичайному чаті додати вас знову.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3 id="я-більше-не-хочу-отримувати-повідомлення-групи">
|
<h3 id="я-більше-не-хочу-отримувати-повідомлення-групи">
|
||||||
|
|
||||||
@@ -541,14 +540,11 @@ However, since groups are <a href="#groups">meant for trusted people</a>, avoid
|
|||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Або видаліть себе із списку учасників групи, або видаліть весь чат. Якщо ви хочете повернутись до чату пізніше, попросіть іншого учасника групи додати вас знову.</li>
|
||||||
<p>Або видаліть себе із списку учасників групи, або видаліть весь чат. Якщо ви хочете повернутись до чату пізніше, попросіть іншого учасника групи додати вас знову.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>Ви також можете “Заглушити” групу - це означає, що ви будете отримувати усі повідомлення та можете писати у групу, але ви більше не будете отримувати сповіщення про нові повідомлення.</p>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>Ви також можете “Заглушити” групу - це означає, що ви будете отримувати усі повідомлення та можете писати у групу, але ви більше не будете отримувати сповіщення про нові повідомлення.</p>
|
||||||
|
|
||||||
<h3 id="клонування-групи">
|
<h3 id="клонування-групи">
|
||||||
|
|
||||||
|
|
||||||
@@ -573,6 +569,212 @@ or right-click the group in the chat list (Desktop).</p>
|
|||||||
<p>Нова група є <strong>цілком незалежною</strong> від оригінальної,
|
<p>Нова група є <strong>цілком незалежною</strong> від оригінальної,
|
||||||
котра продовжує працювати як раніше.</p>
|
котра продовжує працювати як раніше.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||||
|
|
||||||
|
|
||||||
|
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>There is no strict technical limit,
|
||||||
|
but more than 150 is not recommended.</p>
|
||||||
|
|
||||||
|
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||||
|
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||||
|
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||||
|
|
||||||
|
<h2 id="channels">
|
||||||
|
|
||||||
|
|
||||||
|
Channels <a href="#channels" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Channels are a one-to-many tool for broadcasting messages.</p>
|
||||||
|
|
||||||
|
<h3 id="subscribe-to-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Subscribe to a channel <a href="#subscribe-to-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Scan the <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> <strong>QR code</strong>
|
||||||
|
or tap the <strong>invite link</strong> you got from the channel owner.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>That’s all!
|
||||||
|
You will receive a few of the messages from the channel history
|
||||||
|
and, from that point on, all new messages from the channel.</p>
|
||||||
|
|
||||||
|
<p><strong>Don’t worry,</strong> if that does not happen immediately.
|
||||||
|
Once the channel owner comes online, your join request will be processed.</p>
|
||||||
|
|
||||||
|
<p>As all of Delta Chat, also Channels are private and decentralized,
|
||||||
|
there is no public discovery.</p>
|
||||||
|
|
||||||
|
<p>Other channel subscribers will not see that you subscribed and cannot message you.
|
||||||
|
The channel owner, however, can message you.
|
||||||
|
They will also see that you read a message unless you have read receipts disabled.</p>
|
||||||
|
|
||||||
|
<p>If you do not want to share your main profile,
|
||||||
|
you can also create a <a href="#multiple-accounts">dedicated profile</a> for joining a channel.</p>
|
||||||
|
|
||||||
|
<h3 id="create-a-channel">
|
||||||
|
|
||||||
|
|
||||||
|
Create a channel <a href="#create-a-channel" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>New Chat</strong> and choose <strong>New Channel</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Enter a <strong>name</strong>, optionally set an <strong>image</strong> and <strong>description</strong>, and hit the <strong>Create</strong> button.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can now send and manage messages as usual.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>From the channel’s profile, <strong>share the QR code or invite link with others</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Subscribers will receive your messages,
|
||||||
|
but they cannot send messages in your channel.
|
||||||
|
When subscribing, they will receive <strong>a few of the latest messages of the channel history</strong>.</p>
|
||||||
|
|
||||||
|
<p>You can see the <strong>view count</strong> beside each message.
|
||||||
|
Note that this only counts subscribers who have read receipts enabled,
|
||||||
|
so the real view count may be larger.</p>
|
||||||
|
|
||||||
|
<h3 id="how-many-subscribers-can-a-channel-have">
|
||||||
|
|
||||||
|
|
||||||
|
How many subscribers can a channel have? <a href="#how-many-subscribers-can-a-channel-have" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>Channels are designed for much larger audiences than <a href="#groups">groups</a>.</p>
|
||||||
|
|
||||||
|
<p>The practical limit depends on the used <a href="#relays">relay</a>,
|
||||||
|
so there is no single fixed number that applies everywhere.</p>
|
||||||
|
|
||||||
|
<p>For really large channels with several tens of thousands of subscribers,
|
||||||
|
we recommend using a <a href="#multiple-accounts">dedicated profile</a> for the channel
|
||||||
|
and checking whether the relay is suitable.</p>
|
||||||
|
|
||||||
|
<p>But don’t be too hesitant: Delta Chat is designed to be relay-agnostic,
|
||||||
|
so you can change your relay at any point easily -
|
||||||
|
your existing subscribers will not even notice.
|
||||||
|
You only have to update the invite link you share with new subscribers in that case.</p>
|
||||||
|
|
||||||
|
<h2 id="calls">
|
||||||
|
|
||||||
|
|
||||||
|
Calls <a href="#calls" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p>Delta Chat supports one-to-one <strong>audio calls</strong> and <strong>video calls</strong>.</p>
|
||||||
|
|
||||||
|
<p>Calls are supported on Desktop, Ubuntu Touch, iOS and Android 8 and newer.</p>
|
||||||
|
|
||||||
|
<h3 id="place-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Place a call <a href="#place-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>In a one-to-one chat, tap the 📞 <strong>call icon</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>This opens a small menu
|
||||||
|
where you can choose whether to place an <strong>Audio Call</strong> or a <strong>Video Call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="accept-or-reject-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
Accept or reject a call <a href="#accept-or-reject-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>When someone calls you,
|
||||||
|
Delta Chat shows an <strong>incoming call screen</strong> or notification.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap <strong>Accept</strong> to answer
|
||||||
|
or <strong>Decline</strong> to reject the call.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 id="during-a-call">
|
||||||
|
|
||||||
|
|
||||||
|
During a call <a href="#during-a-call" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>mute</strong> your microphone.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>You can <strong>enable or disable your camera</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>On mobile, you can <strong>switch between front and back cameras</strong>.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Depending on the device, you can also select the audio output or use picture-in-picture.
|
||||||
|
On desktop, the call is using a dedicated window
|
||||||
|
and you can continue using the main Delta Chat window as usual.</p>
|
||||||
|
|
||||||
|
<h3 id="missed-calls-and-notifications">
|
||||||
|
|
||||||
|
|
||||||
|
Missed calls and notifications <a href="#missed-calls-and-notifications" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>If you do not answer, do not hear the ringing, or do not have your device at hand,
|
||||||
|
the call appears as a <strong>missed call</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><strong>Only your accepted contacts</strong> can make your device ring.
|
||||||
|
Contact requests will appear as usual and will not ring.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>At <strong>Settings → Notifications → Calls</strong>,
|
||||||
|
you can disable the special call ringing screen completely.
|
||||||
|
If you do so, you will not be disturbed by any ringing notification,
|
||||||
|
you can still pick up the call by tapping the incoming call message bubble in its chat.</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h2 id="webxdc">
|
<h2 id="webxdc">
|
||||||
|
|
||||||
|
|
||||||
@@ -830,7 +1032,7 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
|
|||||||
<p>Ще раз упевніться, що обидва пристрої підключені до <strong>одного Wi-Fi або мережі</strong></p>
|
<p>Ще раз упевніться, що обидва пристрої підключені до <strong>одного Wi-Fi або мережі</strong></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>У <strong>Windows</strong> перейдіть до <strong>Панель керування / Мережа та Інтернет</strong> і переконайтеся, що <strong>Приватна мережа</strong> вибрано як “Тип мережевого профілю” (після перенесення ви можете повернути початкове значення)</p>
|
<p>У <strong>Windows</strong> перейдіть до “Панель керування / Мережа та Інтернет” і переконайтеся, що <strong>Приватна мережа</strong> вибрано як “Тип мережевого профілю” (після перенесення ви можете повернути початкове значення)</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>На <strong>iOS</strong> переконайтеся, що доступ до “Системні налаштування / Програми / Delta Chat / <strong>Локальна мережа</strong>” дозволено</p>
|
<p>На <strong>iOS</strong> переконайтеся, що доступ до “Системні налаштування / Програми / Delta Chat / <strong>Локальна мережа</strong>” дозволено</p>
|
||||||
@@ -872,12 +1074,15 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
|
|||||||
<p>Цей спосіб рекомендований, лише якщо «Додати другий пристрій», як описано вище, не працює.</p>
|
<p>Цей спосіб рекомендований, лише якщо «Додати другий пристрій», як описано вище, не працює.</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>На старому пристрої перейдіть до “Налаштування -> Чати та медіа -> Експортувати резервну копію”. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</li>
|
<li>
|
||||||
<li>На новому пристрої в меню “У мене вже є профіль” виберіть “Відновити з резервної копії”. Після імпорту ваші розмови, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.</li>
|
<p>На старому пристрої перейдіть до <strong>Налаштування → Чати та медіа → Експортувати резервну копію</strong>. Введіть свій PIN-код, графічний ключ або пароль розблокування екрана. Потім ви можете натиснути на “Почати резервне копіювання”. Це збереже файл резервної копії на вашому пристрої. Тепер вам потрібно якось перенести його на інший пристрій.</p>
|
||||||
<li>Якщо ви користуєтеся iOS:** і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
|
</li>
|
||||||
<li>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізних зашифрованих повідомлень зі своїми партнерами по спілкуванню.</li>
|
<li>На новому пристрої в меню <strong>У мене вже є профіль</strong> виберіть <strong>Відновити з резервної копії</strong>. Після імпорту ваші розмови, ключі шифрування ключі шифрування та медіа повинні бути скопійовані на новий пристрій.</li>
|
||||||
|
<li>Якщо ви користуєтеся iOS: і у вас виникли труднощі, можливо <a href="https://support.delta.chat/t/import-backup-to-ios/1628">цей посібник</a> допоможе вам.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>Тепер ви синхронізовані і можете використовувати обидва пристрої для надсилання та отримання наскрізних зашифрованих повідомлень зі своїми партнерами по спілкуванню.</p>
|
||||||
|
|
||||||
<h3 id="чи-планується-впровадження-веб-клієнта-delta-chat">
|
<h3 id="чи-планується-впровадження-веб-клієнта-delta-chat">
|
||||||
|
|
||||||
|
|
||||||
@@ -900,10 +1105,10 @@ Welcome to the power of the interoperable chatmail relay network :)</p>
|
|||||||
|
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<h3 id="експериментальні-функції">
|
<h3 id="experiments">
|
||||||
|
|
||||||
|
|
||||||
Експериментальні функції <a href="#експериментальні-функції" class="anchor"></a>
|
Експериментальні функції <a href="#experiments" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
@@ -916,33 +1121,48 @@ you can try out features we are working on.</p>
|
|||||||
<p>Ви можете знайти додаткову інформацію
|
<p>Ви можете знайти додаткову інформацію
|
||||||
та залишити відгук на <a href="https://support.delta.chat">форумі</a>.</p>
|
та залишити відгук на <a href="https://support.delta.chat">форумі</a>.</p>
|
||||||
|
|
||||||
<h3 id="statssending">
|
<h3 id="relays">
|
||||||
|
|
||||||
|
|
||||||
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
What are Relays? <a href="#relays" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>We would like to improve Delta Chat with your help,
|
<p>Relays are used to temporarily hold messages in case your device is offline.
|
||||||
which is why Delta Chat for Android asks whether you want
|
Relays are cheap and dumb servers,
|
||||||
to send anonymous usage statistics.</p>
|
that do not store data as group states, your name or avatar -
|
||||||
|
all that exist only on your device.
|
||||||
|
Relays are operated by different groups and people.</p>
|
||||||
|
|
||||||
<p>You can turn it on and off at
|
<p>By default, after installation, a relay is <strong>automatically set up</strong>,
|
||||||
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
so you do not need to care about that.
|
||||||
|
However, if you want to,
|
||||||
<p>Коли Ви увімкнете цю функцію,
|
you can configure relays at <strong>Settings → Advanced → Relays</strong>:</p>
|
||||||
щотижнева статистика буде автоматично надсилатися боту.</p>
|
|
||||||
|
|
||||||
<p>We are interested e.g. in statistics like:</p>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>How many contacts are introduced by personally scanning a QR code?</li>
|
<li>
|
||||||
<li>Which versions of Delta Chat are being used?</li>
|
<p>You can <strong>add</strong> a relay by scanning its QR code;
|
||||||
<li>How many messages are unencrypted?</li>
|
<a href="https://chatmail.at/relays">chatmail.at/relays</a> shows some known ones.
|
||||||
|
If you have multiple relays, you will receive messages on all of them.
|
||||||
|
Contacts learn your current relays automatically when you message them.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Tap on a relay to set it as <strong>used for sending</strong>.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>If you <strong>remove</strong> a relay,
|
||||||
|
contacts who only know this relay may not reach you until you message them again.
|
||||||
|
To stay reachable in the meantime, choose <strong>Hide from Contacts</strong> in the confirmation dialog
|
||||||
|
instead of removing it right away.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>To <strong>show</strong> a hidden relay again, tap on it.</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>Ми <em>не</em> будемо збирати жодних персональних даних, які б могли ідентифікувати Вас особисто.</p>
|
<p>For more details and future possibilities of relays,
|
||||||
|
you can follow discussions in the <a href="https://support.delta.chat">Forum</a>.</p>
|
||||||
|
|
||||||
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
<h3 id="can-i-use-a-classic-email-address-with-delta-chat">
|
||||||
|
|
||||||
@@ -1009,6 +1229,40 @@ except if your users’ devices require Google/Apple <a href="#instant-delivery"
|
|||||||
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
and <a href="https://github.com/chatmail/core">core Rust developments</a>
|
||||||
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
that power <a href="https://chatmail.at/clients">chatmail clients</a> of which Delta Chat is the most well known.</p>
|
||||||
|
|
||||||
|
<h3 id="statssending">
|
||||||
|
|
||||||
|
|
||||||
|
What is “Send statistics to Delta Chat’s developers”? <a href="#statssending" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>We would like to improve Delta Chat with your help,
|
||||||
|
which is why Delta Chat for Android asks whether you want
|
||||||
|
to send anonymous usage statistics.</p>
|
||||||
|
|
||||||
|
<p>You can turn it on and off at
|
||||||
|
<strong>Settings → Advanced → Send statistics to Delta Chat’s developers</strong>.</p>
|
||||||
|
|
||||||
|
<p>Коли Ви увімкнете цю функцію,
|
||||||
|
щотижнева статистика буде автоматично надсилатися боту.</p>
|
||||||
|
|
||||||
|
<p>We are interested e.g. in statistics like:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<p>How many contacts are introduced by personally scanning a QR code?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Which versions of Delta Chat are being used?</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>What errors occur for users?</p>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Ми <em>не</em> будемо збирати жодних персональних даних, які б могли ідентифікувати Вас особисто.</p>
|
||||||
|
|
||||||
<h3 id="мене-цікавлять-технічні-деталі-можете-розповісти-більше">
|
<h3 id="мене-цікавлять-технічні-деталі-можете-розповісти-більше">
|
||||||
|
|
||||||
|
|
||||||
@@ -1017,9 +1271,7 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<ul>
|
<p>Дивіться <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</p>
|
||||||
<li>Дивіться <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Стандарти, що використовуються у Delta Chat</a>.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2 id="e2ee">
|
<h2 id="e2ee">
|
||||||
|
|
||||||
@@ -1046,6 +1298,10 @@ that power <a href="https://chatmail.at/clients">chatmail clients</a> of which D
|
|||||||
<li>
|
<li>
|
||||||
<p><a href="https://autocrypt.org">Autocrypt</a> використовується для автоматичного встановлення наскрізного шифрування між контактами і всіма учасниками групового чату.</p>
|
<p><a href="https://autocrypt.org">Autocrypt</a> використовується для автоматичного встановлення наскрізного шифрування між контактами і всіма учасниками групового чату.</p>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption and forward secrecy.</p>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Поширення контакту в чаті</a> дозволяє отримувачам використовувати наскрізне шифрування з контактом.</p>
|
<p><a href="https://github.com/chatmail/core/blob/main/spec.md#attaching-a-contact-to-a-message">Поширення контакту в чаті</a> дозволяє отримувачам використовувати наскрізне шифрування з контактом.</p>
|
||||||
</li>
|
</li>
|
||||||
@@ -1154,21 +1410,9 @@ and there must be tangible improvements for users.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>If you are sending or receiving email messages without end-to-end encryption (using a classic email server),
|
<p>Якщо ви надсилаєте або отримуєте електронні листи без наскрізного шифрування (використовуючи класичний сервер електронної пошти), вони все одно захищені від мобільних або кабельних компаній, які не можуть читати чи змінювати ваші повідомлення. Однак як ваш, так і поштовий провайдер одержувача можуть читати, аналізувати або змінювати ваші листи, включаючи будь-які вкладення.</p>
|
||||||
they are still protected from cell or cable companies who can not read or modify your email messages.
|
|
||||||
But both your and your recipient’s email providers
|
|
||||||
may read, analyze or modify your messages, including any attachments.</p>
|
|
||||||
|
|
||||||
<p>Delta Chat by default uses strict
|
<p>За замовчуванням Delta Chat використовує суворе <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS-шифрування</a> яке захищає з’єднання між вашим пристроєм і провайдером електронної пошти. Вся робота з TLS-шифруванням Delta Chat пройшла незалежний <a href="#security-audits">аудит безпеки</a>. Крім того, з’єднання між вашим провайдером та провайдером електронної пошти одержувача зазвичай також шифрується при передачі даних. Якщо задіяні поштові сервери підтримують <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a> то між провайдерами електронної пошти буде застосовуватися транспортне шифрування в цьому випадку повідомлення Delta Chat ніколи не будуть доступні в Інтернеті у вигляді відкритого тексту навіть якщо повідомлення не було наскрізь зашифровано.</p>
|
||||||
<a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS encryption</a>
|
|
||||||
which secures connections between your device and your email provider.
|
|
||||||
All of Delta Chat’s TLS-handling has been independently <a href="#security-audits">security audited</a>.
|
|
||||||
Moreover, the connection between your and the recipient’s email provider
|
|
||||||
will typically be transport-encrypted as well.
|
|
||||||
If the involved email servers support <a href="https://datatracker.ietf.org/doc/html/rfc8461">MTA-STS</a>
|
|
||||||
then transport encryption will be enforced between email providers
|
|
||||||
in which case Delta Chat communications will never be exposed in cleartext to the Internet
|
|
||||||
even if the message was not end-to-end encrypted.</p>
|
|
||||||
|
|
||||||
<h3 id="message-metadata">
|
<h3 id="message-metadata">
|
||||||
|
|
||||||
@@ -1209,6 +1453,29 @@ with the knowledge that all their data, along with all metadata, will be deleted
|
|||||||
Moreover, if a device is seized then chat contacts using short-lived profiles
|
Moreover, if a device is seized then chat contacts using short-lived profiles
|
||||||
can not be identified easily.</p>
|
can not be identified easily.</p>
|
||||||
|
|
||||||
|
<h3 id="who-sees-my-ip-address">
|
||||||
|
|
||||||
|
|
||||||
|
Who sees my IP Address? <a href="#who-sees-my-ip-address" class="anchor"></a>
|
||||||
|
|
||||||
|
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<p>The used <a href="#relays">relays</a> need to know your IP Address,
|
||||||
|
as well as sometimes your contact’s devices if you have a <a href="#calls">call</a>
|
||||||
|
or use <a href="#webxdc">apps</a> together.</p>
|
||||||
|
|
||||||
|
<p>IP Addresses are needed for connectivity and efficiency.
|
||||||
|
Delta Chat neither persists nor exposes them.
|
||||||
|
Note that IP Addresses
|
||||||
|
are not like an address you give to a delivery service,
|
||||||
|
but typically less precise, often defining city or region only.</p>
|
||||||
|
|
||||||
|
<p>If you see your IP Address as a risk,
|
||||||
|
we recommend to use a VPN for the whole system.
|
||||||
|
Per-app options leave gaps across your system.
|
||||||
|
For example, tapping a link can expose IP Addresses to unknown parties, which is by far the larger risk.</p>
|
||||||
|
|
||||||
<h3 id="sealedsender">
|
<h3 id="sealedsender">
|
||||||
|
|
||||||
|
|
||||||
@@ -1235,11 +1502,13 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Ні, поки ще ні.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat наразі не підтримує ідеальну пряму секретність (Perfect Forward Secrecy, PFS). Це означає, що якщо ваш приватний ключ для розшифрування буде скомпрометовано, а хтось заздалегідь зібрав ваші повідомлення під час передачі, він зможе розшифрувати та прочитати їх, використовуючи зламаний ключ. Зверніть увагу, що пряма секретність підвищує рівень безпеки лише в тому разі, якщо ви видаляєте повідомлення. Інакше, якщо хтось отримує доступ до ваших ключів розшифрування, він зазвичай також має доступ до всіх ваших невидалених повідомлень і навіть не потребує розшифровувати заздалегідь перехоплені дані.</p>
|
<p>Delta Chat наразі не підтримує ідеальну пряму секретність (Perfect Forward Secrecy, PFS). Це означає, що якщо ваш приватний ключ для розшифрування буде скомпрометовано, а хтось заздалегідь зібрав ваші повідомлення під час передачі, він зможе розшифрувати та прочитати їх, використовуючи зламаний ключ. Зверніть увагу, що пряма секретність підвищує рівень безпеки лише в тому разі, якщо ви видаляєте повідомлення. Інакше, якщо хтось отримує доступ до ваших ключів розшифрування, він зазвичай також має доступ до всіх ваших невидалених повідомлень і навіть не потребує розшифровувати заздалегідь перехоплені дані.</p>
|
||||||
|
|
||||||
<p>Ми розробили підхід Forward Secrecy, який витримав початкову експертизу від деяких криптографів та експертів з реалізації але чекає на більш офіційний звіт щоб переконатися, що він надійно працює в об’єднаних системах обміну повідомленнями та при використанні декількох пристроїв, перш ніж його можна буде реалізувати в <a href="https://github.com/chatmail/core">ядрі чату</a>, що зробить його доступним у всіх <a href="https://chatmail.at/clients">клієнтах чату</a>.</p>
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will provide reliable deletion (forward secrecy) through automatic key rotation.
|
||||||
|
This approach is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
|
|
||||||
<h3 id="pqc">
|
<h3 id="pqc">
|
||||||
|
|
||||||
@@ -1249,9 +1518,13 @@ but an implementation has not been agreed as a priority yet.</p>
|
|||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<p>Ні, поки ще ні.</p>
|
<p>Not yet, but it’s coming with <a href="https://autocrypt2.org">Autocrypt v2</a>.</p>
|
||||||
|
|
||||||
<p>Delta Chat використовує бібліотеку Rust OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a> яка підтримує останню версію <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>. Ми плануємо додати підтримку PQC у <a href="https://github.com/chatmail/core">chatmail core</a> після того, як проект буде завершено у IETF у співпраці з іншими розробниками OpenPGP.</p>
|
<p><a href="https://autocrypt2.org">Autocrypt v2</a>, scheduled for full implementation in 2026,
|
||||||
|
will bring post-quantum resistant encryption to protect against quantum computer attacks.
|
||||||
|
Delta Chat uses the Rust OpenPGP library <a href="https://github.com/rpgp/rpgp">rPGP</a>
|
||||||
|
which supports the latest <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/">IETF Post-Quantum-Cryptography OpenPGP draft</a>.
|
||||||
|
The implementation is specified in the <a href="https://datatracker.ietf.org/doc/draft-autocrypt-openpgp-v2-cert/">Autocrypt v2 OpenPGP Certificates</a> draft.</p>
|
||||||
|
|
||||||
<h3 id="як-я-можу-вручну-перевірити-інформацію-про-шифрування">
|
<h3 id="як-я-можу-вручну-перевірити-інформацію-про-шифрування">
|
||||||
|
|
||||||
@@ -1308,7 +1581,7 @@ you need to look it up in the “keypairs” SQLite table of a profile backup ta
|
|||||||
<p>Починаючи з 2023 року, ми виправили проблеми з безпекою та конфіденційністю у функції “веб застосунків, що поширені у чаті”, пов’язані зі збоями в роботі пісочниці особливо в Chromium. Згодом ми отримали незалежний аудит безпеки аудит безпеки від Cure53, і всі знайдені проблеми були виправлені в серії додатків 1.36, випущених у квітні 2023 року. Повну історію про наскрізну безпеку в Інтернеті дивіться <a href="https://delta.chat/en/2023-05-22-webxdc-security">тут</a>.</p>
|
<p>Починаючи з 2023 року, ми виправили проблеми з безпекою та конфіденційністю у функції “веб застосунків, що поширені у чаті”, пов’язані зі збоями в роботі пісочниці особливо в Chromium. Згодом ми отримали незалежний аудит безпеки аудит безпеки від Cure53, і всі знайдені проблеми були виправлені в серії додатків 1.36, випущених у квітні 2023 року. Повну історію про наскрізну безпеку в Інтернеті дивіться <a href="https://delta.chat/en/2023-05-22-webxdc-security">тут</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Починаючи з 2023 року <a href="https://cure53.de">Cure53</a> проаналізував транспортне шифрування мережевих з’єднань Delta Chat і відтворюване налаштування поштового сервера як <a href="https://delta.chat/uk/serverguide">рекомендовано на цьому сайті</a>. Ви можете прочитати більше про аудит <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">у нашому блозі</a> або прочитайте <a href="https://delta.chat/assets/blog/MER-01-report.pdf">повний звіт тут</a>.</p>
|
<p>Починаючи з 2023 року <a href="https://cure53.de">Cure53</a> проаналізував транспортне шифрування мережевих з’єднань Delta Chat і відтворюване налаштування поштового сервера як <a href="https://delta.chat/serverguide">рекомендовано на цьому сайті</a>. Ви можете прочитати більше про аудит <a href="https://delta.chat/en/2023-03-27-third-independent-security-audit">у нашому блозі</a> або прочитайте <a href="https://delta.chat/assets/blog/MER-01-report.pdf">повний звіт тут</a>.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>У 2020 році <a href="https://includesecurity.com">Include Security</a> проаналізувала Rust-<a href="https://github.com/deltachat/deltachat-core-rust/">ядро</a> Delta Chat і бібліотеки <a href="https://github.com/async-email/async-imap">IMAP</a>, <a href="https://github.com/async-email/async-smtp">SMTP</a> та <a href="https://github.com/async-email/async-native-tls">TLS</a>. Він не виявив критичних або серйозних проблем. У звіті виявлено кілька слабких місць середнього ступеня тяжкості – вони самі по собі не становлять загрози для користувачів Delta Chat оскільки вони залежать від середовища, у якому використовується Delta Chat. З міркувань зручності використання та сумісності ми не можемо пом’якшити їх усі тому вирішили надати рекомендації щодо безпеки користувачам, яким загрожує небезпека. Ви можете прочитати <a href="https://delta.chat/assets/blog/2020-second-security-review.pdf">повний звіт тут</a>.</p>
|
<p>У 2020 році <a href="https://includesecurity.com">Include Security</a> проаналізувала Rust-<a href="https://github.com/deltachat/deltachat-core-rust/">ядро</a> Delta Chat і бібліотеки <a href="https://github.com/async-email/async-imap">IMAP</a>, <a href="https://github.com/async-email/async-smtp">SMTP</a> та <a href="https://github.com/async-email/async-native-tls">TLS</a>. Він не виявив критичних або серйозних проблем. У звіті виявлено кілька слабких місць середнього ступеня тяжкості – вони самі по собі не становлять загрози для користувачів Delta Chat оскільки вони залежать від середовища, у якому використовується Delta Chat. З міркувань зручності використання та сумісності ми не можемо пом’якшити їх усі тому вирішили надати рекомендації щодо безпеки користувачам, яким загрожує небезпека. Ви можете прочитати <a href="https://delta.chat/assets/blog/2020-second-security-review.pdf">повний звіт тут</a>.</p>
|
||||||
@@ -1382,7 +1655,14 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microso
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<p>Проект ЄС <a href="https://nextleap.eu">NEXTLEAP</a> фінансував дослідження та впровадження верифікованих груп і протоколів встановлення контактів у 2017 та 2018 роках, а також допоміг інтегрувати наскрізне шифрування через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
<p>У 2023 та 2024 роках нас прийняли до програми Next Generation Internet (NGI) за нашу роботу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>, а також у співпраці з партнерами, які працюють над <a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>, <a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>, <a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> та <a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>. Усі ці проєкти частково завершені або будуть завершені на початку 2025 року.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>У 2021 році ми отримали подальше фінансування від ЄС на дві пропозиції щодо Інтернету наступного покоління а саме на <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - каталог перенесення провайдерів електронної пошти</a> (~97 тис. євро) та <a href="https://nlnet.nl/project/EmailPorting/">AEAP - перенесення адрес електронної пошти</a> (~90 тис. євро), що дозволило нам покращити багатопрофільну підтримку, вдосконалити налаштування контактів та груп за допомогою QR-коду та багато інших мережевих покращень на всіх платформах.</p>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<p>Фонд <a href="https://nlnet.nl/">NLnet</a> виділив у 2019/2020 роках 46 тисяч євро на
|
||||||
|
завершення прив’язок Rust/Python та запуск екосистеми чат-ботів.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> надав нам два гранти.
|
<p><a href="https://opentechfund.org">Open Technology Fund</a> надав нам два гранти.
|
||||||
@@ -1395,25 +1675,7 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microso
|
|||||||
і додати нові функції для всіх платформ.</p>
|
і додати нові функції для всіх платформ.</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Фонд <a href="https://nlnet.nl/">NLnet</a> виділив у 2019/2020 роках 46 тисяч євро на
|
<p>Проект ЄС <a href="https://nextleap.eu">NEXTLEAP</a> фінансував дослідження та впровадження верифікованих груп і протоколів встановлення контактів у 2017 та 2018 роках, а також допоміг інтегрувати наскрізне шифрування через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||||
завершення прив’язок Rust/Python та запуск екосистеми чат-ботів.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
|
||||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
|
||||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
|
||||||
This funding supported our long-running goals to make Delta Chat more usable
|
|
||||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
|
||||||
in places often affected by internet censorship and shutdowns.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>У 2023-2024 роках ми успішно завершили проєкт <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail</a>, що фінансувався OTF, що дозволило нам запровадити гарантоване шифрування, створити <a href="https://delta.chat/chatmail">мережу серверів chatmail</a> та забезпечити “миттєву реєстрацію” у всіх застосунках, випущених з квітня 2024 року.</p>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<p>У 2023 та 2024 роках нас прийняли до програми Next Generation Internet (NGI) за нашу роботу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>, а також у співпраці з партнерами, які працюють над <a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>, <a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>, <a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> та <a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>. Усі ці проєкти частково завершені або будуть завершені на початку 2025 року.</p>
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>Іноді ми отримуємо одноразові пожертви від приватних осіб. Наприклад, у 2021 році щедра приватна особа перерахував нам 4 тис. євро з повідомленням «так тримати!». 💜 Ми використовуємо такі пожертви для фінансування зборів на розвиток або для тимчасових витрат, які важко передбачити або відшкодувати за рахунок грантів державного фінансування. Отримання більшої кількості пожертв також допомагає нам стати більш незалежними та довгостроково життєздатними як спільнота контриб’юторів.</p>
|
<p>Іноді ми отримуємо одноразові пожертви від приватних осіб. Наприклад, у 2021 році щедра приватна особа перерахував нам 4 тис. євро з повідомленням «так тримати!». 💜 Ми використовуємо такі пожертви для фінансування зборів на розвиток або для тимчасових витрат, які важко передбачити або відшкодувати за рахунок грантів державного фінансування. Отримання більшої кількості пожертв також допомагає нам стати більш незалежними та довгостроково життєздатними як спільнота контриб’юторів.</p>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
/* Basic RPC Transport implementation */
|
/* Basic RPC Transport implementation */
|
||||||
public abstract class BaseTransport implements Rpc.Transport {
|
public abstract class BaseRpcTransport implements Rpc.RpcTransport {
|
||||||
private final Map<Integer, SettableFuture<JsonNode>> requestFutures = new ConcurrentHashMap<>();
|
private final Map<Integer, SettableFuture<JsonNode>> requestFutures = new ConcurrentHashMap<>();
|
||||||
private int requestId = 0;
|
private int requestId = 0;
|
||||||
private final ObjectMapper mapper = new ObjectMapper();
|
private final ObjectMapper mapper = new ObjectMapper();
|
||||||
@@ -94,7 +94,7 @@ public abstract class BaseTransport implements Rpc.Transport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (response.error != null) {
|
if (response.error != null) {
|
||||||
future.setException(new RpcException(response.error.toString()));
|
future.setException(new RpcException(response.error.message));
|
||||||
} else if (response.result != null) {
|
} else if (response.result != null) {
|
||||||
future.set(response.result);
|
future.set(response.result);
|
||||||
} else {
|
} 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 {
|
private static class Response {
|
||||||
public String jsonrpc;
|
public String jsonrpc;
|
||||||
public int id;
|
public int id;
|
||||||
public JsonNode result;
|
public JsonNode result;
|
||||||
public JsonNode error;
|
public RpcError error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,31 +9,31 @@ import chat.delta.rpc.types.*;
|
|||||||
|
|
||||||
public class Rpc {
|
public class Rpc {
|
||||||
|
|
||||||
public interface Transport {
|
public interface RpcTransport {
|
||||||
void call(String method, JsonNode... params) throws RpcException;
|
void call(String method, JsonNode... params) throws RpcException;
|
||||||
<T> T callForResult(TypeReference<T> resultType, String method, JsonNode... params) throws RpcException;
|
<T> T callForResult(TypeReference<T> resultType, String method, JsonNode... params) throws RpcException;
|
||||||
ObjectMapper getObjectMapper();
|
ObjectMapper getObjectMapper();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Transport transport;
|
public final RpcTransport transport;
|
||||||
private final ObjectMapper mapper;
|
private final ObjectMapper mapper;
|
||||||
|
|
||||||
public Rpc(Transport transport) {
|
public Rpc(RpcTransport transport) {
|
||||||
this.transport = transport;
|
this.transport = transport;
|
||||||
this.mapper = transport.getObjectMapper();
|
this.mapper = transport.getObjectMapper();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test function. */
|
/** Test function. */
|
||||||
public void sleep(Float delay) throws RpcException {
|
public void sleep(Float delay) throws RpcException {
|
||||||
transport.call("sleep", mapper.valueToTree(delay));
|
transport.call("sleep", mapper.valueToTree(delay));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checks if an email address is valid. */
|
/** Checks if an email address is valid. */
|
||||||
public Boolean checkEmailValidity(String email) throws RpcException {
|
public Boolean checkEmailValidity(String email) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Boolean>(){}, "check_email_validity", mapper.valueToTree(email));
|
return transport.callForResult(new TypeReference<Boolean>(){}, "check_email_validity", mapper.valueToTree(email));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns general system info. */
|
/** Returns general system info. */
|
||||||
public java.util.Map<String, String> getSystemInfo() throws RpcException {
|
public java.util.Map<String, String> getSystemInfo() throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "get_system_info");
|
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "get_system_info");
|
||||||
}
|
}
|
||||||
@@ -53,6 +53,11 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<Event>(){}, "get_next_event");
|
return transport.callForResult(new TypeReference<Event>(){}, "get_next_event");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Waits for at least one event and return a batch of events. */
|
||||||
|
public java.util.List<Event> getNextEventBatch() throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<java.util.List<Event>>(){}, "get_next_event_batch");
|
||||||
|
}
|
||||||
|
|
||||||
public Integer addAccount() throws RpcException {
|
public Integer addAccount() throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "add_account");
|
return transport.callForResult(new TypeReference<Integer>(){}, "add_account");
|
||||||
}
|
}
|
||||||
@@ -73,12 +78,12 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_all_account_ids");
|
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_all_account_ids");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Select account in account manager, this saves the last used account to accounts.toml */
|
/** Select account in account manager, this saves the last used account to accounts.toml */
|
||||||
public void selectAccount(Integer id) throws RpcException {
|
public void selectAccount(Integer id) throws RpcException {
|
||||||
transport.call("select_account", mapper.valueToTree(id));
|
transport.call("select_account", mapper.valueToTree(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the selected account from the account manager (on startup it is read from accounts.toml) */
|
/** Get the selected account from the account manager (on startup it is read from accounts.toml) */
|
||||||
public Integer getSelectedAccountId() throws RpcException {
|
public Integer getSelectedAccountId() throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "get_selected_account_id");
|
return transport.callForResult(new TypeReference<Integer>(){}, "get_selected_account_id");
|
||||||
}
|
}
|
||||||
@@ -93,17 +98,17 @@ public class Rpc {
|
|||||||
transport.call("set_accounts_order", mapper.valueToTree(order));
|
transport.call("set_accounts_order", mapper.valueToTree(order));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get a list of all configured accounts. */
|
/** Get a list of all configured accounts. */
|
||||||
public java.util.List<Account> getAllAccounts() throws RpcException {
|
public java.util.List<Account> getAllAccounts() throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<Account>>(){}, "get_all_accounts");
|
return transport.callForResult(new TypeReference<java.util.List<Account>>(){}, "get_all_accounts");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Starts background tasks for all accounts. */
|
/** Starts background tasks for all accounts. */
|
||||||
public void startIoForAllAccounts() throws RpcException {
|
public void startIoForAllAccounts() throws RpcException {
|
||||||
transport.call("start_io_for_all_accounts");
|
transport.call("start_io_for_all_accounts");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stops background tasks for all accounts. */
|
/** Stops background tasks for all accounts. */
|
||||||
public void stopIoForAllAccounts() throws RpcException {
|
public void stopIoForAllAccounts() throws RpcException {
|
||||||
transport.call("stop_io_for_all_accounts");
|
transport.call("stop_io_for_all_accounts");
|
||||||
}
|
}
|
||||||
@@ -123,27 +128,27 @@ public class Rpc {
|
|||||||
transport.call("stop_background_fetch");
|
transport.call("stop_background_fetch");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Starts background tasks for a single account. */
|
/** Starts background tasks for a single account. */
|
||||||
public void startIo(Integer accountId) throws RpcException {
|
public void startIo(Integer accountId) throws RpcException {
|
||||||
transport.call("start_io", mapper.valueToTree(accountId));
|
transport.call("start_io", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stops background tasks for a single account. */
|
/** Stops background tasks for a single account. */
|
||||||
public void stopIo(Integer accountId) throws RpcException {
|
public void stopIo(Integer accountId) throws RpcException {
|
||||||
transport.call("stop_io", mapper.valueToTree(accountId));
|
transport.call("stop_io", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get top-level info for an account. */
|
/** Get top-level info for an account. */
|
||||||
public Account getAccountInfo(Integer accountId) throws RpcException {
|
public Account getAccountInfo(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Account>(){}, "get_account_info", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<Account>(){}, "get_account_info", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the current push notification state. */
|
/** Get the current push notification state. */
|
||||||
public NotifyState getPushState(Integer accountId) throws RpcException {
|
public NotifyState getPushState(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<NotifyState>(){}, "get_push_state", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<NotifyState>(){}, "get_push_state", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the combined filesize of an account in bytes */
|
/** Get the combined filesize of an account in bytes */
|
||||||
public Integer getAccountFileSize(Integer accountId) throws RpcException {
|
public Integer getAccountFileSize(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "get_account_file_size", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<Integer>(){}, "get_account_file_size", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
@@ -160,22 +165,22 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<ProviderInfo>(){}, "get_provider_info", mapper.valueToTree(accountId), mapper.valueToTree(email));
|
return transport.callForResult(new TypeReference<ProviderInfo>(){}, "get_provider_info", mapper.valueToTree(accountId), mapper.valueToTree(email));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checks if the context is already configured. */
|
/** Checks if the context is already configured. */
|
||||||
public Boolean isConfigured(Integer accountId) throws RpcException {
|
public Boolean isConfigured(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Boolean>(){}, "is_configured", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<Boolean>(){}, "is_configured", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get system info for an account. */
|
/** Get system info for an account. */
|
||||||
public java.util.Map<String, String> getInfo(Integer accountId) throws RpcException {
|
public java.util.Map<String, String> getInfo(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "get_info", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "get_info", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get storage usage report as formatted string */
|
/** Get storage usage report as formatted string */
|
||||||
public String getStorageUsageReportString(Integer accountId) throws RpcException {
|
public String getStorageUsageReportString(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<String>(){}, "get_storage_usage_report_string", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<String>(){}, "get_storage_usage_report_string", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the blob dir. */
|
/** Get the blob dir. */
|
||||||
public String getBlobDir(Integer accountId) throws RpcException {
|
public String getBlobDir(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<String>(){}, "get_blob_dir", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<String>(){}, "get_blob_dir", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
@@ -195,27 +200,27 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<String>(){}, "get_migration_error", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<String>(){}, "get_migration_error", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy file to blob dir. */
|
/** Copy file to blob dir. */
|
||||||
public String copyToBlobDir(Integer accountId, String path) throws RpcException {
|
public String copyToBlobDir(Integer accountId, String path) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<String>(){}, "copy_to_blob_dir", mapper.valueToTree(accountId), mapper.valueToTree(path));
|
return transport.callForResult(new TypeReference<String>(){}, "copy_to_blob_dir", mapper.valueToTree(accountId), mapper.valueToTree(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets the given configuration key. */
|
/** Sets the given configuration key. */
|
||||||
public void setConfig(Integer accountId, String key, String value) throws RpcException {
|
public void setConfig(Integer accountId, String key, String value) throws RpcException {
|
||||||
transport.call("set_config", mapper.valueToTree(accountId), mapper.valueToTree(key), mapper.valueToTree(value));
|
transport.call("set_config", mapper.valueToTree(accountId), mapper.valueToTree(key), mapper.valueToTree(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Updates a batch of configuration values. */
|
/** Updates a batch of configuration values. */
|
||||||
public void batchSetConfig(Integer accountId, java.util.Map<String, String> config) throws RpcException {
|
public void batchSetConfig(Integer accountId, java.util.Map<String, String> config) throws RpcException {
|
||||||
transport.call("batch_set_config", mapper.valueToTree(accountId), mapper.valueToTree(config));
|
transport.call("batch_set_config", mapper.valueToTree(accountId), mapper.valueToTree(config));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set configuration values from a QR code. (technically from the URI that is stored in the qrcode)
|
* Set configuration values from a QR code (technically from the URI stored in it).
|
||||||
* Before this function is called, `checkQr()` should confirm the type of the
|
* Before this function is called, `check_qr()` should be used to get the QR code type.
|
||||||
* QR code is `account` or `webrtcInstance`.
|
|
||||||
* <p>
|
* <p>
|
||||||
* Internally, the function will call dc_set_config() with the appropriate keys,
|
* "DCACCOUNT:" and "DCLOGIN:" QR codes configure the account, but I/O mustn't be started for
|
||||||
|
* such QR codes, consider using [`Self::add_transport_from_qr`] which also restarts I/O.
|
||||||
*/
|
*/
|
||||||
public void setConfigFromQr(Integer accountId, String qrContent) throws RpcException {
|
public void setConfigFromQr(Integer accountId, String qrContent) throws RpcException {
|
||||||
transport.call("set_config_from_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
|
transport.call("set_config_from_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
|
||||||
@@ -225,7 +230,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<Qr>(){}, "check_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
|
return transport.callForResult(new TypeReference<Qr>(){}, "check_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns configuration value for the given key. */
|
/** Returns configuration value for the given key. */
|
||||||
public String getConfig(Integer accountId, String key) throws RpcException {
|
public String getConfig(Integer accountId, String key) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<String>(){}, "get_config", mapper.valueToTree(accountId), mapper.valueToTree(key));
|
return transport.callForResult(new TypeReference<String>(){}, "get_config", mapper.valueToTree(accountId), mapper.valueToTree(key));
|
||||||
}
|
}
|
||||||
@@ -234,6 +239,11 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "batch_get_config", mapper.valueToTree(accountId), mapper.valueToTree(keys));
|
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "batch_get_config", mapper.valueToTree(accountId), mapper.valueToTree(keys));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Returns all `ui.*` config keys that were set by the UI. */
|
||||||
|
public java.util.List<String> getAllUiConfigKeys(Integer accountId) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<java.util.List<String>>(){}, "get_all_ui_config_keys", mapper.valueToTree(accountId));
|
||||||
|
}
|
||||||
|
|
||||||
public void setStockStrings(java.util.Map<String, String> strings) throws RpcException {
|
public void setStockStrings(java.util.Map<String, String> strings) throws RpcException {
|
||||||
transport.call("set_stock_strings", mapper.valueToTree(strings));
|
transport.call("set_stock_strings", mapper.valueToTree(strings));
|
||||||
}
|
}
|
||||||
@@ -279,12 +289,13 @@ public class Rpc {
|
|||||||
* from a server encoded in a QR code.
|
* from a server encoded in a QR code.
|
||||||
* - [Self::list_transports()] to get a list of all configured transports.
|
* - [Self::list_transports()] to get a list of all configured transports.
|
||||||
* - [Self::delete_transport()] to remove a transport.
|
* - [Self::delete_transport()] to remove a transport.
|
||||||
|
* - [Self::set_transport_unpublished()] to set whether contacts see this transport.
|
||||||
*/
|
*/
|
||||||
public void addOrUpdateTransport(Integer accountId, EnteredLoginParam param) throws RpcException {
|
public void addOrUpdateTransport(Integer accountId, EnteredLoginParam param) throws RpcException {
|
||||||
transport.call("add_or_update_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
|
transport.call("add_or_update_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deprecated 2025-04. Alias for [Self::add_or_update_transport()]. */
|
/** Deprecated 2025-04. Alias for [Self::add_or_update_transport()]. */
|
||||||
public void addTransport(Integer accountId, EnteredLoginParam param) throws RpcException {
|
public void addTransport(Integer accountId, EnteredLoginParam param) throws RpcException {
|
||||||
transport.call("add_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
|
transport.call("add_transport", mapper.valueToTree(accountId), mapper.valueToTree(param));
|
||||||
}
|
}
|
||||||
@@ -302,11 +313,22 @@ public class Rpc {
|
|||||||
* Returns the list of all email accounts that are used as a transport in the current profile.
|
* Returns the list of all email accounts that are used as a transport in the current profile.
|
||||||
* Use [Self::add_or_update_transport()] to add or change a transport
|
* Use [Self::add_or_update_transport()] to add or change a transport
|
||||||
* and [Self::delete_transport()] to delete a transport.
|
* and [Self::delete_transport()] to delete a transport.
|
||||||
|
* Use [Self::list_transports_ex()] to additionally query
|
||||||
|
* whether the transports are marked as 'unpublished'.
|
||||||
*/
|
*/
|
||||||
public java.util.List<EnteredLoginParam> listTransports(Integer accountId) throws RpcException {
|
public java.util.List<EnteredLoginParam> listTransports(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<EnteredLoginParam>>(){}, "list_transports", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<java.util.List<EnteredLoginParam>>(){}, "list_transports", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of all email accounts that are used as a transport in the current profile.
|
||||||
|
* Use [Self::add_or_update_transport()] to add or change a transport
|
||||||
|
* and [Self::delete_transport()] to delete a transport.
|
||||||
|
*/
|
||||||
|
public java.util.List<TransportListEntry> listTransportsEx(Integer accountId) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<java.util.List<TransportListEntry>>(){}, "list_transports_ex", mapper.valueToTree(accountId));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the transport with the specified email address
|
* Removes the transport with the specified email address
|
||||||
* (i.e. [EnteredLoginParam::addr]).
|
* (i.e. [EnteredLoginParam::addr]).
|
||||||
@@ -315,7 +337,23 @@ public class Rpc {
|
|||||||
transport.call("delete_transport", mapper.valueToTree(accountId), mapper.valueToTree(addr));
|
transport.call("delete_transport", mapper.valueToTree(accountId), mapper.valueToTree(addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Signal an ongoing process to stop. */
|
/**
|
||||||
|
* Change whether the transport is unpublished.
|
||||||
|
* <p>
|
||||||
|
* Unpublished transports are not advertised to contacts,
|
||||||
|
* and self-sent messages are not sent there,
|
||||||
|
* so that we don't cause extra messages to the corresponding inbox,
|
||||||
|
* but can still receive messages from contacts who don't know our new transport addresses yet.
|
||||||
|
* <p>
|
||||||
|
* The default is false, but when the user updates from a version that didn't have this flag,
|
||||||
|
* existing secondary transports are set to unpublished,
|
||||||
|
* so that an existing transport address doesn't suddenly get spammed with a lot of messages.
|
||||||
|
*/
|
||||||
|
public void setTransportUnpublished(Integer accountId, String addr, Boolean unpublished) throws RpcException {
|
||||||
|
transport.call("set_transport_unpublished", mapper.valueToTree(accountId), mapper.valueToTree(addr), mapper.valueToTree(unpublished));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Signal an ongoing process to stop. */
|
||||||
public void stopOngoingProcess(Integer accountId) throws RpcException {
|
public void stopOngoingProcess(Integer accountId) throws RpcException {
|
||||||
transport.call("stop_ongoing_process", mapper.valueToTree(accountId));
|
transport.call("stop_ongoing_process", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
@@ -358,7 +396,7 @@ public class Rpc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets messages to be processed by the bot and returns their IDs.
|
* (deprecated) Gets messages to be processed by the bot and returns their IDs.
|
||||||
* <p>
|
* <p>
|
||||||
* Only messages with database ID higher than `last_msg_id` config value
|
* Only messages with database ID higher than `last_msg_id` config value
|
||||||
* are returned. After processing the messages, the bot should
|
* are returned. After processing the messages, the bot should
|
||||||
@@ -366,6 +404,13 @@ public class Rpc {
|
|||||||
* or manually updating the value to avoid getting already
|
* or manually updating the value to avoid getting already
|
||||||
* processed messages.
|
* processed messages.
|
||||||
* <p>
|
* <p>
|
||||||
|
* Deprecated 2026-04: This returns the message's id as soon as the first part arrives,
|
||||||
|
* even if it is not fully downloaded yet.
|
||||||
|
* The bot needs to wait for the message to be fully downloaded.
|
||||||
|
* Since this is usually not the desired behavior,
|
||||||
|
* bots should instead use the #DC_EVENT_INCOMING_MSG / [`types::events::EventType::IncomingMsg`]
|
||||||
|
* event for getting notified about new messages.
|
||||||
|
* <p>
|
||||||
* [`markseen_msgs`]: Self::markseen_msgs
|
* [`markseen_msgs`]: Self::markseen_msgs
|
||||||
*/
|
*/
|
||||||
public java.util.List<Integer> getNextMsgs(Integer accountId) throws RpcException {
|
public java.util.List<Integer> getNextMsgs(Integer accountId) throws RpcException {
|
||||||
@@ -373,7 +418,7 @@ public class Rpc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for messages to be processed by the bot and returns their IDs.
|
* (deprecated) Waits for messages to be processed by the bot and returns their IDs.
|
||||||
* <p>
|
* <p>
|
||||||
* This function is similar to [`get_next_msgs`],
|
* This function is similar to [`get_next_msgs`],
|
||||||
* but waits for internal new message notification before returning.
|
* but waits for internal new message notification before returning.
|
||||||
@@ -384,6 +429,13 @@ public class Rpc {
|
|||||||
* To shutdown the bot, stopping I/O can be used to interrupt
|
* To shutdown the bot, stopping I/O can be used to interrupt
|
||||||
* pending or next `wait_next_msgs` call.
|
* pending or next `wait_next_msgs` call.
|
||||||
* <p>
|
* <p>
|
||||||
|
* Deprecated 2026-04: This returns the message's id as soon as the first part arrives,
|
||||||
|
* even if it is not fully downloaded yet.
|
||||||
|
* The bot needs to wait for the message to be fully downloaded.
|
||||||
|
* Since this is usually not the desired behavior,
|
||||||
|
* bots should instead use the #DC_EVENT_INCOMING_MSG / [`types::events::EventType::IncomingMsg`]
|
||||||
|
* event for getting notified about new messages.
|
||||||
|
* <p>
|
||||||
* [`get_next_msgs`]: Self::get_next_msgs
|
* [`get_next_msgs`]: Self::get_next_msgs
|
||||||
*/
|
*/
|
||||||
public java.util.List<Integer> waitNextMsgs(Integer accountId) throws RpcException {
|
public java.util.List<Integer> waitNextMsgs(Integer accountId) throws RpcException {
|
||||||
@@ -391,23 +443,24 @@ public class Rpc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Estimate the number of messages that will be deleted
|
* Estimates the number of messages that will be deleted
|
||||||
* by the set_config()-options `delete_device_after` or `delete_server_after`.
|
* by the `set_config()`-option `delete_device_after`.
|
||||||
|
* <p>
|
||||||
* This is typically used to show the estimated impact to the user
|
* This is typically used to show the estimated impact to the user
|
||||||
* before actually enabling deletion of old messages.
|
* before actually enabling deletion of old messages.
|
||||||
|
* <p>
|
||||||
|
* Messages in the "Saved Messages" chat are not counted as they will not be deleted automatically.
|
||||||
|
* <p>
|
||||||
|
* Parameters:
|
||||||
|
* - `from_server`: Deprecated, pass `false` here
|
||||||
|
* - `seconds`: Count messages older than the given number of seconds.
|
||||||
|
* <p>
|
||||||
|
* Returns the number of messages that are older than the given number of seconds.
|
||||||
*/
|
*/
|
||||||
public Integer estimateAutoDeletionCount(Integer accountId, Boolean fromServer, Integer seconds) throws RpcException {
|
public Integer estimateAutoDeletionCount(Integer accountId, Boolean fromServer, Integer seconds) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "estimate_auto_deletion_count", mapper.valueToTree(accountId), mapper.valueToTree(fromServer), mapper.valueToTree(seconds));
|
return transport.callForResult(new TypeReference<Integer>(){}, "estimate_auto_deletion_count", mapper.valueToTree(accountId), mapper.valueToTree(fromServer), mapper.valueToTree(seconds));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String initiateAutocryptKeyTransfer(Integer accountId) throws RpcException {
|
|
||||||
return transport.callForResult(new TypeReference<String>(){}, "initiate_autocrypt_key_transfer", mapper.valueToTree(accountId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void continueAutocryptKeyTransfer(Integer accountId, Integer messageId, String setupCode) throws RpcException {
|
|
||||||
transport.call("continue_autocrypt_key_transfer", mapper.valueToTree(accountId), mapper.valueToTree(messageId), mapper.valueToTree(setupCode));
|
|
||||||
}
|
|
||||||
|
|
||||||
public java.util.List<Integer> getChatlistEntries(Integer accountId, Integer listFlags, String queryString, Integer queryContactId) throws RpcException {
|
public java.util.List<Integer> getChatlistEntries(Integer accountId, Integer listFlags, String queryString, Integer queryContactId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_chatlist_entries", mapper.valueToTree(accountId), mapper.valueToTree(listFlags), mapper.valueToTree(queryString), mapper.valueToTree(queryContactId));
|
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_chatlist_entries", mapper.valueToTree(accountId), mapper.valueToTree(listFlags), mapper.valueToTree(queryString), mapper.valueToTree(queryContactId));
|
||||||
}
|
}
|
||||||
@@ -449,11 +502,11 @@ public class Rpc {
|
|||||||
* Delete a chat.
|
* Delete a chat.
|
||||||
* <p>
|
* <p>
|
||||||
* Messages are deleted from the device and the chat database entry is deleted.
|
* Messages are deleted from the device and the chat database entry is deleted.
|
||||||
* After that, the event #DC_EVENT_MSGS_CHANGED is posted.
|
* After that, a `MsgsChanged` event is emitted.
|
||||||
|
* Messages are deleted from the server in background.
|
||||||
* <p>
|
* <p>
|
||||||
* Things that are _not done_ implicitly:
|
* Things that are _not done_ implicitly:
|
||||||
* <p>
|
* <p>
|
||||||
* - Messages are **not deleted from the server**.
|
|
||||||
* - The chat or the contact is **not blocked**, so new messages from the user/the group may appear as a contact request
|
* - The chat or the contact is **not blocked**, so new messages from the user/the group may appear as a contact request
|
||||||
* and the user may create the chat again.
|
* and the user may create the chat again.
|
||||||
* - **Groups are not left** - this would
|
* - **Groups are not left** - this would
|
||||||
@@ -499,6 +552,8 @@ public class Rpc {
|
|||||||
* if `checkQr()` returns `askVerifyContact` or `askVerifyGroup`
|
* if `checkQr()` returns `askVerifyContact` or `askVerifyGroup`
|
||||||
* an out-of-band-verification can be joined using `secure_join()`
|
* an out-of-band-verification can be joined using `secure_join()`
|
||||||
* <p>
|
* <p>
|
||||||
|
* @deprecated as of 2026-03; use create_qr_svg(get_chat_securejoin_qr_code()) instead.
|
||||||
|
* <p>
|
||||||
* chat_id: If set to a group-chat-id,
|
* chat_id: If set to a group-chat-id,
|
||||||
* the Verified-Group-Invite protocol is offered in the QR code;
|
* the Verified-Group-Invite protocol is offered in the QR code;
|
||||||
* works for protected groups as well as for normal groups.
|
* works for protected groups as well as for normal groups.
|
||||||
@@ -608,7 +663,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_chat_contacts", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_chat_contacts", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns contact IDs of the past chat members. */
|
/** Returns contact IDs of the past chat members. */
|
||||||
public java.util.List<Integer> getPastChatContacts(Integer accountId, Integer chatId) throws RpcException {
|
public java.util.List<Integer> getPastChatContacts(Integer accountId, Integer chatId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_past_chat_contacts", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_past_chat_contacts", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
}
|
}
|
||||||
@@ -647,7 +702,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<Integer>(){}, "create_group_chat_unencrypted", mapper.valueToTree(accountId), mapper.valueToTree(name));
|
return transport.callForResult(new TypeReference<Integer>(){}, "create_group_chat_unencrypted", mapper.valueToTree(accountId), mapper.valueToTree(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deprecated 2025-07 in favor of create_broadcast(). */
|
/** Deprecated 2025-07 in favor of create_broadcast(). */
|
||||||
public Integer createBroadcastList(Integer accountId) throws RpcException {
|
public Integer createBroadcastList(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "create_broadcast_list", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<Integer>(){}, "create_broadcast_list", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
@@ -664,9 +719,6 @@ public class Rpc {
|
|||||||
* because the word "channel" already appears a lot in the code,
|
* because the word "channel" already appears a lot in the code,
|
||||||
* which would make it hard to grep for it.
|
* which would make it hard to grep for it.
|
||||||
* <p>
|
* <p>
|
||||||
* After creation, the chat contains no recipients and is in _unpromoted_ state;
|
|
||||||
* see [`CommandApi::create_group_chat`] for more information on the unpromoted state.
|
|
||||||
* <p>
|
|
||||||
* Returns the created chat's id.
|
* Returns the created chat's id.
|
||||||
*/
|
*/
|
||||||
public Integer createBroadcast(Integer accountId, String chatName) throws RpcException {
|
public Integer createBroadcast(Integer accountId, String chatName) throws RpcException {
|
||||||
@@ -677,7 +729,8 @@ public class Rpc {
|
|||||||
* Set group name.
|
* Set group name.
|
||||||
* <p>
|
* <p>
|
||||||
* If the group is already _promoted_ (any message was sent to the group),
|
* If the group is already _promoted_ (any message was sent to the group),
|
||||||
* all group members are informed by a special status message that is sent automatically by this function.
|
* or if this is a brodacast channel,
|
||||||
|
* all members are informed by a special status message that is sent automatically by this function.
|
||||||
* <p>
|
* <p>
|
||||||
* Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
|
* Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
|
||||||
*/
|
*/
|
||||||
@@ -685,11 +738,37 @@ public class Rpc {
|
|||||||
transport.call("set_chat_name", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(newName));
|
transport.call("set_chat_name", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(newName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set group or broadcast channel description.
|
||||||
|
* <p>
|
||||||
|
* If the group is already _promoted_ (any message was sent to the group),
|
||||||
|
* or if this is a brodacast channel,
|
||||||
|
* all members are informed by a special status message that is sent automatically by this function.
|
||||||
|
* <p>
|
||||||
|
* Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
|
||||||
|
* <p>
|
||||||
|
* See also [`Self::get_chat_description`] / `getChatDescription()`.
|
||||||
|
*/
|
||||||
|
public void setChatDescription(Integer accountId, Integer chatId, String description) throws RpcException {
|
||||||
|
transport.call("set_chat_description", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(description));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the chat description from the database.
|
||||||
|
* <p>
|
||||||
|
* UIs show this in the profile page of the chat,
|
||||||
|
* it is settable by [`Self::set_chat_description`] / `setChatDescription()`.
|
||||||
|
*/
|
||||||
|
public String getChatDescription(Integer accountId, Integer chatId) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<String>(){}, "get_chat_description", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set group profile image.
|
* Set group profile image.
|
||||||
* <p>
|
* <p>
|
||||||
* If the group is already _promoted_ (any message was sent to the group),
|
* If the group is already _promoted_ (any message was sent to the group),
|
||||||
* all group members are informed by a special status message that is sent automatically by this function.
|
* or if this is a brodacast channel,
|
||||||
|
* all members are informed by a special status message that is sent automatically by this function.
|
||||||
* <p>
|
* <p>
|
||||||
* Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
|
* Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -733,11 +812,26 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<Integer>(){}, "add_device_message", mapper.valueToTree(accountId), mapper.valueToTree(label), mapper.valueToTree(msg));
|
return transport.callForResult(new TypeReference<Integer>(){}, "add_device_message", mapper.valueToTree(accountId), mapper.valueToTree(label), mapper.valueToTree(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark all messages in all chats as _noticed_.
|
||||||
|
* Skips messages from blocked contacts, but does not skip messages in muted chats.
|
||||||
|
* <p>
|
||||||
|
* _Noticed_ messages are no longer _fresh_ and do not count as being unseen
|
||||||
|
* but are still waiting for being marked as "seen" using markseen_msgs()
|
||||||
|
* (read receipts aren't sent for noticed messages).
|
||||||
|
* <p>
|
||||||
|
* Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED.
|
||||||
|
* See also markseen_msgs().
|
||||||
|
*/
|
||||||
|
public void marknoticedAllChats(Integer accountId) throws RpcException {
|
||||||
|
transport.call("marknoticed_all_chats", mapper.valueToTree(accountId));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mark all messages in a chat as _noticed_.
|
* Mark all messages in a chat as _noticed_.
|
||||||
* _Noticed_ messages are no longer _fresh_ and do not count as being unseen
|
* _Noticed_ messages are no longer _fresh_ and do not count as being unseen
|
||||||
* but are still waiting for being marked as "seen" using markseen_msgs()
|
* but are still waiting for being marked as "seen" using markseen_msgs()
|
||||||
* (IMAP/MDNs is not done for noticed messages).
|
* (read receipts aren't sent for noticed messages).
|
||||||
* <p>
|
* <p>
|
||||||
* Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED.
|
* Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED.
|
||||||
* See also markseen_msgs().
|
* See also markseen_msgs().
|
||||||
@@ -746,6 +840,16 @@ public class Rpc {
|
|||||||
transport.call("marknoticed_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
transport.call("marknoticed_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks the last incoming message in the chat as _fresh_.
|
||||||
|
* <p>
|
||||||
|
* UI can use this to offer a "mark unread" option,
|
||||||
|
* so that already noticed chats get a badge counter again.
|
||||||
|
*/
|
||||||
|
public void markfreshChat(Integer accountId, Integer chatId) throws RpcException {
|
||||||
|
transport.call("markfresh_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the message that is immediately followed by the last seen
|
* Returns the message that is immediately followed by the last seen
|
||||||
* message.
|
* message.
|
||||||
@@ -815,8 +919,22 @@ public class Rpc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all messages of a particular chat.
|
* Get all message IDs belonging to a chat.
|
||||||
* <p>
|
* <p>
|
||||||
|
* The list is already sorted and starts with the oldest message.
|
||||||
|
* Clients should not try to re-sort the list as this would be an expensive action
|
||||||
|
* and would result in inconsistencies between clients.
|
||||||
|
* Note that the messages are not necessarily sorted by their ID or by their displayed timestamp;
|
||||||
|
* UIs need to handle both the case of descending message IDs
|
||||||
|
* and of decreasing timestamps.
|
||||||
|
* <p>
|
||||||
|
* Optionally, 'daymarkers' added to the ID array may help to
|
||||||
|
* implement virtual lists.
|
||||||
|
* <p>
|
||||||
|
* Parameters:
|
||||||
|
* <p>
|
||||||
|
* * chat_id The chat ID of which the messages IDs should be queried.
|
||||||
|
* * _info_only: Deprecated, pass `false` here.
|
||||||
* * `add_daymarker` - If `true`, add day markers as `DC_MSG_ID_DAYMARKER` to the result,
|
* * `add_daymarker` - If `true`, add day markers as `DC_MSG_ID_DAYMARKER` to the result,
|
||||||
* e.g. [1234, 1237, 9, 1239]. The day marker timestamp is the midnight one for the
|
* e.g. [1234, 1237, 9, 1239]. The day marker timestamp is the midnight one for the
|
||||||
* corresponding (following) day in the local timezone.
|
* corresponding (following) day in the local timezone.
|
||||||
@@ -834,6 +952,14 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_existing_msg_ids", mapper.valueToTree(accountId), mapper.valueToTree(msgIds));
|
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "get_existing_msg_ids", mapper.valueToTree(accountId), mapper.valueToTree(msgIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all messages belonging to a chat.
|
||||||
|
* <p>
|
||||||
|
* Similar to `get_message_ids` / `getMessageIds`,
|
||||||
|
* see that function for details.
|
||||||
|
* The difference is that this function here returns a list of `MessageListItem`,
|
||||||
|
* which is an enum of a message or a daymarker.
|
||||||
|
*/
|
||||||
public java.util.List<MessageListItem> getMessageListItems(Integer accountId, Integer chatId, Boolean infoOnly, Boolean addDaymarker) throws RpcException {
|
public java.util.List<MessageListItem> getMessageListItems(Integer accountId, Integer chatId, Boolean infoOnly, Boolean addDaymarker) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<MessageListItem>>(){}, "get_message_list_items", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(infoOnly), mapper.valueToTree(addDaymarker));
|
return transport.callForResult(new TypeReference<java.util.List<MessageListItem>>(){}, "get_message_list_items", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(infoOnly), mapper.valueToTree(addDaymarker));
|
||||||
}
|
}
|
||||||
@@ -856,7 +982,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<java.util.Map<String, MessageLoadResult>>(){}, "get_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
|
return transport.callForResult(new TypeReference<java.util.Map<String, MessageLoadResult>>(){}, "get_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fetch info desktop needs for creating a notification for a message */
|
/** Fetch info desktop needs for creating a notification for a message */
|
||||||
public MessageNotificationInfo getMessageNotificationInfo(Integer accountId, Integer messageId) throws RpcException {
|
public MessageNotificationInfo getMessageNotificationInfo(Integer accountId, Integer messageId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<MessageNotificationInfo>(){}, "get_message_notification_info", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
return transport.callForResult(new TypeReference<MessageNotificationInfo>(){}, "get_message_notification_info", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||||
}
|
}
|
||||||
@@ -888,12 +1014,21 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<String>(){}, "get_message_info", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
return transport.callForResult(new TypeReference<String>(){}, "get_message_info", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns additional information for single message. */
|
/** Returns additional information for single message. */
|
||||||
public MessageInfo getMessageInfoObject(Integer accountId, Integer messageId) throws RpcException {
|
public MessageInfo getMessageInfoObject(Integer accountId, Integer messageId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<MessageInfo>(){}, "get_message_info_object", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
return transport.callForResult(new TypeReference<MessageInfo>(){}, "get_message_info_object", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns contacts that sent read receipts and the time of reading. */
|
/**
|
||||||
|
* Returns count of read receipts on message.
|
||||||
|
* <p>
|
||||||
|
* This view count is meant as a feedback measure for the channel owner only.
|
||||||
|
*/
|
||||||
|
public Integer getMessageReadReceiptCount(Integer accountId, Integer messageId) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<Integer>(){}, "get_message_read_receipt_count", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns contacts that sent read receipts and the time of reading. */
|
||||||
public java.util.List<MessageReadReceipt> getMessageReadReceipts(Integer accountId, Integer messageId) throws RpcException {
|
public java.util.List<MessageReadReceipt> getMessageReadReceipts(Integer accountId, Integer messageId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<MessageReadReceipt>>(){}, "get_message_read_receipts", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
return transport.callForResult(new TypeReference<java.util.List<MessageReadReceipt>>(){}, "get_message_read_receipts", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||||
}
|
}
|
||||||
@@ -941,7 +1076,7 @@ public class Rpc {
|
|||||||
transport.call("save_msgs", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
|
transport.call("save_msgs", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get a single contact options by ID. */
|
/** Get a single contact options by ID. */
|
||||||
public Contact getContact(Integer accountId, Integer contactId) throws RpcException {
|
public Contact getContact(Integer accountId, Integer contactId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Contact>(){}, "get_contact", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
|
return transport.callForResult(new TypeReference<Contact>(){}, "get_contact", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
|
||||||
}
|
}
|
||||||
@@ -962,7 +1097,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<Integer>(){}, "create_contact", mapper.valueToTree(accountId), mapper.valueToTree(email), mapper.valueToTree(name));
|
return transport.callForResult(new TypeReference<Integer>(){}, "create_contact", mapper.valueToTree(accountId), mapper.valueToTree(email), mapper.valueToTree(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns contact id of the created or existing DM chat with that contact */
|
/** Returns contact id of the created or existing DM chat with that contact */
|
||||||
public Integer createChatByContactId(Integer accountId, Integer contactId) throws RpcException {
|
public Integer createChatByContactId(Integer accountId, Integer contactId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "create_chat_by_contact_id", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
|
return transport.callForResult(new TypeReference<Integer>(){}, "create_chat_by_contact_id", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
|
||||||
}
|
}
|
||||||
@@ -1011,7 +1146,7 @@ public class Rpc {
|
|||||||
transport.call("delete_contact", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
|
transport.call("delete_contact", mapper.valueToTree(accountId), mapper.valueToTree(contactId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets display name for existing contact. */
|
/** Sets display name for existing contact. */
|
||||||
public void changeContactName(Integer accountId, Integer contactId, String name) throws RpcException {
|
public void changeContactName(Integer accountId, Integer contactId, String name) throws RpcException {
|
||||||
transport.call("change_contact_name", mapper.valueToTree(accountId), mapper.valueToTree(contactId), mapper.valueToTree(name));
|
transport.call("change_contact_name", mapper.valueToTree(accountId), mapper.valueToTree(contactId), mapper.valueToTree(name));
|
||||||
}
|
}
|
||||||
@@ -1046,7 +1181,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<Integer>(){}, "lookup_contact_id_by_addr", mapper.valueToTree(accountId), mapper.valueToTree(addr));
|
return transport.callForResult(new TypeReference<Integer>(){}, "lookup_contact_id_by_addr", mapper.valueToTree(accountId), mapper.valueToTree(addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parses a vCard file located at the given path. Returns contacts in their original order. */
|
/** Parses a vCard file located at the given path. Returns contacts in their original order. */
|
||||||
public java.util.List<VcardContact> parseVcard(String path) throws RpcException {
|
public java.util.List<VcardContact> parseVcard(String path) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<VcardContact>>(){}, "parse_vcard", mapper.valueToTree(path));
|
return transport.callForResult(new TypeReference<java.util.List<VcardContact>>(){}, "parse_vcard", mapper.valueToTree(path));
|
||||||
}
|
}
|
||||||
@@ -1069,16 +1204,11 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "import_vcard_contents", mapper.valueToTree(accountId), mapper.valueToTree(vcard));
|
return transport.callForResult(new TypeReference<java.util.List<Integer>>(){}, "import_vcard_contents", mapper.valueToTree(accountId), mapper.valueToTree(vcard));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns a vCard containing contacts with the given ids. */
|
/** Returns a vCard containing contacts with the given ids. */
|
||||||
public String makeVcard(Integer accountId, java.util.List<Integer> contacts) throws RpcException {
|
public String makeVcard(Integer accountId, java.util.List<Integer> contacts) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<String>(){}, "make_vcard", mapper.valueToTree(accountId), mapper.valueToTree(contacts));
|
return transport.callForResult(new TypeReference<String>(){}, "make_vcard", mapper.valueToTree(accountId), mapper.valueToTree(contacts));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets vCard containing the given contacts to the message draft. */
|
|
||||||
public void setDraftVcard(Integer accountId, Integer msgId, java.util.List<Integer> contacts) throws RpcException {
|
|
||||||
transport.call("set_draft_vcard", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(contacts));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the [`ChatId`] for the 1:1 chat with `contact_id` if it exists.
|
* Returns the [`ChatId`] for the 1:1 chat with `contact_id` if it exists.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -1150,12 +1280,19 @@ public class Rpc {
|
|||||||
* even if there is no concurrent call to [`CommandApi::provide_backup`],
|
* even if there is no concurrent call to [`CommandApi::provide_backup`],
|
||||||
* but will fail after 60 seconds to avoid deadlocks.
|
* but will fail after 60 seconds to avoid deadlocks.
|
||||||
* <p>
|
* <p>
|
||||||
|
* @deprecated as of 2026-03; use `create_qr_svg(get_backup_qr())` instead.
|
||||||
|
* <p>
|
||||||
* Returns the QR code rendered as an SVG image.
|
* Returns the QR code rendered as an SVG image.
|
||||||
*/
|
*/
|
||||||
public String getBackupQrSvg(Integer accountId) throws RpcException {
|
public String getBackupQrSvg(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<String>(){}, "get_backup_qr_svg", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<String>(){}, "get_backup_qr_svg", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Renders the given text as a QR code SVG image. */
|
||||||
|
public String createQrSvg(String text) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<String>(){}, "create_qr_svg", mapper.valueToTree(text));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a backup from a remote provider.
|
* Gets a backup from a remote provider.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -1214,10 +1351,47 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<String>(){}, "get_connectivity_html", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<String>(){}, "get_connectivity_html", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets current location.
|
||||||
|
* <p>
|
||||||
|
* Returns true if location streaming is currently
|
||||||
|
* enabled and locations should be updated.
|
||||||
|
* <p>
|
||||||
|
* Location is represented as latitude and longitude in degrees
|
||||||
|
* and horizontal accuracy in meters.
|
||||||
|
*/
|
||||||
|
public Boolean setLocation(Float latitude, Float longitude, Float accuracy) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<Boolean>(){}, "set_location", mapper.valueToTree(latitude), mapper.valueToTree(longitude), mapper.valueToTree(accuracy));
|
||||||
|
}
|
||||||
|
|
||||||
public java.util.List<Location> getLocations(Integer accountId, Integer chatId, Integer contactId, Integer timestampBegin, Integer timestampEnd) throws RpcException {
|
public java.util.List<Location> getLocations(Integer accountId, Integer chatId, Integer contactId, Integer timestampBegin, Integer timestampEnd) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<java.util.List<Location>>(){}, "get_locations", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(contactId), mapper.valueToTree(timestampBegin), mapper.valueToTree(timestampEnd));
|
return transport.callForResult(new TypeReference<java.util.List<Location>>(){}, "get_locations", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(contactId), mapper.valueToTree(timestampBegin), mapper.valueToTree(timestampEnd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables location streaming in chat identified by `chat_id` for `seconds` seconds.
|
||||||
|
* <p>
|
||||||
|
* Pass 0 as the number of seconds to disable location streaming in the chat.
|
||||||
|
*/
|
||||||
|
public void sendLocationsToChat(Integer accountId, Integer chatId, Integer seconds) throws RpcException {
|
||||||
|
transport.call("send_locations_to_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(seconds));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns whether any chat is sending locations. */
|
||||||
|
public Boolean isSendingLocations(Integer accountId) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<Boolean>(){}, "is_sending_locations", mapper.valueToTree(accountId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns whether `chat_id` is sending locations. */
|
||||||
|
public Boolean isSendingLocationsToChat(Integer accountId, Integer chatId) throws RpcException {
|
||||||
|
return transport.callForResult(new TypeReference<Boolean>(){}, "is_sending_locations_to_chat", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Stops sending locations to all chats. */
|
||||||
|
public void stopSendingLocations() throws RpcException {
|
||||||
|
transport.call("stop_sending_locations");
|
||||||
|
}
|
||||||
|
|
||||||
public void sendWebxdcStatusUpdate(Integer accountId, Integer instanceMsgId, String updateStr, String descr) throws RpcException {
|
public void sendWebxdcStatusUpdate(Integer accountId, Integer instanceMsgId, String updateStr, String descr) throws RpcException {
|
||||||
transport.call("send_webxdc_status_update", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(updateStr), mapper.valueToTree(descr));
|
transport.call("send_webxdc_status_update", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(updateStr), mapper.valueToTree(descr));
|
||||||
}
|
}
|
||||||
@@ -1245,7 +1419,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<String>(){}, "get_webxdc_status_updates", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(lastKnownSerial));
|
return transport.callForResult(new TypeReference<String>(){}, "get_webxdc_status_updates", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId), mapper.valueToTree(lastKnownSerial));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get info from a webxdc message */
|
/** Get info from a webxdc message */
|
||||||
public WebxdcMessageInfo getWebxdcInfo(Integer accountId, Integer instanceMsgId) throws RpcException {
|
public WebxdcMessageInfo getWebxdcInfo(Integer accountId, Integer instanceMsgId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<WebxdcMessageInfo>(){}, "get_webxdc_info", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId));
|
return transport.callForResult(new TypeReference<WebxdcMessageInfo>(){}, "get_webxdc_info", mapper.valueToTree(accountId), mapper.valueToTree(instanceMsgId));
|
||||||
}
|
}
|
||||||
@@ -1285,27 +1459,27 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<Integer>(){}, "init_webxdc_integration", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
return transport.callForResult(new TypeReference<Integer>(){}, "init_webxdc_integration", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Starts an outgoing call. */
|
/** Starts an outgoing call. */
|
||||||
public Integer placeOutgoingCall(Integer accountId, Integer chatId, String placeCallInfo) throws RpcException {
|
public Integer placeOutgoingCall(Integer accountId, Integer chatId, String placeCallInfo, Boolean hasVideo) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "place_outgoing_call", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(placeCallInfo));
|
return transport.callForResult(new TypeReference<Integer>(){}, "place_outgoing_call", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(placeCallInfo), mapper.valueToTree(hasVideo));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Accepts an incoming call. */
|
/** Accepts an incoming call. */
|
||||||
public void acceptIncomingCall(Integer accountId, Integer msgId, String acceptCallInfo) throws RpcException {
|
public void acceptIncomingCall(Integer accountId, Integer msgId, String acceptCallInfo) throws RpcException {
|
||||||
transport.call("accept_incoming_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(acceptCallInfo));
|
transport.call("accept_incoming_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(acceptCallInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ends incoming or outgoing call. */
|
/** Ends incoming or outgoing call. */
|
||||||
public void endCall(Integer accountId, Integer msgId) throws RpcException {
|
public void endCall(Integer accountId, Integer msgId) throws RpcException {
|
||||||
transport.call("end_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
|
transport.call("end_call", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns information about the call. */
|
/** Returns information about the call. */
|
||||||
public CallInfo callInfo(Integer accountId, Integer msgId) throws RpcException {
|
public CallInfo callInfo(Integer accountId, Integer msgId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<CallInfo>(){}, "call_info", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
|
return transport.callForResult(new TypeReference<CallInfo>(){}, "call_info", mapper.valueToTree(accountId), mapper.valueToTree(msgId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns JSON with ICE servers, to be used for WebRTC video calls. */
|
/** Returns JSON with ICE servers, to be used for WebRTC video calls. */
|
||||||
public String iceServers(Integer accountId) throws RpcException {
|
public String iceServers(Integer accountId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<String>(){}, "ice_servers", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<String>(){}, "ice_servers", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
@@ -1331,6 +1505,14 @@ public class Rpc {
|
|||||||
transport.call("forward_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds), mapper.valueToTree(chatId));
|
transport.call("forward_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds), mapper.valueToTree(chatId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forward messages to a chat in another account.
|
||||||
|
* See [`Self::forward_messages`] for more info.
|
||||||
|
*/
|
||||||
|
public void forwardMessagesToAccount(Integer srcAccountId, java.util.List<Integer> srcMessageIds, Integer dstAccountId, Integer dstChatId) throws RpcException {
|
||||||
|
transport.call("forward_messages_to_account", mapper.valueToTree(srcAccountId), mapper.valueToTree(srcMessageIds), mapper.valueToTree(dstAccountId), mapper.valueToTree(dstChatId));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resend messages and make information available for newly added chat members.
|
* Resend messages and make information available for newly added chat members.
|
||||||
* Resending sends out the original message, however, recipients and webxdc-status may differ.
|
* Resending sends out the original message, however, recipients and webxdc-status may differ.
|
||||||
@@ -1345,23 +1527,24 @@ public class Rpc {
|
|||||||
transport.call("resend_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
|
transport.call("resend_messages", mapper.valueToTree(accountId), mapper.valueToTree(messageIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @deprecated as of 2026-04; use `send_msg` with `Viewtype::Sticker` instead. */
|
||||||
public Integer sendSticker(Integer accountId, Integer chatId, String stickerPath) throws RpcException {
|
public Integer sendSticker(Integer accountId, Integer chatId, String stickerPath) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "send_sticker", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(stickerPath));
|
return transport.callForResult(new TypeReference<Integer>(){}, "send_sticker", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(stickerPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a reaction to message.
|
* Sends a reaction to message.
|
||||||
* <p>
|
* <p>
|
||||||
* Reaction is a string of emojis separated by spaces. Reaction to a
|
* A reaction is a string that represents an emoji.
|
||||||
* single message can be sent multiple times. The last reaction
|
* You can call this function again to change the emoji;
|
||||||
* received overrides all previously received reactions. It is
|
* the last sent reaction overrides all previously sent reactions.
|
||||||
* possible to remove all reactions by sending an empty string.
|
* It is possible to remove the reaction by sending an empty string.
|
||||||
*/
|
*/
|
||||||
public Integer sendReaction(Integer accountId, Integer messageId, java.util.List<String> reaction) throws RpcException {
|
public Integer sendReaction(Integer accountId, Integer messageId, java.util.List<String> reaction) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "send_reaction", mapper.valueToTree(accountId), mapper.valueToTree(messageId), mapper.valueToTree(reaction));
|
return transport.callForResult(new TypeReference<Integer>(){}, "send_reaction", mapper.valueToTree(accountId), mapper.valueToTree(messageId), mapper.valueToTree(reaction));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns reactions to the message. */
|
/** Returns reactions to the message. */
|
||||||
public Reactions getMessageReactions(Integer accountId, Integer messageId) throws RpcException {
|
public Reactions getMessageReactions(Integer accountId, Integer messageId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Reactions>(){}, "get_message_reactions", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
return transport.callForResult(new TypeReference<Reactions>(){}, "get_message_reactions", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||||
}
|
}
|
||||||
@@ -1374,7 +1557,7 @@ public class Rpc {
|
|||||||
transport.call("send_edit_request", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(newText));
|
transport.call("send_edit_request", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(newText));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checks if messages can be sent to a given chat. */
|
/** Checks if messages can be sent to a given chat. */
|
||||||
public Boolean canSend(Integer accountId, Integer chatId) throws RpcException {
|
public Boolean canSend(Integer accountId, Integer chatId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Boolean>(){}, "can_send", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
return transport.callForResult(new TypeReference<Boolean>(){}, "can_send", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
}
|
}
|
||||||
@@ -1392,7 +1575,7 @@ public class Rpc {
|
|||||||
transport.call("remove_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
transport.call("remove_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get draft for a chat, if any. */
|
/** Get draft for a chat, if any. */
|
||||||
public Message getDraft(Integer accountId, Integer chatId) throws RpcException {
|
public Message getDraft(Integer accountId, Integer chatId) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Message>(){}, "get_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
return transport.callForResult(new TypeReference<Message>(){}, "get_draft", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||||
}
|
}
|
||||||
@@ -1401,7 +1584,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<String>(){}, "misc_get_sticker_folder", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<String>(){}, "misc_get_sticker_folder", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Saves a sticker to a collection/folder in the account's sticker folder. */
|
/** Saves a sticker to a collection/folder in the account's sticker folder. */
|
||||||
public void miscSaveSticker(Integer accountId, Integer msgId, String collection) throws RpcException {
|
public void miscSaveSticker(Integer accountId, Integer msgId, String collection) throws RpcException {
|
||||||
transport.call("misc_save_sticker", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(collection));
|
transport.call("misc_save_sticker", mapper.valueToTree(accountId), mapper.valueToTree(msgId), mapper.valueToTree(collection));
|
||||||
}
|
}
|
||||||
@@ -1414,7 +1597,7 @@ public class Rpc {
|
|||||||
return transport.callForResult(new TypeReference<java.util.Map<String, java.util.List<String>>>(){}, "misc_get_stickers", mapper.valueToTree(accountId));
|
return transport.callForResult(new TypeReference<java.util.Map<String, java.util.List<String>>>(){}, "misc_get_stickers", mapper.valueToTree(accountId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the messageid of the sent message */
|
/** Returns the messageid of the sent message */
|
||||||
public Integer miscSendTextMessage(Integer accountId, Integer chatId, String text) throws RpcException {
|
public Integer miscSendTextMessage(Integer accountId, Integer chatId, String text) throws RpcException {
|
||||||
return transport.callForResult(new TypeReference<Integer>(){}, "misc_send_text_message", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(text));
|
return transport.callForResult(new TypeReference<Integer>(){}, "misc_send_text_message", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(text));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public abstract class Account {
|
|||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String displayName;
|
public String displayName;
|
||||||
public Integer id;
|
public Integer id;
|
||||||
/* Optional tag as "Work", "Family". Meant to help profile owner to differ between profiles with similar names. */
|
/** Optional tag as "Work", "Family". Meant to help profile owner to differ between profiles with similar names. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String privateTag;
|
public String privateTag;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
package chat.delta.rpc.types;
|
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
|
* cheaper version of fullchat, omits: - contact_ids - fresh_message_counter - ephemeral_timer - self_in_group - was_seen_recently - can_send
|
||||||
* <p>
|
* <p>
|
||||||
* used when you only need the basic metadata of a chat like type, name, profile picture
|
* used when you only need the basic metadata of a chat like type, name, profile picture
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public class CallInfo {
|
public class CallInfo {
|
||||||
/* True if SDP offer has a video. */
|
/** True if the call is started as a video call. */
|
||||||
public Boolean hasVideo;
|
public Boolean hasVideo;
|
||||||
/**
|
/**
|
||||||
* SDP offer.
|
* SDP offer.
|
||||||
|
|||||||
@@ -19,21 +19,21 @@ public abstract class CallState {
|
|||||||
public static class Alerting extends CallState {
|
public static class Alerting extends CallState {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Active call. */
|
/** Active call. */
|
||||||
public static class Active extends CallState {
|
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 {
|
public static class Completed extends CallState {
|
||||||
/* Call duration in seconds. */
|
/** Call duration in seconds. */
|
||||||
public Integer duration;
|
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 {
|
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 {
|
public static class Declined extends CallState {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public abstract class ChatListItemFetchResult {
|
|||||||
public String avatarPath;
|
public String avatarPath;
|
||||||
public ChatType chatType;
|
public ChatType chatType;
|
||||||
public String color;
|
public String color;
|
||||||
/* contact id if this is a dm chat (for view profile entry in context menu) */
|
/** contact id if this is a dm chat (for view profile entry in context menu) */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer dmChatContact;
|
public Integer dmChatContact;
|
||||||
public Integer freshMessageCounter;
|
public Integer freshMessageCounter;
|
||||||
@@ -36,7 +36,7 @@ public abstract class ChatListItemFetchResult {
|
|||||||
* See also `is_key_contact` on `Contact`.
|
* See also `is_key_contact` on `Contact`.
|
||||||
*/
|
*/
|
||||||
public Boolean isEncrypted;
|
public Boolean isEncrypted;
|
||||||
/* deprecated 2025-07, use chat_type instead */
|
/** deprecated 2025-07, use chat_type instead */
|
||||||
public Boolean isGroup;
|
public Boolean isGroup;
|
||||||
public Boolean isMuted;
|
public Boolean isMuted;
|
||||||
public Boolean isPinned;
|
public Boolean isPinned;
|
||||||
@@ -50,7 +50,7 @@ public abstract class ChatListItemFetchResult {
|
|||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer lastUpdated;
|
public Integer lastUpdated;
|
||||||
public String name;
|
public String name;
|
||||||
/* showing preview if last chat message is image */
|
/** showing preview if last chat message is image */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String summaryPreviewImage;
|
public String summaryPreviewImage;
|
||||||
public Integer summaryStatus;
|
public Integer summaryStatus;
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ public class Contact {
|
|||||||
public Boolean e2eeAvail;
|
public Boolean e2eeAvail;
|
||||||
public Integer id;
|
public Integer id;
|
||||||
public Boolean isBlocked;
|
public Boolean isBlocked;
|
||||||
/* If the contact is a bot. */
|
/** If the contact is a bot. */
|
||||||
public Boolean isBot;
|
public Boolean isBot;
|
||||||
/* Is the contact a key contact. */
|
/** Is the contact a key contact. */
|
||||||
public Boolean isKeyContact;
|
public Boolean isKeyContact;
|
||||||
/**
|
/**
|
||||||
* True if the contact can be added to protected chats because SELF and contact have verified their fingerprints in both directions.
|
* True if the contact can be added to protected chats because SELF and contact have verified their fingerprints in both directions.
|
||||||
@@ -24,7 +24,7 @@ public class Contact {
|
|||||||
* See [`Self::verifier_id`]/`Contact.verifierId` for a guidance how to display these information.
|
* See [`Self::verifier_id`]/`Contact.verifierId` for a guidance how to display these information.
|
||||||
*/
|
*/
|
||||||
public Boolean isVerified;
|
public Boolean isVerified;
|
||||||
/* the contact's last seen timestamp */
|
/** the contact's last seen timestamp */
|
||||||
public Integer lastSeen;
|
public Integer lastSeen;
|
||||||
public String name;
|
public String name;
|
||||||
public String nameAndAddr;
|
public String nameAndAddr;
|
||||||
@@ -38,7 +38,7 @@ public class Contact {
|
|||||||
* <p>
|
* <p>
|
||||||
* UI should display the information in the contact's profile as follows:
|
* UI should display the information in the contact's profile as follows:
|
||||||
* <p>
|
* <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.
|
* - If `verifierId` != 0, display text "Introduced by ..." with the name of the contact. Prefix the text by a green checkmark.
|
||||||
* <p>
|
* <p>
|
||||||
* - If `verifierId` == 0 and `isVerified` != 0, display "Introduced" prefixed by a green checkmark.
|
* - If `verifierId` == 0 and `isVerified` != 0, display "Introduced" prefixed by a green checkmark.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public enum EnteredCertificateChecks {
|
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,
|
automatic,
|
||||||
|
|
||||||
/* Ensure that TLS certificate is valid for the server hostname. */
|
/** Ensure that TLS certificate is valid for the server hostname. */
|
||||||
strict,
|
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,
|
acceptInvalidCertificates,
|
||||||
}
|
}
|
||||||
@@ -7,27 +7,34 @@ package chat.delta.rpc.types;
|
|||||||
* Usually it will be enough to only set `addr` and `password`, and all the other settings will be autoconfigured.
|
* Usually it will be enough to only set `addr` and `password`, and all the other settings will be autoconfigured.
|
||||||
*/
|
*/
|
||||||
public class EnteredLoginParam {
|
public class EnteredLoginParam {
|
||||||
/* Email address. */
|
/** Email address. */
|
||||||
public String addr;
|
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)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public EnteredCertificateChecks certificateChecks;
|
public EnteredCertificateChecks certificateChecks;
|
||||||
/* Imap server port. */
|
/**
|
||||||
|
* IMAP server folder.
|
||||||
|
* <p>
|
||||||
|
* Defaults to "INBOX" if not set. Should not be an empty string.
|
||||||
|
*/
|
||||||
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
|
public String imapFolder;
|
||||||
|
/** Imap server port. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer imapPort;
|
public Integer imapPort;
|
||||||
/* Imap socket security. */
|
/** Imap socket security. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Socket imapSecurity;
|
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)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String imapServer;
|
public String imapServer;
|
||||||
/* Imap username. */
|
/** Imap username. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String imapUser;
|
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)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Boolean oauth2;
|
public Boolean oauth2;
|
||||||
/* Password. */
|
/** Password. */
|
||||||
public String password;
|
public String password;
|
||||||
/**
|
/**
|
||||||
* SMTP Password.
|
* SMTP Password.
|
||||||
@@ -36,16 +43,16 @@ public class EnteredLoginParam {
|
|||||||
*/
|
*/
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String smtpPassword;
|
public String smtpPassword;
|
||||||
/* SMTP server port. */
|
/** SMTP server port. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer smtpPort;
|
public Integer smtpPort;
|
||||||
/* SMTP socket security. */
|
/** SMTP socket security. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Socket smtpSecurity;
|
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)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String smtpServer;
|
public String smtpServer;
|
||||||
/* SMTP username. */
|
/** SMTP username. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String smtpUser;
|
public String smtpUser;
|
||||||
}
|
}
|
||||||
@@ -11,11 +11,11 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
|||||||
@JsonSubTypes({@Type(value = EphemeralTimer.Disabled.class, name="Disabled"), @Type(value = EphemeralTimer.Enabled.class, name="Enabled")})
|
@JsonSubTypes({@Type(value = EphemeralTimer.Disabled.class, name="Disabled"), @Type(value = EphemeralTimer.Enabled.class, name="Enabled")})
|
||||||
public abstract class EphemeralTimer {
|
public abstract class EphemeralTimer {
|
||||||
|
|
||||||
/* Timer is disabled. */
|
/** Timer is disabled. */
|
||||||
public static class Disabled extends EphemeralTimer {
|
public static class Disabled extends EphemeralTimer {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Timer is enabled. */
|
/** Timer is enabled. */
|
||||||
public static class Enabled extends EphemeralTimer {
|
public static class Enabled extends EphemeralTimer {
|
||||||
/**
|
/**
|
||||||
* Timer duration in seconds.
|
* Timer duration in seconds.
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public class Event {
|
public class Event {
|
||||||
/* Account ID. */
|
/** Account ID. */
|
||||||
public Integer contextId;
|
public Integer contextId;
|
||||||
/* Event payload. */
|
/** Event payload. */
|
||||||
public EventType event;
|
public EventType event;
|
||||||
}
|
}
|
||||||
@@ -20,41 +20,41 @@ public abstract class EventType {
|
|||||||
public String msg;
|
public String msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emitted when SMTP connection is established and login was successful. */
|
/** Emitted when SMTP connection is established and login was successful. */
|
||||||
public static class SmtpConnected extends EventType {
|
public static class SmtpConnected extends EventType {
|
||||||
public String msg;
|
public String msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emitted when IMAP connection is established and login was successful. */
|
/** Emitted when IMAP connection is established and login was successful. */
|
||||||
public static class ImapConnected extends EventType {
|
public static class ImapConnected extends EventType {
|
||||||
public String msg;
|
public String msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emitted when a message was successfully sent to the SMTP server. */
|
/** Emitted when a message was successfully sent to the SMTP server. */
|
||||||
public static class SmtpMessageSent extends EventType {
|
public static class SmtpMessageSent extends EventType {
|
||||||
public String msg;
|
public String msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emitted when an IMAP message has been marked as deleted */
|
/** Emitted when an IMAP message has been marked as deleted */
|
||||||
public static class ImapMessageDeleted extends EventType {
|
public static class ImapMessageDeleted extends EventType {
|
||||||
public String msg;
|
public String msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emitted when an IMAP message has been moved */
|
/** Emitted when an IMAP message has been moved */
|
||||||
public static class ImapMessageMoved extends EventType {
|
public static class ImapMessageMoved extends EventType {
|
||||||
public String msg;
|
public String msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emitted before going into IDLE on the Inbox folder. */
|
/** Emitted before going into IDLE on the Inbox folder. */
|
||||||
public static class ImapInboxIdle extends EventType {
|
public static class ImapInboxIdle extends EventType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emitted when an new file in the $BLOBDIR was created */
|
/** Emitted when an new file in the $BLOBDIR was created */
|
||||||
public static class NewBlobFile extends EventType {
|
public static class NewBlobFile extends EventType {
|
||||||
public String file;
|
public String file;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emitted when an file in the $BLOBDIR was deleted */
|
/** Emitted when an file in the $BLOBDIR was deleted */
|
||||||
public static class DeletedBlobFile extends EventType {
|
public static class DeletedBlobFile extends EventType {
|
||||||
public String file;
|
public String file;
|
||||||
}
|
}
|
||||||
@@ -79,26 +79,26 @@ public abstract class EventType {
|
|||||||
public String msg;
|
public String msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
|
/** An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
|
||||||
public static class ErrorSelfNotInGroup extends EventType {
|
public static class ErrorSelfNotInGroup extends EventType {
|
||||||
public String msg;
|
public String msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
|
/** Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
|
||||||
public static class MsgsChanged extends EventType {
|
public static class MsgsChanged extends EventType {
|
||||||
/* Set if only a single chat is affected by the changes, otherwise 0. */
|
/** Set if only a single chat is affected by the changes, otherwise 0. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* Set if only a single message is affected by the changes, otherwise 0. */
|
/** Set if only a single message is affected by the changes, otherwise 0. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reactions for the message changed. */
|
/** Reactions for the message changed. */
|
||||||
public static class ReactionsChanged extends EventType {
|
public static class ReactionsChanged extends EventType {
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* ID of the contact whose reaction set is changed. */
|
/** ID of the contact whose reaction set is changed. */
|
||||||
public Integer contactId;
|
public Integer contactId;
|
||||||
/* ID of the message for which reactions were changed. */
|
/** ID of the message for which reactions were changed. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,28 +108,28 @@ public abstract class EventType {
|
|||||||
* In addition to this event, ReactionsChanged is emitted.
|
* In addition to this event, ReactionsChanged is emitted.
|
||||||
*/
|
*/
|
||||||
public static class IncomingReaction extends EventType {
|
public static class IncomingReaction extends EventType {
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* ID of the contact whose reaction set is changed. */
|
/** ID of the contact whose reaction set is changed. */
|
||||||
public Integer contactId;
|
public Integer contactId;
|
||||||
/* ID of the message for which reactions were changed. */
|
/** ID of the message for which reactions were changed. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
/* The reaction. */
|
/** The reaction. */
|
||||||
public String reaction;
|
public String reaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Incoming webxdc info or summary update, should be notified. */
|
/** Incoming webxdc info or summary update, should be notified. */
|
||||||
public static class IncomingWebxdcNotify extends EventType {
|
public static class IncomingWebxdcNotify extends EventType {
|
||||||
/* ID of the chat. */
|
/** ID of the chat. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* ID of the contact sending. */
|
/** ID of the contact sending. */
|
||||||
public Integer contactId;
|
public Integer contactId;
|
||||||
/* Link assigned to this notification, if any. */
|
/** Link assigned to this notification, if any. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String href;
|
public String href;
|
||||||
/* ID of the added info message or webxdc instance in case of summary change. */
|
/** ID of the added info message or webxdc instance in case of summary change. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
/* Text to notify. */
|
/** Text to notify. */
|
||||||
public String text;
|
public String text;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,42 +139,42 @@ public abstract class EventType {
|
|||||||
* There is no extra #DC_EVENT_MSGS_CHANGED event sent together with this event.
|
* There is no extra #DC_EVENT_MSGS_CHANGED event sent together with this event.
|
||||||
*/
|
*/
|
||||||
public static class IncomingMsg extends EventType {
|
public static class IncomingMsg extends EventType {
|
||||||
/* ID of the chat where the message is assigned. */
|
/** ID of the chat where the message is assigned. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* ID of the message. */
|
/** ID of the message. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
|
/** Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
|
||||||
public static class IncomingMsgBunch extends EventType {
|
public static class IncomingMsgBunch extends EventType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Messages were seen or noticed. chat id is always set. */
|
/** Messages were seen or noticed. chat id is always set. */
|
||||||
public static class MsgsNoticed extends EventType {
|
public static class MsgsNoticed extends EventType {
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
|
/** A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
|
||||||
public static class MsgDelivered extends EventType {
|
public static class MsgDelivered extends EventType {
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* ID of the message that was successfully sent. */
|
/** ID of the message that was successfully sent. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
|
/** A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
|
||||||
public static class MsgFailed extends EventType {
|
public static class MsgFailed extends EventType {
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* ID of the message that could not be sent. */
|
/** ID of the message that could not be sent. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
|
/** A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
|
||||||
public static class MsgRead extends EventType {
|
public static class MsgRead extends EventType {
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* ID of the message that was read. */
|
/** ID of the message that was read. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,9 +188,9 @@ public abstract class EventType {
|
|||||||
* This event does not indicate the message deletion from the server.
|
* This event does not indicate the message deletion from the server.
|
||||||
*/
|
*/
|
||||||
public static class MsgDeleted extends EventType {
|
public static class MsgDeleted extends EventType {
|
||||||
/* ID of the chat where the message was prior to deletion. Never 0. */
|
/** ID of the chat where the message was prior to deletion. Never 0. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* ID of the deleted message. Never 0. */
|
/** ID of the deleted message. Never 0. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,37 +203,37 @@ public abstract class EventType {
|
|||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Chat ephemeral timer changed. */
|
/** Chat ephemeral timer changed. */
|
||||||
public static class ChatEphemeralTimerModified extends EventType {
|
public static class ChatEphemeralTimerModified extends EventType {
|
||||||
/* Chat ID. */
|
/** Chat ID. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* New ephemeral timer value. */
|
/** New ephemeral timer value. */
|
||||||
public Integer timer;
|
public Integer timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Chat deleted. */
|
/** Chat deleted. */
|
||||||
public static class ChatDeleted extends EventType {
|
public static class ChatDeleted extends EventType {
|
||||||
/* Chat ID. */
|
/** Chat ID. */
|
||||||
public Integer chat_id;
|
public Integer chat_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Contact(s) created, renamed, blocked or deleted. */
|
/** Contact(s) created, renamed, blocked or deleted. */
|
||||||
public static class ContactsChanged extends EventType {
|
public static class ContactsChanged extends EventType {
|
||||||
/* If set, this is the contact_id of an added contact that should be selected. */
|
/** If set, this is the contact_id of an added contact that should be selected. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer contactId;
|
public Integer contactId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Location of one or more contact has changed. */
|
/** Location of one or more contact has changed. */
|
||||||
public static class LocationChanged extends EventType {
|
public static class LocationChanged extends EventType {
|
||||||
/* contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
|
/** contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer contactId;
|
public Integer contactId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inform about the configuration progress started by configure(). */
|
/** Inform about the configuration progress started by configure(). */
|
||||||
public static class ConfigureProgress extends EventType {
|
public static class ConfigureProgress extends EventType {
|
||||||
/* Progress comment or error, something to display to the user. */
|
/** Progress comment or error, something to display to the user. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String comment;
|
public String comment;
|
||||||
/**
|
/**
|
||||||
@@ -244,9 +244,9 @@ public abstract class EventType {
|
|||||||
public Integer progress;
|
public Integer progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inform about the import/export progress started by imex(). */
|
/** Inform about the import/export progress started by imex(). */
|
||||||
public static class ImexProgress extends EventType {
|
public static class ImexProgress extends EventType {
|
||||||
/* 0=error, 1-999=progress in permille, 1000=success and done */
|
/** 0=error, 1-999=progress in permille, 1000=success and done */
|
||||||
public Integer progress;
|
public Integer progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,62 +267,62 @@ public abstract class EventType {
|
|||||||
* These events are typically sent after a joiner has scanned the QR code generated by getChatSecurejoinQrCodeSvg().
|
* These events are typically sent after a joiner has scanned the QR code generated by getChatSecurejoinQrCodeSvg().
|
||||||
*/
|
*/
|
||||||
public static class SecurejoinInviterProgress extends EventType {
|
public static class SecurejoinInviterProgress extends EventType {
|
||||||
/* ID of the chat in case of success. */
|
/** ID of the chat in case of success. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
/* The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
|
/** The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
|
||||||
public ChatType chatType;
|
public ChatType chatType;
|
||||||
/* ID of the contact that wants to join. */
|
/** ID of the contact that wants to join. */
|
||||||
public Integer contactId;
|
public Integer contactId;
|
||||||
/* Progress, always 1000. */
|
/** Progress, always 1000. */
|
||||||
public Integer progress;
|
public Integer progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
|
/** Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
|
||||||
public static class SecurejoinJoinerProgress extends EventType {
|
public static class SecurejoinJoinerProgress extends EventType {
|
||||||
/* ID of the inviting contact. */
|
/** ID of the inviting contact. */
|
||||||
public Integer contactId;
|
public Integer contactId;
|
||||||
/* Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
|
/** Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
|
||||||
public Integer progress;
|
public Integer progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
|
/** The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
|
||||||
public static class ConnectivityChanged extends EventType {
|
public static class ConnectivityChanged extends EventType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deprecated by `ConfigSynced`. */
|
/** Deprecated by `ConfigSynced`. */
|
||||||
public static class SelfavatarChanged extends EventType {
|
public static class SelfavatarChanged extends EventType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
|
/** A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
|
||||||
public static class ConfigSynced extends EventType {
|
public static class ConfigSynced extends EventType {
|
||||||
/* Configuration key. */
|
/** Configuration key. */
|
||||||
public String key;
|
public String key;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class WebxdcStatusUpdate extends EventType {
|
public static class WebxdcStatusUpdate extends EventType {
|
||||||
/* Message ID. */
|
/** Message ID. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
/* Status update ID. */
|
/** Status update ID. */
|
||||||
public Integer statusUpdateSerial;
|
public Integer statusUpdateSerial;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Data received over an ephemeral peer channel. */
|
/** Data received over an ephemeral peer channel. */
|
||||||
public static class WebxdcRealtimeData extends EventType {
|
public static class WebxdcRealtimeData extends EventType {
|
||||||
/* Realtime data. */
|
/** Realtime data. */
|
||||||
public java.util.List<Integer> data;
|
public java.util.List<Integer> data;
|
||||||
/* Message ID. */
|
/** Message ID. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Advertisement received over an ephemeral peer channel. This can be used by bots to initiate peer-to-peer communication from their side. */
|
/** Advertisement received over an ephemeral peer channel. This can be used by bots to initiate peer-to-peer communication from their side. */
|
||||||
public static class WebxdcRealtimeAdvertisementReceived extends EventType {
|
public static class WebxdcRealtimeAdvertisementReceived extends EventType {
|
||||||
/* Message ID of the webxdc instance. */
|
/** Message ID of the webxdc instance. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inform that a message containing a webxdc instance has been deleted */
|
/** Inform that a message containing a webxdc instance has been deleted */
|
||||||
public static class WebxdcInstanceDeleted extends EventType {
|
public static class WebxdcInstanceDeleted extends EventType {
|
||||||
/* ID of the deleted message. */
|
/** ID of the deleted message. */
|
||||||
public Integer msgId;
|
public Integer msgId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,9 +342,9 @@ public abstract class EventType {
|
|||||||
public static class ChatlistChanged extends EventType {
|
public static class ChatlistChanged extends EventType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
|
/** Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
|
||||||
public static class ChatlistItemChanged extends EventType {
|
public static class ChatlistItemChanged extends EventType {
|
||||||
/* ID of the changed chat */
|
/** ID of the changed chat */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
}
|
}
|
||||||
@@ -365,54 +365,58 @@ public abstract class EventType {
|
|||||||
public static class AccountsItemChanged extends EventType {
|
public static class AccountsItemChanged extends EventType {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inform than some events have been skipped due to event channel overflow. */
|
/** Inform than some events have been skipped due to event channel overflow. */
|
||||||
public static class EventChannelOverflow extends EventType {
|
public static class EventChannelOverflow extends EventType {
|
||||||
/* Number of events skipped. */
|
/** Number of events skipped. */
|
||||||
public Integer n;
|
public Integer n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Incoming call. */
|
/** Incoming call. */
|
||||||
public static class IncomingCall extends EventType {
|
public static class IncomingCall extends EventType {
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chat_id;
|
public Integer chat_id;
|
||||||
/* True if incoming call is a video call. */
|
/** True if incoming call is a video call. */
|
||||||
public Boolean has_video;
|
public Boolean has_video;
|
||||||
/* ID of the info message referring to the call. */
|
/** ID of the info message referring to the call. */
|
||||||
public Integer msg_id;
|
public Integer msg_id;
|
||||||
/* User-defined info as passed to place_outgoing_call() */
|
/** User-defined info as passed to place_outgoing_call() */
|
||||||
public String place_call_info;
|
public String place_call_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
|
/** Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
|
||||||
public static class IncomingCallAccepted extends EventType {
|
public static class IncomingCallAccepted extends EventType {
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chat_id;
|
public Integer chat_id;
|
||||||
/* ID of the info message referring to the call. */
|
/** The call was accepted from this device (process). */
|
||||||
|
public Boolean from_this_device;
|
||||||
|
/** ID of the info message referring to the call. */
|
||||||
public Integer msg_id;
|
public Integer msg_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Outgoing call accepted. */
|
/** Outgoing call accepted. */
|
||||||
public static class OutgoingCallAccepted extends EventType {
|
public static class OutgoingCallAccepted extends EventType {
|
||||||
/* User-defined info passed to dc_accept_incoming_call( */
|
/** User-defined info passed to dc_accept_incoming_call( */
|
||||||
public String accept_call_info;
|
public String accept_call_info;
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chat_id;
|
public Integer chat_id;
|
||||||
/* ID of the info message referring to the call. */
|
/** ID of the info message referring to the call. */
|
||||||
public Integer msg_id;
|
public Integer msg_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call ended. */
|
/** Call ended. */
|
||||||
public static class CallEnded extends EventType {
|
public static class CallEnded extends EventType {
|
||||||
/* ID of the chat which the message belongs to. */
|
/** ID of the chat which the message belongs to. */
|
||||||
public Integer chat_id;
|
public Integer chat_id;
|
||||||
/* ID of the info message referring to the call. */
|
/** ID of the info message referring to the call. */
|
||||||
public Integer msg_id;
|
public Integer msg_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* One or more transports has changed.
|
* One or more transports has changed.
|
||||||
* <p>
|
* <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.
|
* UI should update the list.
|
||||||
|
* <p>
|
||||||
|
* This event is emitted when transport synchronization messages arrives, but not when the UI modifies the transport list by itself.
|
||||||
*/
|
*/
|
||||||
public static class TransportsModified extends EventType {
|
public static class TransportsModified extends EventType {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ public class FullChat {
|
|||||||
public ChatType chatType;
|
public ChatType chatType;
|
||||||
public String color;
|
public String color;
|
||||||
public java.util.List<Integer> contactIds;
|
public java.util.List<Integer> contactIds;
|
||||||
public java.util.List<Contact> contacts;
|
|
||||||
public Integer ephemeralTimer;
|
public Integer ephemeralTimer;
|
||||||
public Integer freshMessageCounter;
|
public Integer freshMessageCounter;
|
||||||
public Integer id;
|
public Integer id;
|
||||||
@@ -31,12 +30,12 @@ public class FullChat {
|
|||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String mailingListAddress;
|
public String mailingListAddress;
|
||||||
public String name;
|
public String name;
|
||||||
/* Contact IDs of the past chat members. */
|
/** Contact IDs of the past chat members. */
|
||||||
public java.util.List<Integer> pastContactIds;
|
public java.util.List<Integer> pastContactIds;
|
||||||
public Boolean pinned;
|
public Boolean pinned;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String profileImage;
|
public String profileImage;
|
||||||
/* Note that this is different from [`ChatListItem::is_self_in_group`](`crate::api::types::chat_list::ChatListItemFetchResult::ChatListItem::is_self_in_group`). This property should only be accessed when [`FullChat::chat_type`] is [`Chattype::Group`]. */
|
/** Note that this is different from [`ChatListItem::is_self_in_group`](`crate::api::types::chat_list::ChatListItemFetchResult::ChatListItem::is_self_in_group`). This property should only be accessed when [`FullChat::chat_type`] is [`Chattype::Group`]. */
|
||||||
public Boolean selfInGroup;
|
public Boolean selfInGroup;
|
||||||
public Boolean wasSeenRecently;
|
public Boolean wasSeenRecently;
|
||||||
}
|
}
|
||||||
@@ -2,12 +2,12 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public class HttpResponse {
|
public class HttpResponse {
|
||||||
/* base64-encoded response body. */
|
/** base64-encoded response body. */
|
||||||
public String blob;
|
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)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String encoding;
|
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)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String mimetype;
|
public String mimetype;
|
||||||
}
|
}
|
||||||
@@ -7,11 +7,12 @@ public class Message {
|
|||||||
public Integer dimensionsWidth;
|
public Integer dimensionsWidth;
|
||||||
public DownloadState downloadState;
|
public DownloadState downloadState;
|
||||||
public Integer duration;
|
public Integer duration;
|
||||||
/* An error text, if there is one. */
|
/** An error text, if there is one. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String error;
|
public String error;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String file;
|
public String file;
|
||||||
|
/** The size of the file in bytes, if applicable. If message is a pre-message, then this is the size of the file to be downloaded. */
|
||||||
public Integer fileBytes;
|
public Integer fileBytes;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String fileMime;
|
public String fileMime;
|
||||||
@@ -20,18 +21,17 @@ public class Message {
|
|||||||
public Integer fromId;
|
public Integer fromId;
|
||||||
public Boolean hasDeviatingTimestamp;
|
public Boolean hasDeviatingTimestamp;
|
||||||
public Boolean hasHtml;
|
public Boolean hasHtml;
|
||||||
/* Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
|
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
|
||||||
public Boolean hasLocation;
|
public Boolean hasLocation;
|
||||||
public Integer id;
|
public Integer id;
|
||||||
/* if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
|
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer infoContactId;
|
public Integer infoContactId;
|
||||||
/* True if the message was sent by a bot. */
|
/** True if the message was sent by a bot. */
|
||||||
public Boolean isBot;
|
public Boolean isBot;
|
||||||
public Boolean isEdited;
|
public Boolean isEdited;
|
||||||
public Boolean isForwarded;
|
public Boolean isForwarded;
|
||||||
public Boolean isInfo;
|
public Boolean isInfo;
|
||||||
public Boolean isSetupmessage;
|
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer originalMsgId;
|
public Integer originalMsgId;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
@@ -46,8 +46,6 @@ public class Message {
|
|||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer savedMessageId;
|
public Integer savedMessageId;
|
||||||
public Contact sender;
|
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.
|
* True if the message was correctly encrypted&signed, false otherwise. Historically, UIs showed a small padlock on the message then.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -57,7 +55,7 @@ public class Message {
|
|||||||
public Integer sortTimestamp;
|
public Integer sortTimestamp;
|
||||||
public Integer state;
|
public Integer state;
|
||||||
public String subject;
|
public String subject;
|
||||||
/* when is_info is true this describes what type of system message it is */
|
/** when is_info is true this describes what type of system message it is */
|
||||||
public SystemMessageType systemMessageType;
|
public SystemMessageType systemMessageType;
|
||||||
public String text;
|
public String text;
|
||||||
public Integer timestamp;
|
public Integer timestamp;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public class MessageData {
|
|||||||
public Pair<Float, Float> location;
|
public Pair<Float, Float> location;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String overrideSenderName;
|
public String overrideSenderName;
|
||||||
/* Quoted message id. Takes preference over `quoted_text` (see below). */
|
/** Quoted message id. Takes preference over `quoted_text` (see below). */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer quotedMessageId;
|
public Integer quotedMessageId;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package chat.delta.rpc.types;
|
|||||||
|
|
||||||
public class MessageInfo {
|
public class MessageInfo {
|
||||||
public EphemeralTimer ephemeralTimer;
|
public EphemeralTimer ephemeralTimer;
|
||||||
/* When message is ephemeral this contains the timestamp of the message expiry */
|
/** When message is ephemeral this contains the timestamp of the message expiry */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer ephemeralTimestamp;
|
public Integer ephemeralTimestamp;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ public abstract class MessageListItem {
|
|||||||
public Integer msg_id;
|
public Integer msg_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Day marker, separating messages that correspond to different days according to local time. */
|
/** Day marker, separating messages that correspond to different days according to local time. */
|
||||||
public static class DayMarker extends MessageListItem {
|
public static class DayMarker extends MessageListItem {
|
||||||
/* Marker timestamp, for day markers, in unix milliseconds */
|
/** Marker timestamp, for day markers, in unix milliseconds */
|
||||||
public Integer timestamp;
|
public Integer timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,11 +17,12 @@ public abstract class MessageLoadResult {
|
|||||||
public Integer dimensionsWidth;
|
public Integer dimensionsWidth;
|
||||||
public DownloadState downloadState;
|
public DownloadState downloadState;
|
||||||
public Integer duration;
|
public Integer duration;
|
||||||
/* An error text, if there is one. */
|
/** An error text, if there is one. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String error;
|
public String error;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String file;
|
public String file;
|
||||||
|
/** The size of the file in bytes, if applicable. If message is a pre-message, then this is the size of the file to be downloaded. */
|
||||||
public Integer fileBytes;
|
public Integer fileBytes;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String fileMime;
|
public String fileMime;
|
||||||
@@ -30,18 +31,17 @@ public abstract class MessageLoadResult {
|
|||||||
public Integer fromId;
|
public Integer fromId;
|
||||||
public Boolean hasDeviatingTimestamp;
|
public Boolean hasDeviatingTimestamp;
|
||||||
public Boolean hasHtml;
|
public Boolean hasHtml;
|
||||||
/* Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
|
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
|
||||||
public Boolean hasLocation;
|
public Boolean hasLocation;
|
||||||
public Integer id;
|
public Integer id;
|
||||||
/* if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
|
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer infoContactId;
|
public Integer infoContactId;
|
||||||
/* True if the message was sent by a bot. */
|
/** True if the message was sent by a bot. */
|
||||||
public Boolean isBot;
|
public Boolean isBot;
|
||||||
public Boolean isEdited;
|
public Boolean isEdited;
|
||||||
public Boolean isForwarded;
|
public Boolean isForwarded;
|
||||||
public Boolean isInfo;
|
public Boolean isInfo;
|
||||||
public Boolean isSetupmessage;
|
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer originalMsgId;
|
public Integer originalMsgId;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
@@ -56,8 +56,6 @@ public abstract class MessageLoadResult {
|
|||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer savedMessageId;
|
public Integer savedMessageId;
|
||||||
public Contact sender;
|
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.
|
* True if the message was correctly encrypted&signed, false otherwise. Historically, UIs showed a small padlock on the message then.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -67,7 +65,7 @@ public abstract class MessageLoadResult {
|
|||||||
public Integer sortTimestamp;
|
public Integer sortTimestamp;
|
||||||
public Integer state;
|
public Integer state;
|
||||||
public String subject;
|
public String subject;
|
||||||
/* when is_info is true this describes what type of system message it is */
|
/** when is_info is true this describes what type of system message it is */
|
||||||
public SystemMessageType systemMessageType;
|
public SystemMessageType systemMessageType;
|
||||||
public String text;
|
public String text;
|
||||||
public Integer timestamp;
|
public Integer timestamp;
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ public class MessageNotificationInfo {
|
|||||||
public String image;
|
public String image;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String imageMimeType;
|
public String imageMimeType;
|
||||||
/* also known as summary_text1 */
|
/** also known as summary_text1 */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String summaryPrefix;
|
public String summaryPrefix;
|
||||||
/* also known as summary_text2 */
|
/** also known as summary_text2 */
|
||||||
public String summaryText;
|
public String summaryText;
|
||||||
}
|
}
|
||||||
@@ -18,7 +18,7 @@ public abstract class MessageQuote {
|
|||||||
public static class WithMessage extends MessageQuote {
|
public static class WithMessage extends MessageQuote {
|
||||||
public String authorDisplayColor;
|
public String authorDisplayColor;
|
||||||
public String authorDisplayName;
|
public String authorDisplayName;
|
||||||
/* The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
|
/** The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
|
||||||
public Integer chatId;
|
public Integer chatId;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String image;
|
public String image;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ package chat.delta.rpc.types;
|
|||||||
public class MessageSearchResult {
|
public class MessageSearchResult {
|
||||||
public String authorColor;
|
public String authorColor;
|
||||||
public Integer authorId;
|
public Integer authorId;
|
||||||
/* if sender name if overridden it will show it as ~alias */
|
/** if sender name if overridden it will show it as ~alias */
|
||||||
public String authorName;
|
public String authorName;
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String authorProfileImage;
|
public String authorProfileImage;
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public enum NotifyState {
|
public enum NotifyState {
|
||||||
/* Not subscribed to push notifications. */
|
/** Not subscribed to push notifications. */
|
||||||
NotConnected,
|
NotConnected,
|
||||||
|
|
||||||
/* Subscribed to heartbeat push notifications. */
|
/** Subscribed to heartbeat push notifications. */
|
||||||
Heartbeat,
|
Heartbeat,
|
||||||
|
|
||||||
/* Subscribed to push notifications for new messages. */
|
/** Subscribed to push notifications for new messages. */
|
||||||
Connected,
|
Connected,
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ package chat.delta.rpc.types;
|
|||||||
|
|
||||||
public class ProviderInfo {
|
public class ProviderInfo {
|
||||||
public String beforeLoginHint;
|
public String beforeLoginHint;
|
||||||
/* Unique ID, corresponding to provider database filename. */
|
/** Unique ID, corresponding to provider database filename. */
|
||||||
public String id;
|
public String id;
|
||||||
public String overviewPage;
|
public String overviewPage;
|
||||||
public Integer status;
|
public Integer status;
|
||||||
|
|||||||
@@ -17,45 +17,51 @@ public abstract class Qr {
|
|||||||
* If the user agrees, pass this QR code to [`crate::securejoin::join_securejoin`].
|
* If the user agrees, pass this QR code to [`crate::securejoin::join_securejoin`].
|
||||||
*/
|
*/
|
||||||
public static class AskVerifyContact extends Qr {
|
public static class AskVerifyContact extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* ID of the contact. */
|
/** ID of the contact. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the contact key as scanned from the QR code. */
|
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
|
/** Whether the inviter supports the new Securejoin v3 protocol */
|
||||||
|
public Boolean is_v3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user whether to join the group. */
|
/** Ask the user whether to join the group. */
|
||||||
public static class AskVerifyGroup extends Qr {
|
public static class AskVerifyGroup extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* ID of the contact. */
|
/** ID of the contact. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the contact key as scanned from the QR code. */
|
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* Group ID. */
|
/** Group ID. */
|
||||||
public String grpid;
|
public String grpid;
|
||||||
/* Group name. */
|
/** Group name. */
|
||||||
public String grpname;
|
public String grpname;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
|
/** Whether the inviter supports the new Securejoin v3 protocol */
|
||||||
|
public Boolean is_v3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user whether to join the broadcast channel. */
|
/** Ask the user whether to join the broadcast channel. */
|
||||||
public static class AskJoinBroadcast extends Qr {
|
public static class AskJoinBroadcast extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* ID of the contact who owns the broadcast channel and created the QR code. */
|
/** ID of the contact who owns the broadcast channel and created the QR code. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
|
/** Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
|
/** A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
|
||||||
public String grpid;
|
public String grpid;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
/* The user-visible name of this broadcast channel */
|
/** Whether the inviter supports the new Securejoin v3 protocol */
|
||||||
|
public Boolean is_v3;
|
||||||
|
/** The user-visible name of this broadcast channel */
|
||||||
public String name;
|
public String name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,41 +71,41 @@ public abstract class Qr {
|
|||||||
* Ask the user if they want to start chatting.
|
* Ask the user if they want to start chatting.
|
||||||
*/
|
*/
|
||||||
public static class FprOk extends Qr {
|
public static class FprOk extends Qr {
|
||||||
/* Contact ID. */
|
/** Contact ID. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scanned fingerprint does not match the last seen fingerprint. */
|
/** Scanned fingerprint does not match the last seen fingerprint. */
|
||||||
public static class FprMismatch extends Qr {
|
public static class FprMismatch extends Qr {
|
||||||
/* Contact ID. */
|
/** Contact ID. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The scanned QR code contains a fingerprint but no e-mail address. */
|
/** The scanned QR code contains a fingerprint but no e-mail address. */
|
||||||
public static class FprWithoutAddr extends Qr {
|
public static class FprWithoutAddr extends Qr {
|
||||||
/* Key fingerprint. */
|
/** Key fingerprint. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user if they want to create an account on the given domain. */
|
/** Ask the user if they want to create an account on the given domain. */
|
||||||
public static class Account extends Qr {
|
public static class Account extends Qr {
|
||||||
/* Server domain name. */
|
/** Server domain name. */
|
||||||
public String domain;
|
public String domain;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
|
/** Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
|
||||||
public static class Backup2 extends Qr {
|
public static class Backup2 extends Qr {
|
||||||
/* Authentication token. */
|
/** Authentication token. */
|
||||||
public String auth_token;
|
public String auth_token;
|
||||||
/* Iroh node address. */
|
/** Iroh node address. */
|
||||||
public String node_addr;
|
public String node_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class BackupTooNew extends Qr {
|
public static class BackupTooNew extends Qr {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user if they want to use the given service for video chats. */
|
/** Ask the user if they want to use the given service for video chats. */
|
||||||
public static class WebrtcInstance extends Qr {
|
public static class WebrtcInstance extends Qr {
|
||||||
public String domain;
|
public String domain;
|
||||||
public String instance_pattern;
|
public String instance_pattern;
|
||||||
@@ -111,9 +117,9 @@ public abstract class Qr {
|
|||||||
* Note that HTTP(S) URLs without a path and query parameters are treated as HTTP(S) proxy URL. UI may want to still offer to open the URL in the browser if QR code contents starts with `http://` or `https://` and the QR code was not scanned from the proxy configuration screen.
|
* 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 {
|
public static class Proxy extends Qr {
|
||||||
/* Host extracted from the URL to display in the UI. */
|
/** Host extracted from the URL to display in the UI. */
|
||||||
public String host;
|
public String host;
|
||||||
/* Port extracted from the URL to display in the UI. */
|
/** Port extracted from the URL to display in the UI. */
|
||||||
public Integer port;
|
public Integer port;
|
||||||
/**
|
/**
|
||||||
* Proxy URL.
|
* Proxy URL.
|
||||||
@@ -129,9 +135,9 @@ public abstract class Qr {
|
|||||||
* Optionally, a draft message could be provided. Ask the user if they want to start chatting.
|
* Optionally, a draft message could be provided. Ask the user if they want to start chatting.
|
||||||
*/
|
*/
|
||||||
public static class Addr extends Qr {
|
public static class Addr extends Qr {
|
||||||
/* Contact ID. */
|
/** Contact ID. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Draft message. */
|
/** Draft message. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String draft;
|
public String draft;
|
||||||
}
|
}
|
||||||
@@ -154,91 +160,91 @@ public abstract class Qr {
|
|||||||
public String text;
|
public String text;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user if they want to withdraw their own QR code. */
|
/** Ask the user if they want to withdraw their own QR code. */
|
||||||
public static class WithdrawVerifyContact extends Qr {
|
public static class WithdrawVerifyContact extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* Contact ID. */
|
/** Contact ID. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the contact key as scanned from the QR code. */
|
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user if they want to withdraw their own group invite QR code. */
|
/** Ask the user if they want to withdraw their own group invite QR code. */
|
||||||
public static class WithdrawVerifyGroup extends Qr {
|
public static class WithdrawVerifyGroup extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* Contact ID. */
|
/** Contact ID. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the contact key as scanned from the QR code. */
|
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* Group ID. */
|
/** Group ID. */
|
||||||
public String grpid;
|
public String grpid;
|
||||||
/* Group name. */
|
/** Group name. */
|
||||||
public String grpname;
|
public String grpname;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user if they want to withdraw their own broadcast channel invite QR code. */
|
/** Ask the user if they want to withdraw their own broadcast channel invite QR code. */
|
||||||
public static class WithdrawJoinBroadcast extends Qr {
|
public static class WithdrawJoinBroadcast extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* Contact ID. Always `ContactId::SELF`. */
|
/** Contact ID. Always `ContactId::SELF`. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the contact key as scanned from the QR code. */
|
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* ID, uniquely identifying this chat. Called grpid for historic reasons. */
|
/** ID, uniquely identifying this chat. Called grpid for historic reasons. */
|
||||||
public String grpid;
|
public String grpid;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
/* Broadcast name. */
|
/** Broadcast name. */
|
||||||
public String name;
|
public String name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user if they want to revive their own QR code. */
|
/** Ask the user if they want to revive their own QR code. */
|
||||||
public static class ReviveVerifyContact extends Qr {
|
public static class ReviveVerifyContact extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* Contact ID. */
|
/** Contact ID. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the contact key as scanned from the QR code. */
|
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user if they want to revive their own group invite QR code. */
|
/** Ask the user if they want to revive their own group invite QR code. */
|
||||||
public static class ReviveVerifyGroup extends Qr {
|
public static class ReviveVerifyGroup extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* Contact ID. */
|
/** Contact ID. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the contact key as scanned from the QR code. */
|
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* Group ID. */
|
/** Group ID. */
|
||||||
public String grpid;
|
public String grpid;
|
||||||
/* Contact ID. */
|
/** Contact ID. */
|
||||||
public String grpname;
|
public String grpname;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ask the user if they want to revive their own broadcast channel invite QR code. */
|
/** Ask the user if they want to revive their own broadcast channel invite QR code. */
|
||||||
public static class ReviveJoinBroadcast extends Qr {
|
public static class ReviveJoinBroadcast extends Qr {
|
||||||
/* Authentication code. */
|
/** Authentication code. */
|
||||||
public String authcode;
|
public String authcode;
|
||||||
/* Contact ID. Always `ContactId::SELF`. */
|
/** Contact ID. Always `ContactId::SELF`. */
|
||||||
public Integer contact_id;
|
public Integer contact_id;
|
||||||
/* Fingerprint of the contact key as scanned from the QR code. */
|
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||||
public String fingerprint;
|
public String fingerprint;
|
||||||
/* Globally unique chat ID. Called grpid for historic reasons. */
|
/** Globally unique chat ID. Called grpid for historic reasons. */
|
||||||
public String grpid;
|
public String grpid;
|
||||||
/* Invite number. */
|
/** Invite number. */
|
||||||
public String invitenumber;
|
public String invitenumber;
|
||||||
/* Broadcast name. */
|
/** Broadcast name. */
|
||||||
public String name;
|
public String name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* Autogenerated file, do not edit manually */
|
/* Autogenerated file, do not edit manually */
|
||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
/* A single reaction emoji. */
|
/** A single reaction emoji. */
|
||||||
public class Reaction {
|
public class Reaction {
|
||||||
/* Emoji frequency. */
|
/** Emoji frequency. */
|
||||||
public Integer count;
|
public Integer count;
|
||||||
/* Emoji. */
|
/** Emoji. */
|
||||||
public String emoji;
|
public String emoji;
|
||||||
/* True if we reacted with this emoji. */
|
/** True if we reacted with this emoji. */
|
||||||
public Boolean isFromSelf;
|
public Boolean isFromSelf;
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
/* Autogenerated file, do not edit manually */
|
/* Autogenerated file, do not edit manually */
|
||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
/* Structure representing all reactions to a particular message. */
|
/** Structure representing all reactions to a particular message. */
|
||||||
public class Reactions {
|
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;
|
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. There is only a single reaction per contact, but this contains a list of reactions for historical reasons. */
|
||||||
public java.util.Map<String, java.util.List<String>> reactionsByContact;
|
public java.util.Map<String, java.util.List<String>> reactionsByContact;
|
||||||
}
|
}
|
||||||
@@ -2,21 +2,21 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public enum SecurejoinSource {
|
public enum SecurejoinSource {
|
||||||
/* Because of some problem, it is unknown where the QR code came from. */
|
/** Because of some problem, it is unknown where the QR code came from. */
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
||||||
/* The user opened a link somewhere outside Delta Chat */
|
/** The user opened a link somewhere outside Delta Chat */
|
||||||
ExternalLink,
|
ExternalLink,
|
||||||
|
|
||||||
/* The user clicked on a link in a message inside Delta Chat */
|
/** The user clicked on a link in a message inside Delta Chat */
|
||||||
InternalLink,
|
InternalLink,
|
||||||
|
|
||||||
/* The user clicked "Paste from Clipboard" in the QR scan activity */
|
/** The user clicked "Paste from Clipboard" in the QR scan activity */
|
||||||
Clipboard,
|
Clipboard,
|
||||||
|
|
||||||
/* The user clicked "Load QR code as image" in the QR scan activity */
|
/** The user clicked "Load QR code as image" in the QR scan activity */
|
||||||
ImageLoaded,
|
ImageLoaded,
|
||||||
|
|
||||||
/* The user scanned a QR code */
|
/** The user scanned a QR code */
|
||||||
Scan,
|
Scan,
|
||||||
}
|
}
|
||||||
@@ -2,12 +2,12 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public enum SecurejoinUiPath {
|
public enum SecurejoinUiPath {
|
||||||
/* The UI path is unknown, or the user didn't open the QR code screen at all. */
|
/** The UI path is unknown, or the user didn't open the QR code screen at all. */
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
||||||
/* The user directly clicked on the QR icon in the main screen */
|
/** The user directly clicked on the QR icon in the main screen */
|
||||||
QrIcon,
|
QrIcon,
|
||||||
|
|
||||||
/* The user first clicked on the `+` button in the main screen, and then on "New Contact" */
|
/** The user first clicked on the `+` button in the main screen, and then on "New Contact" */
|
||||||
NewContact,
|
NewContact,
|
||||||
}
|
}
|
||||||
@@ -2,15 +2,15 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public enum Socket {
|
public enum Socket {
|
||||||
/* Unspecified socket security, select automatically. */
|
/** Unspecified socket security, select automatically. */
|
||||||
automatic,
|
automatic,
|
||||||
|
|
||||||
/* TLS connection. */
|
/** TLS connection. */
|
||||||
ssl,
|
ssl,
|
||||||
|
|
||||||
/* STARTTLS connection. */
|
/** STARTTLS connection. */
|
||||||
starttls,
|
starttls,
|
||||||
|
|
||||||
/* No TLS, plaintext connection. */
|
/** No TLS, plaintext connection. */
|
||||||
plain,
|
plain,
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@ package chat.delta.rpc.types;
|
|||||||
public enum SystemMessageType {
|
public enum SystemMessageType {
|
||||||
Unknown,
|
Unknown,
|
||||||
GroupNameChanged,
|
GroupNameChanged,
|
||||||
|
GroupDescriptionChanged,
|
||||||
GroupImageChanged,
|
GroupImageChanged,
|
||||||
MemberAddedToGroup,
|
MemberAddedToGroup,
|
||||||
MemberRemovedFromGroup,
|
MemberRemovedFromGroup,
|
||||||
@@ -19,21 +20,21 @@ public enum SystemMessageType {
|
|||||||
CallAccepted,
|
CallAccepted,
|
||||||
CallEnded,
|
CallEnded,
|
||||||
|
|
||||||
/* 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
|
/** 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
|
||||||
SecurejoinWait,
|
SecurejoinWait,
|
||||||
|
|
||||||
/* 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
|
/** 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
|
||||||
SecurejoinWaitTimeout,
|
SecurejoinWaitTimeout,
|
||||||
|
|
||||||
/* Chat ephemeral message timer is changed. */
|
/** Chat ephemeral message timer is changed. */
|
||||||
EphemeralTimerChanged,
|
EphemeralTimerChanged,
|
||||||
|
|
||||||
/* Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
|
/** Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
|
||||||
MultiDeviceSync,
|
MultiDeviceSync,
|
||||||
|
|
||||||
/* Webxdc info added with `info` set in `send_webxdc_status_update()`. */
|
/** Webxdc info added with `info` set in `send_webxdc_status_update()`. */
|
||||||
WebxdcInfoMessage,
|
WebxdcInfoMessage,
|
||||||
|
|
||||||
/* This message contains a users iroh node address. */
|
/** This message contains a users iroh node address. */
|
||||||
IrohNodeAddr,
|
IrohNodeAddr,
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
/* Autogenerated file, do not edit manually */
|
||||||
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
|
public class TransportListEntry {
|
||||||
|
/** Whether this transport is set to 'unpublished'. See `set_transport_unpublished` / `setTransportUnpublished` for details. */
|
||||||
|
public Boolean isUnpublished;
|
||||||
|
/** The login data entered by the user. */
|
||||||
|
public EnteredLoginParam param;
|
||||||
|
}
|
||||||
@@ -2,19 +2,19 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public class VcardContact {
|
public class VcardContact {
|
||||||
/* Email address. */
|
/** Email address. */
|
||||||
public String addr;
|
public String addr;
|
||||||
/* Contact color as hex string. */
|
/** Contact color as hex string. */
|
||||||
public String color;
|
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 String displayName;
|
||||||
/* Public PGP key in Base64. */
|
/** Public PGP key in Base64. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String key;
|
public String key;
|
||||||
/* Profile image in Base64. */
|
/** Profile image in Base64. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String profileImage;
|
public String profileImage;
|
||||||
/* Last update timestamp. */
|
/** Last update timestamp. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public Integer timestamp;
|
public Integer timestamp;
|
||||||
}
|
}
|
||||||
@@ -4,40 +4,40 @@ package chat.delta.rpc.types;
|
|||||||
public enum Viewtype {
|
public enum Viewtype {
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
||||||
/* Text message. */
|
/** Text message. */
|
||||||
Text,
|
Text,
|
||||||
|
|
||||||
/* Image message. If the image is an animated GIF, the type `Viewtype.Gif` should be used. */
|
/** Image message. If the image is an animated GIF, the type `Viewtype.Gif` should be used. */
|
||||||
Image,
|
Image,
|
||||||
|
|
||||||
/* Animated GIF message. */
|
/** Animated GIF message. */
|
||||||
Gif,
|
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.
|
* Message containing a sticker, similar to image.
|
||||||
* <p>
|
* <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.
|
* 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,
|
Sticker,
|
||||||
|
|
||||||
/* Message containing an Audio file. */
|
/** Message containing an Audio file. */
|
||||||
Audio,
|
Audio,
|
||||||
|
|
||||||
/* A voice message that was directly recorded by the user. For all other audio messages, the type `Viewtype.Audio` should be used. */
|
/** A voice message that was directly recorded by the user. For all other audio messages, the type `Viewtype.Audio` should be used. */
|
||||||
Voice,
|
Voice,
|
||||||
|
|
||||||
/* Video messages. */
|
/** Video messages. */
|
||||||
Video,
|
Video,
|
||||||
|
|
||||||
/* Message containing any file, eg. a PDF. */
|
/** Message containing any file, eg. a PDF. */
|
||||||
File,
|
File,
|
||||||
|
|
||||||
/* Message is a call. */
|
/** Message is a call. */
|
||||||
Call,
|
Call,
|
||||||
|
|
||||||
/* Message is an webxdc instance. */
|
/** Message is an webxdc instance. */
|
||||||
Webxdc,
|
Webxdc,
|
||||||
|
|
||||||
/* Message containing shared contacts represented as a vCard (virtual contact file) with email addresses and possibly other fields. Use `parse_vcard()` to retrieve them. */
|
/** Message containing shared contacts represented as a vCard (virtual contact file) with email addresses and possibly other fields. Use `parse_vcard()` to retrieve them. */
|
||||||
Vcard,
|
Vcard,
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,9 @@
|
|||||||
package chat.delta.rpc.types;
|
package chat.delta.rpc.types;
|
||||||
|
|
||||||
public class WebxdcMessageInfo {
|
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 orientation;
|
||||||
|
/** 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)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String document;
|
public String document;
|
||||||
/**
|
/**
|
||||||
@@ -13,24 +15,28 @@ public class WebxdcMessageInfo {
|
|||||||
* App icons should should be square, the implementations will add round corners etc. as needed.
|
* App icons should should be square, the implementations will add round corners etc. as needed.
|
||||||
*/
|
*/
|
||||||
public String icon;
|
public String icon;
|
||||||
/* True if full internet access should be granted to the app. */
|
/** True if full internet access should be granted to the app. */
|
||||||
public Boolean internetAccess;
|
public Boolean internetAccess;
|
||||||
|
/** Define if the local user is the one who initially shared the webxdc application in the chat. */
|
||||||
|
public Boolean isAppSender;
|
||||||
|
/** Define if the app runs in a broadcasting context. */
|
||||||
|
public Boolean isBroadcast;
|
||||||
/**
|
/**
|
||||||
* The name of the app.
|
* The name of the app.
|
||||||
* <p>
|
* <p>
|
||||||
* Defaults to the filename if not set in the manifest.
|
* Defaults to the filename if not set in the manifest.
|
||||||
*/
|
*/
|
||||||
public String name;
|
public String name;
|
||||||
/* Address to be used for `window.webxdc.selfAddr` in JS land. */
|
/** Address to be used for `window.webxdc.selfAddr` in JS land. */
|
||||||
public String selfAddr;
|
public String selfAddr;
|
||||||
/* Milliseconds to wait before calling `sendUpdate()` again since the last call. Should be exposed to `window.sendUpdateInterval` in JS land. */
|
/** Milliseconds to wait before calling `sendUpdate()` again since the last call. Should be exposed to `window.sendUpdateInterval` in JS land. */
|
||||||
public Integer sendUpdateInterval;
|
public Integer sendUpdateInterval;
|
||||||
/* Maximum number of bytes accepted for a serialized update object. Should be exposed to `window.sendUpdateMaxSize` in JS land. */
|
/** Maximum number of bytes accepted for a serialized update object. Should be exposed to `window.sendUpdateMaxSize` in JS land. */
|
||||||
public Integer sendUpdateMaxSize;
|
public Integer sendUpdateMaxSize;
|
||||||
/* URL where the source code of the Webxdc and other information can be found; defaults to an empty string. Implementations may offer an menu or a button to open this URL. */
|
/** URL where the source code of the Webxdc and other information can be found; defaults to an empty string. Implementations may offer an menu or a button to open this URL. */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String sourceCodeUrl;
|
public String sourceCodeUrl;
|
||||||
/* short string describing the state of the app, sth. as "2 votes", "Highscore: 123", can be changed by the apps */
|
/** short string describing the state of the app, sth. as "2 votes", "Highscore: 123", can be changed by the apps */
|
||||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||||
public String summary;
|
public String summary;
|
||||||
}
|
}
|
||||||
@@ -2,8 +2,9 @@ package com.b44t.messenger;
|
|||||||
|
|
||||||
public class DcAccounts {
|
public class DcAccounts {
|
||||||
|
|
||||||
public DcAccounts(String dir) {
|
public DcAccounts(String dir, DcEventChannel channel) {
|
||||||
accountsCPtr = createAccountsCPtr(dir);
|
accountsCPtr = createAccountsCPtr(dir, channel);
|
||||||
|
if (accountsCPtr == 0) throw new RuntimeException("createAccountsCPtr() returned null pointer");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -19,8 +20,14 @@ public class DcAccounts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public DcEventEmitter getEventEmitter () { return new DcEventEmitter(getEventEmitterCPtr()); }
|
public DcEventEmitter getEventEmitter() {
|
||||||
public DcJsonrpcInstance getJsonrpcInstance () { return new DcJsonrpcInstance(getJsonrpcInstanceCPtr()); }
|
return new DcEventEmitter(getEventEmitterCPtr());
|
||||||
|
}
|
||||||
|
|
||||||
|
public DcJsonrpcInstance getJsonrpcInstance() {
|
||||||
|
return new DcJsonrpcInstance(getJsonrpcInstanceCPtr());
|
||||||
|
}
|
||||||
|
|
||||||
public void startIo() {
|
public void startIo() {
|
||||||
for (int accountId : getAll()) {
|
for (int accountId : getAll()) {
|
||||||
DcContext acc = getAccount(accountId);
|
DcContext acc = getAccount(accountId);
|
||||||
@@ -28,34 +35,56 @@ public class DcAccounts {
|
|||||||
acc.startIo();
|
acc.startIo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
;
|
||||||
|
|
||||||
public native void startIo2();
|
public native void startIo2();
|
||||||
|
|
||||||
public native void stopIo();
|
public native void stopIo();
|
||||||
|
|
||||||
public native void maybeNetwork();
|
public native void maybeNetwork();
|
||||||
|
|
||||||
public native void setPushDeviceToken(String token);
|
public native void setPushDeviceToken(String token);
|
||||||
|
|
||||||
public native boolean backgroundFetch(int timeoutSeconds);
|
public native boolean backgroundFetch(int timeoutSeconds);
|
||||||
|
|
||||||
public native void stopBackgroundFetch();
|
public native void stopBackgroundFetch();
|
||||||
|
|
||||||
public native int migrateAccount(String dbfile);
|
public native int migrateAccount(String dbfile);
|
||||||
|
|
||||||
public native boolean removeAccount(int accountId);
|
public native boolean removeAccount(int accountId);
|
||||||
|
|
||||||
public native int[] getAll();
|
public native int[] getAll();
|
||||||
public DcContext getAccount (int accountId) { return new DcContext(getAccountCPtr(accountId)); }
|
|
||||||
public DcContext getSelectedAccount () { return new DcContext(getSelectedAccountCPtr()); }
|
public DcContext getAccount(int accountId) {
|
||||||
|
return new DcContext(getAccountCPtr(accountId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public DcContext getSelectedAccount() {
|
||||||
|
return new DcContext(getSelectedAccountCPtr());
|
||||||
|
}
|
||||||
|
|
||||||
public native boolean selectAccount(int accountId);
|
public native boolean selectAccount(int accountId);
|
||||||
|
|
||||||
// working with raw c-data
|
// working with raw c-data
|
||||||
private long accountsCPtr; // CAVE: the name is referenced in the JNI
|
private long accountsCPtr; // CAVE: the name is referenced in the JNI
|
||||||
private native long createAccountsCPtr (String dir);
|
|
||||||
|
private native long createAccountsCPtr(String dir, DcEventChannel channel);
|
||||||
|
|
||||||
private native void unrefAccountsCPtr();
|
private native void unrefAccountsCPtr();
|
||||||
|
|
||||||
private native long getEventEmitterCPtr();
|
private native long getEventEmitterCPtr();
|
||||||
|
|
||||||
private native long getJsonrpcInstanceCPtr();
|
private native long getJsonrpcInstanceCPtr();
|
||||||
|
|
||||||
private native long getAccountCPtr(int accountId);
|
private native long getAccountCPtr(int accountId);
|
||||||
|
|
||||||
private native long getSelectedAccountCPtr();
|
private native long getSelectedAccountCPtr();
|
||||||
|
|
||||||
public boolean isAllChatmail() {
|
public boolean isAllChatmail() {
|
||||||
for (int accountId : getAll()) {
|
for (int accountId : getAll()) {
|
||||||
DcContext dcContext = getAccount(accountId);
|
DcContext dcContext = getAccount(accountId);
|
||||||
if (!dcContext.isChatmail()) {
|
if (dcContext.getConfigInt("is_chatmail") == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ public class DcBackupProvider {
|
|||||||
return backupProviderCPtr != 0;
|
return backupProviderCPtr != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override protected void finalize() throws Throwable {
|
@Override
|
||||||
|
protected void finalize() throws Throwable {
|
||||||
super.finalize();
|
super.finalize();
|
||||||
unref();
|
unref();
|
||||||
}
|
}
|
||||||
@@ -23,10 +24,13 @@ public class DcBackupProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public native String getQr();
|
public native String getQr();
|
||||||
|
|
||||||
public native String getQrSvg();
|
public native String getQrSvg();
|
||||||
|
|
||||||
public native void waitForReceiver();
|
public native void waitForReceiver();
|
||||||
|
|
||||||
// working with raw c-data
|
// working with raw c-data
|
||||||
private long backupProviderCPtr; // CAVE: the name is referenced in the JNI
|
private long backupProviderCPtr; // CAVE: the name is referenced in the JNI
|
||||||
|
|
||||||
private native void unrefBackupProviderCPtr();
|
private native void unrefBackupProviderCPtr();
|
||||||
}
|
}
|
||||||
|
|||||||