Compare commits
790 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| 2a54867724 | |||
| 210e5c7fbc | |||
| a5818c7cba | |||
| 059d517d0d | |||
| 5c3eb0ac82 | |||
| efa04fce18 | |||
| fb9771adde | |||
| 2930d0dc2d | |||
| e6e85ed812 | |||
| 7837a99e7b | |||
| 8c546dc358 | |||
| f0c75ec3c6 | |||
| 658283c4e8 | |||
| 0ef4d645df | |||
| 91713911ee | |||
| 1c0a54d75e | |||
| 0f82b3ca93 | |||
| 1a80187c07 | |||
| e315d0505c | |||
| 10b966a7c8 | |||
| 3c65408f25 | |||
| 1e31b479e8 | |||
| 6f1f446aa8 | |||
| e5149ac255 | |||
| 403539da35 | |||
| 443501112d | |||
| bea2effb89 | |||
| b2d875cc61 | |||
| e94f571744 | |||
| cf91468f65 | |||
| 69c6fdd070 | |||
| 1b9bfc37ad | |||
| 8cb1c195b1 | |||
| 41f963332c | |||
| dc6dee6a1a | |||
| 35becfc63b | |||
| 6c31d8cf85 | |||
| f6c25a2015 | |||
| 4c8d27f4bb | |||
| 87c49dc680 | |||
| f0d5695729 | |||
| be01c3b14f | |||
| bf435f4303 | |||
| 0289f47adc | |||
| 1f455c435f | |||
| db8d4b5daf | |||
| 5ac7f9ee11 | |||
| 6c80f85290 | |||
| 744bca93e8 | |||
| 601a65a1cb | |||
| 9f2523da21 | |||
| c936d51bac | |||
| b77862c290 | |||
| c495c3936b | |||
| a5a5819eec | |||
| 429c3fb57c | |||
| 0c9bec1d3d | |||
| 51771669d3 | |||
| f32651cd9d | |||
| 07a2663591 | |||
| fe9ee4c484 | |||
| 1425815467 | |||
| eea4a1b124 | |||
| 72c7772e89 | |||
| c4f0dc2f2d | |||
| 2d0645465e | |||
| 5031993289 | |||
| 8e944552b3 | |||
| 342b071189 | |||
| 32248b4635 | |||
| 89b4be49c8 | |||
| b3230abd68 | |||
| e26ac3d264 | |||
| fcc98e81d5 | |||
| bd4fa0b032 | |||
| d4675f25ec | |||
| a2a440e57b | |||
| f24b2e2540 | |||
| f8d2cd7bf3 | |||
| 1ff99ddbe4 | |||
| 13bf0d6f9f | |||
| d24f53895e | |||
| 66e8fa9d9e | |||
| 230fb79584 | |||
| 9181a9c398 | |||
| 2f05b20b0f | |||
| 115ffae588 | |||
| 7455e56f11 | |||
| d4b8e4bafa | |||
| 67a2e3fcd9 | |||
| f12d6855e9 | |||
| 56459e7e7a | |||
| d5244f5f96 | |||
| c8722ddcc6 | |||
| 5874001ec2 | |||
| b94a4cbe8b | |||
| 5d0b5f7947 | |||
| a193ee6cdf | |||
| ff438731d8 | |||
| 08913a5e76 | |||
| e7d2656613 | |||
| f3210f2626 | |||
| 0b1fa7c7d1 | |||
| 6b6d48f5da | |||
| 3b9e989195 | |||
| 4af065aad9 | |||
| b0e918caab | |||
| a6384dc679 | |||
| 838db45a74 | |||
| 44328f1086 | |||
| 2064a2f0ea | |||
| 6b066d9428 | |||
| d68508c0cf | |||
| 5f5f303a93 | |||
| 71bb0105ab | |||
| 796c81af61 | |||
| 329c7a52a7 | |||
| b19d39b794 | |||
| b4d8f1e04f | |||
| febf2cb105 | |||
| ef00e04638 | |||
| 1042f4b4f8 | |||
| 0180d63821 | |||
| 8b8c6b6bbb | |||
| fe8ad85f89 | |||
| c938c4dcd9 | |||
| 35f6a06406 | |||
| db7365c3b3 | |||
| 51d7e5df62 | |||
| 28f7fbf806 | |||
| d6d3dd8930 | |||
| 83571ba0bf | |||
| 34fc888c5e | |||
| 0a7be040c3 | |||
| 448334a8a2 | |||
| 5141116f38 | |||
| 310500b8d7 | |||
| 7bc0ab858a | |||
| ca438ca3a3 | |||
| 2a2cb7c26e | |||
| 9e5a2d30ed | |||
| 5b8c0db287 | |||
| 08864ae250 | |||
| ea6bd9283c | |||
| 83dfca249d | |||
| c7d41d1b84 | |||
| b09838f033 | |||
| 10164032f0 | |||
| 7829ff0a83 | |||
| aaa8a07511 | |||
| cd2aedcc6b | |||
| 553610cfa4 | |||
| ceea00e2cc | |||
| ef512b0f14 | |||
| 83a7e4df3f | |||
| d4aa90cc0c | |||
| 342d820095 | |||
| 18d9c00d13 | |||
| 8df792a8e3 | |||
| 0693f8ad60 | |||
| c6ff66ba51 | |||
| eaa6a68e4f | |||
| 6cf044d7c9 | |||
| 174170ee4f | |||
| 3ee2c3f0be | |||
| 339ab13f64 | |||
| 777e6f40cb | |||
| 577ec92c53 | |||
| d41679f2c0 | |||
| 2bfb2ae58f | |||
| ca56ca2dd1 | |||
| ca35a0635b | |||
| 127f29a17e | |||
| 9f40d84a51 | |||
| 21eab6dfe9 | |||
| d8ea2ad273 | |||
| a66b4d8923 | |||
| 3c9a289e2d | |||
| 29daa1ee89 | |||
| 769a07449f | |||
| 0993745c33 | |||
| f1d9ddeed6 | |||
| 2218ae91e0 | |||
| 21a8ba9674 | |||
| 153fe5f1e7 | |||
| ec49ac8eb6 | |||
| da1e71b2d2 | |||
| 00027ad8f3 | |||
| 81e7f37d61 | |||
| 4e6c1e3eaf | |||
| 77eda90923 | |||
| 0a7b9e7ea2 | |||
| 718bf0d74b | |||
| 82c963c38f | |||
| 999a33e77c | |||
| e96b4db126 | |||
| 118d4f864f | |||
| d6259f112e | |||
| f9eb55170d | |||
| 2bb104a234 | |||
| b75b29cf08 | |||
| 2a3934cbd7 | |||
| 9a6abed1e4 | |||
| baf5f97e96 | |||
| 3426d9cb37 | |||
| 53f401caf5 | |||
| 4950d0be55 | |||
| 57ac9d6b91 | |||
| 8723adbfcd | |||
| 8c5038c20f | |||
| 6518c22b79 | |||
| 0027e2c93b | |||
| 0b8eaad68a | |||
| 16738f053a | |||
| bed9a4d8d4 | |||
| 1ee3d40f37 | |||
| 1c6e9fc391 | |||
| 31c8e8d46b | |||
| ff6e0d9fbf | |||
| a92ccd6d43 | |||
| 32bdce147a | |||
| 1e6d1ed917 | |||
| 0f9e378923 | |||
| 5aaa11a445 | |||
| e77f266da5 | |||
| dc1be8e07b | |||
| d9daae7f41 | |||
| b30ae06dde | |||
| 488ba08e05 | |||
| 7a1db99daa | |||
| 8450349e19 | |||
| 50a6389b75 | |||
| aa4b65dbb0 | |||
| 96154422c1 | |||
| bc82f56353 | |||
| 1d9c9bb1b6 | |||
| 037a468332 | |||
| df41fa7cba | |||
| a48f595cf7 | |||
| f221321e6c | |||
| bf9842e414 | |||
| 0ee54460ba | |||
| 83a6fc531a | |||
| 8989737c71 | |||
| 56f89af121 | |||
| 97ee01eac1 | |||
| 8c7e430d4d | |||
| 2b36b69251 | |||
| acf8f10f76 | |||
| e5b890a765 | |||
| 3da97acdfd | |||
| 75fc7c48e9 | |||
| 7bdefeab37 | |||
| f71097f2d2 | |||
| 90e2229543 | |||
| e8e9987eb3 | |||
| 68b5383dc4 | |||
| 5ab215489a | |||
| 8f401e2a09 | |||
| 572932e92d | |||
| f924a407b3 | |||
| adcbf118b6 | |||
| 0e185eff4c | |||
| ad5df50eb9 | |||
| 22921e72e9 | |||
| 199881e3b2 | |||
| 12ec74e835 | |||
| 42d0a40f58 | |||
| 68e8b64b47 | |||
| a06f77b5f8 | |||
| b809fc007b | |||
| 334893071b | |||
| 306064e260 | |||
| 85f679c69f | |||
| f23e3d4e22 | |||
| 59d4c8fbd8 | |||
| 5f33c8a56d | |||
| 45ba604820 | |||
| 780df4df46 | |||
| 01ac637142 | |||
| 147de536f7 | |||
| 9f0596de0a | |||
| 750fbaa6cc | |||
| c623343b04 | |||
| b216274b37 | |||
| 843e813593 | |||
| 9eb0608c89 | |||
| 560a993972 | |||
| 8701c72d43 | |||
| 454f8a4628 | |||
| 03cc658e7e | |||
| e12081642d | |||
| 9cbdd8d553 | |||
| 65b1d93c70 | |||
| 085eace0cf | |||
| 552f6e2975 | |||
| fa75294472 | |||
| 75498e7fa7 | |||
| f57d44cea7 | |||
| 242e3beb93 | |||
| 21d4a1604b | |||
| f33805abb0 | |||
| 5fd4a60af4 | |||
| a59eaea0e4 | |||
| b11628346f | |||
| a6f99bdb58 | |||
| e44bc65ca2 | |||
| 77f4e9f116 | |||
| b40f98a00e | |||
| 596983d2c1 | |||
| 78f061bc9d | |||
| 2f42d3bcd2 | |||
| d67b71297d | |||
| 629ae0b16e | |||
| 7e1930abc5 | |||
| e5c9fd05f2 | |||
| c4427c198e | |||
| a9d1d2d631 | |||
| 3a4bf8eaea | |||
| 4b903c73dc | |||
| 90a0f75823 | |||
| 0546ea2c91 | |||
| 66b619cc48 | |||
| fbe8888c71 | |||
| 2b156cff17 | |||
| 90d485ba16 | |||
| 4978c555da | |||
| 383e50da32 | |||
| 22af7427cb | |||
| 6d7ec658a2 | |||
| df175f40e1 | |||
| 9c2a885553 | |||
| 81809f6906 | |||
| 19248025ec | |||
| 54a31722e0 | |||
| dde84fc0a3 | |||
| a6823d2140 | |||
| 9897f286ff | |||
| 2881ea7150 | |||
| 5ab83e71c8 | |||
| 993670c7be | |||
| 90df47d352 | |||
| 73ff1560ae | |||
| b0f719e791 | |||
| ec0ffd3b8e | |||
| f4dc4ea66d | |||
| 867327d34c | |||
| 1f1d16d4ed | |||
| 776c7d129d | |||
| a9be7555de | |||
| 51a9998848 | |||
| 96068be20b | |||
| c59a682837 | |||
| b4f026b04e | |||
| 4dbd2f23df | |||
| b842392555 | |||
| 7e0e6b6cab | |||
| f1911d3910 | |||
| f9c675de0e | |||
| 79ded65e47 | |||
| d54ae28a73 | |||
| 6365062275 | |||
| 394a749e7f | |||
| f082949cab | |||
| 222e5092d2 | |||
| 69b0e953af | |||
| 954ac96069 | |||
| 91cc79d395 | |||
| f5191255fe | |||
| a0ffd8b34e | |||
| c2ac3dea15 | |||
| e543827320 | |||
| 916b5f7b8a | |||
| df2e870025 | |||
| 54c3b6bc4c | |||
| 46816b2c0c | |||
| 4387585ddc | |||
| 4f70cd1229 | |||
| d290acc3ae | |||
| dc84613c61 | |||
| b98cb839cc | |||
| 2b798e8126 | |||
| 3ffc71bc0f | |||
| 4f4e2bb291 | |||
| 8a57954eb3 | |||
| 00ec33b1e8 | |||
| c4e04cbc71 | |||
| cccd6ae225 | |||
| 882aa30e5f | |||
| bc372d5406 | |||
| 0f8d4ad8f2 | |||
| c5f98d09f2 | |||
| 091ecc0329 | |||
| f76b1cb3d3 | |||
| 98551713ae | |||
| bc2e4002c3 | |||
| 40b8f1297e | |||
| 84f8a39355 | |||
| 6874191143 | |||
| 7ecc1d0381 | |||
| aea7e912e0 | |||
| 4f8068f144 | |||
| 4f4e42e20c | |||
| 8ddb51382e | |||
| 7cba6edca9 | |||
| 8fb870c51c | |||
| 252263e6db | |||
| 4efdc0b1c8 | |||
| 30858c51d6 | |||
| 42cd1c6ad1 | |||
| e6b40adf8a | |||
| 500e5a910d | |||
| fe3f34222d | |||
| 408c7ae727 | |||
| 5198191728 | |||
| 6f2cc60017 | |||
| 091cb931d7 | |||
| 26ec26e75c | |||
| 1b0b87f148 | |||
| 9dbb918ed8 | |||
| a955d6f2f7 | |||
| 42f8eb9153 | |||
| 2143bc01d1 | |||
| 5a3728428b | |||
| f236085b92 | |||
| ac6119792f | |||
| b0cea8f099 | |||
| 7590b21928 | |||
| ea7fd0ec22 | |||
| cf4cb2f839 | |||
| 6a4e40d17b | |||
| 5302e86011 | |||
| 5382e880a9 | |||
| 2385b236c7 | |||
| 5224119f9e | |||
| dfef2b4120 | |||
| 6d7f417233 | |||
| 05ef95e757 | |||
| 8aa45b7bc9 | |||
| 7cea23caf5 | |||
| 4a2bed3e6c | |||
| 3aa2fbf67a | |||
| c5d9471f2a | |||
| 5117b70c58 | |||
| da4d17aa14 | |||
| 6135813bff | |||
| 8547f7aab8 | |||
| 6dca20045c | |||
| 58ef777091 | |||
| 4a836b3d82 | |||
| 363122fd15 | |||
| b751219c78 | |||
| e586fafc54 | |||
| 2c04319c52 | |||
| f9607e4453 | |||
| 6aec209ebc | |||
| 9adc9b34e5 | |||
| 9267501bc1 | |||
| 924c3f8920 | |||
| 8f93dacbff | |||
| a07e9312ea | |||
| 79f6010d5f | |||
| c5af1d4f2b | |||
| 20a3820871 | |||
| cb0d1106b4 | |||
| 291ef86a4f | |||
| b0457bc036 | |||
| 4d7107314a | |||
| 4185219088 | |||
| ef51492d0b | |||
| 4dc10f977e | |||
| aaba52dba6 | |||
| ca4808aaca | |||
| 66324fe914 | |||
| a5f67e9d9f | |||
| 8b5c887402 | |||
| 183cb03577 | |||
| b1e6d59ba9 | |||
| 33f38889c1 | |||
| f97e800907 | |||
| 21e597d09e | |||
| 6b040b160d | |||
| 57e5523bf3 | |||
| 874492c9ae | |||
| 8ae6407461 | |||
| ae8ce94c00 | |||
| 74208fff69 | |||
| 7ace2b9baf | |||
| f28fffb9df | |||
| 349e8d80c8 | |||
| 4b9217e3e6 | |||
| 4e6e805ede | |||
| 02a1c86f01 | |||
| b28fb4ac9e | |||
| fddc80e60b | |||
| e5b1becf13 | |||
| 01b78e37fd | |||
| d0b1f36f60 | |||
| e388464d28 | |||
| afc7a04b63 | |||
| b871e42b86 | |||
| 3479233f82 | |||
| 7e3e35a9a1 | |||
| 92711444e4 | |||
| ec576d7159 | |||
| 70a05221ab | |||
| 6335cfa178 | |||
| ebda8c4577 | |||
| de9a2df1b4 | |||
| a3c7e3db3d | |||
| 249fc829be | |||
| 5b62f7bf25 | |||
| df6c858b92 | |||
| c9816ae785 | |||
| a24069ce3d | |||
| f770f817d0 | |||
| bee804e095 | |||
| 6b1c6b37ac | |||
| 881e69c176 | |||
| ac6df2ff85 | |||
| 7698ac5c06 | |||
| c2abe42b60 | |||
| 3e95197d02 | |||
| 534a75feaa | |||
| 7a11234431 | |||
| 0e91537a4d | |||
| b074bf1819 | |||
| b8d2552aa8 | |||
| 320c120a61 | |||
| 6c1a3c850a | |||
| 7ec87f55b6 | |||
| f6ce98f9a2 | |||
| cb465ec85e | |||
| 6f10a90c5f | |||
| 9f439c852f | |||
| 2cc0451a8a | |||
| 02230d05a1 | |||
| 9a6f6d7ea6 | |||
| f4cd299f70 | |||
| d0358a4d0c | |||
| 4fc115b93d | |||
| 0157510c5d | |||
| 831ce19689 | |||
| 9431e26696 | |||
| 9ef01dd352 | |||
| 01c766db41 | |||
| 364d15442a | |||
| 32eefaab42 | |||
| 4b8177f7f0 | |||
| 092a5caf8b | |||
| bfe4438773 | |||
| d251fffc07 | |||
| 180c2bc8de | |||
| 082815f676 | |||
| 640688d774 | |||
| 30868198a2 | |||
| 75673ef1ad | |||
| 478d937b3c | |||
| 7a5eb6bea6 | |||
| 0142d51835 | |||
| 075bad3638 | |||
| 1f173bae9b | |||
| 2deb61477f | |||
| fcc1ab1079 | |||
| c72207da8a | |||
| 82233d7862 | |||
| 2547a0435c | |||
| b6ce6d908f | |||
| c6bbb0a524 | |||
| 826258a1be | |||
| 05dde13e68 | |||
| 06130c7cd8 | |||
| 5d7c701da8 | |||
| 91e898ee96 | |||
| 61e9466c59 | |||
| 39c48d3dcd | |||
| 1c7c3f06e6 | |||
| d4ddb68137 | |||
| c9ac421315 | |||
| e14bf24bb1 | |||
| 700d11f600 | |||
| fbb33c735c | |||
| 7cc9d7ea2f | |||
| ca27be240e | |||
| 8ab9b92517 | |||
| f95b48ad6a | |||
| 8ebdc5414a | |||
| a0e07cb2ea | |||
| 152360d94a | |||
| 8513f7cd36 | |||
| 17e3f3afdd | |||
| 7d7f62dae1 | |||
| 2bd0a0d935 | |||
| cf0414dd66 | |||
| 5fbd065882 | |||
| 5982a9dd8f | |||
| 4b20e3f41f | |||
| ac8d8886cc | |||
| a803d472bf | |||
| 396ed14067 | |||
| 5faea5e40a | |||
| 08bb248919 | |||
| 30dd7a9c33 | |||
| 28f57a2ccb | |||
| c0717237ad | |||
| 5716372453 | |||
| d362cf4467 | |||
| 56118d3732 | |||
| a03f51f7c5 | |||
| 6cf59133c2 | |||
| ef8d833f5e | |||
| b110c1f91e | |||
| e53a1f0b22 | |||
| 5a5cbfceb7 | |||
| 57a557a9b4 | |||
| 2328bf1e2a | |||
| ce4c9aaba0 | |||
| 71a2cb7a5b | |||
| 79462c0596 | |||
| 68f5d1ae27 | |||
| 77caced5ed | |||
| 88a4f99cf8 | |||
| 42544fd447 | |||
| 5ff869cd4a | |||
| 4af1666a31 | |||
| 786fd3f47d | |||
| a0d9315ff4 | |||
| 86954a3c42 | |||
| f136b6d7d1 | |||
| 9e4b744046 | |||
| 8db4604224 | |||
| 43f9094c04 | |||
| 1217e65889 | |||
| d8eaf0ad4b | |||
| 4fbb8d2b78 | |||
| 7cebd04086 | |||
| b584fdfd89 | |||
| db35fef6db | |||
| 068102a0d8 | |||
| 02ff8a2a6b | |||
| 321b5a223b | |||
| ab7fd960ca | |||
| dec685023e | |||
| 168d2ae16c | |||
| e55249182a | |||
| 0966487978 | |||
| fd057485db | |||
| a68f3a7024 | |||
| 1dad6ebf8a | |||
| a77b1a5dd6 | |||
| c0a65e2e9f | |||
| 82ef0560a5 | |||
| 9166b2a42a | |||
| 2ef3811a56 | |||
| 1b91c1c482 | |||
| 0d8962f76c | |||
| e98535418c | |||
| 5eb9065d89 | |||
| 9e70c43ab8 | |||
| fc8bfabeb2 | |||
| 681c22293f | |||
| bed8d511fe | |||
| eeeb686868 | |||
| 76dda10a31 | |||
| 6a7c4f24e9 | |||
| 8cdfafd7c3 | |||
| 1c6faeac04 | |||
| 7ecf0a7daa | |||
| b2bf7e8ae7 | |||
| 0a34456302 | |||
| 3ebcc1dd99 | |||
| ff7df0e1e6 | |||
| 68cd070b98 | |||
| 8ff8cffa15 | |||
| dc216feb30 | |||
| 84fc885617 | |||
| 72bcbe80c0 | |||
| b4ed26b842 | |||
| 7be6b0a1ee | |||
| 9a2fdcdcbd | |||
| e81960f98a | |||
| a9541a936e | |||
| 571f49ab13 | |||
| 365f1dbbe6 | |||
| 100bb06e20 | |||
| 27f662707a | |||
| 3086c72304 | |||
| eee218a3b6 | |||
| fa868077b0 | |||
| e8776177ba | |||
| 677c0592fc | |||
| 40a79fbad5 |
@@ -0,0 +1,175 @@
|
||||
# GitHub Copilot Instructions for ArcaneChat Android
|
||||
|
||||
## Project Overview
|
||||
|
||||
ArcaneChat is a Delta Chat Android client built on top of the official Delta Chat client with several improvements. It is a messenger app that uses email infrastructure for secure communication.
|
||||
|
||||
**Technology Stack:**
|
||||
- **Language:** Java (Java 8 compatibility)
|
||||
- **Build System:** Gradle with Android Gradle Plugin 8.11.1
|
||||
- **Min SDK:** 21 (Android 5.0)
|
||||
- **Target SDK:** 35 (Android 15)
|
||||
- **NDK Version:** 27.0.12077973
|
||||
- **Native Components:** Rust (deltachat-core-rust submodule)
|
||||
- **UI Framework:** Android SDK, Material Design Components
|
||||
- **Testing:** JUnit 4, Espresso, Mockito, PowerMock, AssertJ
|
||||
|
||||
## Repository Structure
|
||||
|
||||
- `src/main/` - Main application source code
|
||||
- `src/androidTest/` - Instrumented tests (UI tests, benchmarks)
|
||||
- `src/gplay/` - Google Play flavor-specific code
|
||||
- `src/foss/` - F-Droid/FOSS flavor-specific code
|
||||
- `jni/deltachat-core-rust/` - Native Rust core library (submodule)
|
||||
- `scripts/` - Build and helper scripts
|
||||
- `docs/` - Documentation
|
||||
- `fastlane/` - App store metadata and screenshots
|
||||
|
||||
## Build Instructions
|
||||
|
||||
### Prerequisites
|
||||
|
||||
1. **Initialize submodules:**
|
||||
```bash
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
2. **Build native libraries:**
|
||||
```bash
|
||||
scripts/ndk-make.sh
|
||||
```
|
||||
Note: First run may take significant time as it builds for all architectures (armeabi-v7a, arm64-v8a, x86, x86_64)
|
||||
|
||||
3. **Build APK:**
|
||||
```bash
|
||||
./gradlew assembleDebug
|
||||
```
|
||||
|
||||
### Build Flavors
|
||||
|
||||
- **gplay:** Google Play version with Firebase Cloud Messaging (applicationId: `com.github.arcanechat`)
|
||||
- **foss:** F-Droid version without proprietary services (applicationId: `chat.delta.lite`)
|
||||
|
||||
### Build Outputs
|
||||
|
||||
- Debug APKs: `build/outputs/apk/gplay/debug/` and `build/outputs/apk/fat/debug/`
|
||||
- Release APKs require signing configuration in `~/.gradle/gradle.properties`
|
||||
|
||||
## Testing
|
||||
|
||||
### Running Unit Tests
|
||||
|
||||
```bash
|
||||
./gradlew test
|
||||
```
|
||||
|
||||
### Running Instrumented Tests
|
||||
|
||||
1. **Disable animations** on your device/emulator:
|
||||
- Developer Options → Set "Window animation scale", "Transition animation scale", and "Animator duration scale" to 0x
|
||||
|
||||
2. **Run tests:**
|
||||
```bash
|
||||
./gradlew connectedAndroidTest
|
||||
```
|
||||
|
||||
### Online Tests
|
||||
|
||||
Some tests require real email credentials. Configure in `~/.gradle/gradle.properties`:
|
||||
```properties
|
||||
TEST_ADDR=youraccount@yourdomain.org
|
||||
TEST_MAIL_PW=yourpassword
|
||||
```
|
||||
|
||||
### UI Tests and Benchmarks
|
||||
|
||||
- Located in `src/androidTest/java/com/b44t/messenger/`
|
||||
- Test categories: `uitests/online/`, `uitests/offline/`, `uibenchmarks/`
|
||||
- Run via Android Studio: Run → Edit Configurations → Android Instrumented Test
|
||||
|
||||
## Coding Conventions
|
||||
|
||||
### General Guidelines
|
||||
|
||||
1. **Embrace existing style:** Match the coding style of the file you're editing
|
||||
2. **Minimize changes:** Don't refactor or rename in the same PR as bug fixes/features
|
||||
3. **Readable over paradigmatic:** Favor readability over strict Java patterns
|
||||
4. **Avoid premature optimization:** Keep things simple and on point
|
||||
5. **No excessive abstraction:** Avoid unnecessary factories, one-liner functions, or abstraction layers
|
||||
6. **Comments:** Only add comments if they match existing style or explain complex logic
|
||||
|
||||
### Architecture
|
||||
|
||||
- **UI/Model Separation:** Delta Chat Core (Rust) handles the model layer
|
||||
- **High-level interface:** Core provides data in UI-ready form; avoid additional transformations in UI layer
|
||||
- **Direct approach:** Prefer direct implementation over excessive class hierarchies
|
||||
|
||||
### Key Principles
|
||||
|
||||
- Work hard to avoid options and up-front choices
|
||||
- Avoid speaking about keys/encryption in primary UI
|
||||
- App must work offline and with poor network
|
||||
- Users don't read much text
|
||||
- Consistency matters
|
||||
- Primary UI should only show highly useful features
|
||||
|
||||
## Common Development Tasks
|
||||
|
||||
### Adding New Features
|
||||
|
||||
1. Consider the UX philosophy (minimal options, offline-first, simplicity)
|
||||
2. Check if core library changes are needed before implementing in UI
|
||||
3. Match existing code style in modified files
|
||||
4. Add instrumented tests for UI changes when appropriate
|
||||
5. Update relevant documentation
|
||||
|
||||
### Modifying Core Integration
|
||||
|
||||
- Core library is in `jni/deltachat-core-rust/` submodule
|
||||
- Java bindings are in `src/main/java/com/b44t/messenger/Dc*.java`
|
||||
- JSON-RPC bindings in `chat.delta.rpc.*` package (generated via dcrpcgen)
|
||||
|
||||
### Working with Translations
|
||||
|
||||
- Translations managed via Transifex (not in repository)
|
||||
- English source strings: `res/values/strings.xml`
|
||||
- Don't mix string changes with refactoring
|
||||
|
||||
### Debugging Native Code
|
||||
|
||||
Decode crash symbols:
|
||||
```bash
|
||||
$ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decoded.txt
|
||||
```
|
||||
|
||||
## WebXDC Support
|
||||
|
||||
ArcaneChat has extended WebXDC support:
|
||||
- `window.webxdc.arcanechat` - Version detection
|
||||
- `sendToChat()` - Extra properties: `subject`, `html`, `type` (sticker/image/audio/video/file)
|
||||
- External link support in apps
|
||||
- `manifest.toml` - `orientation` field for landscape mode
|
||||
|
||||
## Important Files
|
||||
|
||||
- `build.gradle` - Main build configuration
|
||||
- `CONTRIBUTING.md` - Contribution guidelines
|
||||
- `BUILDING.md` - Detailed build setup
|
||||
- `RELEASE.md` - Release process
|
||||
- `proguard-rules.pro` - ProGuard configuration
|
||||
- `google-services.json` - Firebase configuration (gplay flavor)
|
||||
|
||||
## Package Structure
|
||||
|
||||
- `org.thoughtcrime.securesms.*` - Main UI components (legacy namespace from Signal)
|
||||
- `com.b44t.messenger.*` - Delta Chat core integration
|
||||
- `chat.delta.rpc.*` - JSON-RPC bindings (generated)
|
||||
|
||||
## Notes for AI Assistants
|
||||
|
||||
- This is a fork of Delta Chat Android with ArcaneChat-specific improvements
|
||||
- Maintain compatibility with Delta Chat core library
|
||||
- Test on both gplay and foss flavors when making changes
|
||||
- Native library must be rebuilt after core changes
|
||||
- ProGuard is enabled in both debug and release builds
|
||||
- Multi-dex is enabled due to app size
|
||||
@@ -7,7 +7,7 @@ on:
|
||||
jobs:
|
||||
artifacts-url-comments:
|
||||
name: add artifact links to pull request
|
||||
runs-on: windows-2019
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
||||
steps:
|
||||
- name: add artifact links to pull request
|
||||
|
||||
@@ -2,16 +2,16 @@ name: Upload Preview APK
|
||||
|
||||
on: pull_request
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Upload Preview APK
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Cancel Previous Runs
|
||||
uses: styfle/cancel-workflow-action@0.9.1
|
||||
with:
|
||||
access_token: ${{ github.token }}
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Validate Fastlane Metadata
|
||||
@@ -19,12 +19,12 @@ jobs:
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
working-directory: jni/deltachat-core-rust
|
||||
- uses: actions/setup-java@v3
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'temurin'
|
||||
- uses: android-actions/setup-android@v3
|
||||
- uses: actions/cache@v3
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
@@ -37,6 +37,9 @@ jobs:
|
||||
with:
|
||||
ndk-version: r27
|
||||
|
||||
- name: Validate Gradle Wrapper
|
||||
uses: gradle/actions/wrapper-validation@v4
|
||||
|
||||
- name: Compile core
|
||||
env:
|
||||
ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }}
|
||||
@@ -44,9 +47,6 @@ jobs:
|
||||
export PATH="${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/"
|
||||
scripts/install-toolchains.sh && scripts/ndk-make.sh armeabi-v7a
|
||||
|
||||
- name: Validate Gradle Wrapper
|
||||
uses: gradle/wrapper-validation-action@v1
|
||||
|
||||
- name: Build APK
|
||||
run: ./gradlew --no-daemon -PABI_FILTER=armeabi-v7a assembleFossDebug
|
||||
|
||||
|
||||
@@ -59,12 +59,27 @@ jobs:
|
||||
rm build/outputs/apk/foss/release/*universal*
|
||||
./gradlew assembleGplayRelease
|
||||
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
|
||||
- name: Release on GitHub
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
|
||||
prerelease: ${{ contains(github.event.ref, '-beta') }}
|
||||
fail_on_unmatched_files: true
|
||||
files: build/outputs/apk/foss/release/*.apk
|
||||
files: |
|
||||
build/outputs/apk/foss/release/*.apk
|
||||
build/outputs/mapping/fossRelease/mapping-*.txt
|
||||
|
||||
- name: Release on ZapStore
|
||||
run: |
|
||||
export CHECKSUM=6e2c7cf6da53c3f1a78b523a6aacd6316dce3d74ace6f859c2676729ee439990
|
||||
curl -sL https://cdn.zapstore.dev/$CHECKSUM -o zapstore
|
||||
if echo "$CHECKSUM zapstore" | sha256sum -c --status; then
|
||||
chmod +x zapstore
|
||||
SIGN_WITH=${{ secrets.NOSTR_KEY }} ./zapstore publish --indexer-mode
|
||||
else
|
||||
echo "ERROR: checksum doesn't match!"
|
||||
fi
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
# Building and Testing
|
||||
|
||||
This document describes how to set up the build environment,
|
||||
build and test the app. Before diving into developing, please
|
||||
first read [CONTRIBUTING.md](./CONTRIBUTING.md) for general
|
||||
contribution hints and conventions.
|
||||
|
||||
Please follow all steps precisely.
|
||||
If you run into troubles,
|
||||
ask on one of the [communication channels](https://delta.chat/contribute) for help
|
||||
|
||||
|
||||
## Check Out Repository
|
||||
|
||||
When checking out _deltachat-android_, make sure also to check out the
|
||||
subproject _deltachat-core-rust_:
|
||||
|
||||
- When using Git, you can do this initially by
|
||||
`$ git clone --recursive https://github.com/deltachat/deltachat-android`
|
||||
or later by `git submodule update --init --recursive`. If you do this in your
|
||||
home directory, this results in the folder `~/deltachat-android` which is just fine.
|
||||
|
||||
## Generate JSON-RPC bindings
|
||||
|
||||
To generate/update the JSON-RPC bindings (ex. `chat.delta.rpc.*` package)
|
||||
install Rust tooling (read sections below) and the [dcrpcgen tool](https://github.com/chatmail/dcrpcgen)
|
||||
then generate the code running the script:
|
||||
|
||||
```
|
||||
./scripts/generate-rpc-bindings.sh
|
||||
```
|
||||
|
||||
## Build Using Nix
|
||||
|
||||
The repository contains [Nix](https://nixos.org/) development environment
|
||||
described in `flake.nix` file.
|
||||
If you don't have Nix installed,
|
||||
the easiest way is to follow the [Lix installation instructions](https://lix.systems/install/)
|
||||
as this results in a setup with [Flakes](https://nixos.wiki/wiki/Flakes) feature enabled out of the box
|
||||
and can be cleanly uninstalled with `/nix/nix-installer uninstall` once you don't need it anymore.
|
||||
|
||||
Once you have Nix with Flakes feature set up start the development environment shell:
|
||||
```
|
||||
nix develop
|
||||
```
|
||||
Nix development environment contains Rust with cross-compilation toolchains and Android SDK.
|
||||
|
||||
To [build an APK](https://developer.android.com/studio/build/building-cmdline) run the following 2 steps.
|
||||
Note that the first step may take some time to build for all architectures. You can optionally read
|
||||
[the first comment block in the `ndk-make.sh` script](https://github.com/deltachat/deltachat-android/blob/master/scripts/ndk-make.sh)
|
||||
for pointers on how to build for a specific architecture.
|
||||
```
|
||||
$ scripts/ndk-make.sh
|
||||
$ ./gradlew assembleDebug
|
||||
```
|
||||
|
||||
Resulting APK files can be found in
|
||||
`build/outputs/apk/gplay/debug/` and
|
||||
`build/outputs/apk/fat/debug/`.
|
||||
|
||||
## Build Using Dockerfile
|
||||
|
||||
Another way to build APK is to use provided `Dockerfile`
|
||||
with [Docker](https://www.docker.com/) or [Podman](https://podman.io/).
|
||||
Podman is a drop-in replacement for Docker that does not require root privileges.
|
||||
|
||||
If you don't have Docker or Podman setup yet, read [how to setup Podman](#setup-podman)
|
||||
below. If you don't want to use Docker or Podman, read [how to manually install the
|
||||
build environment](#install-build-environment).
|
||||
|
||||
First, build the image `deltachat-android` by running
|
||||
```
|
||||
podman build --build-arg UID=$(id -u) --build-arg GID=$(id -g) . -t deltachat-android
|
||||
```
|
||||
or
|
||||
```
|
||||
docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) . -t deltachat-android
|
||||
```
|
||||
|
||||
Then, run the image:
|
||||
```
|
||||
podman run --userns=keep-id -it --name deltachat -v $(pwd):/home/app:z -w /home/app localhost/deltachat-android
|
||||
```
|
||||
or
|
||||
```
|
||||
docker run -it --name deltachat -v $(pwd):/home/app:z -w /home/app localhost/deltachat-android
|
||||
```
|
||||
|
||||
You can leave the container with Ctrl+D or by typing `exit` and re-enter it with
|
||||
`docker start -ia deltachat` or `podman start -ia deltachat`.
|
||||
|
||||
Within the container, install toolchains and build the native library:
|
||||
```
|
||||
deltachat@6012dcb974fe:/home/app$ scripts/install-toolchains.sh
|
||||
deltachat@6012dcb974fe:/home/app$ scripts/ndk-make.sh
|
||||
```
|
||||
|
||||
Then, [build an APK](https://developer.android.com/studio/build/building-cmdline):
|
||||
```
|
||||
deltachat@6012dcb974fe:/home/app$ ./gradlew assembleDebug
|
||||
```
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
- Executing `./gradlew assembleDebug` inside the container fails with `The SDK directory '/home/user/Android/Sdk' does not exist.`:
|
||||
|
||||
The problem is that Android Studio (outside the container) automatically creates a file `local.properties` with a content like `sdk.dir=/home/username/Android/Sdk`,
|
||||
so, Gradle-inside-the-container looks for the Sdk at `/home/username/Android/Sdk`, where it can't find it.
|
||||
You could:
|
||||
- either: remove the file or just the line starting with `sdk.dir`
|
||||
- or: run `./gradlew assembleDebug` from outside the container (however, there may be incompatibility issues if different versions are installed inside and outside the container)
|
||||
|
||||
- Running the image fails with `ERRO[0000] The storage 'driver' option must be set in /etc/containers/storage.conf, guarantee proper operation.`:
|
||||
|
||||
In /etc/containers/storage.conf, replace the line: `driver = ""` with: `driver = "overlay"`.
|
||||
You can also set the `driver` option to something else, you just need to set it to _something_.
|
||||
[Read about possible options here](https://github.com/containers/storage/blob/master/docs/containers-storage.conf.5.md#storage-table).
|
||||
|
||||
## <a name="setup-podman"></a>Setup Podman
|
||||
|
||||
These instructions were only tested on a Manjaro machine so far. If anything doesn't work, please open an issue.
|
||||
|
||||
First, [Install Podman](https://podman.io/getting-started/installation).
|
||||
|
||||
Then, if you want to run Podman without root, run:
|
||||
```
|
||||
sudo touch /etc/subgid
|
||||
sudo touch /etc/subuid
|
||||
sudo usermod --add-subuids 165536-231072 --add-subgids 165536-231072 yourusername
|
||||
```
|
||||
(replace `yourusername` with your username).
|
||||
See https://wiki.archlinux.org/index.php/Podman#Rootless_Podman for more information.
|
||||
|
||||
## <a name="install-build-environment"></a>Install Build Environment (without Docker or Podman)
|
||||
|
||||
To setup build environment manually:
|
||||
- _Either_, in Android Studio, go to "Tools / SDK Manager / SDK Tools", enable "Show Package Details",
|
||||
select "CMake" and the desired NDK (install the same NDK version as the [Dockerfile](https://github.com/deltachat/deltachat-android/blob/master/Dockerfile)), hit "Apply".
|
||||
- _Or_ read [Dockerfile](https://github.com/deltachat/deltachat-android/blob/master/Dockerfile) and mimic what it does.
|
||||
|
||||
Then, in both cases, install Rust using [rustup](https://rustup.rs/)
|
||||
and Rust toolchains for cross-compilation by executing `scripts/install-toolchains.sh`.
|
||||
|
||||
Then, configure `ANDROID_NDK_ROOT` environment variable to point to the Android NDK
|
||||
installation directory e.g. by adding this to your `.bashrc`:
|
||||
|
||||
```bash
|
||||
export ANDROID_NDK_ROOT=${HOME}/Android/Sdk/ndk/[version] # (or wherever your NDK is) Note that there is no `/` at the end!
|
||||
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
|
||||
```
|
||||
|
||||
After that, call `scripts/ndk-make.sh` in the root directory to build core-rust.
|
||||
Afterwards run the project in Android Studio. The project requires API 25.
|
||||
|
||||
With chance, that's it :) - if not, read on how to set up a proper development
|
||||
environment.
|
||||
|
||||
|
||||
## Install Development Environment
|
||||
|
||||
1. Some libs required by Android Studio may be missing on 64 bit Linux machines
|
||||
[Source](https://developer.android.com/studio/install.html)], so for Ubuntu execute
|
||||
`$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386`
|
||||
and for Fedora execute
|
||||
`$ sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686`.
|
||||
|
||||
2. Download Android Studio from <https://developer.android.com> (android-studio-ide-...-linux.zip)
|
||||
and unpack the archive which contains a single folder called `android-studio`;
|
||||
move this folder e.g. to `~/android-studio`.
|
||||
|
||||
3. To launch Android Studio for the first time, open a terminal, navigate to
|
||||
`~/android-studio/bin`, execute `./studio.sh` and use all the standard values
|
||||
from the wizard.
|
||||
|
||||
4. Android Studio now asks you if you want to open an existing project;
|
||||
choose `~/deltachat-android` as created in the "Build" chapter (Android Studio starts to
|
||||
build the project, however, there are some steps missing before this will
|
||||
succeed).
|
||||
|
||||
5. If components are missing, click on the corresponding error
|
||||
message and install eg. required SDKs and the "Build-Tools" (you should
|
||||
also find the option at "Tools / Android / SDK Manager / SDK Platforms").
|
||||
Now the build should succeed - but the app still misses the native part.
|
||||
|
||||
6. Download Android NDK from
|
||||
[NDK Archives](https://developer.android.com/ndk/downloads)
|
||||
and extract the archive containing a single folder
|
||||
called something like `android-ndk-r23b-linux`; move this folder e.g. to `~/android-ndk`.
|
||||
|
||||
7. Export the folder path to your environment as `ANDROID_NDK_ROOT` and add it to `PATH`.
|
||||
You can achieve this e.g. by adding this to your `.bashrc`
|
||||
```bash
|
||||
export ANDROID_NDK_ROOT=${HOME}/android-ndk
|
||||
export PATH=${PATH}:${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64/bin/:${ANDROID_NDK_ROOT}
|
||||
```
|
||||
|
||||
## Run UI Tests and Benchmarks
|
||||
|
||||
- You don't necessarily need a dedicated testing device.
|
||||
Backup your current account first, maybe there are some bugs in switching accounts.
|
||||
|
||||
- You can run benchmarks on either an emulated device or a real device.
|
||||
You need at least Android 9. For better benchmark results,
|
||||
you should run the benchmark on a real device and make sure that the core is compiled in release mode.
|
||||
|
||||
- Disable animations on your device, otherwise the test may fail:
|
||||
at "Developer options"
|
||||
set all of "Window animation scale", "Transition animation scale" and "Animator duration scale" to 0x
|
||||
|
||||
- In Android Studio: "File" / "Sync project with gradle files"
|
||||
|
||||
- In Android Studio: "Run" / "Edit configurations" / "+" / "Android Instrumented test":
|
||||
Either select a specific class or select "All in Module" / "OK" /
|
||||
Select your configuration in the toolbar / Click on the green "run" button in the toolbar to run the tests
|
||||
|
||||
### Get the benchmark results
|
||||
|
||||
When the benchmark is done, you will get a result like
|
||||
`MEASURED RESULTS (Benchmark) - Going thorough all 10 chats: 11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`.
|
||||
You can paste `11635,11207,11363,11352,11279,11183,11137,11145,11032,11057`
|
||||
into a cell in a LibreOffice spreadsheet, do "Data" / "Text to columns",
|
||||
choose `,` as a separator, hit "OK", and create a diagram.
|
||||
|
||||
### Run online tests
|
||||
|
||||
For some tests, you need to provide the credentials to an actual email account.
|
||||
You have 2 ways to do this:
|
||||
|
||||
1. (Recommended): Put them into the file ~/.gradle/gradle.properties (create it if it doesn't exist):
|
||||
```
|
||||
TEST_ADDR=youraccount@yourdomain.org
|
||||
TEST_MAIL_PW=youpassword
|
||||
```
|
||||
|
||||
2. Or set them via environment variables.
|
||||
|
||||
## Decoding Symbols in Crash Reports
|
||||
|
||||
```
|
||||
$ANDROID_NDK_ROOT/ndk-stack --sym obj/local/armeabi-v7a --dump crash.txt > decoded.txt
|
||||
```
|
||||
|
||||
`obj/local/armeabi-v7a` is the extracted path from `deltachat-gplay-release-X.X.X.apk-symbols.zip` file from https://download.delta.chat/android/symbols/
|
||||
|
||||
Replace `armeabi-v7a` by the correct architecture the logs come from (can be guessed by trial and error)
|
||||
@@ -1,15 +1,127 @@
|
||||
# Delta Chat Android Changelog
|
||||
|
||||
## Unreleased
|
||||
|
||||
* 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
|
||||
* Update to core 2.36.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
|
||||
2025-12
|
||||
|
||||
* Target Android 16
|
||||
* Change color of links in text messages
|
||||
* Improve edge-to-edge support
|
||||
* Add the option (opt-in) to send anonymous statistics to Delta Chat's developers
|
||||
* Metadata protection: protect message recipients
|
||||
* Allow to withdraw channel invite links and QR codes
|
||||
* Allow to open externally links clicked inside in-chat apps
|
||||
* Do not show "1 member" when the process of joining the group is not finished
|
||||
* Make search case-insensitive for non-ASCII chat and contact names
|
||||
* Improve handling of video recoding
|
||||
* Send .webm videos as file, they are not supported by all platforms
|
||||
* Tweak advanced section and wording of some advanced options
|
||||
* Fix: avoid crash in push notifications handling
|
||||
* Fix: avoid freezing in background
|
||||
* Fix: clean up web storage of deleted in-chat apps
|
||||
* Fix: avoid crash when exporting some files with wrong image MIME type
|
||||
* Expose new "Multi-device mode" option instead of "Delete from server" for chatmail profiles
|
||||
* Opened in-chat apps got a 'About Apps' menu item
|
||||
* Avoid gray avatar on profile creation
|
||||
* Avoid last item in chat list being covered by the floating button
|
||||
* Add disk usage statistics to log
|
||||
* New experimental feature: several addresses per profile
|
||||
* Update to core 2.33.0
|
||||
|
||||
## v2.25.0
|
||||
2025-11
|
||||
|
||||
* Make it possible to invite members into a channel via a QR code,
|
||||
and make channels more secure
|
||||
* metadata protection: protect Date header
|
||||
* metadata protection: protect Autocrypt header
|
||||
* better multi-device: synchronize group creation across devices
|
||||
* data saving: do not send Autocrypt header in read receipts
|
||||
* improve onboarding speed
|
||||
* allow to save to storage files shared from inside in-chat apps
|
||||
* reduce app size
|
||||
* don't show badge counter in app icon for the permanent background notification
|
||||
* fix sorting of old media in gallery
|
||||
* fix text direction in "x members" subtitle for RTL languages
|
||||
* fix group invite QR screen's layout
|
||||
* tweak text hints in advanced classic e-mail configuration
|
||||
* remove deprecated "companion app" code
|
||||
* remove deprecated "Watch Sent Folder" preference
|
||||
* remove deprecated "send self-report" preference
|
||||
* don't show email address in shared vcard
|
||||
* update to core 2.25.0
|
||||
|
||||
## v2.22.0
|
||||
2025-10
|
||||
|
||||
* target Android 15
|
||||
* improve readability of info messages in dark mode
|
||||
* drop too short disappearing messages options
|
||||
* fix Direct Share shortcuts
|
||||
* fix: don't show error message when cancelling profile creation
|
||||
* enable permanent notification by default if push notifications are not available
|
||||
* hide "clone chat" and member list for incoming channels
|
||||
* show warning if background notifications will be unreliable
|
||||
* warn if the app has not been updated after 6 months instead of 1 year
|
||||
* avoid "unknown sender for this chat" error
|
||||
* properly display "Messages are end-to-end encrypted." in all encrypted groups
|
||||
* show dialog if user has permanently denied camera permission and tries to take picture for group avatar
|
||||
* several small fixes and improvements
|
||||
* add experimental built-in calls
|
||||
* update to core 2.22.0
|
||||
|
||||
## v2.11.0
|
||||
2025-08
|
||||
|
||||
* add "After 1 year" option to disappearing messages
|
||||
* improve image quality when setting group avatars
|
||||
* add Estonian translation, update other translations
|
||||
* allow to clone email chats
|
||||
* fix some small bugs
|
||||
* update to core 2.11.0
|
||||
|
||||
## v2.10.0
|
||||
2025-08
|
||||
|
||||
* fix "Archived" item's layout in chat-list
|
||||
* don't enlarge "Saved Messages" and "Devices Messages" avatars on click
|
||||
* share email address for email contacts instead of vCard
|
||||
* open existing encrypted chat when opening a mailto link or clicking an email address in a message bubble
|
||||
* update to core 2.10.0
|
||||
|
||||
## v2.9.0
|
||||
2025-07
|
||||
|
||||
* hide contact email addresses in search results
|
||||
* disable non-functional message editing and ephemeral messages timer settings in classic email thread chat
|
||||
* don't enlage email chats avatar placeholder
|
||||
* don't enlarge email chats avatar placeholder
|
||||
* improve message date/status footer layout, also in RTL languages
|
||||
* display correct text when receiving a "Disapearing messages enabled" system message
|
||||
* display correct text when receiving a "Disappearing messages enabled" system message
|
||||
* Update to core 2.9.0
|
||||
|
||||
## v2.8.0
|
||||
2025-07
|
||||
|
||||
* Profiles focus on recognizing contacts
|
||||
* See the number of media directly in the profile, no need to tap around
|
||||
@@ -21,7 +133,7 @@
|
||||
* New icon for the QR icon
|
||||
* Start rebuilding the experimental broadcast lists
|
||||
into proper channels - note that this is work-in-progress
|
||||
* Improved separation between unencryted chats/contacts and encrypted ones, avoiding mixing of encrypted and unencrypted messages in the same chat
|
||||
* Improved separation between unencrypted chats/contacts and encrypted ones, avoiding mixing of encrypted and unencrypted messages in the same chat
|
||||
* Removed padlocks, as encrypted is the default "normal" state. Instead, unencrypted email is marked with a small email / letter (✉️) icon
|
||||
* Classic email chats/threads get a big email / letter icon making it easy to recognize
|
||||
* After some time, add a device message asking to donate. Can't wait? Donate today at https://delta.chat/donate
|
||||
|
||||
@@ -45,7 +45,7 @@ Some rough ideas, that may be helpful when thinking about how to enhance things:
|
||||
|
||||
## Contributing Code
|
||||
|
||||
The [README](./README.md) explains in detail how to set up the build environment.
|
||||
The [BUILDING.md](./BUILDING.md) file explains in detail how to set up the build environment.
|
||||
Please follow all steps precisely.
|
||||
If you run into troubles,
|
||||
ask on one of the [communication channels](https://delta.chat/contribute) for help.
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
## Generate APKs
|
||||
|
||||
### Update core and translations
|
||||
|
||||
on the command-line, in a PR called "update-core-and-stuff-DATE":
|
||||
|
||||
1. update core:
|
||||
@@ -21,12 +23,19 @@ a) Update `CHANGELOG.md`
|
||||
as `update to core 1.2.3` or `using core 1.2.3`
|
||||
|
||||
|
||||
2. update translations and local help:
|
||||
2. update JSON-RPC bindings:
|
||||
```
|
||||
./scripts/update-rpc-bindings.sh
|
||||
```
|
||||
|
||||
3. update translations and local help:
|
||||
```
|
||||
./scripts/tx-pull-translations.sh
|
||||
./scripts/create-local-help.sh # requires deltachat-pages checked out at ../deltachat-pages
|
||||
```
|
||||
|
||||
### Prepare release
|
||||
|
||||
the following steps are done in a PR called `prep-VERSION` (no leading "v"):
|
||||
|
||||
3. Update `CHANGELOG.md`:
|
||||
@@ -109,17 +118,6 @@ This may take some days.
|
||||
c) tap "Publish release"
|
||||
|
||||
|
||||
## Release on Amazon Appstore
|
||||
|
||||
on <https://developer.amazon.com/dashboard>:
|
||||
|
||||
12. a) click "App List", for "Delta Chat", select "Add upcoming version" on the left
|
||||
b) at "Step 1 / Existing file(s)" hit "Replace", upload the APK from above
|
||||
c) on the "Step 1" page, add "Release notes" from CHANGELOG.md, hit "Next"
|
||||
d) on "Step 2" and "Step 3" pages, hit "Next"
|
||||
e) on "Step 4" page: "Submit app"
|
||||
|
||||
|
||||
## Release on Huawei AppGallery
|
||||
|
||||
on <https://developer.huawei.com/consumer/en/appgallery>:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id 'com.android.application' version '8.5.2'
|
||||
id 'com.android.application' version '8.11.1'
|
||||
id 'com.google.gms.google-services' version '4.4.1'
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ android {
|
||||
}
|
||||
namespace "org.thoughtcrime.securesms"
|
||||
flavorDimensions "none"
|
||||
compileSdk 34
|
||||
compileSdk 36
|
||||
|
||||
// Set NDK version to strip native libraries.
|
||||
// Even though we compile our libraries outside Gradle with `scripts/ndk-make.sh`,
|
||||
@@ -33,14 +33,14 @@ android {
|
||||
useLibrary 'org.apache.http.legacy'
|
||||
|
||||
defaultConfig {
|
||||
versionCode 30000727
|
||||
versionName "2.9.0"
|
||||
versionCode 30000736
|
||||
versionName "2.36.0"
|
||||
|
||||
applicationId "chat.delta.lite"
|
||||
multiDexEnabled true
|
||||
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 34
|
||||
targetSdkVersion 36
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
|
||||
@@ -130,7 +130,9 @@ android {
|
||||
|
||||
buildTypes {
|
||||
debug {
|
||||
minifyEnabled false
|
||||
minifyEnabled true
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
testProguardFiles 'test-proguard-rules.pro'
|
||||
applicationIdSuffix ".beta"
|
||||
}
|
||||
release {
|
||||
@@ -144,9 +146,10 @@ android {
|
||||
// nb: it is highly recommended to use the same settings in debug+release -
|
||||
// otherwise problems might be noticed delayed only
|
||||
minifyEnabled true
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
testProguardFiles 'test-proguard-rules.pro'
|
||||
productFlavors.foss.signingConfig signingConfigs.releaseFdroid
|
||||
productFlavors.gplay.signingConfig signingConfigs.releaseApk
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,10 +211,11 @@ dependencies {
|
||||
implementation "io.noties.markwon:inline-parser:$markwon_version"
|
||||
implementation 'com.airbnb.android:lottie:4.2.2' // Lottie animations support.
|
||||
|
||||
implementation 'androidx.concurrent:concurrent-futures:1.3.0'
|
||||
implementation 'androidx.sharetarget:sharetarget:1.2.0'
|
||||
implementation 'androidx.webkit:webkit:1.12.1'
|
||||
implementation 'androidx.webkit:webkit:1.14.0'
|
||||
implementation 'androidx.multidex:multidex:2.0.1'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.1'
|
||||
implementation 'com.google.android.material:material:1.12.0'
|
||||
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
|
||||
implementation ('androidx.preference:preference:1.2.1') {
|
||||
@@ -219,7 +223,7 @@ dependencies {
|
||||
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel-ktx'
|
||||
}
|
||||
implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
|
||||
implementation 'androidx.exifinterface:exifinterface:1.3.7'
|
||||
implementation 'androidx.exifinterface:exifinterface:1.4.1'
|
||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
|
||||
implementation 'androidx.lifecycle:lifecycle-common-java8:2.6.2'
|
||||
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.2'
|
||||
@@ -233,52 +237,46 @@ dependencies {
|
||||
implementation 'com.google.zxing:core:3.3.0' // fixed version to support SDK<24
|
||||
implementation ('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } // QR Code scanner
|
||||
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' // used as JSON library
|
||||
implementation 'com.google.code.gson:gson:2.12.1' // used as JSON library.
|
||||
implementation "me.leolin:ShortcutBadger:1.1.16" // display messagecount on the home screen icon.
|
||||
implementation 'com.jpardogo.materialtabstrip:library:1.0.9' // used in the emoji selector for the tab selection.
|
||||
implementation 'com.github.Baseflow:PhotoView:2.3.0' // does the zooming on photos / media
|
||||
implementation 'com.github.penfeizhou.android.animation:awebp:3.0.2' // animated webp support.
|
||||
implementation 'com.caverock:androidsvg-aar:1.4' // SVG support.
|
||||
implementation 'com.github.bumptech.glide:glide:4.12.0'
|
||||
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
|
||||
implementation 'com.github.bumptech.glide:glide:4.16.0'
|
||||
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
|
||||
annotationProcessor 'androidx.annotation:annotation:1.9.1'
|
||||
implementation 'com.makeramen:roundedimageview:2.1.0' // crops the avatars to circles
|
||||
implementation 'com.pnikosis:materialish-progress:1.5' // used only in the "Progress Wheel" in Share Activity.
|
||||
implementation 'com.makeramen:roundedimageview:2.3.0' // crops the avatars to circles
|
||||
implementation 'com.github.amulyakhare:TextDrawable:558677ea31' // number of unread messages,
|
||||
// the one-letter circle for the contacts (when there is not avatar) and a white background.
|
||||
implementation 'com.googlecode.mp4parser:isoparser:1.0.6' // MP4 recoding; upgrading eg. to 1.1.22 breaks recoding, however, i have not investigated further, just reset to 1.0.6
|
||||
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.6.0') { // for the zooming on photos / media
|
||||
implementation ('com.davemorrissey.labs:subsampling-scale-image-view:3.10.0') { // for the zooming on photos / media
|
||||
exclude group: 'com.android.support', module: 'support-annotations'
|
||||
}
|
||||
implementation 'com.annimon:stream:1.1.8' // brings future java streams api to SDK Version < 24
|
||||
|
||||
// Replacement for ContentResolver
|
||||
// that protects against the Surreptitious Sharing attack.
|
||||
// <https://github.com/cketti/SafeContentResolver>
|
||||
implementation 'de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0'
|
||||
|
||||
gplayImplementation('com.google.firebase:firebase-messaging:24.1.0') { // for PUSH notifications
|
||||
gplayImplementation('com.google.firebase:firebase-messaging:24.1.2') { // for PUSH notifications, don't upgrade: v25.0.0 requires minSdk>=23
|
||||
exclude group: 'com.google.firebase', module: 'firebase-core'
|
||||
exclude group: 'com.google.firebase', module: 'firebase-analytics'
|
||||
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
|
||||
}
|
||||
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.assertj:assertj-core:1.7.1'
|
||||
testImplementation 'org.mockito:mockito-core:1.9.5'
|
||||
testImplementation 'org.powermock:powermock-api-mockito:1.6.1'
|
||||
testImplementation 'org.powermock:powermock-module-junit4:1.6.1'
|
||||
testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.1'
|
||||
testImplementation 'org.powermock:powermock-classloading-xstream:1.6.1'
|
||||
testImplementation 'org.assertj:assertj-core:3.27.3'
|
||||
testImplementation 'org.mockito:mockito-core:5.18.0'
|
||||
testImplementation 'org.powermock:powermock-api-mockito:1.7.4'
|
||||
testImplementation 'org.powermock:powermock-module-junit4:2.0.9'
|
||||
testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.9'
|
||||
testImplementation 'org.powermock:powermock-classloading-xstream:2.0.9'
|
||||
|
||||
androidTestImplementation 'androidx.test:runner:1.6.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.6.1'
|
||||
androidTestImplementation 'androidx.test:rules:1.6.1'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
|
||||
androidTestImplementation 'androidx.test:runner:1.7.0'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.7.0'
|
||||
androidTestImplementation 'androidx.test:rules:1.7.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
|
||||
androidTestImplementation 'com.android.support:support-annotations:28.0.0'
|
||||
|
||||
androidTestImplementation ('org.assertj:assertj-core:1.7.1') {
|
||||
androidTestImplementation ('org.assertj:assertj-core:3.27.3') {
|
||||
exclude group: 'org.hamcrest', module: 'hamcrest-core'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,17 +23,14 @@ ArcaneChat is a Delta Chat client and was created with a focus on usability, goo
|
||||
<li>Multiple color themes/skins</li>
|
||||
<li>It is possible to disable profiles to completely disconnect them saving data/bandwidth</li>
|
||||
<li>You can easily see the connection status of all your profiles in the profile switcher</li>
|
||||
<li>A videochat instance is set by default</li>
|
||||
<li>Extra option to share location for 12 hours</li>
|
||||
<li>Clicking on a message with a POI location, will open the POI on the map</li>
|
||||
<li>Last-seen status of contacts is shown in your contact list, like in WhatsApp, Telegram, etc.</li>
|
||||
<li>Videos are played in loop, useful for short GIF videos</li>
|
||||
<li>Verified icon is shown in the chat list for the "Device Messages" chat</li>
|
||||
<li>Verified icon is shown in the chat list for the "Device Messages" and "Saved Messages" chat to avoid fishing attempts by scammer pretending to be the official chats</li>
|
||||
<li>Voice messages have more aggressive compression in "worse quality" mode to save data plan</li>
|
||||
<li>Automatic download of messages limited to 640KB by default</li>
|
||||
<li>Profile's display name is always shown in the app's title bar instead of the name of the app</li>
|
||||
<li>Your avatar is visible to other users in Mailing Lists</li>
|
||||
<li>Can be selected as app to open .xdc files</li>
|
||||
<li>For mini-apps developers: there are some extra features in the WebXDC API, check https://github.com/ArcaneChat/android/#webxdc</li>
|
||||
<li>Better settings organization with additional "Privacy" section</li>
|
||||
</ul>
|
||||
|
||||
|
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 |
@@ -0,0 +1,36 @@
|
||||
ArcaneChat — децентрализованный и защищённый мессенджер, удобный для друзей и семьи.
|
||||
|
||||
• Анонимность. Мгновенный вход без номера телефона, e-mail или других личных данных.
|
||||
|
||||
• Гибкость. Поддерживает несколько профилей чатов и легко настраивается на нескольких устройствах.
|
||||
|
||||
• Расширяемость. В чатах можно использовать мини-приложения: списки покупок, календари или игры.
|
||||
|
||||
• Надёжность. Работает даже при плохом соединении и в сложных сетевых условиях.
|
||||
|
||||
• Безопасность. Проверенное сквозное шифрование, защищённое от сетевых и серверных атак.
|
||||
|
||||
• Самостоятельность. Может работать с вашим собственным e-mail-адресом или сервером.
|
||||
|
||||
ArcaneChat — клиент Delta Chat, разработанный с акцентом на удобство, качественный UX и экономию трафика. Также приложение часто экспериментирует с новыми функциями, которые со временем могут быть добавлены в официальный клиент Delta Chat.
|
||||
|
||||
<b>Основные отличия от официального клиента Delta Chat:</b>
|
||||
|
||||
<ul>
|
||||
<li>Поддержка некоторых стилей markdown в текстовых сообщениях (жирный, курсив, зачёркнутый и т.д.)</li>
|
||||
<li>Поддержка отображения анимированных стикеров Telegram (.tgs-файлы)</li>
|
||||
<li>Поддержка предпросмотра SVG-изображений</li>
|
||||
<li>Несколько цветовых тем/скинов</li>
|
||||
<li>Возможность отключать профили, полностью отключая им доступ в сеть для экономии трафика</li>
|
||||
<li>На панели переключения профилей видно состояние подключения каждого профиля</li>
|
||||
<li>Дополнительная опция для обмена местоположением на 12 часов</li>
|
||||
<li>Нажатие на сообщение с POI открывает его на карте</li>
|
||||
<li>Статус «был(а) в сети» отображается в списке контактов, как в WhatsApp, Telegram и т.д.</li>
|
||||
<li>Видео воспроизводятся по кругу — удобно для коротких GIF-видео</li>
|
||||
<li>У чата «Device Messages» в списке чатов отображается значок подтверждения</li>
|
||||
<li>В режиме «низкое качество» голосовые сообщения сжимаются сильнее для экономии трафика</li>
|
||||
<li>Автоматическая загрузка сообщений по умолчанию ограничена 640KB</li>
|
||||
<li>Отображаемое имя профиля всегда видно в заголовке приложения вместо названия приложения</li>
|
||||
<li>Для разработчиков мини-приложений: доступны дополнительные возможности WebXDC API, см. https://github.com/ArcaneChat/android/#webxdc</li>
|
||||
<li>Более удобная организация настроек с дополнительным разделом «Privacy»</li>
|
||||
</ul>
|
||||
@@ -0,0 +1 @@
|
||||
⚡ Быстрые зашифрованные чаты для семьи 🎉
|
||||
@@ -0,0 +1 @@
|
||||
ArcaneChat
|
||||
@@ -7,11 +7,11 @@
|
||||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1733948466,
|
||||
"narHash": "sha256-o/uq/tU458Ykudi8Zk3sRga5iazkuSczt9wDOCUDOSU=",
|
||||
"lastModified": 1756239746,
|
||||
"narHash": "sha256-0ibN685tT+u/Nbmbrrq9G3mRUzct2Votyv/a7Wwv26s=",
|
||||
"owner": "tadfisher",
|
||||
"repo": "android-nixpkgs",
|
||||
"rev": "0bf99ffaea6a7c0948ae10cf2e40c2905e4e4d6b",
|
||||
"rev": "256631d162ec883b2341ee59621516e1f65f0f6b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -28,11 +28,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1728330715,
|
||||
"narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=",
|
||||
"lastModified": 1741473158,
|
||||
"narHash": "sha256-kWNaq6wQUbUMlPgw8Y+9/9wP0F8SHkjy24/mN3UAppg=",
|
||||
"owner": "numtide",
|
||||
"repo": "devshell",
|
||||
"rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef",
|
||||
"rev": "7c9e793ebe66bcba8292989a68c0419b737a22a0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -79,11 +79,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1733759999,
|
||||
"narHash": "sha256-463SNPWmz46iLzJKRzO3Q2b0Aurff3U1n0nYItxq7jU=",
|
||||
"lastModified": 1756125398,
|
||||
"narHash": "sha256-XexyKZpf46cMiO5Vbj+dWSAXOnr285GHsMch8FBoHbc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "a73246e2eef4c6ed172979932bc80e1404ba2d56",
|
||||
"rev": "3b9f00d7a7bf68acd4c4abb9d43695afb04e03a5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -95,11 +95,11 @@
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1733749988,
|
||||
"narHash": "sha256-+5qdtgXceqhK5ZR1YbP1fAUsweBIrhL38726oIEAtDs=",
|
||||
"lastModified": 1756159630,
|
||||
"narHash": "sha256-ohMvsjtSVdT/bruXf5ClBh8ZYXRmD4krmjKrXhEvwMg=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "bc27f0fde01ce4e1bfec1ab122d72b7380278e68",
|
||||
"rev": "84c256e42600cb0fdf25763b48d28df2f25a0c8b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -138,11 +138,11 @@
|
||||
"nixpkgs": "nixpkgs_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1747017456,
|
||||
"narHash": "sha256-C/U12fcO+HEF071b5mK65lt4XtAIZyJSSJAg9hdlvTk=",
|
||||
"lastModified": 1763347184,
|
||||
"narHash": "sha256-6QH8hpCYJxifvyHEYg+Da0BotUn03BwLIvYo3JAxuqQ=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "5b07506ae89b025b14de91f697eba23b48654c52",
|
||||
"rev": "08895cce80433978d5bfd668efa41c5e24578cbd",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
pkgs = import nixpkgs { inherit system overlays; };
|
||||
android-sdk = android.sdk.${system} (sdkPkgs:
|
||||
with sdkPkgs; [
|
||||
build-tools-34-0-0
|
||||
build-tools-35-0-0
|
||||
cmdline-tools-latest
|
||||
platform-tools
|
||||
platforms-android-34
|
||||
platforms-android-36
|
||||
ndk-27-2-12479018
|
||||
]);
|
||||
rust-version = pkgs.lib.removeSuffix "\n"
|
||||
@@ -27,10 +27,11 @@
|
||||
{
|
||||
formatter = pkgs.nixpkgs-fmt;
|
||||
|
||||
devShells.default = pkgs.mkShell {
|
||||
devShells.default = pkgs.mkShell rec {
|
||||
ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk";
|
||||
ANDROID_NDK_ROOT =
|
||||
"${android-sdk}/share/android-sdk/ndk/27.2.12479018";
|
||||
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/35.0.0/aapt2";
|
||||
buildInputs = [
|
||||
android-sdk
|
||||
pkgs.openjdk17
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||
distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -231,6 +231,12 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcAccounts_backgroundFetch(JNIEnv *en
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_DcAccounts_stopBackgroundFetch(JNIEnv *env, jobject obj)
|
||||
{
|
||||
dc_accounts_stop_background_fetch(get_dc_accounts(env, obj));
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcAccounts_migrateAccount(JNIEnv *env, jobject obj, jstring dbfile)
|
||||
{
|
||||
CHAR_REF(dbfile);
|
||||
@@ -536,10 +542,10 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_createChatByContactId(JNIEnv *e
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcContext_createGroupChat(JNIEnv *env, jobject obj, jboolean verified, jstring name)
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcContext_createGroupChat(JNIEnv *env, jobject obj, jstring name)
|
||||
{
|
||||
CHAR_REF(name);
|
||||
jint ret = (jint)dc_create_group_chat(get_dc_context(env, obj), verified, namePtr);
|
||||
jint ret = (jint)dc_create_group_chat(get_dc_context(env, obj), 0, namePtr);
|
||||
CHAR_UNREF(name);
|
||||
return ret;
|
||||
}
|
||||
@@ -735,12 +741,6 @@ JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendTextMsg(JNIEnv *env, jobjec
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcContext_sendVideochatInvitation(JNIEnv *env, jobject obj, jint chat_id)
|
||||
{
|
||||
return (jint)dc_send_videochat_invitation(get_dc_context(env, obj), chat_id);
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcContext_sendWebxdcStatusUpdate(JNIEnv *env, jobject obj, jint msg_id, jstring payload)
|
||||
{
|
||||
CHAR_REF(payload);
|
||||
@@ -1267,11 +1267,6 @@ JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_canSend(JNIEnv *env, jobject o
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isProtected(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_chat_is_protected(get_dc_chat(env, obj))!=0;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcChat_isSendingLocations(JNIEnv *env, jobject obj)
|
||||
{
|
||||
@@ -1608,21 +1603,6 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getSetupCodeBegin(JNIEnv *env, j
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getVideochatUrl(JNIEnv *env, jobject obj)
|
||||
{
|
||||
char* temp = dc_msg_get_videochat_url(get_dc_msg(env, obj));
|
||||
jstring ret = JSTRING_NEW(temp);
|
||||
dc_str_unref(temp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_DcMsg_getVideochatType(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return (jint)dc_msg_get_videochat_type(get_dc_msg(env, obj));
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setSubject(JNIEnv *env, jobject obj, jstring text)
|
||||
{
|
||||
CHAR_REF(text);
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
.PHONY: apk
|
||||
apk:
|
||||
./scripts/rebrand.sh
|
||||
./gradlew --offline assembleGplayRelease
|
||||
./scripts/undo_rebrand.sh
|
||||
|
||||
.PHONY: aab
|
||||
aab:
|
||||
./scripts/rebrand.sh
|
||||
sed -i 's/signingConfigs.releaseApk/signingConfigs.releaseBundle/g' build.gradle
|
||||
./gradlew --offline bundleGplayRelease
|
||||
sed -i 's/signingConfigs.releaseBundle/signingConfigs.releaseApk/g' build.gradle
|
||||
./scripts/undo_rebrand.sh
|
||||
|
||||
.PHONY: foss
|
||||
foss:
|
||||
./scripts/rebrand.sh
|
||||
./gradlew --offline assembleFossRelease
|
||||
./scripts/undo_rebrand.sh
|
||||
|
||||
.PHONY: install
|
||||
install:
|
||||
adb -d install -r build/outputs/apk/gplay/release/*universal*.apk
|
||||
|
||||
.PHONY: emulator-install
|
||||
emulator-install:
|
||||
adb install -r build/outputs/apk/gplay/release/*universal*.apk
|
||||
|
||||
.PHONY: fetch
|
||||
fetch:
|
||||
git fetch upstream
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
./gradlew --offline clean
|
||||
|
||||
|
||||
# CORE:
|
||||
|
||||
.PHONY: fetch-core
|
||||
fetch-core:
|
||||
cd ../core && git fetch upstream
|
||||
|
||||
.PHONY: core
|
||||
core:
|
||||
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
|
||||
./scripts/ndk-make.sh; true
|
||||
./scripts/undo_rebrand.sh
|
||||
mv jni/deltachat-core-rust ../core
|
||||
mkdir jni/deltachat-core-rust
|
||||
|
||||
.PHONY: core-fast
|
||||
core-fast:
|
||||
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
|
||||
./scripts/ndk-make.sh arm64-v8a; true
|
||||
./scripts/undo_rebrand.sh
|
||||
mv jni/deltachat-core-rust ../core
|
||||
mkdir jni/deltachat-core-rust
|
||||
|
||||
.PHONY: core-v7
|
||||
core-v7:
|
||||
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
|
||||
./scripts/ndk-make.sh armeabi-v7a; true
|
||||
./scripts/undo_rebrand.sh
|
||||
mv jni/deltachat-core-rust ../core
|
||||
mkdir jni/deltachat-core-rust
|
||||
|
||||
.PHONY: core-x86
|
||||
core-x86:
|
||||
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
|
||||
./scripts/ndk-make.sh x86; true
|
||||
./scripts/undo_rebrand.sh
|
||||
mv jni/deltachat-core-rust ../core
|
||||
mkdir jni/deltachat-core-rust
|
||||
|
||||
.PHONY: link
|
||||
link:
|
||||
rmdir jni/deltachat-core-rust; mv ../core jni/deltachat-core-rust; true
|
||||
|
||||
.PHONY: unlink
|
||||
unlink:
|
||||
mv jni/deltachat-core-rust ../core
|
||||
mkdir jni/deltachat-core-rust
|
||||
@@ -1,15 +1,10 @@
|
||||
# native methods
|
||||
-keep class com.b44t.messenger.** { * ; }
|
||||
|
||||
# Gson uses generic type information stored in a class file when working with
|
||||
# fields. Proguard removes such information by default, keep it.
|
||||
-keepattributes Signature
|
||||
# This is also needed for R8 in compat mode since multiple
|
||||
# optimizations will remove the generic signature such as class
|
||||
# merging and argument removal. See:
|
||||
# https://r8.googlesource.com/r8/+/refs/heads/main/compatibility-faq.md#troubleshooting-gson-gson
|
||||
-keep class com.google.gson.reflect.TypeToken { *; }
|
||||
-keep class * extends com.google.gson.reflect.TypeToken
|
||||
# Keep metadata needed by the JSON parser
|
||||
-keep class chat.delta.rpc.** { * ; }
|
||||
-keepattributes *Annotation*,EnclosingMethod,Signature
|
||||
-keepnames class com.fasterxml.jackson.** { *; }
|
||||
|
||||
# bug with video recoder
|
||||
-keep class com.coremedia.iso.** { *; }
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
rm src/main/assets/help/*.png
|
||||
../deltachat-pages/tools/create-local-help.py ../deltachat-pages/result src/main/assets/help
|
||||
|
||||
@@ -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/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/❤️/💜/g'
|
||||
|
||||
@@ -1 +1 @@
|
||||
1.86.0
|
||||
1.91.1
|
||||
|
||||
@@ -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/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/💜/❤️/g'
|
||||
|
||||
# don't revert the app name
|
||||
sed -i 's/>Delta Chat</>ArcaneChat</g' ./src/main/res/values/strings.xml
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
# you need to have dcrpcgen
|
||||
|
||||
# generate schema.json
|
||||
ROOT_DIR=$PWD
|
||||
cd ./jni/deltachat-core-rust/deltachat-rpc-server
|
||||
cargo run -- --openrpc > "$ROOT_DIR/schema.json"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
# generate code
|
||||
dcrpcgen java --schema schema.json -o ./src/main/java/
|
||||
@@ -54,7 +54,7 @@ public class ForwardingTest {
|
||||
// The thing is, DC_STATE_OUT_PENDING show a rotating circle animation, and Espresso doesn't work
|
||||
// with animations, and the tests would hang and never finish.
|
||||
dcContext.setConfig("bcc_self", "0");
|
||||
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat(false, "group"));
|
||||
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat( "group"));
|
||||
}
|
||||
|
||||
@After
|
||||
|
||||
@@ -52,7 +52,7 @@ public class SharingTest {
|
||||
|
||||
@Before
|
||||
public void createGroup() {
|
||||
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat(false, "group"));
|
||||
activityRule.getScenario().onActivity(a -> createdGroupId = DcHelper.getContext(a).createGroupChat( "group"));
|
||||
}
|
||||
|
||||
@Before
|
||||
|
||||
@@ -41,7 +41,7 @@ public class OnboardingTest {
|
||||
}
|
||||
onView(withText(R.string.scan_invitation_code)).check(matches(isClickable()));
|
||||
onView(withText(R.string.import_backup_title)).check(matches(isClickable()));
|
||||
onView(withText(R.string.login_header)).perform(click());
|
||||
onView(withText(R.string.manual_account_setup_option)).perform(click());
|
||||
onView(withHint(R.string.email_address)).perform(replaceText(BuildConfig.TEST_ADDR));
|
||||
onView(withHint(R.string.existing_password)).perform(replaceText(BuildConfig.TEST_MAIL_PW));
|
||||
onView(withContentDescription(R.string.ok)).perform(click());
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||
|
||||
<application>
|
||||
<service
|
||||
android:name=".connect.KeepAliveService"
|
||||
android:foregroundServiceType="specialUse"
|
||||
android:enabled="true" />
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -10,6 +10,11 @@
|
||||
<meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" />
|
||||
|
||||
<application>
|
||||
<service
|
||||
android:name=".connect.KeepAliveService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
android:enabled="true" />
|
||||
|
||||
<service
|
||||
android:name=".notifications.FcmReceiveService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
|
||||
@@ -62,7 +62,7 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
||||
|
||||
prefixedToken = addPrefix(rawToken);
|
||||
Log.i(TAG, "FCM token: " + prefixedToken);
|
||||
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
|
||||
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
|
||||
triedRegistering = true;
|
||||
});
|
||||
}
|
||||
@@ -91,7 +91,19 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
||||
@Override
|
||||
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
|
||||
Log.i(TAG, "FCM push notification received");
|
||||
FetchForegroundService.start(this);
|
||||
// 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);
|
||||
} else {
|
||||
FetchForegroundService.fetchSynchronously();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -104,6 +116,6 @@ public class FcmReceiveService extends FirebaseMessagingService {
|
||||
public void onNewToken(@NonNull String rawToken) {
|
||||
prefixedToken = addPrefix(rawToken);
|
||||
Log.i(TAG, "new FCM token: " + prefixedToken);
|
||||
ApplicationContext.dcAccounts.setPushDeviceToken(prefixedToken);
|
||||
ApplicationContext.getDcAccounts().setPushDeviceToken(prefixedToken);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
|
||||
|
||||
<!-- dangerous permissions - we need to as the user with a PermissionsRequest -->
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
|
||||
@@ -55,6 +54,7 @@
|
||||
android:requestLegacyExternalStorage="true"
|
||||
tools:targetApi="TIRAMISU"
|
||||
android:hasFragileUserData="true"
|
||||
android:enableOnBackInvokedCallback="false"
|
||||
>
|
||||
|
||||
<!-- android car support, see https://developer.android.com/training/auto/start/,
|
||||
@@ -208,16 +208,7 @@
|
||||
<activity android:name=".NewConversationActivity"
|
||||
android:theme="@style/TextSecure.LightNoActionBar"
|
||||
android:windowSoftInputMode="stateHidden"
|
||||
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>
|
||||
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||
</activity>
|
||||
|
||||
<activity android:name=".ContactMultiSelectionActivity"
|
||||
@@ -233,25 +224,16 @@
|
||||
android:theme="@style/TextSecure.LightNoActionBar"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||
|
||||
<activity android:name=".RegistrationActivity"
|
||||
<activity android:name=".relay.EditRelayActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:windowSoftInputMode="stateUnchanged"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<!-- this scheme is used as the redirect_url for getOauth2Url()
|
||||
and should be whitelisted by the supported oauth2 services -->
|
||||
<data android:scheme="chat.delta" android:path="/${applicationId}/auth" tools:ignore="AppLinkUrlError"/>
|
||||
<data android:scheme="chat.delta" android:path="/auth" tools:ignore="AppLinkUrlError"/>
|
||||
|
||||
|
||||
</intent-filter>
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||
</activity>
|
||||
|
||||
<activity android:name=".relay.RelayListActivity"
|
||||
android:windowSoftInputMode="stateHidden"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||
|
||||
<activity android:name=".proxy.ProxySettingsActivity"
|
||||
android:label="@string/proxy_settings"
|
||||
android:windowSoftInputMode="stateHidden"
|
||||
@@ -370,18 +352,16 @@
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||
</activity>
|
||||
|
||||
<activity android:name=".videochat.VideochatActivity"
|
||||
<activity android:name=".calls.CallActivity"
|
||||
android:label=""
|
||||
android:theme="@style/TextSecure.LightTheme"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
|
||||
android:exported="true">
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode">
|
||||
</activity>
|
||||
|
||||
<activity android:name=".WebxdcActivity"
|
||||
android:label=""
|
||||
android:theme="@style/TextSecure.LightTheme"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
|
||||
android:exported="true">
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode">
|
||||
</activity>
|
||||
|
||||
<activity android:name=".WebxdcStoreActivity"
|
||||
@@ -399,11 +379,6 @@
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
|
||||
</activity>
|
||||
|
||||
<service
|
||||
android:name=".connect.KeepAliveService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
android:enabled="true" />
|
||||
|
||||
<service
|
||||
android:name=".geolocation.LocationBackgroundService"
|
||||
android:foregroundServiceType="location" />
|
||||
@@ -416,17 +391,6 @@
|
||||
android:name=".service.FetchForegroundService"
|
||||
android:foregroundServiceType="dataSync" />
|
||||
|
||||
<service
|
||||
android:name=".service.IPCAddAccountsService"
|
||||
android:foregroundServiceType="dataSync"
|
||||
android:enabled="true"
|
||||
android:exported="true"
|
||||
>
|
||||
<intent-filter>
|
||||
<action android:name="chat.delta.addaccount" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<receiver android:name=".notifications.MarkReadReceiver"
|
||||
android:enabled="true"
|
||||
android:exported="false">
|
||||
@@ -436,6 +400,14 @@
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver android:name=".notifications.DeclineCallReceiver"
|
||||
android:enabled="true"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="org.thoughtcrime.securesms.notifications.DECLINE_CALL_NOTICED"/>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver android:name=".notifications.RemoteReplyReceiver"
|
||||
android:enabled="true"
|
||||
android:exported="false">
|
||||
|
||||
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 778 B |
|
After Width: | Height: | Size: 577 B |
|
After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 137 B After Width: | Height: | Size: 138 B |
|
Before Width: | Height: | Size: 145 B After Width: | Height: | Size: 148 B |
|
After Width: | Height: | Size: 232 B |
|
After Width: | Height: | Size: 286 B |
@@ -0,0 +1,129 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc;
|
||||
|
||||
import chat.delta.util.SettableFuture;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
/* Basic RPC Transport implementation */
|
||||
public abstract class BaseTransport implements Rpc.Transport {
|
||||
private final Map<Integer, SettableFuture<JsonNode>> requestFutures = new ConcurrentHashMap<>();
|
||||
private int requestId = 0;
|
||||
private final ObjectMapper mapper = new ObjectMapper();
|
||||
private Thread worker;
|
||||
|
||||
/* Send a Request as raw JSON String to the RPC server */
|
||||
protected abstract void sendRequest(String jsonRequest);
|
||||
|
||||
/* Get next Response as raw JSON String from the RPC server */
|
||||
protected abstract String getResponse();
|
||||
|
||||
public ObjectMapper getObjectMapper() {
|
||||
return mapper;
|
||||
}
|
||||
|
||||
public void call(String method, JsonNode... params) throws RpcException {
|
||||
innerCall(method, params);
|
||||
}
|
||||
|
||||
public <T> T callForResult(TypeReference<T> resultType, String method, JsonNode... params) throws RpcException {
|
||||
try {
|
||||
JsonNode node = innerCall(method, params);
|
||||
if (node.isNull()) return null;
|
||||
return mapper.readValue(node.traverse(), resultType);
|
||||
} catch (IOException e) {
|
||||
throw new RpcException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private JsonNode innerCall(String method, JsonNode... params) throws RpcException {
|
||||
int id;
|
||||
synchronized (this) {
|
||||
id = ++requestId;
|
||||
ensureWorkerThread();
|
||||
}
|
||||
try {
|
||||
String jsonRequest = mapper.writeValueAsString(new Request(method, params, id));
|
||||
SettableFuture<JsonNode> future = new SettableFuture<>();
|
||||
requestFutures.put(id, future);
|
||||
sendRequest(jsonRequest);
|
||||
return future.get();
|
||||
} catch (ExecutionException e) {
|
||||
throw (RpcException)e.getCause();
|
||||
} catch (InterruptedException e) {
|
||||
throw new RpcException(e.getMessage());
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RpcException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private void ensureWorkerThread() {
|
||||
if (worker != null) return;
|
||||
|
||||
worker = new Thread(() -> {
|
||||
while (true) {
|
||||
try {
|
||||
processResponse();
|
||||
} catch (JsonProcessingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}, "jsonrpcThread");
|
||||
worker.start();
|
||||
}
|
||||
|
||||
private void processResponse() throws JsonProcessingException {
|
||||
String jsonResponse = getResponse();
|
||||
Response response = mapper.readValue(jsonResponse, Response.class);
|
||||
|
||||
if (response.id == 0) { // Got JSON-RPC notification/event, ignore
|
||||
return;
|
||||
}
|
||||
|
||||
SettableFuture<JsonNode> future = requestFutures.remove(response.id);
|
||||
if (future == null) { // Got a response with unknown ID, ignore
|
||||
return;
|
||||
}
|
||||
|
||||
if (response.error != null) {
|
||||
future.setException(new RpcException(response.error.message));
|
||||
} else if (response.result != null) {
|
||||
future.set(response.result);
|
||||
} else {
|
||||
future.setException(new RpcException("Got JSON-RPC response without result or error: " + jsonResponse));
|
||||
}
|
||||
}
|
||||
|
||||
private static class Request {
|
||||
private final String jsonrpc = "2.0";
|
||||
public final String method;
|
||||
public final JsonNode[] params;
|
||||
public final int id;
|
||||
|
||||
public Request(String method, JsonNode[] params, int id) {
|
||||
this.method = method;
|
||||
this.params = params;
|
||||
this.id = id;
|
||||
}
|
||||
}
|
||||
|
||||
private static class RpcError {
|
||||
public int code;
|
||||
public String message;
|
||||
}
|
||||
|
||||
private static class Response {
|
||||
public String jsonrpc;
|
||||
public int id;
|
||||
public JsonNode result;
|
||||
public RpcError error;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc;
|
||||
|
||||
public class RpcException extends Exception {
|
||||
|
||||
public RpcException(String message) { super(message); }
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = Account.Configured.class, name="Configured"), @Type(value = Account.Unconfigured.class, name="Unconfigured")})
|
||||
public abstract class Account {
|
||||
|
||||
public static class Configured extends Account {
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String addr;
|
||||
public String color;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String displayName;
|
||||
public Integer id;
|
||||
/** Optional tag as "Work", "Family". Meant to help profile owner to differ between profiles with similar names. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String privateTag;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String profileImage;
|
||||
}
|
||||
|
||||
public static class Unconfigured extends Account {
|
||||
public Integer id;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
/**
|
||||
* cheaper version of fullchat, omits: - contacts - contact_ids - fresh_message_counter - ephemeral_timer - self_in_group - was_seen_recently - can_send
|
||||
* <p>
|
||||
* used when you only need the basic metadata of a chat like type, name, profile picture
|
||||
*/
|
||||
public class BasicChat {
|
||||
public Boolean archived;
|
||||
public ChatType chatType;
|
||||
public String color;
|
||||
public Integer id;
|
||||
public Boolean isContactRequest;
|
||||
public Boolean isDeviceChat;
|
||||
/**
|
||||
* True if the chat is encrypted. This means that all messages in the chat are encrypted, and all contacts in the chat are "key-contacts", i.e. identified by the PGP key fingerprint.
|
||||
* <p>
|
||||
* False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
|
||||
* <p>
|
||||
* Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
|
||||
* <p>
|
||||
* Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
|
||||
* <p>
|
||||
* See also `is_key_contact` on `Contact`.
|
||||
*/
|
||||
public Boolean isEncrypted;
|
||||
public Boolean isMuted;
|
||||
public Boolean isSelfTalk;
|
||||
public Boolean isUnpromoted;
|
||||
public String name;
|
||||
public Boolean pinned;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String profileImage;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class CallInfo {
|
||||
/** True if SDP offer has a video. */
|
||||
public Boolean hasVideo;
|
||||
/**
|
||||
* SDP offer.
|
||||
* <p>
|
||||
* Can be used to manually answer the call even if incoming call event was missed.
|
||||
*/
|
||||
public String sdpOffer;
|
||||
/**
|
||||
* Call state.
|
||||
* <p>
|
||||
* For example, if the call is accepted, active, canceled, declined etc.
|
||||
*/
|
||||
public CallState state;
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = CallState.Alerting.class, name="Alerting"), @Type(value = CallState.Active.class, name="Active"), @Type(value = CallState.Completed.class, name="Completed"), @Type(value = CallState.Missed.class, name="Missed"), @Type(value = CallState.Declined.class, name="Declined"), @Type(value = CallState.Canceled.class, name="Canceled")})
|
||||
public abstract class CallState {
|
||||
|
||||
/**
|
||||
* Fresh incoming or outgoing call that is still ringing.
|
||||
* <p>
|
||||
* There is no separate state for outgoing call that has been dialled but not ringing on the other side yet as we don't know whether the other side received our call.
|
||||
*/
|
||||
public static class Alerting extends CallState {
|
||||
}
|
||||
|
||||
/** Active call. */
|
||||
public static class Active extends CallState {
|
||||
}
|
||||
|
||||
/** Completed call that was once active and then was terminated for any reason. */
|
||||
public static class Completed extends CallState {
|
||||
/** Call duration in seconds. */
|
||||
public Integer duration;
|
||||
}
|
||||
|
||||
/** Incoming call that was not picked up within a timeout or was explicitly ended by the caller before we picked up. */
|
||||
public static class Missed extends CallState {
|
||||
}
|
||||
|
||||
/** Incoming call that was explicitly ended on our side before picking up or outgoing call that was declined before the timeout. */
|
||||
public static class Declined extends CallState {
|
||||
}
|
||||
|
||||
/**
|
||||
* Outgoing call that has been canceled on our side before receiving a response.
|
||||
* <p>
|
||||
* Incoming calls cannot be canceled, on the receiver side canceled calls usually result in missed calls.
|
||||
*/
|
||||
public static class Canceled extends CallState {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = ChatListItemFetchResult.ChatListItem.class, name="ChatListItem"), @Type(value = ChatListItemFetchResult.ArchiveLink.class, name="ArchiveLink"), @Type(value = ChatListItemFetchResult.Error.class, name="Error")})
|
||||
public abstract class ChatListItemFetchResult {
|
||||
|
||||
public static class ChatListItem extends ChatListItemFetchResult {
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String avatarPath;
|
||||
public ChatType chatType;
|
||||
public String color;
|
||||
/** contact id if this is a dm chat (for view profile entry in context menu) */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer dmChatContact;
|
||||
public Integer freshMessageCounter;
|
||||
public Integer id;
|
||||
public Boolean isArchived;
|
||||
public Boolean isContactRequest;
|
||||
public Boolean isDeviceTalk;
|
||||
/**
|
||||
* True if the chat is encrypted. This means that all messages in the chat are encrypted, and all contacts in the chat are "key-contacts", i.e. identified by the PGP key fingerprint.
|
||||
* <p>
|
||||
* False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
|
||||
* <p>
|
||||
* Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
|
||||
* <p>
|
||||
* Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
|
||||
* <p>
|
||||
* See also `is_key_contact` on `Contact`.
|
||||
*/
|
||||
public Boolean isEncrypted;
|
||||
/** deprecated 2025-07, use chat_type instead */
|
||||
public Boolean isGroup;
|
||||
public Boolean isMuted;
|
||||
public Boolean isPinned;
|
||||
public Boolean isSelfInGroup;
|
||||
public Boolean isSelfTalk;
|
||||
public Boolean isSendingLocation;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer lastMessageId;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Viewtype lastMessageType;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer lastUpdated;
|
||||
public String name;
|
||||
/** showing preview if last chat message is image */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String summaryPreviewImage;
|
||||
public Integer summaryStatus;
|
||||
public String summaryText1;
|
||||
public String summaryText2;
|
||||
public Boolean wasSeenRecently;
|
||||
}
|
||||
|
||||
public static class ArchiveLink extends ChatListItemFetchResult {
|
||||
public Integer freshMessageCounter;
|
||||
}
|
||||
|
||||
public static class Error extends ChatListItemFetchResult {
|
||||
public String error;
|
||||
public Integer id;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum ChatType {
|
||||
Single,
|
||||
Group,
|
||||
Mailinglist,
|
||||
OutBroadcast,
|
||||
InBroadcast,
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum ChatVisibility {
|
||||
Normal,
|
||||
Archived,
|
||||
Pinned,
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class Contact {
|
||||
public String address;
|
||||
public String authName;
|
||||
public String color;
|
||||
public String displayName;
|
||||
/**
|
||||
* Is encryption available for this contact.
|
||||
* <p>
|
||||
* This can only be true for key-contacts. However, it is possible to have a key-contact for which encryption is not available because we don't have a key yet, e.g. if we just scanned the fingerprint from a QR code.
|
||||
*/
|
||||
public Boolean e2eeAvail;
|
||||
public Integer id;
|
||||
public Boolean isBlocked;
|
||||
/** If the contact is a bot. */
|
||||
public Boolean isBot;
|
||||
/** Is the contact a key contact. */
|
||||
public Boolean isKeyContact;
|
||||
/**
|
||||
* True if the contact can be added to protected chats because SELF and contact have verified their fingerprints in both directions.
|
||||
* <p>
|
||||
* See [`Self::verifier_id`]/`Contact.verifierId` for a guidance how to display these information.
|
||||
*/
|
||||
public Boolean isVerified;
|
||||
/** the contact's last seen timestamp */
|
||||
public Integer lastSeen;
|
||||
public String name;
|
||||
public String nameAndAddr;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String profileImage;
|
||||
public String status;
|
||||
/**
|
||||
* The contact ID that verified a contact.
|
||||
* <p>
|
||||
* As verifier may be unknown, use [`Self::is_verified`]/`Contact.isVerified` to check if a contact can be added to a protected chat.
|
||||
* <p>
|
||||
* UI should display the information in the contact's profile as follows:
|
||||
* <p>
|
||||
* - If `verifierId` != 0, display text "Introduced by ..." with the name and address of the contact formatted by `name_and_addr`/`nameAndAddr`. Prefix the text by a green checkmark.
|
||||
* <p>
|
||||
* - If `verifierId` == 0 and `isVerified` != 0, display "Introduced" prefixed by a green checkmark.
|
||||
* <p>
|
||||
* - if `verifierId` == 0 and `isVerified` == 0, display nothing
|
||||
* <p>
|
||||
* This contains the contact ID of the verifier. If it is `DC_CONTACT_ID_SELF`, we verified the contact ourself. If it is None/Null, we don't have verifier information or the contact is not verified.
|
||||
*/
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer verifierId;
|
||||
public Boolean wasSeenRecently;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum DownloadState {
|
||||
Done,
|
||||
Available,
|
||||
Failure,
|
||||
Undecipherable,
|
||||
InProgress,
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum EnteredCertificateChecks {
|
||||
/** `Automatic` means that provider database setting should be taken. If there is no provider database setting for certificate checks, check certificates strictly. */
|
||||
automatic,
|
||||
|
||||
/** Ensure that TLS certificate is valid for the server hostname. */
|
||||
strict,
|
||||
|
||||
/** Accept certificates that are expired, self-signed or otherwise not valid for the server hostname. */
|
||||
acceptInvalidCertificates,
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
/**
|
||||
* Login parameters entered by the user.
|
||||
* <p>
|
||||
* Usually it will be enough to only set `addr` and `password`, and all the other settings will be autoconfigured.
|
||||
*/
|
||||
public class EnteredLoginParam {
|
||||
/** Email address. */
|
||||
public String addr;
|
||||
/** TLS options: whether to allow invalid certificates and/or invalid hostnames. Default: Automatic */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public EnteredCertificateChecks certificateChecks;
|
||||
/** Imap server port. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer imapPort;
|
||||
/** Imap socket security. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Socket imapSecurity;
|
||||
/** Imap server hostname or IP address. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String imapServer;
|
||||
/** Imap username. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String imapUser;
|
||||
/** If true, login via OAUTH2 (not recommended anymore). Default: false */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Boolean oauth2;
|
||||
/** Password. */
|
||||
public String password;
|
||||
/**
|
||||
* SMTP Password.
|
||||
* <p>
|
||||
* Only needs to be specified if different than IMAP password.
|
||||
*/
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String smtpPassword;
|
||||
/** SMTP server port. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer smtpPort;
|
||||
/** SMTP socket security. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Socket smtpSecurity;
|
||||
/** SMTP server hostname or IP address. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String smtpServer;
|
||||
/** SMTP username. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String smtpUser;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = EphemeralTimer.Disabled.class, name="Disabled"), @Type(value = EphemeralTimer.Enabled.class, name="Enabled")})
|
||||
public abstract class EphemeralTimer {
|
||||
|
||||
/** Timer is disabled. */
|
||||
public static class Disabled extends EphemeralTimer {
|
||||
}
|
||||
|
||||
/** Timer is enabled. */
|
||||
public static class Enabled extends EphemeralTimer {
|
||||
/**
|
||||
* Timer duration in seconds.
|
||||
* <p>
|
||||
* The value cannot be 0.
|
||||
*/
|
||||
public Integer duration;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class Event {
|
||||
/** Account ID. */
|
||||
public Integer contextId;
|
||||
/** Event payload. */
|
||||
public EventType event;
|
||||
}
|
||||
@@ -0,0 +1,420 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = EventType.Info.class, name="Info"), @Type(value = EventType.SmtpConnected.class, name="SmtpConnected"), @Type(value = EventType.ImapConnected.class, name="ImapConnected"), @Type(value = EventType.SmtpMessageSent.class, name="SmtpMessageSent"), @Type(value = EventType.ImapMessageDeleted.class, name="ImapMessageDeleted"), @Type(value = EventType.ImapMessageMoved.class, name="ImapMessageMoved"), @Type(value = EventType.ImapInboxIdle.class, name="ImapInboxIdle"), @Type(value = EventType.NewBlobFile.class, name="NewBlobFile"), @Type(value = EventType.DeletedBlobFile.class, name="DeletedBlobFile"), @Type(value = EventType.Warning.class, name="Warning"), @Type(value = EventType.Error.class, name="Error"), @Type(value = EventType.ErrorSelfNotInGroup.class, name="ErrorSelfNotInGroup"), @Type(value = EventType.MsgsChanged.class, name="MsgsChanged"), @Type(value = EventType.ReactionsChanged.class, name="ReactionsChanged"), @Type(value = EventType.IncomingReaction.class, name="IncomingReaction"), @Type(value = EventType.IncomingWebxdcNotify.class, name="IncomingWebxdcNotify"), @Type(value = EventType.IncomingMsg.class, name="IncomingMsg"), @Type(value = EventType.IncomingMsgBunch.class, name="IncomingMsgBunch"), @Type(value = EventType.MsgsNoticed.class, name="MsgsNoticed"), @Type(value = EventType.MsgDelivered.class, name="MsgDelivered"), @Type(value = EventType.MsgFailed.class, name="MsgFailed"), @Type(value = EventType.MsgRead.class, name="MsgRead"), @Type(value = EventType.MsgDeleted.class, name="MsgDeleted"), @Type(value = EventType.ChatModified.class, name="ChatModified"), @Type(value = EventType.ChatEphemeralTimerModified.class, name="ChatEphemeralTimerModified"), @Type(value = EventType.ChatDeleted.class, name="ChatDeleted"), @Type(value = EventType.ContactsChanged.class, name="ContactsChanged"), @Type(value = EventType.LocationChanged.class, name="LocationChanged"), @Type(value = EventType.ConfigureProgress.class, name="ConfigureProgress"), @Type(value = EventType.ImexProgress.class, name="ImexProgress"), @Type(value = EventType.ImexFileWritten.class, name="ImexFileWritten"), @Type(value = EventType.SecurejoinInviterProgress.class, name="SecurejoinInviterProgress"), @Type(value = EventType.SecurejoinJoinerProgress.class, name="SecurejoinJoinerProgress"), @Type(value = EventType.ConnectivityChanged.class, name="ConnectivityChanged"), @Type(value = EventType.SelfavatarChanged.class, name="SelfavatarChanged"), @Type(value = EventType.ConfigSynced.class, name="ConfigSynced"), @Type(value = EventType.WebxdcStatusUpdate.class, name="WebxdcStatusUpdate"), @Type(value = EventType.WebxdcRealtimeData.class, name="WebxdcRealtimeData"), @Type(value = EventType.WebxdcRealtimeAdvertisementReceived.class, name="WebxdcRealtimeAdvertisementReceived"), @Type(value = EventType.WebxdcInstanceDeleted.class, name="WebxdcInstanceDeleted"), @Type(value = EventType.AccountsBackgroundFetchDone.class, name="AccountsBackgroundFetchDone"), @Type(value = EventType.ChatlistChanged.class, name="ChatlistChanged"), @Type(value = EventType.ChatlistItemChanged.class, name="ChatlistItemChanged"), @Type(value = EventType.AccountsChanged.class, name="AccountsChanged"), @Type(value = EventType.AccountsItemChanged.class, name="AccountsItemChanged"), @Type(value = EventType.EventChannelOverflow.class, name="EventChannelOverflow"), @Type(value = EventType.IncomingCall.class, name="IncomingCall"), @Type(value = EventType.IncomingCallAccepted.class, name="IncomingCallAccepted"), @Type(value = EventType.OutgoingCallAccepted.class, name="OutgoingCallAccepted"), @Type(value = EventType.CallEnded.class, name="CallEnded"), @Type(value = EventType.TransportsModified.class, name="TransportsModified")})
|
||||
public abstract class EventType {
|
||||
|
||||
/**
|
||||
* The library-user may write an informational string to the log.
|
||||
* <p>
|
||||
* This event should *not* be reported to the end-user using a popup or something like that.
|
||||
*/
|
||||
public static class Info extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/** Emitted when SMTP connection is established and login was successful. */
|
||||
public static class SmtpConnected extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/** Emitted when IMAP connection is established and login was successful. */
|
||||
public static class ImapConnected extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/** Emitted when a message was successfully sent to the SMTP server. */
|
||||
public static class SmtpMessageSent extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/** Emitted when an IMAP message has been marked as deleted */
|
||||
public static class ImapMessageDeleted extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/** Emitted when an IMAP message has been moved */
|
||||
public static class ImapMessageMoved extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/** Emitted before going into IDLE on the Inbox folder. */
|
||||
public static class ImapInboxIdle extends EventType {
|
||||
}
|
||||
|
||||
/** Emitted when an new file in the $BLOBDIR was created */
|
||||
public static class NewBlobFile extends EventType {
|
||||
public String file;
|
||||
}
|
||||
|
||||
/** Emitted when an file in the $BLOBDIR was deleted */
|
||||
public static class DeletedBlobFile extends EventType {
|
||||
public String file;
|
||||
}
|
||||
|
||||
/**
|
||||
* The library-user should write a warning string to the log.
|
||||
* <p>
|
||||
* This event should *not* be reported to the end-user using a popup or something like that.
|
||||
*/
|
||||
public static class Warning extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* The library-user should report an error to the end-user.
|
||||
* <p>
|
||||
* As most things are asynchronous, things may go wrong at any time and the user should not be disturbed by a dialog or so. Instead, use a bubble or so.
|
||||
* <p>
|
||||
* However, for ongoing processes (eg. configure()) or for functions that are expected to fail (eg. autocryptContinueKeyTransfer()) it might be better to delay showing these events until the function has really failed (returned false). It should be sufficient to report only the *last* error in a message box then.
|
||||
*/
|
||||
public static class Error extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/** An action cannot be performed because the user is not in the group. Reported eg. after a call to setChatName(), setChatProfileImage(), addContactToChat(), removeContactFromChat(), and messages sending functions. */
|
||||
public static class ErrorSelfNotInGroup extends EventType {
|
||||
public String msg;
|
||||
}
|
||||
|
||||
/** Messages or chats changed. One or more messages or chats changed for various reasons in the database: - Messages sent, received or removed - Chats created, deleted or archived - A draft has been set */
|
||||
public static class MsgsChanged extends EventType {
|
||||
/** Set if only a single chat is affected by the changes, otherwise 0. */
|
||||
public Integer chatId;
|
||||
/** Set if only a single message is affected by the changes, otherwise 0. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/** Reactions for the message changed. */
|
||||
public static class ReactionsChanged extends EventType {
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chatId;
|
||||
/** ID of the contact whose reaction set is changed. */
|
||||
public Integer contactId;
|
||||
/** ID of the message for which reactions were changed. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/**
|
||||
* A reaction to one's own sent message received. Typically, the UI will show a notification for that.
|
||||
* <p>
|
||||
* In addition to this event, ReactionsChanged is emitted.
|
||||
*/
|
||||
public static class IncomingReaction extends EventType {
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chatId;
|
||||
/** ID of the contact whose reaction set is changed. */
|
||||
public Integer contactId;
|
||||
/** ID of the message for which reactions were changed. */
|
||||
public Integer msgId;
|
||||
/** The reaction. */
|
||||
public String reaction;
|
||||
}
|
||||
|
||||
/** Incoming webxdc info or summary update, should be notified. */
|
||||
public static class IncomingWebxdcNotify extends EventType {
|
||||
/** ID of the chat. */
|
||||
public Integer chatId;
|
||||
/** ID of the contact sending. */
|
||||
public Integer contactId;
|
||||
/** Link assigned to this notification, if any. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String href;
|
||||
/** ID of the added info message or webxdc instance in case of summary change. */
|
||||
public Integer msgId;
|
||||
/** Text to notify. */
|
||||
public String text;
|
||||
}
|
||||
|
||||
/**
|
||||
* There is a fresh message. Typically, the user will show a notification when receiving this message.
|
||||
* <p>
|
||||
* There is no extra #DC_EVENT_MSGS_CHANGED event sent together with this event.
|
||||
*/
|
||||
public static class IncomingMsg extends EventType {
|
||||
/** ID of the chat where the message is assigned. */
|
||||
public Integer chatId;
|
||||
/** ID of the message. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/** Downloading a bunch of messages just finished. This is an event to allow the UI to only show one notification per message bunch, instead of cluttering the user with many notifications. */
|
||||
public static class IncomingMsgBunch extends EventType {
|
||||
}
|
||||
|
||||
/** Messages were seen or noticed. chat id is always set. */
|
||||
public static class MsgsNoticed extends EventType {
|
||||
public Integer chatId;
|
||||
}
|
||||
|
||||
/** A single message is sent successfully. State changed from DC_STATE_OUT_PENDING to DC_STATE_OUT_DELIVERED, see `Message.state`. */
|
||||
public static class MsgDelivered extends EventType {
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chatId;
|
||||
/** ID of the message that was successfully sent. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/** A single message could not be sent. State changed from DC_STATE_OUT_PENDING or DC_STATE_OUT_DELIVERED to DC_STATE_OUT_FAILED, see `Message.state`. */
|
||||
public static class MsgFailed extends EventType {
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chatId;
|
||||
/** ID of the message that could not be sent. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/** A single message is read by the receiver. State changed from DC_STATE_OUT_DELIVERED to DC_STATE_OUT_MDN_RCVD, see `Message.state`. */
|
||||
public static class MsgRead extends EventType {
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chatId;
|
||||
/** ID of the message that was read. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/**
|
||||
* A single message was deleted.
|
||||
* <p>
|
||||
* This event means that the message will no longer appear in the messagelist. UI should remove the message from the messagelist in response to this event if the message is currently displayed.
|
||||
* <p>
|
||||
* The message may have been explicitly deleted by the user or expired. Internally the message may have been removed from the database, moved to the trash chat or hidden.
|
||||
* <p>
|
||||
* This event does not indicate the message deletion from the server.
|
||||
*/
|
||||
public static class MsgDeleted extends EventType {
|
||||
/** ID of the chat where the message was prior to deletion. Never 0. */
|
||||
public Integer chatId;
|
||||
/** ID of the deleted message. Never 0. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Chat changed. The name or the image of a chat group was changed or members were added or removed. See setChatName(), setChatProfileImage(), addContactToChat() and removeContactFromChat().
|
||||
* <p>
|
||||
* This event does not include ephemeral timer modification, which is a separate event.
|
||||
*/
|
||||
public static class ChatModified extends EventType {
|
||||
public Integer chatId;
|
||||
}
|
||||
|
||||
/** Chat ephemeral timer changed. */
|
||||
public static class ChatEphemeralTimerModified extends EventType {
|
||||
/** Chat ID. */
|
||||
public Integer chatId;
|
||||
/** New ephemeral timer value. */
|
||||
public Integer timer;
|
||||
}
|
||||
|
||||
/** Chat deleted. */
|
||||
public static class ChatDeleted extends EventType {
|
||||
/** Chat ID. */
|
||||
public Integer chat_id;
|
||||
}
|
||||
|
||||
/** Contact(s) created, renamed, blocked or deleted. */
|
||||
public static class ContactsChanged extends EventType {
|
||||
/** If set, this is the contact_id of an added contact that should be selected. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer contactId;
|
||||
}
|
||||
|
||||
/** Location of one or more contact has changed. */
|
||||
public static class LocationChanged extends EventType {
|
||||
/** contact_id of the contact for which the location has changed. If the locations of several contacts have been changed, this parameter is set to `None`. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer contactId;
|
||||
}
|
||||
|
||||
/** Inform about the configuration progress started by configure(). */
|
||||
public static class ConfigureProgress extends EventType {
|
||||
/** Progress comment or error, something to display to the user. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String comment;
|
||||
/**
|
||||
* Progress.
|
||||
* <p>
|
||||
* 0=error, 1-999=progress in permille, 1000=success and done
|
||||
*/
|
||||
public Integer progress;
|
||||
}
|
||||
|
||||
/** Inform about the import/export progress started by imex(). */
|
||||
public static class ImexProgress extends EventType {
|
||||
/** 0=error, 1-999=progress in permille, 1000=success and done */
|
||||
public Integer progress;
|
||||
}
|
||||
|
||||
/**
|
||||
* A file has been exported. A file has been written by imex(). This event may be sent multiple times by a single call to imex().
|
||||
* <p>
|
||||
* A typical purpose for a handler of this event may be to make the file public to some system services.
|
||||
* <p>
|
||||
* @param data2 0
|
||||
*/
|
||||
public static class ImexFileWritten extends EventType {
|
||||
public String path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Progress event sent when SecureJoin protocol has finished from the view of the inviter (Alice, the person who shows the QR code).
|
||||
* <p>
|
||||
* These events are typically sent after a joiner has scanned the QR code generated by getChatSecurejoinQrCodeSvg().
|
||||
*/
|
||||
public static class SecurejoinInviterProgress extends EventType {
|
||||
/** ID of the chat in case of success. */
|
||||
public Integer chatId;
|
||||
/** The type of the joined chat. This can take the same values as `BasicChat.chatType` ([`crate::api::types::chat::BasicChat::chat_type`]). */
|
||||
public ChatType chatType;
|
||||
/** ID of the contact that wants to join. */
|
||||
public Integer contactId;
|
||||
/** Progress, always 1000. */
|
||||
public Integer progress;
|
||||
}
|
||||
|
||||
/** Progress information of a secure-join handshake from the view of the joiner (Bob, the person who scans the QR code). The events are typically sent while secureJoin(), which may take some time, is executed. */
|
||||
public static class SecurejoinJoinerProgress extends EventType {
|
||||
/** ID of the inviting contact. */
|
||||
public Integer contactId;
|
||||
/** Progress as: 400=vg-/vc-request-with-auth sent, typically shown as "alice@addr verified, introducing myself." (Bob has verified alice and waits until Alice does the same for him) 1000=vg-member-added/vc-contact-confirm received */
|
||||
public Integer progress;
|
||||
}
|
||||
|
||||
/** The connectivity to the server changed. This means that you should refresh the connectivity view and possibly the connectivtiy HTML; see getConnectivity() and getConnectivityHtml() for details. */
|
||||
public static class ConnectivityChanged extends EventType {
|
||||
}
|
||||
|
||||
/** Deprecated by `ConfigSynced`. */
|
||||
public static class SelfavatarChanged extends EventType {
|
||||
}
|
||||
|
||||
/** A multi-device synced config value changed. Maybe the app needs to refresh smth. For uniformity this is emitted on the source device too. The value isn't here, otherwise it would be logged which might not be good for privacy. */
|
||||
public static class ConfigSynced extends EventType {
|
||||
/** Configuration key. */
|
||||
public String key;
|
||||
}
|
||||
|
||||
public static class WebxdcStatusUpdate extends EventType {
|
||||
/** Message ID. */
|
||||
public Integer msgId;
|
||||
/** Status update ID. */
|
||||
public Integer statusUpdateSerial;
|
||||
}
|
||||
|
||||
/** Data received over an ephemeral peer channel. */
|
||||
public static class WebxdcRealtimeData extends EventType {
|
||||
/** Realtime data. */
|
||||
public java.util.List<Integer> data;
|
||||
/** Message ID. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/** Advertisement received over an ephemeral peer channel. This can be used by bots to initiate peer-to-peer communication from their side. */
|
||||
public static class WebxdcRealtimeAdvertisementReceived extends EventType {
|
||||
/** Message ID of the webxdc instance. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/** Inform that a message containing a webxdc instance has been deleted */
|
||||
public static class WebxdcInstanceDeleted extends EventType {
|
||||
/** ID of the deleted message. */
|
||||
public Integer msgId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells that the Background fetch was completed (or timed out). This event acts as a marker, when you reach this event you can be sure that all events emitted during the background fetch were processed.
|
||||
* <p>
|
||||
* This event is only emitted by the account manager
|
||||
*/
|
||||
public static class AccountsBackgroundFetchDone extends EventType {
|
||||
}
|
||||
|
||||
/**
|
||||
* Inform that set of chats or the order of the chats in the chatlist has changed.
|
||||
* <p>
|
||||
* Sometimes this is emitted together with `UIChatlistItemChanged`.
|
||||
*/
|
||||
public static class ChatlistChanged extends EventType {
|
||||
}
|
||||
|
||||
/** Inform that a single chat list item changed and needs to be rerendered. If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. */
|
||||
public static class ChatlistItemChanged extends EventType {
|
||||
/** ID of the changed chat */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer chatId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inform that the list of accounts has changed (an account removed or added or (not yet implemented) the account order changes)
|
||||
* <p>
|
||||
* This event is only emitted by the account manager
|
||||
*/
|
||||
public static class AccountsChanged extends EventType {
|
||||
}
|
||||
|
||||
/**
|
||||
* Inform that an account property that might be shown in the account list changed, namely: - is_configured (see is_configured()) - displayname - selfavatar - private_tag
|
||||
* <p>
|
||||
* This event is emitted from the account whose property changed.
|
||||
*/
|
||||
public static class AccountsItemChanged extends EventType {
|
||||
}
|
||||
|
||||
/** Inform than some events have been skipped due to event channel overflow. */
|
||||
public static class EventChannelOverflow extends EventType {
|
||||
/** Number of events skipped. */
|
||||
public Integer n;
|
||||
}
|
||||
|
||||
/** Incoming call. */
|
||||
public static class IncomingCall extends EventType {
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chat_id;
|
||||
/** True if incoming call is a video call. */
|
||||
public Boolean has_video;
|
||||
/** ID of the info message referring to the call. */
|
||||
public Integer msg_id;
|
||||
/** User-defined info as passed to place_outgoing_call() */
|
||||
public String place_call_info;
|
||||
}
|
||||
|
||||
/** Incoming call accepted. This is esp. interesting to stop ringing on other devices. */
|
||||
public static class IncomingCallAccepted extends EventType {
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chat_id;
|
||||
/** ID of the info message referring to the call. */
|
||||
public Integer msg_id;
|
||||
}
|
||||
|
||||
/** Outgoing call accepted. */
|
||||
public static class OutgoingCallAccepted extends EventType {
|
||||
/** User-defined info passed to dc_accept_incoming_call( */
|
||||
public String accept_call_info;
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chat_id;
|
||||
/** ID of the info message referring to the call. */
|
||||
public Integer msg_id;
|
||||
}
|
||||
|
||||
/** Call ended. */
|
||||
public static class CallEnded extends EventType {
|
||||
/** ID of the chat which the message belongs to. */
|
||||
public Integer chat_id;
|
||||
/** ID of the info message referring to the call. */
|
||||
public Integer msg_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* One or more transports has changed.
|
||||
* <p>
|
||||
* This event is used for tests to detect when transport synchronization messages arrives. UIs don't need to use it, it is unlikely that user modifies transports on multiple devices simultaneously.
|
||||
*/
|
||||
public static class TransportsModified extends EventType {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class FullChat {
|
||||
public Boolean archived;
|
||||
public Boolean canSend;
|
||||
public ChatType chatType;
|
||||
public String color;
|
||||
public java.util.List<Integer> contactIds;
|
||||
public java.util.List<Contact> contacts;
|
||||
public Integer ephemeralTimer;
|
||||
public Integer freshMessageCounter;
|
||||
public Integer id;
|
||||
public Boolean isContactRequest;
|
||||
public Boolean isDeviceChat;
|
||||
/**
|
||||
* True if the chat is encrypted. This means that all messages in the chat are encrypted, and all contacts in the chat are "key-contacts", i.e. identified by the PGP key fingerprint.
|
||||
* <p>
|
||||
* False if the chat is unencrypted. This means that all messages in the chat are unencrypted, and all contacts in the chat are "address-contacts", i.e. identified by the email address. The UI should mark this chat e.g. with a mail-letter icon.
|
||||
* <p>
|
||||
* Unencrypted groups are called "ad-hoc groups" and the user can't add/remove members, create a QR invite code, or set an avatar. These options should therefore be disabled in the UI.
|
||||
* <p>
|
||||
* Note that it can happen that an encrypted chat contains unencrypted messages that were received in core <= v1.159.* and vice versa.
|
||||
* <p>
|
||||
* See also `is_key_contact` on `Contact`.
|
||||
*/
|
||||
public Boolean isEncrypted;
|
||||
public Boolean isMuted;
|
||||
public Boolean isSelfTalk;
|
||||
public Boolean isUnpromoted;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String mailingListAddress;
|
||||
public String name;
|
||||
/** Contact IDs of the past chat members. */
|
||||
public java.util.List<Integer> pastContactIds;
|
||||
public Boolean pinned;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String profileImage;
|
||||
/** Note that this is different from [`ChatListItem::is_self_in_group`](`crate::api::types::chat_list::ChatListItemFetchResult::ChatListItem::is_self_in_group`). This property should only be accessed when [`FullChat::chat_type`] is [`Chattype::Group`]. */
|
||||
public Boolean selfInGroup;
|
||||
public Boolean wasSeenRecently;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class HttpResponse {
|
||||
/** base64-encoded response body. */
|
||||
public String blob;
|
||||
/** Encoding, e.g. "utf-8". */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String encoding;
|
||||
/** MIME type, e.g. "text/plain" or "text/html". */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String mimetype;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class Location {
|
||||
public Float accuracy;
|
||||
public Integer chatId;
|
||||
public Integer contactId;
|
||||
public Boolean isIndependent;
|
||||
public Float latitude;
|
||||
public Integer locationId;
|
||||
public Float longitude;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String marker;
|
||||
public Integer msgId;
|
||||
public Integer timestamp;
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class Message {
|
||||
public Integer chatId;
|
||||
public Integer dimensionsHeight;
|
||||
public Integer dimensionsWidth;
|
||||
public DownloadState downloadState;
|
||||
public Integer duration;
|
||||
/** An error text, if there is one. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String error;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String file;
|
||||
public Integer fileBytes;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String fileMime;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String fileName;
|
||||
public Integer fromId;
|
||||
public Boolean hasDeviatingTimestamp;
|
||||
public Boolean hasHtml;
|
||||
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
|
||||
public Boolean hasLocation;
|
||||
public Integer id;
|
||||
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer infoContactId;
|
||||
/** True if the message was sent by a bot. */
|
||||
public Boolean isBot;
|
||||
public Boolean isEdited;
|
||||
public Boolean isForwarded;
|
||||
public Boolean isInfo;
|
||||
public Boolean isSetupmessage;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer originalMsgId;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String overrideSenderName;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer parentId;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public MessageQuote quote;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Reactions reactions;
|
||||
public Integer receivedTimestamp;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer savedMessageId;
|
||||
public Contact sender;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String setupCodeBegin;
|
||||
/**
|
||||
* True if the message was correctly encrypted&signed, false otherwise. Historically, UIs showed a small padlock on the message then.
|
||||
* <p>
|
||||
* Today, the UIs should instead show a small email-icon on the message if `show_padlock` is `false`, and nothing if it is `true`.
|
||||
*/
|
||||
public Boolean showPadlock;
|
||||
public Integer sortTimestamp;
|
||||
public Integer state;
|
||||
public String subject;
|
||||
/** when is_info is true this describes what type of system message it is */
|
||||
public SystemMessageType systemMessageType;
|
||||
public String text;
|
||||
public Integer timestamp;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public VcardContact vcardContact;
|
||||
public Viewtype viewType;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String webxdcHref;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class MessageData {
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String file;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String filename;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String html;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Pair<Float, Float> location;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String overrideSenderName;
|
||||
/** Quoted message id. Takes preference over `quoted_text` (see below). */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer quotedMessageId;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String quotedText;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String text;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Viewtype viewtype;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class MessageInfo {
|
||||
public EphemeralTimer ephemeralTimer;
|
||||
/** When message is ephemeral this contains the timestamp of the message expiry */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer ephemeralTimestamp;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String error;
|
||||
public String hopInfo;
|
||||
public String rfc724Mid;
|
||||
public java.util.List<String> serverUrls;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = MessageListItem.Message.class, name="Message"), @Type(value = MessageListItem.DayMarker.class, name="DayMarker")})
|
||||
public abstract class MessageListItem {
|
||||
|
||||
public static class Message extends MessageListItem {
|
||||
public Integer msg_id;
|
||||
}
|
||||
|
||||
/** Day marker, separating messages that correspond to different days according to local time. */
|
||||
public static class DayMarker extends MessageListItem {
|
||||
/** Marker timestamp, for day markers, in unix milliseconds */
|
||||
public Integer timestamp;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = MessageLoadResult.Message.class, name="Message"), @Type(value = MessageLoadResult.LoadingError.class, name="LoadingError")})
|
||||
public abstract class MessageLoadResult {
|
||||
|
||||
public static class Message extends MessageLoadResult {
|
||||
public Integer chatId;
|
||||
public Integer dimensionsHeight;
|
||||
public Integer dimensionsWidth;
|
||||
public DownloadState downloadState;
|
||||
public Integer duration;
|
||||
/** An error text, if there is one. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String error;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String file;
|
||||
public Integer fileBytes;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String fileMime;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String fileName;
|
||||
public Integer fromId;
|
||||
public Boolean hasDeviatingTimestamp;
|
||||
public Boolean hasHtml;
|
||||
/** Check if a message has a POI location bound to it. These locations are also returned by `get_locations` method. The UI may decide to display a special icon beside such messages. */
|
||||
public Boolean hasLocation;
|
||||
public Integer id;
|
||||
/** if is_info is set, this refers to the contact profile that should be opened when the info message is tapped. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer infoContactId;
|
||||
/** True if the message was sent by a bot. */
|
||||
public Boolean isBot;
|
||||
public Boolean isEdited;
|
||||
public Boolean isForwarded;
|
||||
public Boolean isInfo;
|
||||
public Boolean isSetupmessage;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer originalMsgId;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String overrideSenderName;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer parentId;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public MessageQuote quote;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Reactions reactions;
|
||||
public Integer receivedTimestamp;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer savedMessageId;
|
||||
public Contact sender;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String setupCodeBegin;
|
||||
/**
|
||||
* True if the message was correctly encrypted&signed, false otherwise. Historically, UIs showed a small padlock on the message then.
|
||||
* <p>
|
||||
* Today, the UIs should instead show a small email-icon on the message if `show_padlock` is `false`, and nothing if it is `true`.
|
||||
*/
|
||||
public Boolean showPadlock;
|
||||
public Integer sortTimestamp;
|
||||
public Integer state;
|
||||
public String subject;
|
||||
/** when is_info is true this describes what type of system message it is */
|
||||
public SystemMessageType systemMessageType;
|
||||
public String text;
|
||||
public Integer timestamp;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public VcardContact vcardContact;
|
||||
public Viewtype viewType;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String webxdcHref;
|
||||
}
|
||||
|
||||
public static class LoadingError extends MessageLoadResult {
|
||||
public String error;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class MessageNotificationInfo {
|
||||
public Integer accountId;
|
||||
public Integer chatId;
|
||||
public String chatName;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String chatProfileImage;
|
||||
public Integer id;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String image;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String imageMimeType;
|
||||
/** also known as summary_text1 */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String summaryPrefix;
|
||||
/** also known as summary_text2 */
|
||||
public String summaryText;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = MessageQuote.JustText.class, name="JustText"), @Type(value = MessageQuote.WithMessage.class, name="WithMessage")})
|
||||
public abstract class MessageQuote {
|
||||
|
||||
public static class JustText extends MessageQuote {
|
||||
public String text;
|
||||
}
|
||||
|
||||
public static class WithMessage extends MessageQuote {
|
||||
public String authorDisplayColor;
|
||||
public String authorDisplayName;
|
||||
/** The quoted message does not always belong to the same chat, e.g. when "Reply Privately" is used. */
|
||||
public Integer chatId;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String image;
|
||||
public Boolean isForwarded;
|
||||
public Integer messageId;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String overrideSenderName;
|
||||
public String text;
|
||||
public Viewtype viewType;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class MessageReadReceipt {
|
||||
public Integer contactId;
|
||||
public Integer timestamp;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class MessageSearchResult {
|
||||
public String authorColor;
|
||||
public Integer authorId;
|
||||
/** if sender name if overridden it will show it as ~alias */
|
||||
public String authorName;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String authorProfileImage;
|
||||
public String chatColor;
|
||||
public Integer chatId;
|
||||
public String chatName;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String chatProfileImage;
|
||||
public ChatType chatType;
|
||||
public Integer id;
|
||||
public Boolean isChatArchived;
|
||||
public Boolean isChatContactRequest;
|
||||
public String message;
|
||||
public Integer timestamp;
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = MuteDuration.NotMuted.class, name="NotMuted"), @Type(value = MuteDuration.Forever.class, name="Forever"), @Type(value = MuteDuration.Until.class, name="Until")})
|
||||
public abstract class MuteDuration {
|
||||
|
||||
public static class NotMuted extends MuteDuration {
|
||||
}
|
||||
|
||||
public static class Forever extends MuteDuration {
|
||||
}
|
||||
|
||||
public static class Until extends MuteDuration {
|
||||
public Integer duration;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum NotifyState {
|
||||
/** Not subscribed to push notifications. */
|
||||
NotConnected,
|
||||
|
||||
/** Subscribed to heartbeat push notifications. */
|
||||
Heartbeat,
|
||||
|
||||
/** Subscribed to push notifications for new messages. */
|
||||
Connected,
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class Pair<T1, T2> {
|
||||
private final T1 v1;
|
||||
private final T2 v2;
|
||||
|
||||
public Pair(T1 v1, T2 v2) {
|
||||
this.v1 = v1;
|
||||
this.v2 = v2;
|
||||
}
|
||||
|
||||
public T1 first(){
|
||||
return v1;
|
||||
}
|
||||
|
||||
public T2 second(){
|
||||
return v2;
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
return o instanceof Pair &&
|
||||
equal(((Pair) o).first(), first()) &&
|
||||
equal(((Pair) o).second(), second());
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return first().hashCode() ^ second().hashCode();
|
||||
}
|
||||
|
||||
private boolean equal(Object first, Object second) {
|
||||
if (first == null && second == null) return true;
|
||||
if (first == null || second == null) return false;
|
||||
return first.equals(second);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class ProviderInfo {
|
||||
public String beforeLoginHint;
|
||||
/** Unique ID, corresponding to provider database filename. */
|
||||
public String id;
|
||||
public String overviewPage;
|
||||
public Integer status;
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
|
||||
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
|
||||
@JsonSubTypes({@Type(value = Qr.AskVerifyContact.class, name="AskVerifyContact"), @Type(value = Qr.AskVerifyGroup.class, name="AskVerifyGroup"), @Type(value = Qr.AskJoinBroadcast.class, name="AskJoinBroadcast"), @Type(value = Qr.FprOk.class, name="FprOk"), @Type(value = Qr.FprMismatch.class, name="FprMismatch"), @Type(value = Qr.FprWithoutAddr.class, name="FprWithoutAddr"), @Type(value = Qr.Account.class, name="Account"), @Type(value = Qr.Backup2.class, name="Backup2"), @Type(value = Qr.BackupTooNew.class, name="BackupTooNew"), @Type(value = Qr.WebrtcInstance.class, name="WebrtcInstance"), @Type(value = Qr.Proxy.class, name="Proxy"), @Type(value = Qr.Addr.class, name="Addr"), @Type(value = Qr.Url.class, name="Url"), @Type(value = Qr.Text.class, name="Text"), @Type(value = Qr.WithdrawVerifyContact.class, name="WithdrawVerifyContact"), @Type(value = Qr.WithdrawVerifyGroup.class, name="WithdrawVerifyGroup"), @Type(value = Qr.WithdrawJoinBroadcast.class, name="WithdrawJoinBroadcast"), @Type(value = Qr.ReviveVerifyContact.class, name="ReviveVerifyContact"), @Type(value = Qr.ReviveVerifyGroup.class, name="ReviveVerifyGroup"), @Type(value = Qr.ReviveJoinBroadcast.class, name="ReviveJoinBroadcast"), @Type(value = Qr.Login.class, name="Login")})
|
||||
public abstract class Qr {
|
||||
|
||||
/**
|
||||
* Ask the user whether to verify the contact.
|
||||
* <p>
|
||||
* If the user agrees, pass this QR code to [`crate::securejoin::join_securejoin`].
|
||||
*/
|
||||
public static class AskVerifyContact extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** ID of the contact. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
}
|
||||
|
||||
/** Ask the user whether to join the group. */
|
||||
public static class AskVerifyGroup extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** ID of the contact. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** Group ID. */
|
||||
public String grpid;
|
||||
/** Group name. */
|
||||
public String grpname;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
}
|
||||
|
||||
/** Ask the user whether to join the broadcast channel. */
|
||||
public static class AskJoinBroadcast extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** ID of the contact who owns the broadcast channel and created the QR code. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the broadcast channel owner's key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** A string of random characters, uniquely identifying this broadcast channel across all databases/clients. Called `grpid` for historic reasons: The id of multi-user chats is always called `grpid` in the database because groups were once the only multi-user chats. */
|
||||
public String grpid;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
/** The user-visible name of this broadcast channel */
|
||||
public String name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Contact fingerprint is verified.
|
||||
* <p>
|
||||
* Ask the user if they want to start chatting.
|
||||
*/
|
||||
public static class FprOk extends Qr {
|
||||
/** Contact ID. */
|
||||
public Integer contact_id;
|
||||
}
|
||||
|
||||
/** Scanned fingerprint does not match the last seen fingerprint. */
|
||||
public static class FprMismatch extends Qr {
|
||||
/** Contact ID. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public Integer contact_id;
|
||||
}
|
||||
|
||||
/** The scanned QR code contains a fingerprint but no e-mail address. */
|
||||
public static class FprWithoutAddr extends Qr {
|
||||
/** Key fingerprint. */
|
||||
public String fingerprint;
|
||||
}
|
||||
|
||||
/** Ask the user if they want to create an account on the given domain. */
|
||||
public static class Account extends Qr {
|
||||
/** Server domain name. */
|
||||
public String domain;
|
||||
}
|
||||
|
||||
/** Provides a backup that can be retrieved using iroh-net based backup transfer protocol. */
|
||||
public static class Backup2 extends Qr {
|
||||
/** Authentication token. */
|
||||
public String auth_token;
|
||||
/** Iroh node address. */
|
||||
public String node_addr;
|
||||
}
|
||||
|
||||
public static class BackupTooNew extends Qr {
|
||||
}
|
||||
|
||||
/** Ask the user if they want to use the given service for video chats. */
|
||||
public static class WebrtcInstance extends Qr {
|
||||
public String domain;
|
||||
public String instance_pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ask the user if they want to use the given proxy.
|
||||
* <p>
|
||||
* Note that HTTP(S) URLs without a path and query parameters are treated as HTTP(S) proxy URL. UI may want to still offer to open the URL in the browser if QR code contents starts with `http://` or `https://` and the QR code was not scanned from the proxy configuration screen.
|
||||
*/
|
||||
public static class Proxy extends Qr {
|
||||
/** Host extracted from the URL to display in the UI. */
|
||||
public String host;
|
||||
/** Port extracted from the URL to display in the UI. */
|
||||
public Integer port;
|
||||
/**
|
||||
* Proxy URL.
|
||||
* <p>
|
||||
* This is the URL that is going to be added.
|
||||
*/
|
||||
public String url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Contact address is scanned.
|
||||
* <p>
|
||||
* Optionally, a draft message could be provided. Ask the user if they want to start chatting.
|
||||
*/
|
||||
public static class Addr extends Qr {
|
||||
/** Contact ID. */
|
||||
public Integer contact_id;
|
||||
/** Draft message. */
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String draft;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL scanned.
|
||||
* <p>
|
||||
* Ask the user if they want to open a browser or copy the URL to clipboard.
|
||||
*/
|
||||
public static class Url extends Qr {
|
||||
public String url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Text scanned.
|
||||
* <p>
|
||||
* Ask the user if they want to copy the text to clipboard.
|
||||
*/
|
||||
public static class Text extends Qr {
|
||||
public String text;
|
||||
}
|
||||
|
||||
/** Ask the user if they want to withdraw their own QR code. */
|
||||
public static class WithdrawVerifyContact extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** Contact ID. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
}
|
||||
|
||||
/** Ask the user if they want to withdraw their own group invite QR code. */
|
||||
public static class WithdrawVerifyGroup extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** Contact ID. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** Group ID. */
|
||||
public String grpid;
|
||||
/** Group name. */
|
||||
public String grpname;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
}
|
||||
|
||||
/** Ask the user if they want to withdraw their own broadcast channel invite QR code. */
|
||||
public static class WithdrawJoinBroadcast extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** Contact ID. Always `ContactId::SELF`. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** ID, uniquely identifying this chat. Called grpid for historic reasons. */
|
||||
public String grpid;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
/** Broadcast name. */
|
||||
public String name;
|
||||
}
|
||||
|
||||
/** Ask the user if they want to revive their own QR code. */
|
||||
public static class ReviveVerifyContact extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** Contact ID. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
}
|
||||
|
||||
/** Ask the user if they want to revive their own group invite QR code. */
|
||||
public static class ReviveVerifyGroup extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** Contact ID. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** Group ID. */
|
||||
public String grpid;
|
||||
/** Contact ID. */
|
||||
public String grpname;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
}
|
||||
|
||||
/** Ask the user if they want to revive their own broadcast channel invite QR code. */
|
||||
public static class ReviveJoinBroadcast extends Qr {
|
||||
/** Authentication code. */
|
||||
public String authcode;
|
||||
/** Contact ID. Always `ContactId::SELF`. */
|
||||
public Integer contact_id;
|
||||
/** Fingerprint of the contact key as scanned from the QR code. */
|
||||
public String fingerprint;
|
||||
/** Globally unique chat ID. Called grpid for historic reasons. */
|
||||
public String grpid;
|
||||
/** Invite number. */
|
||||
public String invitenumber;
|
||||
/** Broadcast name. */
|
||||
public String name;
|
||||
}
|
||||
|
||||
/**
|
||||
* `dclogin:` scheme parameters.
|
||||
* <p>
|
||||
* Ask the user if they want to login with the email address.
|
||||
*/
|
||||
public static class Login extends Qr {
|
||||
public String address;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
/** A single reaction emoji. */
|
||||
public class Reaction {
|
||||
/** Emoji frequency. */
|
||||
public Integer count;
|
||||
/** Emoji. */
|
||||
public String emoji;
|
||||
/** True if we reacted with this emoji. */
|
||||
public Boolean isFromSelf;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
/** Structure representing all reactions to a particular message. */
|
||||
public class Reactions {
|
||||
/** Unique reactions and their count, sorted in descending order. */
|
||||
public java.util.List<Reaction> reactions;
|
||||
/** Map from a contact to it's reaction to message. */
|
||||
public java.util.Map<String, java.util.List<String>> reactionsByContact;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum SecurejoinSource {
|
||||
/** Because of some problem, it is unknown where the QR code came from. */
|
||||
Unknown,
|
||||
|
||||
/** The user opened a link somewhere outside Delta Chat */
|
||||
ExternalLink,
|
||||
|
||||
/** The user clicked on a link in a message inside Delta Chat */
|
||||
InternalLink,
|
||||
|
||||
/** The user clicked "Paste from Clipboard" in the QR scan activity */
|
||||
Clipboard,
|
||||
|
||||
/** The user clicked "Load QR code as image" in the QR scan activity */
|
||||
ImageLoaded,
|
||||
|
||||
/** The user scanned a QR code */
|
||||
Scan,
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum SecurejoinUiPath {
|
||||
/** The UI path is unknown, or the user didn't open the QR code screen at all. */
|
||||
Unknown,
|
||||
|
||||
/** The user directly clicked on the QR icon in the main screen */
|
||||
QrIcon,
|
||||
|
||||
/** The user first clicked on the `+` button in the main screen, and then on "New Contact" */
|
||||
NewContact,
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum Socket {
|
||||
/** Unspecified socket security, select automatically. */
|
||||
automatic,
|
||||
|
||||
/** TLS connection. */
|
||||
ssl,
|
||||
|
||||
/** STARTTLS connection. */
|
||||
starttls,
|
||||
|
||||
/** No TLS, plaintext connection. */
|
||||
plain,
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/* Autogenerated file, do not edit manually */
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public enum SystemMessageType {
|
||||
Unknown,
|
||||
GroupNameChanged,
|
||||
GroupImageChanged,
|
||||
MemberAddedToGroup,
|
||||
MemberRemovedFromGroup,
|
||||
AutocryptSetupMessage,
|
||||
SecurejoinMessage,
|
||||
LocationStreamingEnabled,
|
||||
LocationOnly,
|
||||
InvalidUnencryptedMail,
|
||||
ChatE2ee,
|
||||
ChatProtectionEnabled,
|
||||
ChatProtectionDisabled,
|
||||
WebxdcStatusUpdate,
|
||||
CallAccepted,
|
||||
CallEnded,
|
||||
|
||||
/** 1:1 chats info message telling that SecureJoin has started and the user should wait for it to complete. */
|
||||
SecurejoinWait,
|
||||
|
||||
/** 1:1 chats info message telling that SecureJoin is still running, but the user may already send messages. */
|
||||
SecurejoinWaitTimeout,
|
||||
|
||||
/** Chat ephemeral message timer is changed. */
|
||||
EphemeralTimerChanged,
|
||||
|
||||
/** Self-sent-message that contains only json used for multi-device-sync; if possible, we attach that to other messages as for locations. */
|
||||
MultiDeviceSync,
|
||||
|
||||
/** Webxdc info added with `info` set in `send_webxdc_status_update()`. */
|
||||
WebxdcInfoMessage,
|
||||
|
||||
/** This message contains a users iroh node address. */
|
||||
IrohNodeAddr,
|
||||
}
|
||||